@@ -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 }
0 commit comments