diff --git a/firmware/controllers/trigger/spark_logic.cpp b/firmware/controllers/trigger/spark_logic.cpp index eb04c19c72..01f24e9c06 100644 --- a/firmware/controllers/trigger/spark_logic.cpp +++ b/firmware/controllers/trigger/spark_logic.cpp @@ -58,6 +58,18 @@ void turnSparkPinLow(IgnitionEvent *event) { void turnSparkPinHigh(IgnitionEvent *event) { IgnitionOutputPin *output = event->output; + +#if ! EFI_UNIT_TEST + if (engine->rpmCalculator.rpmValue > 2 * engineConfiguration->cranking.rpm) { + const char *outputName = output->name; + if (prevSparkName == outputName) { + warning(CUSTOM_OBD_SKIPPED_SPARK, "looks like skipped spark event %d %s", getRevolutionCounter(), outputName); + } + prevSparkName = outputName; + } +#endif /* EFI_UNIT_TEST */ + + #if SPARK_EXTREME_LOGGING || defined(__DOXYGEN__) scheduleMsg(logger, "spark goes high %d %s %d current=%d cnt=%d id=%d", getRevolutionCounter(), output->name, (int)getTimeNowUs(), output->currentLogicValue, output->outOfOrder, event->sparkId); @@ -120,15 +132,6 @@ static ALWAYS_INLINE void handleSparkEvent(bool limitedSpark, uint32_t trgEventI #endif /* FUEL_MATH_EXTREME_LOGGING */ - if (rpm > 2 * engineConfiguration->cranking.rpm) { - const char *outputName = iEvent->output->name; - if (prevSparkName == outputName) { - warning(CUSTOM_OBD_SKIPPED_SPARK, "looks like skipped spark event %d %s", getRevolutionCounter(), outputName); - } - prevSparkName = outputName; - } - - /** * Note how we do not check if spark is limited or not while scheduling 'spark down' * This way we make sure that coil dwell started while spark was enabled would fire and not burn diff --git a/unit_tests/engine_test_helper.cpp b/unit_tests/engine_test_helper.cpp index fa42eef3d2..c1824632c2 100644 --- a/unit_tests/engine_test_helper.cpp +++ b/unit_tests/engine_test_helper.cpp @@ -13,13 +13,18 @@ #include "accel_enrichment.h" #include "thermistors.h" #include "advance_map.h" +#include "event_queue.h" extern int timeNow; extern EnginePins enginePins; +extern EventQueue schedulingQueue; +extern int warningCounter; EngineTestHelper::EngineTestHelper(engine_type_e engineType) : engine (&persistentConfig) { ec = &persistentConfig.engineConfiguration; + warningCounter = 0; + schedulingQueue.clear(); enginePins.reset(); engineConfiguration = ec; diff --git a/unit_tests/main.cpp b/unit_tests/main.cpp index 356bb39439..09d130dc34 100644 --- a/unit_tests/main.cpp +++ b/unit_tests/main.cpp @@ -124,6 +124,7 @@ int getRevolutionCounter(void) { } int main(void) { + testMissedSpark299(); testSparkReverseOrderBug319(); testFuelSchedulerBug299smallAndLarge(); testFuelSchedulerBug299smallAndMedium(); @@ -178,7 +179,10 @@ int main(void) { return EXIT_SUCCESS; } +int warningCounter = 0; + bool warning(obd_code_e code, const char *format, ...) { + warningCounter++; printf("Warning: "); va_list ap; va_start(ap, format); diff --git a/unit_tests/test_trigger_decoder.cpp b/unit_tests/test_trigger_decoder.cpp index fd5de5c368..d9818530cb 100644 --- a/unit_tests/test_trigger_decoder.cpp +++ b/unit_tests/test_trigger_decoder.cpp @@ -34,7 +34,7 @@ extern int timeNow; extern float unitTestValue; extern float testMafValue; - +extern int warningCounter; extern bool printTriggerDebug; extern float actualSynchGap; @@ -1224,3 +1224,53 @@ void testSparkReverseOrderBug319(void) { schedulingQueue.executeAll(timeNow); assertEqualsM("out-of-order #8", 0, enginePins.coils[3].outOfOrder); } + +void testMissedSpark299(void) { + printf("*************************************************** testMissedSpark299\r\n"); + + EngineTestHelper eth(TEST_ENGINE); + EXPAND_EngineTestHelper + setTestBug299(ð); + engineConfiguration->isIgnitionEnabled = true; + engineConfiguration->isInjectionEnabled = false; + + assertEqualsM("warningCounter#0", 13, warningCounter); + + printf("*************************************************** testMissedSpark299 start\r\n"); + + setWholeTimingTable(0 PASS_ENGINE_PARAMETER); + eth.engine.periodicFastCallback(PASS_ENGINE_PARAMETER_F); + + + timeNow += MS2US(20); + eth.firePrimaryTriggerRise(); + schedulingQueue.executeAll(timeNow); + timeNow += MS2US(20); + eth.firePrimaryTriggerFall(); + schedulingQueue.executeAll(timeNow); + + timeNow += MS2US(20); + eth.firePrimaryTriggerRise(); + schedulingQueue.executeAll(timeNow); + timeNow += MS2US(20); + eth.firePrimaryTriggerFall(); + schedulingQueue.executeAll(timeNow); + + + setWholeTimingTable(40 PASS_ENGINE_PARAMETER); + eth.engine.periodicFastCallback(PASS_ENGINE_PARAMETER_F); + + timeNow += MS2US(20); + eth.firePrimaryTriggerRise(); + schedulingQueue.executeAll(timeNow); + timeNow += MS2US(20); + eth.firePrimaryTriggerFall(); + schedulingQueue.executeAll(timeNow); + + timeNow += MS2US(20); + eth.firePrimaryTriggerRise(); + schedulingQueue.executeAll(timeNow); + timeNow += MS2US(20); + eth.firePrimaryTriggerFall(); + schedulingQueue.executeAll(timeNow); +} diff --git a/unit_tests/test_trigger_decoder.h b/unit_tests/test_trigger_decoder.h index 6b5ccdbfbe..dca20ce1ec 100644 --- a/unit_tests/test_trigger_decoder.h +++ b/unit_tests/test_trigger_decoder.h @@ -12,6 +12,7 @@ void testTriggerDecoder(void); void testFuelSchedulerBug299smallAndMedium(void); void testFuelSchedulerBug299smallAndLarge(void); void testSparkReverseOrderBug319(void); +void testMissedSpark299(void); void testRpmCalculator(void); void testStartupFuelPumping(void); void test1995FordInline6TriggerDecoder(void);