GCC Code Coverage Report


Directory: ./
File: unit_tests/tests/trigger/test_toyota_3_tooth_cam.cpp
Date: 2025-11-16 14:52:24
Warnings: 1 unchecked decisions!
Coverage Exec Excl Total
Lines: 91.0% 81 0 89
Functions: 100.0% 16 0 16
Branches: 44.9% 84 0 187
Decisions: 62.5% 10 - 16

Line Branch Decision Exec Source
1 #include "pch.h"
2 #include "logicdata_csv_reader.h"
3
4 4 TEST(Toyota3ToothCam, RealEngineRunning) {
5 extern bool unitTestTaskNoFastCallWhileAdvancingTimeHack;
6 1 unitTestTaskNoFastCallWhileAdvancingTimeHack = true;
7
8
1/1
✓ Branch 2 taken 1 time.
1 CsvReader reader(1, /* vvtCount */ 1);
9
10
1/1
✓ Branch 1 taken 1 time.
1 reader.open("tests/trigger/resources/toyota_3_tooth_cam.csv");
11
1/1
✓ Branch 2 taken 1 time.
1 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
12 1 engineConfiguration->isFasterEngineSpinUpEnabled = true;
13 1 engineConfiguration->alwaysInstantRpm = true;
14
15 1 engineConfiguration->vvtMode[0] = VVT_TOYOTA_3_TOOTH;
16 1 engineConfiguration->vvtOffsets[0] = 152.58;
17
18 1 engineConfiguration->trigger.customTotalToothCount = 36;
19 1 engineConfiguration->trigger.customSkippedToothCount = 2;
20
1/1
✓ Branch 1 taken 1 time.
1 eth.setTriggerType(trigger_type_e::TT_TOOTHED_WHEEL);
21
22 1 bool hasSeenFirstVvt = false;
23
24
3/3
✓ Branch 1 taken 1582 times.
✓ Branch 3 taken 1581 times.
✓ Branch 4 taken 1 time.
0/1
? Decision couldn't be analyzed.
1582 while (reader.haveMore()) {
25
1/1
✓ Branch 1 taken 1581 times.
1581 reader.processLine(&eth);
26
1/1
✓ Branch 1 taken 1581 times.
1581 float vvt1 = engine->triggerCentral.getVVTPosition(/*bankIndex*/0, /*camIndex*/0);
27
28
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1581 times.
1/2
✗ Decision 'true' not taken.
✓ Decision 'false' taken 1581 times.
1581 if (vvt1 != 0) {
29 if (!hasSeenFirstVvt) {
30 EXPECT_NEAR(vvt1, 0, /*precision*/1);
31 hasSeenFirstVvt = true;
32 }
33
34 // cam position should never be reported outside of correct range
35 EXPECT_TRUE(vvt1 > -3 && vvt1 < 3);
36 }
37 }
38
39
3/7
✓ Branch 3 taken 1 time.
✓ Branch 6 taken 1 time.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 time.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
1 EXPECT_EQ(getTriggerCentral()->triggerState.camResyncCounter, 0);
40
41
3/7
✓ Branch 2 taken 1 time.
✓ Branch 5 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
1 EXPECT_NEAR(engine->triggerCentral.getVVTPosition(/*bankIndex*/0, /*camIndex*/0), 0, 1);
42
4/9
✓ Branch 3 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
1 ASSERT_EQ(3078, round(Sensor::getOrZero(SensorType::Rpm)));
43
44 // TODO: why warnings?
45 // C9002
46
4/9
✓ Branch 3 taken 1 time.
✓ Branch 8 taken 1 time.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✗ Branch 17 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
✓ Branch 32 taken 1 time.
✗ Branch 33 not taken.
1 ASSERT_EQ(1u, eth.recentWarnings()->getCount());
47
4/9
✓ Branch 2 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✓ Branch 30 taken 1 time.
✗ Branch 31 not taken.
1 ASSERT_EQ(ObdCode::CUSTOM_PRIMARY_TOO_MANY_TEETH, eth.recentWarnings()->get(0).Code);
48 1 }
49
50 4 static void test3tooth(size_t revsBeforeVvt, size_t teethBeforeVvt, bool expectSync, int expectCamResyncCounter) {
51 extern bool unitTestTaskNoFastCallWhileAdvancingTimeHack;
52 4 unitTestTaskNoFastCallWhileAdvancingTimeHack = true;
53
1/1
✓ Branch 2 taken 4 times.
4 EngineTestHelper eth(engine_type_e::TEST_ENGINE);
54 4 engineConfiguration->vvtMode[0] = VVT_TOYOTA_3_TOOTH;
55 4 engineConfiguration->skippedWheelOnCam = false;
56 4 engineConfiguration->trigger.customTotalToothCount = 12;
57 4 engineConfiguration->trigger.customSkippedToothCount = 1;
58
1/1
✓ Branch 1 taken 4 times.
4 eth.setTriggerType(trigger_type_e::TT_TOOTHED_WHEEL);
59
60 4 engineConfiguration->vvtOffsets[0] = 35;
61
62
4/9
✓ Branch 3 taken 4 times.
✓ Branch 7 taken 4 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 4 times.
✗ Branch 32 not taken.
4 ASSERT_EQ(0, round(Sensor::getOrZero(SensorType::Rpm)));
63
64 // Get the crank sync'd
65
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 < 4; i++) {
66
1/1
✓ Branch 1 taken 16 times.
16 eth.fireFall(1);
67
1/1
✓ Branch 1 taken 16 times.
16 eth.fireRise(9);
68 }
69
70
4/9
✓ Branch 3 taken 4 times.
✓ Branch 7 taken 4 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 4 times.
✗ Branch 32 not taken.
4 ASSERT_EQ(0, round(Sensor::getOrZero(SensorType::Rpm)));
71
72 // skipped tooth - should sync here
73
1/1
✓ Branch 1 taken 4 times.
4 eth.fireFall(1);
74
1/1
✓ Branch 1 taken 4 times.
4 eth.fireRise(19);
75
76
4/9
✓ Branch 3 taken 4 times.
✓ Branch 7 taken 4 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 16 not taken.
✗ Branch 21 not taken.
✗ Branch 24 not taken.
✓ Branch 31 taken 4 times.
✗ Branch 32 not taken.
4 ASSERT_EQ(500, round(Sensor::getOrZero(SensorType::Rpm)));
77
78 // We should be at TDC
79
4/9
✓ Branch 2 taken 4 times.
✓ Branch 6 taken 4 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 4 times.
✗ Branch 14 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✓ Branch 29 taken 4 times.
✗ Branch 30 not taken.
4 ASSERT_EQ(0, getTriggerCentral()->currentEngineDecodedPhase);
80
81 // Do some number of revolutions before firing the cam tooth
82
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
2/2
✓ Decision 'true' taken 2 times.
✓ Decision 'false' taken 4 times.
6 for (size_t i = 0; i < revsBeforeVvt; i++) {
83
2/2
✓ Branch 0 taken 20 times.
✓ Branch 1 taken 2 times.
2/2
✓ Decision 'true' taken 20 times.
✓ Decision 'false' taken 2 times.
22 for (size_t j = 0; i < 10; i++)
84 {
85
1/1
✓ Branch 1 taken 20 times.
20 eth.fireFall(1);
86
1/1
✓ Branch 1 taken 20 times.
20 eth.fireRise(9);
87 }
88
89
1/1
✓ Branch 1 taken 2 times.
2 eth.fireFall(1);
90
1/1
✓ Branch 1 taken 2 times.
2 eth.fireRise(19);
91 }
92
93 // Bump ahead by some more teeth
94
2/2
✓ Branch 0 taken 28 times.
✓ Branch 1 taken 4 times.
2/2
✓ Decision 'true' taken 28 times.
✓ Decision 'false' taken 4 times.
32 for (size_t i = 0; i < teethBeforeVvt; i++) {
95
1/1
✓ Branch 1 taken 28 times.
28 eth.fireFall(1);
96
1/1
✓ Branch 1 taken 28 times.
28 eth.fireRise(9);
97 }
98 4 auto expectedPhase = 360 * revsBeforeVvt + 30 * teethBeforeVvt;
99
4/9
✓ Branch 2 taken 4 times.
✓ Branch 5 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✓ Branch 27 taken 4 times.
✗ Branch 28 not taken.
4 ASSERT_EQ(expectedPhase, getTriggerCentral()->currentEngineDecodedPhase);
100
101 // No full sync yet, no VVT has arrived
102
3/7
✓ Branch 3 taken 4 times.
✓ Branch 8 taken 4 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 4 times.
✗ Branch 17 not taken.
✗ Branch 22 not taken.
✗ Branch 25 not taken.
4 EXPECT_EQ(false, getTriggerCentral()->triggerState.hasSynchronizedPhase());
103
104 // Now fire a cam tooth - this shouldn't change engine phase,
105 // should set VVT position
106
2/2
✓ Branch 1 taken 4 times.
✓ Branch 4 taken 4 times.
4 hwHandleVvtCamSignal(true, getTimeNowNt(), 0);
107
108
3/7
✓ Branch 2 taken 4 times.
✓ Branch 5 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✗ Branch 12 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
4 EXPECT_EQ(expectCamResyncCounter, getTriggerCentral()->triggerState.camResyncCounter);
109
3/7
✓ Branch 3 taken 4 times.
✓ Branch 7 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 4 times.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
4 EXPECT_EQ(expectSync, getTriggerCentral()->triggerState.hasSynchronizedPhase());
110
111
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
1/2
✗ Decision 'true' not taken.
✓ Decision 'false' taken 4 times.
4 if (expectSync) {
112 EXPECT_EQ(5, getTriggerCentral()->getVVTPosition(0, 0));
113
114 // Bump ahead by one tooth
115 eth.fireFall(1);
116 eth.fireRise(9);
117 ASSERT_EQ(60, getTriggerCentral()->currentEngineDecodedPhase);
118 } else {
119
4/8
✓ Branch 3 taken 4 times.
✓ Branch 6 taken 4 times.
✓ Branch 10 taken 4 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 4 times.
✗ Branch 19 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
4 EXPECT_EQ(0, getTriggerCentral()->getVVTPosition(0, 0));
120 }
121 4 }
122
123 // The cam has 3 teeth, which could arrive at one of 6 possible crank phases.
124 // 0 revs or 1 revs
125 // +0, +120, or +240 deg
126 // Test all 6 cases!
127
128 //TEST(Toyota3ToothCam, TestFirstToothInPhase) {
129 // test3tooth(0, 1, true, 0);
130 //}
131 //
132 //TEST(Toyota3ToothCam, TestFirstToothOutOfPhase) {
133 // test3tooth(1, 1, true, 1);
134 //}
135
136 4 TEST(Toyota3ToothCam, TestSecondToothInPhase) {
137 1 test3tooth(0, 5, false, 0);
138 1 }
139
140 4 TEST(Toyota3ToothCam, TestSecondToothOutOfPhase) {
141 1 test3tooth(1, 5, false, 0);
142 1 }
143
144 4 TEST(Toyota3ToothCam, TestThirdToothInPhase) {
145 1 test3tooth(0, 9, false, 0);
146 1 }
147
148 4 TEST(Toyota3ToothCam, TestThirdToothOutOfPhase) {
149 1 test3tooth(1, 9, false, 0);
150 1 }
151