MCU
Loading...
Searching...
No Matches
Macros | Functions
steering_system_test.h File Reference
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include "SteeringSystem.h"
Include dependency graph for steering_system_test.h:

Go to the source code of this file.

Macros

#define PRIMARY_ALPHA   (0.7)
 
#define SECONDARY_ALPHA   (0.7)
 
#define WARN_DIVERGENCE_OFFSET   (0.6)
 
#define ERR_DIVERGENCE_OFFSET   (0.7)
 
#define WARN_FILTER_LATENCY   (8)
 
#define ERR_FILTER_LATENCY   (9)
 

Functions

 TEST (SteeringSystemTesting, test_steering_nominal)
 
 TEST (SteeringSystemTesting, test_steering_primary_is_marginal)
 
 TEST (SteeringSystemTesting, test_steering_secondary_is_marginal)
 
 TEST (SteeringSystemTesting, test_steering_divergence_warning)
 
 TEST (SteeringSystemTesting, test_steering_divergence_error)
 
 TEST (SteeringSystemTesting, test_steering_primary_is_missing)
 
 TEST (SteeringSystemTesting, test_steering_primary_is_missing_and_secondary_is_marginal)
 

Macro Definition Documentation

◆ ERR_DIVERGENCE_OFFSET

#define ERR_DIVERGENCE_OFFSET   (0.7)

Definition at line 10 of file steering_system_test.h.

◆ ERR_FILTER_LATENCY

#define ERR_FILTER_LATENCY   (9)

Definition at line 12 of file steering_system_test.h.

◆ PRIMARY_ALPHA

#define PRIMARY_ALPHA   (0.7)

Definition at line 7 of file steering_system_test.h.

◆ SECONDARY_ALPHA

#define SECONDARY_ALPHA   (0.7)

Definition at line 8 of file steering_system_test.h.

◆ WARN_DIVERGENCE_OFFSET

#define WARN_DIVERGENCE_OFFSET   (0.6)

Definition at line 9 of file steering_system_test.h.

◆ WARN_FILTER_LATENCY

#define WARN_FILTER_LATENCY   (8)

Definition at line 11 of file steering_system_test.h.

Function Documentation

◆ TEST() [1/7]

TEST ( SteeringSystemTesting  ,
test_steering_divergence_error   
)

Definition at line 158 of file steering_system_test.h.

159{
160 // Boilerplate definitions for the testing aparatus
161 SysClock sys_clock;
162 SysTick_s sys_tick = sys_clock.tick(0);
163 SteeringEncoderInterface primarySensor;
164 TelemetryInterface telem_interface;
165 SteeringSystem steeringSystem(&primarySensor, &telem_interface, PRIMARY_ALPHA, SECONDARY_ALPHA);
166 // Filter refernce values for evaluation
167 Filter_IIR<float> mockAngleFilters[2] = {PRIMARY_ALPHA, SECONDARY_ALPHA};
168 float mockPrimaryFilteredAngle;
169 float mockSecondaryFilteredAngle;
170
171 float primaryAngle = 0.0f;
172 // Pend divergence to sensor readings
173 // - IIR filter eq.: filtered_val = (1-alpha)*new_val + alpha*prev_val
174 // - when divergence set exactly to system threshold
175 // - divergence magnitude gets shaved off, will not trigger above threshold
176 // - pend offset to divergence to trip threshold
177 float secondaryAngle = primaryAngle + ERR_DIVERGENCE_OFFSET + STEERING_DIVERGENCE_ERROR_THRESHOLD; // edge discrepancy
178
179 // Latency due to filtering
180 // - required steps of filtering for divergence to rise up to threshold with offset pended
181 // - e.g. when alpha = 0.7, pending offset = 0.6, it takes a minimal of 9 steps of filtering to exceed error threshold
182 for (int i = 0; i < ERR_FILTER_LATENCY; i++) // edge filter steps to align output
183 {
184 mockPrimaryFilteredAngle = mockAngleFilters[0].filtered_result(primaryAngle);
185 mockSecondaryFilteredAngle = mockAngleFilters[1].filtered_result(secondaryAngle);
186
187 primarySensor.mockConversion.angle = primaryAngle;
189 steeringSystem.tick(
191 {
192 .tick = sys_tick,
193 .secondaryConversion = (AnalogConversion_s)
194 {
195 .raw = 0,
196 .conversion = secondaryAngle,
197 .status = AnalogSensorStatus_e::ANALOG_SENSOR_GOOD
198 }
199 }
200 );
201 }
202
203 ASSERT_TRUE(steeringSystem.getSteeringSystemData().angle == 0.0f);
204 ASSERT_TRUE(steeringSystem.getSteeringSystemData().status == SteeringSystemStatus_e::STEERING_SYSTEM_ERROR);
205}
#define STEERING_DIVERGENCE_ERROR_THRESHOLD
dataType filtered_result(dataType new_val)
Definition: Filter_IIR.h:50
SteeringEncoderConversion_s mockConversion
SysClock sys_clock
Definition: main.cpp:215
#define SECONDARY_ALPHA
#define PRIMARY_ALPHA
#define ERR_FILTER_LATENCY
#define ERR_DIVERGENCE_OFFSET

◆ TEST() [2/7]

TEST ( SteeringSystemTesting  ,
test_steering_divergence_warning   
)

Definition at line 109 of file steering_system_test.h.

110{
111 // Boilerplate definitions for the testing aparatus
112 SysClock sys_clock;
113 SysTick_s sys_tick = sys_clock.tick(0);
114 SteeringEncoderInterface primarySensor;
115 TelemetryInterface telem_interface;
116 SteeringSystem steeringSystem(&primarySensor, &telem_interface, PRIMARY_ALPHA, SECONDARY_ALPHA);
117 // Filter refernce values for evaluation
118 Filter_IIR<float> mockAngleFilters[2] = {PRIMARY_ALPHA, SECONDARY_ALPHA};
119 float mockPrimaryFilteredAngle;
120 float mockSecondaryFilteredAngle;
121
122 float primaryAngle = 0.0f;
123 // Pend divergence to sensor readings
124 // - IIR filter eq.: filtered_val = (1-alpha)*new_val + alpha*prev_val
125 // - when divergence set exactly to system threshold
126 // - divergence magnitude gets shaved off, will not trigger above threshold
127 // - pend offset to divergence to trip threshold
128 float secondaryAngle = primaryAngle + WARN_DIVERGENCE_OFFSET + STEERING_DIVERGENCE_WARN_THRESHOLD; // edge discrepancy
129
130 // Latency due to filtering
131 // - required steps of filtering for divergence to rise up to threshold with offset pended
132 // - e.g. when alpha = 0.7, pending offset = 0.6, it takes a minimal of 8 steps of filtering to exceed warn threshold
133 for (int i = 0; i < WARN_FILTER_LATENCY; i++) // edge filter steps to align output
134 {
135 mockPrimaryFilteredAngle = mockAngleFilters[0].filtered_result(primaryAngle);
136 mockSecondaryFilteredAngle = mockAngleFilters[1].filtered_result(secondaryAngle);
137
138 primarySensor.mockConversion.angle = primaryAngle;
140 steeringSystem.tick(
142 {
143 .tick = sys_tick,
144 .secondaryConversion = (AnalogConversion_s)
145 {
146 .raw = 0,
147 .conversion = secondaryAngle,
148 .status = AnalogSensorStatus_e::ANALOG_SENSOR_GOOD
149 }
150 }
151 );
152 }
153
154 ASSERT_TRUE(steeringSystem.getSteeringSystemData().angle == mockPrimaryFilteredAngle);
155 ASSERT_TRUE(steeringSystem.getSteeringSystemData().status == SteeringSystemStatus_e::STEERING_SYSTEM_MARGINAL);
156}
#define STEERING_DIVERGENCE_WARN_THRESHOLD
#define WARN_DIVERGENCE_OFFSET
#define WARN_FILTER_LATENCY

◆ TEST() [3/7]

TEST ( SteeringSystemTesting  ,
test_steering_nominal   
)

Definition at line 14 of file steering_system_test.h.

15{
16 float angles_to_test[5] = {-120.0f, -60.0f, 0.0f, 60.0f, 120.0f};
17 // Boilerplate definitions for the testing aparatus
18 SysClock sys_clock;
19 SysTick_s sys_tick = sys_clock.tick(0);
20 SteeringEncoderInterface primarySensor;
21 TelemetryInterface telem_interface;
22 SteeringSystem steeringSystem(&primarySensor, &telem_interface, PRIMARY_ALPHA, SECONDARY_ALPHA);
23 // Filter refernce values for evaluation
24 Filter_IIR<float> mockAngleFilters[2] = {PRIMARY_ALPHA, SECONDARY_ALPHA};
25
26 // Sweep through a few angles where the sensors agree perfectly and check the system is nominal
27 for (float angle: angles_to_test)
28 {
29 primarySensor.mockConversion.angle = angle;
31 steeringSystem.tick(
33 {
34 .tick = sys_tick,
35 .secondaryConversion = (AnalogConversion_s)
36 {
37 .raw = 0,
38 .conversion = angle,
39 .status = AnalogSensorStatus_e::ANALOG_SENSOR_GOOD
40 }
41 }
42 );
43
44 ASSERT_TRUE(steeringSystem.getSteeringSystemData().angle == mockAngleFilters[0].filtered_result(angle));
45 ASSERT_TRUE(steeringSystem.getSteeringSystemData().status == SteeringSystemStatus_e::STEERING_SYSTEM_NOMINAL);
46 }
47}

◆ TEST() [4/7]

TEST ( SteeringSystemTesting  ,
test_steering_primary_is_marginal   
)

Definition at line 49 of file steering_system_test.h.

50{
51 // Boilerplate definitions for the testing aparatus
52 SysClock sys_clock;
53 SysTick_s sys_tick = sys_clock.tick(0);
54 SteeringEncoderInterface primarySensor;
55 TelemetryInterface telem_interface;
56 SteeringSystem steeringSystem(&primarySensor, &telem_interface, PRIMARY_ALPHA, SECONDARY_ALPHA);
57 // Filter refernce values for evaluation
58 Filter_IIR<float> mockAngleFilters[2] = {PRIMARY_ALPHA, SECONDARY_ALPHA};
59 float angle = 0.0f;
60
61 primarySensor.mockConversion.angle = angle;
63 steeringSystem.tick(
65 {
66 .tick = sys_tick,
67 .secondaryConversion = (AnalogConversion_s)
68 {
69 .raw = 0,
70 .conversion = angle,
71 .status = AnalogSensorStatus_e::ANALOG_SENSOR_GOOD
72 }
73 }
74 );
75 ASSERT_TRUE(steeringSystem.getSteeringSystemData().angle == mockAngleFilters[0].filtered_result(angle));
76 ASSERT_TRUE(steeringSystem.getSteeringSystemData().status == SteeringSystemStatus_e::STEERING_SYSTEM_MARGINAL);
77}

◆ TEST() [5/7]

TEST ( SteeringSystemTesting  ,
test_steering_primary_is_missing   
)

Definition at line 207 of file steering_system_test.h.

208{
209 // Boilerplate definitions for the testing aparatus
210 SysClock sys_clock;
211 SysTick_s sys_tick = sys_clock.tick(0);
212 SteeringEncoderInterface primarySensor;
213 TelemetryInterface telem_interface;
214 SteeringSystem steeringSystem(&primarySensor, &telem_interface, PRIMARY_ALPHA, SECONDARY_ALPHA);
215 // Filter refernce values for evaluation
216 Filter_IIR<float> mockAngleFilters[2] = {PRIMARY_ALPHA, SECONDARY_ALPHA};
217 float angle = 100.0f;
218
219 primarySensor.mockConversion.angle = 0.0f;
221 steeringSystem.tick(
223 {
224 .tick = sys_tick,
225 .secondaryConversion = (AnalogConversion_s)
226 {
227 .raw = 0,
228 .conversion = angle,
229 .status = AnalogSensorStatus_e::ANALOG_SENSOR_GOOD
230 }
231 }
232 );
233 ASSERT_TRUE(steeringSystem.getSteeringSystemData().angle == mockAngleFilters[1].filtered_result(angle));
234 ASSERT_TRUE(steeringSystem.getSteeringSystemData().status == SteeringSystemStatus_e::STEERING_SYSTEM_DEGRADED);
235}

◆ TEST() [6/7]

TEST ( SteeringSystemTesting  ,
test_steering_primary_is_missing_and_secondary_is_marginal   
)

Definition at line 237 of file steering_system_test.h.

238{
239 // Boilerplate definitions for the testing aparatus
240 SysClock sys_clock;
241 SysTick_s sys_tick = sys_clock.tick(0);
242 SteeringEncoderInterface primarySensor;
243 TelemetryInterface telem_interface;
244 SteeringSystem steeringSystem(&primarySensor, &telem_interface, PRIMARY_ALPHA, SECONDARY_ALPHA);
245 float angle = 100.0f;
246
247 primarySensor.mockConversion.angle = 0.0f;
249 steeringSystem.tick(
251 {
252 .tick = sys_tick,
253 .secondaryConversion = (AnalogConversion_s)
254 {
255 .raw = 0,
256 .conversion = angle,
257 .status = AnalogSensorStatus_e::ANALOG_SENSOR_CLAMPED
258 }
259 }
260 );
261 ASSERT_TRUE(steeringSystem.getSteeringSystemData().angle == 0.0f);
262 ASSERT_TRUE(steeringSystem.getSteeringSystemData().status == SteeringSystemStatus_e::STEERING_SYSTEM_ERROR);
263}

◆ TEST() [7/7]

TEST ( SteeringSystemTesting  ,
test_steering_secondary_is_marginal   
)

Definition at line 79 of file steering_system_test.h.

80{
81 // Boilerplate definitions for the testing aparatus
82 SysClock sys_clock;
83 SysTick_s sys_tick = sys_clock.tick(0);
84 SteeringEncoderInterface primarySensor;
85 TelemetryInterface telem_interface;
86 SteeringSystem steeringSystem(&primarySensor, &telem_interface, PRIMARY_ALPHA, SECONDARY_ALPHA);
87 // Filter refernce values for evaluation
88 Filter_IIR<float> mockAngleFilters[2] = {PRIMARY_ALPHA, SECONDARY_ALPHA};
89 float angle = 0.0f;
90
91 primarySensor.mockConversion.angle = angle;
93 steeringSystem.tick(
95 {
96 .tick = sys_tick,
97 .secondaryConversion = (AnalogConversion_s)
98 {
99 .raw = 0,
100 .conversion = angle,
101 .status = AnalogSensorStatus_e::ANALOG_SENSOR_CLAMPED
102 }
103 }
104 );
105 ASSERT_TRUE(steeringSystem.getSteeringSystemData().angle == mockAngleFilters[0].filtered_result(angle));
106 ASSERT_TRUE(steeringSystem.getSteeringSystemData().status == SteeringSystemStatus_e::STEERING_SYSTEM_MARGINAL);
107}