centralized LED Control and ModeSwitching in Lubeapp.cpp

This commit is contained in:
Marcel Peterkau 2025-06-15 13:22:26 +02:00
parent 5638c03e76
commit 3357691a21
8 changed files with 94 additions and 21 deletions

View File

@ -37,9 +37,10 @@
#define LED_STARTUP_TANKWARN COLOR_AMBER #define LED_STARTUP_TANKWARN COLOR_AMBER
#define LED_NORMAL_COLOR COLOR_GREEN #define LED_NORMAL_COLOR COLOR_GREEN
#define LED_RAIN_COLOR COLOR_BLUE #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_PURGE_COLOR COLOR_MAGENTA
#define LED_ERROR_BLINK COLOR_RED #define LED_ERROR_COLOR COLOR_RED
#define LED_SHUTDOWN_BLINK COLOR_CYAN #define LED_SHUTDOWN_COLOR COLOR_CYAN
#endif /* _LED_COLORS_H_ */ #endif /* _LED_COLORS_H_ */

View File

@ -3,6 +3,7 @@
#define _LEDCONTROL_H_ #define _LEDCONTROL_H_
#include <Arduino.h> #include <Arduino.h>
#include "led_colors.h"
// LED-Muster // LED-Muster
enum LedPattern enum LedPattern
@ -12,7 +13,8 @@ enum LedPattern
LED_PATTERN_FLASH_FAST, LED_PATTERN_FLASH_FAST,
LED_PATTERN_BLINK, LED_PATTERN_BLINK,
LED_PATTERN_BLINK_FAST, LED_PATTERN_BLINK_FAST,
LED_PATTERN_BREATH LED_PATTERN_BREATH,
LED_PATTERN_BREATH_REVERSE
}; };
// Initialisiert die LED-Steuerung // Initialisiert die LED-Steuerung

View File

@ -9,12 +9,10 @@ void ButtonAction_ToggleMode()
if (globals.systemStatus == sysStat_Normal) if (globals.systemStatus == sysStat_Normal)
{ {
globals.systemStatus = sysStat_Rain; globals.systemStatus = sysStat_Rain;
globals.resumeStatus = sysStat_Rain;
} }
else if (globals.systemStatus == sysStat_Rain) else if (globals.systemStatus == sysStat_Rain)
{ {
globals.systemStatus = sysStat_Normal; globals.systemStatus = sysStat_Normal;
globals.resumeStatus = sysStat_Normal;
} }
Debug_pushMessage("Toggling Mode\n"); Debug_pushMessage("Toggling Mode\n");
} }
@ -22,7 +20,6 @@ void ButtonAction_ToggleMode()
void ButtonAction_StartPurge() void ButtonAction_StartPurge()
{ {
globals.systemStatus = sysStat_Purge; globals.systemStatus = sysStat_Purge;
globals.purgePulses = LubeConfig.BleedingPulses;
Debug_pushMessage("Starting Purge\n"); Debug_pushMessage("Starting Purge\n");
} }
@ -30,6 +27,7 @@ void ButtonAction_ToggleWiFi()
{ {
extern void toggleWiFiAP(bool shutdown = false); extern void toggleWiFiAP(bool shutdown = false);
toggleWiFiAP(); toggleWiFiAP();
Debug_pushMessage("Toggling WiFi\n"); Debug_pushMessage("Toggling WiFi\n");
} }
@ -43,7 +41,7 @@ void ButtonAction_WashMode()
const ButtonActionEntry buttonActions[] = { const ButtonActionEntry buttonActions[] = {
{500, LED_RAIN_COLOR, ButtonAction_ToggleMode}, {500, LED_RAIN_COLOR, ButtonAction_ToggleMode},
{3500, LED_PURGE_COLOR, ButtonAction_StartPurge}, {3500, LED_PURGE_COLOR, ButtonAction_StartPurge},
{6500, LED_WIFI_BLINK, ButtonAction_ToggleWiFi}, {6500, LED_WIFI_COLOR, ButtonAction_ToggleWiFi},
{9500, COLOR_WARM_WHITE, ButtonAction_WashMode}}; {9500, LED_WASH_COLOR, ButtonAction_WashMode}};
const uint8_t buttonActionCount = sizeof(buttonActions) / sizeof(ButtonActionEntry); const uint8_t buttonActionCount = sizeof(buttonActions) / sizeof(ButtonActionEntry);

View File

@ -1,7 +1,7 @@
// === buttoncontrol.cpp === // === buttoncontrol.cpp ===
#include "buttoncontrol.h" #include "buttoncontrol.h"
#include "ledcontrol.h" // Neue LED-Logik wird hier verwendet #include "ledcontrol.h"
static uint8_t btnPin; static uint8_t btnPin;
static uint32_t pressStart = 0; static uint32_t pressStart = 0;

View File

@ -94,11 +94,36 @@ void LEDControl_Update()
break; break;
case LED_PATTERN_BREATH: case LED_PATTERN_BREATH:
brightness = map(now % 2000, 0, 1000, LubeConfig.LED_Min_Brightness, LubeConfig.LED_Max_Brightness); {
if ((now % 2000) >= 1000) uint32_t t = now % 2000;
brightness = LubeConfig.LED_Max_Brightness - (brightness - LubeConfig.LED_Min_Brightness); 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; 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.setBrightness(brightness);
leds.setPixelColor(0, on ? color : 0); leds.setPixelColor(0, on ? color : 0);

View File

@ -12,6 +12,7 @@
*/ */
#include "lubeapp.h" #include "lubeapp.h"
#include "ledcontrol.h"
uint32_t lubePulseTimestamp = 0; uint32_t lubePulseTimestamp = 0;
@ -27,6 +28,8 @@ uint32_t lubePulseTimestamp = 0;
*/ */
void RunLubeApp(uint32_t add_milimeters) void RunLubeApp(uint32_t add_milimeters)
{ {
static tSystem_Status lastSystemStatus = sysStat_Startup;
// Calculate and update tank percentage // Calculate and update tank percentage
globals.TankPercentage = PersistenceData.tankRemain_microL / (LubeConfig.tankCapacity_ml * 10); globals.TankPercentage = PersistenceData.tankRemain_microL / (LubeConfig.tankCapacity_ml * 10);
@ -49,17 +52,31 @@ void RunLubeApp(uint32_t add_milimeters)
switch (globals.systemStatus) switch (globals.systemStatus)
{ {
case sysStat_Startup: 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 // Transition to Normal status after startup delay
if (millis() > STARTUP_DELAY) if (millis() > STARTUP_DELAY)
{ {
globals.systemStatus = sysStat_Normal; globals.systemStatus = sysStat_Normal;
globals.resumeStatus = sysStat_Normal;
} }
break; break;
case sysStat_Normal: 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 // Trigger lube pulse if traveled distance exceeds the configured limit
if (PersistenceData.TravelDistance_highRes_mm / 1000 > LubeConfig.DistancePerLube_Default) if (PersistenceData.TravelDistance_highRes_mm / 1000 > LubeConfig.DistancePerLube_Default)
{ {
@ -69,7 +86,14 @@ void RunLubeApp(uint32_t add_milimeters)
break; break;
case sysStat_Rain: 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 // Trigger lube pulse if traveled distance exceeds the configured limit in Rain mode
if (PersistenceData.TravelDistance_highRes_mm / 1000 > LubeConfig.DistancePerLube_Rain) if (PersistenceData.TravelDistance_highRes_mm / 1000 > LubeConfig.DistancePerLube_Rain)
{ {
@ -79,7 +103,14 @@ void RunLubeApp(uint32_t add_milimeters)
break; break;
case sysStat_Purge: 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 // Execute lube pulses during the Purge status
if (globals.purgePulses > 0) if (globals.purgePulses > 0)
{ {
@ -99,12 +130,26 @@ void RunLubeApp(uint32_t add_milimeters)
break; break;
case sysStat_Error: 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; globals.purgePulses = 0;
break; break;
case sysStat_Shutdown: 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; break;
default: default:

View File

@ -411,6 +411,8 @@ void Display_Process()
*/ */
void toggleWiFiAP(bool shutdown) void toggleWiFiAP(bool shutdown)
{ {
LEDControl_SetOverride(LED_WIFI_COLOR, LED_PATTERN_BLINK_FAST, 2500);
// Check if WiFi is currently active // Check if WiFi is currently active
if (WiFi.getMode() != WIFI_OFF) if (WiFi.getMode() != WIFI_OFF)
{ {

View File

@ -480,7 +480,6 @@ void Websocket_HandleButtons(uint8_t *data)
else if (strcmp(identifier, "purgenow") == 0) else if (strcmp(identifier, "purgenow") == 0)
{ {
globals.systemStatus = sysStat_Purge; globals.systemStatus = sysStat_Purge;
globals.purgePulses = LubeConfig.BleedingPulses;
} }
else if (strcmp(identifier, "sourcesave") == 0) else if (strcmp(identifier, "sourcesave") == 0)
{ {
@ -499,6 +498,7 @@ void Websocket_HandleButtons(uint8_t *data)
else if (strcmp(identifier, "resettank") == 0) else if (strcmp(identifier, "resettank") == 0)
{ {
PersistenceData.tankRemain_microL = LubeConfig.tankCapacity_ml * 1000; PersistenceData.tankRemain_microL = LubeConfig.tankCapacity_ml * 1000;
globals.requestEEAction = EE_PDS_SAVE;
} }
else else
{ {