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