Compare commits

..

3 Commits

14 changed files with 185 additions and 32 deletions

View File

@ -349,6 +349,33 @@
</div>
</div>
</div>
<div class="form-group row">
<label for="washdistance" class="control-label col-4">Waschmodus Distanz</label>
<div class="col-8">
<div class="input-group">
<input id="washdistance" type="text"
class="set-wsevent data-washdistance form-control" required="required">
<div class="input-group-append">
<span class="input-group-text">m</span>
</div>
</div>
</div>
</div>
<div class="form-group row">
<label for="washinterval" class="control-label col-4">Waschmodus Interval</label>
<div class="col-8">
<div class="input-group">
<input id="washinterval" type="text"
class="set-wsevent data-washinterval form-control" required="required">
<div class="input-group-append">
<span class="input-group-text">m</span>
</div>
</div>
</div>
</div>
</p>
<!-- Div Group Lube Settings-->
<!-- Div Group Oiltank Settings -->

View File

@ -73,6 +73,7 @@ typedef enum eSystem_Status
sysStat_Startup,
sysStat_Normal,
sysStat_Rain,
sysStat_Wash,
sysStat_Purge,
sysStat_Error,
sysStat_Shutdown

View File

@ -21,7 +21,7 @@
#include "dtc.h"
#include "common.h"
#define EEPROM_STRUCTURE_REVISION 3 // Increment this version when changing EEPROM structures
#define EEPROM_STRUCTURE_REVISION 4 // Increment this version when changing EEPROM structures
#if PCB_REV == 1 || PCB_REV == 2 || PCB_REV == 3
#define EEPROM_SIZE_BYTES I2C_DEVICESIZE_24LC64
@ -69,6 +69,8 @@ typedef struct
uint32_t RimDiameter_Inch;
uint32_t DistancePerRevolution_mm;
uint16_t BleedingPulses;
uint16_t WashMode_Distance;
uint16_t WashMode_Interval;
SpeedSource_t SpeedSource;
GPSBaudRate_t GPSBaudRate;
CANSource_t CANSource;
@ -85,7 +87,7 @@ typedef struct
// Default configuration settings
const LubeConfig_t LubeConfig_defaults = {
0, 8000, 4000, 320, DEFAULT_PUMP_DOSE, 30, 1, 150, 70, 18, 2000, 25, SOURCE_IMPULSE,
0, 8000, 4000, 320, DEFAULT_PUMP_DOSE, 30, 1, 150, 70, 18, 2000, 25, 500, 10, SOURCE_IMPULSE,
BAUD_115200,
KTM_890_ADV_R_2021,
false,

View File

@ -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_ */

View File

@ -3,6 +3,7 @@
#define _LEDCONTROL_H_
#include <Arduino.h>
#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

View File

@ -3,10 +3,10 @@
*
* @brief Header file for converting structs to JSON objects.
*
* @note This file is auto-generated by a script on 2024-01-30 20:29:34.
* @note This file is auto-generated by a script on 2025-06-15 11:37:51.
*
* @author Marcel Peterkau
* @date 30.01.2024
* @date 15.06.2025
*/
#ifndef _STRUCT2JSON_H_
@ -23,4 +23,4 @@ void generateJsonObject_PersistenceData(JsonObject data);
#endif /* _STRUCT2JSON_H_ */
// CODEGENERATOR_CHECKSUM: 59f35aadffd0bbef253210ea2fbaaf9a515553a2e3cc9bf4cfa2819b63c969ce
// CODEGENERATOR_CHECKSUM: 4702cb49ea55617cbb34715164810bb58d3c3f46fb1653b6f47bd4fd9cb0031e

View File

@ -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,20 +27,21 @@ void ButtonAction_ToggleWiFi()
{
extern void toggleWiFiAP(bool shutdown = false);
toggleWiFiAP();
Debug_pushMessage("Toggling WiFi\n");
}
void ButtonAction_WashMode()
{
Debug_pushMessage("Wash mode not yet implemented\n");
// TODO: Implementieren, sobald Verhalten klar ist
globals.systemStatus = sysStat_Wash;
Debug_pushMessage("Setting WashMode\n");
}
// Liste der Aktionen, sortiert nach Mindest-Haltezeit (ms)
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);

View File

@ -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;

View File

@ -30,6 +30,7 @@ void Debug_ShowDTCs();
void Debug_dumpGlobals();
void Debug_printHelp();
void Debug_Purge();
void Debug_refillTank();
const char *uint32_to_binary_string(uint32_t num);
/**
@ -318,7 +319,8 @@ static const std::map<String, DebugCmdHandler> &getCmdMap()
int code = tokens[0].toInt();
MaintainDTC((DTCNum_t)code, true, millis());
}
}}
}},
{"tank_refill", [](const String &) { Debug_refillTank(); }},
};
return cmdMap;
}
@ -542,6 +544,13 @@ void Debug_Purge()
Debug_pushMessage("Purging 10 pulses\n");
}
void Debug_refillTank()
{
PersistenceData.tankRemain_microL = LubeConfig.tankCapacity_ml * 1000;
globals.requestEEAction = EE_PDS_SAVE;
Debug_pushMessage("Setting Tank to 100%\n");
}
/**
* @brief Convert a uint32_t value to a binary string with nibbles separated by a space.
*

View File

@ -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);

View File

@ -12,6 +12,7 @@
*/
#include "lubeapp.h"
#include "ledcontrol.h"
uint32_t lubePulseTimestamp = 0;
@ -27,6 +28,9 @@ uint32_t lubePulseTimestamp = 0;
*/
void RunLubeApp(uint32_t add_milimeters)
{
static tSystem_Status lastSystemStatus = sysStat_Startup;
static uint16_t washModeDistance = 0;
// Calculate and update tank percentage
globals.TankPercentage = PersistenceData.tankRemain_microL / (LubeConfig.tankCapacity_ml * 10);
@ -49,17 +53,31 @@ void RunLubeApp(uint32_t add_milimeters)
switch (globals.systemStatus)
{
case sysStat_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:
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 +87,14 @@ void RunLubeApp(uint32_t add_milimeters)
break;
case sysStat_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)
{
@ -78,8 +103,41 @@ void RunLubeApp(uint32_t add_milimeters)
}
break;
case sysStat_Wash:
if (lastSystemStatus != globals.systemStatus)
{
washModeDistance = LubeConfig.WashMode_Distance;
strcpy_P(globals.systemStatustxt, PSTR("Wash"));
LEDControl_SetBasic(LED_WASH_COLOR, LED_PATTERN_BREATH);
lastSystemStatus = globals.systemStatus;
}
// Trigger lube pulse if traveled distance exceeds the configured Interval in Wash mode
if (PersistenceData.TravelDistance_highRes_mm / 1000 > LubeConfig.WashMode_Interval)
{
LubePulse();
PersistenceData.TravelDistance_highRes_mm = 0;
if (washModeDistance >= LubeConfig.WashMode_Distance)
{
washModeDistance = washModeDistance - LubeConfig.WashMode_Interval;
}
else
{
globals.systemStatus = globals.resumeStatus;
}
}
break;
case sysStat_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 +157,26 @@ void RunLubeApp(uint32_t add_milimeters)
break;
case sysStat_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:
if (lastSystemStatus != globals.systemStatus)
{
strcpy_P(globals.systemStatustxt, PSTR("Shutdown"));
LEDControl_SetBasic(LED_SHUTDOWN_COLOR, LED_PATTERN_BREATH_REVERSE);
lastSystemStatus = globals.systemStatus;
}
break;
default:

View File

@ -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)
{

View File

@ -3,10 +3,10 @@
*
* @brief Implementation file for converting structs to JSON objects.
*
* @note This file is auto-generated by a script on 2024-01-30 20:29:34.
* @note This file is auto-generated by a script on 2025-06-15 11:37:51.
*
* @author Marcel Peterkau
* @date 30.01.2024
* @date 15.06.2025
*/
@ -26,6 +26,8 @@ void generateJsonObject_LubeConfig(JsonObject data)
data["RimDiameter_Inch"] = LubeConfig.RimDiameter_Inch;
data["DistancePerRevolution_mm"] = LubeConfig.DistancePerRevolution_mm;
data["BleedingPulses"] = LubeConfig.BleedingPulses;
data["WashMode_Distance"] = LubeConfig.WashMode_Distance;
data["WashMode_Interval"] = LubeConfig.WashMode_Interval;
data["SpeedSource"] = LubeConfig.SpeedSource;
data["GPSBaudRate"] = LubeConfig.GPSBaudRate;
data["CANSource"] = LubeConfig.CANSource;
@ -52,4 +54,4 @@ void generateJsonObject_PersistenceData(JsonObject data)
// CODEGENERATOR_CHECKSUM: 59f35aadffd0bbef253210ea2fbaaf9a515553a2e3cc9bf4cfa2819b63c969ce
// CODEGENERATOR_CHECKSUM: 4702cb49ea55617cbb34715164810bb58d3c3f46fb1653b6f47bd4fd9cb0031e

View File

@ -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
{
@ -580,6 +580,14 @@ void Websocket_HandleSettings(uint8_t *data)
{
strncpy(LubeConfig.wifi_client_password, value, sizeof(LubeConfig.wifi_client_password));
}
else if (strcmp(identifier, "washinterval") == 0)
{
LubeConfig.WashMode_Interval = atoi(value);
}
else if (strcmp(identifier, "washdistance") == 0)
{
LubeConfig.WashMode_Distance = atoi(value);
}
else
{
Debug_pushMessage("Got unknown Settings-id and value '%s' from ws-client\n", identifier);
@ -700,6 +708,8 @@ void Websocket_RefreshClientData_Static(uint32_t client_id, bool send_mapping)
const char mapping[] = "MAPPING_STATIC:"
"lubedistancenormal;"
"lubedistancerain;"
"washdistance;"
"washinterval;"
"tankcap;"
"pumppulse;"
"tankwarn;"
@ -730,6 +740,8 @@ void Websocket_RefreshClientData_Static(uint32_t client_id, bool send_mapping)
temp.concat(String(LubeConfig.DistancePerLube_Default) + ";");
temp.concat(String(LubeConfig.DistancePerLube_Rain) + ";");
temp.concat(String(LubeConfig.WashMode_Distance) + ";");
temp.concat(String(LubeConfig.WashMode_Interval) + ";");
temp.concat(String(LubeConfig.tankCapacity_ml) + ";");
temp.concat(String(LubeConfig.amountPerDose_microL) + ";");
temp.concat(String(LubeConfig.TankRemindAtPercentage) + ";");