MCU
Loading...
Searching...
No Matches
PedalsSystem.cpp
Go to the documentation of this file.
1#include "PedalsSystem.h"
2#include <iostream>
3
4#include <algorithm>
5
6// TODO parameterize percentages in constructor
7void PedalsSystem::tick(const SysTick_s &tick, const AnalogConversion_s &accel1, const AnalogConversion_s &accel2, const AnalogConversion_s &brake1, const AnalogConversion_s &brake2)
8{
9 data_ = evaluate_pedals(accel1, accel2, brake1, brake2, tick.millis);
10}
11
12void PedalsSystem::tick(const SysTick_s &tick, const AnalogConversion_s &accel1, const AnalogConversion_s &accel2, const AnalogConversion_s &brake)
13{
14 data_ = evaluate_pedals(accel1, accel2, brake, tick.millis);
15}
16
17
18// TODO make it to where only when the pedal is released fully that the implausibility clears
19
20
21PedalsSystemData_s PedalsSystem::evaluate_pedals(const AnalogConversion_s &accel1,
22 const AnalogConversion_s &accel2,
23 const AnalogConversion_s &brake,
24 unsigned long curr_time)
25{
27
28
29 out.accelPressed = pedal_is_active_(accel1.conversion, accel2.conversion, accelParams_, false);
31 out.accelPercent = (out.accelImplausible) ? accel1.conversion : (accel1.conversion + accel2.conversion) / 2.0;
33 out.accelPercent = std::max(out.accelPercent, 0.0f);
36 bool implausibility = (out.brakeAndAccelPressedImplausibility || out.brakeImplausible || out.accelImplausible);
37
38 if (implausibility && (implausibilityStartTime_ == 0))
39 {
40 implausibilityStartTime_ = curr_time;
41 }
42 else if ((!implausibility) && ((out.accelPercent <= 0.05)))
43 {
45 }
46
49 out.accelPercent = (oor) ? 0 : out.accelPercent;
50
51
52 out.brakePercent = brake.conversion;
54 out.brakePressed = brake.conversion >= brakeParams_.activation_percentage;
55
57 out.regenPercent = std::max(std::min(out.brakePercent / brakeParams_.mechanical_activation_percentage, 1.0f), 0.0f);
58
59
61 return out;
62}
63
64PedalsSystemData_s PedalsSystem::evaluate_pedals(const AnalogConversion_s &accel1,
65 const AnalogConversion_s &accel2,
66 const AnalogConversion_s &brake1,
67 const AnalogConversion_s &brake2,
68 unsigned long curr_time)
69{
70
72 out.accelPressed = pedal_is_active_(accel1.conversion, accel2.conversion, accelParams_, false);
74
75 auto percent = (out.accelImplausible) ? accel1.conversion : (accel1.conversion + accel2.conversion) / 2.0;
77 out.accelPercent = std::max(out.accelPercent, 0.0f);
78
79
82 bool implausibility = (out.brakeAndAccelPressedImplausibility || out.brakeImplausible || out.accelImplausible);
83
84 if (implausibility && (implausibilityStartTime_ == 0))
85 {
86 implausibilityStartTime_ = curr_time;
87 }
88 else if ((!implausibility) && (!(out.accelPercent > 0.05)))
89 {
91 }
92
95 out.accelPercent = (oor) ? 0 : out.accelPercent;
96
97 out.brakePercent = (brake1.conversion + brake2.conversion) / 2.0;
98
100
101 out.regenPercent = std::max(std::min(out.brakePercent / brakeParams_.mechanical_activation_percentage, 1.0f), 0.0f);
102
103 out.brakePressed = pedal_is_active_(brake1.conversion, brake2.conversion, brakeParams_, false);
104 out.mechBrakeActive = pedal_is_active_(brake1.conversion, brake2.conversion, brakeParams_, true);
106
107 return out;
108}
109
110// TODO parameterize duration in constructor
112{
114 {
115 return ((curr_time - implausibilityStartTime_) > 100);
116 }
117 else
118 {
119 return false;
120 }
121}
122
123// only checks implaus based on first min / max
124bool PedalsSystem::evaluate_pedal_implausibilities_(const AnalogConversion_s &pedalData, const PedalsParams &params)
125{
126 return evaluate_min_max_pedal_implausibilities_(pedalData, params.min_pedal_1, params.max_pedal_1, params.implausibility_margin);
127}
128
129bool PedalsSystem::evaluate_pedal_implausibilities_(const AnalogConversion_s &pedalData1,
130 const AnalogConversion_s &pedalData2,
131 const PedalsParams &params,
132 float max_percent_diff)
133{
134 bool pedal1_min_max_implaus = evaluate_min_max_pedal_implausibilities_(pedalData1, params.min_pedal_1, params.max_pedal_1, params.implausibility_margin);
135 bool pedal2_min_max_implaus = evaluate_min_max_pedal_implausibilities_(pedalData2, params.min_pedal_2, params.max_pedal_2, params.implausibility_margin);
136 bool sens_not_within_req_percent = (fabs(pedalData1.conversion - pedalData2.conversion) > max_percent_diff);
137 if (pedal1_min_max_implaus || pedal2_min_max_implaus)
138 {
139 return true;
140 }
141 else if (sens_not_within_req_percent)
142 {
143 return true;
144 }
145 else
146 {
147 return false;
148 }
149}
150
151bool PedalsSystem::evaluate_min_max_pedal_implausibilities_(const AnalogConversion_s &pedalData,
152 int min,
153 int max,
154 float implaus_margin_scale)
155{
156
157 bool pedal_swapped = false;
158
159 // get the pedal margin. The margin will be a percentage of the range of the measured max values
160 int pedal_margin = abs(max - min) * implaus_margin_scale;
161
162 if (min > max)
163 {
164 pedal_swapped = true;
165 // swap the logic: need to check and see if it is greater than min and less than max
166 }
167 // FSAE EV.5.5
168 // FSAE T.4.2.10
169 bool pedal_less_than_min = pedal_swapped ? (pedalData.raw > (min + pedal_margin))
170 : (pedalData.raw < (min - pedal_margin));
171
172 bool pedal_greater_than_max = pedal_swapped ? (pedalData.raw < (max - pedal_margin))
173 : (pedalData.raw > (max + pedal_margin));
174
175 if (pedal_less_than_min)
176 {
177 return true;
178 }
179 else if (pedal_greater_than_max)
180 {
181 return true;
182 }
183 else
184 {
185 return false;
186 }
187}
188
189float PedalsSystem::remove_deadzone_(float conversion_input, float deadzone)
190{
191 float range = 1.0 - (deadzone * 2);
192 // e.g. vals from 0 to 1, deadzone is .05, range is .1
193 // subtract deadzone to be -.05 to .95 & clamp at 0
194 float out = std::max(conversion_input - deadzone, 0.0f);
195 // values now are 0 to .95
196 // divide by range of values to scale up (.9)
197 out /= range;
198 // values are now 0 to 1.0555...
199 // clamp at 0 to 1
200 out = std::min(out, 1.0f);
201
202 return out;
203}
204
205bool PedalsSystem::evaluate_brake_and_accel_pressed_(const AnalogConversion_s &accelPedalData1,
206 const AnalogConversion_s &accelPedalData2,
207 const AnalogConversion_s &brakePedalData)
208{
209
210
211
212 bool accel_pressed = pedal_is_active_(accelPedalData1.conversion, accelPedalData2.conversion, accelParams_, false); // .1
213 float brake_pedal_real = remove_deadzone_(brakePedalData.conversion, brakeParams_.deadzone_margin);
214 bool mech_brake_pressed = brake_pedal_real >= brakeParams_.mechanical_activation_percentage;
215 bool both_pedals_implausible = (accel_pressed && mech_brake_pressed);
216 return both_pedals_implausible;
217}
218
219bool PedalsSystem::evaluate_brake_and_accel_pressed_(const AnalogConversion_s &accelPedalData1,
220 const AnalogConversion_s &accelPedalData2,
221 const AnalogConversion_s &brakePedalData1,
222 const AnalogConversion_s &brakePedalData2)
223{
224
225
226 bool accel_pressed = pedal_is_active_(accelPedalData1.conversion, accelPedalData2.conversion, accelParams_, false); // .1
227 bool mech_brake_pressed = pedal_is_active_(brakePedalData1.conversion, brakePedalData2.conversion, brakeParams_, true); // 0.40
228
229
230 bool both_pedals_implausible = (accel_pressed && mech_brake_pressed);
231 return both_pedals_implausible;
232}
233
234bool PedalsSystem::pedal_is_active_(float pedal1ConvertedData, float pedal2ConvertedData, const PedalsParams& params, bool check_mech_activation)
235{
236 float val1_deadzone_removed = remove_deadzone_(pedal1ConvertedData, params.deadzone_margin);
237 float val2_deadzone_removed = remove_deadzone_(pedal2ConvertedData, params.deadzone_margin);
238 bool pedal_1_is_active;
239 bool pedal_2_is_active;
240 if(check_mech_activation)
241 {
242 pedal_1_is_active = val1_deadzone_removed >= params.mechanical_activation_percentage;
243 pedal_2_is_active = val2_deadzone_removed >= params.mechanical_activation_percentage;
244 } else {
245 pedal_1_is_active = val1_deadzone_removed >= params.activation_percentage;
246 pedal_2_is_active = val2_deadzone_removed >= params.activation_percentage;
247 }
248 return (pedal_1_is_active || pedal_2_is_active);
249}
250
251bool PedalsSystem::evaluate_pedal_oor(const AnalogConversion_s &pedalData,
252 int min,
253 int max)
254{
255 return (pedalData.raw >= max || pedalData.raw <= min);
256}
PedalsSystemData_s evaluate_pedals(const AnalogConversion_s &accel1, const AnalogConversion_s &accel2, const AnalogConversion_s &brake1, const AnalogConversion_s &brake2, unsigned long curr_time)
PedalsSystemData_s data_
Definition: PedalsSystem.h:124
PedalsParams brakeParams_
Definition: PedalsSystem.h:126
bool max_duration_of_implausibility_exceeded_(unsigned long curr_time)
PedalsParams accelParams_
Definition: PedalsSystem.h:125
unsigned long implausibilityStartTime_
Definition: PedalsSystem.h:127
bool evaluate_min_max_pedal_implausibilities_(const AnalogConversion_s &pedalData, int min, int max, float implaus_margin_scale)
bool pedal_is_active_(float pedal1ConvertedData, float pedal2ConvertedData, const PedalsParams &params, bool check_mech_activation)
check whether or not pedal is active according to input parameters. returns true if either pedal is o...
bool evaluate_pedal_oor(const AnalogConversion_s &pedalData, int min, int max)
This checks to see if any pedal sensor is out of range :(.
bool evaluate_pedal_implausibilities_(const AnalogConversion_s &pedalData1, const AnalogConversion_s &pedalData2, const PedalsParams &params, float max_percent_diff)
Evaluate pedal implausibilities_ determines if there is a software implausibility in the pedals cause...
void tick(const SysTick_s &tick, const AnalogConversion_s &accel1, const AnalogConversion_s &accel2, const AnalogConversion_s &brake)
overloaded tick function that runs the evaluation of the pedals system. evaluates brake using only mi...
bool evaluate_brake_and_accel_pressed_(const AnalogConversion_s &accelPedalData1, const AnalogConversion_s &accelPedalData2, const AnalogConversion_s &brakePedalData1, const AnalogConversion_s &brakePedalData2)
function to determine if the pedals and the brakes are pressed at the same time. evaluates brake bein...
float remove_deadzone_(float conversion_input, float deadzone)
ParameterInterface params
system interface struct that contains the data from the pedal system
Definition: PedalsSystem.h:26
float deadzone_margin
Definition: PedalsSystem.h:36
int max_sensor_pedal_1
Definition: PedalsSystem.h:33
float activation_percentage
Definition: PedalsSystem.h:35
float mechanical_activation_percentage
Definition: PedalsSystem.h:38
int min_sensor_pedal_1
Definition: PedalsSystem.h:31
int min_sensor_pedal_2
Definition: PedalsSystem.h:32
int max_sensor_pedal_2
Definition: PedalsSystem.h:34
bool brakeAndAccelPressedImplausibility
bool implausibilityExceededMaxDuration