diff --git a/Software/include/led_colors.h b/Software/include/led_colors.h index 0211f9e..b531287 100644 --- a/Software/include/led_colors.h +++ b/Software/include/led_colors.h @@ -37,9 +37,10 @@ #define LED_STARTUP_TANKWARN COLOR_AMBER #define LED_NORMAL_COLOR COLOR_GREEN #define LED_RAIN_COLOR COLOR_BLUE -#define LED_WIFI_BLINK COLOR_YELLOW +#define LED_WASH_COLOR COLOR_JADE +#define LED_WIFI_COLOR COLOR_YELLOW #define LED_PURGE_COLOR COLOR_MAGENTA -#define LED_ERROR_BLINK COLOR_RED -#define LED_SHUTDOWN_BLINK COLOR_CYAN +#define LED_ERROR_COLOR COLOR_RED +#define LED_SHUTDOWN_COLOR COLOR_CYAN #endif /* _LED_COLORS_H_ */ diff --git a/Software/include/ledcontrol.h b/Software/include/ledcontrol.h index 8102142..dc6e822 100644 --- a/Software/include/ledcontrol.h +++ b/Software/include/ledcontrol.h @@ -3,6 +3,7 @@ #define _LEDCONTROL_H_ #include +#include "led_colors.h" // LED-Muster enum LedPattern @@ -12,7 +13,8 @@ enum LedPattern LED_PATTERN_FLASH_FAST, LED_PATTERN_BLINK, LED_PATTERN_BLINK_FAST, - LED_PATTERN_BREATH + LED_PATTERN_BREATH, + LED_PATTERN_BREATH_REVERSE }; // Initialisiert die LED-Steuerung diff --git a/Software/src/button_actions.cpp b/Software/src/button_actions.cpp index 9cec1b0..051a7cc 100644 --- a/Software/src/button_actions.cpp +++ b/Software/src/button_actions.cpp @@ -9,12 +9,10 @@ void ButtonAction_ToggleMode() if (globals.systemStatus == sysStat_Normal) { globals.systemStatus = sysStat_Rain; - globals.resumeStatus = sysStat_Rain; } else if (globals.systemStatus == sysStat_Rain) { globals.systemStatus = sysStat_Normal; - globals.resumeStatus = sysStat_Normal; } Debug_pushMessage("Toggling Mode\n"); } @@ -22,7 +20,6 @@ void ButtonAction_ToggleMode() void ButtonAction_StartPurge() { globals.systemStatus = sysStat_Purge; - globals.purgePulses = LubeConfig.BleedingPulses; Debug_pushMessage("Starting Purge\n"); } @@ -30,6 +27,7 @@ void ButtonAction_ToggleWiFi() { extern void toggleWiFiAP(bool shutdown = false); toggleWiFiAP(); + Debug_pushMessage("Toggling WiFi\n"); } @@ -43,7 +41,7 @@ void ButtonAction_WashMode() const ButtonActionEntry buttonActions[] = { {500, LED_RAIN_COLOR, ButtonAction_ToggleMode}, {3500, LED_PURGE_COLOR, ButtonAction_StartPurge}, - {6500, LED_WIFI_BLINK, ButtonAction_ToggleWiFi}, - {9500, COLOR_WARM_WHITE, ButtonAction_WashMode}}; + {6500, LED_WIFI_COLOR, ButtonAction_ToggleWiFi}, + {9500, LED_WASH_COLOR, ButtonAction_WashMode}}; const uint8_t buttonActionCount = sizeof(buttonActions) / sizeof(ButtonActionEntry); diff --git a/Software/src/buttoncontrol.cpp b/Software/src/buttoncontrol.cpp index 827535f..814548e 100644 --- a/Software/src/buttoncontrol.cpp +++ b/Software/src/buttoncontrol.cpp @@ -1,7 +1,7 @@ // === buttoncontrol.cpp === #include "buttoncontrol.h" -#include "ledcontrol.h" // Neue LED-Logik wird hier verwendet +#include "ledcontrol.h" static uint8_t btnPin; static uint32_t pressStart = 0; diff --git a/Software/src/ledcontrol.cpp b/Software/src/ledcontrol.cpp index a2bdd28..29ae473 100644 --- a/Software/src/ledcontrol.cpp +++ b/Software/src/ledcontrol.cpp @@ -94,11 +94,36 @@ void LEDControl_Update() break; case LED_PATTERN_BREATH: - brightness = map(now % 2000, 0, 1000, LubeConfig.LED_Min_Brightness, LubeConfig.LED_Max_Brightness); - if ((now % 2000) >= 1000) - brightness = LubeConfig.LED_Max_Brightness - (brightness - LubeConfig.LED_Min_Brightness); + { + uint32_t t = now % 2000; + if (t < 600) + { + // Schnell hochdimmen (600 ms) + brightness = map(t, 0, 600, LubeConfig.LED_Min_Brightness, LubeConfig.LED_Max_Brightness); + } + else + { + // Langsam runterdimmen (1400 ms) + brightness = map(t, 600, 2000, LubeConfig.LED_Max_Brightness, LubeConfig.LED_Min_Brightness); + } break; } + case LED_PATTERN_BREATH_REVERSE: + { + uint32_t t = now % 2000; + if (t < 1400) + { + // Langsam hochdimmen (1400 ms) + brightness = map(t, 0, 1400, LubeConfig.LED_Min_Brightness, LubeConfig.LED_Max_Brightness); + } + else + { + // Schnell runterdimmen (600 ms) + brightness = map(t, 1400, 2000, LubeConfig.LED_Max_Brightness, LubeConfig.LED_Min_Brightness); + } + break; + } + } leds.setBrightness(brightness); leds.setPixelColor(0, on ? color : 0); diff --git a/Software/src/lubeapp.cpp b/Software/src/lubeapp.cpp index d3a1245..d64d31a 100644 --- a/Software/src/lubeapp.cpp +++ b/Software/src/lubeapp.cpp @@ -12,6 +12,7 @@ */ #include "lubeapp.h" +#include "ledcontrol.h" uint32_t lubePulseTimestamp = 0; @@ -27,6 +28,8 @@ uint32_t lubePulseTimestamp = 0; */ void RunLubeApp(uint32_t add_milimeters) { + static tSystem_Status lastSystemStatus = sysStat_Startup; + // Calculate and update tank percentage globals.TankPercentage = PersistenceData.tankRemain_microL / (LubeConfig.tankCapacity_ml * 10); @@ -49,17 +52,31 @@ void RunLubeApp(uint32_t add_milimeters) switch (globals.systemStatus) { case sysStat_Startup: - strcpy_P(globals.systemStatustxt, PSTR("Startup")); + + if (lastSystemStatus != globals.systemStatus) + { + strcpy_P(globals.systemStatustxt, PSTR("Startup")); + LEDControl_SetBasic(LED_STARTUP_NORMAL, LED_PATTERN_BLINK); + lastSystemStatus = globals.systemStatus; + globals.resumeStatus = sysStat_Startup; + } + // Transition to Normal status after startup delay if (millis() > STARTUP_DELAY) { globals.systemStatus = sysStat_Normal; - globals.resumeStatus = sysStat_Normal; } break; case sysStat_Normal: - strcpy_P(globals.systemStatustxt, PSTR("Normal")); + if (lastSystemStatus != globals.systemStatus) + { + strcpy_P(globals.systemStatustxt, PSTR("Normal")); + LEDControl_SetBasic(LED_NORMAL_COLOR, LED_PATTERN_ON); + lastSystemStatus = globals.systemStatus; + globals.resumeStatus = sysStat_Normal; + } + // Trigger lube pulse if traveled distance exceeds the configured limit if (PersistenceData.TravelDistance_highRes_mm / 1000 > LubeConfig.DistancePerLube_Default) { @@ -69,7 +86,14 @@ void RunLubeApp(uint32_t add_milimeters) break; case sysStat_Rain: - strcpy_P(globals.systemStatustxt, PSTR("Rain")); + if (lastSystemStatus != globals.systemStatus) + { + strcpy_P(globals.systemStatustxt, PSTR("Rain")); + LEDControl_SetBasic(LED_RAIN_COLOR, LED_PATTERN_ON); + lastSystemStatus = globals.systemStatus; + globals.resumeStatus = sysStat_Rain; + } + // Trigger lube pulse if traveled distance exceeds the configured limit in Rain mode if (PersistenceData.TravelDistance_highRes_mm / 1000 > LubeConfig.DistancePerLube_Rain) { @@ -79,7 +103,14 @@ void RunLubeApp(uint32_t add_milimeters) break; case sysStat_Purge: - strcpy_P(globals.systemStatustxt, PSTR("Purge")); + if (lastSystemStatus != globals.systemStatus) + { + globals.purgePulses = LubeConfig.BleedingPulses; + strcpy_P(globals.systemStatustxt, PSTR("Purge")); + LEDControl_SetBasic(LED_PURGE_COLOR, LED_PATTERN_BLINK); + lastSystemStatus = globals.systemStatus; + } + // Execute lube pulses during the Purge status if (globals.purgePulses > 0) { @@ -99,12 +130,26 @@ void RunLubeApp(uint32_t add_milimeters) break; case sysStat_Error: - strcpy_P(globals.systemStatustxt, PSTR("Error")); + + if (lastSystemStatus != globals.systemStatus) + { + strcpy_P(globals.systemStatustxt, PSTR("Error")); + LEDControl_SetBasic(LED_ERROR_COLOR, LED_PATTERN_BLINK_FAST); + lastSystemStatus = globals.systemStatus; + } + globals.purgePulses = 0; break; case sysStat_Shutdown: - strcpy_P(globals.systemStatustxt, PSTR("Shutdown")); + + if (lastSystemStatus != globals.systemStatus) + { + strcpy_P(globals.systemStatustxt, PSTR("Shutdown")); + LEDControl_SetBasic(LED_SHUTDOWN_COLOR, LED_PATTERN_BREATH_REVERSE); + lastSystemStatus = globals.systemStatus; + } + break; default: diff --git a/Software/src/main.cpp b/Software/src/main.cpp index 870c6ab..7ba86be 100644 --- a/Software/src/main.cpp +++ b/Software/src/main.cpp @@ -411,6 +411,8 @@ void Display_Process() */ void toggleWiFiAP(bool shutdown) { + LEDControl_SetOverride(LED_WIFI_COLOR, LED_PATTERN_BLINK_FAST, 2500); + // Check if WiFi is currently active if (WiFi.getMode() != WIFI_OFF) { diff --git a/Software/src/webui.cpp b/Software/src/webui.cpp index 7705345..c678432 100644 --- a/Software/src/webui.cpp +++ b/Software/src/webui.cpp @@ -480,7 +480,6 @@ void Websocket_HandleButtons(uint8_t *data) else if (strcmp(identifier, "purgenow") == 0) { globals.systemStatus = sysStat_Purge; - globals.purgePulses = LubeConfig.BleedingPulses; } else if (strcmp(identifier, "sourcesave") == 0) { @@ -499,6 +498,7 @@ void Websocket_HandleButtons(uint8_t *data) else if (strcmp(identifier, "resettank") == 0) { PersistenceData.tankRemain_microL = LubeConfig.tankCapacity_ml * 1000; + globals.requestEEAction = EE_PDS_SAVE; } else {