Reworked Button-Stuff

This commit is contained in:
Marcel Peterkau 2022-01-14 15:36:17 +01:00
parent e1ca503bd2
commit cfc6b144f3
5 changed files with 182 additions and 54 deletions

View File

@ -30,6 +30,7 @@ build_flags =
-DWIFI_PASSWORD=${wifi_cred.wifi_password}
-DADMIN_PASSWORD=${wifi_cred.admin_password}
-DWIFI_AP_PASSWORD=${wifi_cred.wifi_ap_password}
-DWIFI_AP_IP_GW=10,0,0,1
board_build.filesystem = littlefs

View File

@ -13,10 +13,12 @@ typedef enum eSystem_Status
sysStat_Error
} tSystem_Status;
typedef struct Globals_s {
tSystem_Status systemStatus = sysStat_Startup;
uint8_t purgePulses= 0;
tSystem_Status resumeStatus = sysStat_Startup;
char systemStatustxt[16] = "";
}Globals_t;
extern Globals_t globals;

View File

@ -4,37 +4,6 @@ uint32_t lubePulseTimestamp = 0;
void RunLubeApp(volatile uint32_t *wheelPulseCounter)
{
static uint32_t buttonTimestamp = 0;
static boolean buttonActionDone = false;
if (digitalRead(GPIO_BUTTON) == LOW)
{
if (buttonTimestamp == 0)
buttonTimestamp = millis() + BUTTON_HOLD_DELAY;
if (buttonTimestamp < millis() && buttonActionDone == false)
{
switch (globals.systemStatus)
{
case sysStat_Normal:
globals.systemStatus = sysStat_Rain;
globals.resumeStatus = sysStat_Rain;
break;
case sysStat_Rain:
globals.systemStatus = sysStat_Normal;
globals.resumeStatus = sysStat_Normal;
break;
}
buttonActionDone = true;
}
}
else
{
buttonTimestamp = 0;
buttonActionDone = false;
}
// Calculate traveled Distance in mm
TravelDistance_highRes += (*wheelPulseCounter * (LubeConfig.DistancePerRevolution_mm / LubeConfig.PulsePerRevolution));
*wheelPulseCounter = 0;
@ -43,8 +12,11 @@ void RunLubeApp(volatile uint32_t *wheelPulseCounter)
switch (globals.systemStatus)
{
case sysStat_Startup:
globals.systemStatus = sysStat_Normal;
globals.resumeStatus = sysStat_Normal;
if (millis() > STARTUP_DELAY)
{
globals.systemStatus = sysStat_Normal;
globals.resumeStatus = sysStat_Normal;
}
break;
case sysStat_Normal:
@ -81,6 +53,22 @@ void RunLubeApp(volatile uint32_t *wheelPulseCounter)
break;
}
switch (globals.systemStatus)
{
case sysStat_Normal:
strcpy(globals.systemStatustxt, "Normal");
break;
case sysStat_Purge:
strcpy(globals.systemStatustxt, "Purge");
break;
case sysStat_Rain:
strcpy(globals.systemStatustxt, "Rain");
break;
case sysStat_Startup:
strcpy(globals.systemStatustxt, "Startup");
break;
}
// maintain Pin-State of Lube-Pump
if (lubePulseTimestamp > millis())
digitalWrite(GPIO_PUMP, HIGH);

View File

@ -2,13 +2,14 @@
#define _LUBEAPP_H_
#include <Arduino.h>
#include <stdlib.h>
#include "config.h"
#include "common.h"
#include "globals.h"
#define LUBE_PULSE_LENGHT_MS 160
#define LUBE_PULSE_PAUSE_MS 100
#define BUTTON_HOLD_DELAY 1000
#define STARTUP_DELAY 5000
void RunLubeApp(volatile uint32_t * wheelPulseCounter);
void LubePulse();

View File

@ -47,8 +47,10 @@ void RemoteDebug_printWifiInfo();
void wifiMaintainConnectionTicker_callback();
void updateWebUITicker_callback();
void IRAM_ATTR trigger_ISR();
void LED_Process(tSystem_Status newStatus = sysStat_NOP);
void DisplayProcess();
void LED_Process(uint8_t override = false, CRGB setColor = CRGB::White);
void Display_Process();
void Button_Process();
void startWiFiAP();
Ticker WiFiMaintainConnectionTicker(wifiMaintainConnectionTicker_callback, 1000, 0, MILLIS);
Ticker UpdateWebUITicker(updateWebUITicker_callback, 5000, 0, MILLIS);
@ -142,13 +144,14 @@ void setup()
void loop()
{
LED_Process(globals.systemStatus);
RunLubeApp(&wheel_pulse);
WiFiMaintainConnectionTicker.update();
UpdateWebUITicker.update();
DisplayProcess();
Display_Process();
Button_Process();
LED_Process();
ArduinoOTA.handle();
Debug.handle();
@ -216,10 +219,7 @@ void wifiMaintainConnectionTicker_callback()
else
{
Serial.println("WiFi not connected! - Start AP");
WiFi.mode(WIFI_OFF);
WiFi.softAP(DeviceName, QUOTE(WIFI_AP_PASSWORD));
WiFiMaintainConnectionTicker.stop();
Serial.println("WiFi AP started, stopped Maintain-Timer");
startWiFiAP();
}
}
}
@ -234,7 +234,7 @@ void trigger_ISR()
wheel_pulse++;
}
void LED_Process(tSystem_Status newSysStatus)
void LED_Process(uint8_t override, CRGB SetColor)
{
typedef enum
@ -245,20 +245,43 @@ void LED_Process(tSystem_Status newSysStatus)
LED_Rain,
LED_Confirm_Rain,
LED_Purge,
LED_Error
LED_Error,
LED_Override
} tLED_Status;
static tSystem_Status oldSysStatus = sysStat_NOP;
static tLED_Status LED_Status = LED_Startup;
static CRGB LED_override_color = 0;
static tLED_Status LED_ResumeOverrideStatus = LED_Startup;
uint8_t color = 0;
uint32_t timer = 0;
static uint32_t timestamp = 0;
timer = millis();
if (oldSysStatus != newSysStatus)
if (override == 1)
{
switch (newSysStatus)
if (LED_Status != LED_Override)
{
LED_ResumeOverrideStatus = LED_Status;
debugA("Override LED_Status");
}
LED_Status = LED_Override;
LED_override_color = SetColor;
}
if (override == 2)
{
if (LED_Status == LED_Override)
{
LED_Status = LED_ResumeOverrideStatus;
debugA("Resume LED_Status");
}
}
if (oldSysStatus != globals.systemStatus)
{
switch (globals.systemStatus)
{
case sysStat_Startup:
LED_Status = LED_Startup;
@ -286,16 +309,20 @@ void LED_Process(tSystem_Status newSysStatus)
default:
break;
}
oldSysStatus = newSysStatus;
oldSysStatus = globals.systemStatus;
}
uint32_t percentage = LubeConfig.tankRemain_µl / (LubeConfig.tankCapacity_ml * 10);
switch (LED_Status)
{
case LED_Startup:
FastLED.setBrightness(255);
timer = timer % 2000;
color = timer > 500 ? 0 : (uint8_t)(timer / 2);
leds[0] = CRGB(color, color, color);
if (percentage < LubeConfig.TankRemindAtPercentage)
leds[0] = CRGB::OrangeRed;
else
leds[0] = CRGB::White;
break;
case LED_Confirm_Normal:
@ -342,19 +369,128 @@ void LED_Process(tSystem_Status newSysStatus)
leds[0] = timer % 500 > 250 ? CRGB::Red : CRGB::Black;
break;
case LED_Override:
leds[0] = LED_override_color;
break;
default:
break;
}
FastLED.show();
}
void DisplayProcess()
void Display_Process()
{
u8x8.setCursor(0, 3);
uint32_t DistRemain = globals.systemStatus == sysStat_Normal ? LubeConfig.DistancePerLube_Default : LubeConfig.DistancePerLube_Rain;
DistRemain -= TravelDistance_highRes / 1000;
u8x8.printf("next Lube: %4dm\n", DistRemain);
u8x8.printf("Tank: %8dml\n", LubeConfig.tankRemain_µl / 1000);
u8x8.printf("Purges: %8d\n", globals.purgePulses);
u8x8.printf("Mode: %10s\n\n", globals.systemStatustxt);
u8x8.printf("next Lube: %4dm\n\n", DistRemain);
u8x8.printf("Tank: %8dml\n\n", LubeConfig.tankRemain_µl / 1000);
u8x8.refreshDisplay();
}
void Button_Process()
{
#define BUTTON_ACTION_DELAY_TOGGLEMODE 500
#define BUTTON_ACTION_DELAY_PURGE 3500
#define BUTTON_ACTION_DELAY_WIFI 6500
#define BUTTON_ACTION_DELAY_NOTHING 9500
typedef enum buttonAction_e
{
BTN_INACTIVE,
BTN_NOTHING,
BTN_TOGGLEMODE,
BTN_TOGGLEWIFI,
BTN_STARTPURGE
} buttonAction_t;
static uint32_t buttonTimestamp = 0;
static buttonAction_t buttonAction = BTN_INACTIVE;
if (digitalRead(GPIO_BUTTON) == LOW)
{
if (buttonTimestamp == 0)
buttonTimestamp = millis();
if (buttonTimestamp + BUTTON_ACTION_DELAY_NOTHING < millis())
{
LED_Process(1, CRGB::White);
buttonAction = BTN_NOTHING;
}
else if (buttonTimestamp + BUTTON_ACTION_DELAY_WIFI < millis())
{
LED_Process(1, CRGB::Yellow);
buttonAction = BTN_TOGGLEWIFI;
}
else if (buttonTimestamp + BUTTON_ACTION_DELAY_PURGE < millis())
{
LED_Process(1, CRGB::DeepPink);
buttonAction = BTN_STARTPURGE;
}
else if (buttonTimestamp + BUTTON_ACTION_DELAY_TOGGLEMODE < millis())
{
CRGB color = globals.systemStatus == sysStat_Normal ? CRGB::Blue : CRGB::Green;
LED_Process(1, color);
buttonAction = BTN_TOGGLEMODE;
}
}
else
{
if (buttonAction != BTN_INACTIVE)
{
switch (buttonAction)
{
case BTN_TOGGLEWIFI:
startWiFiAP();
debugA("Starting WiFi AP");
break;
case BTN_STARTPURGE:
globals.systemStatus = sysStat_Purge;
globals.purgePulses = LubeConfig.BleedingPulses;
debugA("Starting Purge");
break;
case BTN_TOGGLEMODE:
switch (globals.systemStatus)
{
case sysStat_Normal:
globals.systemStatus = sysStat_Rain;
globals.resumeStatus = sysStat_Rain;
break;
case sysStat_Rain:
globals.systemStatus = sysStat_Normal;
globals.resumeStatus = sysStat_Normal;
break;
default:
break;
}
debugA("Toggling Mode");
break;
case BTN_NOTHING:
default:
debugA("Nothing or invalid");
break;
}
LED_Process(2);
}
buttonAction = BTN_INACTIVE;
buttonTimestamp = 0;
}
}
void startWiFiAP()
{
WiFi.mode(WIFI_OFF);
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(IPAddress(WIFI_AP_IP_GW), IPAddress(WIFI_AP_IP_GW), IPAddress(255, 255, 255, 0));
WiFi.softAP(DeviceName, QUOTE(WIFI_AP_PASSWORD));
WiFiMaintainConnectionTicker.stop();
Serial.println("WiFi AP started, stopped Maintain-Timer");
}