diff --git a/firmware/controllers/algo/engine_configuration.cpp b/firmware/controllers/algo/engine_configuration.cpp index 43f9ef79dd..a5b1703963 100644 --- a/firmware/controllers/algo/engine_configuration.cpp +++ b/firmware/controllers/algo/engine_configuration.cpp @@ -140,10 +140,16 @@ int getGlobalConfigurationVersion(void) { */ void incrementGlobalConfigurationVersion(DECLARE_ENGINE_PARAMETER_F) { globalConfigurationVersion++; +/** + * All these callbacks could be implemented as listeners, but these days I am saving RAM + */ #if EFI_PROD_CODE || defined(__DOXYGEN__) applyNewHardwareSettings(); #endif /* EFI_PROD_CODE */ engine->preCalculate(); +#if EFI_ALTERNATOR_CONTROL || defined(__DOXYGEN__) + onConfigurationChangeAlternatorCallback(&activeConfiguration); +#endif rememberCurrentConfiguration(); } diff --git a/firmware/controllers/alternatorController.cpp b/firmware/controllers/alternatorController.cpp index 9854fa5c28..499ad8bb0f 100644 --- a/firmware/controllers/alternatorController.cpp +++ b/firmware/controllers/alternatorController.cpp @@ -37,19 +37,21 @@ static THD_WORKING_AREA(alternatorControlThreadStack, UTILITY_THREAD_STACK_SIZE) static float currentAltDuty; #if ! EFI_UNIT_TEST || defined(__DOXYGEN__) -static LocalVersionHolder parametersVersion; extern TunerStudioOutputChannels tsOutputChannels; #endif static bool currentPlainOnOffState = false; +static bool shouldResetPid = false; static msg_t AltCtrlThread(int param) { UNUSED(param); chRegSetThreadName("AlternatorController"); while (true) { #if ! EFI_UNIT_TEST || defined(__DOXYGEN__) - if (parametersVersion.isOld()) + if (shouldResetPid) { altPid.reset(); + } + shouldResetPid = false; #endif int dt = maxI(10, engineConfiguration->alternatorDT); @@ -144,6 +146,10 @@ void setDefaultAlternatorParameters(void) { engineConfiguration->alternatorDT = 100; } +void onConfigurationChangeAlternatorCallback(engine_configuration_s *previousConfiguration) { + shouldResetPid = !altPid.isSame(&previousConfiguration->alternatorControl); +} + void initAlternatorCtrl(Logging *sharedLogger) { logger = sharedLogger; addConsoleAction("altinfo", showAltInfo); diff --git a/firmware/controllers/alternatorController.h b/firmware/controllers/alternatorController.h index 4b827a25ca..db103d8adf 100644 --- a/firmware/controllers/alternatorController.h +++ b/firmware/controllers/alternatorController.h @@ -16,4 +16,6 @@ void setAltPFactor(float p); void showAltInfo(void); void setDefaultAlternatorParameters(void); +void onConfigurationChangeAlternatorCallback(engine_configuration_s *previousConfiguration); + #endif /* ALTERNATORCONTROLLER_H_ */ diff --git a/firmware/controllers/math/pid.cpp b/firmware/controllers/math/pid.cpp index 1a2e82cb4a..cb2e35f6b1 100644 --- a/firmware/controllers/math/pid.cpp +++ b/firmware/controllers/math/pid.cpp @@ -27,6 +27,11 @@ void Pid::init(pid_s *pid, float minResult, float maxResult) { prevError = 0; } +bool Pid::isSame(pid_s *pid) { + return this->pid->dFactor == pid->dFactor && this->pid->iFactor == pid->iFactor && + this->pid->offset == pid->offset && this->pid->pFactor == pid->pFactor; +} + float Pid::getValue(float target, float input, float dTime) { float error = target - input; diff --git a/firmware/controllers/math/pid.h b/firmware/controllers/math/pid.h index 3df71065e9..abd876abfb 100644 --- a/firmware/controllers/math/pid.h +++ b/firmware/controllers/math/pid.h @@ -20,6 +20,7 @@ public: Pid(); Pid(pid_s *pid, float minResult, float maxResult); void init(pid_s *pid, float minResult, float maxResult); + bool isSame(pid_s *pid); float getValue(float target, float input, float dTime); void updateFactors(float pFactor, float iFactor, float dFactor);