Line | Branch | Decision | Exec | Source |
---|---|---|---|---|
1 | /** | |||
2 | * @file test_accel_enrichment.cpp | |||
3 | * | |||
4 | * See also test_fuel_wall_wetting.cpp | |||
5 | * | |||
6 | * @date Apr 29, 2014 | |||
7 | * Author: Dmitry Sidin | |||
8 | * @author Andrey Belomutskiy, (c) 2012-2020 | |||
9 | */ | |||
10 | ||||
11 | #include "pch.h" | |||
12 | ||||
13 | #include "accel_enrichment.h" | |||
14 | ||||
15 | 4 | TEST(fuel, testTpsAccelEnrichmentMath) { | ||
16 |
1/1✓ Branch 1 taken 1 time.
|
1 | printf("====================================================================================== testAccelEnrichment\r\n"); | |
17 | ||||
18 |
1/1✓ Branch 2 taken 1 time.
|
1 | EngineTestHelper eth(engine_type_e::TEST_ENGINE); | |
19 | ||||
20 |
1/1✓ Branch 1 taken 1 time.
|
1 | engine->rpmCalculator.setRpmValue(600); | |
21 |
1/1✓ Branch 1 taken 1 time.
|
1 | engine->periodicFastCallback(); | |
22 | ||||
23 |
2/2✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
|
1 | engine->module<TpsAccelEnrichment>()->setLength(4); | |
24 | ||||
25 |
2/2✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
|
1 | engine->module<TpsAccelEnrichment>()->onNewValue(0); | |
26 |
5/11✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 time.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 28 not taken.
✗ Branch 31 not taken.
✓ Branch 38 taken 1 time.
✗ Branch 39 not taken.
|
1 | ASSERT_EQ( 0, engine->module<TpsAccelEnrichment>()->getMaxDelta()) << "maxDelta"; | |
27 |
2/2✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
|
1 | engine->module<TpsAccelEnrichment>()->onNewValue(10); | |
28 |
5/11✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 time.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 28 not taken.
✗ Branch 31 not taken.
✓ Branch 38 taken 1 time.
✗ Branch 39 not taken.
|
1 | ASSERT_EQ( 10, engine->module<TpsAccelEnrichment>()->getMaxDelta()) << "maxDelta#1"; | |
29 |
2/2✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
|
1 | engine->module<TpsAccelEnrichment>()->onNewValue(30); | |
30 |
5/11✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 time.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 28 not taken.
✗ Branch 31 not taken.
✓ Branch 38 taken 1 time.
✗ Branch 39 not taken.
|
1 | ASSERT_EQ( 20, engine->module<TpsAccelEnrichment>()->getMaxDelta()) << "maxDelta#2"; | |
31 | ||||
32 |
2/2✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
|
1 | engine->module<TpsAccelEnrichment>()->onNewValue(0); | |
33 |
5/11✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 time.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 28 not taken.
✗ Branch 31 not taken.
✓ Branch 38 taken 1 time.
✗ Branch 39 not taken.
|
1 | ASSERT_EQ( 20, engine->module<TpsAccelEnrichment>()->getMaxDelta()) << "maxDelta#3"; | |
34 |
2/2✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
|
1 | engine->module<TpsAccelEnrichment>()->onNewValue(0); | |
35 |
5/11✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 time.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 28 not taken.
✗ Branch 31 not taken.
✓ Branch 38 taken 1 time.
✗ Branch 39 not taken.
|
1 | ASSERT_EQ( 20, engine->module<TpsAccelEnrichment>()->getMaxDelta()) << "maxDelta#4"; | |
36 |
2/2✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
|
1 | engine->module<TpsAccelEnrichment>()->onNewValue(0); | |
37 |
5/11✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 time.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 28 not taken.
✗ Branch 31 not taken.
✓ Branch 38 taken 1 time.
✗ Branch 39 not taken.
|
1 | ASSERT_EQ( 0, engine->module<TpsAccelEnrichment>()->getMaxDelta()) << "maxDelta#5"; | |
38 |
2/2✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
|
1 | engine->module<TpsAccelEnrichment>()->onNewValue(0); | |
39 |
5/11✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 time.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 28 not taken.
✗ Branch 31 not taken.
✓ Branch 38 taken 1 time.
✗ Branch 39 not taken.
|
1 | ASSERT_EQ( 0, engine->module<TpsAccelEnrichment>()->getMaxDelta()) << "maxDelta"; | |
40 | 1 | } | ||
41 | ||||
42 | 4 | TEST(fuel, testTpsAccelEnrichmentScheduling) { | ||
43 |
1/1✓ Branch 2 taken 1 time.
|
1 | EngineTestHelper eth(engine_type_e::TEST_ENGINE); | |
44 | ||||
45 |
1/1✓ Branch 1 taken 1 time.
|
1 | setCrankOperationMode(); | |
46 | ||||
47 | 1 | engineConfiguration->tpsAccelEnrichmentThreshold = 5; | ||
48 | 1 | engineConfiguration->tpsAccelLookback = 2; | ||
49 | ||||
50 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.setTriggerType(trigger_type_e::TT_HALF_MOON); | |
51 | ||||
52 | ||||
53 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::Tps1, 0); | |
54 |
1/1✓ Branch 1 taken 1 time.
|
1 | engine->periodicSlowCallback(); | |
55 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::Tps1, 7); | |
56 |
1/1✓ Branch 1 taken 1 time.
|
1 | engine->periodicSlowCallback(); | |
57 | ||||
58 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.fireTriggerEvents2(/* count */ 4, 25 /* ms */); | |
59 |
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( 1200, Sensor::getOrZero(SensorType::Rpm)) << "RPM"; | |
60 | 1 | int expectedInvocationCounter = 1; | ||
61 |
4/9✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 time.
✗ Branch 13 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✓ Branch 28 taken 1 time.
✗ Branch 29 not taken.
|
1 | ASSERT_EQ(expectedInvocationCounter, engine->module<TpsAccelEnrichment>()->onUpdateInvocationCounter); | |
62 | ||||
63 |
1/1✓ Branch 1 taken 1 time.
|
1 | Sensor::setMockValue(SensorType::Tps1, 70); | |
64 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.fireTriggerEvents2(/* count */ 1, 25 /* ms */); | |
65 | ||||
66 | 1 | float expectedAEValue = 7; | ||
67 | // it does not matter how many times we invoke 'getTpsEnrichment' - state does not change | |||
68 |
2/2✓ Branch 0 taken 20 times.
✓ Branch 1 taken 1 time.
|
2/2✓ Decision 'true' taken 20 times.
✓ Decision 'false' taken 1 time.
|
21 | for (int i = 0; i < 20; i++) { |
69 |
5/10✓ Branch 2 taken 20 times.
✓ Branch 6 taken 20 times.
✓ Branch 9 taken 20 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 20 times.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 20 times.
✗ Branch 32 not taken.
|
20 | ASSERT_NEAR(expectedAEValue, engine->module<TpsAccelEnrichment>()->getTpsEnrichment(), EPS4D); | |
70 | } | |||
71 | ||||
72 | 1 | expectedInvocationCounter++; | ||
73 |
4/9✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 time.
✗ Branch 13 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✓ Branch 28 taken 1 time.
✗ Branch 29 not taken.
|
1 | ASSERT_EQ(expectedInvocationCounter, engine->module<TpsAccelEnrichment>()->onUpdateInvocationCounter); | |
74 | ||||
75 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.engine.periodicFastCallback(); | |
76 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.engine.periodicFastCallback(); | |
77 |
1/1✓ Branch 1 taken 1 time.
|
1 | eth.engine.periodicFastCallback(); | |
78 | ||||
79 |
4/9✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 time.
✗ Branch 13 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✓ Branch 28 taken 1 time.
✗ Branch 29 not taken.
|
1 | ASSERT_EQ(expectedInvocationCounter, engine->module<TpsAccelEnrichment>()->onUpdateInvocationCounter); | |
80 | 1 | } | ||
81 | ||||
82 | 4 | static void doFractionalTpsIteration(int period, int divisor, int numCycles, std::vector<floatms_t> &tpsEnrich) { | ||
83 | // every cycle | |||
84 | 4 | engineConfiguration->tpsAccelFractionPeriod = period; | ||
85 | // split into 2 portions | |||
86 | 4 | engineConfiguration->tpsAccelFractionDivisor = divisor; | ||
87 | ||||
88 | 4 | engine->module<TpsAccelEnrichment>()->resetAE(); | ||
89 | 4 | engine->module<TpsAccelEnrichment>()->onNewValue(0); | ||
90 |
2/2✓ Branch 0 taken 16 times.
✓ Branch 1 taken 4 times.
|
2/2✓ Decision 'true' taken 16 times.
✓ Decision 'false' taken 4 times.
|
20 | for (int i = 0; i < numCycles; i++) { |
91 | 16 | engine->module<TpsAccelEnrichment>()->onNewValue(10); | ||
92 | 16 | engine->module<TpsAccelEnrichment>()->onEngineCycleTps(); | ||
93 | 16 | tpsEnrich[i] = engine->module<TpsAccelEnrichment>()->getTpsEnrichment(); | ||
94 | } | |||
95 | 4 | } | ||
96 | ||||
97 | 4 | TEST(fuel, testAccelEnrichmentFractionalTps) { | ||
98 |
1/1✓ Branch 1 taken 1 time.
|
1 | printf("====================================================================================== testAccelEnrichmentFractionalTps\r\n"); | |
99 | ||||
100 |
1/1✓ Branch 2 taken 1 time.
|
1 | EngineTestHelper eth(engine_type_e::TEST_ENGINE); | |
101 | ||||
102 | // setup | |||
103 | 1 | engineConfiguration->tpsAccelEnrichmentThreshold = 5; | ||
104 | 1 | engineConfiguration->tpsAccelLookback = 2; | ||
105 | ||||
106 | // fill tps2tps map (todo: there should be a better way?) | |||
107 | static const float tpsTpsConst = 1.0f; | |||
108 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 1 time.
|
2/2✓ Decision 'true' taken 8 times.
✓ Decision 'false' taken 1 time.
|
9 | for (int loadIndex = 0; loadIndex < TPS_TPS_ACCEL_TABLE; loadIndex++) { |
109 |
2/2✓ Branch 0 taken 64 times.
✓ Branch 1 taken 8 times.
|
2/2✓ Decision 'true' taken 64 times.
✓ Decision 'false' taken 8 times.
|
72 | for (int rpmIndex = 0; rpmIndex < TPS_TPS_ACCEL_TABLE; rpmIndex++) { |
110 | 64 | config->tpsTpsAccelTable[loadIndex][rpmIndex] = tpsTpsConst; | ||
111 | } | |||
112 | } | |||
113 | ||||
114 |
1/1✓ Branch 1 taken 1 time.
|
1 | initAccelEnrichment(); | |
115 | ||||
116 |
1/1✓ Branch 1 taken 1 time.
|
1 | engine->rpmCalculator.setRpmValue(600); | |
117 |
1/1✓ Branch 1 taken 1 time.
|
1 | engine->periodicFastCallback(); | |
118 | ||||
119 |
2/2✓ Branch 1 taken 1 time.
✓ Branch 5 taken 1 time.
|
1 | engine->module<TpsAccelEnrichment>()->setLength(2); | |
120 | ||||
121 | ||||
122 | 1 | const int numCycles = 4; | ||
123 |
1/1✓ Branch 3 taken 1 time.
|
3 | std::vector<floatms_t> tpsEnrich(numCycles); | |
124 | ||||
125 | // first, test the default behavior without fractional division | |||
126 |
1/1✓ Branch 1 taken 1 time.
|
1 | doFractionalTpsIteration(1, 1, numCycles, tpsEnrich); | |
127 | // the portion for the first cycle is full-enriched and there's no enrichment for next cycles | |||
128 |
4/9✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
✓ Branch 14 taken 1 time.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 time.
✗ Branch 27 not taken.
✗ Branch 30 not taken.
✗ Branch 35 not taken.
✗ Branch 38 not taken.
|
1 | EXPECT_THAT(tpsEnrich, testing::ElementsAre(1.0f, 0.0f, 0.0f, 0.0f)) << "fractionalTps#1"; | |
129 | ||||
130 | // divide into 2 each cycle | |||
131 |
1/1✓ Branch 1 taken 1 time.
|
1 | doFractionalTpsIteration(1, 2, numCycles, tpsEnrich); | |
132 | // we have half-portion for the first cycle, then 1/4-th and 1/8th and so on... | |||
133 |
4/9✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
✓ Branch 14 taken 1 time.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 time.
✗ Branch 27 not taken.
✗ Branch 30 not taken.
✗ Branch 35 not taken.
✗ Branch 38 not taken.
|
1 | EXPECT_THAT(tpsEnrich, testing::ElementsAre(0.5f, 0.25f, 0.125f, 0.0625f)) << "fractionalTps#2"; | |
134 | ||||
135 | // split every portion into 3 sub-portions (so the whole enrichment takes longer) | |||
136 |
1/1✓ Branch 1 taken 1 time.
|
1 | doFractionalTpsIteration(3, 1, numCycles, tpsEnrich); | |
137 | // we have 1/3rd-portion for the first three cycles | |||
138 | 1 | const float th = (1.0f / 3.0f); | ||
139 |
7/12✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
✓ Branch 14 taken 1 time.
✓ Branch 17 taken 1 time.
✓ Branch 20 taken 1 time.
✓ Branch 23 taken 1 time.
✗ Branch 32 not taken.
✓ Branch 33 taken 1 time.
✗ Branch 36 not taken.
✗ Branch 39 not taken.
✗ Branch 44 not taken.
✗ Branch 47 not taken.
|
1 | EXPECT_THAT(tpsEnrich, testing::ElementsAre(testing::FloatEq(th), testing::FloatEq(th), testing::FloatEq(th), 0.0f)) << "fractionalTps#3"; | |
140 | ||||
141 | // split every divided portion into 2 sub-portions (so the whole enrichment takes longer) | |||
142 |
1/1✓ Branch 1 taken 1 time.
|
1 | doFractionalTpsIteration(2, 2, numCycles, tpsEnrich); | |
143 | // we have half-portion for the first two cycles, and 1/4-th portion for the next 2 cycles, and so on... | |||
144 |
4/9✓ Branch 8 taken 1 time.
✓ Branch 11 taken 1 time.
✓ Branch 14 taken 1 time.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 time.
✗ Branch 27 not taken.
✗ Branch 30 not taken.
✗ Branch 35 not taken.
✗ Branch 38 not taken.
|
1 | EXPECT_THAT(tpsEnrich, testing::ElementsAre(0.25f, 0.25f, 0.125f, 0.125f)) << "fractionalTps#4"; | |
145 | ||||
146 | 2 | } | ||
147 | ||||
148 | 4 | TEST(fuel, testTpsAccelEnrichment) { | ||
149 |
1/1✓ Branch 2 taken 1 time.
|
1 | EngineTestHelper eth(engine_type_e::TEST_ENGINE); | |
150 | 1 | engineConfiguration->accelEnrichmentMode = AE_MODE_PREDICTIVE_MAP; | ||
151 | // should return 0 if we are using predictive map | |||
152 |
4/8✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 11 taken 1 time.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 time.
✗ Branch 20 not taken.
✗ Branch 25 not taken.
✗ Branch 28 not taken.
|
1 | EXPECT_EQ(0, engine->module<TpsAccelEnrichment>()->getTpsEnrichment()); | |
153 | 2 | } | ||
154 |