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 |