GCC Code Coverage Report


Directory: ./
File: unit_tests/tests/trigger/test_trigger_decoder_2.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 100.0% 219 0 219
Functions: 100.0% 26 0 26
Branches: 43.4% 216 0 498
Decisions: 100.0% 6 - 6

Line Branch Decision Exec Source
1 #include "pch.h"
2
3 using ::testing::_;
4 using ::testing::StrictMock;
5
6 #include "mock_trigger_configuration.h"
7
8 struct MockTriggerDecoder : public TriggerDecoderBase {
9
2/2
✓ Branch 3 taken 4 times.
✓ Branch 6 taken 4 times.
4 MockTriggerDecoder() : TriggerDecoderBase("mock") { }
10
11 4 MOCK_METHOD(void, onTriggerError, (), (override));
12
3/3
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 10 taken 1 time.
2 MOCK_METHOD(void, onNotEnoughTeeth, (int actual, int expected), (override));
13
3/3
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 10 taken 1 time.
2 MOCK_METHOD(void, onTooManyTeeth, (int actual, int expected), (override));
14 };
15
16 6 static auto makeTriggerShape(operation_mode_e mode, const TriggerConfiguration& config) {
17 // huh? do we return local method instance? how come it's not a SegmFault? is it not allocated on stack?!
18 6 TriggerWaveform shape;
19 6 shape.initializeTriggerWaveform(mode, config.TriggerType);
20
21 6 return shape;
22 }
23
24 #define doTooth(dut, shape, cfg, t) dut.decodeTriggerEvent("", shape, nullptr, cfg, SHAFT_PRIMARY_RISING, t)
25
26 4 TEST(TriggerDecoder, FindsFirstSyncPoint) {
27 1 MockTriggerConfiguration cfg({trigger_type_e::TT_TOOTHED_WHEEL, 4, 1});
28
1/1
✓ Branch 1 taken 1 time.
1 cfg.update();
29 1 engineConfiguration = nullptr;
30
31
1/1
✓ Branch 2 taken 1 time.
1 auto shape = makeTriggerShape(FOUR_STROKE_CAM_SENSOR, cfg);
32
33 1 efitick_t t = 0;
34
35 // Strict so it complains about unexpected calls to onTriggerError()
36
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockTriggerDecoder> dut;
37
38 // Fire a few boring evenly spaced teeth
39 1 t += MS2NT(1);
40
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
41
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FALSE(dut.getShaftSynchronized());
42
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(2u, dut.currentCycle.current_index);
43
44 1 t += MS2NT(1);
45
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
46
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FALSE(dut.getShaftSynchronized());
47
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(4u, dut.currentCycle.current_index);
48
49 1 t += MS2NT(1);
50
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
51
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FALSE(dut.getShaftSynchronized());
52
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(6u, dut.currentCycle.current_index);
53
54 // Missing tooth, 2x normal length!
55 1 t += MS2NT(2);
56
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
57
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_TRUE(dut.getShaftSynchronized());
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(0u, dut.currentCycle.current_index);
59
60 // Normal tooth after the missing tooth, should be index 2 now (one rise + one fall)
61 1 t += MS2NT(1);
62
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
63
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_TRUE(dut.getShaftSynchronized());
64
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(2u, dut.currentCycle.current_index);
65
66
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FALSE(dut.someSortOfTriggerError());
67 2 }
68
69
70 4 TEST(TriggerDecoder, FindsSyncPointMultipleRevolutions) {
71 1 MockTriggerConfiguration cfg({trigger_type_e::TT_TOOTHED_WHEEL, 4, 1});
72
1/1
✓ Branch 1 taken 1 time.
1 cfg.update();
73
74
1/1
✓ Branch 2 taken 1 time.
1 auto shape = makeTriggerShape(FOUR_STROKE_CAM_SENSOR, cfg);
75
76 1 efitick_t t = 0;
77
78 // Strict so it complains about unexpected calls to onTriggerError()
79
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockTriggerDecoder> dut;
80
81 // normal tooth
82 1 t += MS2NT(1);
83
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
84
85 // normal tooth
86 1 t += MS2NT(1);
87
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
88
89 // Missing tooth, 2x normal length!
90 1 t += MS2NT(2);
91
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
92
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_TRUE(dut.getShaftSynchronized());
93
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(0u, dut.currentCycle.current_index);
94
3/7
✓ 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.
1 EXPECT_EQ(0, dut.getSynchronizationCounter());
95
96 // Do 100 turns and make sure we stay synchronized
97
2/2
✓ Branch 0 taken 100 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 100 times.
✓ Decision 'false' taken 1 time.
101 for (int i = 0; i < 100; i++) {
98 // normal tooth
99 100 t += MS2NT(1);
100
1/1
✓ Branch 1 taken 100 times.
100 doTooth(dut, shape, cfg, t);
101
2/6
✓ Branch 3 taken 100 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 100 times.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
100 EXPECT_EQ(2u, dut.currentCycle.current_index);
102
103 // normal tooth
104 100 t += MS2NT(1);
105
1/1
✓ Branch 1 taken 100 times.
100 doTooth(dut, shape, cfg, t);
106
2/6
✓ Branch 3 taken 100 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 100 times.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
100 EXPECT_EQ(4u, dut.currentCycle.current_index);
107
108 // Missing tooth, 2x normal length!
109 100 t += MS2NT(2);
110
1/1
✓ Branch 1 taken 100 times.
100 doTooth(dut, shape, cfg, t);
111
2/7
✓ Branch 3 taken 100 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 100 times.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
100 EXPECT_TRUE(dut.getShaftSynchronized());
112
2/6
✓ Branch 3 taken 100 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 100 times.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
100 EXPECT_EQ(0u, dut.currentCycle.current_index);
113
2/7
✓ Branch 3 taken 100 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 100 times.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
100 EXPECT_FALSE(dut.someSortOfTriggerError());
114
115 // We do one revolution per loop iteration
116
3/7
✓ Branch 3 taken 100 times.
✓ Branch 7 taken 100 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 100 times.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
100 EXPECT_EQ(i + 1, dut.getSynchronizationCounter());
117 }
118 2 }
119
120 4 TEST(TriggerDecoder, TooManyTeeth_CausesError) {
121 1 MockTriggerConfiguration cfg({trigger_type_e::TT_TOOTHED_WHEEL, 4, 1});
122
1/1
✓ Branch 1 taken 1 time.
1 cfg.update();
123
124
1/1
✓ Branch 2 taken 1 time.
1 auto shape = makeTriggerShape(FOUR_STROKE_CAM_SENSOR, cfg);
125
126 1 efitick_t t = 0;
127
128
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockTriggerDecoder> dut;
129 // We expect one call to onTriggerError().
130
3/3
✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
1 EXPECT_CALL(dut, onTriggerError());
131
5/5
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 10 taken 1 time.
✓ Branch 14 taken 1 time.
✓ Branch 18 taken 1 time.
1 EXPECT_CALL(dut, onTooManyTeeth(_, _));
132
133 // Fire a few boring evenly spaced teeth
134 1 t += MS2NT(1);
135
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
136
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FALSE(dut.getShaftSynchronized());
137
138 1 t += MS2NT(1);
139
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
140
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FALSE(dut.getShaftSynchronized());
141
142 1 t += MS2NT(1);
143
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
144
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FALSE(dut.getShaftSynchronized());
145
146 // Missing tooth, 2x normal length!
147 1 t += MS2NT(2);
148
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
149
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_TRUE(dut.getShaftSynchronized());
150
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(0u, dut.currentCycle.current_index);
151
152 // Fake that we have RPM so that all trigger error detection is enabled
153
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, 1000);
154
155 1 t += MS2NT(1);
156
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
157
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_TRUE(dut.getShaftSynchronized());
158
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(2u, dut.currentCycle.current_index);
159
160 1 t += MS2NT(1);
161
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
162
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_TRUE(dut.getShaftSynchronized());
163
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(4u, dut.currentCycle.current_index);
164
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(0u, dut.totalTriggerErrorCounter);
165
166 // This tooth is extra - expect a call to onTriggerError() and loss of sync!
167 1 t += MS2NT(1);
168
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
169
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FALSE(dut.getShaftSynchronized());
170
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(6u, dut.currentCycle.current_index);
171
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(1u, dut.totalTriggerErrorCounter);
172
173 // Fire some normal revolutions to ensure we recover without additional error types.
174
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 10 times.
✓ Decision 'false' taken 1 time.
11 for (size_t i = 0; i < 10; i++) {
175 // Missing tooth, 2x normal length!
176 10 t += MS2NT(2);
177
1/1
✓ Branch 1 taken 10 times.
10 doTooth(dut, shape, cfg, t);
178
2/7
✓ Branch 3 taken 10 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 10 times.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
10 EXPECT_TRUE(dut.getShaftSynchronized());
179
2/6
✓ Branch 3 taken 10 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 10 times.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
10 EXPECT_EQ(0u, dut.currentCycle.current_index);
180
181 // normal tooth
182 10 t += MS2NT(1);
183
1/1
✓ Branch 1 taken 10 times.
10 doTooth(dut, shape, cfg, t);
184
2/6
✓ Branch 3 taken 10 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 10 times.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
10 EXPECT_EQ(2u, dut.currentCycle.current_index);
185
186 // normal tooth
187 10 t += MS2NT(1);
188
1/1
✓ Branch 1 taken 10 times.
10 doTooth(dut, shape, cfg, t);
189
2/6
✓ Branch 3 taken 10 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 10 times.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
10 EXPECT_EQ(4u, dut.currentCycle.current_index);
190 }
191
192 // Should now have sync again
193
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_TRUE(dut.getShaftSynchronized());
194
195
1/1
✓ Branch 1 taken 1 time.
1 Sensor::resetAllMocks();
196 2 }
197
198 4 TEST(TriggerDecoder, NotEnoughTeeth_CausesError) {
199 1 MockTriggerConfiguration cfg({trigger_type_e::TT_TOOTHED_WHEEL, 4, 1});
200
1/1
✓ Branch 1 taken 1 time.
1 cfg.update();
201
202
1/1
✓ Branch 2 taken 1 time.
1 auto shape = makeTriggerShape(FOUR_STROKE_CAM_SENSOR, cfg);
203
204 1 efitick_t t = 0;
205
206
1/1
✓ Branch 2 taken 1 time.
1 StrictMock<MockTriggerDecoder> dut;
207 // We expect one call to onTriggerError().
208
3/3
✓ Branch 2 taken 1 time.
✓ Branch 6 taken 1 time.
✓ Branch 10 taken 1 time.
1 EXPECT_CALL(dut, onTriggerError());
209
5/5
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 10 taken 1 time.
✓ Branch 14 taken 1 time.
✓ Branch 18 taken 1 time.
1 EXPECT_CALL(dut, onNotEnoughTeeth(_, _));
210
211 // Fire a few boring evenly spaced teeth
212 1 t += MS2NT(1);
213
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
214
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FALSE(dut.getShaftSynchronized());
215
216 1 t += MS2NT(1);
217
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
218
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FALSE(dut.getShaftSynchronized());
219
220 1 t += MS2NT(1);
221
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
222
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FALSE(dut.getShaftSynchronized());
223
224 // Missing tooth, 2x normal length!
225 1 t += MS2NT(2);
226
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
227
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_TRUE(dut.getShaftSynchronized());
228
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(0u, dut.currentCycle.current_index);
229
230 // Fake that we have RPM so that all trigger error detection is enabled
231
1/1
✓ Branch 1 taken 1 time.
1 Sensor::setMockValue(SensorType::Rpm, 1000);
232
233 1 t += MS2NT(1);
234
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
235
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_TRUE(dut.getShaftSynchronized());
236
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(2u, dut.currentCycle.current_index);
237
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FALSE(dut.someSortOfTriggerError());
238
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(0u, dut.totalTriggerErrorCounter);
239
240 // Missing tooth, but it comes early - not enough teeth have happened yet!
241 1 t += MS2NT(2);
242
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
243
244 // Sync is lost until we get to another sync point
245
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_FALSE(dut.getShaftSynchronized());
246
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(0u, dut.currentCycle.current_index);
247
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(1u, dut.totalTriggerErrorCounter);
248
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_TRUE(dut.someSortOfTriggerError());
249
250 // Fire some normal revolutions to ensure we recover without additional error types.
251
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 1 time.
2/2
✓ Decision 'true' taken 10 times.
✓ Decision 'false' taken 1 time.
11 for (size_t i = 0; i < 10; i++) {
252 // normal tooth
253 10 t += MS2NT(1);
254
1/1
✓ Branch 1 taken 10 times.
10 doTooth(dut, shape, cfg, t);
255
2/6
✓ Branch 3 taken 10 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 10 times.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
10 EXPECT_EQ(2u, dut.currentCycle.current_index);
256
257 // normal tooth
258 10 t += MS2NT(1);
259
1/1
✓ Branch 1 taken 10 times.
10 doTooth(dut, shape, cfg, t);
260
2/6
✓ Branch 3 taken 10 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 10 times.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
10 EXPECT_EQ(4u, dut.currentCycle.current_index);
261
262 // Missing tooth, 2x normal length!
263 10 t += MS2NT(2);
264
1/1
✓ Branch 1 taken 10 times.
10 doTooth(dut, shape, cfg, t);
265
2/7
✓ Branch 3 taken 10 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 10 times.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
10 EXPECT_TRUE(dut.getShaftSynchronized());
266
2/6
✓ Branch 3 taken 10 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 10 times.
✗ Branch 11 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
10 EXPECT_EQ(0u, dut.currentCycle.current_index);
267 }
268
269 // Should now have sync again
270
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_TRUE(dut.getShaftSynchronized());
271
272
1/1
✓ Branch 1 taken 1 time.
1 Sensor::resetAllMocks();
273 2 }
274
275 4 TEST(TriggerDecoder, PrimaryDecoderNoDisambiguation) {
276 1 MockTriggerConfiguration cfg({trigger_type_e::TT_TOOTHED_WHEEL, 4, 1});
277
1/1
✓ Branch 1 taken 1 time.
1 cfg.update();
278
279
1/1
✓ Branch 2 taken 1 time.
1 auto shape = makeTriggerShape(FOUR_STROKE_CAM_SENSOR, cfg);
280
281 1 efitick_t t = 0;
282
283
1/1
✓ Branch 2 taken 1 time.
1 PrimaryTriggerDecoder dut("test");
284
285 // This is not the right place for this, but further refactoring has to happen before it can get moved.
286
1/1
✓ Branch 1 taken 1 time.
1 dut.setNeedsDisambiguation(shape.needsDisambiguation());
287
288 // Fire a few boring evenly spaced teeth
289 1 t += MS2NT(1);
290
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
291 1 t += MS2NT(1);
292
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
293 1 t += MS2NT(1);
294
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
295
296 // Missing tooth, 2x normal length!
297 1 t += MS2NT(2);
298
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
299
300 // Is synchronized
301
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_TRUE(dut.getShaftSynchronized());
302 // Has "full" sync, doesn't need cam information to sync
303
1/6
✗ Branch 6 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 10 not taken.
✗ Branch 15 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
1 EXPECT_TRUE(dut.hasSynchronizedPhase());
304 1 }
305
306 4 TEST(TriggerDecoder, PrimaryDecoderNeedsDisambiguation) {
307 1 MockTriggerConfiguration cfg({trigger_type_e::TT_TOOTHED_WHEEL, 4, 1});
308
1/1
✓ Branch 1 taken 1 time.
1 cfg.update();
309
310
1/1
✓ Branch 2 taken 1 time.
1 auto shape = makeTriggerShape(FOUR_STROKE_CRANK_SENSOR, cfg);
311
312 1 efitick_t t = 0;
313
314
1/1
✓ Branch 2 taken 1 time.
1 PrimaryTriggerDecoder dut("test");
315
316 // This is not the right place for this, but further refactoring has to happen before it can get moved.
317
1/1
✓ Branch 1 taken 1 time.
1 dut.setNeedsDisambiguation(shape.needsDisambiguation());
318
319 // Fire a few boring evenly spaced teeth
320 1 t += MS2NT(1);
321
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
322 1 t += MS2NT(1);
323
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
324 1 t += MS2NT(1);
325
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
326
327 // Missing tooth, 2x normal length!
328 1 t += MS2NT(2);
329
1/1
✓ Branch 1 taken 1 time.
1 doTooth(dut, shape, cfg, t);
330
331 // Is synchronized
332
2/7
✓ Branch 3 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
1 EXPECT_TRUE(dut.getShaftSynchronized());
333 // Does not have full sync, this trigger is ambiguous
334
1/6
✗ Branch 6 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 10 not taken.
✗ Branch 15 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
1 EXPECT_FALSE(dut.hasSynchronizedPhase());
335
336 // Provide cam assist information to the primary trigger
337
1/1
✓ Branch 1 taken 1 time.
1 dut.syncEnginePhase(2, 0, 720);
338
339 // We now have full sync!
340
1/6
✗ Branch 6 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 10 not taken.
✗ Branch 15 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
1 EXPECT_TRUE(dut.hasSynchronizedPhase());
341
342 // If there's a trigger error, we lose full sync
343 // Tests above ensure onTriggerError() is called properly
344
1/1
✓ Branch 1 taken 1 time.
1 dut.onTriggerError();
345
1/6
✗ Branch 6 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 10 not taken.
✗ Branch 15 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
1 EXPECT_FALSE(dut.hasSynchronizedPhase());
346 1 }
347