Skip to content

Commit 56d4671

Browse files
authored
Merge pull request #2490 from tuzzmaniandevil/dev
Enhance KissModem frame processing and timeout handling
2 parents 6e2e9cc + ffa7601 commit 56d4671

2 files changed

Lines changed: 24 additions & 2 deletions

File tree

examples/kiss_modem/KissModem.cpp

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ void KissModem::processFrame() {
129129
memcpy(_pending_tx, data, data_len);
130130
_pending_tx_len = data_len;
131131
_has_pending_tx = true;
132+
} else if (_has_pending_tx) {
133+
writeHardwareError(HW_ERR_TX_BUSY);
132134
}
133135
break;
134136

@@ -257,6 +259,7 @@ void KissModem::processTx() {
257259
_tx_timer = millis();
258260
_tx_state = TX_DELAY;
259261
} else {
262+
_tx_timer = millis();
260263
_tx_state = TX_WAIT_CLEAR;
261264
}
262265
}
@@ -273,19 +276,30 @@ void KissModem::processTx() {
273276
_tx_timer = millis();
274277
_tx_state = TX_SLOT_WAIT;
275278
}
279+
} else if (millis() - _tx_timer >= _radio.getEstAirtimeFor(KISS_MAX_PACKET_SIZE) * KISS_TX_TIMEOUT_FACTOR) {
280+
_tx_timer = millis();
281+
_tx_state = TX_DELAY;
276282
}
277283
break;
278284

279285
case TX_SLOT_WAIT:
280286
if (millis() - _tx_timer >= (uint32_t)_slottime * 10) {
287+
_tx_timer = millis();
281288
_tx_state = TX_WAIT_CLEAR;
282289
}
283290
break;
284291

285292
case TX_DELAY:
286293
if (millis() - _tx_timer >= (uint32_t)_txdelay * 10) {
287-
_radio.startSendRaw(_pending_tx, _pending_tx_len);
288-
_tx_state = TX_SENDING;
294+
if (_radio.startSendRaw(_pending_tx, _pending_tx_len)) {
295+
_tx_timer = millis();
296+
_tx_state = TX_SENDING;
297+
} else {
298+
uint8_t result = 0x00;
299+
writeHardwareFrame(HW_RESP_TX_DONE, &result, 1);
300+
_has_pending_tx = false;
301+
_tx_state = TX_IDLE;
302+
}
289303
}
290304
break;
291305

@@ -296,6 +310,12 @@ void KissModem::processTx() {
296310
writeHardwareFrame(HW_RESP_TX_DONE, &result, 1);
297311
_has_pending_tx = false;
298312
_tx_state = TX_IDLE;
313+
} else if (millis() - _tx_timer >= _radio.getEstAirtimeFor(_pending_tx_len) * KISS_TX_TIMEOUT_FACTOR) {
314+
_radio.onSendFinished();
315+
uint8_t result = 0x00;
316+
writeHardwareFrame(HW_RESP_TX_DONE, &result, 1);
317+
_has_pending_tx = false;
318+
_tx_state = TX_IDLE;
299319
}
300320
break;
301321
}

examples/kiss_modem/KissModem.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#define KISS_DEFAULT_TXDELAY 50
2727
#define KISS_DEFAULT_PERSISTENCE 63
2828
#define KISS_DEFAULT_SLOTTIME 10
29+
#define KISS_TX_TIMEOUT_FACTOR 3/2 // 1.5x estimated airtime
2930

3031
#define HW_CMD_GET_IDENTITY 0x01
3132
#define HW_CMD_GET_RANDOM 0x02
@@ -71,6 +72,7 @@
7172
#define HW_ERR_MAC_FAILED 0x04
7273
#define HW_ERR_UNKNOWN_CMD 0x05
7374
#define HW_ERR_ENCRYPT_FAILED 0x06
75+
#define HW_ERR_TX_BUSY 0x07
7476

7577
#define KISS_FIRMWARE_VERSION 1
7678

0 commit comments

Comments
 (0)