In any state, reaching an abort recheck triggers a request for a new abort struct from the device
In any state, reaching an abort...
(rx_scan_ended) Do RSSI measurement Respond RX_STATUS_NOSYNC
(rx_scan_ended)...
@scan_end
@scan_end
modem could sync
modem could sync
rx_sync calculate bit errors for this µs
rx_sync...
now < sync_end & now > scan_end
now < sync_end &...
Otherwise, @+1µs
Otherwise,...
no
no
now >= sync_end
now >= sync_end
Do RSSI measurement Request packet acceptance from device
Do RSSI measurement...
Device did not accept
Device did not accept
Device accepts pkt
Device accepts pkt
rx_header calculate bit errors for this µs
rx_header...
Respond RX_STATUS_HEADER_ERROR
Respond RX_STATUS_HEADER_ERROR
Too many bit errors
Too many bit errors
now >= header_end
now >= header_end
0
0
Otherwise, @+1µs
Otherwise,...
now >= header_end
now >= header_end
Not too many bit errors
Not too many bit erro...
rx_payload calculate bit errors for this µs
rx_payload...
Otherwise, @+1µs
Otherwise,...
now>=payloadd_end
now>=payloa...
No bit errors
No bit errors
scan_end, sync_end, header_end and payload_end are limited by the abort timeout
scan_end, sync_end, header_end...
Respond RX_STATUS_CRC_ERROR
Respond RX_STATUS_CRC_ERROR
Any bit error (in header or payload)
Any bit error (in header or payl...
now >=payload_end
now >=payload_end
Respond RX_STATUS_CRC_OK
Respond RX_STATUS_CRC_OK
In blue (@time): the process waits until that time before continuing (next step is queued in function queue)
In blue (@time): the process...
In red, transition condition
In red,...Device interface activity diagram
rx_found
rx_found
Matching Tx (transition triggered by Tx packet_start)
Matching Tx...
Otherwise
Otherwise
Tx
Tx
tx_Start
Activate in Tx list
tx_Start...
prepare_tx
Get & store Tx req & packet Register in Tx list
prepare_tx...
@txs.start_tx_time
@txs.start_tx_time
packet_Start
Activate packet in Tx list Search for matching Rx
packet_Start...
@MAX(txs.start_packet_time, current_time)
@MAX(txs.start_packet_t...
CCA
CCA
CCA
CCA
cca_meas
Do RSSI measurement search for matching Tx mod
cca_meas...
prepare_CCA
Get & store CCA req
prepare_CCA...
@cca_s.start_time
@cca_s.start_time
if RSSI over threshold & stop on high RRSI OR modulation power over threshold & stop on modulation OR @cca_s.scan_end
if RSSI over threshol...
During cca_meas reaching an abort recheck triggers a request for a new abort struct from the device
During cca_meas reaching an abort...
Disclaimer: The FSM is not implemented as linearly as this. Each state may actually go to the abort recheck, before continuing to the next, or directly skip some of the following states if the Tx timings are configured accordingly (for ex. end_tx_time < end_packet_time)
Disclaimer: The FSM is not implement...
Otherwise, @+scan_period
Otherwise,...
@MIN(txs.end_packet_time, txs.end_tx_time)
@MIN(txs.end_packet_tim...
packet_end
Deactive packet in Tx list
packet_end...
@MIN(txs.end_tx_time, abort_time)
@MIN(txs.end_tx_time, a...
Tx_End
Clear from Tx list
Respond to device
Tx_End...
tx_abort_reeval
request new abort parameters from device
tx_abort_reeval...
From any state (except tx_end)
From any state (except tx_...
if abort_recheck_time < next_state_time @ abort_recheck_time
if abort_recheck_time <...
To whichever state is next
To whichever state is n...
Note that when using the Txv1 API, start_tx_time == start_packet_time, and therefore packet_start executes right after tx_start. Similarly end_tx_time == end_packet_time, and packet_end is immediately followed by tx_end
Note that when using the Txv1 API, s...
header_ duration
header_...
>0
>0
== 0
== 0
rx_search _start
rx_search...
Matching Tx found
Matching Tx found
@last moment given acceptable_preamble_truncation
@last moment given acceptab...
too many bit errors
too many...
yes
yes
Note: A rx_sync loss goes back to rx_search_start to search for a possible new packet (the same packet will not be found)
But rx_found should not go back to rx_search_start, as that would retrigger the same packet being found again. (rx_found is called as result of having found a packet, if it cannot sync the consecuence should be to go rx_search_reeval to wait for new Tx's)