From e79287f537f0831386986f852ba5b38e068ba139 Mon Sep 17 00:00:00 2001 From: rusefi Date: Sun, 8 Sep 2019 21:05:03 -0400 Subject: [PATCH] Delayed A/C compressor switch #922 --- firmware/config/engines/mazda_miata_1_6.cpp | 2 +- firmware/controllers/actuators/idle_thread.cpp | 7 ++++++- firmware/controllers/algo/engine.h | 4 ++++ firmware/controllers/core/fsio_core.h | 3 ++- firmware/controllers/core/fsio_impl.cpp | 3 +++ firmware/util/efitime.h | 1 + 6 files changed, 17 insertions(+), 3 deletions(-) diff --git a/firmware/config/engines/mazda_miata_1_6.cpp b/firmware/config/engines/mazda_miata_1_6.cpp index 2102fecc23..da3b69feff 100644 --- a/firmware/config/engines/mazda_miata_1_6.cpp +++ b/firmware/config/engines/mazda_miata_1_6.cpp @@ -280,7 +280,7 @@ void setMiataNA6_MAP_Frankenso(DECLARE_CONFIG_PARAMETER_SIGNATURE) { // W57 PE3 A/C compressor relay out boardConfiguration->acRelayPin = GPIOE_3; // W58 PE4 A/C fan relay out -#endif +#endif /* EFI_UNIT_TEST */ miataNAcommon(PASS_CONFIG_PARAMETER_SIGNATURE); } diff --git a/firmware/controllers/actuators/idle_thread.cpp b/firmware/controllers/actuators/idle_thread.cpp index 755b439e19..3ae6913b7d 100644 --- a/firmware/controllers/actuators/idle_thread.cpp +++ b/firmware/controllers/actuators/idle_thread.cpp @@ -316,7 +316,12 @@ public: engine->clutchDownState = efiReadPin(CONFIGB(clutchDownPin)); } if (hasAcToggle(PASS_ENGINE_PARAMETER_SIGNATURE)) { - engine->acSwitchState = getAcToggle(PASS_ENGINE_PARAMETER_SIGNATURE); + bool result = getAcToggle(PASS_ENGINE_PARAMETER_SIGNATURE); + if (engine->acSwitchState != result) { + engine->acSwitchState = result; + engine->acSwitchLastChangeTime = getTimeNowUs(); + } + engine->acSwitchState = result; } if (CONFIGB(clutchUpPin) != GPIO_UNASSIGNED) { engine->clutchUpState = efiReadPin(CONFIGB(clutchUpPin)); diff --git a/firmware/controllers/algo/engine.h b/firmware/controllers/algo/engine.h index ec236eacfb..17c66c71dc 100644 --- a/firmware/controllers/algo/engine.h +++ b/firmware/controllers/algo/engine.h @@ -80,6 +80,7 @@ public: operation_mode_e getOperationMode(DECLARE_ENGINE_PARAMETER_SIGNATURE); + int globalSparkIdCoutner = 0; #if !EFI_PROD_CODE @@ -205,7 +206,10 @@ public: bool clutchUpState = false; bool clutchDownState = false; bool brakePedalState = false; + + // todo: extract some helper which would contain boolean state and most recent toggle time? bool acSwitchState = false; + efitimeus_t acSwitchLastChangeTime = 0; bool isRunningPwmTest = false; diff --git a/firmware/controllers/core/fsio_core.h b/firmware/controllers/core/fsio_core.h index dc29a2e99c..e3d2a9c372 100644 --- a/firmware/controllers/core/fsio_core.h +++ b/firmware/controllers/core/fsio_core.h @@ -44,7 +44,7 @@ typedef enum { LE_METHOD_INTAKE_AIR = 108, LE_METHOD_VBATT = 109, LE_METHOD_AC_TOGGLE = 110, - LE_METHOD_FSIO_SETTING = 111, + LE_METHOD_TIME_SINCE_AC_TOGGLE = 111, LE_METHOD_KNOCK = 112, LE_METHOD_FSIO_TABLE = 113, LE_METHOD_SELF = 114, @@ -57,6 +57,7 @@ typedef enum { LE_METHOD_STARTUP_FUEL_PUMP_DURATION = 121, LE_METHOD_IN_SHUTDOWN = 122, LE_METHOD_FSIO_DIGITAL_INPUT = 123, + LE_METHOD_FSIO_SETTING = 124, Force_4b_le_action = ENUM_32_BITS, diff --git a/firmware/controllers/core/fsio_impl.cpp b/firmware/controllers/core/fsio_impl.cpp index 8f0ed84c98..8e67047cf9 100644 --- a/firmware/controllers/core/fsio_impl.cpp +++ b/firmware/controllers/core/fsio_impl.cpp @@ -51,6 +51,7 @@ static LENameOrdinalPair leFan(LE_METHOD_FAN, "fan"); static LENameOrdinalPair leCoolant(LE_METHOD_COOLANT, "coolant"); static LENameOrdinalPair leIsCoolantBroken(LE_METHOD_IS_COOLANT_BROKEN, "is_clt_broken"); static LENameOrdinalPair leAcToggle(LE_METHOD_AC_TOGGLE, "ac_on_switch"); +static LENameOrdinalPair leAcToggle(LE_METHOD_TIME_SINCE_AC_TOGGLE, "time_since_ac_on_switch"); static LENameOrdinalPair leFanOnSetting(LE_METHOD_FAN_ON_SETTING, "fan_on_setting"); static LENameOrdinalPair leFanOffSetting(LE_METHOD_FAN_OFF_SETTING, "fan_off_setting"); static LENameOrdinalPair leTimeSinceBoot(LE_METHOD_TIME_SINCE_BOOT, "time_since_boot"); @@ -113,6 +114,8 @@ float getEngineValue(le_action_e action DECLARE_ENGINE_PARAMETER_SUFFIX) { switch (action) { case LE_METHOD_FAN: return enginePins.fanRelay.getLogicValue(); + case LE_METHOD_TIME_SINCE_AC_TOGGLE: + return (getTimeNowUs() - engine->acSwitchLastChangeTime) / US_PER_SECOND_F; case LE_METHOD_AC_TOGGLE: return getAcToggle(PASS_ENGINE_PARAMETER_SIGNATURE); case LE_METHOD_COOLANT: diff --git a/firmware/util/efitime.h b/firmware/util/efitime.h index d76b7b02fb..fe0f7597c4 100644 --- a/firmware/util/efitime.h +++ b/firmware/util/efitime.h @@ -14,6 +14,7 @@ #include "rusefi_types.h" #define US_PER_SECOND 1000000 +#define US_PER_SECOND_F 1000000.0 #define US_PER_SECOND_LL 1000000LL #define MS2US(MS_TIME) ((MS_TIME) * 1000)