diff --git a/firmware/config/engines/custom_engine.h b/firmware/config/engines/custom_engine.h index 71f537d77f..c658573c09 100644 --- a/firmware/config/engines/custom_engine.h +++ b/firmware/config/engines/custom_engine.h @@ -32,7 +32,6 @@ void fuelBenchMode(); void proteusBoardTest(); void proteusLuaDemo(); void proteusStimQc(); -void setHarley(); void proteusDcWastegateTest(); void setTest33816EngineConfiguration(); diff --git a/firmware/config/engines/harley.cpp b/firmware/config/engines/harley.cpp index f36c41fb07..aca0e13b67 100644 --- a/firmware/config/engines/harley.cpp +++ b/firmware/config/engines/harley.cpp @@ -1,6 +1,7 @@ #include "pch.h" #include "proteus_meta.h" #include "harley_canned.cpp" +#include "harley.h" static void harleyEngine() { engineConfiguration->cylindersCount = 2; @@ -30,8 +31,8 @@ void setHarley() { engineConfiguration->enableAemXSeries = true; // total 45 degree odd fire, split across two cylinders mostly for fun - engineConfiguration->timing_offset_cylinder[0] = 45.0 / 2; - engineConfiguration->timing_offset_cylinder[1] = -45.0 / 2; + engineConfiguration->timing_offset_cylinder[0] = HARLEY_V_TWIN / 2; + engineConfiguration->timing_offset_cylinder[1] = -HARLEY_V_TWIN / 2; // work-around for https://github.com/rusefi/rusefi/issues/5894 todo: fix it! engineConfiguration->maximumIgnitionTiming = 90; diff --git a/firmware/config/engines/harley.h b/firmware/config/engines/harley.h new file mode 100644 index 0000000000..2a39a8aeba --- /dev/null +++ b/firmware/config/engines/harley.h @@ -0,0 +1,3 @@ +#define HARLEY_V_TWIN 45.0 + +void setHarley(); diff --git a/firmware/controllers/algo/engine_configuration.cpp b/firmware/controllers/algo/engine_configuration.cpp index 929b920e91..ce47fc5594 100644 --- a/firmware/controllers/algo/engine_configuration.cpp +++ b/firmware/controllers/algo/engine_configuration.cpp @@ -73,6 +73,7 @@ #include "slingshot.h" #include "test_engine.h" #include "sachs.h" +#include "harley.h" #include "vw.h" #include "vw_b6.h" #include "toyota_jz.h" diff --git a/unit_tests/tests/ignition_injection/test_odd_firing_engine.cpp b/unit_tests/tests/ignition_injection/test_odd_firing_engine.cpp index 87615aed61..4a62958b5d 100644 --- a/unit_tests/tests/ignition_injection/test_odd_firing_engine.cpp +++ b/unit_tests/tests/ignition_injection/test_odd_firing_engine.cpp @@ -1,5 +1,38 @@ #include "pch.h" +#include "spark_logic.h" +#include "harley.h" TEST(OddFire, hd) { + EngineTestHelper eth(engine_type_e::HARLEY); + engineConfiguration->cranking.rpm = 100; + float cylinderOne = 19; + float cylinderTwo = 13; + engineConfiguration->timing_offset_cylinder[0] = cylinderOne; + engineConfiguration->timing_offset_cylinder[1] = -cylinderTwo; + angle_t timing = 1; + setTable(config->ignitionTable, timing); + engineConfiguration->crankingTimingAngle = timing; + engine->tdcMarkEnabled = false; + engineConfiguration->camInputs[0] = Gpio::Unassigned; + eth.setTriggerType(trigger_type_e::TT_HALF_MOON); + + eth.fireTriggerEvents2(2 /* count */ , 60 /* ms */); + + float expectedAngle = 180 - cylinderOne - timing; + + ASSERT_EQ( 2, engine->executor.size()); + eth.assertEvent5("spark down#0", 1, (void*)fireSparkAndPrepareNextSchedule, eth.angleToTimeUs(expectedAngle)); + + eth.assertRpm( 500, "spinning-RPM#1"); + + engine->executor.executeAll(eth.getTimeNowUs() + MS2US(1000000)); + + ASSERT_NEAR(-200.0, eth.timeToAngle(-66.66666), EPS3D); + ASSERT_NEAR(160.0, eth.timeToAngle(53.333333), EPS3D); + + expectedAngle = 180 - cylinderOne - timing; + eth.fireTriggerEvents2(2 /* count */ , 60 /* ms */); + ASSERT_EQ( 2, engine->executor.size()); + eth.assertEvent5("spark down#0", 1, (void*)fireSparkAndPrepareNextSchedule, eth.angleToTimeUs(expectedAngle)); }