Line | Branch | Decision | Exec | Source |
---|---|---|---|---|
1 | /* | |||
2 | * @file test_map_averaging.cpp | |||
3 | * | |||
4 | * @date: may 12, 2025 | |||
5 | * @author FDSoftware | |||
6 | */ | |||
7 | ||||
8 | #include "pch.h" | |||
9 | #include "map_averaging.h" | |||
10 | #include "harley.h" | |||
11 | ||||
12 | namespace { | |||
13 | auto const startAveragingAction{ action_s::make<startAveraging>((mapSampler*){}) }; | |||
14 | } | |||
15 | ||||
16 | 4 | TEST(EngineModules, MapAveragingModule_onEnginePhase) { | ||
17 |
1/1✓ Branch 2 taken 1 time.
|
1 | EngineTestHelper eth(engine_type_e::TEST_CRANK_ENGINE); | |
18 | 1 | engineConfiguration->isMapAveragingEnabled = true; | ||
19 | 1 | engineConfiguration->measureMapOnlyInOneCylinder = true; | ||
20 | 1 | engine->engineState.mapAveragingDuration = 100; | ||
21 |
1/1✓ Branch 1 taken 1 time.
|
1 | engine->rpmCalculator.setRpmValue(200); | |
22 | ||||
23 |
3/3✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
|
1 | engine->module<MapAveragingModule>()->onEnginePhase(200, getTimeNowNt(), 50.f, 180.f); | |
24 | ||||
25 | // check for startMapAveraging schedule at 50° on the future (since onEnginePhase was called 50° late [start angle is 100°]) | |||
26 |
1/1✓ Branch 2 taken 1 time.
|
1 | bool averageDone = eth.assertEventExistsAtEnginePhase("startMapAveraging callback", startAveragingAction, static_cast<angle_t>(50)); | |
27 |
1/6✗ 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.
|
1 | EXPECT_TRUE(averageDone); | |
28 | ||||
29 | // move forward, we expect that the startAveraging is called and we are currently running the averaging code | |||
30 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.moveTimeForwardMs(50); | |
31 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.executeActions(); | |
32 |
1/6✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
|
1 | EXPECT_TRUE(engine->outputChannels.isMapAveraging); | |
33 | ||||
34 | // move forward, here we expect the averaging is done and endAveraging was called | |||
35 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.moveTimeForwardMs(50); | |
36 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.executeActions(); | |
37 |
1/6✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
|
1 | EXPECT_FALSE(engine->outputChannels.isMapAveraging); | |
38 | 2 | } | ||
39 | ||||
40 | 4 | TEST(EngineModules, MapAveragingModule_onFastCallback) { | ||
41 |
1/1✓ Branch 2 taken 1 time.
|
1 | EngineTestHelper eth(engine_type_e::TEST_CRANK_ENGINE); | |
42 | 1 | engineConfiguration->isMapAveragingEnabled = true; | ||
43 | ||||
44 | 1 | MapAveragingModule mapModule; | ||
45 | ||||
46 | // trigger events at crank speed | |||
47 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 1 time.
|
2/2✓ Decision 'true' taken 9 times.
✓ Decision 'false' taken 1 time.
|
10 | for (size_t i = 0; i < 9; i++) { |
48 |
1/1✓ Branch 1 taken 9 times.
|
9 | eth.fireTriggerEventsWithDuration(200); | |
49 |
1/1✓ Branch 1 taken 9 times.
|
9 | eth.executeActions(); | |
50 | } | |||
51 |
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(150, Sensor::getOrZero(SensorType::Rpm)); | |
52 | ||||
53 |
1/1✓ Branch 1 taken 1 time.
|
1 | mapModule.onFastCallback(); | |
54 | ||||
55 | // we expect here than the map start angles correspond to the phase of the cylinder + 100 of samplingAngle | |||
56 |
2/6✓ 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.
|
1 | EXPECT_EQ(engine->engineState.mapAveragingStart[0], 100); | |
57 |
2/6✓ 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.
|
1 | EXPECT_EQ(engine->engineState.mapAveragingStart[1], 640); | |
58 |
2/6✓ 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.
|
1 | EXPECT_EQ(engine->engineState.mapAveragingStart[2], 280); | |
59 |
2/6✓ 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.
|
1 | EXPECT_EQ(engine->engineState.mapAveragingStart[3], 460); | |
60 | ||||
61 |
2/6✓ 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.
|
1 | EXPECT_EQ(engine->engineState.mapAveragingDuration, 50); | |
62 | 1 | } | ||
63 | ||||
64 | 4 | TEST(EngineModules, MapAveragingModule_onFastCallbackCustomSampleWindow) { | ||
65 |
1/1✓ Branch 2 taken 1 time.
|
1 | EngineTestHelper eth(engine_type_e::TEST_CRANK_ENGINE); | |
66 | 1 | engineConfiguration->isMapAveragingEnabled = true; | ||
67 | 1 | setArrayValues(engineConfiguration->map.samplingAngle, 75); | ||
68 | ||||
69 | 1 | MapAveragingModule mapModule; | ||
70 | ||||
71 | // trigger events at crank speed | |||
72 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 1 time.
|
2/2✓ Decision 'true' taken 9 times.
✓ Decision 'false' taken 1 time.
|
10 | for (size_t i = 0; i < 9; i++) { |
73 |
1/1✓ Branch 1 taken 9 times.
|
9 | eth.fireTriggerEventsWithDuration(200); | |
74 |
1/1✓ Branch 1 taken 9 times.
|
9 | eth.executeActions(); | |
75 | } | |||
76 |
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(150, Sensor::getOrZero(SensorType::Rpm)); | |
77 | ||||
78 |
1/1✓ Branch 1 taken 1 time.
|
1 | mapModule.onFastCallback(); | |
79 | ||||
80 | // we expect here than the map start angles correspond to the phase of the cylinder + 75 of samplingAngle | |||
81 |
2/6✓ 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.
|
1 | EXPECT_EQ(engine->engineState.mapAveragingStart[0], 75); // 0 + 75 | |
82 |
2/6✓ 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.
|
1 | EXPECT_EQ(engine->engineState.mapAveragingStart[1], 615); // 540 + 75 | |
83 |
2/6✓ 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.
|
1 | EXPECT_EQ(engine->engineState.mapAveragingStart[2], 255); // 180 + 75 | |
84 |
2/6✓ 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.
|
1 | EXPECT_EQ(engine->engineState.mapAveragingStart[3], 435); // 360 + 75 | |
85 | ||||
86 |
2/6✓ 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.
|
1 | EXPECT_EQ(engine->engineState.mapAveragingDuration, 50); | |
87 | 1 | } | ||
88 | ||||
89 | 4 | TEST(EngineModules, MapAveragingModule_onFastCallbackOddFire) { | ||
90 |
1/1✓ Branch 2 taken 1 time.
|
1 | EngineTestHelper eth(engine_type_e::TEST_CRANK_ENGINE); | |
91 | 1 | engineConfiguration->isMapAveragingEnabled = true; | ||
92 | 1 | setArrayValues(engineConfiguration->map.samplingAngle, 75); | ||
93 | ||||
94 |
1/1✓ Branch 1 taken 1 time.
|
1 | setHarley(); | |
95 | 1 | engineConfiguration->timing_offset_cylinder[0] = -HARLEY_V_TWIN / 2; | ||
96 | 1 | engineConfiguration->timing_offset_cylinder[1] = +HARLEY_V_TWIN / 2; | ||
97 | ||||
98 | 1 | MapAveragingModule mapModule; | ||
99 | ||||
100 | // trigger events at crank speed | |||
101 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 1 time.
|
2/2✓ Decision 'true' taken 9 times.
✓ Decision 'false' taken 1 time.
|
10 | for (size_t i = 0; i < 9; i++) { |
102 |
1/1✓ Branch 1 taken 9 times.
|
9 | eth.fireTriggerEventsWithDuration(200); | |
103 |
1/1✓ Branch 1 taken 9 times.
|
9 | eth.executeActions(); | |
104 | } | |||
105 |
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(150, Sensor::getOrZero(SensorType::Rpm)); | |
106 | ||||
107 |
1/1✓ Branch 1 taken 1 time.
|
1 | mapModule.onFastCallback(); | |
108 | ||||
109 | // 0 from getAngleOffset + 75 custom sampling start - 22.5 from timing_offset_cylinder | |||
110 |
2/6✓ 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.
|
1 | EXPECT_EQ(engine->engineState.mapAveragingStart[0], 52.5); | |
111 | // 540 from getAngleOffset + 75 custom sampling start + 22.5 from timing_offset_cylinder | |||
112 |
2/6✓ 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.
|
1 | EXPECT_EQ(engine->engineState.mapAveragingStart[1], 637.5); | |
113 | ||||
114 |
2/6✓ 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.
|
1 | EXPECT_EQ(engine->engineState.mapAveragingDuration, 50); | |
115 | 1 | } | ||
116 | ||||
117 | 4 | TEST(EngineModules, MapAveragingModule_onEnginePhase60_2_one_cylinder) { | ||
118 |
1/1✓ Branch 2 taken 1 time.
|
1 | EngineTestHelper eth(engine_type_e::TEST_CRANK_ENGINE); | |
119 | 1 | engineConfiguration->isMapAveragingEnabled = true; | ||
120 | 1 | testSpinEngineUntilData testSpinInfo = { 0, 0, 0 }; | ||
121 | 1 | engineConfiguration->measureMapOnlyInOneCylinder = true; | ||
122 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.setTriggerType(trigger_type_e::TT_TOOTHED_WHEEL_60_2); | |
123 | 1 | MapAveragingModule mapModule; | ||
124 |
1/1✓ Branch 1 taken 1 time.
|
1 | engine->rpmCalculator.setRpmValue(200); | |
125 | ||||
126 |
3/3✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
|
1 | engine->module<MapAveragingModule>()->onEnginePhase(200, getTimeNowNt(), 0.f, 180.f); | |
127 | ||||
128 | // we expect offset of enginePhase (0 since we call onEnginePhase directy) + 100° of samplingAngle (default setting) | |||
129 |
1/1✓ Branch 2 taken 1 time.
|
1 | bool averageDone = eth.assertEventExistsAtEnginePhase("startMapAveraging callback", startAveragingAction, static_cast<angle_t>(100)); | |
130 |
1/6✗ 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.
|
1 | EXPECT_TRUE(averageDone); | |
131 | 2 | } | ||
132 | ||||
133 | 4 | TEST(EngineModules, MapAveragingModule_onEnginePhase60_2_one_cylinderCustomSampleWindow) { | ||
134 |
1/1✓ Branch 2 taken 1 time.
|
1 | EngineTestHelper eth(engine_type_e::TEST_CRANK_ENGINE); | |
135 | 1 | testSpinEngineUntilData testSpinInfo = { 0, 0, 0 }; | ||
136 | 1 | engineConfiguration->isMapAveragingEnabled = true; | ||
137 | 1 | engineConfiguration->measureMapOnlyInOneCylinder = true; | ||
138 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.setTriggerType(trigger_type_e::TT_TOOTHED_WHEEL_60_2); | |
139 | 1 | MapAveragingModule mapModule; | ||
140 |
1/1✓ Branch 1 taken 1 time.
|
1 | engine->rpmCalculator.setRpmValue(200); | |
141 | 1 | setArrayValues(engineConfiguration->map.samplingAngle, 75); | ||
142 | ||||
143 |
2/2✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
|
1 | engine->module<MapAveragingModule>()->onFastCallback(); | |
144 |
3/3✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
✓ Branch 8 taken 1 time.
|
1 | engine->module<MapAveragingModule>()->onEnginePhase(200, getTimeNowNt(), 0.f, 180.f); | |
145 | ||||
146 | // we expect offset of enginePhase (0 since we call onEnginePhase directy) + 75° of samplingAngle | |||
147 |
1/1✓ Branch 2 taken 1 time.
|
1 | bool averageDone = eth.assertEventExistsAtEnginePhase("startMapAveraging callback", startAveragingAction, static_cast<angle_t>(75)); | |
148 |
1/6✗ 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.
|
1 | EXPECT_TRUE(averageDone); | |
149 | 2 | } | ||
150 |