diff --git a/main/accessors/settingsaccessors.h b/main/accessors/settingsaccessors.h index 6170d8e..50660a5 100644 --- a/main/accessors/settingsaccessors.h +++ b/main/accessors/settingsaccessors.h @@ -205,6 +205,9 @@ struct LedstripEnableBlinkAnimationAccessor : public NewSettingsAccessor { struct LedstripOtaAnimationAccessor : public NewSettingsAccessor { ConfigWrapper &getConfig() const override { return configs.ledstrip.otaMode; } }; struct LedstripEnableVisualizeBlinkAnimationAccessor : public NewSettingsAccessor { ConfigWrapper &getConfig() const override { return configs.ledstrip.enableVisualizeBlink; } }; struct LedstripAutomaticLightAccessor : public NewSettingsAccessor { ConfigWrapper &getConfig() const override { return configs.ledstrip.automaticLight; } }; +struct LedstripBrakeLightUseAccelAccessor : public NewSettingsAccessor { ConfigWrapper &getConfig() const override { return configs.ledstrip.brakeLights_useAccel; } }; +struct LedstripBrakeLightUsePowerAccessor : public NewSettingsAccessor { ConfigWrapper &getConfig() const override { return configs.ledstrip.brakeLights_usePower; } }; + // Battery struct BatterySeriesCellsAccessor : public NewSettingsAccessor { ConfigWrapper &getConfig() const override { return configs.battery.cellsSeries; } }; diff --git a/main/displays/menus/ledstripmenu.cpp b/main/displays/menus/ledstripmenu.cpp index 93ecf35..c4f108d 100644 --- a/main/displays/menus/ledstripmenu.cpp +++ b/main/displays/menus/ledstripmenu.cpp @@ -48,6 +48,8 @@ constexpr char TEXT_ANIMATION_MULTIPLIER[] = "Animation Multiplier"; constexpr char TEXT_LEDSTRIP_BRIGHTNESS[] = "Ledstrip Brightness"; constexpr char TEXT_LEDSTRIP_ALLCUSTOMOFF[] = "All custom off"; constexpr char TEXT_LEDSTRIP_CHANGE_OTA_ANIM[] = "Change Ota animation"; +constexpr char TEXT_LEDSTRIP_BRAKE_USE_ACCEL[] = "Brakelight use acceleration"; +constexpr char TEXT_LEDSTRIP_BRAKE_USE_POWER[] = "Brakelight use motor power"; constexpr char TEXT_BACK[] = "Back"; using LedsCountChangeScreen = espgui::makeComponent< @@ -179,6 +181,8 @@ LedstripMenu::LedstripMenu() if (!simplified) { constructMenuItem, espgui::PushScreenAction>>(); } if (!simplified) { constructMenuItem, espgui::PushScreenAction>>(); } if (!simplified) { constructMenuItem>>(); } + constructMenuItem, BobbyCheckbox, LedstripBrakeLightUseAccelAccessor>>(); + constructMenuItem, BobbyCheckbox, LedstripBrakeLightUsePowerAccessor>>(); constructMenuItem, espgui::PushScreenAction, StaticMenuItemIcon<&espgui::icons::back>>>(); } diff --git a/main/ledstrip.cpp b/main/ledstrip.cpp index 30bed4b..845c2e5 100644 --- a/main/ledstrip.cpp +++ b/main/ledstrip.cpp @@ -26,7 +26,46 @@ espchrono::millis_clock::time_point brakeLightTimer; uint16_t blinkAnimation = LEDSTRIP_OVERWRITE_NONE; namespace { - bool initialized{false}; +bool initialized{false}; + +bool brakeLights() +{ + float avgPwm{}; + for (const Controller &controller : controllers) + { + avgPwm += + controller.command.left.pwm * (controller.invertLeft ? -1 : 1) + + controller.command.right.pwm * (controller.invertRight ? -1 : 1); + } + avgPwm /= 4; + + if (avgPwm < -1.f) + { + return true; + } + + if (configs.ledstrip.brakeLights_useAccel.value() && (avgAccel < -0.001f && avgSpeedKmh > 2.f)) + { + return true; + } + + if (espchrono::ago(brakeLightTimer) < 200ms) + { + return true; + } + + if (configs.ledstrip.brakeLights_usePower.value() && brakeLightsStatus) + { + if (const auto avgVoltage = controllers.getAvgVoltage(); avgVoltage) + { + auto watt = sumCurrent * *avgVoltage; + + return watt < -20; + } + } + + return false; +} } // namespace void initLedStrip() @@ -144,17 +183,8 @@ void updateLedStrip() { if (configs.ledstrip.enableBrakeLights.value()) { - float avgPwm{}; - for (const Controller &controller : controllers) - { - avgPwm += - controller.command.left.pwm * (controller.invertLeft ? -1 : 1) + - controller.command.right.pwm * (controller.invertRight ? -1 : 1); - } - avgPwm /= 4; - // avgAccel in m/s/s - if (avgPwm < -1.f || (avgAccel < -0.001f && avgSpeedKmh > 5.f) || espchrono::ago(brakeLightTimer) < 200ms) + if (brakeLights()) { if (!(espchrono::ago(brakeLightTimer) < 200ms)) { diff --git a/main/newsettings.h b/main/newsettings.h index cb5f37e..2a2f6e2 100644 --- a/main/newsettings.h +++ b/main/newsettings.h @@ -415,6 +415,8 @@ public: }; ConfigWrapperLegacy leds_per_meter {144, DoReset, {}, "ledsPerMeter" }; ConfigWrapperLegacy automaticLight {false, DoReset, {}, "nightLights" }; + ConfigWrapperLegacy brakeLights_useAccel {false, DoReset, {}, "brakeLightsA" }; + ConfigWrapperLegacy brakeLights_usePower {false, DoReset, {}, "brakeLightsP" }; } ledstrip; struct { @@ -749,6 +751,8 @@ public: x(ledstrip.maxMilliamps) \ x(ledstrip.enableVisualizeBlink)\ x(ledstrip.automaticLight) \ + x(ledstrip.brakeLights_useAccel) \ + x(ledstrip.brakeLights_usePower) \ \ x(ledstrip.custom_color[0]) \ x(ledstrip.custom_color[1]) \