diff --git a/firmware/controllers/limp_manager.cpp b/firmware/controllers/limp_manager.cpp index 3860788242..7b478d0275 100644 --- a/firmware/controllers/limp_manager.cpp +++ b/firmware/controllers/limp_manager.cpp @@ -48,7 +48,7 @@ void LimpManager::updateRevLimit(int rpm) { m_revLimitLow = m_revLimit - engineConfiguration->rpmHardLimitHyst; m_timingRetard = interpolateClamped(m_revLimitLow, 0, m_revLimit, engineConfiguration->rpmSoftLimitTimingRetard, rpm); - + percent_t fuelAdded = interpolateClamped(m_revLimitLow, 0, m_revLimit, engineConfiguration->rpmSoftLimitFuelAdded, rpm); m_fuelCorrection = 1.0f + fuelAdded / 100; } @@ -182,6 +182,11 @@ todo AndreiKA this change breaks 22 unit tests? m_transientAllowInjection = allowFuel; m_transientAllowIgnition = allowSpark; + + if (!m_transientAllowInjection || !m_transientAllowIgnition) { + // Tracks the last time any cut happened + m_lastCutTime.reset(nowNt); + } } void LimpManager::onIgnitionStateChanged(bool ignitionOn) { @@ -247,3 +252,7 @@ float LimpManager::getLimitingFuelCorrection() const { return 1.0f; // no correction return m_fuelCorrection; } + +float LimpManager::getTimeSinceAnyCut() const { + return m_lastCutTime.getElapsedSeconds(); +} diff --git a/firmware/controllers/limp_manager.h b/firmware/controllers/limp_manager.h index be9b3c9e1a..8773062067 100644 --- a/firmware/controllers/limp_manager.h +++ b/firmware/controllers/limp_manager.h @@ -111,6 +111,8 @@ public: LimpState allowInjection() const; LimpState allowIgnition() const; + float getTimeSinceAnyCut() const; + bool allowTriggerInput() const; void updateRevLimit(int rpm); @@ -150,6 +152,9 @@ private: // todo: migrate to engineState->desiredRpmLimit to get this variable logged float m_revLimit; float m_revLimitLow; + + // Tracks how long since a cut (ignition or fuel) was active for any reason + Timer m_lastCutTime; }; LimpManager * getLimpManager(); diff --git a/firmware/controllers/math/closed_loop_fuel.cpp b/firmware/controllers/math/closed_loop_fuel.cpp index 2d86ab7138..54ea92aa8e 100644 --- a/firmware/controllers/math/closed_loop_fuel.cpp +++ b/firmware/controllers/math/closed_loop_fuel.cpp @@ -93,6 +93,13 @@ bool shouldUpdateCorrection(SensorType sensor) { return false; } + // Pause if some other cut was active recently + auto timeSinceFuelCut = engine->module()->getTimeSinceAnyCut(); + // TODO: should duration this be configurable? + if (timeSinceFuelCut < 2) { + return false; + } + return true; }