diff --git a/firmware/controllers/settings.cpp b/firmware/controllers/settings.cpp index a2bffa64e2..0f7cb86c28 100644 --- a/firmware/controllers/settings.cpp +++ b/firmware/controllers/settings.cpp @@ -895,6 +895,8 @@ static void enableOrDisable(const char *param, bool isEnabled) { engineConfiguration->verboseTriggerSynchDetails = isEnabled; } else if (strEqualCaseInsensitive(param, "vvt_details")) { engineConfiguration->verboseVVTDecoding = isEnabled; + } else if (strEqualCaseInsensitive(param, "invertCamVVTSignal")) { + engineConfiguration->invertCamVVTSignal = isEnabled; } else if (strEqualCaseInsensitive(param, CMD_IGNITION)) { engineConfiguration->isIgnitionEnabled = isEnabled; } else if (strEqualCaseInsensitive(param, CMD_SELF_STIMULATION)) { @@ -1077,6 +1079,8 @@ static void getValue(const char *paramStr) { scheduleMsg(&logger, "is_enabled_spi_3=%s", boolToString(engineConfiguration->is_enabled_spi_3)); } else if (strEqualCaseInsensitive(paramStr, "vvtCamSensorUseRise")) { scheduleMsg(&logger, "vvtCamSensorUseRise=%s", boolToString(engineConfiguration->vvtCamSensorUseRise)); + } else if (strEqualCaseInsensitive(paramStr, "invertCamVVTSignal")) { + scheduleMsg(&logger, "invertCamVVTSignal=%s", boolToString(engineConfiguration->invertCamVVTSignal)); } else if (strEqualCaseInsensitive(paramStr, "isHip9011Enabled")) { scheduleMsg(&logger, "isHip9011Enabled=%d", engineConfiguration->isHip9011Enabled); } diff --git a/firmware/hw_layer/digital_input/trigger/trigger_input_exti.cpp b/firmware/hw_layer/digital_input/trigger/trigger_input_exti.cpp index db89fd97e8..52835c62de 100644 --- a/firmware/hw_layer/digital_input/trigger/trigger_input_exti.cpp +++ b/firmware/hw_layer/digital_input/trigger/trigger_input_exti.cpp @@ -70,7 +70,7 @@ static void cam_callback(void *arg) { bool rise = (palReadLine(pal_line) == PAL_HIGH); - if (rise) { + if (rise ^ engineConfiguration->invertCamVVTSignal) { hwHandleVvtCamSignal(TV_RISE, stamp); } else { hwHandleVvtCamSignal(TV_FALL, stamp); diff --git a/firmware/hw_layer/digital_input/trigger/trigger_input_icu.cpp b/firmware/hw_layer/digital_input/trigger/trigger_input_icu.cpp index a8735c38fc..b3a5eaf517 100644 --- a/firmware/hw_layer/digital_input/trigger/trigger_input_icu.cpp +++ b/firmware/hw_layer/digital_input/trigger/trigger_input_icu.cpp @@ -38,7 +38,7 @@ static void vvtRisingCallback(void *) { LogTriggerTooth(SHAFT_SECONDARY_RISING, now); } #endif /* EFI_TOOTH_LOGGER */ - hwHandleVvtCamSignal(TV_RISE, now); + hwHandleVvtCamSignal(engineConfiguration->invertCamVVTSignal ? TV_FALL : TV_RISE, now); } static void vvtFallingCallback(void *) { @@ -51,7 +51,7 @@ static void vvtFallingCallback(void *) { LogTriggerTooth(SHAFT_SECONDARY_FALLING, now); } #endif /* EFI_TOOTH_LOGGER */ - hwHandleVvtCamSignal(TV_FALL, now); + hwHandleVvtCamSignal(engineConfiguration->invertCamVVTSignal ? TV_RISE : TV_FALL, now); } /** diff --git a/firmware/tunerstudio/rusefi.input b/firmware/tunerstudio/rusefi.input index 19f3d7ace1..969cfbf930 100644 --- a/firmware/tunerstudio/rusefi.input +++ b/firmware/tunerstudio/rusefi.input @@ -1607,6 +1607,7 @@ cmd_set_engine_type_default = "@@TS_IO_TEST_COMMAND_char@@\x00\x31\x00\x00" field = "Secondary channel", triggerInputPins2, { trigger_type != 0 && trigger_type != 8 && trigger_type != 9 && trigger_type != 18 && trigger_type != 20} field = "Invert Secondary", invertSecondaryTriggerSignal, { trigger_type != 0 && trigger_type != 8 && trigger_type != 9 && trigger_type != 18 && trigger_type != 20} field = "Cam Sync/VVT input", camInputs1 + field = "Invert Cam/VVT", invertCamVVTSignal panel = triggerInputComparator @@if_ts_show_trigger_comparator