From 24ffdd618367138be624e32358d3e5d9750d6288 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Thu, 28 Jan 2021 23:25:05 +0800 Subject: [PATCH] Panda: refactor get_firmware_version, return std::optional (#19896) Co-authored-by: Willem Melching old-commit-hash: c4215d8476219cca33f85adc5ce0a425891c62c5 --- selfdrive/boardd/boardd.cc | 8 +++----- selfdrive/boardd/panda.cc | 17 +++++------------ selfdrive/boardd/panda.h | 3 ++- 3 files changed, 10 insertions(+), 18 deletions(-) diff --git a/selfdrive/boardd/boardd.cc b/selfdrive/boardd/boardd.cc index 8e37e5cd3e..a974307769 100644 --- a/selfdrive/boardd/boardd.cc +++ b/selfdrive/boardd/boardd.cc @@ -133,12 +133,12 @@ bool usb_connect() { panda->set_loopback(true); } - const char *fw_sig_buf = panda->get_firmware_version(); - if (fw_sig_buf){ - params.write_db_value("PandaFirmware", fw_sig_buf, 128); + if (auto fw_sig = panda->get_firmware_version(); fw_sig) { + params.write_db_value("PandaFirmware", (const char *)fw_sig->data(), fw_sig->size()); // Convert to hex for offroad char fw_sig_hex_buf[16] = {0}; + const uint8_t *fw_sig_buf = fw_sig->data(); for (size_t i = 0; i < 8; i++){ fw_sig_hex_buf[2*i] = NIBBLE_TO_HEX((uint8_t)fw_sig_buf[i] >> 4); fw_sig_hex_buf[2*i+1] = NIBBLE_TO_HEX((uint8_t)fw_sig_buf[i] & 0xF); @@ -146,8 +146,6 @@ bool usb_connect() { params.write_db_value("PandaFirmwareHex", fw_sig_hex_buf, 16); LOGW("fw signature: %.*s", 16, fw_sig_hex_buf); - - delete[] fw_sig_buf; } else { return false; } // get panda serial diff --git a/selfdrive/boardd/panda.cc b/selfdrive/boardd/panda.cc index fc09bb1c6f..0bc72cff63 100644 --- a/selfdrive/boardd/panda.cc +++ b/selfdrive/boardd/panda.cc @@ -252,18 +252,11 @@ void Panda::set_loopback(bool loopback){ usb_write(0xe5, loopback, 0); } -const char* Panda::get_firmware_version(){ - const char* fw_sig_buf = new char[128](); - - int read_1 = usb_read(0xd3, 0, 0, (unsigned char*)fw_sig_buf, 64); - int read_2 = usb_read(0xd4, 0, 0, (unsigned char*)fw_sig_buf + 64, 64); - - if ((read_1 == 64) && (read_2 == 64)) { - return fw_sig_buf; - } - - delete[] fw_sig_buf; - return NULL; +std::optional> Panda::get_firmware_version(){ + std::vector fw_sig_buf(128); + int read_1 = usb_read(0xd3, 0, 0, &fw_sig_buf[0], 64); + int read_2 = usb_read(0xd4, 0, 0, &fw_sig_buf[64], 64); + return ((read_1 == 64) && (read_2 == 64)) ? std::make_optional(fw_sig_buf) : std::nullopt; } std::optional Panda::get_serial() { diff --git a/selfdrive/boardd/panda.h b/selfdrive/boardd/panda.h index 542802d124..f5c2f83af6 100644 --- a/selfdrive/boardd/panda.h +++ b/selfdrive/boardd/panda.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -73,7 +74,7 @@ class Panda { void set_ir_pwr(uint16_t ir_pwr); health_t get_health(); void set_loopback(bool loopback); - const char* get_firmware_version(); + std::optional> get_firmware_version(); std::optional get_serial(); void set_power_saving(bool power_saving); void set_usb_power_mode(cereal::HealthData::UsbPowerMode power_mode);