From ebaaa8cc4b6105686077031a59fe9fdb601cf682 Mon Sep 17 00:00:00 2001 From: eddy Date: Sun, 2 Aug 2026 18:20:55 +0200 Subject: [PATCH] =?UTF-8?q?feat(client):=20uniform=20LED=20signaling=20?= =?UTF-8?q?=E2=80=94=20off=20after=2060s=20stable=20connection?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client.cpp | 43 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/src/client.cpp b/src/client.cpp index 59757b7..addf69a 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -47,6 +47,12 @@ static bool relay1SendState = false; static bool relay2SendState = false; static uint32_t seq = 0; +#define STABLE_LED_TIMEOUT_MS 60000 +uint32_t connectionStableMs = 0; +uint32_t relayFlashUntil = 0; +bool otaInProgress = false; +bool otaEnded = false; + static bool bleReady = false; static bool serverFound = false; static NimBLEAddress serverAddress; @@ -365,13 +371,40 @@ void loop() { bool relay1State = t1Active || btnActive; bool relay2State = t2Active; - if (relay1State || relay2State) { - leds[0] = CRGB::Green; - } else if (connected) { - leds[0] = CRGB::Blue; + CRGB ledColor; + + if (otaInProgress) { + ledColor = otaEnded + ? CRGB::Yellow + : (((millis() / 100) % 2) ? CRGB::Green : CRGB::Black); } else { - leds[0] = CRGB::Red; + if (connected) { + if (connectionStableMs == 0) connectionStableMs = millis(); + } else { + connectionStableMs = 0; + } + + if (connected) { + ledColor = (millis() - connectionStableMs >= STABLE_LED_TIMEOUT_MS) + ? CRGB::Black + : CRGB::Yellow; + } else { + ledColor = CRGB::Red; + } + + static bool lastRelayActive = false; + bool relayActive = relay1State || relay2State; + if (relayActive != lastRelayActive) { + relayFlashUntil = millis() + 150; + } + lastRelayActive = relayActive; + + if (millis() < relayFlashUntil) { + ledColor = CRGB::Green; + } } + + leds[0] = ledColor; FastLED.show(); if (connected && pCmdChar != nullptr) {