From dc52d039e75c8ad046eec3959b2d5aa95a492016 Mon Sep 17 00:00:00 2001 From: rusefi Date: Tue, 31 Mar 2020 01:06:19 -0400 Subject: [PATCH] start/stop progress --- firmware/controllers/engine_controller.cpp | 32 ++++++++++++++++------ firmware/controllers/system/efi_gpio.cpp | 8 +++++- firmware/controllers/system/efi_gpio.h | 1 + 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/firmware/controllers/engine_controller.cpp b/firmware/controllers/engine_controller.cpp index 7ba2270953..4a585ed831 100644 --- a/firmware/controllers/engine_controller.cpp +++ b/firmware/controllers/engine_controller.cpp @@ -257,10 +257,15 @@ void onStartStopButtonToggle(DECLARE_ENGINE_PARAMETER_SIGNATURE) { if (engine->rpmCalculator.isStopped(PASS_ENGINE_PARAMETER_SIGNATURE)) { engine->startStopStateLastPushTime = getTimeNowNt(); - } else if (engine->rpmCalculator.isRunning(PASS_ENGINE_PARAMETER_SIGNATURE)) { - // todo: request engine stop here - } + bool wasStarterEngaged = enginePins.starterControl.getAndSet(1); + if (!wasStarterEngaged) { + scheduleMsg(&logger, "Let's crank this engine!"); + } + } else if (engine->rpmCalculator.isRunning(PASS_ENGINE_PARAMETER_SIGNATURE)) { + scheduleMsg(&logger, "Let's stop this engine!"); + scheduleStopEngine(); + } } static void slowStartStopButtonCallback(DECLARE_ENGINE_PARAMETER_SIGNATURE) { @@ -276,16 +281,27 @@ static void slowStartStopButtonCallback(DECLARE_ENGINE_PARAMETER_SIGNATURE) { #endif /* EFI_PROD_CODE */ } + if (engine->startStopStateLastPushTime == 0) { + // nothing is going on with startStop button + return; + } + + // todo: should this be simply FSIO? if (engine->rpmCalculator.isRunning(PASS_ENGINE_PARAMETER_SIGNATURE)) { // turn starter off once engine is running - enginePins.starterControl.setValue(0); + bool wasStarterEngaged = enginePins.starterControl.getAndSet(0); + if (wasStarterEngaged) { + scheduleMsg(&logger, "Engine runs we can disengage the starter"); + } engine->startStopStateLastPushTime = 0; } - if (engine->startStopStateLastPushTime != 0 && - getTimeNowNt() - engine->startStopStateLastPushTime > NT_PER_SECOND * CONFIG(startCrankingDuration)) { - enginePins.starterControl.setValue(0); + if (getTimeNowNt() - engine->startStopStateLastPushTime > NT_PER_SECOND * CONFIG(startCrankingDuration)) { + bool wasStarterEngaged = enginePins.starterControl.getAndSet(0); + if (wasStarterEngaged) { + scheduleMsg(&logger, "Cranking timeout"); + } engine->startStopStateLastPushTime = 0; } } @@ -744,6 +760,6 @@ int getRusEfiVersion(void) { if (initBootloader() != 0) return 123; #endif /* EFI_BOOTLOADER_INCLUDE_CODE */ - return 20200330; + return 20200331; } #endif /* EFI_UNIT_TEST */ diff --git a/firmware/controllers/system/efi_gpio.cpp b/firmware/controllers/system/efi_gpio.cpp index 8c79a6bf3c..6f2a71f1ad 100644 --- a/firmware/controllers/system/efi_gpio.cpp +++ b/firmware/controllers/system/efi_gpio.cpp @@ -320,8 +320,14 @@ bool OutputPin::isInitialized() { void OutputPin::toggle() { setValue(!getLogicValue()); - } + +bool OutputPin::getAndSet(int logicValue) { + bool oldValue = currentLogicValue; + setValue(logicValue); + return oldValue; +} + void OutputPin::setValue(int logicValue) { ScopePerf perf(PE::OutputPinSetValue); diff --git a/firmware/controllers/system/efi_gpio.h b/firmware/controllers/system/efi_gpio.h index dc756d0820..09a10db6e7 100644 --- a/firmware/controllers/system/efi_gpio.h +++ b/firmware/controllers/system/efi_gpio.h @@ -45,6 +45,7 @@ public: bool isInitialized(); + bool getAndSet(int logicValue); void setValue(int logicValue); void toggle(); bool getLogicValue() const;