handle usb error in reading panda state (#23686)

pull/23683/head
Willem Melching 2022-02-10 13:52:24 +01:00 committed by GitHub
parent 955c7435f8
commit f2eb84eef0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 8 deletions

View File

@ -294,7 +294,7 @@ void send_empty_panda_state(PubMaster *pm) {
pm->send("pandaStates", msg);
}
bool send_panda_states(PubMaster *pm, const std::vector<Panda *> &pandas, bool spoofing_started) {
std::optional<bool> send_panda_states(PubMaster *pm, const std::vector<Panda *> &pandas, bool spoofing_started) {
bool ignition_local = false;
// build msg
@ -304,7 +304,12 @@ bool send_panda_states(PubMaster *pm, const std::vector<Panda *> &pandas, bool s
std::vector<health_t> 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<Panda *> &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<Panda *> 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

View File

@ -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<health_t> 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) {

View File

@ -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<health_t> get_state();
void set_loopback(bool loopback);
std::optional<std::vector<uint8_t>> get_firmware_version();
std::optional<std::string> get_serial();