diff --git a/data/index.html b/data/index.html index 8011dbf..4406531 100644 --- a/data/index.html +++ b/data/index.html @@ -64,7 +64,7 @@ Netzwerk: @@ -91,8 +91,8 @@ Output @@ -117,8 +117,8 @@ Output diff --git a/src/main.cpp b/src/main.cpp index 7019a79..e8095ef 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,18 +1,15 @@ #include // #include - -#include #include "ESPDMX.h" #include #include -#include - -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,29 +72,14 @@ void setup() server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.html"); server.on("/config", HTTP_GET, [&, defaultIp, ssid, pwd, universe](AsyncWebServerRequest *request) - { - JsonDocument doc; - - doc["ssid"] = ssid; - doc["pwd"] = pwd; - doc["ip"] = defaultIp; - doc["universe"] = universe; - - String jsonString; - serializeJson(doc, jsonString); - - request->send(200, "application/json", jsonString); }); + { onGetConfig(ssid, pwd, defaultIp, universe, request); }); server.onRequestBody([](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total) { if (request->url() == "/config" && request->method() == HTTP_PUT) { - Serial.printf("[REQUEST]\t%s\r\n", (const char *)data); - - StaticJsonDocument<256> doc; - deserializeJson(doc, data); - request->send(200); + onPutConfig(request, data, len, index, total); } }); - + delay(1000); server.begin(); Serial.println("Server started!"); diff --git a/src/routes/config.cpp b/src/routes/config.cpp new file mode 100644 index 0000000..98f65fe --- /dev/null +++ b/src/routes/config.cpp @@ -0,0 +1,145 @@ +#include "config.h" +#include +#include + +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; + } + + throw ::std::invalid_argument("Invalid IP method value"); +} + +Connection parseConnection(String connection) +{ + if (connection == "wifi-sta") + { + return WiFiSta; + } + if (connection == "wifi-ap") + { + return WiFiAP; + } + if (connection == "ethernet") + { + return Ethernet; + } + + throw ::std::invalid_argument("Invalid connection value"); +} + +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()); + config.putUInt("ip-method", ipMethod); + + if (ipMethod == Static) + { + String ipString = doc["ip"].as(); + IPAddress ipAddress; + ipAddress.fromString(ipString); + config.putUInt("ip", ipAddress); + } + + Connection connection = parseConnection(doc["connection"].as()); + config.putUInt("connection", connection); + if (connection == WiFiSta || connection == WiFiAP) + { + config.putString("ssid", doc["ssid"].as()); + config.putString("password", doc["password"].as()); + } + + Direction direction1 = parseDirection(doc["direction-1"].as()); + config.putInt("direction-1", direction1); + + Direction direction2 = parseDirection(doc["direction-2"].as()); + config.putInt("direction-2", direction2); + + request->send(200); + } + catch (::std::invalid_argument &e) + { + request->send(400, "text/plain", e.what()); + } +} diff --git a/src/routes/config.h b/src/routes/config.h new file mode 100644 index 0000000..a043a40 --- /dev/null +++ b/src/routes/config.h @@ -0,0 +1,35 @@ +#pragma once + +#include +#include +#include + +// #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 \ No newline at end of file