From f445b5acdc17ee6664cee77d5b113e2e54412eb2 Mon Sep 17 00:00:00 2001 From: agessaman Date: Fri, 6 Feb 2026 16:31:20 -0800 Subject: [PATCH] fix(kiss_modem): improve RX delivery and noise floor sampling --- examples/kiss_modem/KissModem.cpp | 5 +++++ examples/kiss_modem/KissModem.h | 2 ++ examples/kiss_modem/main.cpp | 32 +++++++++++++++++++++---------- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/examples/kiss_modem/KissModem.cpp b/examples/kiss_modem/KissModem.cpp index 31bb8a1e..94e4fe83 100644 --- a/examples/kiss_modem/KissModem.cpp +++ b/examples/kiss_modem/KissModem.cpp @@ -99,6 +99,11 @@ void KissModem::loop() { if (_rx_len < KISS_MAX_FRAME_SIZE) { _rx_buf[_rx_len++] = b; + } else { + /* Buffer full with no FEND; reset so we don't stay stuck ignoring input. */ + _rx_len = 0; + _rx_escaped = false; + _rx_active = false; } } diff --git a/examples/kiss_modem/KissModem.h b/examples/kiss_modem/KissModem.h index 6b56b91e..674b68f7 100644 --- a/examples/kiss_modem/KissModem.h +++ b/examples/kiss_modem/KissModem.h @@ -197,4 +197,6 @@ public: void onPacketReceived(int8_t snr, int8_t rssi, const uint8_t* packet, uint16_t len); bool isTxBusy() const { return _tx_state != TX_IDLE; } + /** True only when radio is actually transmitting; use to skip recvRaw in main loop. */ + bool isActuallyTransmitting() const { return _tx_state == TX_SENDING; } }; diff --git a/examples/kiss_modem/main.cpp b/examples/kiss_modem/main.cpp index 62c1658f..adb20146 100644 --- a/examples/kiss_modem/main.cpp +++ b/examples/kiss_modem/main.cpp @@ -112,16 +112,12 @@ void setup() { void loop() { modem->loop(); - if ((uint32_t)(millis() - next_noise_floor_calib_ms) >= NOISE_FLOOR_CALIB_INTERVAL_MS) { - radio_driver.triggerNoiseFloorCalibrate(0); - next_noise_floor_calib_ms = millis(); - } - radio_driver.loop(); - - if (!modem->isTxBusy()) { - if ((uint32_t)(millis() - next_agc_reset_ms) >= AGC_RESET_INTERVAL_MS) { - radio_driver.resetAGC(); - next_agc_reset_ms = millis(); + if (!modem->isActuallyTransmitting()) { + if (!modem->isTxBusy()) { + if ((uint32_t)(millis() - next_agc_reset_ms) >= AGC_RESET_INTERVAL_MS) { + radio_driver.resetAGC(); + next_agc_reset_ms = millis(); + } } uint8_t rx_buf[256]; @@ -131,5 +127,21 @@ void loop() { int8_t rssi = (int8_t)radio_driver.getLastRSSI(); modem->onPacketReceived(snr, rssi, rx_buf, rx_len); } + /* Sample noise floor right after drain: we're in STATE_RX so wrapper can collect. */ + for (int i = 0; i < 16; i++) { + radio_driver.loop(); + } + } + + /* Trigger starts a new 64-sample calibration window every 2s. */ + if ((uint32_t)(millis() - next_noise_floor_calib_ms) >= NOISE_FLOOR_CALIB_INTERVAL_MS) { + radio_driver.triggerNoiseFloorCalibrate(0); + next_noise_floor_calib_ms = millis(); + } + radio_driver.loop(); + if (!modem->isActuallyTransmitting()) { + for (int i = 0; i < 15; i++) { + radio_driver.loop(); + } } }