From 314d777b42b63e8ff98d82665ac51d038f0d5293 Mon Sep 17 00:00:00 2001 From: tuzzmaniandevil Date: Thu, 7 May 2026 00:03:09 +0000 Subject: [PATCH 1/2] Enhance KissModem frame processing and timeout handling --- examples/kiss_modem/KissModem.cpp | 23 +++++++++++++++++++++-- examples/kiss_modem/KissModem.h | 1 + 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/examples/kiss_modem/KissModem.cpp b/examples/kiss_modem/KissModem.cpp index 5e8b00d521..03ea7d6bd1 100644 --- a/examples/kiss_modem/KissModem.cpp +++ b/examples/kiss_modem/KissModem.cpp @@ -129,6 +129,9 @@ void KissModem::processFrame() { memcpy(_pending_tx, data, data_len); _pending_tx_len = data_len; _has_pending_tx = true; + } else if (_has_pending_tx) { + uint8_t result = 0x00; + writeHardwareFrame(HW_RESP_TX_DONE, &result, 1); } break; @@ -257,6 +260,7 @@ void KissModem::processTx() { _tx_timer = millis(); _tx_state = TX_DELAY; } else { + _tx_timer = millis(); _tx_state = TX_WAIT_CLEAR; } } @@ -273,19 +277,28 @@ void KissModem::processTx() { _tx_timer = millis(); _tx_state = TX_SLOT_WAIT; } + } else if (millis() - _tx_timer >= _radio.getEstAirtimeFor(KISS_MAX_PACKET_SIZE) * KISS_TX_TIMEOUT_FACTOR) { + _tx_timer = millis(); + _tx_state = TX_DELAY; } break; case TX_SLOT_WAIT: if (millis() - _tx_timer >= (uint32_t)_slottime * 10) { + _tx_timer = millis(); _tx_state = TX_WAIT_CLEAR; } break; case TX_DELAY: if (millis() - _tx_timer >= (uint32_t)_txdelay * 10) { - _radio.startSendRaw(_pending_tx, _pending_tx_len); - _tx_state = TX_SENDING; + if (_radio.startSendRaw(_pending_tx, _pending_tx_len)) { + _tx_timer = millis(); + _tx_state = TX_SENDING; + } else { + _has_pending_tx = false; + _tx_state = TX_IDLE; + } } break; @@ -296,6 +309,12 @@ void KissModem::processTx() { writeHardwareFrame(HW_RESP_TX_DONE, &result, 1); _has_pending_tx = false; _tx_state = TX_IDLE; + } else if (millis() - _tx_timer >= _radio.getEstAirtimeFor(_pending_tx_len) * KISS_TX_TIMEOUT_FACTOR) { + _radio.onSendFinished(); + uint8_t result = 0x00; + writeHardwareFrame(HW_RESP_TX_DONE, &result, 1); + _has_pending_tx = false; + _tx_state = TX_IDLE; } break; } diff --git a/examples/kiss_modem/KissModem.h b/examples/kiss_modem/KissModem.h index 60566add92..66ce44242b 100644 --- a/examples/kiss_modem/KissModem.h +++ b/examples/kiss_modem/KissModem.h @@ -26,6 +26,7 @@ #define KISS_DEFAULT_TXDELAY 50 #define KISS_DEFAULT_PERSISTENCE 63 #define KISS_DEFAULT_SLOTTIME 10 +#define KISS_TX_TIMEOUT_FACTOR 3/2 // 1.5x estimated airtime #define HW_CMD_GET_IDENTITY 0x01 #define HW_CMD_GET_RANDOM 0x02 From ffa76016ff7cef85de4e7d32c5b7f205fe8e0c4a Mon Sep 17 00:00:00 2001 From: tuzzmaniandevil Date: Fri, 8 May 2026 11:14:22 +1200 Subject: [PATCH 2/2] Address two comments from PR --- examples/kiss_modem/KissModem.cpp | 5 +++-- examples/kiss_modem/KissModem.h | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/kiss_modem/KissModem.cpp b/examples/kiss_modem/KissModem.cpp index 03ea7d6bd1..eeab1501d5 100644 --- a/examples/kiss_modem/KissModem.cpp +++ b/examples/kiss_modem/KissModem.cpp @@ -130,8 +130,7 @@ void KissModem::processFrame() { _pending_tx_len = data_len; _has_pending_tx = true; } else if (_has_pending_tx) { - uint8_t result = 0x00; - writeHardwareFrame(HW_RESP_TX_DONE, &result, 1); + writeHardwareError(HW_ERR_TX_BUSY); } break; @@ -296,6 +295,8 @@ void KissModem::processTx() { _tx_timer = millis(); _tx_state = TX_SENDING; } else { + uint8_t result = 0x00; + writeHardwareFrame(HW_RESP_TX_DONE, &result, 1); _has_pending_tx = false; _tx_state = TX_IDLE; } diff --git a/examples/kiss_modem/KissModem.h b/examples/kiss_modem/KissModem.h index 66ce44242b..bbe99d6de4 100644 --- a/examples/kiss_modem/KissModem.h +++ b/examples/kiss_modem/KissModem.h @@ -72,6 +72,7 @@ #define HW_ERR_MAC_FAILED 0x04 #define HW_ERR_UNKNOWN_CMD 0x05 #define HW_ERR_ENCRYPT_FAILED 0x06 +#define HW_ERR_TX_BUSY 0x07 #define KISS_FIRMWARE_VERSION 1