GCC Code Coverage Report


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