From 812c61903ae5fd005232344c329c9d7f043fe64b Mon Sep 17 00:00:00 2001 From: rusefi Date: Sat, 11 May 2019 00:21:37 -0400 Subject: [PATCH] BUG: phase sensor validation attending - detect missing CAM signal fix #659 --- firmware/controllers/engine_controller.cpp | 2 +- .../trigger/main_trigger_callback.cpp | 3 +++ .../controllers/trigger/trigger_central.cpp | 1 + .../controllers/trigger/trigger_decoder.cpp | 11 +++++++++++ firmware/controllers/trigger/trigger_decoder.h | 3 ++- unit_tests/tests/test_cam_vtt_input.cpp | 18 +++++++++--------- 6 files changed, 27 insertions(+), 11 deletions(-) diff --git a/firmware/controllers/engine_controller.cpp b/firmware/controllers/engine_controller.cpp index 2beef48503..21b10e15cb 100644 --- a/firmware/controllers/engine_controller.cpp +++ b/firmware/controllers/engine_controller.cpp @@ -807,6 +807,6 @@ int getRusEfiVersion(void) { if (initBootloader() != 0) return 123; #endif /* EFI_BOOTLOADER_INCLUDE_CODE */ - return 20190509; + return 20190510; } #endif /* EFI_UNIT_TEST */ diff --git a/firmware/controllers/trigger/main_trigger_callback.cpp b/firmware/controllers/trigger/main_trigger_callback.cpp index 03f3553a91..6c676fedc3 100644 --- a/firmware/controllers/trigger/main_trigger_callback.cpp +++ b/firmware/controllers/trigger/main_trigger_callback.cpp @@ -496,6 +496,9 @@ void mainTriggerCallback(trigger_event_e ckpSignalType, uint32_t trgEventIndex D #endif if (trgEventIndex == 0) { + if (HAVE_CAM_INPUT()) { + engine->triggerCentral.triggerState.validateCamVvtCounters(); + } if (checkIfTriggerConfigChanged(PASS_ENGINE_PARAMETER_SIGNATURE)) { engine->ignitionEvents.isReady = false; // we need to rebuild ignition schedule diff --git a/firmware/controllers/trigger/trigger_central.cpp b/firmware/controllers/trigger/trigger_central.cpp index c44bf4e1b7..e023e2da43 100644 --- a/firmware/controllers/trigger/trigger_central.cpp +++ b/firmware/controllers/trigger/trigger_central.cpp @@ -99,6 +99,7 @@ void hwHandleVvtCamSignal(trigger_value_e front DECLARE_ENGINE_PARAMETER_SUFFIX) } TriggerCentral *tc = &engine->triggerCentral; + tc->triggerState.vvtCamCounter++; efitick_t nowNt = getTimeNowNt(); diff --git a/firmware/controllers/trigger/trigger_decoder.cpp b/firmware/controllers/trigger/trigger_decoder.cpp index 71ea488bbe..ba8124f2a9 100644 --- a/firmware/controllers/trigger/trigger_decoder.cpp +++ b/firmware/controllers/trigger/trigger_decoder.cpp @@ -293,6 +293,17 @@ int TriggerState::getCurrentIndex() const { return currentCycle.current_index; } +void TriggerState::validateCamVvtCounters() { + // micro-optimized 'totalRevolutionCounter % 256' + int camVvtValidationIndex = totalRevolutionCounter & 0xFF; + if (camVvtValidationIndex == 0) { + vvtCamCounter = 0; + } else if (camVvtValidationIndex == 0xFE && vvtCamCounter < 60) { + // magic logic: we expect at least 60 CAM/VVT events for each 256 trigger cycles, otherwise throw a code + warning(OBD_Camshaft_Position_Sensor_Circuit_Range_Performance, "no CAM signals"); + } +} + void TriggerState::incrementTotalEventCounter() { totalRevolutionCounter++; } diff --git a/firmware/controllers/trigger/trigger_decoder.h b/firmware/controllers/trigger/trigger_decoder.h index 9c5677cf77..65b7b1b431 100644 --- a/firmware/controllers/trigger/trigger_decoder.h +++ b/firmware/controllers/trigger/trigger_decoder.h @@ -56,6 +56,7 @@ public: * this is important for crank-based virtual trigger and VVT magic */ bool isEvenRevolution() const; + void validateCamVvtCounters(); void incrementTotalEventCounter(); efitime_t getTotalEventCounter() const; efitime_t getStartOfRevolutionIndex() const; @@ -109,6 +110,7 @@ public: * for virtual double trigger see timeAtVirtualZeroNt */ efitick_t startOfCycleNt; + int vvtCamCounter = 0; private: void resetCurrentCycleState(); @@ -117,7 +119,6 @@ private: efitime_t totalEventCountBase; uint32_t totalRevolutionCounter; bool isFirstEvent; - }; // we only need 90 degrees of events so /4 or maybe even /8 should work? diff --git a/unit_tests/tests/test_cam_vtt_input.cpp b/unit_tests/tests/test_cam_vtt_input.cpp index 1972dfb49d..6e33555509 100644 --- a/unit_tests/tests/test_cam_vtt_input.cpp +++ b/unit_tests/tests/test_cam_vtt_input.cpp @@ -88,25 +88,25 @@ TEST(sensors, testCamInput) { ASSERT_EQ( 0, GET_RPM()) << "testCamInput RPM"; - eth.fireRise(50); - eth.fireRise(50); - eth.fireRise(50); - eth.fireRise(50); - eth.fireRise(50); + for (int i = 0; i < 5;i++) { + eth.fireRise(50); + } ASSERT_EQ(1200, GET_RPM()) << "testCamInput RPM"; ASSERT_EQ(0, unitTestWarningCodeState.recentWarnings.getCount()) << "warningCounter#testCamInput"; - for (int i = 0; i < 50;i++) { + for (int i = 0; i < 600;i++) { eth.fireRise(50); } - ASSERT_EQ(0, unitTestWarningCodeState.recentWarnings.getCount()) << "warningCounter#testCamInput #2"; + ASSERT_EQ(1, unitTestWarningCodeState.recentWarnings.getCount()) << "warningCounter#testCamInput #2"; + ASSERT_EQ(OBD_Camshaft_Position_Sensor_Circuit_Range_Performance, unitTestWarningCodeState.recentWarnings.get(0)) << "@0"; + unitTestWarningCodeState.recentWarnings.clear(); - for (int i = 0; i < 50;i++) { + for (int i = 0; i < 600;i++) { eth.fireRise(50); + hwHandleVvtCamSignal(TV_FALL PASS_ENGINE_PARAMETER_SUFFIX); } - ASSERT_EQ(0, unitTestWarningCodeState.recentWarnings.getCount()) << "warningCounter#testCamInput #3"; }