GCC Code Coverage Report


Directory: ./
File: unit_tests/tests/ignition_injection/test_odd_firing_engine.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 100.0% 46 0 46
Functions: 100.0% 4 0 4
Branches: 53.6% 60 0 112
Decisions: -% 0 - 0

Line Branch Decision Exec Source
1 #include "pch.h"
2 #include "spark_logic.h"
3 #include "harley.h"
4 #include "fuel_math.h"
5 #include "defaults.h"
6 #include "util/injection_crank_helper.h"
7
8 // let's pretend to have a 32 degree V odd fire engine.
9 static const float cylinderOne = -19;
10 static const float cylinderTwo = 13;
11 static const angle_t timing = 1; // same timing cranking and running modes
12
13 using ::testing::_;
14
15 1 static void configureOddFiringEngine(EngineTestHelper &eth) {
16 1 engineConfiguration->cranking.rpm = 100;
17 1 engineConfiguration->timing_offset_cylinder[0] = cylinderOne;
18 1 engineConfiguration->timing_offset_cylinder[1] = cylinderTwo;
19 1 setTable(config->ignitionTable, timing); // this changes run mode timing
20 1 engineConfiguration->crankingTimingAngle = timing;
21 1 engine->tdcMarkEnabled = false; // reduce event queue noise TODO extract helper method
22 1 }
23
24 #if FUEL_RPM_COUNT == 16
25 4 TEST(OddFireRunningMode, hd) {
26 // basic engine setup
27
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::HARLEY);
28
1/1
✓ Branch 1 taken 1 time.
1 configureOddFiringEngine(eth);
29 extern bool unitTestBusyWaitHack;
30 1 unitTestBusyWaitHack = true;
31 1 engineConfiguration->vvtMode[0] = VVT_SINGLE_TOOTH; // need to avoid engine phase sync requirement
32
1/1
✓ Branch 1 taken 1 time.
1 setTestFuelCrankingTable(27);
33
34 // we need some fuel duration so let's mock airmass just to have legit fuel, we do not care for amount here at all
35
5/5
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 10 taken 1 time.
✓ Branch 13 taken 1 time.
✓ Branch 17 taken 1 time.
3 EXPECT_CALL(*eth.mockAirmass, getAirmass(/*any rpm*/_, _))
36
3/3
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
3 .WillRepeatedly(Return(AirmassResult{0.1008f, 50.0f}));
37
38 1 engineConfiguration->camInputs[0] = Gpio::Unassigned;
39 1 engineConfiguration->overrideTriggerGaps = false;
40
41
1/1
✓ Branch 1 taken 1 time.
1 eth.setTriggerType(trigger_type_e::TT_HALF_MOON);
42 // end of configuration
43
44 // send fake crank signal events so that trigger handler schedules actuators
45
1/1
✓ Branch 1 taken 1 time.
1 eth.fireTriggerEvents2(2 /* count */ , 60 /* ms */);
46
2/2
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
1 LimpState limitedSparkState = getLimpManager()->allowIgnition();
47
2/8
✗ Branch 3 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 7 not taken.
✗ Branch 12 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✓ Branch 28 taken 1 time.
✗ Branch 29 not taken.
1 ASSERT_TRUE(limitedSparkState.value);
48
3/8
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✓ Branch 26 taken 1 time.
✗ Branch 27 not taken.
1 ASSERT_EQ(limitedSparkState.reason, ClearReason::None);
49
4/9
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
1 ASSERT_EQ(IM_SIMULTANEOUS, getCurrentInjectionMode()); // still spinning up
50
4/9
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 27 taken 1 time.
✗ Branch 28 not taken.
1 ASSERT_NEAR(0.027, getInjectionMass(200), EPS3D);
51
52 // ASSERT_NEAR(-528, eth.timeToAngle(-176), EPS3D);
53 // ASSERT_NEAR(-250.778, eth.timeToAngle(-83.593), EPS3D);
54 // ASSERT_NEAR(-220.0, eth.timeToAngle(-73.333333), EPS3D);
55 // ASSERT_NEAR(?0.0, eth.timeToAngle(-70.66666), EPS3D);
56 // ASSERT_NEAR(-200.0, eth.timeToAngle(-66.66666), EPS3D);
57 // ASSERT_NEAR(-168.0, eth.timeToAngle(-56.0), EPS3D);
58 // ASSERT_NEAR(32, eth.timeToAngle(10.66666666), EPS3D);
59 //ASSERT_NEAR(?, eth.timeToAngle(40.3333), EPS3D);
60 // ASSERT_NEAR(140, eth.timeToAngle(46.66666), EPS3D);
61 // ASSERT_NEAR(141.222, eth.timeToAngle(47.074), EPS3D);
62 // ASSERT_NEAR(160.0, eth.timeToAngle(53.333333), EPS3D);
63
64 1 angle_t expectedAngle3 = -180 + cylinderOne - timing;
65
66
4/9
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
1 ASSERT_EQ( 8, engine->scheduler.size());
67 1 auto const fireSparkAndPrepareNextScheduleAction{ action_s::make<fireSparkAndPrepareNextSchedule>((IgnitionEvent*){})};
68
1/1
✓ Branch 2 taken 1 time.
1 eth.assertEvent5("spark down#3", 3, fireSparkAndPrepareNextScheduleAction, eth.angleToTimeUs(expectedAngle3));
69
70 1 angle_t expectedAngle5 = -180 + cylinderTwo - timing;
71
1/1
✓ Branch 2 taken 1 time.
1 eth.assertEvent5("spark down#5", 5, fireSparkAndPrepareNextScheduleAction, eth.angleToTimeUs(expectedAngle5));
72
73
4/9
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
1 ASSERT_EQ(500, Sensor::getOrZero(SensorType::Rpm));
74
75
2/2
✓ Branch 1 taken 1 time.
✓ Branch 4 taken 1 time.
1 engine->scheduler.executeAll(getTimeNowUs() + MS2US(1000000));
76
77
1/1
✓ Branch 1 taken 1 time.
1 eth.fireTriggerEvents2(2 /* count */ , 60 /* ms */);
78
4/9
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
1 ASSERT_EQ(IM_SEQUENTIAL, getCurrentInjectionMode());
79
4/9
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 27 taken 1 time.
✗ Branch 28 not taken.
1 ASSERT_NEAR(0.0069257142022, getInjectionMass(200), EPS3D);
80
81
4/9
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
1 ASSERT_EQ( 8, engine->scheduler.size());
82 1 auto const turnInjectionPinLowAction{ action_s::make<turnInjectionPinLow>((InjectionEvent*){})};
83
1/1
✓ Branch 2 taken 1 time.
1 eth.assertEvent5("fuel down2#2", 2, turnInjectionPinLowAction, eth.angleToTimeUs(180 + PORT_INJECTION_OFFSET + cylinderOne));
84
1/1
✓ Branch 2 taken 1 time.
1 eth.assertEvent5("spark down2#4", 4, fireSparkAndPrepareNextScheduleAction, eth.angleToTimeUs(-180 + cylinderOne - timing));
85
1/1
✓ Branch 2 taken 1 time.
1 eth.assertEvent5("fuel down2#7", 7, turnInjectionPinLowAction, eth.angleToTimeUs(540 + PORT_INJECTION_OFFSET + cylinderTwo));
86
1/1
✓ Branch 2 taken 1 time.
1 eth.assertEvent5("spark down2#0", 0, fireSparkAndPrepareNextScheduleAction, eth.angleToTimeUs(-540 + cylinderTwo - timing));
87
88
3/9
✓ Branch 5 taken 1 time.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 time.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✓ Branch 32 taken 1 time.
✗ Branch 33 not taken.
1 ASSERT_EQ(2, engine->getBailedOnDwellCount()) << "Please check if our dwell algorithm have really got better.";
89 1 }
90 #endif //FUEL_RPM_COUNT == 16
91