-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patherror_checks.c
131 lines (109 loc) · 4.13 KB
/
error_checks.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include "canlib/can.h"
#include "canlib/can_common.h"
#include "canlib/message_types.h"
#include "canlib/pic18f26k83/pic18f26k83_can.h"
#include "canlib/pic18f26k83/pic18f26k83_timer.h"
#include "canlib/util/can_tx_buffer.h"
#include "mcc_generated_files/adcc.h"
#include "mcc_generated_files/fvr.h"
#include "error_checks.h"
#include "platform.h"
//******************************************************************************
// STATUS CHECKS //
//******************************************************************************
bool check_battery_voltage_error(void) {
uint16_t adc_result = ADCC_GetSingleConversion(channel_BATT_VOLT);
uint16_t batt_voltage_mV =
(uint16_t)(adc_result * BATT_RESISTANCE_DIVIDER);
if (batt_voltage_mV < UNDERVOLTAGE_THRESHOLD_BATT_mV ||
batt_voltage_mV > OVERVOLTAGE_THRESHOLD_BATT_mV) {
uint32_t timestamp = millis();
uint8_t batt_data[2] = {0};
batt_data[0] = (batt_voltage_mV >> 8) & 0xff;
batt_data[1] = (batt_voltage_mV >> 0) & 0xff;
enum BOARD_STATUS error_code = batt_voltage_mV < UNDERVOLTAGE_THRESHOLD_BATT_mV
? E_BATT_UNDER_VOLTAGE
: E_BATT_OVER_VOLTAGE;
can_msg_t error_msg;
build_board_stat_msg(timestamp, error_code, batt_data, 2, &error_msg);
txb_enqueue(&error_msg);
// shit's bad yo
return false;
}
else
{
can_msg_t batt_volt_msg; // lipo battery voltage
build_analog_data_msg(
millis(),
SENSOR_BATT_VOLT,
(uint16_t)(ADCC_GetSingleConversion(channel_BATT_VOLT) * BATT_RESISTANCE_DIVIDER),
&batt_volt_msg
);
txb_enqueue(&batt_volt_msg);
}
// things look ok
return true;
}
bool check_battery_current_error(void) {
uint16_t curr_draw_mA = get_batt_curr_low_pass();
if (curr_draw_mA > OVERCURRENT_THRESHOLD_BATT_mA) {
uint32_t timestamp = millis();
uint8_t curr_data[2] = {0};
curr_data[0] = (curr_draw_mA >> 8) & 0xff;
curr_data[1] = (curr_draw_mA >> 0) & 0xff;
can_msg_t error_msg;
build_board_stat_msg(timestamp, E_BATT_OVER_CURRENT, curr_data, 2, &error_msg);
txb_enqueue(&error_msg);
return false;
}
// things look ok
return true;
}
#if (BOARD_UNIQUE_ID == BOARD_ID_CHARGING_CAN)
bool check_5v_current_error(void) {
uint16_t curr_draw_mA = get_5v_curr_low_pass();
if (curr_draw_mA > OVERCURRENT_THRESHOLD_5V_mA) {
uint32_t timestamp = millis();
uint8_t curr_data[2] = {0};
curr_data[0] = (curr_draw_mA >> 8) & 0xff;
curr_data[1] = (curr_draw_mA >> 0) & 0xff;
can_msg_t error_msg;
build_board_stat_msg(timestamp, E_5V_OVER_CURRENT, curr_data, 2, &error_msg);
txb_enqueue(&error_msg);
return false;
}
// things look ok
return true;
}
bool check_13v_current_error(void) {
uint16_t curr_draw_mA = get_13v_curr_low_pass();
if (curr_draw_mA > OVERCURRENT_THRESHOLD_13V_mA) {
uint32_t timestamp = millis();
uint8_t curr_data[2] = {0};
curr_data[0] = (curr_draw_mA >> 8) & 0xff;
curr_data[1] = (curr_draw_mA >> 0) & 0xff;
can_msg_t error_msg;
build_board_stat_msg(timestamp, E_13V_OVER_CURRENT, curr_data, 2, &error_msg);
txb_enqueue(&error_msg);
return false;
}
// things look ok
return true;
}
#elif (BOARD_UNIQUE_ID == BOARD_ID_CHARGING_AIRBRAKE || BOARD_UNIQUE_ID == BOARD_ID_CHARGING_PAYLOAD)
bool check_motor_current_error(void) {
uint16_t curr_draw_mA = get_motor_curr_low_pass();
if (curr_draw_mA > OVERCURRENT_THRESHOLD_MOTOR_mA) {
uint32_t timestamp = millis();
uint8_t curr_data[2] = {0};
curr_data[0] = (curr_draw_mA >> 8) & 0xff;
curr_data[1] = (curr_draw_mA >> 0) & 0xff;
can_msg_t error_msg;
build_board_stat_msg(timestamp, E_MOTOR_OVER_CURRENT, curr_data, 2, &error_msg);
txb_enqueue(&error_msg);
return false;
}
// things look ok
return true;
}
#endif