|
@@ -129,6 +129,8 @@ void KissModem::processFrame() {
|
|
|
memcpy(_pending_tx, data, data_len);
|
|
memcpy(_pending_tx, data, data_len);
|
|
|
_pending_tx_len = data_len;
|
|
_pending_tx_len = data_len;
|
|
|
_has_pending_tx = true;
|
|
_has_pending_tx = true;
|
|
|
|
|
+ } else if (_has_pending_tx) {
|
|
|
|
|
+ writeHardwareError(HW_ERR_TX_BUSY);
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
|
|
|
|
@@ -257,6 +259,7 @@ void KissModem::processTx() {
|
|
|
_tx_timer = millis();
|
|
_tx_timer = millis();
|
|
|
_tx_state = TX_DELAY;
|
|
_tx_state = TX_DELAY;
|
|
|
} else {
|
|
} else {
|
|
|
|
|
+ _tx_timer = millis();
|
|
|
_tx_state = TX_WAIT_CLEAR;
|
|
_tx_state = TX_WAIT_CLEAR;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -273,19 +276,30 @@ void KissModem::processTx() {
|
|
|
_tx_timer = millis();
|
|
_tx_timer = millis();
|
|
|
_tx_state = TX_SLOT_WAIT;
|
|
_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;
|
|
break;
|
|
|
|
|
|
|
|
case TX_SLOT_WAIT:
|
|
case TX_SLOT_WAIT:
|
|
|
if (millis() - _tx_timer >= (uint32_t)_slottime * 10) {
|
|
if (millis() - _tx_timer >= (uint32_t)_slottime * 10) {
|
|
|
|
|
+ _tx_timer = millis();
|
|
|
_tx_state = TX_WAIT_CLEAR;
|
|
_tx_state = TX_WAIT_CLEAR;
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
case TX_DELAY:
|
|
case TX_DELAY:
|
|
|
if (millis() - _tx_timer >= (uint32_t)_txdelay * 10) {
|
|
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 {
|
|
|
|
|
+ uint8_t result = 0x00;
|
|
|
|
|
+ writeHardwareFrame(HW_RESP_TX_DONE, &result, 1);
|
|
|
|
|
+ _has_pending_tx = false;
|
|
|
|
|
+ _tx_state = TX_IDLE;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
|
|
|
|
@@ -296,6 +310,12 @@ void KissModem::processTx() {
|
|
|
writeHardwareFrame(HW_RESP_TX_DONE, &result, 1);
|
|
writeHardwareFrame(HW_RESP_TX_DONE, &result, 1);
|
|
|
_has_pending_tx = false;
|
|
_has_pending_tx = false;
|
|
|
_tx_state = TX_IDLE;
|
|
_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;
|
|
break;
|
|
|
}
|
|
}
|