| 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 |