From 2e0431357afe299d2431837fc73acf37ba44db1c Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Fri, 9 May 2025 19:55:43 +0200 Subject: [PATCH 01/12] refactor logging: replace Serial prints with Logger calls for improved readability and debugging TODO: fix MAC, WiFi PWD and implement it in other files too --- .gitmodules | 11 ++-- lib/Elog | 1 + src/main.cpp | 157 +++++++++++++++++++++++++++------------------------ 3 files changed, 91 insertions(+), 78 deletions(-) create mode 160000 lib/Elog diff --git a/.gitmodules b/.gitmodules index 48580f7..5ebce81 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,9 @@ [submodule "lib/ArtNet"] - path = lib/ArtNet - url = https://github.com/psxde/ArtNet.git +path = lib/ArtNet +url = https://github.com/psxde/ArtNet.git [submodule "lib/AsyncWebServer_ESP32_W5500"] - path = lib/AsyncWebServer_ESP32_W5500 - url = https://github.com/psxde/AsyncWebServer_ESP32_W5500.git +path = lib/AsyncWebServer_ESP32_W5500 +url = https://github.com/psxde/AsyncWebServer_ESP32_W5500.git +[submodule "lib/Elog"] +path = lib/Elog +url = https://github.com/jpmv27/elog.git diff --git a/lib/Elog b/lib/Elog new file mode 160000 index 0000000..b279027 --- /dev/null +++ b/lib/Elog @@ -0,0 +1 @@ +Subproject commit b27902710fd4d77d599fd581b6eef2936dc7943f diff --git a/src/main.cpp b/src/main.cpp index 5c18ba1..ca3f145 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -26,6 +26,16 @@ #include "routes/networks.h" #include "routes/status.h" +#include + +#define SYSTEM 0 +#define DMX 1 +#define ARTNET 2 +#define SERVER 3 +#define WIFI 4 +#define ETHERNET 5 +#define CONFIG 6 + dmx_port_t dmx1 = DMX_NUM_0; // for esp32s2 dmx_port_t dmx2 = DMX_NUM_1; byte dmx1_data[DMX_PACKET_SIZE]; @@ -165,25 +175,35 @@ void setup() Serial.begin(9600); + Logger.registerSerial(SYSTEM, 10, "SYSTEM"); + Logger.registerSerial(DMX, 10, "DMX"); + Logger.registerSerial(ARTNET, 10, "ARTNET"); + Logger.registerSerial(WIFI, 10, "WIFI"); + Logger.registerSerial(ETHERNET, 10, "ETHERNET"); + Logger.registerSerial(SERVER, 10, "SERVER"); + Logger.registerSerial(CONFIG, 10, "CONFIG"); + + Logger.info(SYSTEM, "Interface starting..."); + // Get ETH mac delay(1000); esp_efuse_mac_get_default(mac); esp_read_mac(mac, ESP_MAC_ETH); - Serial.printf("%02x:%02x:%02x:%02x:%02x:%02x ESP MAC ETH\n", - mac[0], mac[1], mac[2], - mac[3], mac[4], mac[5]); + Logger.debug(CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC ETH\n", + mac[0], mac[1], mac[2], + mac[3], mac[4], mac[5]); esp_read_mac(mac, ESP_MAC_WIFI_SOFTAP); - Serial.printf("%02x:%02x:%02x:%02x:%02x:%02x ESP MAC SOFTAP\n", - mac[0], mac[1], mac[2], - mac[3], mac[4], mac[5]); + Logger.debug(CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC SOFTAP\n", + mac[0], mac[1], mac[2], + mac[3], mac[4], mac[5]); esp_read_mac(mac, ESP_MAC_WIFI_STA); // ESP_MAC_BASE - Serial.printf("%02x:%02x:%02x:%02x:%02x:%02x ESP MAC BASE\n", - mac[0], mac[1], mac[2], - mac[3], mac[4], mac[5]); + Logger.debug(CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC BASE\n", + mac[0], mac[1], mac[2], + mac[3], mac[4], mac[5]); // LED config.begin("dmx", true); @@ -204,7 +224,7 @@ void setup() } if (digitalRead(PIN_BUTTON) == LOW) { - Serial.println("Reset config"); + Logger.notice(CONFIG, "Resetting config"); config.begin("dmx", false); config.clear(); config.end(); @@ -231,7 +251,6 @@ void setup() { updateLed(); } - Serial.println("Starting DMX-Interface..."); config.begin("dmx", true); @@ -241,8 +260,8 @@ void setup() direction1 = static_cast(config.getUInt("direction-1", DEFAULT_DIRECTION1)); direction2 = static_cast(config.getUInt("direction-2", DEFAULT_DIRECTION2)); - Serial.printf("Port A: Universe %d %s\n", universe1, (direction1 == Input) ? "DMX -> Art-Net" : "Art-Net -> DMX"); - Serial.printf("Port B: Universe %d %s\n", universe2, (direction2 == Input) ? "DMX -> Art-Net" : "Art-Net -> DMX"); + Logger.info(CONFIG, "Port A: Universe %d %s", universe1, (direction1 == Input) ? "DMX -> Art-Net" : "Art-Net -> DMX"); + Logger.info(CONFIG, "Port B: Universe %d %s", universe2, (direction2 == Input) ? "DMX -> Art-Net" : "Art-Net -> DMX"); Connection connection = static_cast(config.getUInt("connection", DEFAULT_CONNECTION)); IpMethod ipMethod = static_cast(config.getUInt("ip-method"), DEFAULT_IP_METHOD); @@ -250,8 +269,7 @@ void setup() char hostname[30]; snprintf(hostname, sizeof(hostname), "ChaosDMX-%02X%02X", mac[4], mac[5]); DEFAULT_SSID = hostname; - Serial.print("Hostname: "); - Serial.println(hostname); + Logger.info(CONFIG, "Hostname: %s", hostname); String ssid = config.getString("ssid", DEFAULT_SSID); String pwd = config.getString("password", DEFAULT_PASSWORD); @@ -266,33 +284,32 @@ void setup() switch (connection) { case WiFiSta: - Serial.println("Initialize as WiFi Station"); + Logger.debug(SYSTEM, "Initialize as WiFi Station"); WiFi.setHostname(hostname); WiFi.begin(ssid, pwd); - Serial.println("SSID: " + ssid + ", pwd: " + pwd); + Logger.info(CONFIG, "SSID: %s; PWD: %s", ssid, pwd); if (ipMethod == Static) { WiFi.config(ip, gateway, subnet); - Serial.println("IP: " + ip.toString() + ", gateway: " + gateway + ", subnet: " + subnet); + Logger.info(CONFIG, "IP: %s; gateway: %s; subnet: %s", ip.toString(), gateway, subnet); } + Logger.debug(WIFI, "Connecting..."); while (WiFi.status() != WL_CONNECTED) { - Serial.print("."); - delay(500); + delay(50); + updateLed(); } + Logger.info(WIFI, "Connected!"); broadcastIp = String(WiFi.broadcastIP().toString().c_str()); - Serial.println(""); - Serial.print("WiFi connected, IP = "); - Serial.println(WiFi.localIP()); - Serial.print("MAC address: "); - Serial.println(WiFi.macAddress()); - Serial.print("Broadcast IP: "); - Serial.println(broadcastIp); + Logger.info(WIFI, "IP: %s", WiFi.localIP().toString()); + Logger.info(WIFI, "MAC: %X", WiFi.macAddress()); + Logger.info(WIFI, "Broadcast IP: %s", broadcastIp); + break; case Ethernet: { - Serial.println("Initialize as ETH"); + Logger.debug(SYSTEM, "Initialize as ETH"); ESP32_W5500_onEvent(); if (ETH.begin(ETH_MISO, ETH_MOSI, ETH_SCK, ETH_SS, ETH_INT, ETH_SPI_CLOCK_MHZ, SPI2_HOST, mac)) @@ -300,64 +317,56 @@ void setup() } else { - Serial.println("Failed to configure Ethernet"); + Logger.critical(ETHERNET, "Failed to configure Ethernet"); } ETH.setHostname(hostname); // ESP32_W5500_waitForConnect(); uint8_t timeout = 5; // in s - Serial.print("Wait for connect"); + Logger.debug(ETHERNET, "Wait for connect"); + // TODO: use millis while (!ESP32_W5500_eth_connected && timeout > 0) { delay(1000); timeout--; - Serial.print("."); } - Serial.println(); if (ESP32_W5500_eth_connected) { - Serial.println("DHCP OK!"); + Logger.debug(ETHERNET, "DHCP OK!"); } else { - Serial.println("Set static IP"); + Logger.debug(ETHERNET, "Set static IP"); ETH.config(ip, gateway, subnet); } + Logger.debug(ETHERNET, "Ethernet Successfully Initialized"); + broadcastIp = ETH.broadcastIP().toString(); - Serial.print("Local IP : "); - Serial.println(ETH.localIP()); - Serial.print("Subnet Mask : "); - Serial.println(ETH.subnetMask()); - Serial.print("Gateway IP : "); - Serial.println(ETH.gatewayIP()); - Serial.print("DNS Server : "); - Serial.println(ETH.dnsIP()); - Serial.print("MAC address : "); - Serial.println(ETH.macAddress()); - Serial.print("Broadcast IP: "); - Serial.println(broadcastIp); - Serial.println("Ethernet Successfully Initialized"); + Logger.info(ETHERNET, "Local IP: %s", ETH.localIP().toString()); + Logger.info(ETHERNET, "Subnet Mask: %s", ETH.subnetMask().toString()); + Logger.info(ETHERNET, "Gateway IP: %s", ETH.gatewayIP().toString()); + Logger.debug(ETHERNET, "DNS Server: %s", ETH.dnsIP().toString()); + Logger.debug(ETHERNET, "MAC address: %X", ETH.macAddress()); + Logger.debug(ETHERNET, "Broadcast IP: %s", broadcastIp); break; } default: - Serial.println("Initialize as WiFi AccessPoint"); + Logger.debug(SYSTEM, "Initialize as WiFi AccessPoint"); WiFi.softAPsetHostname(hostname); WiFi.softAP(ssid, pwd); // AP always with DHCP // WiFi.softAPConfig(ip, gateway, subnet); broadcastIp = WiFi.softAPBroadcastIP().toString(); - Serial.print("WiFi AP enabled, IP = "); - Serial.println(WiFi.softAPIP()); - Serial.print("MAC address: "); - Serial.println(WiFi.softAPmacAddress()); - Serial.print("Broadcast IP: "); - Serial.println(broadcastIp); + Logger.debug(WIFI, "WiFi AP enabled"); + Logger.info(CONFIG, "IP: %s", WiFi.softAPIP().toString()); + Logger.debug(CONFIG, "MAC address: %X", WiFi.softAPmacAddress()); + Logger.debug(CONFIG, "Broadcast IP: %s", broadcastIp); break; } // Initialize DMX ports - Serial.println("Initialize DMX..."); + Logger.debug(DMX, "Initialize DMX..."); #ifdef CONFIG_IDF_TARGET_ESP32S2 @@ -370,19 +379,20 @@ void setup() dmx_driver_install(dmx2, &dmx_config, personalities, personality_count); dmx_set_pin(dmx2, 17, 18, -1); - Serial.printf("DMX driver 1 installed: %d\n", dmx_driver_is_installed(dmx1)); - Serial.printf("DMX driver 2 installed: %d\n", dmx_driver_is_installed(dmx2)); + Logger.verbose(DMX, "DMX driver 1 installed: %d", dmx_driver_is_installed(dmx1)); + Logger.verbose(DMX, "DMX driver 2 installed: %d", dmx_driver_is_installed(dmx2)); - Serial.printf("DMX driver 1 enabled: %d\n", dmx_driver_is_enabled(dmx1)); - Serial.printf("DMX driver 2 enabled: %d\n", dmx_driver_is_enabled(dmx2)); + Logger.verbose(DMX, "DMX driver 1 enabled: %d", dmx_driver_is_enabled(dmx1)); + Logger.verbose(DMX, "DMX driver 2 enabled: %d", dmx_driver_is_enabled(dmx2)); #else dmx1.init(21, 33, Serial1); dmx2.init(17, 18, Serial2); #endif + Logger.debug(DMX, "DMX initialized"); // Initialize Art-Net - Serial.println("Initialize Art-Net..."); + Logger.debug(ARTNET, "Initialize Art-Net..."); artnet.begin(); // if Artnet packet comes to this universe, this function is called @@ -403,10 +413,12 @@ void setup() dmx_send(dmx2); dmx_wait_sent(dmx2, DMX_TIMEOUT_TICK); }); } + Logger.debug(ARTNET, "Initialized Art-Net"); if (!LittleFS.begin(true)) { - Serial.println("An Error has occurred while mounting LittleFS"); + setStatus(Status::Critical); + Logger.critical(SYSTEM, "An Error has occurred while mounting LittleFS"); return; } @@ -432,14 +444,14 @@ void setup() { if (request->url() == "/config" && request->method() == HTTP_PUT) { onPutConfig(request, data, len, index, total); - Serial.println("restarting ESP..."); + Logger.info(SYSTEM, "Restarting ESP..."); ESP.restart(); } }); initWebSocket(&server); server.begin(); - Serial.println("Server started!"); + Logger.debug(SERVER, "Webserver started!"); // scan networks and cache them WiFi.scanNetworks(true); @@ -447,20 +459,17 @@ void setup() setStatus(Status::Normal); // Internal temperature RP2040 - /*float tempC = analogReadTemp(); // Get internal temperature - Serial.print("Temperature Celsius (ºC): "); - Serial.println(tempC);*/ + // float tempC = analogReadTemp(); // Get internal temperature + // Logger.verbose(SYSTEM, "Temperature Celsius: %d °C", tempC); // Internal temperature ESP32 https://www.espboards.dev/blog/esp32-inbuilt-temperature-sensor/ - Serial.print("Temperature: "); float result = 0; temp_sensor_read_celsius(&result); - Serial.print(result); - Serial.println(" °C"); + Logger.verbose(SYSTEM, "Temperature: %.2f °C", result); - Serial.printf("Internal Total heap %d, internal Free Heap %d\n", ESP.getHeapSize(), ESP.getFreeHeap()); - Serial.printf("SPIRam Total heap %d, SPIRam Free Heap %d\n", ESP.getPsramSize(), ESP.getFreePsram()); - Serial.printf("ChipRevision %d, Cpu Freq %d, SDK Version %s\n", ESP.getChipRevision(), ESP.getCpuFreqMHz(), ESP.getSdkVersion()); - Serial.printf("Flash Size %d, Flash Speed %d\n", ESP.getFlashChipSize(), ESP.getFlashChipSpeed()); + Logger.verbose(SYSTEM, "Internal Total heap: %d; internal Free Heap: %d", ESP.getHeapSize(), ESP.getFreeHeap()); + Logger.verbose(SYSTEM, "SPIRam Total heap: %d; SPIRam Free Heap: %d", ESP.getPsramSize(), ESP.getFreePsram()); + Logger.verbose(SYSTEM, "ChipRevision: %d; Cpu Freq: %d; SDK Version: %s", ESP.getChipRevision(), ESP.getCpuFreqMHz(), ESP.getSdkVersion()); + Logger.verbose(SYSTEM, "Flash Size: %d; Flash Speed: %d", ESP.getFlashChipSize(), ESP.getFlashChipSpeed()); } void transmitDmxToArtnet(dmx_port_t dmxPort, byte *dmx_data, uint8_t artnetUniverse) @@ -486,7 +495,7 @@ void transmitDmxToArtnet(dmx_port_t dmxPort, byte *dmx_data, uint8_t artnetUnive connect or disconnect your DMX devices. If you are consistently getting DMX errors, then something may have gone wrong with your code or something is seriously wrong with your DMX transmitter. */ - Serial.printf("A DMX error occurred on port %d.\n", dmxPort); + Logger.error(DMX, "A DMX error occurred on port %d", dmxPort); } } } From 628f78cddb32538554435905c8ab3cd1f3d2f3c6 Mon Sep 17 00:00:00 2001 From: RaffaelW <146560011+RaffaelW@users.noreply.github.com> Date: Fri, 9 May 2025 20:32:23 +0200 Subject: [PATCH 02/12] implement logging system: create Log class to replace Logger calls for improved structure and maintainability BUT does not compile! --- src/log.cpp | 58 ++++++++++++++++++++++ src/log.h | 24 +++++++++ src/main.cpp | 135 +++++++++++++++++++++++---------------------------- 3 files changed, 142 insertions(+), 75 deletions(-) create mode 100644 src/log.cpp create mode 100644 src/log.h diff --git a/src/log.cpp b/src/log.cpp new file mode 100644 index 0000000..f4a9a6e --- /dev/null +++ b/src/log.cpp @@ -0,0 +1,58 @@ +#include "log.h" +#include + +void Log::setup() +{ + Logger.registerSerial(SYSTEM, 10, "SYSTEM"); + Logger.registerSerial(DMX, 10, "DMX"); + Logger.registerSerial(ARTNET, 10, "ARTNET"); + Logger.registerSerial(WIFI, 10, "WIFI"); + Logger.registerSerial(ETHERNET, 10, "ETHERNET"); + Logger.registerSerial(SERVER, 10, "SERVER"); + Logger.registerSerial(CONFIG, 10, "CONFIG"); +}; + +void Log::info(int tag, String format, ...) +{ + Logger.info(tag, format, va_list()); +} + +void Log::debug(int tag, String format, ...) +{ + Logger.debug(tag, format, va_list()); +} + +void Log::verbose(int tag, String format, ...) +{ + Logger.verbose(tag, format, va_list()); +} + +void Log::error(int tag, String format, ...) +{ + Logger.error(tag, format, va_list()); +} + +void Log::critical(int tag, String format, ...) +{ + Logger.critical(tag, format, va_list()); +} + +void Log::warning(int tag, String format, ...) +{ + Logger.warning(tag, format, va_list()); +} + +void Log::notice(int tag, String format, ...) +{ + Logger.notice(tag, format, va_list()); +} + +void Log::alert(int tag, String format, ...) +{ + Logger.alert(tag, format, va_list()); +} + +void Log::emergency(int tag, String format, ...) +{ + Logger.emergency(tag, format, va_list()); +} \ No newline at end of file diff --git a/src/log.h b/src/log.h new file mode 100644 index 0000000..7343589 --- /dev/null +++ b/src/log.h @@ -0,0 +1,24 @@ +#include + +#define SYSTEM 0 +#define DMX 1 +#define ARTNET 2 +#define SERVER 3 +#define WIFI 4 +#define ETHERNET 5 +#define CONFIG 6 + +class Log +{ +public: + void setup(); + void info(int tag, String format, ...); + void debug(int tag, String format, ...); + void verbose(int tag, String format, ...); + void error(int tag, String format, ...); + void critical(int tag, String format, ...); + void warning(int tag, String format, ...); + void notice(int tag, String format, ...); + void alert(int tag, String format, ...); + void emergency(int tag, String format, ...); +}; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index ca3f145..6a874f0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -21,20 +21,13 @@ #include #include +#include "log.h" #include "websocket.h" #include "routes/config.h" #include "routes/networks.h" #include "routes/status.h" -#include - -#define SYSTEM 0 -#define DMX 1 -#define ARTNET 2 -#define SERVER 3 -#define WIFI 4 -#define ETHERNET 5 -#define CONFIG 6 +Log log; dmx_port_t dmx1 = DMX_NUM_0; // for esp32s2 dmx_port_t dmx2 = DMX_NUM_1; @@ -174,16 +167,8 @@ void setup() updateLed(); Serial.begin(9600); - - Logger.registerSerial(SYSTEM, 10, "SYSTEM"); - Logger.registerSerial(DMX, 10, "DMX"); - Logger.registerSerial(ARTNET, 10, "ARTNET"); - Logger.registerSerial(WIFI, 10, "WIFI"); - Logger.registerSerial(ETHERNET, 10, "ETHERNET"); - Logger.registerSerial(SERVER, 10, "SERVER"); - Logger.registerSerial(CONFIG, 10, "CONFIG"); - - Logger.info(SYSTEM, "Interface starting..."); + log.setup(); + log.info(SYSTEM, "Interface starting..."); // Get ETH mac delay(1000); @@ -191,19 +176,19 @@ void setup() esp_efuse_mac_get_default(mac); esp_read_mac(mac, ESP_MAC_ETH); - Logger.debug(CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC ETH\n", - mac[0], mac[1], mac[2], - mac[3], mac[4], mac[5]); + log.debug(CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC ETH\n", + mac[0], mac[1], mac[2], + mac[3], mac[4], mac[5]); esp_read_mac(mac, ESP_MAC_WIFI_SOFTAP); - Logger.debug(CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC SOFTAP\n", - mac[0], mac[1], mac[2], - mac[3], mac[4], mac[5]); + log.debug(CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC SOFTAP\n", + mac[0], mac[1], mac[2], + mac[3], mac[4], mac[5]); esp_read_mac(mac, ESP_MAC_WIFI_STA); // ESP_MAC_BASE - Logger.debug(CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC BASE\n", - mac[0], mac[1], mac[2], - mac[3], mac[4], mac[5]); + log.debug(CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC BASE\n", + mac[0], mac[1], mac[2], + mac[3], mac[4], mac[5]); // LED config.begin("dmx", true); @@ -224,7 +209,7 @@ void setup() } if (digitalRead(PIN_BUTTON) == LOW) { - Logger.notice(CONFIG, "Resetting config"); + log.notice(CONFIG, "Resetting config"); config.begin("dmx", false); config.clear(); config.end(); @@ -260,8 +245,8 @@ void setup() direction1 = static_cast(config.getUInt("direction-1", DEFAULT_DIRECTION1)); direction2 = static_cast(config.getUInt("direction-2", DEFAULT_DIRECTION2)); - Logger.info(CONFIG, "Port A: Universe %d %s", universe1, (direction1 == Input) ? "DMX -> Art-Net" : "Art-Net -> DMX"); - Logger.info(CONFIG, "Port B: Universe %d %s", universe2, (direction2 == Input) ? "DMX -> Art-Net" : "Art-Net -> DMX"); + log.info(CONFIG, "Port A: Universe %d %s", universe1, (direction1 == Input) ? "DMX -> Art-Net" : "Art-Net -> DMX"); + log.info(CONFIG, "Port B: Universe %d %s", universe2, (direction2 == Input) ? "DMX -> Art-Net" : "Art-Net -> DMX"); Connection connection = static_cast(config.getUInt("connection", DEFAULT_CONNECTION)); IpMethod ipMethod = static_cast(config.getUInt("ip-method"), DEFAULT_IP_METHOD); @@ -269,7 +254,7 @@ void setup() char hostname[30]; snprintf(hostname, sizeof(hostname), "ChaosDMX-%02X%02X", mac[4], mac[5]); DEFAULT_SSID = hostname; - Logger.info(CONFIG, "Hostname: %s", hostname); + log.info(CONFIG, "Hostname: %s", hostname); String ssid = config.getString("ssid", DEFAULT_SSID); String pwd = config.getString("password", DEFAULT_PASSWORD); @@ -284,32 +269,32 @@ void setup() switch (connection) { case WiFiSta: - Logger.debug(SYSTEM, "Initialize as WiFi Station"); + log.debug(SYSTEM, "Initialize as WiFi Station"); WiFi.setHostname(hostname); WiFi.begin(ssid, pwd); - Logger.info(CONFIG, "SSID: %s; PWD: %s", ssid, pwd); + log.info(CONFIG, "SSID: %s; PWD: %s", ssid, pwd); if (ipMethod == Static) { WiFi.config(ip, gateway, subnet); - Logger.info(CONFIG, "IP: %s; gateway: %s; subnet: %s", ip.toString(), gateway, subnet); + log.info(CONFIG, "IP: %s; gateway: %s; subnet: %s", ip.toString(), gateway, subnet); } - Logger.debug(WIFI, "Connecting..."); + log.debug(WIFI, "Connecting..."); while (WiFi.status() != WL_CONNECTED) { delay(50); updateLed(); } - Logger.info(WIFI, "Connected!"); + log.info(WIFI, "Connected!"); broadcastIp = String(WiFi.broadcastIP().toString().c_str()); - Logger.info(WIFI, "IP: %s", WiFi.localIP().toString()); - Logger.info(WIFI, "MAC: %X", WiFi.macAddress()); - Logger.info(WIFI, "Broadcast IP: %s", broadcastIp); + log.info(WIFI, "IP: %s", WiFi.localIP().toString()); + log.info(WIFI, "MAC: %X", WiFi.macAddress()); + log.info(WIFI, "Broadcast IP: %s", broadcastIp); break; case Ethernet: { - Logger.debug(SYSTEM, "Initialize as ETH"); + log.debug(SYSTEM, "Initialize as ETH"); ESP32_W5500_onEvent(); if (ETH.begin(ETH_MISO, ETH_MOSI, ETH_SCK, ETH_SS, ETH_INT, ETH_SPI_CLOCK_MHZ, SPI2_HOST, mac)) @@ -317,13 +302,13 @@ void setup() } else { - Logger.critical(ETHERNET, "Failed to configure Ethernet"); + log.critical(ETHERNET, "Failed to configure Ethernet"); } ETH.setHostname(hostname); // ESP32_W5500_waitForConnect(); uint8_t timeout = 5; // in s - Logger.debug(ETHERNET, "Wait for connect"); + log.debug(ETHERNET, "Wait for connect"); // TODO: use millis while (!ESP32_W5500_eth_connected && timeout > 0) { @@ -332,41 +317,41 @@ void setup() } if (ESP32_W5500_eth_connected) { - Logger.debug(ETHERNET, "DHCP OK!"); + log.debug(ETHERNET, "DHCP OK!"); } else { - Logger.debug(ETHERNET, "Set static IP"); + log.debug(ETHERNET, "Set static IP"); ETH.config(ip, gateway, subnet); } - Logger.debug(ETHERNET, "Ethernet Successfully Initialized"); + log.debug(ETHERNET, "Ethernet Successfully Initialized"); broadcastIp = ETH.broadcastIP().toString(); - Logger.info(ETHERNET, "Local IP: %s", ETH.localIP().toString()); - Logger.info(ETHERNET, "Subnet Mask: %s", ETH.subnetMask().toString()); - Logger.info(ETHERNET, "Gateway IP: %s", ETH.gatewayIP().toString()); - Logger.debug(ETHERNET, "DNS Server: %s", ETH.dnsIP().toString()); - Logger.debug(ETHERNET, "MAC address: %X", ETH.macAddress()); - Logger.debug(ETHERNET, "Broadcast IP: %s", broadcastIp); + log.info(ETHERNET, "Local IP: %s", ETH.localIP().toString()); + log.info(ETHERNET, "Subnet Mask: %s", ETH.subnetMask().toString()); + log.info(ETHERNET, "Gateway IP: %s", ETH.gatewayIP().toString()); + log.debug(ETHERNET, "DNS Server: %s", ETH.dnsIP().toString()); + log.debug(ETHERNET, "MAC address: %X", ETH.macAddress()); + log.debug(ETHERNET, "Broadcast IP: %s", broadcastIp); break; } default: - Logger.debug(SYSTEM, "Initialize as WiFi AccessPoint"); + log.debug(SYSTEM, "Initialize as WiFi AccessPoint"); WiFi.softAPsetHostname(hostname); WiFi.softAP(ssid, pwd); // AP always with DHCP // WiFi.softAPConfig(ip, gateway, subnet); broadcastIp = WiFi.softAPBroadcastIP().toString(); - Logger.debug(WIFI, "WiFi AP enabled"); - Logger.info(CONFIG, "IP: %s", WiFi.softAPIP().toString()); - Logger.debug(CONFIG, "MAC address: %X", WiFi.softAPmacAddress()); - Logger.debug(CONFIG, "Broadcast IP: %s", broadcastIp); + log.debug(WIFI, "WiFi AP enabled"); + log.info(CONFIG, "IP: %s", WiFi.softAPIP().toString()); + log.debug(CONFIG, "MAC address: %X", WiFi.softAPmacAddress()); + log.debug(CONFIG, "Broadcast IP: %s", broadcastIp); break; } // Initialize DMX ports - Logger.debug(DMX, "Initialize DMX..."); + log.debug(DMX, "Initialize DMX..."); #ifdef CONFIG_IDF_TARGET_ESP32S2 @@ -379,20 +364,20 @@ void setup() dmx_driver_install(dmx2, &dmx_config, personalities, personality_count); dmx_set_pin(dmx2, 17, 18, -1); - Logger.verbose(DMX, "DMX driver 1 installed: %d", dmx_driver_is_installed(dmx1)); - Logger.verbose(DMX, "DMX driver 2 installed: %d", dmx_driver_is_installed(dmx2)); + log.verbose(DMX, "DMX driver 1 installed: %d", dmx_driver_is_installed(dmx1)); + log.verbose(DMX, "DMX driver 2 installed: %d", dmx_driver_is_installed(dmx2)); - Logger.verbose(DMX, "DMX driver 1 enabled: %d", dmx_driver_is_enabled(dmx1)); - Logger.verbose(DMX, "DMX driver 2 enabled: %d", dmx_driver_is_enabled(dmx2)); + log.verbose(DMX, "DMX driver 1 enabled: %d", dmx_driver_is_enabled(dmx1)); + log.verbose(DMX, "DMX driver 2 enabled: %d", dmx_driver_is_enabled(dmx2)); #else dmx1.init(21, 33, Serial1); dmx2.init(17, 18, Serial2); #endif - Logger.debug(DMX, "DMX initialized"); + log.debug(DMX, "DMX initialized"); // Initialize Art-Net - Logger.debug(ARTNET, "Initialize Art-Net..."); + log.debug(ARTNET, "Initialize Art-Net..."); artnet.begin(); // if Artnet packet comes to this universe, this function is called @@ -413,12 +398,12 @@ void setup() dmx_send(dmx2); dmx_wait_sent(dmx2, DMX_TIMEOUT_TICK); }); } - Logger.debug(ARTNET, "Initialized Art-Net"); + log.debug(ARTNET, "Initialized Art-Net"); if (!LittleFS.begin(true)) { setStatus(Status::Critical); - Logger.critical(SYSTEM, "An Error has occurred while mounting LittleFS"); + log.critical(SYSTEM, "An Error has occurred while mounting LittleFS"); return; } @@ -444,14 +429,14 @@ void setup() { if (request->url() == "/config" && request->method() == HTTP_PUT) { onPutConfig(request, data, len, index, total); - Logger.info(SYSTEM, "Restarting ESP..."); + log.info(SYSTEM, "Restarting ESP..."); ESP.restart(); } }); initWebSocket(&server); server.begin(); - Logger.debug(SERVER, "Webserver started!"); + log.debug(SERVER, "Webserver started!"); // scan networks and cache them WiFi.scanNetworks(true); @@ -460,16 +445,16 @@ void setup() // Internal temperature RP2040 // float tempC = analogReadTemp(); // Get internal temperature - // Logger.verbose(SYSTEM, "Temperature Celsius: %d °C", tempC); + // log.verbose(SYSTEM, "Temperature Celsius: %d °C", tempC); // Internal temperature ESP32 https://www.espboards.dev/blog/esp32-inbuilt-temperature-sensor/ float result = 0; temp_sensor_read_celsius(&result); - Logger.verbose(SYSTEM, "Temperature: %.2f °C", result); + log.verbose(SYSTEM, "Temperature: %.2f °C", result); - Logger.verbose(SYSTEM, "Internal Total heap: %d; internal Free Heap: %d", ESP.getHeapSize(), ESP.getFreeHeap()); - Logger.verbose(SYSTEM, "SPIRam Total heap: %d; SPIRam Free Heap: %d", ESP.getPsramSize(), ESP.getFreePsram()); - Logger.verbose(SYSTEM, "ChipRevision: %d; Cpu Freq: %d; SDK Version: %s", ESP.getChipRevision(), ESP.getCpuFreqMHz(), ESP.getSdkVersion()); - Logger.verbose(SYSTEM, "Flash Size: %d; Flash Speed: %d", ESP.getFlashChipSize(), ESP.getFlashChipSpeed()); + log.verbose(SYSTEM, "Internal Total heap: %d; internal Free Heap: %d", ESP.getHeapSize(), ESP.getFreeHeap()); + log.verbose(SYSTEM, "SPIRam Total heap: %d; SPIRam Free Heap: %d", ESP.getPsramSize(), ESP.getFreePsram()); + log.verbose(SYSTEM, "ChipRevision: %d; Cpu Freq: %d; SDK Version: %s", ESP.getChipRevision(), ESP.getCpuFreqMHz(), ESP.getSdkVersion()); + log.verbose(SYSTEM, "Flash Size: %d; Flash Speed: %d", ESP.getFlashChipSize(), ESP.getFlashChipSpeed()); } void transmitDmxToArtnet(dmx_port_t dmxPort, byte *dmx_data, uint8_t artnetUniverse) @@ -495,7 +480,7 @@ void transmitDmxToArtnet(dmx_port_t dmxPort, byte *dmx_data, uint8_t artnetUnive connect or disconnect your DMX devices. If you are consistently getting DMX errors, then something may have gone wrong with your code or something is seriously wrong with your DMX transmitter. */ - Logger.error(DMX, "A DMX error occurred on port %d", dmxPort); + log.error(DMX, "A DMX error occurred on port %d", dmxPort); } } } From 1c87abc48e4b78c89ef018ab3397f4efc2dec9e5 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Tue, 27 May 2025 18:16:38 +0200 Subject: [PATCH 03/12] refactor logging: replace Log class methods with direct function calls for improved simplicity and performance TODO: - [ ] ENUM names for level and tag - [ ] web log etc --- src/log.cpp | 65 ++++++-------------------- src/log.h | 46 +++++++++--------- src/main.cpp | 129 +++++++++++++++++++++++---------------------------- 3 files changed, 99 insertions(+), 141 deletions(-) diff --git a/src/log.cpp b/src/log.cpp index f4a9a6e..bd47596 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -1,58 +1,23 @@ #include "log.h" -#include -void Log::setup() +void setupLogger() { - Logger.registerSerial(SYSTEM, 10, "SYSTEM"); - Logger.registerSerial(DMX, 10, "DMX"); - Logger.registerSerial(ARTNET, 10, "ARTNET"); - Logger.registerSerial(WIFI, 10, "WIFI"); - Logger.registerSerial(ETHERNET, 10, "ETHERNET"); - Logger.registerSerial(SERVER, 10, "SERVER"); - Logger.registerSerial(CONFIG, 10, "CONFIG"); -}; - -void Log::info(int tag, String format, ...) -{ - Logger.info(tag, format, va_list()); + Serial.begin(9600); + while (!Serial) + { + // updateLed(); + } + // delay(5000); + Serial.println("Logger initialized"); } -void Log::debug(int tag, String format, ...) +void writeLogEntry(const log_level level, const log_tag tag, const char *message, ...) { - Logger.debug(tag, format, va_list()); -} + char buffer[256]; + va_list args; + va_start(args, message); + vsnprintf(buffer, sizeof(buffer), message, args); + va_end(args); -void Log::verbose(int tag, String format, ...) -{ - Logger.verbose(tag, format, va_list()); -} - -void Log::error(int tag, String format, ...) -{ - Logger.error(tag, format, va_list()); -} - -void Log::critical(int tag, String format, ...) -{ - Logger.critical(tag, format, va_list()); -} - -void Log::warning(int tag, String format, ...) -{ - Logger.warning(tag, format, va_list()); -} - -void Log::notice(int tag, String format, ...) -{ - Logger.notice(tag, format, va_list()); -} - -void Log::alert(int tag, String format, ...) -{ - Logger.alert(tag, format, va_list()); -} - -void Log::emergency(int tag, String format, ...) -{ - Logger.emergency(tag, format, va_list()); + Serial.printf("[%d] [%d] \t %s\n", level, tag, buffer); } \ No newline at end of file diff --git a/src/log.h b/src/log.h index 7343589..4d53fb0 100644 --- a/src/log.h +++ b/src/log.h @@ -1,24 +1,28 @@ #include -#define SYSTEM 0 -#define DMX 1 -#define ARTNET 2 -#define SERVER 3 -#define WIFI 4 -#define ETHERNET 5 -#define CONFIG 6 - -class Log +enum log_level { -public: - void setup(); - void info(int tag, String format, ...); - void debug(int tag, String format, ...); - void verbose(int tag, String format, ...); - void error(int tag, String format, ...); - void critical(int tag, String format, ...); - void warning(int tag, String format, ...); - void notice(int tag, String format, ...); - void alert(int tag, String format, ...); - void emergency(int tag, String format, ...); -}; \ No newline at end of file + INFO, + DEBUG, + VERBOSE, + ERROR, + CRITICAL, + WARNING, + NOTICE, + ALERT, + EMERGENCY +}; + +enum log_tag +{ + SYSTEM, + DMX, + ARTNET, + SERVER, + WIFI, + ETHERNET, + CONFIG +}; + +void setupLogger(); +void writeLogEntry(const log_level level, const log_tag tag, const char *message, ...); \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 6a874f0..07c0533 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -27,8 +27,6 @@ #include "routes/networks.h" #include "routes/status.h" -Log log; - dmx_port_t dmx1 = DMX_NUM_0; // for esp32s2 dmx_port_t dmx2 = DMX_NUM_1; byte dmx1_data[DMX_PACKET_SIZE]; @@ -165,30 +163,28 @@ void setup() setStatus(Status::Starting); pinMode(PIN_LED, OUTPUT); updateLed(); - - Serial.begin(9600); - log.setup(); - log.info(SYSTEM, "Interface starting..."); - + setupLogger(); + writeLogEntry(INFO, SYSTEM, "Interface starting..."); + writeLogEntry(INFO, SYSTEM, "Test %s", "hello world"); // Get ETH mac delay(1000); esp_efuse_mac_get_default(mac); esp_read_mac(mac, ESP_MAC_ETH); - log.debug(CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC ETH\n", - mac[0], mac[1], mac[2], - mac[3], mac[4], mac[5]); + writeLogEntry(DEBUG, CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC ETH", + mac[0], mac[1], mac[2], + mac[3], mac[4], mac[5]); esp_read_mac(mac, ESP_MAC_WIFI_SOFTAP); - log.debug(CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC SOFTAP\n", - mac[0], mac[1], mac[2], - mac[3], mac[4], mac[5]); + writeLogEntry(DEBUG, CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC SOFTAP", + mac[0], mac[1], mac[2], + mac[3], mac[4], mac[5]); esp_read_mac(mac, ESP_MAC_WIFI_STA); // ESP_MAC_BASE - log.debug(CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC BASE\n", - mac[0], mac[1], mac[2], - mac[3], mac[4], mac[5]); + writeLogEntry(DEBUG, CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC BASE", + mac[0], mac[1], mac[2], + mac[3], mac[4], mac[5]); // LED config.begin("dmx", true); @@ -209,7 +205,7 @@ void setup() } if (digitalRead(PIN_BUTTON) == LOW) { - log.notice(CONFIG, "Resetting config"); + writeLogEntry(NOTICE, CONFIG, "Resetting config"); config.begin("dmx", false); config.clear(); config.end(); @@ -230,13 +226,6 @@ void setup() attachInterrupt(PIN_BUTTON, onButtonPress, FALLING); - // wait for serial monitor - unsigned long startTime = millis(); - while (millis() - startTime <= 5000) - { - updateLed(); - } - config.begin("dmx", true); universe1 = config.getUInt("universe-1", DEFAULT_UNIVERSE1); @@ -245,8 +234,8 @@ void setup() direction1 = static_cast(config.getUInt("direction-1", DEFAULT_DIRECTION1)); direction2 = static_cast(config.getUInt("direction-2", DEFAULT_DIRECTION2)); - log.info(CONFIG, "Port A: Universe %d %s", universe1, (direction1 == Input) ? "DMX -> Art-Net" : "Art-Net -> DMX"); - log.info(CONFIG, "Port B: Universe %d %s", universe2, (direction2 == Input) ? "DMX -> Art-Net" : "Art-Net -> DMX"); + writeLogEntry(INFO, CONFIG, "Port A: Universe %d %s", universe1, (direction1 == Input) ? "DMX -> Art-Net" : "Art-Net -> DMX"); + writeLogEntry(INFO, CONFIG, "Port B: Universe %d %s", universe2, (direction2 == Input) ? "DMX -> Art-Net" : "Art-Net -> DMX"); Connection connection = static_cast(config.getUInt("connection", DEFAULT_CONNECTION)); IpMethod ipMethod = static_cast(config.getUInt("ip-method"), DEFAULT_IP_METHOD); @@ -254,7 +243,7 @@ void setup() char hostname[30]; snprintf(hostname, sizeof(hostname), "ChaosDMX-%02X%02X", mac[4], mac[5]); DEFAULT_SSID = hostname; - log.info(CONFIG, "Hostname: %s", hostname); + writeLogEntry(INFO, CONFIG, "Hostname: %s", hostname); String ssid = config.getString("ssid", DEFAULT_SSID); String pwd = config.getString("password", DEFAULT_PASSWORD); @@ -269,32 +258,32 @@ void setup() switch (connection) { case WiFiSta: - log.debug(SYSTEM, "Initialize as WiFi Station"); + writeLogEntry(DEBUG, SYSTEM, "Initialize as WiFi Station"); WiFi.setHostname(hostname); WiFi.begin(ssid, pwd); - log.info(CONFIG, "SSID: %s; PWD: %s", ssid, pwd); + writeLogEntry(INFO, CONFIG, "SSID: %s; PWD: %s", ssid, pwd); if (ipMethod == Static) { WiFi.config(ip, gateway, subnet); - log.info(CONFIG, "IP: %s; gateway: %s; subnet: %s", ip.toString(), gateway, subnet); + writeLogEntry(INFO, CONFIG, "IP: %s; gateway: %s; subnet: %s", ip.toString(), gateway, subnet); } - log.debug(WIFI, "Connecting..."); + writeLogEntry(DEBUG, WIFI, "Connecting..."); while (WiFi.status() != WL_CONNECTED) { delay(50); updateLed(); } - log.info(WIFI, "Connected!"); + writeLogEntry(INFO, WIFI, "Connected!"); broadcastIp = String(WiFi.broadcastIP().toString().c_str()); - log.info(WIFI, "IP: %s", WiFi.localIP().toString()); - log.info(WIFI, "MAC: %X", WiFi.macAddress()); - log.info(WIFI, "Broadcast IP: %s", broadcastIp); + writeLogEntry(INFO, WIFI, "IP: %s", WiFi.localIP().toString()); + writeLogEntry(INFO, WIFI, "MAC: %X", WiFi.macAddress()); + writeLogEntry(INFO, WIFI, "Broadcast IP: %s", broadcastIp); break; case Ethernet: { - log.debug(SYSTEM, "Initialize as ETH"); + writeLogEntry(DEBUG, SYSTEM, "Initialize as ETH"); ESP32_W5500_onEvent(); if (ETH.begin(ETH_MISO, ETH_MOSI, ETH_SCK, ETH_SS, ETH_INT, ETH_SPI_CLOCK_MHZ, SPI2_HOST, mac)) @@ -302,13 +291,13 @@ void setup() } else { - log.critical(ETHERNET, "Failed to configure Ethernet"); + writeLogEntry(CRITICAL, ETHERNET, "Failed to configure Ethernet"); } ETH.setHostname(hostname); // ESP32_W5500_waitForConnect(); uint8_t timeout = 5; // in s - log.debug(ETHERNET, "Wait for connect"); + writeLogEntry(DEBUG, ETHERNET, "Wait for connect"); // TODO: use millis while (!ESP32_W5500_eth_connected && timeout > 0) { @@ -317,41 +306,41 @@ void setup() } if (ESP32_W5500_eth_connected) { - log.debug(ETHERNET, "DHCP OK!"); + writeLogEntry(DEBUG, ETHERNET, "DHCP OK!"); } else { - log.debug(ETHERNET, "Set static IP"); + writeLogEntry(DEBUG, ETHERNET, "Set static IP"); ETH.config(ip, gateway, subnet); } - log.debug(ETHERNET, "Ethernet Successfully Initialized"); + writeLogEntry(DEBUG, ETHERNET, "Ethernet Successfully Initialized"); broadcastIp = ETH.broadcastIP().toString(); - log.info(ETHERNET, "Local IP: %s", ETH.localIP().toString()); - log.info(ETHERNET, "Subnet Mask: %s", ETH.subnetMask().toString()); - log.info(ETHERNET, "Gateway IP: %s", ETH.gatewayIP().toString()); - log.debug(ETHERNET, "DNS Server: %s", ETH.dnsIP().toString()); - log.debug(ETHERNET, "MAC address: %X", ETH.macAddress()); - log.debug(ETHERNET, "Broadcast IP: %s", broadcastIp); + writeLogEntry(INFO, ETHERNET, "Local IP: %s", ETH.localIP().toString()); + writeLogEntry(INFO, ETHERNET, "Subnet Mask: %s", ETH.subnetMask().toString()); + writeLogEntry(INFO, ETHERNET, "Gateway IP: %s", ETH.gatewayIP().toString()); + writeLogEntry(DEBUG, ETHERNET, "DNS Server: %s", ETH.dnsIP().toString()); + writeLogEntry(DEBUG, ETHERNET, "MAC address: %X", ETH.macAddress()); + writeLogEntry(DEBUG, ETHERNET, "Broadcast IP: %s", broadcastIp); break; } default: - log.debug(SYSTEM, "Initialize as WiFi AccessPoint"); + writeLogEntry(DEBUG, SYSTEM, "Initialize as WiFi AccessPoint"); WiFi.softAPsetHostname(hostname); WiFi.softAP(ssid, pwd); // AP always with DHCP // WiFi.softAPConfig(ip, gateway, subnet); broadcastIp = WiFi.softAPBroadcastIP().toString(); - log.debug(WIFI, "WiFi AP enabled"); - log.info(CONFIG, "IP: %s", WiFi.softAPIP().toString()); - log.debug(CONFIG, "MAC address: %X", WiFi.softAPmacAddress()); - log.debug(CONFIG, "Broadcast IP: %s", broadcastIp); + writeLogEntry(DEBUG, WIFI, "WiFi AP enabled"); + writeLogEntry(INFO, CONFIG, "IP: %s", WiFi.softAPIP().toString()); + writeLogEntry(DEBUG, CONFIG, "MAC address: %X", WiFi.softAPmacAddress()); + writeLogEntry(DEBUG, CONFIG, "Broadcast IP: %s", broadcastIp); break; } // Initialize DMX ports - log.debug(DMX, "Initialize DMX..."); + writeLogEntry(DEBUG, DMX, "Initialize DMX..."); #ifdef CONFIG_IDF_TARGET_ESP32S2 @@ -364,20 +353,20 @@ void setup() dmx_driver_install(dmx2, &dmx_config, personalities, personality_count); dmx_set_pin(dmx2, 17, 18, -1); - log.verbose(DMX, "DMX driver 1 installed: %d", dmx_driver_is_installed(dmx1)); - log.verbose(DMX, "DMX driver 2 installed: %d", dmx_driver_is_installed(dmx2)); + writeLogEntry(VERBOSE, DMX, "DMX driver 1 installed: %d", dmx_driver_is_installed(dmx1)); + writeLogEntry(VERBOSE, DMX, "DMX driver 2 installed: %d", dmx_driver_is_installed(dmx2)); - log.verbose(DMX, "DMX driver 1 enabled: %d", dmx_driver_is_enabled(dmx1)); - log.verbose(DMX, "DMX driver 2 enabled: %d", dmx_driver_is_enabled(dmx2)); + writeLogEntry(VERBOSE, DMX, "DMX driver 1 enabled: %d", dmx_driver_is_enabled(dmx1)); + writeLogEntry(VERBOSE, DMX, "DMX driver 2 enabled: %d", dmx_driver_is_enabled(dmx2)); #else dmx1.init(21, 33, Serial1); dmx2.init(17, 18, Serial2); #endif - log.debug(DMX, "DMX initialized"); + writeLogEntry(DEBUG, DMX, "DMX initialized"); // Initialize Art-Net - log.debug(ARTNET, "Initialize Art-Net..."); + writeLogEntry(DEBUG, ARTNET, "Initialize Art-Net..."); artnet.begin(); // if Artnet packet comes to this universe, this function is called @@ -398,12 +387,12 @@ void setup() dmx_send(dmx2); dmx_wait_sent(dmx2, DMX_TIMEOUT_TICK); }); } - log.debug(ARTNET, "Initialized Art-Net"); + writeLogEntry(DEBUG, ARTNET, "Initialized Art-Net"); if (!LittleFS.begin(true)) { setStatus(Status::Critical); - log.critical(SYSTEM, "An Error has occurred while mounting LittleFS"); + writeLogEntry(CRITICAL, SYSTEM, "An Error has occurred while mounting LittleFS"); return; } @@ -429,14 +418,14 @@ void setup() { if (request->url() == "/config" && request->method() == HTTP_PUT) { onPutConfig(request, data, len, index, total); - log.info(SYSTEM, "Restarting ESP..."); + writeLogEntry(INFO, SYSTEM, "Restarting ESP..."); ESP.restart(); } }); initWebSocket(&server); server.begin(); - log.debug(SERVER, "Webserver started!"); + writeLogEntry(DEBUG, SERVER, "Webserver started!"); // scan networks and cache them WiFi.scanNetworks(true); @@ -445,16 +434,16 @@ void setup() // Internal temperature RP2040 // float tempC = analogReadTemp(); // Get internal temperature - // log.verbose(SYSTEM, "Temperature Celsius: %d °C", tempC); + // logIT(VERBOSE, SYSTEM, "Temperature Celsius: %d °C", tempC); // Internal temperature ESP32 https://www.espboards.dev/blog/esp32-inbuilt-temperature-sensor/ float result = 0; temp_sensor_read_celsius(&result); - log.verbose(SYSTEM, "Temperature: %.2f °C", result); + writeLogEntry(VERBOSE, SYSTEM, "Temperature: %.2f °C", result); - log.verbose(SYSTEM, "Internal Total heap: %d; internal Free Heap: %d", ESP.getHeapSize(), ESP.getFreeHeap()); - log.verbose(SYSTEM, "SPIRam Total heap: %d; SPIRam Free Heap: %d", ESP.getPsramSize(), ESP.getFreePsram()); - log.verbose(SYSTEM, "ChipRevision: %d; Cpu Freq: %d; SDK Version: %s", ESP.getChipRevision(), ESP.getCpuFreqMHz(), ESP.getSdkVersion()); - log.verbose(SYSTEM, "Flash Size: %d; Flash Speed: %d", ESP.getFlashChipSize(), ESP.getFlashChipSpeed()); + writeLogEntry(VERBOSE, SYSTEM, "Internal Total heap: %d; internal Free Heap: %d", ESP.getHeapSize(), ESP.getFreeHeap()); + writeLogEntry(VERBOSE, SYSTEM, "SPIRam Total heap: %d; SPIRam Free Heap: %d", ESP.getPsramSize(), ESP.getFreePsram()); + writeLogEntry(VERBOSE, SYSTEM, "ChipRevision: %d; Cpu Freq: %d; SDK Version: %s", ESP.getChipRevision(), ESP.getCpuFreqMHz(), ESP.getSdkVersion()); + writeLogEntry(VERBOSE, SYSTEM, "Flash Size: %d; Flash Speed: %d", ESP.getFlashChipSize(), ESP.getFlashChipSpeed()); } void transmitDmxToArtnet(dmx_port_t dmxPort, byte *dmx_data, uint8_t artnetUniverse) @@ -480,7 +469,7 @@ void transmitDmxToArtnet(dmx_port_t dmxPort, byte *dmx_data, uint8_t artnetUnive connect or disconnect your DMX devices. If you are consistently getting DMX errors, then something may have gone wrong with your code or something is seriously wrong with your DMX transmitter. */ - log.error(DMX, "A DMX error occurred on port %d", dmxPort); + writeLogEntry(ERROR, DMX, "A DMX error occurred on port %d", dmxPort); } } } From d520fc8dfa2e0a47c2e9ef639d2249e7bee66a4a Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Tue, 27 May 2025 18:24:43 +0200 Subject: [PATCH 04/12] refactor writeLogEntry: dynamically allocate buffer for variable-length log messages --- src/log.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/log.cpp b/src/log.cpp index bd47596..54fc564 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -13,11 +13,14 @@ void setupLogger() void writeLogEntry(const log_level level, const log_tag tag, const char *message, ...) { - char buffer[256]; va_list args; va_start(args, message); - vsnprintf(buffer, sizeof(buffer), message, args); + int size = vsnprintf(nullptr, 0, message, args); va_end(args); + char *buffer = new char[size + 1]; + va_start(args, message); + vsnprintf(buffer, size + 1, message, args); Serial.printf("[%d] [%d] \t %s\n", level, tag, buffer); -} \ No newline at end of file + delete[] buffer; +} From 020772725b873b5e3a6c2078b69a42f8f90972a6 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Tue, 27 May 2025 20:35:47 +0200 Subject: [PATCH 05/12] refactor logging: update writeLogEntry to use tag namespace and improve log level string representation --- src/log.cpp | 29 +++++++++++++- src/log.h | 31 ++++++++------- src/main.cpp | 104 +++++++++++++++++++++++++-------------------------- 3 files changed, 94 insertions(+), 70 deletions(-) diff --git a/src/log.cpp b/src/log.cpp index 54fc564..a8b3831 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -1,5 +1,30 @@ #include "log.h" +const char *getLogLevelString(log_level level) +{ + switch (level) + { + case EMERGENCY: + return "EMRG"; + case ALERT: + return "ALRT"; + case CRITICAL: + return "CRIT"; + case ERROR: + return "EROR"; + case WARNING: + return "WRNG"; + case NOTICE: + return "NOTI"; + case INFO: + return "INFO"; + case DEBUG: + return "DEBG"; + default: + return "UKWN"; + } +} + void setupLogger() { Serial.begin(9600); @@ -11,7 +36,7 @@ void setupLogger() Serial.println("Logger initialized"); } -void writeLogEntry(const log_level level, const log_tag tag, const char *message, ...) +void writeLogEntry(const log_level level, const char *tag, const char *message, ...) { va_list args; va_start(args, message); @@ -21,6 +46,6 @@ void writeLogEntry(const log_level level, const log_tag tag, const char *message char *buffer = new char[size + 1]; va_start(args, message); vsnprintf(buffer, size + 1, message, args); - Serial.printf("[%d] [%d] \t %s\n", level, tag, buffer); + Serial.printf("[%s][%s]> %s\n", getLogLevelString(level), tag, buffer); delete[] buffer; } diff --git a/src/log.h b/src/log.h index 4d53fb0..8111598 100644 --- a/src/log.h +++ b/src/log.h @@ -2,27 +2,26 @@ enum log_level { - INFO, - DEBUG, - VERBOSE, - ERROR, + EMERGENCY, + ALERT, CRITICAL, + ERROR, WARNING, NOTICE, - ALERT, - EMERGENCY + INFO, + DEBUG }; -enum log_tag +namespace tag { - SYSTEM, - DMX, - ARTNET, - SERVER, - WIFI, - ETHERNET, - CONFIG -}; + const char *const SYSTEM = "SYS"; + const char *const DMX = "DMX"; + const char *const ARTNET = "ART"; + const char *const SERVER = "SVR"; + const char *const WIFI = "WIF"; + const char *const ETHERNET = "ETH"; + const char *const CONFIG = "CNF"; +} void setupLogger(); -void writeLogEntry(const log_level level, const log_tag tag, const char *message, ...); \ No newline at end of file +void writeLogEntry(const log_level level, const char *tag, const char *message, ...); \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 07c0533..85c50a4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -164,25 +164,25 @@ void setup() pinMode(PIN_LED, OUTPUT); updateLed(); setupLogger(); - writeLogEntry(INFO, SYSTEM, "Interface starting..."); - writeLogEntry(INFO, SYSTEM, "Test %s", "hello world"); + writeLogEntry(INFO, tag::SYSTEM, "Interface starting..."); + writeLogEntry(INFO, tag::SYSTEM, "Test %s", "hello world"); // Get ETH mac delay(1000); esp_efuse_mac_get_default(mac); esp_read_mac(mac, ESP_MAC_ETH); - writeLogEntry(DEBUG, CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC ETH", + writeLogEntry(DEBUG, tag::CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC ETH", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); esp_read_mac(mac, ESP_MAC_WIFI_SOFTAP); - writeLogEntry(DEBUG, CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC SOFTAP", + writeLogEntry(DEBUG, tag::CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC SOFTAP", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); esp_read_mac(mac, ESP_MAC_WIFI_STA); // ESP_MAC_BASE - writeLogEntry(DEBUG, CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC BASE", + writeLogEntry(DEBUG, tag::CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC BASE", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); @@ -205,7 +205,7 @@ void setup() } if (digitalRead(PIN_BUTTON) == LOW) { - writeLogEntry(NOTICE, CONFIG, "Resetting config"); + writeLogEntry(NOTICE, tag::CONFIG, "Resetting config"); config.begin("dmx", false); config.clear(); config.end(); @@ -234,8 +234,8 @@ void setup() direction1 = static_cast(config.getUInt("direction-1", DEFAULT_DIRECTION1)); direction2 = static_cast(config.getUInt("direction-2", DEFAULT_DIRECTION2)); - writeLogEntry(INFO, CONFIG, "Port A: Universe %d %s", universe1, (direction1 == Input) ? "DMX -> Art-Net" : "Art-Net -> DMX"); - writeLogEntry(INFO, CONFIG, "Port B: Universe %d %s", universe2, (direction2 == Input) ? "DMX -> Art-Net" : "Art-Net -> DMX"); + writeLogEntry(INFO, tag::CONFIG, "Port A: Universe %d %s", universe1, (direction1 == Input) ? "DMX -> Art-Net" : "Art-Net -> DMX"); + writeLogEntry(INFO, tag::CONFIG, "Port B: Universe %d %s", universe2, (direction2 == Input) ? "DMX -> Art-Net" : "Art-Net -> DMX"); Connection connection = static_cast(config.getUInt("connection", DEFAULT_CONNECTION)); IpMethod ipMethod = static_cast(config.getUInt("ip-method"), DEFAULT_IP_METHOD); @@ -243,7 +243,7 @@ void setup() char hostname[30]; snprintf(hostname, sizeof(hostname), "ChaosDMX-%02X%02X", mac[4], mac[5]); DEFAULT_SSID = hostname; - writeLogEntry(INFO, CONFIG, "Hostname: %s", hostname); + writeLogEntry(INFO, tag::CONFIG, "Hostname: %s", hostname); String ssid = config.getString("ssid", DEFAULT_SSID); String pwd = config.getString("password", DEFAULT_PASSWORD); @@ -258,32 +258,32 @@ void setup() switch (connection) { case WiFiSta: - writeLogEntry(DEBUG, SYSTEM, "Initialize as WiFi Station"); + writeLogEntry(DEBUG, tag::SYSTEM, "Initialize as WiFi Station"); WiFi.setHostname(hostname); WiFi.begin(ssid, pwd); - writeLogEntry(INFO, CONFIG, "SSID: %s; PWD: %s", ssid, pwd); + writeLogEntry(INFO, tag::CONFIG, "SSID: %s; PWD: %s", ssid, pwd); if (ipMethod == Static) { WiFi.config(ip, gateway, subnet); - writeLogEntry(INFO, CONFIG, "IP: %s; gateway: %s; subnet: %s", ip.toString(), gateway, subnet); + writeLogEntry(INFO, tag::CONFIG, "IP: %s; gateway: %s; subnet: %s", ip.toString(), gateway, subnet); } - writeLogEntry(DEBUG, WIFI, "Connecting..."); + writeLogEntry(DEBUG, tag::WIFI, "Connecting..."); while (WiFi.status() != WL_CONNECTED) { delay(50); updateLed(); } - writeLogEntry(INFO, WIFI, "Connected!"); + writeLogEntry(INFO, tag::WIFI, "Connected!"); broadcastIp = String(WiFi.broadcastIP().toString().c_str()); - writeLogEntry(INFO, WIFI, "IP: %s", WiFi.localIP().toString()); - writeLogEntry(INFO, WIFI, "MAC: %X", WiFi.macAddress()); - writeLogEntry(INFO, WIFI, "Broadcast IP: %s", broadcastIp); + writeLogEntry(INFO, tag::WIFI, "IP: %s", WiFi.localIP().toString()); + writeLogEntry(INFO, tag::WIFI, "MAC: %X", WiFi.macAddress()); + writeLogEntry(INFO, tag::WIFI, "Broadcast IP: %s", broadcastIp); break; case Ethernet: { - writeLogEntry(DEBUG, SYSTEM, "Initialize as ETH"); + writeLogEntry(DEBUG, tag::SYSTEM, "Initialize as ETH"); ESP32_W5500_onEvent(); if (ETH.begin(ETH_MISO, ETH_MOSI, ETH_SCK, ETH_SS, ETH_INT, ETH_SPI_CLOCK_MHZ, SPI2_HOST, mac)) @@ -291,13 +291,13 @@ void setup() } else { - writeLogEntry(CRITICAL, ETHERNET, "Failed to configure Ethernet"); + writeLogEntry(CRITICAL, tag::ETHERNET, "Failed to configure Ethernet"); } ETH.setHostname(hostname); // ESP32_W5500_waitForConnect(); uint8_t timeout = 5; // in s - writeLogEntry(DEBUG, ETHERNET, "Wait for connect"); + writeLogEntry(DEBUG, tag::ETHERNET, "Wait for connect"); // TODO: use millis while (!ESP32_W5500_eth_connected && timeout > 0) { @@ -306,41 +306,41 @@ void setup() } if (ESP32_W5500_eth_connected) { - writeLogEntry(DEBUG, ETHERNET, "DHCP OK!"); + writeLogEntry(DEBUG, tag::ETHERNET, "DHCP OK!"); } else { - writeLogEntry(DEBUG, ETHERNET, "Set static IP"); + writeLogEntry(DEBUG, tag::ETHERNET, "Set static IP"); ETH.config(ip, gateway, subnet); } - writeLogEntry(DEBUG, ETHERNET, "Ethernet Successfully Initialized"); + writeLogEntry(DEBUG, tag::ETHERNET, "Ethernet Successfully Initialized"); broadcastIp = ETH.broadcastIP().toString(); - writeLogEntry(INFO, ETHERNET, "Local IP: %s", ETH.localIP().toString()); - writeLogEntry(INFO, ETHERNET, "Subnet Mask: %s", ETH.subnetMask().toString()); - writeLogEntry(INFO, ETHERNET, "Gateway IP: %s", ETH.gatewayIP().toString()); - writeLogEntry(DEBUG, ETHERNET, "DNS Server: %s", ETH.dnsIP().toString()); - writeLogEntry(DEBUG, ETHERNET, "MAC address: %X", ETH.macAddress()); - writeLogEntry(DEBUG, ETHERNET, "Broadcast IP: %s", broadcastIp); + writeLogEntry(INFO, tag::ETHERNET, "Local IP: %s", ETH.localIP().toString()); + writeLogEntry(INFO, tag::ETHERNET, "Subnet Mask: %s", ETH.subnetMask().toString()); + writeLogEntry(INFO, tag::ETHERNET, "Gateway IP: %s", ETH.gatewayIP().toString()); + writeLogEntry(DEBUG, tag::ETHERNET, "DNS Server: %s", ETH.dnsIP().toString()); + writeLogEntry(DEBUG, tag::ETHERNET, "MAC address: %X", ETH.macAddress()); + writeLogEntry(DEBUG, tag::ETHERNET, "Broadcast IP: %s", broadcastIp); break; } default: - writeLogEntry(DEBUG, SYSTEM, "Initialize as WiFi AccessPoint"); + writeLogEntry(DEBUG, tag::SYSTEM, "Initialize as WiFi AccessPoint"); WiFi.softAPsetHostname(hostname); WiFi.softAP(ssid, pwd); // AP always with DHCP // WiFi.softAPConfig(ip, gateway, subnet); broadcastIp = WiFi.softAPBroadcastIP().toString(); - writeLogEntry(DEBUG, WIFI, "WiFi AP enabled"); - writeLogEntry(INFO, CONFIG, "IP: %s", WiFi.softAPIP().toString()); - writeLogEntry(DEBUG, CONFIG, "MAC address: %X", WiFi.softAPmacAddress()); - writeLogEntry(DEBUG, CONFIG, "Broadcast IP: %s", broadcastIp); + writeLogEntry(DEBUG, tag::WIFI, "WiFi AP enabled"); + writeLogEntry(INFO, tag::CONFIG, "IP: %s", WiFi.softAPIP().toString()); + writeLogEntry(DEBUG, tag::CONFIG, "MAC address: %X", WiFi.softAPmacAddress()); + writeLogEntry(DEBUG, tag::CONFIG, "Broadcast IP: %s", broadcastIp); break; } // Initialize DMX ports - writeLogEntry(DEBUG, DMX, "Initialize DMX..."); + writeLogEntry(DEBUG, tag::DMX, "Initialize DMX..."); #ifdef CONFIG_IDF_TARGET_ESP32S2 @@ -353,20 +353,20 @@ void setup() dmx_driver_install(dmx2, &dmx_config, personalities, personality_count); dmx_set_pin(dmx2, 17, 18, -1); - writeLogEntry(VERBOSE, DMX, "DMX driver 1 installed: %d", dmx_driver_is_installed(dmx1)); - writeLogEntry(VERBOSE, DMX, "DMX driver 2 installed: %d", dmx_driver_is_installed(dmx2)); + writeLogEntry(DEBUG, tag::DMX, "DMX driver 1 installed: %d", dmx_driver_is_installed(dmx1)); + writeLogEntry(DEBUG, tag::DMX, "DMX driver 2 installed: %d", dmx_driver_is_installed(dmx2)); - writeLogEntry(VERBOSE, DMX, "DMX driver 1 enabled: %d", dmx_driver_is_enabled(dmx1)); - writeLogEntry(VERBOSE, DMX, "DMX driver 2 enabled: %d", dmx_driver_is_enabled(dmx2)); + writeLogEntry(DEBUG, tag::DMX, "DMX driver 1 enabled: %d", dmx_driver_is_enabled(dmx1)); + writeLogEntry(DEBUG, tag::DMX, "DMX driver 2 enabled: %d", dmx_driver_is_enabled(dmx2)); #else dmx1.init(21, 33, Serial1); dmx2.init(17, 18, Serial2); #endif - writeLogEntry(DEBUG, DMX, "DMX initialized"); + writeLogEntry(DEBUG, tag::DMX, "DMX initialized"); // Initialize Art-Net - writeLogEntry(DEBUG, ARTNET, "Initialize Art-Net..."); + writeLogEntry(DEBUG, tag::ARTNET, "Initialize Art-Net..."); artnet.begin(); // if Artnet packet comes to this universe, this function is called @@ -387,12 +387,12 @@ void setup() dmx_send(dmx2); dmx_wait_sent(dmx2, DMX_TIMEOUT_TICK); }); } - writeLogEntry(DEBUG, ARTNET, "Initialized Art-Net"); + writeLogEntry(DEBUG, tag::ARTNET, "Initialized Art-Net"); if (!LittleFS.begin(true)) { setStatus(Status::Critical); - writeLogEntry(CRITICAL, SYSTEM, "An Error has occurred while mounting LittleFS"); + writeLogEntry(CRITICAL, tag::SYSTEM, "An Error has occurred while mounting LittleFS"); return; } @@ -418,14 +418,14 @@ void setup() { if (request->url() == "/config" && request->method() == HTTP_PUT) { onPutConfig(request, data, len, index, total); - writeLogEntry(INFO, SYSTEM, "Restarting ESP..."); + writeLogEntry(INFO, tag::SYSTEM, "Restarting ESP..."); ESP.restart(); } }); initWebSocket(&server); server.begin(); - writeLogEntry(DEBUG, SERVER, "Webserver started!"); + writeLogEntry(DEBUG, tag::SERVER, "Webserver started!"); // scan networks and cache them WiFi.scanNetworks(true); @@ -434,16 +434,16 @@ void setup() // Internal temperature RP2040 // float tempC = analogReadTemp(); // Get internal temperature - // logIT(VERBOSE, SYSTEM, "Temperature Celsius: %d °C", tempC); + // logIT(DEBUG, SYSTEM, "Temperature Celsius: %d °C", tempC); // Internal temperature ESP32 https://www.espboards.dev/blog/esp32-inbuilt-temperature-sensor/ float result = 0; temp_sensor_read_celsius(&result); - writeLogEntry(VERBOSE, SYSTEM, "Temperature: %.2f °C", result); + writeLogEntry(DEBUG, tag::SYSTEM, "Temperature: %.2f °C", result); - writeLogEntry(VERBOSE, SYSTEM, "Internal Total heap: %d; internal Free Heap: %d", ESP.getHeapSize(), ESP.getFreeHeap()); - writeLogEntry(VERBOSE, SYSTEM, "SPIRam Total heap: %d; SPIRam Free Heap: %d", ESP.getPsramSize(), ESP.getFreePsram()); - writeLogEntry(VERBOSE, SYSTEM, "ChipRevision: %d; Cpu Freq: %d; SDK Version: %s", ESP.getChipRevision(), ESP.getCpuFreqMHz(), ESP.getSdkVersion()); - writeLogEntry(VERBOSE, SYSTEM, "Flash Size: %d; Flash Speed: %d", ESP.getFlashChipSize(), ESP.getFlashChipSpeed()); + writeLogEntry(DEBUG, tag::SYSTEM, "Internal Total heap: %d; internal Free Heap: %d", ESP.getHeapSize(), ESP.getFreeHeap()); + writeLogEntry(DEBUG, tag::SYSTEM, "SPIRam Total heap: %d; SPIRam Free Heap: %d", ESP.getPsramSize(), ESP.getFreePsram()); + writeLogEntry(DEBUG, tag::SYSTEM, "ChipRevision: %d; Cpu Freq: %d; SDK Version: %s", ESP.getChipRevision(), ESP.getCpuFreqMHz(), ESP.getSdkVersion()); + writeLogEntry(DEBUG, tag::SYSTEM, "Flash Size: %d; Flash Speed: %d", ESP.getFlashChipSize(), ESP.getFlashChipSpeed()); } void transmitDmxToArtnet(dmx_port_t dmxPort, byte *dmx_data, uint8_t artnetUniverse) @@ -469,7 +469,7 @@ void transmitDmxToArtnet(dmx_port_t dmxPort, byte *dmx_data, uint8_t artnetUnive connect or disconnect your DMX devices. If you are consistently getting DMX errors, then something may have gone wrong with your code or something is seriously wrong with your DMX transmitter. */ - writeLogEntry(ERROR, DMX, "A DMX error occurred on port %d", dmxPort); + writeLogEntry(ERROR, tag::DMX, "A DMX error occurred on port %d", dmxPort); } } } From f7522faf5c757b08dda8058656e5f8eed1a06562 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Tue, 27 May 2025 21:46:07 +0200 Subject: [PATCH 06/12] refactor writeLogEntry: include timestamp in log output for better traceability --- src/log.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/log.cpp b/src/log.cpp index a8b3831..9101594 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -46,6 +46,6 @@ void writeLogEntry(const log_level level, const char *tag, const char *message, char *buffer = new char[size + 1]; va_start(args, message); vsnprintf(buffer, size + 1, message, args); - Serial.printf("[%s][%s]> %s\n", getLogLevelString(level), tag, buffer); + Serial.printf("[%s][%s](%d)> %s\n", getLogLevelString(level), tag, millis(), buffer); delete[] buffer; } From 4f791b72c7007ac6f0010dedb59808cb9d02e22f Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Tue, 27 May 2025 21:49:17 +0200 Subject: [PATCH 07/12] refactor writeLogEntry: rename buffer variable to messageBuffer for clarity --- src/log.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/log.cpp b/src/log.cpp index 9101594..2fabc56 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -43,9 +43,9 @@ void writeLogEntry(const log_level level, const char *tag, const char *message, int size = vsnprintf(nullptr, 0, message, args); va_end(args); - char *buffer = new char[size + 1]; + char *messageBuffer = new char[size + 1]; va_start(args, message); - vsnprintf(buffer, size + 1, message, args); - Serial.printf("[%s][%s](%d)> %s\n", getLogLevelString(level), tag, millis(), buffer); - delete[] buffer; + vsnprintf(messageBuffer, size + 1, message, args); + Serial.printf("[%s][%s](%d)> %s\n", getLogLevelString(level), tag, millis(), messageBuffer); + delete[] messageBuffer; } From d22c990be1a358d973a07ed20278b7bd2574b709 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Tue, 27 May 2025 22:00:52 +0200 Subject: [PATCH 08/12] refactor writeLogEntry: extract serial logging to separate function for improved readability --- src/log.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/log.cpp b/src/log.cpp index 2fabc56..2355a38 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -36,8 +36,14 @@ void setupLogger() Serial.println("Logger initialized"); } +void writeSerialLog(const log_level level, const char *tag, const unsigned long timestamp, const char *formattedMessage) +{ + Serial.printf("[%s][%s](%d)> %s\n", getLogLevelString(level), tag, timestamp, formattedMessage); +} + void writeLogEntry(const log_level level, const char *tag, const char *message, ...) { + const unsigned long timestamp = millis(); va_list args; va_start(args, message); int size = vsnprintf(nullptr, 0, message, args); @@ -46,6 +52,8 @@ void writeLogEntry(const log_level level, const char *tag, const char *message, char *messageBuffer = new char[size + 1]; va_start(args, message); vsnprintf(messageBuffer, size + 1, message, args); - Serial.printf("[%s][%s](%d)> %s\n", getLogLevelString(level), tag, millis(), messageBuffer); + + writeSerialLog(level, tag, timestamp, messageBuffer); + delete[] messageBuffer; } From d54c2a41e11ad78b0ebbe24e57f7bcd503fa93e9 Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Tue, 27 May 2025 22:03:29 +0200 Subject: [PATCH 09/12] refactor writeLogEntry: fix va_end placement to ensure proper argument handling --- src/log.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/log.cpp b/src/log.cpp index 2355a38..18384c4 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -47,11 +47,9 @@ void writeLogEntry(const log_level level, const char *tag, const char *message, va_list args; va_start(args, message); int size = vsnprintf(nullptr, 0, message, args); - va_end(args); - char *messageBuffer = new char[size + 1]; - va_start(args, message); vsnprintf(messageBuffer, size + 1, message, args); + va_end(args); writeSerialLog(level, tag, timestamp, messageBuffer); From b07eec3e69eed3e56d636918b7cc7381ce2815ba Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Tue, 27 May 2025 22:19:12 +0200 Subject: [PATCH 10/12] refactor logging: rename writeLogEntry to logMessage for consistency --- src/log.cpp | 2 +- src/log.h | 2 +- src/main.cpp | 114 +++++++++++++++++++++++++-------------------------- 3 files changed, 59 insertions(+), 59 deletions(-) diff --git a/src/log.cpp b/src/log.cpp index 18384c4..b17eb45 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -41,7 +41,7 @@ void writeSerialLog(const log_level level, const char *tag, const unsigned long Serial.printf("[%s][%s](%d)> %s\n", getLogLevelString(level), tag, timestamp, formattedMessage); } -void writeLogEntry(const log_level level, const char *tag, const char *message, ...) +void logMessage(const log_level level, const char *tag, const char *message, ...) { const unsigned long timestamp = millis(); va_list args; diff --git a/src/log.h b/src/log.h index 8111598..0c2520a 100644 --- a/src/log.h +++ b/src/log.h @@ -24,4 +24,4 @@ namespace tag } void setupLogger(); -void writeLogEntry(const log_level level, const char *tag, const char *message, ...); \ No newline at end of file +void logMessage(const log_level level, const char *tag, const char *message, ...); \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 85c50a4..cbfc7a9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -164,27 +164,27 @@ void setup() pinMode(PIN_LED, OUTPUT); updateLed(); setupLogger(); - writeLogEntry(INFO, tag::SYSTEM, "Interface starting..."); - writeLogEntry(INFO, tag::SYSTEM, "Test %s", "hello world"); + logMessage(INFO, tag::SYSTEM, "Interface starting..."); + logMessage(INFO, tag::SYSTEM, "Test %s", "hello world"); // Get ETH mac delay(1000); esp_efuse_mac_get_default(mac); esp_read_mac(mac, ESP_MAC_ETH); - writeLogEntry(DEBUG, tag::CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC ETH", - mac[0], mac[1], mac[2], - mac[3], mac[4], mac[5]); + logMessage(DEBUG, tag::CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC ETH", + mac[0], mac[1], mac[2], + mac[3], mac[4], mac[5]); esp_read_mac(mac, ESP_MAC_WIFI_SOFTAP); - writeLogEntry(DEBUG, tag::CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC SOFTAP", - mac[0], mac[1], mac[2], - mac[3], mac[4], mac[5]); + logMessage(DEBUG, tag::CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC SOFTAP", + mac[0], mac[1], mac[2], + mac[3], mac[4], mac[5]); esp_read_mac(mac, ESP_MAC_WIFI_STA); // ESP_MAC_BASE - writeLogEntry(DEBUG, tag::CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC BASE", - mac[0], mac[1], mac[2], - mac[3], mac[4], mac[5]); + logMessage(DEBUG, tag::CONFIG, "%02x:%02x:%02x:%02x:%02x:%02x ESP MAC BASE", + mac[0], mac[1], mac[2], + mac[3], mac[4], mac[5]); // LED config.begin("dmx", true); @@ -205,7 +205,7 @@ void setup() } if (digitalRead(PIN_BUTTON) == LOW) { - writeLogEntry(NOTICE, tag::CONFIG, "Resetting config"); + logMessage(NOTICE, tag::CONFIG, "Resetting config"); config.begin("dmx", false); config.clear(); config.end(); @@ -234,8 +234,8 @@ void setup() direction1 = static_cast(config.getUInt("direction-1", DEFAULT_DIRECTION1)); direction2 = static_cast(config.getUInt("direction-2", DEFAULT_DIRECTION2)); - writeLogEntry(INFO, tag::CONFIG, "Port A: Universe %d %s", universe1, (direction1 == Input) ? "DMX -> Art-Net" : "Art-Net -> DMX"); - writeLogEntry(INFO, tag::CONFIG, "Port B: Universe %d %s", universe2, (direction2 == Input) ? "DMX -> Art-Net" : "Art-Net -> DMX"); + logMessage(INFO, tag::CONFIG, "Port A: Universe %d %s", universe1, (direction1 == Input) ? "DMX -> Art-Net" : "Art-Net -> DMX"); + logMessage(INFO, tag::CONFIG, "Port B: Universe %d %s", universe2, (direction2 == Input) ? "DMX -> Art-Net" : "Art-Net -> DMX"); Connection connection = static_cast(config.getUInt("connection", DEFAULT_CONNECTION)); IpMethod ipMethod = static_cast(config.getUInt("ip-method"), DEFAULT_IP_METHOD); @@ -243,7 +243,7 @@ void setup() char hostname[30]; snprintf(hostname, sizeof(hostname), "ChaosDMX-%02X%02X", mac[4], mac[5]); DEFAULT_SSID = hostname; - writeLogEntry(INFO, tag::CONFIG, "Hostname: %s", hostname); + logMessage(INFO, tag::CONFIG, "Hostname: %s", hostname); String ssid = config.getString("ssid", DEFAULT_SSID); String pwd = config.getString("password", DEFAULT_PASSWORD); @@ -258,32 +258,32 @@ void setup() switch (connection) { case WiFiSta: - writeLogEntry(DEBUG, tag::SYSTEM, "Initialize as WiFi Station"); + logMessage(DEBUG, tag::SYSTEM, "Initialize as WiFi Station"); WiFi.setHostname(hostname); WiFi.begin(ssid, pwd); - writeLogEntry(INFO, tag::CONFIG, "SSID: %s; PWD: %s", ssid, pwd); + logMessage(INFO, tag::CONFIG, "SSID: %s; PWD: %s", ssid, pwd); if (ipMethod == Static) { WiFi.config(ip, gateway, subnet); - writeLogEntry(INFO, tag::CONFIG, "IP: %s; gateway: %s; subnet: %s", ip.toString(), gateway, subnet); + logMessage(INFO, tag::CONFIG, "IP: %s; gateway: %s; subnet: %s", ip.toString(), gateway, subnet); } - writeLogEntry(DEBUG, tag::WIFI, "Connecting..."); + logMessage(DEBUG, tag::WIFI, "Connecting..."); while (WiFi.status() != WL_CONNECTED) { delay(50); updateLed(); } - writeLogEntry(INFO, tag::WIFI, "Connected!"); + logMessage(INFO, tag::WIFI, "Connected!"); broadcastIp = String(WiFi.broadcastIP().toString().c_str()); - writeLogEntry(INFO, tag::WIFI, "IP: %s", WiFi.localIP().toString()); - writeLogEntry(INFO, tag::WIFI, "MAC: %X", WiFi.macAddress()); - writeLogEntry(INFO, tag::WIFI, "Broadcast IP: %s", broadcastIp); + logMessage(INFO, tag::WIFI, "IP: %s", WiFi.localIP().toString()); + logMessage(INFO, tag::WIFI, "MAC: %X", WiFi.macAddress()); + logMessage(INFO, tag::WIFI, "Broadcast IP: %s", broadcastIp); break; case Ethernet: { - writeLogEntry(DEBUG, tag::SYSTEM, "Initialize as ETH"); + logMessage(DEBUG, tag::SYSTEM, "Initialize as ETH"); ESP32_W5500_onEvent(); if (ETH.begin(ETH_MISO, ETH_MOSI, ETH_SCK, ETH_SS, ETH_INT, ETH_SPI_CLOCK_MHZ, SPI2_HOST, mac)) @@ -291,13 +291,13 @@ void setup() } else { - writeLogEntry(CRITICAL, tag::ETHERNET, "Failed to configure Ethernet"); + logMessage(CRITICAL, tag::ETHERNET, "Failed to configure Ethernet"); } ETH.setHostname(hostname); // ESP32_W5500_waitForConnect(); uint8_t timeout = 5; // in s - writeLogEntry(DEBUG, tag::ETHERNET, "Wait for connect"); + logMessage(DEBUG, tag::ETHERNET, "Wait for connect"); // TODO: use millis while (!ESP32_W5500_eth_connected && timeout > 0) { @@ -306,41 +306,41 @@ void setup() } if (ESP32_W5500_eth_connected) { - writeLogEntry(DEBUG, tag::ETHERNET, "DHCP OK!"); + logMessage(DEBUG, tag::ETHERNET, "DHCP OK!"); } else { - writeLogEntry(DEBUG, tag::ETHERNET, "Set static IP"); + logMessage(DEBUG, tag::ETHERNET, "Set static IP"); ETH.config(ip, gateway, subnet); } - writeLogEntry(DEBUG, tag::ETHERNET, "Ethernet Successfully Initialized"); + logMessage(DEBUG, tag::ETHERNET, "Ethernet Successfully Initialized"); broadcastIp = ETH.broadcastIP().toString(); - writeLogEntry(INFO, tag::ETHERNET, "Local IP: %s", ETH.localIP().toString()); - writeLogEntry(INFO, tag::ETHERNET, "Subnet Mask: %s", ETH.subnetMask().toString()); - writeLogEntry(INFO, tag::ETHERNET, "Gateway IP: %s", ETH.gatewayIP().toString()); - writeLogEntry(DEBUG, tag::ETHERNET, "DNS Server: %s", ETH.dnsIP().toString()); - writeLogEntry(DEBUG, tag::ETHERNET, "MAC address: %X", ETH.macAddress()); - writeLogEntry(DEBUG, tag::ETHERNET, "Broadcast IP: %s", broadcastIp); + logMessage(INFO, tag::ETHERNET, "Local IP: %s", ETH.localIP().toString()); + logMessage(INFO, tag::ETHERNET, "Subnet Mask: %s", ETH.subnetMask().toString()); + logMessage(INFO, tag::ETHERNET, "Gateway IP: %s", ETH.gatewayIP().toString()); + logMessage(DEBUG, tag::ETHERNET, "DNS Server: %s", ETH.dnsIP().toString()); + logMessage(DEBUG, tag::ETHERNET, "MAC address: %X", ETH.macAddress()); + logMessage(DEBUG, tag::ETHERNET, "Broadcast IP: %s", broadcastIp); break; } default: - writeLogEntry(DEBUG, tag::SYSTEM, "Initialize as WiFi AccessPoint"); + logMessage(DEBUG, tag::SYSTEM, "Initialize as WiFi AccessPoint"); WiFi.softAPsetHostname(hostname); WiFi.softAP(ssid, pwd); // AP always with DHCP // WiFi.softAPConfig(ip, gateway, subnet); broadcastIp = WiFi.softAPBroadcastIP().toString(); - writeLogEntry(DEBUG, tag::WIFI, "WiFi AP enabled"); - writeLogEntry(INFO, tag::CONFIG, "IP: %s", WiFi.softAPIP().toString()); - writeLogEntry(DEBUG, tag::CONFIG, "MAC address: %X", WiFi.softAPmacAddress()); - writeLogEntry(DEBUG, tag::CONFIG, "Broadcast IP: %s", broadcastIp); + logMessage(DEBUG, tag::WIFI, "WiFi AP enabled"); + logMessage(INFO, tag::CONFIG, "IP: %s", WiFi.softAPIP().toString()); + logMessage(DEBUG, tag::CONFIG, "MAC address: %X", WiFi.softAPmacAddress()); + logMessage(DEBUG, tag::CONFIG, "Broadcast IP: %s", broadcastIp); break; } // Initialize DMX ports - writeLogEntry(DEBUG, tag::DMX, "Initialize DMX..."); + logMessage(DEBUG, tag::DMX, "Initialize DMX..."); #ifdef CONFIG_IDF_TARGET_ESP32S2 @@ -353,20 +353,20 @@ void setup() dmx_driver_install(dmx2, &dmx_config, personalities, personality_count); dmx_set_pin(dmx2, 17, 18, -1); - writeLogEntry(DEBUG, tag::DMX, "DMX driver 1 installed: %d", dmx_driver_is_installed(dmx1)); - writeLogEntry(DEBUG, tag::DMX, "DMX driver 2 installed: %d", dmx_driver_is_installed(dmx2)); + logMessage(DEBUG, tag::DMX, "DMX driver 1 installed: %d", dmx_driver_is_installed(dmx1)); + logMessage(DEBUG, tag::DMX, "DMX driver 2 installed: %d", dmx_driver_is_installed(dmx2)); - writeLogEntry(DEBUG, tag::DMX, "DMX driver 1 enabled: %d", dmx_driver_is_enabled(dmx1)); - writeLogEntry(DEBUG, tag::DMX, "DMX driver 2 enabled: %d", dmx_driver_is_enabled(dmx2)); + logMessage(DEBUG, tag::DMX, "DMX driver 1 enabled: %d", dmx_driver_is_enabled(dmx1)); + logMessage(DEBUG, tag::DMX, "DMX driver 2 enabled: %d", dmx_driver_is_enabled(dmx2)); #else dmx1.init(21, 33, Serial1); dmx2.init(17, 18, Serial2); #endif - writeLogEntry(DEBUG, tag::DMX, "DMX initialized"); + logMessage(DEBUG, tag::DMX, "DMX initialized"); // Initialize Art-Net - writeLogEntry(DEBUG, tag::ARTNET, "Initialize Art-Net..."); + logMessage(DEBUG, tag::ARTNET, "Initialize Art-Net..."); artnet.begin(); // if Artnet packet comes to this universe, this function is called @@ -387,12 +387,12 @@ void setup() dmx_send(dmx2); dmx_wait_sent(dmx2, DMX_TIMEOUT_TICK); }); } - writeLogEntry(DEBUG, tag::ARTNET, "Initialized Art-Net"); + logMessage(DEBUG, tag::ARTNET, "Initialized Art-Net"); if (!LittleFS.begin(true)) { setStatus(Status::Critical); - writeLogEntry(CRITICAL, tag::SYSTEM, "An Error has occurred while mounting LittleFS"); + logMessage(CRITICAL, tag::SYSTEM, "An Error has occurred while mounting LittleFS"); return; } @@ -418,14 +418,14 @@ void setup() { if (request->url() == "/config" && request->method() == HTTP_PUT) { onPutConfig(request, data, len, index, total); - writeLogEntry(INFO, tag::SYSTEM, "Restarting ESP..."); + logMessage(INFO, tag::SYSTEM, "Restarting ESP..."); ESP.restart(); } }); initWebSocket(&server); server.begin(); - writeLogEntry(DEBUG, tag::SERVER, "Webserver started!"); + logMessage(DEBUG, tag::SERVER, "Webserver started!"); // scan networks and cache them WiFi.scanNetworks(true); @@ -438,12 +438,12 @@ void setup() // Internal temperature ESP32 https://www.espboards.dev/blog/esp32-inbuilt-temperature-sensor/ float result = 0; temp_sensor_read_celsius(&result); - writeLogEntry(DEBUG, tag::SYSTEM, "Temperature: %.2f °C", result); + logMessage(DEBUG, tag::SYSTEM, "Temperature: %.2f °C", result); - writeLogEntry(DEBUG, tag::SYSTEM, "Internal Total heap: %d; internal Free Heap: %d", ESP.getHeapSize(), ESP.getFreeHeap()); - writeLogEntry(DEBUG, tag::SYSTEM, "SPIRam Total heap: %d; SPIRam Free Heap: %d", ESP.getPsramSize(), ESP.getFreePsram()); - writeLogEntry(DEBUG, tag::SYSTEM, "ChipRevision: %d; Cpu Freq: %d; SDK Version: %s", ESP.getChipRevision(), ESP.getCpuFreqMHz(), ESP.getSdkVersion()); - writeLogEntry(DEBUG, tag::SYSTEM, "Flash Size: %d; Flash Speed: %d", ESP.getFlashChipSize(), ESP.getFlashChipSpeed()); + logMessage(DEBUG, tag::SYSTEM, "Internal Total heap: %d; internal Free Heap: %d", ESP.getHeapSize(), ESP.getFreeHeap()); + logMessage(DEBUG, tag::SYSTEM, "SPIRam Total heap: %d; SPIRam Free Heap: %d", ESP.getPsramSize(), ESP.getFreePsram()); + logMessage(DEBUG, tag::SYSTEM, "ChipRevision: %d; Cpu Freq: %d; SDK Version: %s", ESP.getChipRevision(), ESP.getCpuFreqMHz(), ESP.getSdkVersion()); + logMessage(DEBUG, tag::SYSTEM, "Flash Size: %d; Flash Speed: %d", ESP.getFlashChipSize(), ESP.getFlashChipSpeed()); } void transmitDmxToArtnet(dmx_port_t dmxPort, byte *dmx_data, uint8_t artnetUniverse) @@ -469,7 +469,7 @@ void transmitDmxToArtnet(dmx_port_t dmxPort, byte *dmx_data, uint8_t artnetUnive connect or disconnect your DMX devices. If you are consistently getting DMX errors, then something may have gone wrong with your code or something is seriously wrong with your DMX transmitter. */ - writeLogEntry(ERROR, tag::DMX, "A DMX error occurred on port %d", dmxPort); + logMessage(ERROR, tag::DMX, "A DMX error occurred on port %d", dmxPort); } } } From c4efc4cecf4ff827afa7a934e1f8470e88a3ff6e Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Tue, 27 May 2025 22:24:53 +0200 Subject: [PATCH 11/12] refactor: remove Elog submodule as it is no longer needed --- .gitmodules | 3 --- lib/Elog | 1 - 2 files changed, 4 deletions(-) delete mode 160000 lib/Elog diff --git a/.gitmodules b/.gitmodules index 5ebce81..ecef76d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,6 +4,3 @@ url = https://github.com/psxde/ArtNet.git [submodule "lib/AsyncWebServer_ESP32_W5500"] path = lib/AsyncWebServer_ESP32_W5500 url = https://github.com/psxde/AsyncWebServer_ESP32_W5500.git -[submodule "lib/Elog"] -path = lib/Elog -url = https://github.com/jpmv27/elog.git diff --git a/lib/Elog b/lib/Elog deleted file mode 160000 index b279027..0000000 --- a/lib/Elog +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b27902710fd4d77d599fd581b6eef2936dc7943f From f465cdced567b3c81bc992c8ecdf7ce55ac1629d Mon Sep 17 00:00:00 2001 From: HendrikRauh <114620133+HendrikRauh@users.noreply.github.com> Date: Tue, 27 May 2025 22:32:25 +0200 Subject: [PATCH 12/12] refactor setup --- src/main.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index cbfc7a9..a16673d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -160,12 +160,11 @@ void onButtonPress() void setup() { + setupLogger(); setStatus(Status::Starting); pinMode(PIN_LED, OUTPUT); updateLed(); - setupLogger(); logMessage(INFO, tag::SYSTEM, "Interface starting..."); - logMessage(INFO, tag::SYSTEM, "Test %s", "hello world"); // Get ETH mac delay(1000);