Formula Student Electronics & Software
The code for the embedded software
Loading...
Searching...
No Matches
checkupManager.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstdlib>
4
5#include "debugUtils.hpp"
9
10// Also known as Orchestrator
15private:
16 SystemData *_system_data_;
17 TeensyTimerTool::PeriodicTimer watchdog_timer_;
19 Metro _watchdog_toggle_timer_{WATCHDOG_TOGGLE_DURATION};
20 Metro _watchdog_test_timer_{WATCHDOG_TEST_DURATION};
21
27 bool failed_to_build_hydraulic_pressure_in_time() const;
32 bool failed_to_reduce_hydraulic_pressure_in_time() const;
33
37 void handle_ebs_check();
38
39public:
41
64
74
86
89
91
96 explicit CheckupManager(SystemData *system_data) : _system_data_(system_data) {};
97
101 void reset_checkup_state();
102
107
111 [[nodiscard]] bool should_stay_manual_driving() const;
112
116 bool should_stay_off();
117
122
126 [[nodiscard]] bool should_go_ready_from_off() const;
127
131 [[nodiscard]] bool should_stay_ready() const;
132
136 [[nodiscard]] bool should_enter_emergency(State current_state) const;
137
140
141 [[nodiscard]] bool should_stay_driving() const;
142
146 [[nodiscard]] bool should_stay_mission_finished() const;
147
152 [[nodiscard]] bool emergency_sequence_complete() const;
153
160 [[nodiscard]] bool res_triggered() const;
161};
162
167
169 if (_system_data_->mission_ != Mission::MANUAL ||
170 _system_data_->hardware_data_.pneumatic_line_pressure_ != 0 ||
171 _system_data_->hardware_data_.asms_on_) {
172 return false;
173 }
174
175 return true;
176}
177
179 _system_data_->r2d_logics_.refresh_r2d_vars();
180 CheckupError init_sequence_state = initial_checkup_sequence();
181
182 if (init_sequence_state != CheckupError::SUCCESS) {
183 return true;
184 }
185 return false;
186}
187
189 _system_data_->mission_finished_ = false;
190}
191
193 if (!_system_data_->hardware_data_.asms_on_) {
195 }
196 switch (checkup_state_) {
198 if (_system_data_->hardware_data_.asms_on_) {
200 DEBUG_PRINT("ASMS activated, starting watchdog check");
201 }
202 break;
204 if (_system_data_->hardware_data_.wd_ready_) {
206 _watchdog_toggle_timer_.reset();
207 DEBUG_PRINT("Watchdog ready, starting toggle sequence");
208 break;
209 }
211 break;
212
214 // Fail immediately if WD_READY goes low during toggling
215 if (!_system_data_->hardware_data_.wd_ready_) {
216 DEBUG_PRINT("Watchdog error: WD_READY went low during toggling phase");
218 }
219
221
222 // Toggle for the specified duration
223 if (_watchdog_toggle_timer_.checkWithoutReset()) {
225 _watchdog_test_timer_.reset();
226 DEBUG_PRINT("Watchdog toggle complete, stopping watchdog");
227 }
228 break;
229
231 _watchdog_test_timer_.reset();
233 DEBUG_PRINT("Stopping watchdog toggle, beginning verification");
234 break;
235
237 if (!_system_data_->hardware_data_.wd_ready_) {
239
241 DEBUG_PRINT("Watchdog no longer ready - verification successful");
242 break;
243 }
244 if (_watchdog_test_timer_.checkWithoutReset()) {
245 DEBUG_PRINT("Watchdog test failed - WD_READY did not go low during verification time");
247 }
248 break;
250 watchdog_timer_.begin([] { DigitalSender::toggle_watchdog(); }, 50'000);
252 break;
254 DEBUG_PRINT("EBS Storage - pressure: " +
255 String(_system_data_->hardware_data_.pneumatic_line_pressure_));
256 if (_system_data_->hardware_data_.pneumatic_line_pressure_) {
258 }
259 break;
262 "Hydraulic Pressure: " + String(_system_data_->hardware_data_._hydraulic_line_pressure) +
263 " - " + String(_system_data_->hardware_data_.hydraulic_line_front_pressure));
264 if (_system_data_->hardware_data_._hydraulic_line_pressure >= HYDRAULIC_BRAKE_THRESHOLD &&
266 HYDRAULIC_BRAKE_THRESHOLD
270 }
271 break;
273 if (_system_data_->hardware_data_.asats_pressed_) {
274 _system_data_->failure_detection_.emergency_signal_ = false;
276 DEBUG_PRINT("AS ATS Pressed");
277 }
278 break;
280 if (_system_data_->failure_detection_.has_any_component_timed_out() ||
281 _system_data_->failure_detection_.emergency_signal_) {
283 }
285 break;
286 }
288 if (_system_data_->mission_ != Mission::MANUAL) {
289 this->_system_data_->hardware_data_.master_sdc_closed_ = true;
291 DEBUG_PRINT("Closing SDC");
292
294 }
295 break;
297 DEBUG_PRINT("Waiting for TS activation");
298 if (_system_data_->failure_detection_.ts_on_) {
299 DEBUG_PRINT("TS activated");
301 }
302 break;
304 // DEBUG_PRINT("Starting EBS checks");
305 handle_ebs_check();
306 break;
308 // Final state, all checks passed
309 DEBUG_PRINT("Checkup complete, transitioning to ready state");
311
312 default:
313 break;
314 }
316}
317
318inline void CheckupManager::handle_ebs_check() {
319 switch (pressure_test_phase_) {
321 // Step 10: Disable EBS actuator 1
322 DEBUG_PRINT("Disabling EBS actuator 1");
325 break;
326
329 if (_system_data_->hardware_data_.pneumatic_line_pressure_ &&
330 _system_data_->hardware_data_._hydraulic_line_pressure < HYDRAULIC_BRAKE_THRESHOLD &&
332 HYDRAULIC_BRAKE_THRESHOLD) { // pressure should be high even with only one actuator
333 DEBUG_PRINT("Pressure high confirmed with only actuator 2");
335 }
336 break;
337
339 // Step 12: Enable EBS actuator 1 again and disable actuator 2
340 DEBUG_PRINT("Re-enabling EBS actuator 1 and disabling actuator 2");
344 break;
345
347 // Step 13: Check that the brake pressure is still built up correctly
348 if (_system_data_->hardware_data_.pneumatic_line_pressure_ &&
350 HYDRAULIC_BRAKE_THRESHOLD &&
351 _system_data_->hardware_data_.hydraulic_line_front_pressure < HYDRAULIC_BRAKE_THRESHOLD) {
352 DEBUG_PRINT("Pressure high confirmed with only actuator 1");
354 }
355 break;
356
358 // Step 14: Enable EBS actuator 2 again
359 DEBUG_PRINT("Re-enabling EBS actuator 2");
362 break;
363
365 // Step 15: Check that both actuators are working correctly
366 DEBUG_PRINT("Final pressure check");
367 if (_system_data_->hardware_data_.pneumatic_line_pressure_ &&
369 HYDRAULIC_BRAKE_THRESHOLD &&
370 _system_data_->hardware_data_._hydraulic_line_pressure >= HYDRAULIC_BRAKE_THRESHOLD) {
371 DEBUG_PRINT("Both actuators confirmed working correctly");
373 }
374 break;
375
377 // Step 16: Transition to ready state
378 DEBUG_PRINT("EBS check complete, transitioning to next state");
381 break;
382 }
383}
384
386 if (!_system_data_->r2d_logics_.r2d) {
387 return true;
388 }
389 _system_data_->r2d_logics_.reset_ebs_timestamp();
390 return false;
391}
392
393// ----------------------------------------------------------
394// this is ugly as fuck but I don't care >:(
395// ----------------------------------------------------------
396inline bool CheckupManager::should_enter_emergency(State current_state) const {
397 if (current_state == State::AS_READY) {
399 } else if (current_state == State::AS_DRIVING) {
401 }
402 return false;
403}
404
406 bool component_timed_out = _system_data_->failure_detection_.has_any_component_timed_out();
407 bool failed_to_build_pressure = failed_to_build_hydraulic_pressure_in_time();
408 // DEBUG_PRINT_VAR(component_timed_out);
409 // DEBUG_PRINT_VAR(failed_to_build_pressure);
410 // DEBUG_PRINT_VAR(_system_data_->hardware_data_.asms_on_);
411 // DEBUG_PRINT_VAR(_system_data_->failure_detection_.ts_on_);
412 // DEBUG_PRINT_VAR(_system_data_->hardware_data_.tsms_sdc_closed_);
413 // DEBUG_PRINT_VAR(_system_data_->failure_detection_.emergency_signal_);
414 // DEBUG_PRINT_VAR(!_system_data_->hardware_data_.pneumatic_line_pressure_);
415 return _system_data_->failure_detection_.emergency_signal_ ||
417 component_timed_out || !_system_data_->hardware_data_.asms_on_ ||
418 !_system_data_->failure_detection_.ts_on_ ||
419 failed_to_build_pressure ||
420 !_system_data_->hardware_data_.tsms_sdc_closed_;
421}
422
424 bool component_timed_out = _system_data_->failure_detection_.has_any_component_timed_out();
425 bool failed_to_reduce_pressure = failed_to_reduce_hydraulic_pressure_in_time();
426 // DEBUG_PRINT_VAR(component_timed_out);
427 // DEBUG_PRINT_VAR(failed_to_reduce_pressure);
428 // DEBUG_PRINT_VAR(_system_data_->hardware_data_.asms_on_);
429 // DEBUG_PRINT_VAR(_system_data_->failure_detection_.ts_on_);
430 // DEBUG_PRINT_VAR(_system_data_->hardware_data_.tsms_sdc_closed_);
431 // DEBUG_PRINT_VAR(_system_data_->failure_detection_.emergency_signal_);
432 // DEBUG_PRINT_VAR(!_system_data_->hardware_data_.pneumatic_line_pressure_);
433 return component_timed_out || _system_data_->failure_detection_.emergency_signal_ ||
434 !_system_data_->hardware_data_.tsms_sdc_closed_ ||
436 failed_to_reduce_pressure ||
437 !_system_data_->hardware_data_.asms_on_ || !_system_data_->failure_detection_.ts_on_;
438}
439
440bool CheckupManager::failed_to_build_hydraulic_pressure_in_time() const {
441 return (_system_data_->hardware_data_._hydraulic_line_pressure < HYDRAULIC_BRAKE_THRESHOLD ||
442 _system_data_->hardware_data_.hydraulic_line_front_pressure < HYDRAULIC_BRAKE_THRESHOLD ||
446}
447
448bool CheckupManager::failed_to_reduce_hydraulic_pressure_in_time() const {
449 return (_system_data_->hardware_data_._hydraulic_line_pressure >= HYDRAULIC_BRAKE_THRESHOLD + 30 ||
450 _system_data_->hardware_data_.hydraulic_line_front_pressure >= HYDRAULIC_BRAKE_THRESHOLD + 30) &&
452}
453
455 if (abs(_system_data_->hardware_data_._left_wheel_rpm) < 0.1 &&
456 abs(_system_data_->hardware_data_._right_wheel_rpm) < 0.1 &&
457 _system_data_->mission_finished_) {
458 return false;
459 }
460 return true;
461}
462
464 if (_system_data_->hardware_data_.asms_on_) {
465 return true;
466 }
467 return false;
468}
469
472 return true;
473 }
474 return false;
475}
476
477inline bool CheckupManager::res_triggered() const {
478 return _system_data_->failure_detection_.emergency_signal_;
479}
The CheckupManager class handles various checkup operations.
bool should_stay_manual_driving() const
Performs a manual driving checkup.
bool should_enter_emergency_in_ready_state() const
EbsPressureTestPhase pressure_test_phase_
bool should_enter_emergency(State current_state) const
Performs an emergency checkup.
Metro _ebs_sound_timestamp_
Timer for the EBS buzzer sound check.
void reset_mission_finished()
Resets the mission finished state.
CheckupState checkup_state_
Current state of the checkup process.
bool should_enter_emergency_in_driving_state() const
bool emergency_sequence_complete() const
Checks if the emergency sequence is complete and the vehicle can transition to AS_OFF.
bool should_stay_ready() const
Performs a ready to drive checkup.
CheckupState
The CheckupState enum represents the different states of the initial checkup process....
bool should_go_ready_from_off() const
Performs a last re-check for off to ready transition.
void reset_checkup_state()
Resets the checkup state to the initial state.
bool should_stay_off()
Performs an off checkup.
bool should_stay_mission_finished() const
Performs a mission finished checkup.
bool res_triggered() const
Checks if the RES has been triggered.
bool should_stay_driving() const
CheckupManager(SystemData *system_data)
Constructor for the CheckupManager class.
CheckupError initial_checkup_sequence()
Performs an initial checkup.
static void close_watchdog_sdc()
Closes the watchdog signal for SDC.
static void enable_ebs_actuator_FRONT()
Enables EBS actuator 2.
static void enable_ebs_actuator_REAR()
Enables EBS actuator 1.
static void disable_ebs_actuator_FRONT()
Disables EBS actuator 2.
static void disable_ebs_actuator_REAR()
Disables EBS actuator 1.
static void toggle_watchdog()
Toggles the watchdog signal.
static void close_sdc()
Closes the SDC in Master and SDC Logic.
Our own implementation of Metro class.
Definition metro.h:13
void reset()
Resets the timer to the current time.
Definition metro.h:124
bool checkWithoutReset() const
Checks if the interval has passed without resetting the timer.
Definition metro.h:115
#define DEBUG_PRINT(str)
#define DEBUG_PRINT_VAR(var)
constexpr int WATCHDOG_TEST_DURATION
constexpr int BRAKE_PRESSURE_UPPER_THRESHOLD
constexpr int WATCHDOG_TOGGLE_DURATION
constexpr int EBS_BUZZER_TIMEOUT
SystemData system_data
Definition main.cpp:11
volatile bool emergency_signal_
int hydraulic_line_front_pressure
int _hydraulic_line_pressure
bool master_sdc_closed_
double _right_wheel_rpm
bool pneumatic_line_pressure_
double _left_wheel_rpm
void reset_ebs_timestamp()
resets timestamps for driving
Metro releaseEbsTimestamp
void refresh_r2d_vars()
resets timestamps for ready
The whole model of the system: holds all the data necessary.
Mission mission_
R2DLogics r2d_logics_
FailureDetection failure_detection_
HardwareData hardware_data_
bool mission_finished_
State
Definition structure.hpp:8
@ AS_DRIVING
@ AS_READY