592 lines
14 KiB
C++
Raw Normal View History

2022-01-07 21:02:27 +01:00
#include <Arduino.h>
#include <Wire.h>
2022-08-19 00:10:42 +02:00
#ifdef FEATURE_ENABLE_OLED
2022-01-07 21:02:27 +01:00
#include <U8g2lib.h>
2022-08-19 00:10:42 +02:00
#endif
2022-01-07 21:02:27 +01:00
#include <ESP8266WiFi.h>
#include <ArduinoOTA.h>
2022-02-10 09:54:24 +01:00
2022-01-07 21:02:27 +01:00
#include <FastLED.h>
2022-01-07 23:36:02 +01:00
#include <Ticker.h>
2022-01-07 21:02:27 +01:00
#include "common.h"
2022-02-10 09:54:24 +01:00
2022-08-22 09:23:01 +02:00
#include "sanitycheck.h"
2022-01-08 03:14:26 +01:00
#include "lubeapp.h"
#include "webui.h"
2022-01-09 20:51:16 +01:00
#include "config.h"
#include "globals.h"
2023-02-23 23:14:58 +01:00
#include "debugger.h"
#ifdef FEATURE_ENABLE_CAN
2022-02-04 21:28:49 +01:00
#include "can.h"
#endif
#ifdef FEATURE_ENABLE_GPS
#include "gps.h"
#endif
#include "dtc.h"
2022-01-07 21:02:27 +01:00
#ifdef FEATURE_ENABLE_WIFI_CLIENT
2022-01-14 21:28:50 +01:00
#include <ESP8266WiFiMulti.h>
2022-08-21 11:28:58 +02:00
const char *ssid = QUOTE(WIFI_SSID_CLIENT);
const char *password = QUOTE(WIFI_PASSWORD_CLIENT);
2022-01-07 23:36:02 +01:00
const uint32_t connectTimeoutMs = 5000;
2022-01-07 21:02:27 +01:00
2022-01-14 21:28:50 +01:00
ESP8266WiFiMulti wifiMulti;
2022-01-31 09:26:10 +01:00
#endif
2022-01-14 21:28:50 +01:00
2022-01-07 21:02:27 +01:00
bool startSetupMode = false;
2022-01-07 23:36:02 +01:00
volatile uint32_t wheel_pulse = 0;
CRGB leds[1];
2022-01-07 21:02:27 +01:00
// Function-Prototypes
2022-01-07 23:36:02 +01:00
void IRAM_ATTR trigger_ISR();
2022-01-14 15:36:17 +01:00
void LED_Process(uint8_t override = false, CRGB setColor = CRGB::White);
2022-08-19 00:10:42 +02:00
#ifdef FEATURE_ENABLE_OLED
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(-1);
2022-01-14 15:36:17 +01:00
void Display_Process();
2022-08-19 00:10:42 +02:00
#endif
2022-01-14 15:36:17 +01:00
void Button_Process();
void toggleWiFiAP(boolean shutdown = false);
void SystemShutdown();
uint32_t Process_Impulse_WheelSpeed();
void EEPROMCyclicPDS_callback();
2022-02-10 09:54:24 +01:00
#ifdef FEATURE_ENABLE_WIFI_CLIENT
2022-01-14 21:28:50 +01:00
void wifiMaintainConnectionTicker_callback();
2022-01-07 23:36:02 +01:00
Ticker WiFiMaintainConnectionTicker(wifiMaintainConnectionTicker_callback, 1000, 0, MILLIS);
2022-01-14 21:28:50 +01:00
#endif
Ticker EEPROMCyclicPDSTicker(EEPROMCyclicPDS_callback, 60000, 0, MILLIS);
2022-01-07 21:02:27 +01:00
void setup()
{
system_update_cpu_freq(SYS_CPU_80MHZ);
2022-08-14 17:38:45 +02:00
snprintf(globals.DeviceName, 32, HOST_NAME, ESP.getChipId());
2022-01-07 21:02:27 +01:00
WiFi.persistent(false);
ClearAllDTC(); // Init DTC-Storage
#ifdef FEATURE_ENABLE_WIFI_CLIENT
2022-01-14 21:28:50 +01:00
WiFi.mode(WIFI_STA);
2022-08-14 17:38:45 +02:00
WiFi.setHostname(globals.DeviceName);
wifiMulti.addAP(QUOTE(WIFI_SSID_CLIENT), QUOTE(WIFI_PASSWORD_CLIENT));
2022-01-14 21:28:50 +01:00
WiFiMaintainConnectionTicker.start();
#else
WiFi.mode(WIFI_OFF);
#endif
2022-01-07 21:02:27 +01:00
Serial.begin(115200);
2022-08-24 21:00:17 +02:00
Serial.println("\n\nSouko's ChainLube Mk1");
2022-08-14 17:38:45 +02:00
Serial.println(globals.DeviceName);
2022-01-07 21:02:27 +01:00
2022-01-31 09:26:10 +01:00
InitEEPROM();
2022-01-09 20:51:16 +01:00
GetConfig_EEPROM();
GetPersistence_EEPROM();
2022-08-19 00:10:42 +02:00
#ifdef FEATURE_ENABLE_OLED
2022-01-07 21:02:27 +01:00
u8x8.begin();
u8x8.setFont(u8x8_font_chroma48medium8_r);
2022-08-19 00:10:42 +02:00
#endif
FastLED.addLeds<WS2811, GPIO_LED, RGB>(leds, 1); // GRB ordering is assumed
2022-01-07 23:36:02 +01:00
2022-02-10 09:54:24 +01:00
switch (LubeConfig.SpeedSource)
2022-02-04 21:28:49 +01:00
{
2022-02-10 09:54:24 +01:00
case SOURCE_IMPULSE:
2022-02-04 21:28:49 +01:00
pinMode(GPIO_TRIGGER, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(GPIO_TRIGGER), trigger_ISR, FALLING);
2022-02-10 09:54:24 +01:00
break;
#ifdef FEATURE_ENABLE_GPS
2022-02-10 09:54:24 +01:00
case SOURCE_GPS:
Init_GPS();
2022-02-10 09:54:24 +01:00
break;
#endif
#ifdef FEATURE_ENABLE_TIMER
2022-02-10 09:54:24 +01:00
case SOURCE_TIME:
break;
#endif
#ifdef FEATURE_ENABLE_CAN
2022-02-10 09:54:24 +01:00
case SOURCE_CAN:
Init_CAN();
break;
#endif
default:
2023-02-23 23:14:58 +01:00
Debug_pushMessage("Source Setting N/A");
2022-02-10 09:54:24 +01:00
break;
2022-02-04 21:28:49 +01:00
}
2022-02-10 09:54:24 +01:00
2022-01-07 21:02:27 +01:00
pinMode(GPIO_BUTTON, INPUT_PULLUP);
pinMode(GPIO_PUMP, OUTPUT);
ArduinoOTA.setPort(8266);
2022-08-14 17:38:45 +02:00
ArduinoOTA.setHostname(globals.DeviceName);
2022-01-07 23:36:02 +01:00
ArduinoOTA.setPassword(QUOTE(ADMIN_PASSWORD));
2022-08-19 00:10:42 +02:00
#ifdef FEATURE_ENABLE_OLED
2022-01-07 21:02:27 +01:00
ArduinoOTA.onStart([]()
{
u8x8.clearDisplay();
u8x8.drawString(0, 0, "OTA-Update");
u8x8.refreshDisplay(); });
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total)
{
static bool refreshed = false;
if (!refreshed)
{
u8x8.clearDisplay();
refreshed = true;
u8x8.drawString(0, 0, "OTA Upload");
}
uint32_t percent = progress / (total / 100);
u8x8.setCursor(0, 1);
u8x8.printf("%d %%", percent);
u8x8.refreshDisplay(); });
ArduinoOTA.onEnd([]()
{
u8x8.clearDisplay();
u8x8.drawString(0, 0, "OTA-Restart");
u8x8.refreshDisplay(); });
2022-08-19 00:10:42 +02:00
#endif
2022-01-07 21:02:27 +01:00
ArduinoOTA.begin();
2022-08-19 00:10:42 +02:00
#ifdef FEATURE_ENABLE_OLED
2022-01-07 21:02:27 +01:00
u8x8.clearDisplay();
u8x8.drawString(0, 0, "KTM ChainLube V1");
2022-01-07 21:02:27 +01:00
u8x8.refreshDisplay();
2022-08-19 00:10:42 +02:00
#endif
2022-01-07 21:02:27 +01:00
2022-01-07 23:36:02 +01:00
initWebUI();
initGlobals();
EEPROMCyclicPDSTicker.start();
Serial.println("Setup Done");
2022-01-07 21:02:27 +01:00
}
void loop()
{
uint32_t wheelDistance = 0;
switch (LubeConfig.SpeedSource)
{
case SOURCE_IMPULSE:
wheelDistance = Process_Impulse_WheelSpeed();
break;
#ifdef FEATURE_ENABLE_CAN
2022-02-04 21:28:49 +01:00
case SOURCE_CAN:
wheelDistance = Process_CAN_WheelSpeed();
break;
#endif
#ifdef FEATURE_ENABLE_TIMER
case SOURCE_TIME:
break;
#endif
#ifdef FEATURE_ENABLE_GPS
2022-02-04 21:33:27 +01:00
case SOURCE_GPS:
wheelDistance = Process_GPS_WheelSpeed();
2022-02-04 21:33:27 +01:00
break;
#endif
}
RunLubeApp(wheelDistance);
2022-08-19 00:10:42 +02:00
#ifdef FEATURE_ENABLE_OLED
2022-01-14 15:36:17 +01:00
Display_Process();
2022-08-19 00:10:42 +02:00
#endif
2022-01-14 15:36:17 +01:00
Button_Process();
LED_Process();
2022-02-04 21:24:15 +01:00
EEPROM_Process();
2023-02-23 23:14:58 +01:00
Webserver_Process();
2023-02-24 19:24:26 +01:00
DTC_Process();
2022-01-07 23:36:02 +01:00
2022-01-07 21:02:27 +01:00
ArduinoOTA.handle();
2023-02-24 19:24:26 +01:00
EEPROMCyclicPDSTicker.update();
#ifdef FEATURE_ENABLE_WIFI_CLIENT
2022-01-14 21:28:50 +01:00
WiFiMaintainConnectionTicker.update();
#endif
if (globals.systemStatus == sysStat_Shutdown)
SystemShutdown();
2022-01-07 21:02:27 +01:00
yield();
}
String IpAddress2String(const IPAddress &ipAddress)
{
return String(ipAddress[0]) + String(".") +
String(ipAddress[1]) + String(".") +
String(ipAddress[2]) + String(".") +
String(ipAddress[3]);
}
#ifdef FEATURE_ENABLE_WIFI_CLIENT
2022-01-07 23:36:02 +01:00
void wifiMaintainConnectionTicker_callback()
{
static uint32_t WiFiFailCount = 0;
const uint32_t WiFiFailMax = 20;
if (wifiMulti.run(connectTimeoutMs) == WL_CONNECTED)
{
return;
}
else
{
if (WiFiFailCount < WiFiFailMax)
{
WiFiFailCount++;
}
else
{
2023-02-23 23:14:58 +01:00
Debug_pushMessage("WiFi not connected! - Start AP");
toggleWiFiAP();
2022-01-07 23:36:02 +01:00
}
}
}
2022-01-14 21:28:50 +01:00
#endif
2022-01-07 23:36:02 +01:00
void EEPROMCyclicPDS_callback()
{
StorePersistence_EEPROM();
}
2022-01-07 23:36:02 +01:00
void trigger_ISR()
{
wheel_pulse++;
2022-01-09 20:51:16 +01:00
}
2022-01-14 15:36:17 +01:00
void LED_Process(uint8_t override, CRGB SetColor)
2022-01-09 20:51:16 +01:00
{
typedef enum
{
LED_Startup,
LED_Normal,
LED_Confirm_Normal,
LED_Rain,
LED_Confirm_Rain,
LED_Purge,
2022-01-14 15:36:17 +01:00
LED_Error,
LED_Override
2022-01-09 20:51:16 +01:00
} tLED_Status;
static tSystem_Status oldSysStatus = sysStat_Startup;
static tLED_Status LED_Status = LED_Startup;
2022-01-14 15:36:17 +01:00
static CRGB LED_override_color = 0;
static tLED_Status LED_ResumeOverrideStatus = LED_Startup;
2022-01-09 20:51:16 +01:00
uint8_t color = 0;
uint32_t timer = 0;
static uint32_t timestamp = 0;
timer = millis();
2022-01-14 15:36:17 +01:00
if (override == 1)
2022-01-09 20:51:16 +01:00
{
2022-01-14 15:36:17 +01:00
if (LED_Status != LED_Override)
{
LED_ResumeOverrideStatus = LED_Status;
2023-02-23 23:14:58 +01:00
Debug_pushMessage("Override LED_Status");
2022-01-14 15:36:17 +01:00
}
LED_Status = LED_Override;
LED_override_color = SetColor;
}
if (override == 2)
{
if (LED_Status == LED_Override)
{
LED_Status = LED_ResumeOverrideStatus;
2023-02-23 23:14:58 +01:00
Debug_pushMessage("Resume LED_Status");
2022-01-14 15:36:17 +01:00
}
}
if (oldSysStatus != globals.systemStatus)
{
switch (globals.systemStatus)
2022-01-09 20:51:16 +01:00
{
2022-01-10 00:55:04 +01:00
case sysStat_Startup:
LED_Status = LED_Startup;
2023-02-23 23:14:58 +01:00
Debug_pushMessage("sysStat: Startup");
2022-01-10 00:55:04 +01:00
break;
case sysStat_Normal:
timestamp = timer + 3500;
2022-01-10 00:55:04 +01:00
LED_Status = LED_Confirm_Normal;
2023-02-23 23:14:58 +01:00
Debug_pushMessage("sysStat: Normal");
2022-01-10 00:55:04 +01:00
break;
case sysStat_Rain:
timestamp = timer + 3500;
2022-01-10 00:55:04 +01:00
LED_Status = LED_Confirm_Rain;
2023-02-23 23:14:58 +01:00
Debug_pushMessage("sysStat: Rain");
2022-01-10 00:55:04 +01:00
break;
case sysStat_Purge:
LED_Status = LED_Purge;
2023-02-23 23:14:58 +01:00
Debug_pushMessage("sysStat: Purge");
2022-01-10 00:55:04 +01:00
break;
case sysStat_Error:
LED_Status = LED_Error;
2023-02-23 23:14:58 +01:00
Debug_pushMessage("sysStat: Error");
2022-01-10 00:55:04 +01:00
break;
case sysStat_Shutdown:
2022-01-12 00:52:27 +01:00
default:
break;
2022-01-09 20:51:16 +01:00
}
2022-01-14 15:36:17 +01:00
oldSysStatus = globals.systemStatus;
2022-01-09 20:51:16 +01:00
}
2022-01-10 00:55:04 +01:00
2022-01-09 20:51:16 +01:00
switch (LED_Status)
{
case LED_Startup:
FastLED.setBrightness(255);
2022-01-14 15:36:17 +01:00
if (globals.TankPercentage < LubeConfig.TankRemindAtPercentage)
2022-01-14 15:36:17 +01:00
leds[0] = CRGB::OrangeRed;
else
leds[0] = CRGB::White;
2022-01-09 20:51:16 +01:00
break;
2022-01-09 20:51:16 +01:00
case LED_Confirm_Normal:
FastLED.setBrightness(255);
leds[0] = timer % 250 > 125 ? CRGB(0, 255, 0) : CRGB(0, 4, 0);
if (timestamp < timer)
{
LED_Status = LED_Normal;
FastLED.setBrightness(64);
2023-02-23 23:14:58 +01:00
Debug_pushMessage("LED_Status: Confirm -> Normal");
}
2022-01-09 20:51:16 +01:00
break;
2022-01-09 20:51:16 +01:00
case LED_Normal:
#ifndef NO_MODE_FLASH
if (timer % 2000 > 1950)
leds[0] = CRGB(0, 255, 0);
else if (WiFi.getMode() != WIFI_OFF && timer % 2000 > 1800 && timer % 2000 < 1850)
#else
if (WiFi.getMode() != WIFI_OFF && timer % 2000 > 1950)
#endif
leds[0] = CRGB(255, 128, 0);
else
leds[0] = CRGB(0, 4, 0);
2022-01-09 20:51:16 +01:00
break;
2022-01-09 20:51:16 +01:00
case LED_Confirm_Rain:
FastLED.setBrightness(255);
leds[0] = timer % 250 > 125 ? CRGB(0, 0, 255) : CRGB(0, 0, 4);
if (timestamp < timer)
{
LED_Status = LED_Rain;
FastLED.setBrightness(64);
2023-02-23 23:14:58 +01:00
Debug_pushMessage("LED_Status: Confirm -> Rain");
}
2022-01-09 20:51:16 +01:00
break;
2022-01-09 20:51:16 +01:00
case LED_Rain:
#ifndef NO_MODE_FLASH
if (timer % 2000 > 1950)
leds[0] = CRGB(0, 0, 255);
else if (WiFi.getMode() != WIFI_OFF && timer % 2000 > 1800 && timer % 2000 < 1850)
#else
if (WiFi.getMode() != WIFI_OFF && timer % 2000 > 1950)
#endif
leds[0] = CRGB(255, 128, 0);
else
leds[0] = CRGB(0, 0, 4);
2022-01-09 20:51:16 +01:00
break;
2022-01-09 20:51:16 +01:00
case LED_Purge:
timer = timer % 500;
color = timer / 2;
leds[0] = CRGB::DeepPink;
if (timer < 250)
FastLED.setBrightness(color);
else
FastLED.setBrightness(250 - color);
2022-01-09 20:51:16 +01:00
break;
2022-01-09 20:51:16 +01:00
case LED_Error:
leds[0] = timer % 500 > 250 ? CRGB::Red : CRGB::Black;
2022-01-09 20:51:16 +01:00
break;
2022-01-14 15:36:17 +01:00
case LED_Override:
leds[0] = LED_override_color;
break;
2022-01-09 20:51:16 +01:00
default:
break;
}
FastLED.show();
2022-01-09 20:51:16 +01:00
}
2022-08-19 00:10:42 +02:00
#ifdef FEATURE_ENABLE_OLED
2022-01-14 15:36:17 +01:00
void Display_Process()
2022-01-10 00:55:04 +01:00
{
static tSystem_Status oldSysStatus = sysStat_Startup;
if (oldSysStatus != globals.systemStatus)
{
u8x8.clearDisplay();
u8x8.drawString(0, 0, "KTM ChainLube V1");
oldSysStatus = globals.systemStatus;
}
u8x8.setCursor(0, 1);
uint32_t DistRemain = globals.systemStatus == sysStat_Normal ? LubeConfig.DistancePerLube_Default : LubeConfig.DistancePerLube_Rain;
2023-02-23 17:46:28 +01:00
DistRemain = DistRemain - (PersistenceData.TravelDistance_highRes_mm / 1000);
u8x8.printf(PSTR("Mode: %10s\n"), globals.systemStatustxt);
if (globals.systemStatus == sysStat_Error)
{
u8x8.printf(PSTR("last DTC: %6d\n"), getlastDTC(false));
}
else
{
u8x8.printf(PSTR("next Lube: %4dm\n"), DistRemain);
u8x8.printf(PSTR("Tank: %8dml\n"), PersistenceData.tankRemain_microL / 1000);
u8x8.printf(PSTR("WiFi: %10s\n"), (WiFi.getMode() == WIFI_AP ? "AP" : WiFi.getMode() == WIFI_OFF ? "OFF"
2022-03-08 23:03:10 +01:00
: WiFi.getMode() == WIFI_STA ? "CLIENT"
: "UNKNOWN"));
u8x8.printf(PSTR("Source: %8s\n"), SpeedSourceString[LubeConfig.SpeedSource]);
u8x8.printf("%s\n", WiFi.localIP().toString().c_str());
}
2022-01-10 00:55:04 +01:00
u8x8.refreshDisplay();
2022-01-14 15:36:17 +01:00
}
2022-08-19 00:10:42 +02:00
#endif
2022-01-14 15:36:17 +01:00
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:
toggleWiFiAP();
2023-02-23 23:14:58 +01:00
Debug_pushMessage("Starting WiFi AP");
2022-01-14 15:36:17 +01:00
break;
case BTN_STARTPURGE:
globals.systemStatus = sysStat_Purge;
globals.purgePulses = LubeConfig.BleedingPulses;
2023-02-23 23:14:58 +01:00
Debug_pushMessage("Starting Purge");
2022-01-14 15:36:17 +01:00
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;
}
2023-02-23 23:14:58 +01:00
Debug_pushMessage("Toggling Mode");
2022-01-14 15:36:17 +01:00
break;
case BTN_NOTHING:
default:
2023-02-23 23:14:58 +01:00
Debug_pushMessage("Nothing or invalid");
2022-01-14 15:36:17 +01:00
break;
}
LED_Process(2);
}
buttonAction = BTN_INACTIVE;
buttonTimestamp = 0;
}
}
void toggleWiFiAP(boolean shutdown)
2022-01-14 15:36:17 +01:00
{
2022-01-14 21:28:50 +01:00
if (WiFi.getMode() != WIFI_OFF)
{
WiFi.mode(WIFI_OFF);
2023-02-23 23:14:58 +01:00
Debug_pushMessage("WiFi turned off");
#ifdef FEATURE_ENABLE_WIFI_CLIENT
WiFiMaintainConnectionTicker.stop();
#endif
2022-01-14 21:28:50 +01:00
}
else
{
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(IPAddress(WIFI_AP_IP_GW), IPAddress(WIFI_AP_IP_GW), IPAddress(255, 255, 255, 0));
2022-08-14 17:38:45 +02:00
WiFi.softAP(globals.DeviceName, QUOTE(WIFI_AP_PASSWORD));
#ifdef FEATURE_ENABLE_WIFI_CLIENT
2022-01-14 21:28:50 +01:00
WiFiMaintainConnectionTicker.stop();
2023-02-23 23:14:58 +01:00
Debug_pushMessage("WiFi AP started, stopped Maintain-Timer");
2022-01-14 21:28:50 +01:00
#else
2023-02-23 23:14:58 +01:00
Debug_pushMessage("WiFi AP started");
2022-01-14 21:28:50 +01:00
#endif
}
}
void SystemShutdown()
{
static uint32_t shutdown_delay = 0;
if (shutdown_delay == 0)
{
shutdown_delay = millis() + SHUTDOWN_DELAY_MS;
2022-08-24 23:08:57 +02:00
Serial.printf("Shutdown requested - Restarting in %d seconds\n", SHUTDOWN_DELAY_MS / 1000);
}
if (shutdown_delay < millis())
{
StoreConfig_EEPROM();
StorePersistence_EEPROM();
ESP.restart();
}
2022-01-31 09:26:10 +01:00
}
uint32_t Process_Impulse_WheelSpeed()
2022-01-31 09:26:10 +01:00
{
uint32_t add_milimeters;
// Calculate traveled Distance in mm
add_milimeters = (wheel_pulse * (LubeConfig.DistancePerRevolution_mm / LubeConfig.PulsePerRevolution));
wheel_pulse = 0;
2022-01-31 09:26:10 +01:00
return add_milimeters;
2022-05-01 15:15:32 +02:00
}