MCU
Loading...
Searching...
No Matches
DashboardInterface.cpp
Go to the documentation of this file.
1#include "DashboardInterface.h"
2
3void DashboardInterface::read(const CAN_message_t &can_msg)
4{
5
6 DASHBOARD_STATE_t dash_state;
7 Unpack_DASHBOARD_STATE_hytech(&dash_state, can_msg.buf, can_msg.len);
8
9 _data.dial_mode = static_cast<ControllerMode_e>(dash_state.dial_state);
10
11 _data.ssok = dash_state.ssok_above_threshold;
12 _data.shutdown = dash_state.shutdown_h_above_threshold;
13
14 _data.button.start = dash_state.start_button;
15 _data.button.mark = dash_state.mark_button;
16 _data.button.mode = dash_state.mode_button;
17 _data.button.mc_cycle = dash_state.motor_controller_cycle_button;
18 _data.button.launch_ctrl = dash_state.launch_ctrl_button;
19 _data.button.torque_mode = dash_state.torque_mode_button;
20 _data.button.led_dimmer = dash_state.led_dimmer_button;
21 _data.button.left_shifter = dash_state.left_shifter_button;
22 _data.button.right_shifter = dash_state.right_shifter_button;
23
24 _data.buzzer_state = dash_state.drive_buzzer;
25
27}
28
29// TODO this should be part of the CAN message not in this interface.
31{
32 // detect high-to-low transition
33 if (prev_button_pressed_state_ == true && button_pressed == false)
34 {
35
36 _data.torque_limit_mode = static_cast<TorqueLimit_e>((static_cast<int>(_data.torque_limit_mode) + 1) % (static_cast<int>(TorqueLimit_e::TCMUX_NUM_TORQUE_LIMITS)));
37 }
38 prev_button_pressed_state_ = button_pressed;
39}
40
42{
43
44 DASHBOARD_MCU_STATE_t dash_mcu_state;
45 dash_mcu_state.drive_buzzer = _data.buzzer_cmd;
46
47 dash_mcu_state.dial_state = static_cast<uint8_t>(_data.cur_dial_mode);
48
49 // TODO: use logic as to not write data for LEDs that have not changed
50 dash_mcu_state.launch_control_led = _data.LED[static_cast<int>(DashLED_e::LAUNCH_CONTROL_LED)];
51 dash_mcu_state.mode_led = _data.LED[static_cast<int>(DashLED_e::MODE_LED)];
52 dash_mcu_state.mechanical_brake_led = _data.LED[static_cast<int>(DashLED_e::MECH_BRAKE_LED)];
53 dash_mcu_state.cockpit_brb_led = _data.LED[static_cast<int>(DashLED_e::COCKPIT_BRB_LED)];
54 dash_mcu_state.inertia_status_led = _data.LED[static_cast<int>(DashLED_e::INERTIA_LED)];
55 dash_mcu_state.start_status_led = _data.LED[static_cast<int>(DashLED_e::START_LED)];
56 dash_mcu_state.motor_controller_error_led = _data.LED[static_cast<int>(DashLED_e::MC_ERROR_LED)];
57
58 dash_mcu_state.bots_led = _data.LED[static_cast<int>(DashLED_e::BOTS_LED)];
59 dash_mcu_state.imd_led = _data.LED[static_cast<int>(DashLED_e::IMD_LED)];
60 dash_mcu_state.ams_led = _data.LED[static_cast<int>(DashLED_e::AMS_LED)];
61
62 dash_mcu_state.glv_led = _data.LED[static_cast<int>(DashLED_e::GLV_LED)];
63 dash_mcu_state.pack_charge_led = _data.LED[static_cast<int>(DashLED_e::CRIT_CHARGE_LED)];
64
65 CAN_message_t can_msg;
66 auto id = Pack_DASHBOARD_MCU_STATE_hytech(&dash_mcu_state, can_msg.buf, &can_msg.len, (uint8_t *)&can_msg.flags.extended);
67 can_msg.id = id;
68 // this circular buffer implementation requires that you push your data in a array buffer
69 // all this does is put the msg into a uint8_t buffer and pushes it onto the queue
70 uint8_t buf[sizeof(CAN_message_t)] = {};
71 memmove(buf, &can_msg, sizeof(CAN_message_t));
72 msg_queue_->push_back(buf, sizeof(CAN_message_t));
73
74 return can_msg;
75}
76
77// figure out how to set enumed led colors or send (0,255 value)
79{
80
81 _data.LED[static_cast<uint8_t>(led)] = static_cast<uint8_t>(color);
82}
83
85 int car_state,
86 bool buzzer,
87 bool drivetrain_error,
88 TorqueLimit_e torque,
89 float min_cell_voltage,
90 AnalogConversion_s glv_voltage,
91 int launch_state,
92 ControllerMode_e dial_mode)
93{
94
95 // TODO unfuck this
96 _data.cur_dial_mode = dial_mode;
98
99 setLED(DashLED_e::AMS_LED, mcu->bms_ok_is_high() ? LEDColors_e::ON : LEDColors_e::RED);
100 setLED(DashLED_e::IMD_LED, mcu->imd_ok_is_high() ? LEDColors_e::ON : LEDColors_e::RED);
101 setLED(DashLED_e::BOTS_LED, mcu->get_bots_ok() ? LEDColors_e::ON : LEDColors_e::RED);
102 setLED(DashLED_e::START_LED, car_state == int(MCU_STATE::READY_TO_DRIVE) ? LEDColors_e::ON : LEDColors_e::RED);
103 setLED(DashLED_e::MC_ERROR_LED, !drivetrain_error ? LEDColors_e::ON : LEDColors_e::RED);
104 setLED(DashLED_e::COCKPIT_BRB_LED, mcu->brb_ok_is_high() ? LEDColors_e::ON : LEDColors_e::RED);
105
106 switch (launch_state)
107 {
108 case 1:
109 setLED(DashLED_e::LAUNCH_CONTROL_LED, LEDColors_e::RED);
110 break;
111 case 2:
112 setLED(DashLED_e::LAUNCH_CONTROL_LED, LEDColors_e::YELLOW);
113 break;
114 case 3:
115 setLED(DashLED_e::LAUNCH_CONTROL_LED, LEDColors_e::ON);
116 break;
117 default:
118 setLED(DashLED_e::LAUNCH_CONTROL_LED, LEDColors_e::OFF);
119 break;
120 }
121
122 switch (torque)
123 {
124 case TorqueLimit_e::TCMUX_LOW_TORQUE:
125 setLED(DashLED_e::MODE_LED, LEDColors_e::OFF);
126 break;
127 case TorqueLimit_e::TCMUX_MID_TORQUE:
128 setLED(DashLED_e::MODE_LED, LEDColors_e::YELLOW);
129 break;
130 case TorqueLimit_e::TCMUX_FULL_TORQUE:
131 setLED(DashLED_e::MODE_LED, LEDColors_e::ON);
132 break;
133 default:
134 setLED(DashLED_e::MODE_LED, LEDColors_e::RED);
135 break;
136 }
137
138 uint16_t scaled_cell_voltage = (uint16_t)map((uint32_t)(min_cell_voltage * 1000), 3300, 4200, 0, 255); // scale voltage
139 _data.LED[static_cast<int>(DashLED_e::CRIT_CHARGE_LED)] = std::max(0, std::min((int)scaled_cell_voltage, 255)); // clamp voltage
140 // _data.LED[DashLED_e::GLV_LED] = (uint8_t)map(glv_voltage.raw)
141
142 write();
143}
144
155
158
TorqueLimit_e
Defines modes of torque limit to be processed in torque limit map for exact values.
ControllerMode_e
ControllerMode_e getDialMode()
void read(const CAN_message_t &can_msg)
void update_torque_mode_(bool button_pressed)
void setLED(DashLED_e led, LEDColors_e color)
TorqueLimit_e getTorqueLimitMode()
DashComponentInterface_s _data
void tick10(MCUInterface *mcu, int car_state, bool buzzer, bool drivetrain_error, TorqueLimit_e torque, float min_cell_voltage, AnalogConversion_s glv_voltage, int launch_state, ControllerMode_e dial_mode)
CANBufferType * msg_queue_
bool brb_ok_is_high()
bool imd_ok_is_high()
bool get_bots_ok()
bool bms_ok_is_high()
LEDColors_e
BuzzerController buzzer(BUZZER_ON_INTERVAL)
Definition: main.cpp:325
ControllerMode_e cur_dial_mode