From bfa42723342ee3f1f333b01930843fdadacc1688 Mon Sep 17 00:00:00 2001 From: Marcel Peterkau Date: Mon, 10 Jan 2022 00:55:04 +0100 Subject: [PATCH] Basic Function works --- Software/ChainLube/src/globals.h | 1 + Software/ChainLube/src/lubeapp.cpp | 53 ++++++++++++++++++++----- Software/ChainLube/src/lubeapp.h | 4 +- Software/ChainLube/src/main.cpp | 64 ++++++++++++++++-------------- Software/ChainLube/src/webui.cpp | 23 ++++++----- Software/ChainLube/src/webui.h | 3 ++ 6 files changed, 98 insertions(+), 50 deletions(-) diff --git a/Software/ChainLube/src/globals.h b/Software/ChainLube/src/globals.h index e6d046a..2b5652f 100644 --- a/Software/ChainLube/src/globals.h +++ b/Software/ChainLube/src/globals.h @@ -16,6 +16,7 @@ typedef enum eSystem_Status typedef struct Globals_t { tSystem_Status systemStatus = sysStat_Startup; uint8_t purgePulses= 0; + tSystem_Status resumeStatus = sysStat_Startup; }; extern Globals_t globals; diff --git a/Software/ChainLube/src/lubeapp.cpp b/Software/ChainLube/src/lubeapp.cpp index 7de3124..8091f98 100644 --- a/Software/ChainLube/src/lubeapp.cpp +++ b/Software/ChainLube/src/lubeapp.cpp @@ -1,34 +1,65 @@ #include "lubeapp.h" -extern void LED_Process(); +extern void LED_Process(tSystem_Status newStatus = sysStat_NOP); + +uint32_t lubePulseTimestamp = 0; void RunLubeApp(volatile uint32_t *wheelPulseCounter) { uint32_t LubeDistance = 0; - static uint32_t lubePulseTimestamp = 0; + // Calculate traveled Distance in mm - TravelDistance_highRes += (*wheelPulseCounter * LubeConfig.DistancePerRevolution_mm); + TravelDistance_highRes += (*wheelPulseCounter * (LubeConfig.DistancePerRevolution_mm / LubeConfig.PulsePerRevolution)); *wheelPulseCounter = 0; // check if we have to Lube! switch (globals.systemStatus) { + case sysStat_Startup: + globals.systemStatus = sysStat_Normal; + globals.resumeStatus = sysStat_Normal; + break; + case sysStat_Normal: - LubeDistance = LubeConfig.DistancePerLube_Default; + if (TravelDistance_highRes > LubeConfig.DistancePerLube_Default) + { + LubePulse(); + TravelDistance_highRes = 0; + } break; + case sysStat_Rain: - LubeDistance = LubeConfig.DistancePerLube_Rain; + if (TravelDistance_highRes > LubeConfig.DistancePerLube_Rain) + { + LubePulse(); + TravelDistance_highRes = 0; + } + break; + case sysStat_Purge: + if (globals.purgePulses > 0) + { + if (lubePulseTimestamp + LUBE_PULSE_LENGHT_MS + LUBE_PULSE_PAUSE_MS < millis()) + { + LubePulse(); + globals.purgePulses--; + } + } + else + { + globals.systemStatus = globals.resumeStatus; + } break; } - if (TravelDistance_highRes > LubeDistance){ - lubePulseTimestamp = millis() + LUBE_PULSE_LENGHT_MS; - TravelDistance_highRes = 0; - } - - //maintain Pin-State of Lube-Pump + // maintain Pin-State of Lube-Pump if (lubePulseTimestamp > millis()) digitalWrite(GPIO_PUMP, HIGH); else digitalWrite(GPIO_PUMP, LOW); } + +void LubePulse() +{ + lubePulseTimestamp = millis() + LUBE_PULSE_LENGHT_MS; + LubeConfig.tankRemain_µl = LubeConfig.tankRemain_µl - LubeConfig.amountPerDose_µl; +} \ No newline at end of file diff --git a/Software/ChainLube/src/lubeapp.h b/Software/ChainLube/src/lubeapp.h index c2aa06d..223e42f 100644 --- a/Software/ChainLube/src/lubeapp.h +++ b/Software/ChainLube/src/lubeapp.h @@ -6,8 +6,10 @@ #include "common.h" #include "globals.h" -#define LUBE_PULSE_LENGHT_MS 1000 +#define LUBE_PULSE_LENGHT_MS 500 +#define LUBE_PULSE_PAUSE_MS 250 void RunLubeApp(volatile uint32_t * wheelPulseCounter); +void LubePulse(); #endif \ No newline at end of file diff --git a/Software/ChainLube/src/main.cpp b/Software/ChainLube/src/main.cpp index acaf4d3..ff02934 100644 --- a/Software/ChainLube/src/main.cpp +++ b/Software/ChainLube/src/main.cpp @@ -47,6 +47,7 @@ void RemoteDebug_printWifiInfo(); void wifiMaintainConnectionTicker_callback(); void IRAM_ATTR trigger_ISR(); void LED_Process(tSystem_Status newStatus = sysStat_NOP); +void DisplayProcess(); Ticker WiFiMaintainConnectionTicker(wifiMaintainConnectionTicker_callback, 1000, 0, MILLIS); @@ -138,14 +139,12 @@ void setup() void loop() { - LED_Process(); + LED_Process(globals.systemStatus); RunLubeApp(&wheel_pulse); WiFiMaintainConnectionTicker.update(); - u8x8.setCursor(0, 3); - u8x8.printf("%4d m", TravelDistance_highRes / 1000); - u8x8.refreshDisplay(); + DisplayProcess(); ArduinoOTA.handle(); Debug.handle(); @@ -247,35 +246,33 @@ void LED_Process(tSystem_Status newSysStatus) uint32_t timer = 0; uint32_t timestamp = 0; - if (newSysStatus != sysStat_NOP) + if (oldSysStatus != newSysStatus) { - if (oldSysStatus != newSysStatus) + switch (newSysStatus) { - switch (newSysStatus) - { - case sysStat_Startup: - LED_Status = LED_Startup; - break; - case sysStat_Normal: - timestamp = millis() + 1500; - LED_Status = LED_Confirm_Normal; - FastLED.setBrightness(64); - break; - case sysStat_Rain: - timestamp = millis() + 1500; - LED_Status = LED_Confirm_Rain; - FastLED.setBrightness(64); - break; - case sysStat_Purge: - LED_Status = LED_Purge; - break; - case sysStat_Error: - LED_Status = LED_Error; - break; - } - oldSysStatus = newSysStatus; + case sysStat_Startup: + LED_Status = LED_Startup; + break; + case sysStat_Normal: + timestamp = millis() + 1500; + LED_Status = LED_Confirm_Normal; + FastLED.setBrightness(64); + break; + case sysStat_Rain: + timestamp = millis() + 1500; + LED_Status = LED_Confirm_Rain; + FastLED.setBrightness(64); + break; + case sysStat_Purge: + LED_Status = LED_Purge; + break; + case sysStat_Error: + LED_Status = LED_Error; + break; } + oldSysStatus = newSysStatus; } + timer = millis(); switch (LED_Status) @@ -325,3 +322,12 @@ void LED_Process(tSystem_Status newSysStatus) } FastLED.show(); } + +void DisplayProcess() +{ + u8x8.setCursor(0, 3); + u8x8.printf("Dist.: %4d m\n", TravelDistance_highRes / 1000); + u8x8.printf("Purge: %4d\n", globals.purgePulses); + u8x8.printf("Tank: %4d ml\n", LubeConfig.tankRemain_µl / 1000); + u8x8.refreshDisplay(); +} \ No newline at end of file diff --git a/Software/ChainLube/src/webui.cpp b/Software/ChainLube/src/webui.cpp index 9d427a6..ddc976f 100644 --- a/Software/ChainLube/src/webui.cpp +++ b/Software/ChainLube/src/webui.cpp @@ -1,6 +1,4 @@ -#include -#include -#include "config.h" +#include "webui.h" uint16_t tab_lube; uint16_t tab_wheel; @@ -21,6 +19,7 @@ uint16_t num_wheel_dist; uint16_t num_tank_capacity; uint16_t num_tank_notify; +uint16_t num_dose_per_pulse; uint16_t label_tankRemain; uint16_t button_reset_tank; @@ -51,11 +50,14 @@ void SettingChanged_Callback(Control *sender, int type) LubeConfig.tankCapacity_ml = ESPUI.getControl(num_tank_capacity)->value.toInt(); else if (sender->id == num_tank_notify) LubeConfig.TankRemindAtPercentage = ESPUI.getControl(num_tank_notify)->value.toInt(); + else if (sender->id == num_dose_per_pulse) + LubeConfig.amountPerDose_µl = ESPUI.getControl(num_dose_per_pulse)->value.toInt(); } void buttons_Callback(Control *sender, int type) { - if (type != B_UP) return; + if (type != B_UP) + return; if (sender->id == button_wheelcalc) { @@ -66,19 +68,21 @@ void buttons_Callback(Control *sender, int type) ESPUI.updateControlValue(num_wheel_dist, String(LubeConfig.DistancePerRevolution_mm)); } - if(sender->id == button_reset_tank) + if (sender->id == button_reset_tank) { LubeConfig.tankRemain_µl = LubeConfig.tankCapacity_ml * 1000; ESPUI.print(label_tankRemain, String(LubeConfig.tankRemain_µl / 1000)); } - if(sender->id == button_purge) + if (sender->id == button_purge) { int pulses = ESPUI.getControl(num_purge_pulses)->value.toInt(); Serial.printf("Starting to Purge with %d pulses", pulses); + globals.purgePulses = pulses; + globals.resumeStatus = globals.systemStatus; + globals.systemStatus = sysStat_Purge; } - if (sender->id == button_store) { StoreConfig_EEPROM(); @@ -107,13 +111,14 @@ void initWebUI() num_wheel_ratio = ESPUI.addControl(ControlType::Number, "Höhe/Breite-Verhältniss", String(LubeConfig.TireWidthHeight_Ratio), ControlColor::Peterriver, tab_wheel, &SettingChanged_Callback); num_wheel_rim = ESPUI.addControl(ControlType::Number, "Felgendurchmesser (Zoll)", String(LubeConfig.RimDiameter_Inch), ControlColor::Peterriver, tab_wheel, &SettingChanged_Callback); button_wheelcalc = ESPUI.addControl(ControlType::Button, "Abrollumfang aus Reifendaten berechnen", "Berechnen", ControlColor::Peterriver, tab_wheel, &buttons_Callback); - num_wheel_dist = ESPUI.addControl(ControlType::Number, "Wegstrecke pro Umdrehung (mm)", String(LubeConfig.DistancePerRevolution_mm), ControlColor::Wetasphalt, tab_wheel, &SettingChanged_Callback); + num_wheel_dist = ESPUI.addControl(ControlType::Number, "Wegstrecke pro Radumdrehung (mm)", String(LubeConfig.DistancePerRevolution_mm), ControlColor::Wetasphalt, tab_wheel, &SettingChanged_Callback); num_wheel_ppr = ESPUI.addControl(ControlType::Number, "Sensorimpulse pro Umdrehung", String(LubeConfig.PulsePerRevolution), ControlColor::Wetasphalt, tab_wheel, &SettingChanged_Callback); num_tank_capacity = ESPUI.addControl(ControlType::Number, "Tankinhalt maximal (ml)", String(LubeConfig.tankCapacity_ml), ControlColor::Carrot, tab_tank, &SettingChanged_Callback); num_tank_notify = ESPUI.addControl(ControlType::Number, "Tankinhalt Warnung (%)", String(LubeConfig.TankRemindAtPercentage), ControlColor::Carrot, tab_tank, &SettingChanged_Callback); + num_dose_per_pulse = ESPUI.addControl(ControlType::Number, "Menge pro Pumpenimpuls (µl)", String(LubeConfig.amountPerDose_µl), ControlColor::Carrot, tab_tank, &SettingChanged_Callback); - label_tankRemain = ESPUI.addControl(ControlType::Label, "Tankinhalt verbleibend (ml, geschätzt)",String(LubeConfig.tankRemain_µl / 1000), ControlColor::Alizarin, tab_maintenance); + label_tankRemain = ESPUI.addControl(ControlType::Label, "Tankinhalt verbleibend (ml, geschätzt)", String(LubeConfig.tankRemain_µl / 1000), ControlColor::Alizarin, tab_maintenance); button_reset_tank = ESPUI.addControl(ControlType::Button, "Tankinhalt zurücksetzen", "Reset", ControlColor::Alizarin, tab_maintenance, &buttons_Callback); num_purge_pulses = ESPUI.addControl(ControlType::Number, "Entlüftung Impulse", "10", ControlColor::Alizarin, tab_maintenance); button_purge = ESPUI.addControl(ControlType::Button, "Leitung Entlüften", "Start", ControlColor::Alizarin, tab_maintenance, &buttons_Callback); diff --git a/Software/ChainLube/src/webui.h b/Software/ChainLube/src/webui.h index f597d88..e502225 100644 --- a/Software/ChainLube/src/webui.h +++ b/Software/ChainLube/src/webui.h @@ -2,6 +2,9 @@ #define _WEBUI_H_ #include +#include +#include "config.h" +#include "globals.h" void initWebUI();