mirror of
https://github.com/HendrikRauh/dmx-interface.git
synced 2025-05-18 21:55:34 +00:00
added handler for PUT /config
This commit is contained in:
parent
7b7ecec534
commit
8fed61f78c
4 changed files with 198 additions and 27 deletions
|
@ -3,11 +3,7 @@
|
|||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Konfiguration</title>
|
||||
<link rel="stylesheet" href="/style.css" />
|
||||
<script type="module" src="/input-visibility.js" defer></script>
|
||||
<script type="module" src="/load-data.js" defer></script>
|
||||
<script type="module" src="/submit.js" defer></script>
|
||||
<title>Test</title>
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
|
@ -64,7 +60,7 @@
|
|||
<label>
|
||||
Netzwerk:
|
||||
<select
|
||||
name="network"
|
||||
name="ssid"
|
||||
id="input-network"
|
||||
title="Netzwerk"
|
||||
></select>
|
||||
|
@ -91,8 +87,8 @@
|
|||
<span>Output</span>
|
||||
<input
|
||||
type="checkbox"
|
||||
name="input-or-output-1"
|
||||
id="input-input-or-output-1"
|
||||
name=" direction-1"
|
||||
id="input-direction-1"
|
||||
data-value-not-checked="output"
|
||||
data-value-checked="input"
|
||||
/>
|
||||
|
@ -117,8 +113,8 @@
|
|||
<span>Output</span>
|
||||
<input
|
||||
type="checkbox"
|
||||
name="input-or-output-2"
|
||||
id="input-input-or-output-2"
|
||||
name="direction-2"
|
||||
id="input-direction-2"
|
||||
data-value-not-checked="output"
|
||||
data-value-checked="input"
|
||||
/>
|
||||
|
|
27
src/main.cpp
27
src/main.cpp
|
@ -1,18 +1,15 @@
|
|||
#include <ArtnetWiFi.h>
|
||||
// #include <ArtnetEther.h>
|
||||
|
||||
#include <ArduinoJson.h>
|
||||
#include "ESPDMX.h"
|
||||
#include <ESPAsyncWebServer.h>
|
||||
#include <SPIFFS.h>
|
||||
#include <Preferences.h>
|
||||
|
||||
Preferences config;
|
||||
DMXESPSerial dmx;
|
||||
#include "routes/config.h"
|
||||
|
||||
AsyncWebServer server(80);
|
||||
|
||||
ArtnetWiFi artnet;
|
||||
DMXESPSerial dmx;
|
||||
|
||||
const uint16_t size = 512;
|
||||
uint8_t data[size];
|
||||
|
||||
|
@ -25,7 +22,7 @@ void setup()
|
|||
uint8_t universe = config.getUChar("universe", 1);
|
||||
|
||||
String ssid = config.getString("ssid", "artnet");
|
||||
String pwd = config.getString("pwd", "mbgmbgmbg");
|
||||
String pwd = config.getString("password", "mbgmbgmbg");
|
||||
IPAddress defaultIp(192, 168, 1, 201);
|
||||
IPAddress ip = config.getUInt("ip", defaultIp);
|
||||
|
||||
|
@ -75,18 +72,14 @@ void setup()
|
|||
server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.html");
|
||||
|
||||
server.on("/config", HTTP_GET, [&, defaultIp, ssid, pwd, universe](AsyncWebServerRequest *request)
|
||||
{
|
||||
DynamicJsonDocument doc(1024);
|
||||
{ onGetConfig(ssid, pwd, defaultIp, universe, request); });
|
||||
|
||||
doc["ssid"] = ssid;
|
||||
doc["pwd"] = pwd;
|
||||
doc["ip"] = defaultIp;
|
||||
doc["universe"] = universe;
|
||||
server.onRequestBody([](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total)
|
||||
{
|
||||
if (request->url() == "/config" && request->method() == HTTP_PUT) {
|
||||
onPutConfig(request, data, len, index, total);
|
||||
} });
|
||||
|
||||
String jsonString;
|
||||
serializeJson(doc, jsonString);
|
||||
|
||||
request->send(200, "application/json", jsonString); });
|
||||
delay(1000);
|
||||
server.begin();
|
||||
Serial.println("Server started!");
|
||||
|
|
147
src/routes/config.cpp
Normal file
147
src/routes/config.cpp
Normal file
|
@ -0,0 +1,147 @@
|
|||
#include "config.h"
|
||||
#include <stdexcept>
|
||||
#include <ArduinoJson.h>
|
||||
|
||||
Preferences config;
|
||||
|
||||
#pragma region Utility
|
||||
|
||||
uint32_t parseIp(String str)
|
||||
{
|
||||
const int size = 4;
|
||||
|
||||
String ipStrings[size];
|
||||
uint8_t ipIndex = 0;
|
||||
|
||||
for (int i = 0; i < str.length(); i++)
|
||||
{
|
||||
if (str[i] == '.')
|
||||
{
|
||||
ipIndex++;
|
||||
continue;
|
||||
}
|
||||
ipStrings[ipIndex] += str[i];
|
||||
}
|
||||
|
||||
String ip = "";
|
||||
for (int i = 0; i < size; i++)
|
||||
{
|
||||
String paddedString = ipStrings[i];
|
||||
while (paddedString.length() < 3)
|
||||
{
|
||||
paddedString = "0" + paddedString;
|
||||
}
|
||||
ip.concat(paddedString);
|
||||
}
|
||||
|
||||
Serial.println("ip string: " + ip);
|
||||
return atoi(ip.c_str());
|
||||
}
|
||||
|
||||
IpMethod parseIpMethod(String ipMethod)
|
||||
{
|
||||
if (ipMethod == "static")
|
||||
{
|
||||
return Static;
|
||||
}
|
||||
|
||||
if (ipMethod == "dhcp")
|
||||
{
|
||||
return DHCP;
|
||||
}
|
||||
|
||||
// FIXME: concat strings
|
||||
throw ::std::invalid_argument("Invalid IP method value" + ipMethod);
|
||||
}
|
||||
|
||||
Connection parseConnection(String connection)
|
||||
{
|
||||
if (connection == "wifi-sta")
|
||||
{
|
||||
return WiFiSta;
|
||||
}
|
||||
if (connection == "wifi-ap")
|
||||
{
|
||||
return WiFiAP;
|
||||
}
|
||||
if (connection == "ethernet")
|
||||
{
|
||||
return Ethernet;
|
||||
}
|
||||
|
||||
// FIXME: concat strings
|
||||
throw ::std::invalid_argument("Invalid connection value: " + connection);
|
||||
}
|
||||
|
||||
Direction parseDirection(uint8_t direction)
|
||||
{
|
||||
if (direction == 0)
|
||||
{
|
||||
return Output;
|
||||
}
|
||||
if (direction == 1)
|
||||
{
|
||||
return Input;
|
||||
}
|
||||
|
||||
throw ::std::invalid_argument("Invalid direction value: " + direction);
|
||||
}
|
||||
|
||||
#pragma endregion
|
||||
|
||||
void onGetConfig(String ssid, String pwd, uint32_t ip, uint8_t universe, AsyncWebServerRequest *request)
|
||||
{
|
||||
JsonDocument doc;
|
||||
|
||||
doc["ssid"] = ssid;
|
||||
doc["password"] = pwd;
|
||||
doc["ip"] = ip;
|
||||
doc["universe"] = universe;
|
||||
|
||||
String jsonString;
|
||||
serializeJson(doc, jsonString);
|
||||
|
||||
request->send(200, "application/json", jsonString);
|
||||
}
|
||||
|
||||
void onPutConfig(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total)
|
||||
{
|
||||
Serial.printf("[REQUEST]\t%s\r\n", (const char *)data);
|
||||
|
||||
JsonDocument doc;
|
||||
deserializeJson(doc, data);
|
||||
|
||||
try
|
||||
{
|
||||
IpMethod ipMethod = parseIpMethod(doc["ip-method"].as<String>());
|
||||
config.putUInt("ip-method", ipMethod);
|
||||
|
||||
if (ipMethod == Static)
|
||||
{
|
||||
String ipString = doc["ip"].as<String>();
|
||||
IPAddress ipAddress;
|
||||
ipAddress.fromString(ipString);
|
||||
config.putUInt("ip", ipAddress);
|
||||
}
|
||||
|
||||
Connection connection = parseConnection(doc["connection"].as<String>());
|
||||
config.putUInt("connection", connection);
|
||||
if (connection == WiFiSta || connection == WiFiAP)
|
||||
{
|
||||
config.putString("ssid", doc["ssid"].as<String>());
|
||||
config.putString("password", doc["password"].as<String>());
|
||||
}
|
||||
|
||||
Direction direction1 = parseDirection(doc["direction-1"].as<uint8_t>());
|
||||
config.putInt("direction-1", direction1);
|
||||
|
||||
Direction direction2 = parseDirection(doc["direction-2"].as<uint8_t>());
|
||||
config.putInt("direction-2", direction2);
|
||||
|
||||
request->send(200);
|
||||
}
|
||||
catch (::std::invalid_argument &e)
|
||||
{
|
||||
request->send(400, "text/plain", e.what());
|
||||
}
|
||||
}
|
35
src/routes/config.h
Normal file
35
src/routes/config.h
Normal file
|
@ -0,0 +1,35 @@
|
|||
#pragma once
|
||||
|
||||
#include <ESPAsyncWebServer.h>
|
||||
#include <ESPDMX.h>
|
||||
#include <Preferences.h>
|
||||
|
||||
// #ifndef CONFIG_h
|
||||
// #define CONFIG_h
|
||||
|
||||
extern Preferences config;
|
||||
|
||||
enum IpMethod
|
||||
{
|
||||
Static,
|
||||
DHCP
|
||||
};
|
||||
|
||||
enum Connection
|
||||
{
|
||||
WiFiSta,
|
||||
WiFiAP,
|
||||
Ethernet
|
||||
};
|
||||
|
||||
enum Direction
|
||||
{
|
||||
Input,
|
||||
Output
|
||||
};
|
||||
|
||||
void onGetConfig(String ssid, String pwd, uint32_t ip, uint8_t universe, AsyncWebServerRequest *request);
|
||||
|
||||
void onPutConfig(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total);
|
||||
|
||||
// #endif
|
Loading…
Add table
Reference in a new issue