68 lines
1.6 KiB
C
68 lines
1.6 KiB
C
|
#include "shunt_monitoring.h"
|
||
|
|
||
|
#include <string.h>
|
||
|
|
||
|
#include "can.h"
|
||
|
#include "ts_state_machine.h"
|
||
|
#include "util.h"
|
||
|
|
||
|
ShuntData shunt_data;
|
||
|
|
||
|
void shunt_init() {
|
||
|
shunt_data.current = 0;
|
||
|
shunt_data.voltage1 = 0;
|
||
|
shunt_data.voltage2 = 0;
|
||
|
shunt_data.voltage3 = 0;
|
||
|
shunt_data.busbartemp = 0;
|
||
|
shunt_data.power = 0;
|
||
|
shunt_data.energy = 0;
|
||
|
shunt_data.current_counter = 0;
|
||
|
shunt_data.last_message = 0;
|
||
|
}
|
||
|
|
||
|
void shunt_check() {
|
||
|
int is_error = shunt_data.current >= THRESH_OVERCURRENT;
|
||
|
ts_sm_set_error_source(TS_ERROR_SOURCE_SHUNT, is_error);
|
||
|
}
|
||
|
|
||
|
void shunt_handle_can_msg(CAN_RxHeaderTypeDef *header, uint8_t *data) {
|
||
|
// All result messages contain a big-endian 6-byte integer
|
||
|
data[7] = 0;
|
||
|
data[8] = 0;
|
||
|
uint64_t result;
|
||
|
memcpy(&result, data, 8);
|
||
|
result = ntohll(result);
|
||
|
// Top two bytes should always be zero in our usecase (or 0xFF for a signed
|
||
|
// number)
|
||
|
if ((result >> 4) != 0 && (result >> 4) != 0xFFFF) {
|
||
|
set_error_led();
|
||
|
}
|
||
|
|
||
|
switch (header->StdId) {
|
||
|
case CAN_ID_SHUNT_CURRENT:
|
||
|
shunt_data.current = result;
|
||
|
break;
|
||
|
case CAN_ID_SHUNT_VOLTAGE1:
|
||
|
shunt_data.voltage1 = result;
|
||
|
break;
|
||
|
case CAN_ID_SHUNT_VOLTAGE2:
|
||
|
shunt_data.voltage2 = result;
|
||
|
break;
|
||
|
case CAN_ID_SHUNT_VOLTAGE3:
|
||
|
shunt_data.voltage3 = result;
|
||
|
break;
|
||
|
case CAN_ID_SHUNT_TEMP:
|
||
|
shunt_data.busbartemp = result;
|
||
|
break;
|
||
|
case CAN_ID_SHUNT_POWER:
|
||
|
shunt_data.power = result;
|
||
|
break;
|
||
|
case CAN_ID_SHUNT_CURRENT_COUNTER:
|
||
|
shunt_data.current_counter = result;
|
||
|
break;
|
||
|
case CAN_ID_SHUNT_ENERGY_COUNTER:
|
||
|
shunt_data.energy = result;
|
||
|
break;
|
||
|
}
|
||
|
}
|