MCU
Loading...
Searching...
No Matches
TelemetryInterface.cpp
Go to the documentation of this file.
1#include "TelemetryInterface.h"
2/* Update CAN messages */
3// Main loop
4// MCP3208 returns structure
6 float brake_percent,
7 float mech_brake_percent)
8{
9
10 MCU_PEDAL_READINGS_t pedal_readings;
11
12 pedal_readings.accel_percent_float_ro = HYTECH_accel_percent_float_ro_toS(accel_percent * 100);
13 pedal_readings.brake_percent_float_ro = HYTECH_brake_percent_float_ro_toS(brake_percent * 100);
14 pedal_readings.mechanical_brake_percent_float_ro = HYTECH_mechanical_brake_percent_float_ro_toS(mech_brake_percent * 100);
15
16 enqueue_new_CAN<MCU_PEDAL_READINGS_t>(&pedal_readings, &Pack_MCU_PEDAL_READINGS_hytech);
17}
18void TelemetryInterface::update_pedal_readings_raw_CAN_msg(const AnalogConversion_s &accel_1,
19 const AnalogConversion_s &accel_2,
20 const AnalogConversion_s &brake_1,
21 const AnalogConversion_s &brake_2)
22{
23 MCU_PEDAL_RAW_t pedal_read;
24
25 pedal_read.accel_1_raw = accel_1.raw;
26 pedal_read.accel_2_raw = accel_2.raw;
27 pedal_read.brake_1_raw = brake_1.raw;
28 pedal_read.brake_2_raw = brake_2.raw;
29
30 enqueue_new_CAN<MCU_PEDAL_RAW_t>(&pedal_read, &Pack_MCU_PEDAL_RAW_hytech);
31}
32// MCP3204 returns structure
33void TelemetryInterface::update_suspension_CAN_msg(const AnalogConversion_s &lc_fl,
34 const AnalogConversion_s &lc_fr,
35 const AnalogConversion_s &pots_fl,
36 const AnalogConversion_s &pots_fr)
37{
38 MCU_SUSPENSION_t sus;
39 sus.load_cell_fl = lc_fl.raw;
40 sus.load_cell_fr = lc_fr.raw;
41 sus.potentiometer_fl = pots_fl.raw;
42 sus.potentiometer_fr = pots_fr.raw;
43
44 enqueue_new_CAN<MCU_SUSPENSION_t>(&sus, &Pack_MCU_SUSPENSION_hytech);
45}
46// SteeringDual and MCP3208 return structures
48 const AnalogConversion_s &steer2,
49 const AnalogConversion_s &current,
50 const AnalogConversion_s &reference,
51 const AnalogConversion_s &glv)
52{
53 // do sth with mcu_analog_readings_
54 mcu_analog_readings_.set_steering_1(steer1.raw);
55 mcu_analog_readings_.set_steering_2(steer2.raw);
56 mcu_analog_readings_.set_hall_effect_current(current.raw - reference.raw); // this is wrong btw. should let analog channel do the math but not necessary atm
57 mcu_analog_readings_.set_glv_battery_voltage(glv.conversion * FIXED_POINT_PRECISION);
58
59 enqueue_CAN<MCU_analog_readings>(mcu_analog_readings_, ID_MCU_ANALOG_READINGS);
60}
61
63{
64 DRIVETRAIN_RPMS_TELEM_t rpms;
65 rpms.fl_motor_rpm = fl->get_speed();
66 rpms.fr_motor_rpm = fr->get_speed();
67 rpms.rl_motor_rpm = rl->get_speed();
68 rpms.rr_motor_rpm = rr->get_speed();
69
70 enqueue_new_CAN<DRIVETRAIN_RPMS_TELEM_t>(&rpms, &Pack_DRIVETRAIN_RPMS_TELEM_hytech);
71}
72
74{
75
76 if (1)
77 { // We should only write error status if some error has occurred, but for now, this is just an if(1)
78 DRIVETRAIN_ERR_STATUS_TELEM_t errors;
79 errors.mc1_diagnostic_number = fl->get_error_status();
80 errors.mc2_diagnostic_number = fr->get_error_status();
81 errors.mc3_diagnostic_number = rl->get_error_status();
82 errors.mc4_diagnostic_number = rr->get_error_status();
83 enqueue_new_CAN<DRIVETRAIN_ERR_STATUS_TELEM_t>(&errors, &Pack_DRIVETRAIN_ERR_STATUS_TELEM_hytech);
84 }
85}
86
88 InvInt_t *fl,
89 InvInt_t *fr,
90 InvInt_t *rl,
91 InvInt_t *rr,
92 bool accel_implaus,
93 bool brake_implaus,
94 float accel_per,
95 float brake_per)
96{
97 DRIVETRAIN_STATUS_TELEM_t status;
98
99 status.mc1_dc_on = fl->get_dc_on();
100 status.mc1_derating_on = fl->get_derating_on();
101 status.mc1_error = fl->get_error();
102 status.mc1_inverter_on = fl->get_inverter_on();
103 status.mc1_quit_dc = fl->get_quit_dc_on();
104 status.mc1_quit_inverter_on = fl->get_quit_inverter_on();
105 status.mc1_system_ready = fl->inverter_system_ready();
106 status.mc1_warning = fl->get_warning();
107
108 status.mc2_dc_on = fr->get_dc_on();
109 status.mc2_derating_on = fr->get_derating_on();
110 status.mc2_error = fr->get_error();
111 status.mc2_inverter_on = fr->get_inverter_on();
112 status.mc2_quit_dc = fr->get_quit_dc_on();
113 status.mc2_quit_inverter_on = fr->get_quit_inverter_on();
114 status.mc2_system_ready = fr->inverter_system_ready();
115 status.mc2_warning = fr->get_warning();
116
117 status.mc3_dc_on = rl->get_dc_on();
118 status.mc3_derating_on = rl->get_derating_on();
119 status.mc3_error = rl->get_error();
120 status.mc3_inverter_on = rl->get_inverter_on();
121 status.mc3_quit_dc = rl->get_quit_dc_on();
122 status.mc3_quit_inverter_on = rl->get_quit_inverter_on();
123 status.mc3_system_ready = rl->inverter_system_ready();
124 status.mc3_warning = rl->get_warning();
125
126 status.mc4_dc_on = rr->get_dc_on();
127 status.mc4_derating_on = rr->get_derating_on();
128 status.mc4_error = rr->get_error();
129 status.mc4_inverter_on = rr->get_inverter_on();
130 status.mc4_quit_dc = rr->get_quit_dc_on();
131 status.mc4_quit_inverter_on = rr->get_quit_inverter_on();
132 status.mc4_system_ready = rr->inverter_system_ready();
133 status.mc4_warning = rr->get_warning();
134
135 status.accel_implausible = accel_implaus;
136 status.brake_implausible = brake_implaus;
137 status.brake_percent = (uint8_t)(abs(brake_per) * 100);
138 status.accel_percent = (uint8_t)(abs(accel_per) * 100);
139
140 MC_temps mc1_temps = fl->get_temps_msg();
141 MC_temps mc2_temps = fr->get_temps_msg();
142 MC_temps mc3_temps = rl->get_temps_msg();
143 MC_temps mc4_temps = rr->get_temps_msg();
144
145 MC_setpoints_command mc1_cmd = fl->get_cmd_msg();
146 MC_setpoints_command mc2_cmd = fr->get_cmd_msg();
147 MC_setpoints_command mc3_cmd = rl->get_cmd_msg();
148 MC_setpoints_command mc4_cmd = rr->get_cmd_msg();
149
150 enqueue_CAN<MC_temps>(mc1_temps, ID_MC1_TEMPS);
151 enqueue_CAN<MC_temps>(mc2_temps, ID_MC2_TEMPS);
152 enqueue_CAN<MC_temps>(mc3_temps, ID_MC3_TEMPS);
153 enqueue_CAN<MC_temps>(mc4_temps, ID_MC4_TEMPS);
154 enqueue_CAN<MC_setpoints_command>(mc1_cmd, ID_MC1_SETPOINTS_COMMAND);
155 enqueue_CAN<MC_setpoints_command>(mc2_cmd, ID_MC2_SETPOINTS_COMMAND);
156 enqueue_CAN<MC_setpoints_command>(mc3_cmd, ID_MC3_SETPOINTS_COMMAND);
157 enqueue_CAN<MC_setpoints_command>(mc4_cmd, ID_MC4_SETPOINTS_COMMAND);
158 enqueue_new_CAN<DRIVETRAIN_STATUS_TELEM_t>(&status, &Pack_DRIVETRAIN_STATUS_TELEM_hytech);
159}
160
162 InvInt_t *fl,
163 InvInt_t *fr,
164 InvInt_t *rl,
165 InvInt_t *rr)
166{
167 // TODO: change this to use actual torque values from inverter
168 // Torque current just temporary for gearbox seal validation
169 DRIVETRAIN_TORQUE_TELEM_t torque;
170 torque.fl_motor_torque = fl->get_motor_torque();
171 torque.fr_motor_torque = fr->get_motor_torque();
172 torque.rl_motor_torque = rl->get_motor_torque();
173 torque.rr_motor_torque = rr->get_motor_torque();
174
175 enqueue_new_CAN<DRIVETRAIN_TORQUE_TELEM_t>(&torque, &Pack_DRIVETRAIN_TORQUE_TELEM_hytech);
176}
177
179 InvInt_t* fl,
180 InvInt_t* fr,
181 InvInt_t* rl,
182 InvInt_t* rr)
183{
184 // TODO: change this to use actual torque values from inverter
185 // Torque current just temporary for gearbox seal validation
186 DRIVETRAIN_FILTER_OUT_TORQUE_TEL_t torque;
187 torque.fl_motor_torque = fl->get_commanded_torque();
188 torque.fr_motor_torque = fr->get_commanded_torque();
189 torque.rl_motor_torque = rl->get_commanded_torque();
190 torque.rr_motor_torque = rr->get_commanded_torque();
191
192 enqueue_new_CAN<DRIVETRAIN_FILTER_OUT_TORQUE_TEL_t>(&torque, &Pack_DRIVETRAIN_FILTER_OUT_TORQUE_TEL_hytech);
193}
194
195// Pack_PENTHOUSE_ACCUM_MSG_hytech
196void TelemetryInterface::update_penthouse_accum_CAN_msg(const AnalogConversion_s &current, const AnalogConversion_s &reference)
197{
198 PENTHOUSE_ACCUM_MSG_t message;
199 message.hall_curr_ref = reference.raw;
200 message.hall_curr_signal = current.raw;
201
202 enqueue_new_CAN<PENTHOUSE_ACCUM_MSG_t>(&message, &Pack_PENTHOUSE_ACCUM_MSG_hytech);
203}
204
205void TelemetryInterface::update_steering_status_CAN_msg(const float steering_system_angle,
206 const float filtered_angle_encoder,
207 const float filtered_angle_analog,
208 const uint8_t steering_system_status,
209 const uint8_t steering_encoder_status,
210 const uint8_t steering_analog_status)
211{
212 STEERING_SYSTEM_REPORT_t msg;
213
214 msg.steering_system_angle_ro = HYTECH_steering_system_angle_ro_toS(steering_system_angle);
215 msg.steering_encoder_angle_ro = HYTECH_steering_encoder_angle_ro_toS(filtered_angle_encoder);
216 msg.steering_analog_angle_ro = HYTECH_steering_analog_angle_ro_toS(filtered_angle_analog);
217 msg.steering_system_status = steering_system_status;
218 msg.steering_encoder_status = steering_encoder_status;
219 msg.steering_analog_status = steering_analog_status;
220
221 enqueue_new_CAN<STEERING_SYSTEM_REPORT_t>(&msg, &Pack_STEERING_SYSTEM_REPORT_hytech);
222}
223
224/* Send CAN messages */
225template <typename T>
226void TelemetryInterface::enqueue_CAN(T msg_class, uint32_t id)
227{
228
229 CAN_message_t msg;
230 msg_class.write(msg.buf);
231 msg.id = id;
232 msg.len = sizeof(msg_class);
233 uint8_t buf[sizeof(CAN_message_t)];
234 memmove(buf, &msg, sizeof(CAN_message_t));
235
236 msg_queue_->push_back(buf, sizeof(CAN_message_t));
237}
238
239/* Send inverter CAN messages with new CAN library */
240template <typename U>
241void TelemetryInterface::enqueue_new_CAN(U *structure, uint32_t (*pack_function)(U *, uint8_t *, uint8_t *, uint8_t *))
242{
243 CAN_message_t can_msg;
244 can_msg.id = pack_function(structure, can_msg.buf, &can_msg.len, (uint8_t *)&can_msg.flags.extended);
245 uint8_t buf[sizeof(CAN_message_t)] = {};
246 memmove(buf, &can_msg, sizeof(CAN_message_t));
247 msg_queue_->push_back(buf, sizeof(CAN_message_t));
248}
249
250
251/* Tick SysClock */
252void TelemetryInterface::tick(const AnalogConversionPacket_s<8> &adc1,
253 const AnalogConversionPacket_s<4> &adc2,
254 const AnalogConversionPacket_s<4> &adc3,
255 const SteeringEncoderConversion_s &encoder,
256 InvInt_t *fl,
257 InvInt_t *fr,
258 InvInt_t *rl,
259 InvInt_t *rr,
260 bool accel_implaus,
261 bool brake_implaus,
262 float accel_per,
263 float brake_per,
264 const AnalogConversion_s &accel_1,
265 const AnalogConversion_s &accel_2,
266 const AnalogConversion_s &brake_1,
267 const AnalogConversion_s &brake_2,
268 float mech_brake_active_percent,
269 const TorqueControllerMuxError &current_mux_status)
270{
271
272 MCU_ERROR_STATES_t error_states;
273 error_states.torque_controller_mux_status = static_cast<uint8_t>(current_mux_status);
274 enqueue_new_CAN<MCU_ERROR_STATES_t>(&error_states, &Pack_MCU_ERROR_STATES_hytech);
275
276 // Pedals
278 brake_per,
279 mech_brake_active_percent);
280
282 accel_2,
283 brake_1,
284 brake_2);
285 // Analog readings
287 adc1.conversions[channels_.analog_steering_channel],
288 adc1.conversions[channels_.current_channel],
289 adc1.conversions[channels_.current_ref_channel],
290 adc1.conversions[channels_.glv_sense_channel]);
291 // Load cells
293 adc3.conversions[channels_.loadcell_fr_channel],
294 adc2.conversions[channels_.pots_fl_channel],
295 adc3.conversions[channels_.pots_fr_channel]);
296
297 update_drivetrain_rpms_CAN_msg(fl, fr, rl, rr);
299 update_drivetrain_status_telem_CAN_msg(fl, fr, rl, rr, accel_implaus, brake_implaus, accel_per, brake_per);
302
304 adc1.conversions[channels_.current_ref_channel]);
305
306}
TorqueControllerMuxError
Defines errors for TC Mux to use to maintain system safety.
uint16_t get_error_status()
int16_t get_commanded_torque()
MC_setpoints_command get_cmd_msg()
void update_drivetrain_rpms_CAN_msg(InvInt_t *fl, InvInt_t *fr, InvInt_t *rl, InvInt_t *rr)
void update_pedal_readings_CAN_msg(float accel_percent, float brake_percent, float mech_brake_percent)
void update_steering_status_CAN_msg(const float steering_system_angle, const float filtered_angle_encoder, const float filtered_angle_analog, const uint8_t steering_system_status, const uint8_t steering_encoder_status, const uint8_t steering_analog_status)
void update_suspension_CAN_msg(const AnalogConversion_s &lc_fl, const AnalogConversion_s &lc_fr, const AnalogConversion_s &pots_fl, const AnalogConversion_s &pots_fr)
CANBufferType * msg_queue_
void update_drivetrain_torque_telem_CAN_msg(InvInt_t *fl, InvInt_t *fr, InvInt_t *rl, InvInt_t *rr)
void enqueue_new_CAN(U *structure, uint32_t(*pack_function)(U *, uint8_t *, uint8_t *, uint8_t *))
void update_penthouse_accum_CAN_msg(const AnalogConversion_s &current, const AnalogConversion_s &reference)
TelemetryInterfaceReadChannels channels_
void enqueue_CAN(T can_msg, uint32_t id)
MCU_analog_readings mcu_analog_readings_
void update_drivetrain_status_telem_CAN_msg(InvInt_t *fl, InvInt_t *fr, InvInt_t *rl, InvInt_t *rr, bool accel_implaus, bool brake_implaus, float accel_per, float brake_per)
void update_analog_readings_CAN_msg(const SteeringEncoderConversion_s &steer1, const AnalogConversion_s &steer2, const AnalogConversion_s &current, const AnalogConversion_s &reference, const AnalogConversion_s &glv)
void update_pedal_readings_raw_CAN_msg(const AnalogConversion_s &accel_1, const AnalogConversion_s &accel_2, const AnalogConversion_s &brake_1, const AnalogConversion_s &brake_2)
void tick(const AnalogConversionPacket_s< 8 > &adc1, const AnalogConversionPacket_s< 4 > &adc2, const AnalogConversionPacket_s< 4 > &adc3, const SteeringEncoderConversion_s &encoder, InvInt_t *fl, InvInt_t *fr, InvInt_t *rl, InvInt_t *rr, bool accel_implaus, bool brake_implaus, float accel_per, float brake_per, const AnalogConversion_s &accel_1, const AnalogConversion_s &accel_2, const AnalogConversion_s &brake_1, const AnalogConversion_s &brake_2, float mech_brake_active_percent, const TorqueControllerMuxError &current_mux_status)
void update_drivetrain_err_status_CAN_msg(InvInt_t *fl, InvInt_t *fr, InvInt_t *rl, InvInt_t *rr)
void update_drivetrain_torque_filter_out_telem_CAN_msg(InvInt_t *fl, InvInt_t *fr, InvInt_t *rl, InvInt_t *rr)
const int FIXED_POINT_PRECISION
CAN_message_t msg