Merge branch 'main' into DMX-22-Modify-ESPDMX

This commit is contained in:
Raffael Wolf 2024-11-03 00:41:39 +01:00 committed by GitHub
commit 9a49c6610d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 237 additions and 40 deletions

View file

@ -28,28 +28,35 @@ void DMXESPSerial::init(int pinSend, int pinRecv)
}
// Function to read DMX data
uint8_t DMXESPSerial::read(int Channel)
uint8_t DMXESPSerial::read(int channel)
{
if (Channel < 1)
Channel = 1;
if (Channel > DMXCHANNELS)
Channel = DMXCHANNELS;
return (dmxDataStore[Channel]);
if (dmxStarted == false)
init();
if (channel < 1)
channel = 1;
if (channel > DMXCHANNELS)
channel = DMXCHANNELS;
return (dmxDataStore[channel]);
}
// Function to send DMX data
void DMXESPSerial::write(int Channel, uint8_t value)
void DMXESPSerial::write(int channel, uint8_t value)
{
if (Channel < 1)
Channel = 1;
if (Channel > DMXCHANNELS)
Channel = DMXCHANNELS;
if (dmxStarted == false)
init();
if (channel < 1)
channel = 1;
if (channel > DMXCHANNELS)
channel = DMXCHANNELS;
if (value < 0)
value = 0;
if (value > 255)
value = 255;
dmxDataStore[Channel] = value;
dmxDataStore[channel] = value;
}
void DMXESPSerial::end()

View file

@ -1,13 +1,9 @@
#include <ArtnetWiFi.h>
// #include <ArtnetEther.h>
#include <ArduinoJson.h>
#include "ESPDMX.h"
#include <ESPAsyncWebServer.h>
#include <SPIFFS.h>
#include <Preferences.h>
Preferences config;
#include "routes/config.h"
DMXESPSerial dmx1;
DMXESPSerial dmx2;
@ -15,6 +11,8 @@ DMXESPSerial dmx2;
AsyncWebServer server(80);
ArtnetWiFi artnet;
DMXESPSerial dmx;
const uint16_t size = 512;
uint8_t data[size];
@ -24,10 +22,14 @@ void setup()
config.begin("dmx", false);
uint8_t universe = config.getUChar("universe", 1);
uint8_t universe1 = config.getUChar("universe-1", 1);
uint8_t universe2 = config.getUChar("universe-2", 1);
Direction direction1 = static_cast<Direction>(config.getUInt("direction-1", 0));
Direction direction2 = static_cast<Direction>(config.getUInt("direction-2", 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);
@ -56,7 +58,7 @@ void setup()
dmx1.init(19, -1);
// if Artnet packet comes to this universe, this function is called
artnet.subscribeArtDmxUniverse(universe, [&](const uint8_t *data, uint16_t size, const ArtDmxMetadata &metadata, const ArtNetRemoteInfo &remote)
artnet.subscribeArtDmxUniverse(universe1, [&](const uint8_t *data, uint16_t size, const ArtDmxMetadata &metadata, const ArtNetRemoteInfo &remote)
{
for (size_t i = 0; i < size; ++i)
{
@ -76,19 +78,15 @@ void setup()
server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.html");
server.on("/config", HTTP_GET, [&, defaultIp, ssid, pwd, universe](AsyncWebServerRequest *request)
{
JsonDocument doc;
server.on("/config", HTTP_GET, [&, defaultIp, ssid, pwd, direction1, universe1, direction2, universe2](AsyncWebServerRequest *request)
{ onGetConfig(ssid, pwd, defaultIp, universe1, direction1, universe2, direction2, 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!");
@ -97,4 +95,4 @@ void setup()
void loop()
{
artnet.parse(); // check if artnet packet has come and execute callback
}
}

151
src/routes/config.cpp Normal file
View file

@ -0,0 +1,151 @@
#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;
}
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 universe1, Direction direction1, uint8_t universe2, Direction direction2, AsyncWebServerRequest *request)
{
JsonDocument doc;
IPAddress ipAddr = ip;
String ipString = ipAddr.toString();
doc["ssid"] = ssid;
doc["password"] = pwd;
doc["ip"] = ipString;
doc["universe-1"] = universe1;
doc["direction-1"] = direction1;
doc["universe-2"] = universe2;
doc["direction-2"] = direction2;
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
View 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 universe1, Direction direction1, uint8_t universe2, Direction direction2, AsyncWebServerRequest *request);
void onPutConfig(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total);
// #endif