fully drain sync messages

This commit is contained in:
Scott Penrose
2026-06-10 11:26:13 +10:00
parent cc8f61158f
commit 493826bef5
2 changed files with 17 additions and 2 deletions
+12 -2
View File
@@ -32,6 +32,7 @@ void MeshCoreCompanion::loop() {
while (mc_rx_poll(&_rx, _scratch, sizeof(_scratch), &olen)) { while (mc_rx_poll(&_rx, _scratch, sizeof(_scratch), &olen)) {
mc_event_t ev; mc_event_t ev;
if (mc_parse(_scratch, olen, &ev)) dispatch(ev); if (mc_parse(_scratch, olen, &ev)) dispatch(ev);
else if (_onUnparsed) _onUnparsed(_scratch, olen); /* frame we couldn't decode */
} }
} }
@@ -121,7 +122,11 @@ void MeshCoreCompanion::syncNextMessage() {
} }
void MeshCoreCompanion::drainMessages() { void MeshCoreCompanion::drainMessages() {
if (!_draining) { _draining = true; syncNextMessage(); } // Always (re)issue a sync — recovers a wedged drain (a lost reply leaving
// _draining stuck true), not only when idle. Safe to call periodically:
// the radio answers each sync with the next queued message or NoMoreMessages.
_draining = true;
syncNextMessage();
} }
void MeshCoreCompanion::getStats(uint8_t statsType) { void MeshCoreCompanion::getStats(uint8_t statsType) {
@@ -217,7 +222,12 @@ void MeshCoreCompanion::dispatch(const mc_event_t &ev) {
if (_onBinaryResp) _onBinaryResp(ev.u.binary_resp); if (_onBinaryResp) _onBinaryResp(ev.u.binary_resp);
break; break;
case MC_PUSH_MSG_WAITING: case MC_PUSH_MSG_WAITING:
if (_autoSync && !_draining) { _draining = true; syncNextMessage(); } // Always (re)start the drain on a MsgWaiting push. If a prior sync
// reply was lost (e.g. the host stalled and its UART RX overflowed),
// _draining can be left stuck true; gating on !_draining would then
// ignore every later push and silently stop pulling messages.
// Re-kicking unconditionally self-heals that.
if (_autoSync) { _draining = true; syncNextMessage(); }
break; break;
case MC_RESP_CHANNEL_MSG_RECV: case MC_RESP_CHANNEL_MSG_RECV:
case MC_RESP_CHANNEL_MSG_RECV_V3: case MC_RESP_CHANNEL_MSG_RECV_V3:
+5
View File
@@ -105,6 +105,10 @@ public:
void onContactsDone(ContactsDoneCb cb){ _onContactsDone = cb; } void onContactsDone(ContactsDoneCb cb){ _onContactsDone = cb; }
void onBinaryResponse(BinaryRespCb cb){ _onBinaryResp = cb; } void onBinaryResponse(BinaryRespCb cb){ _onBinaryResp = cb; }
void onEvent(EventCb cb) { _onEvent = cb; } /* every parsed frame */ void onEvent(EventCb cb) { _onEvent = cb; } /* every parsed frame */
/* Raw frames the parser did NOT recognise (payload incl. code byte). For
* diagnosing firmware/protocol mismatches — normally unused. */
using RawCb = std::function<void(const uint8_t* payload, size_t len)>;
void onUnparsedFrame(RawCb cb) { _onUnparsed = cb; }
private: private:
void sendPayload(const uint8_t *payload, size_t len); void sendPayload(const uint8_t *payload, size_t len);
@@ -134,6 +138,7 @@ private:
ContactsDoneCb _onContactsDone; ContactsDoneCb _onContactsDone;
BinaryRespCb _onBinaryResp; BinaryRespCb _onBinaryResp;
EventCb _onEvent; EventCb _onEvent;
RawCb _onUnparsed;
}; };
#endif /* MESHCORE_COMPANION_HPP */ #endif /* MESHCORE_COMPANION_HPP */