Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 13 additions & 11 deletions board/health.h
Original file line number Diff line number Diff line change
@@ -1,33 +1,35 @@
#pragma once

#define HEALTH_FLAG_IGNITION_LINE (1U << 0)
#define HEALTH_FLAG_IGNITION_CAN (1U << 1)
#define HEALTH_FLAG_CONTROLS_ALLOWED (1U << 2)
#define HEALTH_FLAG_POWER_SAVE_ENABLED (1U << 3)
#define HEALTH_FLAG_HEARTBEAT_LOST (1U << 4)
#define HEALTH_FLAG_SAFETY_RX_CHECKS_INVALID (1U << 5)
#define HEALTH_FLAG_SOM_RESET_TRIGGERED (1U << 6)

struct __attribute__((packed)) health_t {
uint32_t uptime_pkt;
uint32_t voltage_pkt;
uint32_t current_pkt;
uint16_t voltage_pkt;
uint16_t current_pkt;
uint32_t safety_tx_blocked_pkt;
uint32_t safety_rx_invalid_pkt;
uint32_t tx_buffer_overflow_pkt;
uint32_t rx_buffer_overflow_pkt;
uint32_t faults_pkt;
uint8_t ignition_line_pkt;
uint8_t ignition_can_pkt;
uint8_t controls_allowed_pkt;
uint16_t flags_pkt;
uint8_t car_harness_status_pkt;
uint8_t safety_mode_pkt;
uint16_t safety_param_pkt;
uint8_t fault_status_pkt;
uint8_t power_save_enabled_pkt;
uint8_t heartbeat_lost_pkt;
uint16_t alternative_experience_pkt;
float interrupt_load_pkt;
uint8_t interrupt_load_pkt;
uint8_t fan_power;
uint8_t safety_rx_checks_invalid_pkt;
uint16_t spi_error_count_pkt;
uint16_t sbu1_voltage_mV;
uint16_t sbu2_voltage_mV;
uint8_t som_reset_triggered;
uint16_t sound_output_level_pkt;
float temperature;
uint8_t temperature_pkt;
};

typedef struct __attribute__((packed)) {
Expand Down
26 changes: 14 additions & 12 deletions board/main_comms.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,18 @@ static int get_health_pkt(void *dat) {
struct health_t * health = (struct health_t*)dat;

health->uptime_pkt = uptime_cnt;
health->voltage_pkt = current_board->read_voltage_mV();
health->current_pkt = current_board->read_current_mA();
health->voltage_pkt = (uint16_t)MIN(current_board->read_voltage_mV(), 0xFFFFU);
health->current_pkt = (uint16_t)MIN(current_board->read_current_mA(), 0xFFFFU);

health->ignition_line_pkt = (uint8_t)(harness_check_ignition());
health->ignition_can_pkt = ignition_can;
health->flags_pkt = 0U;
health->flags_pkt |= harness_check_ignition() ? HEALTH_FLAG_IGNITION_LINE : 0U;
health->flags_pkt |= ignition_can ? HEALTH_FLAG_IGNITION_CAN : 0U;
health->flags_pkt |= controls_allowed ? HEALTH_FLAG_CONTROLS_ALLOWED : 0U;
health->flags_pkt |= power_save_enabled ? HEALTH_FLAG_POWER_SAVE_ENABLED : 0U;
health->flags_pkt |= heartbeat_lost ? HEALTH_FLAG_HEARTBEAT_LOST : 0U;
health->flags_pkt |= safety_rx_checks_invalid ? HEALTH_FLAG_SAFETY_RX_CHECKS_INVALID : 0U;
health->flags_pkt |= bootkick_reset_triggered ? HEALTH_FLAG_SOM_RESET_TRIGGERED : 0U;

health->controls_allowed_pkt = controls_allowed;
health->safety_tx_blocked_pkt = safety_tx_blocked;
health->safety_rx_invalid_pkt = safety_rx_invalid;
health->tx_buffer_overflow_pkt = tx_buffer_overflow;
Expand All @@ -24,27 +29,24 @@ static int get_health_pkt(void *dat) {
health->safety_mode_pkt = (uint8_t)(current_safety_mode);
health->safety_param_pkt = current_safety_param;
health->alternative_experience_pkt = alternative_experience;
health->power_save_enabled_pkt = power_save_enabled;
health->heartbeat_lost_pkt = heartbeat_lost;
health->safety_rx_checks_invalid_pkt = safety_rx_checks_invalid;

health->spi_error_count_pkt = spi_error_count;

health->fault_status_pkt = fault_status;
health->faults_pkt = faults;

health->interrupt_load_pkt = interrupt_load;
float interrupt_load_scaled = (CLAMP(interrupt_load, 0.0f, 1.0f) * 255.0f) + 0.5f;
health->interrupt_load_pkt = (uint8_t)interrupt_load_scaled;

health->fan_power = fan_state.power;

health->sbu1_voltage_mV = harness.sbu1_voltage_mV;
health->sbu2_voltage_mV = harness.sbu2_voltage_mV;

health->som_reset_triggered = bootkick_reset_triggered;

health->sound_output_level_pkt = sound_output_level;

health->temperature = dts_get_temperature();
float temperature_encoded = (CLAMP(dts_get_temperature(), -40.0f, 214.5f) + 40.0f) + 0.5f;
health->temperature_pkt = (uint8_t)temperature_encoded;

return sizeof(*health);
}
Expand Down
47 changes: 28 additions & 19 deletions python/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,14 @@ class Panda:
HEALTH_STRUCT = _parse_c_struct(os.path.join(BASEDIR, "board/health.h"), "health_t")
CAN_HEALTH_STRUCT = struct.Struct("<BIBBBBBBBBIIIIIIIHHBBBIIII")

HEALTH_FLAG_IGNITION_LINE = 1 << 0
HEALTH_FLAG_IGNITION_CAN = 1 << 1
HEALTH_FLAG_CONTROLS_ALLOWED = 1 << 2
HEALTH_FLAG_POWER_SAVE_ENABLED = 1 << 3
HEALTH_FLAG_HEARTBEAT_LOST = 1 << 4
HEALTH_FLAG_SAFETY_RX_CHECKS_INVALID = 1 << 5
HEALTH_FLAG_SOM_RESET_TRIGGERED = 1 << 6

H7_DEVICES = [HW_TYPE_RED_PANDA, HW_TYPE_TRES, HW_TYPE_CUATRO, HW_TYPE_BODY]
SUPPORTED_DEVICES = H7_DEVICES

Expand Down Expand Up @@ -516,6 +524,7 @@ def call_control_api(self, msg):
def health(self):
dat = self._handle.controlRead(Panda.REQUEST_IN, 0xd2, 0, 0, self.HEALTH_STRUCT.size)
a = self.HEALTH_STRUCT.unpack(dat)
flags = a[8]
return {
"uptime": a[0],
"voltage": a[1],
Expand All @@ -525,25 +534,25 @@ def health(self):
"tx_buffer_overflow": a[5],
"rx_buffer_overflow": a[6],
"faults": a[7],
"ignition_line": a[8],
"ignition_can": a[9],
"controls_allowed": a[10],
"car_harness_status": a[11],
"safety_mode": a[12],
"safety_param": a[13],
"fault_status": a[14],
"power_save_enabled": a[15],
"heartbeat_lost": a[16],
"alternative_experience": a[17],
"interrupt_load": a[18],
"fan_power": a[19],
"safety_rx_checks_invalid": a[20],
"spi_error_count": a[21],
"sbu1_voltage_mV": a[22],
"sbu2_voltage_mV": a[23],
"som_reset_triggered": a[24],
"sound_output_level": a[25],
"temperature": a[26],
"ignition_line": bool(flags & self.HEALTH_FLAG_IGNITION_LINE),
"ignition_can": bool(flags & self.HEALTH_FLAG_IGNITION_CAN),
"controls_allowed": bool(flags & self.HEALTH_FLAG_CONTROLS_ALLOWED),
"car_harness_status": a[9],
"safety_mode": a[10],
"safety_param": a[11],
"fault_status": a[12],
"power_save_enabled": bool(flags & self.HEALTH_FLAG_POWER_SAVE_ENABLED),
"heartbeat_lost": bool(flags & self.HEALTH_FLAG_HEARTBEAT_LOST),
"alternative_experience": a[13],
"interrupt_load": a[14] / 255.0,
"fan_power": a[15],
"safety_rx_checks_invalid": bool(flags & self.HEALTH_FLAG_SAFETY_RX_CHECKS_INVALID),
"spi_error_count": a[16],
"sbu1_voltage_mV": a[17],
"sbu2_voltage_mV": a[18],
"som_reset_triggered": bool(flags & self.HEALTH_FLAG_SOM_RESET_TRIGGERED),
"sound_output_level": a[19],
"temperature": a[20] - 40.0,
}

@ensure_health_packet_version
Expand Down
Loading