From f6a930c03d85a6109f3cf2ec4455576c631493eb Mon Sep 17 00:00:00 2001 From: liu weikai Date: Sat, 27 Jun 2026 15:16:11 +0800 Subject: [PATCH] fix(nrf52): prevent stale fromRadio consume state --- platform/nrf52/arduino_common/include/ble/meshtastic_ble.h | 1 + platform/nrf52/arduino_common/src/ble/meshtastic_ble.cpp | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/platform/nrf52/arduino_common/include/ble/meshtastic_ble.h b/platform/nrf52/arduino_common/include/ble/meshtastic_ble.h index c607cca6..21462ee0 100644 --- a/platform/nrf52/arduino_common/include/ble/meshtastic_ble.h +++ b/platform/nrf52/arduino_common/include/ble/meshtastic_ble.h @@ -143,6 +143,7 @@ class MeshtasticBleService final : public BleService, bool from_radio_preloaded_valid_ = false; Frame from_radio_preloaded_{}; bool from_radio_consume_pending_ = false; + bool from_radio_consume_in_progress_ = false; bool pending_from_num_valid_ = false; uint32_t pending_from_num_ = 0; diff --git a/platform/nrf52/arduino_common/src/ble/meshtastic_ble.cpp b/platform/nrf52/arduino_common/src/ble/meshtastic_ble.cpp index 7d409cea..3d0d6ea7 100644 --- a/platform/nrf52/arduino_common/src/ble/meshtastic_ble.cpp +++ b/platform/nrf52/arduino_common/src/ble/meshtastic_ble.cpp @@ -705,7 +705,7 @@ void MeshtasticBleService::beginReadWait() static_cast(from_radio_preloaded_valid_ ? from_radio_preloaded_.len : 0U)); read_waiting_.store(true); - if (from_radio_preloaded_valid_) + if (from_radio_preloaded_valid_ && !from_radio_consume_in_progress_) { from_radio_consume_pending_ = true; } @@ -798,6 +798,7 @@ void MeshtasticBleService::clearToPhoneQueue() from_radio_preloaded_valid_ = false; from_radio_preloaded_ = Frame{}; from_radio_consume_pending_ = false; + from_radio_consume_in_progress_ = false; from_num_notify_counter_ = 0; noInterrupts(); to_phone_head_ = 0; @@ -856,6 +857,7 @@ void MeshtasticBleService::markReadableFromRadioConsumed() static_cast(from_radio_preloaded_valid_ ? from_radio_preloaded_.from_num : 0U), static_cast(from_radio_preloaded_valid_ ? from_radio_preloaded_.len : 0U)); + from_radio_consume_in_progress_ = true; from_radio_consume_pending_ = false; read_waiting_.store(false); @@ -865,6 +867,7 @@ void MeshtasticBleService::markReadableFromRadioConsumed() from_radio_.write(&empty, 0); pending_from_radio_empty_log_ = true; bleLogBoth("[BLE][nrf52][mt][flow] consume empty"); + from_radio_consume_in_progress_ = false; return; } @@ -879,6 +882,7 @@ void MeshtasticBleService::markReadableFromRadioConsumed() from_radio_preloaded_valid_ = false; from_radio_preloaded_ = Frame{}; + from_radio_consume_in_progress_ = false; bleLogBoth("[BLE][nrf52][mt][flow] consume end preloaded_valid=%u consume_pending=%u read_waiting=%u", from_radio_preloaded_valid_ ? 1U : 0U,