boardd: get health struct from panda (#23648)

pull/23655/head
Adeeb Shihadeh 3 years ago committed by GitHub
parent 43c6ea8e73
commit 9dca040ed9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      panda
  2. 58
      selfdrive/boardd/boardd.cc
  3. 26
      selfdrive/boardd/panda.h

@ -1 +1 @@
Subproject commit 00138a7f667ea6152a673764332fe4be756e63fb Subproject commit 7abca94c12ffdf2c65246d016af7f730f93d6bf1

@ -304,34 +304,34 @@ bool send_panda_states(PubMaster *pm, const std::vector<Panda *> &pandas, bool s
std::vector<health_t> pandaStates; std::vector<health_t> pandaStates;
for (const auto& panda : pandas){ for (const auto& panda : pandas){
health_t pandaState = panda->get_state(); health_t health = panda->get_state();
if (spoofing_started) { if (spoofing_started) {
pandaState.ignition_line = 1; health.ignition_line_pkt = 1;
} }
ignition_local |= ((pandaState.ignition_line != 0) || (pandaState.ignition_can != 0)); ignition_local |= ((health.ignition_line_pkt != 0) || (health.ignition_can_pkt != 0));
pandaStates.push_back(pandaState); pandaStates.push_back(health);
} }
for (uint32_t i = 0; i < pandas.size(); i++) { for (uint32_t i = 0; i < pandas.size(); i++) {
auto panda = pandas[i]; auto panda = pandas[i];
const auto &pandaState = pandaStates[i]; const auto &health = pandaStates[i];
// Make sure CAN buses are live: safety_setter_thread does not work if Panda CAN are silent and there is only one other CAN node // Make sure CAN buses are live: safety_setter_thread does not work if Panda CAN are silent and there is only one other CAN node
if (pandaState.safety_model == (uint8_t)(cereal::CarParams::SafetyModel::SILENT)) { if (health.safety_mode_pkt == (uint8_t)(cereal::CarParams::SafetyModel::SILENT)) {
panda->set_safety_model(cereal::CarParams::SafetyModel::NO_OUTPUT); panda->set_safety_model(cereal::CarParams::SafetyModel::NO_OUTPUT);
} }
#ifndef __x86_64__ #ifndef __x86_64__
bool power_save_desired = !ignition_local && !pigeon_active; bool power_save_desired = !ignition_local && !pigeon_active;
if (pandaState.power_save_enabled != power_save_desired) { if (health.power_save_enabled_pkt != power_save_desired) {
panda->set_power_saving(power_save_desired); panda->set_power_saving(power_save_desired);
} }
// set safety mode to NO_OUTPUT when car is off. ELM327 is an alternative if we want to leverage athenad/connect // set safety mode to NO_OUTPUT when car is off. ELM327 is an alternative if we want to leverage athenad/connect
if (!ignition_local && (pandaState.safety_model != (uint8_t)(cereal::CarParams::SafetyModel::NO_OUTPUT))) { if (!ignition_local && (health.safety_mode_pkt != (uint8_t)(cereal::CarParams::SafetyModel::NO_OUTPUT))) {
panda->set_safety_model(cereal::CarParams::SafetyModel::NO_OUTPUT); panda->set_safety_model(cereal::CarParams::SafetyModel::NO_OUTPUT);
} }
#endif #endif
@ -341,27 +341,27 @@ bool send_panda_states(PubMaster *pm, const std::vector<Panda *> &pandas, bool s
} }
auto ps = pss[i]; auto ps = pss[i];
ps.setUptime(pandaState.uptime); ps.setUptime(health.uptime_pkt);
ps.setBlockedCnt(pandaState.blocked_msg_cnt); ps.setBlockedCnt(health.blocked_msg_cnt_pkt);
ps.setIgnitionLine(pandaState.ignition_line); ps.setIgnitionLine(health.ignition_line_pkt);
ps.setIgnitionCan(pandaState.ignition_can); ps.setIgnitionCan(health.ignition_can_pkt);
ps.setControlsAllowed(pandaState.controls_allowed); ps.setControlsAllowed(health.controls_allowed_pkt);
ps.setGasInterceptorDetected(pandaState.gas_interceptor_detected); ps.setGasInterceptorDetected(health.gas_interceptor_detected_pkt);
ps.setCanRxErrs(pandaState.can_rx_errs); ps.setCanRxErrs(health.can_rx_errs_pkt);
ps.setCanSendErrs(pandaState.can_send_errs); ps.setCanSendErrs(health.can_send_errs_pkt);
ps.setCanFwdErrs(pandaState.can_fwd_errs); ps.setCanFwdErrs(health.can_fwd_errs_pkt);
ps.setGmlanSendErrs(pandaState.gmlan_send_errs); ps.setGmlanSendErrs(health.gmlan_send_errs_pkt);
ps.setPandaType(panda->hw_type); ps.setPandaType(panda->hw_type);
ps.setSafetyModel(cereal::CarParams::SafetyModel(pandaState.safety_model)); ps.setSafetyModel(cereal::CarParams::SafetyModel(health.safety_mode_pkt));
ps.setSafetyParam(pandaState.safety_param); ps.setSafetyParam(health.safety_param_pkt);
ps.setFaultStatus(cereal::PandaState::FaultStatus(pandaState.fault_status)); ps.setFaultStatus(cereal::PandaState::FaultStatus(health.fault_status_pkt));
ps.setPowerSaveEnabled((bool)(pandaState.power_save_enabled)); ps.setPowerSaveEnabled((bool)(health.power_save_enabled_pkt));
ps.setHeartbeatLost((bool)(pandaState.heartbeat_lost)); ps.setHeartbeatLost((bool)(health.heartbeat_lost_pkt));
ps.setUnsafeMode(pandaState.unsafe_mode); ps.setUnsafeMode(health.unsafe_mode_pkt);
ps.setHarnessStatus(cereal::PandaState::HarnessStatus(pandaState.car_harness_status)); ps.setHarnessStatus(cereal::PandaState::HarnessStatus(health.car_harness_status_pkt));
// Convert faults bitset to capnp list // Convert faults bitset to capnp list
std::bitset<sizeof(pandaState.faults) * 8> fault_bits(pandaState.faults); std::bitset<sizeof(health.faults_pkt) * 8> fault_bits(health.faults_pkt);
auto faults = ps.initFaults(fault_bits.count()); auto faults = ps.initFaults(fault_bits.count());
size_t j = 0; size_t j = 0;
@ -398,12 +398,12 @@ void send_peripheral_state(PubMaster *pm, Panda *panda) {
LOGW("reading hwmon took %lfms", read_time); LOGW("reading hwmon took %lfms", read_time);
} }
} else { } else {
ps.setVoltage(pandaState.voltage); ps.setVoltage(pandaState.voltage_pkt);
ps.setCurrent(pandaState.current); ps.setCurrent(pandaState.current_pkt);
} }
uint16_t fan_speed_rpm = panda->get_fan_speed(); uint16_t fan_speed_rpm = panda->get_fan_speed();
ps.setUsbPowerMode(cereal::PeripheralState::UsbPowerMode(pandaState.usb_power_mode)); ps.setUsbPowerMode(cereal::PeripheralState::UsbPowerMode(pandaState.usb_power_mode_pkt));
ps.setFanSpeedRpm(fan_speed_rpm); ps.setFanSpeedRpm(fan_speed_rpm);
pm->send("peripheralState", msg); pm->send("peripheralState", msg);

@ -13,6 +13,7 @@
#include "cereal/gen/cpp/car.capnp.h" #include "cereal/gen/cpp/car.capnp.h"
#include "cereal/gen/cpp/log.capnp.h" #include "cereal/gen/cpp/log.capnp.h"
#include "panda/board/health.h"
#define TIMEOUT 0 #define TIMEOUT 0
#define PANDA_BUS_CNT 4 #define PANDA_BUS_CNT 4
@ -24,31 +25,6 @@
#define CANPACKET_REJECTED (0xC0U) #define CANPACKET_REJECTED (0xC0U)
#define CANPACKET_RETURNED (0x80U) #define CANPACKET_RETURNED (0x80U)
// copied from panda/board/main.c
struct __attribute__((packed)) health_t {
uint32_t uptime;
uint32_t voltage;
uint32_t current;
uint32_t can_rx_errs;
uint32_t can_send_errs;
uint32_t can_fwd_errs;
uint32_t gmlan_send_errs;
uint32_t faults;
uint8_t ignition_line;
uint8_t ignition_can;
uint8_t controls_allowed;
uint8_t gas_interceptor_detected;
uint8_t car_harness_status;
uint8_t usb_power_mode;
uint8_t safety_model;
int16_t safety_param;
uint8_t fault_status;
uint8_t power_save_enabled;
uint8_t heartbeat_lost;
uint16_t unsafe_mode;
uint32_t blocked_msg_cnt;
};
struct __attribute__((packed)) can_header { struct __attribute__((packed)) can_header {
uint8_t reserved : 1; uint8_t reserved : 1;
uint8_t bus : 3; uint8_t bus : 3;

Loading…
Cancel
Save