GCC Code Coverage Report


Directory: ./
File: unit_tests/tests/ignition_injection/test_fuel_map.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 100.0% 95 0 95
Functions: 100.0% 7 0 7
Branches: 42.8% 145 0 339
Decisions: 100.0% 4 - 4

Line Branch Decision Exec Source
1 /**
2 * @file test_fuel_map.cpp
3 *
4 * @date Nov 6, 2013
5 * @author Andrey Belomutskiy, (c) 2012-2020
6 */
7
8 #include "pch.h"
9
10 #include "fuel_math.h"
11 #include "trigger_structure.h"
12 #include "trigger_decoder.h"
13 #include "util/injection_crank_helper.h"
14
15 using ::testing::FloatNear;
16
17 4 TEST(misc, testFuelMap) {
18
1/1
✓ Branch 1 taken 1 time.
1 printf("Setting up TEST_ENGINE\r\n");
19
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
20
21
1/1
✓ Branch 1 taken 1 time.
1 setFlatInjectorLag(0.2);
22
23
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.updateSlowSensors();
24
25
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Clt, 36.605f);
26
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Iat, 30.0f);
27
28 // because all the correction tables are zero
29
1/1
✓ Branch 1 taken 1 time.
1 printf("*************************************************** getRunningFuel 1\r\n");
30
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
31
4/10
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 30 taken 1 time.
✗ Branch 31 not taken.
1 ASSERT_NEAR(5.3679, getRunningFuel(5), EPS4D) << "base fuel";
32
33
1/1
✓ Branch 1 taken 1 time.
1 printf("*************************************************** setting IAT table\r\n");
34
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 16 times.
✓ Decision 'false' taken 1 time.
17 for (int i = 0; i < IAT_CURVE_SIZE; i++) {
35 16 config->iatFuelCorrBins[i] = i * 10;
36 16 config->iatFuelCorr[i] = 2 * i;
37 }
38 1 config->iatFuelCorr[0] = 2;
39
40
1/1
✓ Branch 1 taken 1 time.
1 printf("*************************************************** setting CLT table\r\n");
41
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 16 times.
✓ Decision 'false' taken 1 time.
17 for (int i = 0; i < CLT_CURVE_SIZE; i++) {
42 16 config->cltFuelCorrBins[i] = i * 10;
43 16 config->cltFuelCorr[i] = i;
44 }
45
46
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Clt, 70.0f);
47
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Iat, 30.0f);
48
49
1/1
✓ Branch 1 taken 1 time.
1 setFlatInjectorLag(0);
50
51
1/1
✓ Branch 2 taken 1 time.
1 float iatCorrection = getIatFuelCorrection();
52
3/9
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
1 ASSERT_EQ( 6, iatCorrection) << "IAT";
53
1/1
✓ Branch 2 taken 1 time.
1 float cltCorrection = getCltFuelCorrection();
54
3/9
✓ Branch 3 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
1 ASSERT_EQ( 7, cltCorrection) << "CLT";
55
56
57 1 engineConfiguration->mafAdcChannel = EFI_ADC_10;
58
59 // 1005 * 2 for IAT correction
60
1/1
✓ Branch 1 taken 1 time.
1 printf("*************************************************** getRunningFuel 2\r\n");
61
1/1
✓ Branch 1 taken 1 time.
1 eth.engine.periodicFastCallback();
62
63 // Check that runningFuel corrects appropriately
64
3/8
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_EQ( 42, getRunningFuel(1)) << "v1";
65
3/8
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
1 EXPECT_EQ( 84, getRunningFuel(2)) << "v1";
66
67
1/1
✓ Branch 1 taken 1 time.
1 setTestFuelCrankingTable(4000);
68
69 // Should use 20 degree correction in case of failed sensor
70
1/1
✓ Branch 1 taken 1 time.
1 Sensor::resetMockValue(SensorType::Clt);
71
3/7
✓ 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.
1 EXPECT_NEAR(12.4, getCrankingFuel3(2, 0), EPS4D);
72
73
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Clt, 0);
74
3/7
✓ 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.
1 EXPECT_NEAR(7.7333, getCrankingFuel3(2, 4), EPS4D);
75
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Clt, 8);
76
3/7
✓ 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.
1 EXPECT_NEAR_M4(7, getCrankingFuel3(2, 15));
77
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Clt, 70);
78
3/7
✓ 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.
1 EXPECT_NEAR_M4(8, getCrankingFuel3(2, 0));
79
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Clt, 70);
80
3/7
✓ 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.
1 EXPECT_NEAR_M4(4, getCrankingFuel3(2, 50));
81 1 }
82
83
84 1 static void configureFordAspireTriggerWaveform(TriggerWaveform * s) {
85 1 s->initialize(FOUR_STROKE_CAM_SENSOR, SyncEdge::Rise);
86
87 1 s->addEvent720(53.747, TriggerValue::RISE, TriggerWheel::T_SECONDARY);
88 1 s->addEvent720(121.90, TriggerValue::FALL, TriggerWheel::T_SECONDARY);
89 1 s->addEvent720(232.76, TriggerValue::RISE, TriggerWheel::T_SECONDARY);
90 1 s->addEvent720(300.54, TriggerValue::FALL, TriggerWheel::T_SECONDARY);
91 1 s->addEvent720(360, TriggerValue::RISE, TriggerWheel::T_PRIMARY);
92
93 1 s->addEvent720(409.8412, TriggerValue::RISE, TriggerWheel::T_SECONDARY);
94 1 s->addEvent720(478.6505, TriggerValue::FALL, TriggerWheel::T_SECONDARY);
95 1 s->addEvent720(588.045, TriggerValue::RISE, TriggerWheel::T_SECONDARY);
96 1 s->addEvent720(657.03, TriggerValue::FALL, TriggerWheel::T_SECONDARY);
97 1 s->addEvent720(720, TriggerValue::FALL, TriggerWheel::T_PRIMARY);
98
99
3/8
✓ Branch 3 taken 1 time.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 10 not taken.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 25 taken 1 time.
✗ Branch 26 not taken.
1 ASSERT_FLOAT_EQ(53.747 / 720, s->wave.getSwitchTime(0));
100
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( TriggerValue::RISE, s->wave.getChannelState(1, 0)) << "@0";
101
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( TriggerValue::RISE, s->wave.getChannelState(1, 0)) << "@0";
102
103
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( TriggerValue::FALL, s->wave.getChannelState(0, 1)) << "@1";
104
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( TriggerValue::FALL, s->wave.getChannelState(1, 1)) << "@1";
105
106
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( TriggerValue::FALL, s->wave.getChannelState(0, 2)) << "@2";
107
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( TriggerValue::RISE, s->wave.getChannelState(1, 2)) << "@2";
108
109
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( TriggerValue::FALL, s->wave.getChannelState(0, 3)) << "@3";
110
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( TriggerValue::FALL, s->wave.getChannelState(1, 3)) << "@3";
111
112
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( TriggerValue::RISE, s->wave.getChannelState(0, 4)) << "@4";
113
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( TriggerValue::RISE, s->wave.getChannelState(1, 5)) << "@5";
114
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( TriggerValue::FALL, s->wave.getChannelState(1, 8)) << "@8";
115
3/8
✓ Branch 3 taken 1 time.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 10 not taken.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 25 taken 1 time.
✗ Branch 26 not taken.
1 ASSERT_FLOAT_EQ(121.90 / 720, s->wave.getSwitchTime(1));
116
3/8
✓ Branch 3 taken 1 time.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 10 not taken.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✓ Branch 25 taken 1 time.
✗ Branch 26 not taken.
1 ASSERT_FLOAT_EQ(657.03 / 720, s->wave.getSwitchTime(8));
117
118
4/10
✓ Branch 4 taken 1 time.
✓ Branch 9 taken 1 time.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 time.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✗ Branch 27 not taken.
✗ Branch 30 not taken.
✓ Branch 37 taken 1 time.
✗ Branch 38 not taken.
1 ASSERT_EQ(0, s->wave.findAngleMatch(53.747 / 720.0).value_or(-1)) << "expecting 0";
119
3/10
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 36 taken 1 time.
✗ Branch 37 not taken.
1 ASSERT_FALSE(s->wave.findAngleMatch(53 / 720.0).Valid) << "expecting not found";
120
4/9
✓ Branch 4 taken 1 time.
✓ Branch 9 taken 1 time.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 time.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 1 time.
✗ Branch 35 not taken.
1 ASSERT_EQ(7, s->wave.findAngleMatch(588.045 / 720.0).value_or(-1));
121
122
4/10
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 1 time.
✗ Branch 35 not taken.
1 ASSERT_EQ( 0, s->wave.findInsertionAngle(23.747 / 720.0)) << "expecting 0";
123
4/10
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 1 time.
✗ Branch 35 not taken.
1 ASSERT_EQ( 1, s->wave.findInsertionAngle(63.747 / 720.0)) << "expecting 1";
124 }
125
126 4 TEST(misc, testAngleResolver) {
127
1/1
✓ Branch 1 taken 1 time.
1 printf("*************************************************** testAngleResolver\r\n");
128
129
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
130
1/1
✓ Branch 1 taken 1 time.
1 eth.setTriggerType(trigger_type_e::TT_FORD_ASPIRE);
131 1 engineConfiguration->globalTriggerAngleOffset = 175;
132
133 1 TriggerWaveform * ts = &engine->triggerCentral.triggerShape;
134 1 TriggerFormDetails *triggerFormDetails = &engine->triggerCentral.triggerFormDetails;
135
1/1
✓ Branch 1 taken 1 time.
1 engine->updateTriggerConfiguration();
136
137
3/9
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 27 taken 1 time.
✗ Branch 28 not taken.
1 ASSERT_NEAR(52.76, triggerFormDetails->eventAngles[3], EPS4D) << "index 2"; // this angle is relation to synch point
138
3/9
✓ Branch 3 taken 1 time.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✓ Branch 28 taken 1 time.
✗ Branch 29 not taken.
1 ASSERT_NEAR(0.3233, ts->wave.getSwitchTime(2), EPS4D) << "time 2";
139
3/9
✓ Branch 2 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 27 taken 1 time.
✗ Branch 28 not taken.
1 ASSERT_NEAR(412.76, triggerFormDetails->eventAngles[6], EPS4D) << "index 5";
140
3/9
✓ Branch 3 taken 1 time.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✓ Branch 28 taken 1 time.
✗ Branch 29 not taken.
1 ASSERT_NEAR(0.5733, ts->wave.getSwitchTime(5), EPS4D) << "time 5";
141
142
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(4, ts->getTriggerWaveformSynchPointIndex());
143
144
4/10
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✓ Branch 34 taken 1 time.
✗ Branch 35 not taken.
1 ASSERT_EQ( 10u, ts->getSize()) << "shape size";
145
146
1/1
✓ Branch 2 taken 1 time.
1 TriggerWaveform t;
147
1/1
✓ Branch 1 taken 1 time.
1 configureFordAspireTriggerWaveform(&t);
148 1 }
149
150 TEST(misc, testPinHelper) {
151 printf("*************************************************** testPinHelper\r\n");
152 ASSERT_EQ(0, getElectricalValue(0, OM_DEFAULT));
153 ASSERT_EQ(1, getElectricalValue(1, OM_DEFAULT));
154
155 ASSERT_EQ(0, getElectricalValue(1, OM_INVERTED));
156 ASSERT_EQ(1, getElectricalValue(0, OM_INVERTED));
157 }
158