|
|
@ -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); |
|
|
if (_radio.startSendRaw(_pending_tx, _pending_tx_len)) { |
|
|
_tx_state = TX_SENDING; |
|
|
_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; |
|
|
} |
|
|
} |
|
|
|