Skip to content

Commit f445b5a

Browse files
agessamanViezeVingertjes
authored andcommitted
fix(kiss_modem): improve RX delivery and noise floor sampling
1 parent 1af013c commit f445b5a

3 files changed

Lines changed: 29 additions & 10 deletions

File tree

examples/kiss_modem/KissModem.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,11 @@ void KissModem::loop() {
9999

100100
if (_rx_len < KISS_MAX_FRAME_SIZE) {
101101
_rx_buf[_rx_len++] = b;
102+
} else {
103+
/* Buffer full with no FEND; reset so we don't stay stuck ignoring input. */
104+
_rx_len = 0;
105+
_rx_escaped = false;
106+
_rx_active = false;
102107
}
103108
}
104109

examples/kiss_modem/KissModem.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,4 +197,6 @@ class KissModem {
197197

198198
void onPacketReceived(int8_t snr, int8_t rssi, const uint8_t* packet, uint16_t len);
199199
bool isTxBusy() const { return _tx_state != TX_IDLE; }
200+
/** True only when radio is actually transmitting; use to skip recvRaw in main loop. */
201+
bool isActuallyTransmitting() const { return _tx_state == TX_SENDING; }
200202
};

examples/kiss_modem/main.cpp

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -112,16 +112,12 @@ void setup() {
112112
void loop() {
113113
modem->loop();
114114

115-
if ((uint32_t)(millis() - next_noise_floor_calib_ms) >= NOISE_FLOOR_CALIB_INTERVAL_MS) {
116-
radio_driver.triggerNoiseFloorCalibrate(0);
117-
next_noise_floor_calib_ms = millis();
118-
}
119-
radio_driver.loop();
120-
121-
if (!modem->isTxBusy()) {
122-
if ((uint32_t)(millis() - next_agc_reset_ms) >= AGC_RESET_INTERVAL_MS) {
123-
radio_driver.resetAGC();
124-
next_agc_reset_ms = millis();
115+
if (!modem->isActuallyTransmitting()) {
116+
if (!modem->isTxBusy()) {
117+
if ((uint32_t)(millis() - next_agc_reset_ms) >= AGC_RESET_INTERVAL_MS) {
118+
radio_driver.resetAGC();
119+
next_agc_reset_ms = millis();
120+
}
125121
}
126122

127123
uint8_t rx_buf[256];
@@ -131,5 +127,21 @@ void loop() {
131127
int8_t rssi = (int8_t)radio_driver.getLastRSSI();
132128
modem->onPacketReceived(snr, rssi, rx_buf, rx_len);
133129
}
130+
/* Sample noise floor right after drain: we're in STATE_RX so wrapper can collect. */
131+
for (int i = 0; i < 16; i++) {
132+
radio_driver.loop();
133+
}
134+
}
135+
136+
/* Trigger starts a new 64-sample calibration window every 2s. */
137+
if ((uint32_t)(millis() - next_noise_floor_calib_ms) >= NOISE_FLOOR_CALIB_INTERVAL_MS) {
138+
radio_driver.triggerNoiseFloorCalibrate(0);
139+
next_noise_floor_calib_ms = millis();
140+
}
141+
radio_driver.loop();
142+
if (!modem->isActuallyTransmitting()) {
143+
for (int i = 0; i < 15; i++) {
144+
radio_driver.loop();
145+
}
134146
}
135147
}

0 commit comments

Comments
 (0)