diff --git a/firmware/controllers/algo/event_registry.h b/firmware/controllers/algo/event_registry.h index 1d2c126c29..e72f404b0f 100644 --- a/firmware/controllers/algo/event_registry.h +++ b/firmware/controllers/algo/event_registry.h @@ -45,6 +45,9 @@ public: // For single sparks, this should be zero. uint8_t sparksRemaining = 0; + // Track whether coil charge was intentionally skipped (spark limiter) + bool wasSparkLimited = false; + /** * Desired timing advance */ diff --git a/firmware/controllers/engine_cycle/spark_logic.cpp b/firmware/controllers/engine_cycle/spark_logic.cpp index b38d97cfaf..6ace63dc7d 100644 --- a/firmware/controllers/engine_cycle/spark_logic.cpp +++ b/firmware/controllers/engine_cycle/spark_logic.cpp @@ -53,7 +53,7 @@ static void fireSparkBySettingPinLow(IgnitionEvent *event, IgnitionOutputPin *ou output->signalFallSparkId = event->sparkId; - if (!output->currentLogicValue) { + if (!output->currentLogicValue && !event->wasSparkLimited) { warning(CUSTOM_OUT_OF_ORDER_COIL, "out-of-order coil off %s", output->getName()); output->outOfOrder = true; } @@ -340,6 +340,7 @@ static void scheduleSparkEvent(bool limitedSpark, IgnitionEvent *event, * By the way 32-bit value should hold at least 400 hours of events at 6K RPM x 12 events per revolution */ event->sparkId = engine->engineState.sparkCounter++; + event->wasSparkLimited = limitedSpark; efitick_t chargeTime = 0; diff --git a/firmware/init/sensor/init_sensors.cpp b/firmware/init/sensor/init_sensors.cpp index 53ed4abfb7..a02c2a882d 100644 --- a/firmware/init/sensor/init_sensors.cpp +++ b/firmware/init/sensor/init_sensors.cpp @@ -106,6 +106,11 @@ void initNewSensors() { Sensor::setMockValue(SensorType::BatteryVoltage, 10); } #endif + +#if EFI_SIMULATOR + // Simulator gets battery voltage so it detects ignition-on + Sensor::setMockValue(SensorType::BatteryVoltage, 14); +#endif // EFI_SIMULATOR } void stopSensors() { diff --git a/unit_tests/tests/trigger/test_real_nb2_cranking.cpp b/unit_tests/tests/trigger/test_real_nb2_cranking.cpp index 2a56209815..3eb356da05 100644 --- a/unit_tests/tests/trigger/test_real_nb2_cranking.cpp +++ b/unit_tests/tests/trigger/test_real_nb2_cranking.cpp @@ -28,10 +28,9 @@ TEST(realCrankingNB2, normalCranking) { ASSERT_EQ(876, round(Sensor::getOrZero(SensorType::Rpm))); - EXPECT_EQ(3, eth.recentWarnings()->getCount()); - EXPECT_EQ(CUSTOM_OUT_OF_ORDER_COIL, eth.recentWarnings()->get(0).Code); - EXPECT_EQ(CUSTOM_PRIMARY_NOT_ENOUGH_TEETH, eth.recentWarnings()->get(1).Code); - EXPECT_EQ(CUSTOM_CAM_TOO_MANY_TEETH, eth.recentWarnings()->get(2).Code); + EXPECT_EQ(2, eth.recentWarnings()->getCount()); + EXPECT_EQ(CUSTOM_PRIMARY_NOT_ENOUGH_TEETH, eth.recentWarnings()->get(0).Code); + EXPECT_EQ(CUSTOM_CAM_TOO_MANY_TEETH, eth.recentWarnings()->get(1).Code); } TEST(realCrankingNB2, crankingMissingInjector) { @@ -50,9 +49,8 @@ TEST(realCrankingNB2, crankingMissingInjector) { ASSERT_EQ(316, round(Sensor::getOrZero(SensorType::Rpm))); - EXPECT_EQ(4, eth.recentWarnings()->getCount()); - EXPECT_EQ(CUSTOM_OUT_OF_ORDER_COIL, eth.recentWarnings()->get(0).Code); - EXPECT_EQ(CUSTOM_PRIMARY_NOT_ENOUGH_TEETH, eth.recentWarnings()->get(1).Code); - EXPECT_EQ(CUSTOM_CAM_TOO_MANY_TEETH, eth.recentWarnings()->get(2).Code); - EXPECT_EQ(CUSTOM_PRIMARY_TOO_MANY_TEETH, eth.recentWarnings()->get(3).Code); + EXPECT_EQ(3, eth.recentWarnings()->getCount()); + EXPECT_EQ(CUSTOM_PRIMARY_NOT_ENOUGH_TEETH, eth.recentWarnings()->get(0).Code); + EXPECT_EQ(CUSTOM_CAM_TOO_MANY_TEETH, eth.recentWarnings()->get(1).Code); + EXPECT_EQ(CUSTOM_PRIMARY_TOO_MANY_TEETH, eth.recentWarnings()->get(2).Code); }