From 0bdd03aedc769895f090d252c1815369164c55c7 Mon Sep 17 00:00:00 2001 From: crosstyan Date: Fri, 8 Aug 2025 10:43:50 +0800 Subject: [PATCH] feat: improve error handling for radio operations and streamline logging --- inc/llcc68.hpp | 46 ++++++++++++++++------------------------------ src/hal_spi.cpp | 9 +++++---- 2 files changed, 21 insertions(+), 34 deletions(-) diff --git a/inc/llcc68.hpp b/inc/llcc68.hpp index ddd1538..6b63626 100644 --- a/inc/llcc68.hpp +++ b/inc/llcc68.hpp @@ -63,6 +63,17 @@ constexpr auto MAX_RX_BUFFER_SIZE = 0xff - DEFAULT_RX_BUFFER_ADDRESS; } \ } +/** + * @brief return if STATEVAR has value that is NOT RADIO_TRANS_CMD_PROC_ERR + */ +#define APP_RADIO_RETURN_ERR_IGNORE_PROC_ERR(STATEVAR) \ + { \ + if (not(STATEVAR.has_value())) { \ + if (not(STATEVAR.error() == error::RADIO_TRANS_CMD_PROC_ERR)) { \ + return ue_t{STATEVAR.error()}; \ + } \ + } \ + } /** * \brief return if STATEVAR has value, otherwise return the error @@ -208,13 +219,7 @@ inline Result get_irq_status() { uint8_t data[] = {0x00, 0x00}; const auto res = spi::read_stream(RADIOLIB_SX126X_CMD_GET_IRQ_STATUS, data); - // get_irq_status would sometimes return CMD_PROC_ERR - // however, the result is still valid - if (not res) { - if (not(res.error() == error::RADIO_TRANS_CMD_PROC_ERR)) { - return ue_t{res.error()}; - } - } + APP_RADIO_RETURN_ERR_IGNORE_PROC_ERR(res); return irq_status_t{.raw = static_cast(static_cast(data[0] << 8) | static_cast(data[1]))}; } @@ -253,7 +258,7 @@ inline Result get_status() { uint8_t data = 0; const auto res = spi::read_stream(RADIOLIB_SX126X_CMD_GET_STATUS, std::span{&data, 1}); - APP_RADIO_RETURN_ERR(res); + APP_RADIO_RETURN_ERR_IGNORE_PROC_ERR(res); return *reinterpret_cast(&data); } @@ -261,7 +266,7 @@ inline Result get_packet_status() { uint8_t data[3] = {0, 0, 0}; const auto res = spi::read_stream(RADIOLIB_SX126X_CMD_GET_PACKET_STATUS, data, 3); - APP_RADIO_RETURN_ERR(res); + APP_RADIO_RETURN_ERR_IGNORE_PROC_ERR(res); return packet_status_t{ .raw = {data[0], data[1], data[2]}}; } @@ -965,22 +970,13 @@ inline Result, error_t> get_rx_buffer_status() { uint8_t rx_buf_status[] = {0, 0}; auto res = spi::read_stream(RADIOLIB_SX126X_CMD_GET_RX_BUFFER_STATUS, rx_buf_status); - APP_RADIO_RETURN_ERR(res); + APP_RADIO_RETURN_ERR_IGNORE_PROC_ERR(res); return std::make_tuple(rx_buf_status[0], rx_buf_status[1]); } struct read_result_t { - irq_status_t irq_status; std::span data; - bool is_crc_err() const { - return (irq_status.bits.crc_err) != 0; - } - - bool is_header_err() const { - return (irq_status.bits.header_err) != 0; - } - /*! * \brief user should call this function after reading data (since it will override the internal buffer) */ @@ -996,16 +992,6 @@ struct read_result_t { inline Result read_data_internal() { - const auto irq_ = get_irq_status(); - APP_RADIO_RETURN_ERR(irq_); - const auto st_ = get_status(); - APP_RADIO_RETURN_ERR(st_); - const auto irq = *irq_; - const auto st = *st_; - if (irq.bits.timeout || st.command_status == CommandStatus::COMMAND_TIMEOUT) { - return ue_t{error_t{error::RADIO_RX_TIMEOUT}}; - } - const auto tuple_ = get_rx_buffer_status(); APP_RADIO_RETURN_ERR(tuple_); @@ -1032,7 +1018,7 @@ read_data_internal() { auto res = hal::spi::read_buffer(r_ptr, sz); APP_RADIO_RETURN_ERR(res); - return read_result_t{irq, *res}; + return read_result_t{*res}; } /** diff --git a/src/hal_spi.cpp b/src/hal_spi.cpp index 11a4840..27ccead 100644 --- a/src/hal_spi.cpp +++ b/src/hal_spi.cpp @@ -237,7 +237,7 @@ write_stream(uint8_t cmd, std::span data, const size_t timeout_ms }; esp_err_t err = spi_device_transmit(details::spi_device, &transaction.base); if (err != ESP_OK) { - ESP_LOGE(TAG, "spi transmit: %s (%d)", esp_err_to_name(err), err); + ESP_LOGE(TAG, "%s (%d)", esp_err_to_name(err), err); return ue_t{error::FAILED}; } @@ -291,7 +291,7 @@ read_register(uint16_t reg, std::span data, const size_t timeout_ms) { }; esp_err_t err = spi_device_transmit(details::spi_device, &transaction.base); if (err != ESP_OK) { - ESP_LOGE(TAG, "spi transmit: %s (%d)", esp_err_to_name(err), err); + ESP_LOGE(TAG, "%s (%d)", esp_err_to_name(err), err); return ue_t{error::FAILED}; } @@ -378,12 +378,13 @@ read_buffer(uint8_t offset, uint8_t size, const size_t timeout_ms) { }; esp_err_t err = spi_device_transmit(details::spi_device, &transaction.base); if (err != ESP_OK) { - ESP_LOGE(TAG, "spi transmit: %s (%d)", esp_err_to_name(err), err); + ESP_LOGE(TAG, "%s (%d)", esp_err_to_name(err), err); return ue_t{error::FAILED}; } const auto status = rx_buffer[0]; - if (const auto err = status_to_err(status); err != error::OK) { + // FIXME: current hack ignore processing error + if (const auto err = status_to_err(status); err != error::OK && err != error::RADIO_TRANS_CMD_PROC_ERR) { return ue_t{err}; }