ams-master-23/Core/Src/can.c

58 lines
1.4 KiB
C
Raw Normal View History

2023-03-12 21:06:23 +01:00
#include "can.h"
#include "main.h"
#include "shunt_monitoring.h"
#include "slave_monitoring.h"
#include "soc_estimation.h"
#include "ts_state_machine.h"
2023-03-18 20:24:07 +01:00
#include "can-halal.h"
2023-03-12 21:06:23 +01:00
2023-03-15 18:07:38 +01:00
#include <stdint.h>
2023-03-12 21:06:23 +01:00
2023-03-15 18:07:38 +01:00
void can_init(CAN_HandleTypeDef *handle) {
ftcan_init(handle);
ftcan_add_filter(CAN_ID_SHUNT_BASE, 0xFF0);
ftcan_add_filter(CAN_ID_AMS_IN, 0xFFF);
ftcan_add_filter(CAN_ID_SLAVE_PANIC, 0xFFF);
2023-04-15 22:01:22 +02:00
ftcan_add_filter(CAN_ID_SLAVE_STATUS, 0xFFF);
2023-03-15 18:07:38 +01:00
ftcan_add_filter(CAN_ID_SLAVE_LOG, 0xFFF);
2023-03-12 21:06:23 +01:00
}
HAL_StatusTypeDef can_send_status() {
uint8_t data[6];
2023-04-29 23:44:45 +02:00
data[0] = ts_state.current_state | (sdc_closed << 7);
2023-03-12 21:06:23 +01:00
data[1] = current_soc;
ftcan_marshal_unsigned(&data[2], min_voltage, 2);
ftcan_marshal_signed(&data[4], max_temp, 2);
return ftcan_transmit(CAN_ID_AMS_STATUS, data, sizeof(data));
2023-03-12 21:06:23 +01:00
}
2023-04-30 00:57:42 +02:00
HAL_StatusTypeDef can_send_error(TSErrorKind kind, uint8_t arg) {
uint8_t data[2];
data[0] = kind;
data[1] = arg;
return ftcan_transmit(CAN_ID_AMS_ERROR, data, sizeof(data));
}
2023-03-15 18:07:38 +01:00
void ftcan_msg_received_cb(uint16_t id, size_t datalen, const uint8_t *data) {
if ((id & 0xFF0) == CAN_ID_SHUNT_BASE) {
shunt_handle_can_msg(id, data);
2023-03-12 21:06:23 +01:00
return;
}
2023-03-15 18:07:38 +01:00
switch (id) {
2023-03-12 21:06:23 +01:00
case CAN_ID_SLAVE_PANIC:
slaves_handle_panic(data);
break;
2023-04-15 22:01:22 +02:00
case CAN_ID_SLAVE_STATUS:
slaves_handle_status(data);
break;
2023-03-12 21:06:23 +01:00
case CAN_ID_SLAVE_LOG:
slaves_handle_log(data);
break;
case CAN_ID_AMS_IN:
ts_sm_handle_ams_in(data);
break;
}
}