From 763dc7d6992066a44c80fe09188c3dc799b9746a Mon Sep 17 00:00:00 2001 From: Wessel Nieboer Date: Mon, 2 Mar 2026 23:19:36 +0100 Subject: [PATCH 1/2] Peek & pop separately when pushing messages to BLE client I've noticed very often that the first few messages can get lost after reconnecting with BLE. This should fix that. --- examples/companion_radio/MyMesh.cpp | 26 +++++++++++++++++++++++--- examples/companion_radio/MyMesh.h | 2 ++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/examples/companion_radio/MyMesh.cpp b/examples/companion_radio/MyMesh.cpp index 7412e75102..cf61dc60d1 100644 --- a/examples/companion_radio/MyMesh.cpp +++ b/examples/companion_radio/MyMesh.cpp @@ -254,6 +254,24 @@ int MyMesh::getFromOfflineQueue(uint8_t frame[]) { return 0; // queue is empty } +int MyMesh::peekOfflineQueue(uint8_t frame[]) { + if (offline_queue_len > 0) { + size_t len = offline_queue[0].len; + memcpy(frame, offline_queue[0].buf, len); + return len; + } + return 0; +} + +void MyMesh::popOfflineQueue() { + if (offline_queue_len > 0) { + offline_queue_len--; + for (int i = 0; i < offline_queue_len; i++) { + offline_queue[i] = offline_queue[i + 1]; + } + } +} + float MyMesh::getAirtimeBudgetFactor() const { return _prefs.airtime_factor; } @@ -1353,11 +1371,13 @@ void MyMesh::handleCmdFrame(size_t len) { } } else if (cmd_frame[0] == CMD_SYNC_NEXT_MESSAGE) { int out_len; - if ((out_len = getFromOfflineQueue(out_frame)) > 0) { - _serial->writeFrame(out_frame, out_len); + if ((out_len = peekOfflineQueue(out_frame)) > 0) { + if (_serial->writeFrame(out_frame, out_len) > 0) { + popOfflineQueue(); #ifdef DISPLAY_CLASS - if (_ui) _ui->msgRead(offline_queue_len); + if (_ui) _ui->msgRead(offline_queue_len); #endif + } } else { out_frame[0] = RESP_CODE_NO_MORE_MESSAGES; _serial->writeFrame(out_frame, 1); diff --git a/examples/companion_radio/MyMesh.h b/examples/companion_radio/MyMesh.h index f6a4ce40e9..d5ce1edf86 100644 --- a/examples/companion_radio/MyMesh.h +++ b/examples/companion_radio/MyMesh.h @@ -185,6 +185,8 @@ class MyMesh : public BaseChatMesh, public DataStoreHost { void updateContactFromFrame(ContactInfo &contact, uint32_t& last_mod, const uint8_t *frame, int len); void addToOfflineQueue(const uint8_t frame[], int len); int getFromOfflineQueue(uint8_t frame[]); + int peekOfflineQueue(uint8_t frame[]); + void popOfflineQueue(); int getBlobByKey(const uint8_t key[], int key_len, uint8_t dest_buf[]) override { return _store->getBlobByKey(key, key_len, dest_buf); } From b8edd486bb3b51ae27007a2089888245fe3b0ca2 Mon Sep 17 00:00:00 2001 From: Wessel Nieboer Date: Wed, 4 Mar 2026 21:07:53 +0100 Subject: [PATCH 2/2] >= out_len It shouldn't ever happen that it's less so why not --- examples/companion_radio/MyMesh.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/companion_radio/MyMesh.cpp b/examples/companion_radio/MyMesh.cpp index cf61dc60d1..baabf27c55 100644 --- a/examples/companion_radio/MyMesh.cpp +++ b/examples/companion_radio/MyMesh.cpp @@ -1372,7 +1372,7 @@ void MyMesh::handleCmdFrame(size_t len) { } else if (cmd_frame[0] == CMD_SYNC_NEXT_MESSAGE) { int out_len; if ((out_len = peekOfflineQueue(out_frame)) > 0) { - if (_serial->writeFrame(out_frame, out_len) > 0) { + if (_serial->writeFrame(out_frame, out_len) >= out_len) { popOfflineQueue(); #ifdef DISPLAY_CLASS if (_ui) _ui->msgRead(offline_queue_len);