From f2eb84eef063efcc0da1dde072fac0325d7d1eee Mon Sep 17 00:00:00 2001 From: Willem Melching Date: Thu, 10 Feb 2022 13:52:24 +0100 Subject: [PATCH] handle usb error in reading panda state (#23686) --- selfdrive/boardd/boardd.cc | 24 ++++++++++++++++++++---- selfdrive/boardd/panda.cc | 6 +++--- selfdrive/boardd/panda.h | 2 +- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/selfdrive/boardd/boardd.cc b/selfdrive/boardd/boardd.cc index 677132584b..c5310f879e 100644 --- a/selfdrive/boardd/boardd.cc +++ b/selfdrive/boardd/boardd.cc @@ -294,7 +294,7 @@ void send_empty_panda_state(PubMaster *pm) { pm->send("pandaStates", msg); } -bool send_panda_states(PubMaster *pm, const std::vector &pandas, bool spoofing_started) { +std::optional send_panda_states(PubMaster *pm, const std::vector &pandas, bool spoofing_started) { bool ignition_local = false; // build msg @@ -304,7 +304,12 @@ bool send_panda_states(PubMaster *pm, const std::vector &pandas, bool s std::vector pandaStates; for (const auto& panda : pandas){ - health_t health = panda->get_state(); + auto health_opt = panda->get_state(); + if (!health_opt) { + return std::nullopt; + } + + health_t health = *health_opt; if (spoofing_started) { health.ignition_line_pkt = 1; @@ -379,7 +384,12 @@ bool send_panda_states(PubMaster *pm, const std::vector &pandas, bool s } void send_peripheral_state(PubMaster *pm, Panda *panda) { - health_t pandaState = panda->get_state(); + auto pandaState_opt = panda->get_state(); + if (!pandaState_opt) { + return; + } + + health_t pandaState = *pandaState_opt; // build msg MessageBuilder msg; @@ -427,7 +437,13 @@ void panda_state_thread(PubMaster *pm, std::vector pandas, bool spoofin // send out peripheralState send_peripheral_state(pm, peripheral_panda); - ignition = send_panda_states(pm, pandas, spoofing_started); + auto ignition_opt = send_panda_states(pm, pandas, spoofing_started); + + if (!ignition_opt) { + continue; + } + + ignition = *ignition_opt; // TODO: make this check fast, currently takes 16ms // check if we have new pandas and are offroad diff --git a/selfdrive/boardd/panda.cc b/selfdrive/boardd/panda.cc index f38101f49f..5e621b12cd 100644 --- a/selfdrive/boardd/panda.cc +++ b/selfdrive/boardd/panda.cc @@ -311,10 +311,10 @@ void Panda::set_ir_pwr(uint16_t ir_pwr) { usb_write(0xb0, ir_pwr, 0); } -health_t Panda::get_state() { +std::optional Panda::get_state() { health_t health {0}; - usb_read(0xd2, 0, 0, (unsigned char*)&health, sizeof(health)); - return health; + int err = usb_read(0xd2, 0, 0, (unsigned char*)&health, sizeof(health)); + return err >= 0 ? std::make_optional(health) : std::nullopt; } void Panda::set_loopback(bool loopback) { diff --git a/selfdrive/boardd/panda.h b/selfdrive/boardd/panda.h index 0e88bb3850..dbd866adf4 100644 --- a/selfdrive/boardd/panda.h +++ b/selfdrive/boardd/panda.h @@ -80,7 +80,7 @@ class Panda { void set_fan_speed(uint16_t fan_speed); uint16_t get_fan_speed(); void set_ir_pwr(uint16_t ir_pwr); - health_t get_state(); + std::optional get_state(); void set_loopback(bool loopback); std::optional> get_firmware_version(); std::optional get_serial();