From 29211ec5761d05c84d46141d02ef29cfe5a31f1b Mon Sep 17 00:00:00 2001 From: rusefillc Date: Fri, 17 Jan 2025 18:25:25 -0500 Subject: [PATCH] Fuel cut code 4: FaultRevLimit, What is the fault when no indicators are red? #7319 only:uaefi --- firmware/controllers/limp_manager.cpp | 13 ++++++++----- firmware/controllers/limp_manager.h | 10 ++++++---- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/firmware/controllers/limp_manager.cpp b/firmware/controllers/limp_manager.cpp index 28d41bdae2..33eb70a68d 100644 --- a/firmware/controllers/limp_manager.cpp +++ b/firmware/controllers/limp_manager.cpp @@ -113,7 +113,7 @@ void LimpManager::updateState(float rpm, efitick_t nowNt) { // Force fuel limiting on the fault rev limit if (rpm > m_faultRevLimit) { - allowFuel.clear(ClearReason::FaultRevLimit); + allowFuel.clear(m_rpmLimitReason); } // Limit fuel only on boost pressure (limiting spark bends valves) @@ -249,7 +249,7 @@ void LimpManager::onIgnitionStateChanged(bool ignitionOn) { void LimpManager::reportEtbProblem() { m_allowEtb.clear(ClearReason::EtbProblem); - setFaultRevLimit(/*rpm*/1500); + setFaultRevLimit(/*rpm*/1500, ClearReason::EtbFaultRevLimit); } void LimpManager::fatalError() { @@ -258,13 +258,16 @@ void LimpManager::fatalError() { m_allowInjection.clear(ClearReason::Fatal); m_allowTriggerInput.clear(ClearReason::Fatal); - setFaultRevLimit(/*rpm*/0); + setFaultRevLimit(/*rpm*/0, ClearReason::FatalErrorRevLimit); } -void LimpManager::setFaultRevLimit(int limit) { +void LimpManager::setFaultRevLimit(int limit, ClearReason rpmLimitReason) { // Only allow decreasing the limit // aka uses the limit of the worst fault to yet occur - m_faultRevLimit = minI(m_faultRevLimit, limit); + if (limit < m_faultRevLimit) { + m_faultRevLimit = limit; + m_rpmLimitReason = rpmLimitReason; + } } #if EFI_ELECTRONIC_THROTTLE_BODY diff --git a/firmware/controllers/limp_manager.h b/firmware/controllers/limp_manager.h index bcf3677821..51be518e3b 100644 --- a/firmware/controllers/limp_manager.h +++ b/firmware/controllers/limp_manager.h @@ -11,7 +11,7 @@ enum class ClearReason : uint8_t { Fatal, // 1 Settings, // 2 HardLimit, // 3 - FaultRevLimit, + EtbFaultRevLimit, // 4 means 1500 RPM limit in case of ETB fault BoostCut, // 5 OilPressure, // 6 StopRequested, // 7 @@ -25,8 +25,9 @@ enum class ClearReason : uint8_t { Lua, // 15 ACR, // 16 - Harley Automatic Compression Release LambdaProtection, // 17 - GdiComms, - PleaseBrake, + GdiComms, // 18 + PleaseBrake, // 19 + FatalErrorRevLimit, // 20 // Keep this list in sync with fuelIgnCutCodeList in tunerstudio.template.ini! // todo: add a code generator between ClearReason and fuelIgnCutCodeList in tunerstudio.template.ini @@ -114,7 +115,7 @@ public: Timer externalGdiCanBusComms; private: - void setFaultRevLimit(int limit); + void setFaultRevLimit(int limit, ClearReason rpmLimitReason); Hysteresis m_revLimitHysteresis; MaxLimitWithHysteresis<> m_boostCutHysteresis; @@ -141,6 +142,7 @@ private: // todo: migrate to engineState->desiredRpmLimit to get this variable logged float m_revLimit; + ClearReason m_rpmLimitReason = ClearReason::None; float resumeRpm; // Tracks how long since a cut (ignition or fuel) was active for any reason