diff --git a/config_feedc0de.cmake b/config_feedc0de.cmake index a6ee7e1..7897f01 100644 --- a/config_feedc0de.cmake +++ b/config_feedc0de.cmake @@ -97,4 +97,5 @@ set(BOBBYCAR_BUILDFLAGS -DLEDS_PER_METER=144 -DOLD_NVS # -DFEATURE_DNS_NS + -DFEATURE_IS_MIR_EGAL_OB_DER_WEBSERVER_FUNKTIONIERT ) diff --git a/main/buttons.cpp b/main/buttons.cpp index 7301952..b6ae372 100644 --- a/main/buttons.cpp +++ b/main/buttons.cpp @@ -156,8 +156,18 @@ void InputDispatcher::blinkRightButton(bool pressed) void InputDispatcher::quickActionButtonDown(bool pressed) { + using namespace handbremse; + if(!pressed)return; - modes::defaultMode.overrideHandbremse = pressed; + + if (settings.handbremse.enable) + { + if (angezogen) + stateWish = StateWish::release; + else + stateWish = StateWish::brake; + wishTimer = espchrono::millis_clock::now(); + } } void InputDispatcher::quickActionButtonUp(bool pressed) diff --git a/main/can.cpp b/main/can.cpp index ece5146..09d955e 100644 --- a/main/can.cpp +++ b/main/can.cpp @@ -360,6 +360,7 @@ void sendCanCommands() if (front) send(MotorController::Command::CtrlMod, front->command.right.ctrlMod); if (back) send(MotorController::Command::CtrlMod, back->command.left.ctrlMod); if (back) send(MotorController::Command::CtrlMod, back->command.right.ctrlMod); + handbremse::finishedMotorUpdate = true; break; case 3: #if defined(HAS_SIMPLIFIED) diff --git a/main/displays/statusdisplay.cpp b/main/displays/statusdisplay.cpp index cb0b697..1b27c5b 100644 --- a/main/displays/statusdisplay.cpp +++ b/main/displays/statusdisplay.cpp @@ -70,8 +70,10 @@ void StatusDisplay::initScreen() void StatusDisplay::redraw() { Base::redraw(); - if (settings.handbremse.enable && settings.handbremse.visualize && (modes::defaultMode.overrideHandbremse || handbremse::handbremseAngezogen)) + if (settings.handbremse.enable && settings.handbremse.visualize && handbremse::angezogen) tft.fillRect(0, tft.height()-6, tft.width(), 6, TFT_RED); + else if (settings.handbremse.enable && settings.handbremse.visualize && handbremse::stateWish == handbremse::StateWish::brake) + tft.fillRect(0, tft.height()-6, tft.width(), 6, TFT_YELLOW); else tft.fillRect(0, tft.height()-6, tft.width(), 6, TFT_BLACK); diff --git a/main/handbremse.cpp b/main/handbremse.cpp index 4ff7ff1..2732e5e 100644 --- a/main/handbremse.cpp +++ b/main/handbremse.cpp @@ -1,4 +1,15 @@ #include "handbremse.h" + +#include "globals.h" + namespace handbremse { -bool handbremseAngezogen{false}; +bool angezogen{false}; +bool finishedMotorUpdate{false}; +std::optional releaseTimer; +std::optional wishTimer; +std::optional standStillFirstDetected; +std::optional lastAutoRelease{espchrono::millis_clock::now()}; + +StateWish stateWish{none}; + } // namespace diff --git a/main/handbremse.h b/main/handbremse.h index 3c4d3e0..01ab708 100644 --- a/main/handbremse.h +++ b/main/handbremse.h @@ -5,6 +5,7 @@ // 3rdparty lib includes #include +#include #define HandbremseModeValues(x) \ x(MOSFETS_OFF) \ @@ -13,5 +14,19 @@ DECLARE_TYPESAFE_ENUM(HandbremseMode, : uint8_t, HandbremseModeValues) namespace handbremse { -extern bool handbremseAngezogen; + +extern bool angezogen; +extern bool finishedMotorUpdate; +extern std::optional releaseTimer; +extern std::optional wishTimer; +extern std::optional standStillFirstDetected; +extern std::optional lastAutoRelease; + +enum StateWish { + none, + release, + brake +}; + +extern StateWish stateWish; } // namespace diff --git a/main/ledstrip.cpp b/main/ledstrip.cpp index b35229a..f8763dd 100644 --- a/main/ledstrip.cpp +++ b/main/ledstrip.cpp @@ -236,7 +236,6 @@ void showOtaAnimation() { std::fill(std::begin(leds), std::end(leds), CRGB{0,0,0}); const auto leds_count = leds.size(); - const int one_percent = leds_count / 100; float percentage = 0; const auto progress = asyncOta->progress(); @@ -245,7 +244,7 @@ void showOtaAnimation() percentage = (float(progress) / *totalSize * 100); if (settings.ledstrip.otaMode == OtaAnimationModes::GreenProgressBar) { - int numLeds = one_percent * percentage; + int numLeds = (leds_count * percentage) / 100; if (numLeds >= leds_count) { numLeds = leds_count - 1; diff --git a/main/modes/defaultmode.cpp b/main/modes/defaultmode.cpp index 14a46c7..f39c619 100644 --- a/main/modes/defaultmode.cpp +++ b/main/modes/defaultmode.cpp @@ -13,6 +13,7 @@ void DefaultMode::start() void DefaultMode::update() { + auto pair = split(settings.defaultMode.modelMode); if (!gas || !brems) { start(); @@ -49,73 +50,124 @@ void DefaultMode::update() auto gas_processed = settings.defaultMode.squareGas ? (local_gas * local_gas) / 1000.f : local_gas; auto brems_processed = settings.defaultMode.squareBrems ? (local_brems * local_brems) / 1000 : local_brems; - const auto c_gas_processed = gas_processed; - const auto c_brems_processed = brems_processed; const auto now = espchrono::millis_clock::now(); - if (!settings.handbremse.enable) - goto hell; + float pwm; - if (settings.handbremse.automatic && settings.handbremse.enable && settings.handbremse.mode == HandbremseMode::SPEED_0 && (abs(gas_processed) > 0 || abs(brems_processed) > 0)) + if (settings.handbremse.enable && handbremse::stateWish == handbremse::StateWish::brake) { - if (handbremse::handbremseAngezogen && !m_handbrems_timer) - m_handbrems_timer = now; - goto hell; + using namespace handbremse; + + const auto speed = abs(avgSpeedKmh); + const bool gas_und_brems_ist_null = (gas_processed < 1 && brems_processed < 1); + if (speed < 2 && gas_und_brems_ist_null) + { + angezogen = true; + stateWish = StateWish::none; + } } - if ((abs(gas_processed) > 10 || abs(brems_processed) > 10) || (!overrideHandbremse && (abs(avgSpeedKmh) > 2 || !controllers.front.feedbackValid || !controllers.back.feedbackValid || settings.handbremse.triggerTimeout < 1 || !settings.handbremse.automatic))) + if (settings.handbremse.enable && settings.handbremse.automatic && !handbremse::angezogen) { - m_stillSince = std::nullopt; - overrideHandbremse = false; - goto hell; + using namespace handbremse; + const auto speed = abs(avgSpeedKmh); + + if (speed < 1) + { + if (!standStillFirstDetected) + { + standStillFirstDetected = now; + } + } + else + standStillFirstDetected = std::nullopt; + + if (standStillFirstDetected && lastAutoRelease) + if (espchrono::ago(*standStillFirstDetected) > 100ms * settings.handbremse.triggerTimeout && espchrono::ago(*lastAutoRelease) > 5s ) + { + angezogen = true; + } } - else if (!overrideHandbremse && !m_stillSince) + + if (handbremse::angezogen) { - m_stillSince = now; - goto hell; - } - else if (((settings.handbremse.mode != HandbremseMode::SPEED_0 && abs(avgSpeedKmh) <= 2) || (settings.handbremse.mode == HandbremseMode::SPEED_0 && abs(avgSpeedKmh) <= 1)) && (overrideHandbremse || espchrono::ago(*m_stillSince) >= espchrono::milliseconds32(settings.handbremse.triggerTimeout * 100))) - { - handbremse::handbremseAngezogen = true; + using namespace handbremse; + + standStillFirstDetected = std::nullopt; + + const bool valid = (controllers.front.feedbackValid && controllers.back.feedbackValid); + const bool gas_oder_brems = (gas_processed > 10 || brems_processed > 10); fixCommonParams(); - for (bobbycar::protocol::serial::MotorState &motor : motors()) + if (wishTimer) { - motor.ctrlTyp = bobbycar::protocol::ControlType::FieldOrientedControl; - switch (settings.handbremse.mode) + if (espchrono::ago(*wishTimer) > 10s) { - case HandbremseMode::MOSFETS_OFF: - motor.ctrlMod = bobbycar::protocol::ControlMode::Torque; - motor.enable = false; - break; - case HandbremseMode::OPENMODE: - motor.ctrlMod = bobbycar::protocol::ControlMode::OpenMode; - break; - case HandbremseMode::SPEED_0: - motor.ctrlMod = bobbycar::protocol::ControlMode::Speed; - break; + stateWish = StateWish::none; + wishTimer = std::nullopt; + } + } + + if (stateWish == StateWish::release) + { + lastAutoRelease = now; + releaseTimer = now; + stateWish = StateWish::none; + finishedMotorUpdate = false; + } + + if (valid && gas_oder_brems) + { + if (!releaseTimer) + { + lastAutoRelease = now; + releaseTimer = now; + finishedMotorUpdate = false; + } + } + + if (releaseTimer) + { + for (bobbycar::protocol::serial::MotorState &motor : motors()) + { + motor.pwm = 0; + motor.ctrlTyp = pair.first; + motor.ctrlMod = pair.second; + } + + if (espchrono::ago(*releaseTimer) > 1s || finishedMotorUpdate) + { + releaseTimer = std::nullopt; + angezogen = false; + } + } + else + { + for (bobbycar::protocol::serial::MotorState &motor : motors()) + { + motor.ctrlTyp = bobbycar::protocol::ControlType::FieldOrientedControl; + switch (settings.handbremse.mode) + { + case HandbremseMode::MOSFETS_OFF: + motor.ctrlMod = bobbycar::protocol::ControlMode::Torque; + motor.enable = false; + break; + case HandbremseMode::OPENMODE: + motor.ctrlMod = bobbycar::protocol::ControlMode::OpenMode; + break; + case HandbremseMode::SPEED_0: + motor.ctrlMod = bobbycar::protocol::ControlMode::Speed; + break; + } + motor.pwm = 0; + motor.cruiseCtrlEna = false; + motor.nCruiseMotTgt = 0; } - motor.pwm = 0; - motor.cruiseCtrlEna = false; - motor.nCruiseMotTgt = 0; } } else { -hell: - handbremse::handbremseAngezogen = false; - float pwm; - - if (m_handbrems_timer && settings.handbremse.automatic && settings.handbremse.enable && settings.handbremse.mode == HandbremseMode::SPEED_0 && (abs(c_gas_processed) > 0 || abs(c_brems_processed) > 0)) - { - if (espchrono::ago(*m_handbrems_timer) < 400ms) - { - gas_processed = 0; - brems_processed = 0; - } - } - if (gas_processed >= settings.defaultMode.add_schwelle) { pwm = (gas_processed/1000.*settings.defaultMode.gas1_wert) + (brems_processed/1000.*settings.defaultMode.brems1_wert); @@ -164,8 +216,6 @@ hell: m_lastPwm = pwm; m_lastTime = now; - auto pair = split(settings.defaultMode.modelMode); - if (settings.hybrid.enable) { auto activationLimit = settings.hybrid.activationLimit; @@ -211,23 +261,7 @@ hell: motor.nCruiseMotTgt = 0; } fixCommonParams(); - - if (m_handbrems_timer && settings.handbremse.automatic && settings.handbremse.enable && settings.handbremse.mode == HandbremseMode::SPEED_0 && (abs(c_gas_processed) > 0 || abs(c_brems_processed) > 0)) - { - if (espchrono::ago(*m_handbrems_timer) < 200ms) - { - for (bobbycar::protocol::serial::MotorState &motor : motors()) - { - motor.pwm = 0; - motor.ctrlTyp = pair.first; - motor.ctrlMod = pair.second; - } - } - else - m_handbrems_timer = std::nullopt; - } } } - sendCommands(); } diff --git a/main/modes/defaultmode.h b/main/modes/defaultmode.h index bb57248..7e050b6 100644 --- a/main/modes/defaultmode.h +++ b/main/modes/defaultmode.h @@ -25,13 +25,10 @@ public: bool waitForGasLoslass{false}; bool waitForBremsLoslass{false}; bool hybridModeActivated{false}; - bool overrideHandbremse{false}; private: espchrono::millis_clock::time_point m_lastTime{espchrono::millis_clock::now()}; float m_lastPwm{0}; - std::optional m_stillSince; - std::optional m_handbrems_timer; }; namespace modes { diff --git a/main/webserver.cpp b/main/webserver.cpp index df21c57..d98e657 100644 --- a/main/webserver.cpp +++ b/main/webserver.cpp @@ -10,7 +10,9 @@ httpd_handle_t httpdHandle; void initWebserver() { webserver_lock.construct(); +#ifdef FEATURE_IS_MIR_EGAL_OB_DER_WEBSERVER_FUNKTIONIERT webserver_lock->take(portMAX_DELAY); +#endif { httpd_config_t httpConfig HTTPD_DEFAULT_CONFIG(); @@ -51,8 +53,10 @@ void initWebserver() void handleWebserver() { +#ifdef FEATURE_IS_MIR_EGAL_OB_DER_WEBSERVER_FUNKTIONIERT webserver_lock->give(); webserver_lock->take(portMAX_DELAY); +#endif } esp_err_t webserver_reboot_handler(httpd_req_t *req)