diff --git a/main/accessors/settingsaccessors.h b/main/accessors/settingsaccessors.h index 315d8ed..9676250 100644 --- a/main/accessors/settingsaccessors.h +++ b/main/accessors/settingsaccessors.h @@ -128,7 +128,13 @@ struct CloudSendRateAccessor : public RefAccessorSaveSettings { int16_t struct DefaultModeModelModeAccessor : public RefAccessorSaveSettings { UnifiedModelMode &getRef() const override { return settings.defaultMode.modelMode; } }; struct DefaultModeSquareGasAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.defaultMode.squareGas; } }; struct DefaultModeSquareBremsAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.defaultMode.squareBrems; } }; -struct DefaultModeEnableSmoothingAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.defaultMode.enableSmoothing; } }; + +struct DefaultModeEnableSmoothingUpAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.defaultMode.enableSmoothingUp; } }; +struct DefaultModeEnableSmoothingDownAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.defaultMode.enableSmoothingDown; } }; +struct DefaultModeEnableFieldWeakSmoothingUpAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.defaultMode.enableFieldWeakSmoothingUp; } }; +struct DefaultModeEnableFieldWeakSmoothingDownAccessor : public RefAccessorSaveSettings { bool &getRef() const override { return settings.defaultMode.enableFieldWeakSmoothingDown; } }; +struct DefaultModeEnableFieldWeakSmoothingLowerLimitAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.defaultMode.fwSmoothLowerLimit; } }; + struct DefaultModeSmoothingAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.defaultMode.smoothing; } }; struct DefaultModeFrontPercentageAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.defaultMode.frontPercentage; } }; struct DefaultModeBackPercentageAccessor : public RefAccessorSaveSettings { int16_t &getRef() const override { return settings.defaultMode.backPercentage; } }; diff --git a/main/displays/menus/defaultmodesettingsmenu.h b/main/displays/menus/defaultmodesettingsmenu.h index 7e9f9cb..33162cb 100644 --- a/main/displays/menus/defaultmodesettingsmenu.h +++ b/main/displays/menus/defaultmodesettingsmenu.h @@ -36,6 +36,13 @@ using DefaultModeSmoothingChangeDisplay = makeComponent< BackActionInterface>, SwitchScreenAction >; +using DefaultModeFwSmoothingLowerLimitChangeDisplay = makeComponent< + ChangeValueDisplay, + StaticText, + DefaultModeEnableFieldWeakSmoothingLowerLimitAccessor, + BackActionInterface>, + SwitchScreenAction +>; using DefaultModeFrontPercentageChangeDisplay = makeComponent< ChangeValueDisplay, StaticText, @@ -97,7 +104,11 @@ public: constructMenuItem, SwitchScreenAction>>(); constructMenuItem, ToggleBoolAction, CheckboxIcon, DefaultModeSquareGasAccessor>>(); constructMenuItem, ToggleBoolAction, CheckboxIcon, DefaultModeSquareBremsAccessor>>(); - constructMenuItem, ToggleBoolAction, CheckboxIcon, DefaultModeEnableSmoothingAccessor>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, DefaultModeEnableSmoothingUpAccessor>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, DefaultModeEnableSmoothingDownAccessor>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, DefaultModeEnableFieldWeakSmoothingUpAccessor>>(); + constructMenuItem, ToggleBoolAction, CheckboxIcon, DefaultModeEnableFieldWeakSmoothingDownAccessor>>(); + constructMenuItem, SwitchScreenAction>>(); constructMenuItem, SwitchScreenAction>>(); constructMenuItem, SwitchScreenAction>>(); constructMenuItem, SwitchScreenAction>>(); diff --git a/main/modes/defaultmode.h b/main/modes/defaultmode.h index 1b6a922..3a55177 100644 --- a/main/modes/defaultmode.h +++ b/main/modes/defaultmode.h @@ -84,22 +84,45 @@ void DefaultMode::update() { pwm = (gas_processed/1000.*settings.defaultMode.gas1_wert) + (brems_processed/1000.*settings.defaultMode.brems1_wert); - if (settings.defaultMode.enableSmoothing && (pwm > 1000. || lastPwm > 1000.)) + if ((settings.defaultMode.enableSmoothingUp || settings.defaultMode.enableSmoothingDown) && (pwm > 1000. || lastPwm > 1000.)) { - if (lastPwm < pwm) + if (lastPwm < pwm && settings.defaultMode.enableSmoothingUp) { pwm = std::min(pwm, lastPwm + (settings.defaultMode.smoothing * std::chrono::milliseconds{now - lastTime}.count() / 100.f)); if (pwm < 1000.) pwm = 1000.; } - else if (lastPwm > pwm) + else if (lastPwm > pwm && settings.defaultMode.enableSmoothingDown) { pwm = std::max(pwm, lastPwm - (settings.defaultMode.smoothing * std::chrono::milliseconds{now - lastTime}.count() / 100.f)); } } } - else + else { pwm = (gas_processed/1000.*settings.defaultMode.gas2_wert) - (brems_processed/1000.*settings.defaultMode.brems2_wert); + if ( + (settings.defaultMode.enableFieldWeakSmoothingUp || settings.defaultMode.enableFieldWeakSmoothingDown) && + (lastPwm > settings.defaultMode.fwSmoothLowerLimit) && + brems_processed > 0) + { + if (lastPwm < pwm && settings.defaultMode.enableFieldWeakSmoothingUp) + { + auto effective_smoothing = settings.defaultMode.smoothing; + auto difference_to_target = std::abs(pwm-lastPwm); + effective_smoothing *= std::max((difference_to_target / 500),0.5f); + + pwm = std::min(pwm, lastPwm + (effective_smoothing * std::chrono::milliseconds{now - lastTime}.count() / 100.f)); + } + else if (lastPwm > pwm && settings.defaultMode.enableFieldWeakSmoothingDown) + { + auto effective_smoothing = settings.defaultMode.smoothing; + auto difference_to_target = std::abs(pwm-lastPwm); + effective_smoothing *= std::max((difference_to_target / 500),0.5f); + + pwm = std::max(pwm, lastPwm - (effective_smoothing * std::chrono::milliseconds{now - lastTime}.count() / 100.f)); + } + } + } lastPwm = pwm; lastTime = now; diff --git a/main/presets.h b/main/presets.h index d966ced..1622dc1 100644 --- a/main/presets.h +++ b/main/presets.h @@ -178,7 +178,10 @@ constexpr Settings::DefaultMode defaultDefaultMode { .modelMode = UnifiedModelMode::FocTorque, .squareGas = true, .squareBrems = true, - .enableSmoothing = true, + .enableSmoothingUp = true, + .enableSmoothingDown = true, + .enableFieldWeakSmoothingUp = false, + .enableFieldWeakSmoothingDown = false, .smoothing = 20, .frontPercentage = 100, .backPercentage = 100, @@ -186,14 +189,18 @@ constexpr Settings::DefaultMode defaultDefaultMode { .gas1_wert = 1250, .gas2_wert = 1250, .brems1_wert = 250, - .brems2_wert = 750 + .brems2_wert = 750, + .fwSmoothLowerLimit = 800 }; constexpr Settings::DefaultMode sinusoidalDefaultMode { .modelMode = UnifiedModelMode::Sinusoidal, .squareGas = true, .squareBrems = true, - .enableSmoothing = true, + .enableSmoothingUp = true, + .enableSmoothingDown = true, + .enableFieldWeakSmoothingUp = false, + .enableFieldWeakSmoothingDown = false, .smoothing = 20, .frontPercentage = 100, .backPercentage = 100, @@ -201,7 +208,8 @@ constexpr Settings::DefaultMode sinusoidalDefaultMode { .gas1_wert = 1250, .gas2_wert = 1250, .brems1_wert = 150, - .brems2_wert = 1000 + .brems2_wert = 1000, + .fwSmoothLowerLimit = 800 }; constexpr Settings::TempomatMode defaultTempomatMode { diff --git a/main/settings.h b/main/settings.h index 49b66c4..3a9aa99 100644 --- a/main/settings.h +++ b/main/settings.h @@ -127,7 +127,10 @@ struct Settings UnifiedModelMode modelMode; bool squareGas; bool squareBrems; - bool enableSmoothing; + bool enableSmoothingUp; + bool enableSmoothingDown; + bool enableFieldWeakSmoothingUp; + bool enableFieldWeakSmoothingDown; int16_t smoothing; int16_t frontPercentage; int16_t backPercentage; @@ -136,6 +139,7 @@ struct Settings int16_t gas2_wert; int16_t brems1_wert; int16_t brems2_wert; + int16_t fwSmoothLowerLimit; } defaultMode; struct TempomatMode { @@ -280,7 +284,11 @@ void Settings::executeForEveryProfileSetting(T &&callable) callable("invertBackRight", controllerHardware.invertBackRight); callable("default.modelMo", defaultMode.modelMode); - callable("default.enableS", defaultMode.enableSmoothing); + callable("default.enSmUp_", defaultMode.enableSmoothingUp); + callable("default.enSmDow", defaultMode.enableSmoothingDown); + callable("default.enSmFUp", defaultMode.enableFieldWeakSmoothingUp); + callable("default.enSmFDo", defaultMode.enableFieldWeakSmoothingDown); + callable("default.fwSmLLi", defaultMode.fwSmoothLowerLimit); callable("default.smoothi", defaultMode.smoothing); callable("default.frontPe", defaultMode.frontPercentage); callable("default.backPer", defaultMode.backPercentage); diff --git a/main/texts.h b/main/texts.h index fe86b2f..262c8df 100644 --- a/main/texts.h +++ b/main/texts.h @@ -170,7 +170,11 @@ constexpr char TEXT_DYNAMICMENU[] = "Dynamic menu"; constexpr char TEXT_MODELMODE[] = "Model mode"; constexpr char TEXT_SQUAREGAS[] = "Square gas"; constexpr char TEXT_SQUAREBREMS[] = "Square brems"; -constexpr char TEXT_ENABLESMOOTHING[] = "Enable smoothing"; +constexpr char TEXT_ENABLESMOOTHINGUP[] = "Enable up smoothing"; +constexpr char TEXT_ENABLESMOOTHINGDOWN[] = "Enable down smoothing"; +constexpr char TEXT_ENABLEFWSMOOTHINGUP[] = "Enable fw up smoothing"; +constexpr char TEXT_ENABLEFWSMOOTHINGDOWN[] = "Enable fw down smoothing"; +constexpr char TEXT_FWSMOOTHING_LIMIT[] = "Fw smooth lower limit"; constexpr char TEXT_SMOOTHINGVAL[] = "Smoothing"; constexpr char TEXT_FRONTPERCENTAGE[] = "Front %"; constexpr char TEXT_BACKPERCENTAGE[] = "Back %";