From f0013f71b5e41607f02f56300f5e8647e25265ce Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Sun, 20 Mar 2022 06:28:17 -0700 Subject: [PATCH] limp mangaer handles more stuff (#3983) --- firmware/console/binary/output_channels.txt | 2 +- firmware/console/status_loop.cpp | 1 - firmware/controllers/algo/engine.cpp | 17 ----------------- firmware/controllers/algo/engine.h | 6 ------ .../engine_cycle/main_trigger_callback.cpp | 10 ---------- firmware/controllers/limp_manager.cpp | 17 +++++++++++++++++ firmware/controllers/limp_manager.h | 2 ++ 7 files changed, 20 insertions(+), 35 deletions(-) diff --git a/firmware/console/binary/output_channels.txt b/firmware/console/binary/output_channels.txt index d3f2597e79..81e59b21fb 100644 --- a/firmware/console/binary/output_channels.txt +++ b/firmware/console/binary/output_channels.txt @@ -6,7 +6,7 @@ bit sd_present bit isIgnitionEnabledIndicator; bit isInjectionEnabledIndicator; bit sd_logging_internal -bit isCylinderCleanupActivated; +bit unusedb4; bit isFuelPumpOn; bit isFanOn;"radiator fan" bit isO2HeaterOn; diff --git a/firmware/console/status_loop.cpp b/firmware/console/status_loop.cpp index a9fded1a58..39d4688c23 100644 --- a/firmware/console/status_loop.cpp +++ b/firmware/console/status_loop.cpp @@ -680,7 +680,6 @@ static void updateFlags() { engine->outputChannels.isO2HeaterOn = enginePins.o2heater.getLogicValue(); engine->outputChannels.isIgnitionEnabledIndicator = engine->limpManager.allowIgnition().value; engine->outputChannels.isInjectionEnabledIndicator = engine->limpManager.allowInjection().value; - engine->outputChannels.isCylinderCleanupActivated = engine->isCylinderCleanupMode; engine->outputChannels.dfcoActive = engine->module()->cutFuel(); #if EFI_LAUNCH_CONTROL diff --git a/firmware/controllers/algo/engine.cpp b/firmware/controllers/algo/engine.cpp index 3c809b8262..23b9cc1b35 100644 --- a/firmware/controllers/algo/engine.cpp +++ b/firmware/controllers/algo/engine.cpp @@ -182,21 +182,6 @@ void Engine::initializeTriggerWaveform() { #endif /* EFI_ENGINE_CONTROL && EFI_SHAFT_POSITION_INPUT */ } -static void cylinderCleanupControl() { -#if EFI_ENGINE_CONTROL - bool newValue; - if (engineConfiguration->isCylinderCleanupEnabled) { - newValue = !engine->rpmCalculator.isRunning() && Sensor::getOrZero(SensorType::DriverThrottleIntent) > CLEANUP_MODE_TPS; - } else { - newValue = false; - } - if (newValue != engine->isCylinderCleanupMode) { - engine->isCylinderCleanupMode = newValue; - efiPrintf("isCylinderCleanupMode %s", boolToString(newValue)); - } -#endif -} - #if ANALOG_HW_CHECK_MODE static void assertCloseTo(const char * msg, float actual, float expected) { if (actual < 0.75 * expected || actual > 1.25 * expected) { @@ -235,8 +220,6 @@ void Engine::periodicSlowCallback() { updateBoostControl(); #endif // EFI_BOOST_CONTROL - cylinderCleanupControl(); - standardAirCharge = getStandardAirCharge(); #if (BOARD_TLE8888_COUNT > 0) diff --git a/firmware/controllers/algo/engine.h b/firmware/controllers/algo/engine.h index 7d4f49368d..22a5855672 100644 --- a/firmware/controllers/algo/engine.h +++ b/firmware/controllers/algo/engine.h @@ -389,12 +389,6 @@ public: SensorsState sensors; efitick_t mainRelayBenchStartNt = 0; - /** - * This field is true if we are in 'cylinder cleanup' state right now - * see isCylinderCleanupEnabled - */ - bool isCylinderCleanupMode = false; - /** * value of 'triggerShape.getLength()' * pre-calculating this value is a performance optimization diff --git a/firmware/controllers/engine_cycle/main_trigger_callback.cpp b/firmware/controllers/engine_cycle/main_trigger_callback.cpp index 13f38fcfb8..6dd08f2f7c 100644 --- a/firmware/controllers/engine_cycle/main_trigger_callback.cpp +++ b/firmware/controllers/engine_cycle/main_trigger_callback.cpp @@ -292,16 +292,6 @@ static void handleFuel(const bool limitedFuel, uint32_t trgEventIndex, int rpm, if (limitedFuel) { return; } - if (engine->isCylinderCleanupMode) { - return; - } - - // If duty cycle is high, impose a fuel cut rev limiter. - // This is safer than attempting to limp along with injectors or a pump that are out of flow. - if (getInjectorDutyCycle(rpm) > 96.0f) { - warning(CUSTOM_OBD_63, "Injector Duty cycle cut"); - return; - } /** * Injection events are defined by addFuelEvents() according to selected diff --git a/firmware/controllers/limp_manager.cpp b/firmware/controllers/limp_manager.cpp index ac90a962b7..33f37aae9d 100644 --- a/firmware/controllers/limp_manager.cpp +++ b/firmware/controllers/limp_manager.cpp @@ -2,6 +2,10 @@ #include "limp_manager.h" +#include "fuel_math.h" + +#define CLEANUP_MODE_TPS 90 + void LimpManager::updateState(int rpm, efitick_t nowNt) { Clearable allowFuel = engineConfiguration->isInjectionEnabled; Clearable allowSpark = engineConfiguration->isIgnitionEnabled; @@ -68,6 +72,19 @@ void LimpManager::updateState(int rpm, efitick_t nowNt) { allowFuel.clear(ClearReason::StopRequested); } + // If duty cycle is high, impose a fuel cut rev limiter. + // This is safer than attempting to limp along with injectors or a pump that are out of flow. + if (getInjectorDutyCycle(rpm) > 96.0f) { + allowFuel.clear(ClearReason::InjectorDutyCycle); + } + + // If the pedal is pushed while not running, cut fuel to clear a flood condition. + if (!engine->rpmCalculator.isRunning() && + engineConfiguration->isCylinderCleanupEnabled && + Sensor::getOrZero(SensorType::DriverThrottleIntent) > CLEANUP_MODE_TPS) { + allowFuel.clear(ClearReason::FloodClear); + } + if (!engine->isMainRelayEnabled()) { /* todo AndreiKA this change breaks 22 unit tests? diff --git a/firmware/controllers/limp_manager.h b/firmware/controllers/limp_manager.h index f5577144a2..a52d968525 100644 --- a/firmware/controllers/limp_manager.h +++ b/firmware/controllers/limp_manager.h @@ -15,6 +15,8 @@ enum class ClearReason : uint8_t { StopRequested, // 7 EtbProblem, // 8 LaunchCut, // 9 + InjectorDutyCycle, + FloodClear, }; // Only allows clearing the value, but never resetting it.