diff --git a/firmware/controllers/algo/engine.h b/firmware/controllers/algo/engine.h index 6a58816a7f..fc361bd071 100644 --- a/firmware/controllers/algo/engine.h +++ b/firmware/controllers/algo/engine.h @@ -80,6 +80,7 @@ public: explicit Engine(persistent_config_s *config); Engine(); bool isPwmEnabled = true; + int triggerActivitySecond = 0; IEtbController *etbControllers[ETB_COUNT] = {nullptr}; IFuelComputer *fuelComputer = nullptr; diff --git a/firmware/controllers/core/fsio_core.h b/firmware/controllers/core/fsio_core.h index fa6e666b8e..495c44e422 100644 --- a/firmware/controllers/core/fsio_core.h +++ b/firmware/controllers/core/fsio_core.h @@ -56,6 +56,7 @@ typedef enum { LE_METHOD_FSIO_DIGITAL_INPUT = 123, LE_METHOD_FSIO_SETTING = 124, LE_METHOD_PPS = 125, + LE_METHOD_TIME_SINCE_TRIGGER_EVENT = 126, #include "fsio_enums_generated.def" diff --git a/firmware/controllers/core/fsio_impl.cpp b/firmware/controllers/core/fsio_impl.cpp index 5f55750bcf..9d11357b38 100644 --- a/firmware/controllers/core/fsio_impl.cpp +++ b/firmware/controllers/core/fsio_impl.cpp @@ -139,6 +139,7 @@ FsioValue getEngineValue(le_action_e action DECLARE_ENGINE_PARAMETER_SUFFIX) { case LE_METHOD_EXHAUST_VVT: return engine->triggerCentral.getVVTPosition(); #endif + case LE_METHOD_TIME_SINCE_TRIGGER_EVENT: case LE_METHOD_TIME_SINCE_BOOT: #if EFI_MAIN_RELAY_CONTROL // in main relay control mode, we return the number of seconds since the ignition is turned on @@ -781,7 +782,7 @@ void runHardcodedFsio(DECLARE_ENGINE_PARAMETER_SIGNATURE) { } // see FUEL_PUMP_LOGIC if (CONFIG(fuelPumpPin) != GPIO_UNASSIGNED) { - enginePins.fuelPumpRelay.setValue((getTimeNowSeconds() < engineConfiguration->startUpFuelPumpDuration) || (engine->rpmCalculator.getRpm() > 0)); + enginePins.fuelPumpRelay.setValue((getTimeNowSeconds() < engine->triggerActivitySecond + engineConfiguration->startUpFuelPumpDuration) || (engine->rpmCalculator.getRpm() > 0)); } enginePins.o2heater.setValue(engine->rpmCalculator.isRunning()); diff --git a/firmware/controllers/engine_cycle/main_trigger_callback.cpp b/firmware/controllers/engine_cycle/main_trigger_callback.cpp index 9a7cc8d48c..a06747e54a 100644 --- a/firmware/controllers/engine_cycle/main_trigger_callback.cpp +++ b/firmware/controllers/engine_cycle/main_trigger_callback.cpp @@ -406,6 +406,14 @@ void mainTriggerCallback(uint32_t trgEventIndex, efitick_t edgeTimestamp DECLARE int rpm = GET_RPM(); if (rpm == 0) { // this happens while we just start cranking + /** + * While we have start-up priming pulse, we also want to start pumping fuel again as soon as possible. + * Hopefully battery would handle both cranking and fuel pump simultaneously? + */ + enginePins.fuelPumpRelay.setValue(true); // quickly set pin right from the callback here! todo: would it work OK for smart SPI pin?! +#if EFI_PROD_CODE + engine->triggerActivitySecond = getTimeNowSeconds(); +#endif // todo: check for 'trigger->is_synchnonized?' // TODO: add 'pin shutdown' invocation somewhere - coils might be still open here! return; diff --git a/firmware/controllers/system_fsio.txt b/firmware/controllers/system_fsio.txt index 092e612f28..c412cade89 100644 --- a/firmware/controllers/system_fsio.txt +++ b/firmware/controllers/system_fsio.txt @@ -13,6 +13,11 @@ # (self and (coolant > fan_off_setting)) | (coolant > fan_on_setting) | is_clt_broken FAN_CONTROL_LOGIC=(fan and (coolant > cfg_fanOffTemperature)) | (coolant > cfg_fanOnTemperature) | is_clt_broken +# +# todo: we might have a bug here? +# todo: 'time_since_boot' means 'getTimeIgnitionSeconds' in case of EFI_MAIN_RELAY_CONTROL like Proteus +# and it's negative if ignition is off? does Proteus not get fuel pump start-up priming pulse?! +# FUEL_PUMP_LOGIC=((time_since_boot >= 0) & (time_since_boot < startup_fuel_pump_duration)) | (rpm > 0) ALTERNATOR_LOGIC=vbatt < 14.5