From 5e7b05782d859997b91d53a4bf8805cc53eb5004 Mon Sep 17 00:00:00 2001 From: Hendrik Rauh <114620133+HendrikRauh@users.noreply.github.com> Date: Wed, 23 Apr 2025 21:25:05 +0200 Subject: [PATCH 1/4] added basic led logic without timer --- src/main.cpp | 88 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 54 insertions(+), 34 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index c782905..398cec0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -38,23 +38,6 @@ byte dmx2_data[DMX_PACKET_SIZE]; uint8_t brightness_led = 20; bool status_led; -/* hw_timer_t *timer = NULL; // H/W timer defining (Pointer to the Structure) -portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED; -void IRAM_ATTR onTimer() -{ // Defining interrupt function with IRAM_ATTR for faster access - portENTER_CRITICAL_ISR(&timerMux); - status_led = !status_led; - if (!status_led) - { - analogWrite(PIN_LED, brightness_led); - } - else - { - analogWrite(PIN_LED, 0); - } - portEXIT_CRITICAL_ISR(&timerMux); -} */ - // Ethernet stuff #define ETH_SCK 36 #define ETH_SS 34 @@ -73,26 +56,63 @@ uint8_t universe1; uint8_t universe2; Direction direction1; Direction direction2; -/* -void ledBlink(int ms) + +enum class Status { - if (timer == NULL) + Starting, + Resetting, + Normal, + Warning, + Critical +}; + +Status status = Status::Starting; +struct BlinkingConfig +{ + int interval_ms; + bool is_blinking; + int brightness; +}; + +BlinkingConfig getBlinkingConfig(Status status) +{ + switch (status) { - timer = timerBegin(0, 80, true); // timer 0, prescalar: 80, UP counting - timerAttachInterrupt(timer, &onTimer, true); // Attach interrupt + case Status::Starting: + return {500, true, brightness_led}; + case Status::Resetting: + return {100, true, brightness_led}; + case Status::Normal: + return {0, false, brightness_led}; + case Status::Warning: + return {500, true, 255}; + case Status::Critical: + return {100, true, 255}; + default: + return {0, false, 0}; } - if (ms == 0) +} + +void updateLed() +{ + BlinkingConfig led_config = getBlinkingConfig(status); + if (!led_config.is_blinking) { - timerAlarmDisable(timer); - analogWrite(PIN_LED, brightness_led); + analogWrite(PIN_LED, led_config.brightness); + return; } else { - ms = ms * 1000; - timerAlarmWrite(timer, ms, true); // Match value= 1000000 for 1 sec. delay. - timerAlarmEnable(timer); // Enable Timer with interrupt (Alarm Enable) + if (millis() % led_config.interval_ms < led_config.interval_ms / 2) //? blinks twice as fast?! & directly based on millis + { + analogWrite(PIN_LED, led_config.brightness); + } + else + { + analogWrite(PIN_LED, 0); + } } -} */ +} void onButtonPress() { @@ -125,7 +145,6 @@ void onButtonPress() void setup() { - Serial.begin(9600); // Get ETH mac @@ -159,18 +178,18 @@ void setup() pinMode(PIN_BUTTON, INPUT_PULLUP); if (digitalRead(PIN_BUTTON) == LOW && !restartViaButton) { - // ledBlink(100); + status = Status::Resetting; unsigned long startTime = millis(); while (digitalRead(PIN_BUTTON) == LOW && (millis() - startTime <= 3000)) { } if (digitalRead(PIN_BUTTON) == LOW) { - // ledBlink(0); Serial.println("Reset config"); config.begin("dmx", false); config.clear(); config.end(); + status = Status::Normal; delay(2000); } } @@ -179,7 +198,7 @@ void setup() config.putBool("restart-via-btn", false); config.end(); - // ledBlink(500); + status = Status::Starting; attachInterrupt(PIN_BUTTON, onButtonPress, FALLING); @@ -398,7 +417,7 @@ void setup() // scan networks and cache them WiFi.scanNetworks(true); - // ledBlink(0); + status = Status::Normal; // Internal temperature RP2040 /*float tempC = analogReadTemp(); // Get internal temperature @@ -465,4 +484,5 @@ void loop() } webSocketLoop(); + updateLed(); } From 820a4d83cd9b036385bb5ed11e35cf8d5e921b21 Mon Sep 17 00:00:00 2001 From: Hendrik Rauh <114620133+HendrikRauh@users.noreply.github.com> Date: Wed, 23 Apr 2025 22:26:54 +0200 Subject: [PATCH 2/4] improved led handling (still no timer) --- src/main.cpp | 52 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 398cec0..cc2b36a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -36,7 +36,7 @@ byte dmx2_data[DMX_PACKET_SIZE]; #define PIN_BUTTON 5 uint8_t brightness_led = 20; -bool status_led; +bool led_on = true; // Ethernet stuff #define ETH_SCK 36 @@ -83,35 +83,44 @@ BlinkingConfig getBlinkingConfig(Status status) case Status::Resetting: return {100, true, brightness_led}; case Status::Normal: - return {0, false, brightness_led}; + return {1000, false, brightness_led}; case Status::Warning: return {500, true, 255}; case Status::Critical: return {100, true, 255}; default: - return {0, false, 0}; + return {1000, false, 0}; } } -void updateLed() +BlinkingConfig led_config = getBlinkingConfig(status); + +void updateTimer(int interval_ms) { - BlinkingConfig led_config = getBlinkingConfig(status); - if (!led_config.is_blinking) + // TODO: update the tickspeed of the timer +} + +void updateLed() // TODO: callback for timer +{ + led_config = getBlinkingConfig(status); + if (led_config.is_blinking) + { + led_on = !led_on; + analogWrite(PIN_LED, led_on ? led_config.brightness : 0); + } + else { analogWrite(PIN_LED, led_config.brightness); return; } - else - { - if (millis() % led_config.interval_ms < led_config.interval_ms / 2) //? blinks twice as fast?! & directly based on millis - { - analogWrite(PIN_LED, led_config.brightness); - } - else - { - analogWrite(PIN_LED, 0); - } - } +} + +void setStatus(Status newStatus) +{ + status = newStatus; + led_config = getBlinkingConfig(status); + updateTimer(led_config.interval_ms); + updateLed(); } void onButtonPress() @@ -178,7 +187,7 @@ void setup() pinMode(PIN_BUTTON, INPUT_PULLUP); if (digitalRead(PIN_BUTTON) == LOW && !restartViaButton) { - status = Status::Resetting; + setStatus(Status::Resetting); unsigned long startTime = millis(); while (digitalRead(PIN_BUTTON) == LOW && (millis() - startTime <= 3000)) { @@ -189,7 +198,7 @@ void setup() config.begin("dmx", false); config.clear(); config.end(); - status = Status::Normal; + setStatus(Status::Normal); delay(2000); } } @@ -198,7 +207,7 @@ void setup() config.putBool("restart-via-btn", false); config.end(); - status = Status::Starting; + setStatus(Status::Starting); attachInterrupt(PIN_BUTTON, onButtonPress, FALLING); @@ -417,7 +426,7 @@ void setup() // scan networks and cache them WiFi.scanNetworks(true); - status = Status::Normal; + setStatus(Status::Normal); // Internal temperature RP2040 /*float tempC = analogReadTemp(); // Get internal temperature @@ -484,5 +493,4 @@ void loop() } webSocketLoop(); - updateLed(); } From 1dc5587893f94cbeef51b00056a24f759142e040 Mon Sep 17 00:00:00 2001 From: Hendrik Rauh <114620133+HendrikRauh@users.noreply.github.com> Date: Wed, 23 Apr 2025 22:29:36 +0200 Subject: [PATCH 3/4] calling setStatus at the beginning --- src/main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index cc2b36a..da5b79c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -66,7 +66,7 @@ enum class Status Critical }; -Status status = Status::Starting; +Status status; struct BlinkingConfig { int interval_ms; @@ -154,6 +154,7 @@ void onButtonPress() void setup() { + setStatus(Status::Starting); Serial.begin(9600); // Get ETH mac From 4ebefde13fee8678cf09b05331ffe9c439917cb1 Mon Sep 17 00:00:00 2001 From: Hendrik Rauh <114620133+HendrikRauh@users.noreply.github.com> Date: Thu, 24 Apr 2025 21:40:23 +0200 Subject: [PATCH 4/4] made the led work in a rather bad way... --- src/main.cpp | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index da5b79c..5c18ba1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -37,6 +37,7 @@ byte dmx2_data[DMX_PACKET_SIZE]; uint8_t brightness_led = 20; bool led_on = true; +double lastMills = 0; // Ethernet stuff #define ETH_SCK 36 @@ -102,16 +103,20 @@ void updateTimer(int interval_ms) void updateLed() // TODO: callback for timer { - led_config = getBlinkingConfig(status); - if (led_config.is_blinking) + if (millis() - lastMills >= led_config.interval_ms) { - led_on = !led_on; - analogWrite(PIN_LED, led_on ? led_config.brightness : 0); - } - else - { - analogWrite(PIN_LED, led_config.brightness); - return; + lastMills = millis(); + led_config = getBlinkingConfig(status); + if (led_config.is_blinking) + { + led_on = !led_on; + analogWrite(PIN_LED, led_on ? led_config.brightness : 0); + } + else + { + analogWrite(PIN_LED, led_config.brightness); + return; + } } } @@ -155,6 +160,9 @@ void onButtonPress() void setup() { setStatus(Status::Starting); + pinMode(PIN_LED, OUTPUT); + updateLed(); + Serial.begin(9600); // Get ETH mac @@ -182,7 +190,7 @@ void setup() brightness_led = config.getUInt("led-brightness", DEFAULT_LED_BRIGHTNESS); bool restartViaButton = config.getBool("restart-via-btn", false); config.end(); - analogWrite(PIN_LED, brightness_led); + updateLed(); // Button pinMode(PIN_BUTTON, INPUT_PULLUP); @@ -192,6 +200,7 @@ void setup() unsigned long startTime = millis(); while (digitalRead(PIN_BUTTON) == LOW && (millis() - startTime <= 3000)) { + updateLed(); } if (digitalRead(PIN_BUTTON) == LOW) { @@ -200,7 +209,11 @@ void setup() config.clear(); config.end(); setStatus(Status::Normal); - delay(2000); + unsigned long startTime = millis(); + while (millis() - startTime <= 2000) + { + updateLed(); + } } } @@ -213,7 +226,11 @@ void setup() attachInterrupt(PIN_BUTTON, onButtonPress, FALLING); // wait for serial monitor - delay(5000); + unsigned long startTime = millis(); + while (millis() - startTime <= 5000) + { + updateLed(); + } Serial.println("Starting DMX-Interface..."); config.begin("dmx", true); @@ -494,4 +511,5 @@ void loop() } webSocketLoop(); + updateLed(); }