From e4d31bafb77a85865e86263f7e34beb103211e84 Mon Sep 17 00:00:00 2001 From: rusefi Date: Sun, 17 Nov 2019 09:32:12 -0500 Subject: [PATCH] v12 done right --- firmware/config/engines/bmw_m73.cpp | 9 ++-- firmware/controllers/trigger/spark_logic.cpp | 2 +- firmware/controllers/trigger/spark_logic.h | 1 + unit_tests/tests/test_ignition_scheduling.cpp | 43 +++++++++++++++++++ unit_tests/tests/tests.mk | 1 + 5 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 unit_tests/tests/test_ignition_scheduling.cpp diff --git a/firmware/config/engines/bmw_m73.cpp b/firmware/config/engines/bmw_m73.cpp index 81ec818ac3..e18029c701 100644 --- a/firmware/config/engines/bmw_m73.cpp +++ b/firmware/config/engines/bmw_m73.cpp @@ -81,10 +81,11 @@ void setEngineBMW_M73(DECLARE_CONFIG_PARAMETER_SIGNATURE) { engineConfiguration->ignitionMode = IM_TWO_COILS; - boardConfiguration->ignitionPins[0] = GPIOE_14; // Frankenso high side - pin 1G - boardConfiguration->ignitionPins[1] = GPIO_UNASSIGNED; - boardConfiguration->ignitionPins[2] = GPIOC_7; // Frankenso high side - pin 1H - boardConfiguration->ignitionPins[3] = GPIO_UNASSIGNED; + boardConfiguration->ignitionPins[ID2INDEX(1)] = GPIOE_14; // Frankenso high side - pin 1G + boardConfiguration->ignitionPins[ID2INDEX(2)] = GPIO_UNASSIGNED; + boardConfiguration->ignitionPins[ID2INDEX(3)] = GPIO_UNASSIGNED; + boardConfiguration->ignitionPins[ID2INDEX(4)] = GPIO_UNASSIGNED; + boardConfiguration->ignitionPins[ID2INDEX(7)] = GPIOC_7; // Frankenso high side - pin 1H boardConfiguration->injectionPins[0] = GPIOB_8; diff --git a/firmware/controllers/trigger/spark_logic.cpp b/firmware/controllers/trigger/spark_logic.cpp index e11196e19d..7250d2d4a8 100644 --- a/firmware/controllers/trigger/spark_logic.cpp +++ b/firmware/controllers/trigger/spark_logic.cpp @@ -326,7 +326,7 @@ static ALWAYS_INLINE void handleSparkEvent(bool limitedSpark, uint32_t trgEventI } } -static void initializeIgnitionActions(DECLARE_ENGINE_PARAMETER_SIGNATURE) { +void initializeIgnitionActions(DECLARE_ENGINE_PARAMETER_SIGNATURE) { IgnitionEventList *list = &engine->ignitionEvents; angle_t dwellAngle = ENGINE(engineState.dwellAngle); floatms_t sparkDwell = ENGINE(engineState.sparkDwell); diff --git a/firmware/controllers/trigger/spark_logic.h b/firmware/controllers/trigger/spark_logic.h index 81e15aec4f..818855aee9 100644 --- a/firmware/controllers/trigger/spark_logic.h +++ b/firmware/controllers/trigger/spark_logic.h @@ -17,5 +17,6 @@ void turnSparkPinHigh(IgnitionEvent *event); void fireSparkAndPrepareNextSchedule(IgnitionEvent *event); int getNumberOfSparks(ignition_mode_e mode DECLARE_ENGINE_PARAMETER_SUFFIX); percent_t getCoilDutyCycle(int rpm DECLARE_ENGINE_PARAMETER_SUFFIX); +void initializeIgnitionActions(DECLARE_ENGINE_PARAMETER_SIGNATURE); #endif /* CONTROLLERS_TRIGGER_SPARK_LOGIC_H_ */ diff --git a/unit_tests/tests/test_ignition_scheduling.cpp b/unit_tests/tests/test_ignition_scheduling.cpp new file mode 100644 index 0000000000..54debf056f --- /dev/null +++ b/unit_tests/tests/test_ignition_scheduling.cpp @@ -0,0 +1,43 @@ +/* + * @file test_ignition_scheduling.cpp + * + * @date Nov 17, 2019 + * @author Andrey Belomutskiy, (c) 2012-2019 + */ + +#include "engine_test_helper.h" +#include "spark_logic.h" + +extern EnginePins enginePins; + +TEST(ignition, twoCoils) { + WITH_ENGINE_TEST_HELPER(BMW_M73); + + // first one to fire uses first coil + ASSERT_EQ(ENGINE(ignitionPin[ID2INDEX(1)]), 0); + ASSERT_EQ(ENGINE(ignitionPin[ID2INDEX(2)]), 1); + ASSERT_EQ(ENGINE(ignitionPin[ID2INDEX(3)]), 0); + ASSERT_EQ(ENGINE(ignitionPin[ID2INDEX(4)]), 1); + + ASSERT_EQ(ENGINE(ignitionPin[ID2INDEX(11)]), 0); + ASSERT_EQ(ENGINE(ignitionPin[ID2INDEX(12)]), 1); + + // let's recalculate with zero timing so that we can focus on relation advance between cylinders + engine->engineState.timingAdvance = 0; + initializeIgnitionActions(PASS_ENGINE_PARAMETER_SIGNATURE); + + ASSERT_EQ(engine->ignitionEvents.elements[0].advance, 0); + ASSERT_EQ((void*)engine->ignitionEvents.elements[0].outputs[0], (void*)&enginePins.coils[0]); + + + ASSERT_EQ(engine->ignitionEvents.elements[1].advance, 720 / 12); + ASSERT_EQ((void*)engine->ignitionEvents.elements[1].outputs[0], (void*)&enginePins.coils[6]); + + ASSERT_EQ(engine->ignitionEvents.elements[3].advance, 3 * 720 / 12); + ASSERT_EQ((void*)engine->ignitionEvents.elements[3].outputs[0], (void*)&enginePins.coils[6]); + + +} + + + diff --git a/unit_tests/tests/tests.mk b/unit_tests/tests/tests.mk index 6eece7e57c..c7b3e3866d 100644 --- a/unit_tests/tests/tests.mk +++ b/unit_tests/tests/tests.mk @@ -14,6 +14,7 @@ TESTS_SRC_CPP = \ tests/test_trigger_decoder.cpp \ tests/test_trigger_noiseless.cpp \ tests/test_issue_898.cpp \ + tests/test_ignition_scheduling.cpp \ tests/test_fuel_map.cpp \ tests/test_fuel_wall_wetting.cpp \ tests/test_one_cylinder_logic.cpp \