1
+ //
2
+ // Created by kifir on 12/2/24.
3
+ //
4
+
5
+ #include " pch.h"
6
+
7
+ #include " util/test_base.h"
8
+
9
+ namespace {
10
+ class NitrousConditionTest : public TestBase {
11
+ protected:
12
+ static constexpr switch_input_pin_e TEST_NITROUS_CONTROL_ARMING_PIN = Gpio::A13;
13
+ static constexpr int TEST_MIN_TPS = 34 ;
14
+ static constexpr uint8_t TEST_MIN_CLT = 51 ;
15
+ static constexpr int TEST_MAX_MAP = 45 ;
16
+
17
+ static constexpr float TEST_MAXIMUM_AFR = 12.3 ;
18
+ static constexpr float TEST_LAMBDA1 = TEST_MAXIMUM_AFR / STOICH_RATIO;
19
+
20
+ static constexpr uint16_t TEST_ACTIVATION_RPM = 239 ;
21
+ static constexpr uint16_t TEST_DEACTIVATION_RPM = 932 ;
22
+ static constexpr uint16_t TEST_DEACTIVATION_RPM_WINDOW = 17 ;
23
+
24
+ void SetUp () override ;
25
+
26
+ void satisfyAllConditions ();
27
+ private:
28
+ void armNitrousControl ();
29
+ void satisfyTpsCondition ();
30
+ void satisfyCltCondition ();
31
+ void satisfyMapCondition ();
32
+ void satisfyAfrCondition ();
33
+ void satisfyRpmCondition ();
34
+ };
35
+
36
+ void NitrousConditionTest::SetUp () {
37
+ TestBase::SetUp ();
38
+
39
+ setUpEngineConfiguration (EngineConfig ()
40
+ .setNitrousControlEnabled ({ true })
41
+ .setNitrousControlArmingMethod ({ DIGITAL_SWITCH_INPUT })
42
+ .setNitrousControlTriggerPin ({ TEST_NITROUS_CONTROL_ARMING_PIN })
43
+ .setNitrousMinimumTps ({ TEST_MIN_TPS })
44
+ .setNitrousMinimumClt ({ TEST_MIN_CLT })
45
+ .setNitrousMaximumMap ({ TEST_MAX_MAP })
46
+ .setNitrousMaximumAfr ({ TEST_MAXIMUM_AFR })
47
+ .setNitrousActivationRpm ({ TEST_ACTIVATION_RPM })
48
+ .setNitrousDeactivationRpm ({ TEST_DEACTIVATION_RPM })
49
+ .setNitrousDeactivationRpmWindow ({ TEST_DEACTIVATION_RPM_WINDOW })
50
+ );
51
+
52
+ satisfyAllConditions ();
53
+ }
54
+
55
+ void NitrousConditionTest::satisfyAllConditions () {
56
+ armNitrousControl ();
57
+ satisfyTpsCondition ();
58
+ satisfyCltCondition ();
59
+ satisfyMapCondition ();
60
+ satisfyAfrCondition ();
61
+ satisfyRpmCondition ();
62
+
63
+ EXPECT_TRUE (engine->nitrousController .isNitrousRpmConditionSatisfied );
64
+ }
65
+
66
+ void NitrousConditionTest::armNitrousControl () {
67
+ setMockState (TEST_NITROUS_CONTROL_ARMING_PIN, true );
68
+ periodicFastCallback ();
69
+
70
+ EXPECT_TRUE (engine->nitrousController .isArmed );
71
+ }
72
+
73
+ void NitrousConditionTest::satisfyTpsCondition () {
74
+ updateApp (TEST_MIN_TPS);
75
+
76
+ EXPECT_TRUE (engine->nitrousController .isTpsConditionSatisfied );
77
+ }
78
+
79
+ void NitrousConditionTest::satisfyCltCondition () {
80
+ updateClt (TEST_MIN_CLT);
81
+
82
+ EXPECT_TRUE (engine->nitrousController .isCltConditionSatisfied );
83
+ }
84
+
85
+ void NitrousConditionTest::satisfyMapCondition () {
86
+ updateMap (TEST_MAX_MAP);
87
+
88
+ EXPECT_TRUE (engine->nitrousController .isMapConditionSatisfied );
89
+ }
90
+
91
+ void NitrousConditionTest::satisfyAfrCondition () {
92
+ updateLambda1 (TEST_LAMBDA1);
93
+
94
+ EXPECT_TRUE (engine->nitrousController .isAfrConditionSatisfied );
95
+ }
96
+
97
+ void NitrousConditionTest::satisfyRpmCondition () {
98
+ updateRpm (TEST_ACTIVATION_RPM);
99
+
100
+ EXPECT_TRUE (engine->nitrousController .isNitrousRpmConditionSatisfied );
101
+ }
102
+
103
+ TEST_F (NitrousConditionTest, checkWithoutArmedNitrousControl) {
104
+ setMockState (TEST_NITROUS_CONTROL_ARMING_PIN, false );
105
+ periodicFastCallback ();
106
+
107
+ EXPECT_FALSE (engine->nitrousController .isArmed );
108
+ EXPECT_FALSE (engine->nitrousController .isNitrousConditionSatisfied );
109
+ }
110
+
111
+ TEST_F (NitrousConditionTest, checkWithoutSatisfiedTpsCondition) {
112
+ updateApp (TEST_MIN_TPS - EPS5D);
113
+
114
+ EXPECT_FALSE (engine->nitrousController .isTpsConditionSatisfied );
115
+ EXPECT_FALSE (engine->nitrousController .isNitrousConditionSatisfied );
116
+ }
117
+
118
+ TEST_F (NitrousConditionTest, checkWithoutSatisfiedCltCondition) {
119
+ updateClt (TEST_MIN_CLT - EPS5D);
120
+
121
+ EXPECT_FALSE (engine->nitrousController .isCltConditionSatisfied );
122
+ EXPECT_FALSE (engine->nitrousController .isNitrousConditionSatisfied );
123
+ }
124
+
125
+ TEST_F (NitrousConditionTest, checkWithoutSatisfiedMapCondition) {
126
+ updateMap (TEST_MAX_MAP + EPS5D);
127
+
128
+ EXPECT_FALSE (engine->nitrousController .isMapConditionSatisfied );
129
+ EXPECT_FALSE (engine->nitrousController .isNitrousConditionSatisfied );
130
+ }
131
+
132
+ TEST_F (NitrousConditionTest, checkWithoutSatisfiedAfrCondition) {
133
+ updateLambda1 (TEST_LAMBDA1 + EPS5D);
134
+
135
+ EXPECT_FALSE (engine->nitrousController .isAfrConditionSatisfied );
136
+ EXPECT_FALSE (engine->nitrousController .isNitrousConditionSatisfied );
137
+ }
138
+
139
+ TEST_F (NitrousConditionTest, checkWithoutSatisfiedRpmCondition) {
140
+ updateRpm (TEST_ACTIVATION_RPM - EPS5D);
141
+
142
+ EXPECT_FALSE (engine->nitrousController .isNitrousRpmConditionSatisfied );
143
+ EXPECT_FALSE (engine->nitrousController .isNitrousConditionSatisfied );
144
+ }
145
+ }
0 commit comments