Wait
 Wait
 RSSI
 RSSI
RSSI_Done

Do RSSI measurement
Respond to device
RSSI_Done...
prepare_RSSI

Get & store RSSI req
prepare_RSSI...
@RSSI_s.meas_time
@RSSI_s.meas_time
Wait_Done

Respond to device
Wait_Done...
prepare_Wait

Get wait req
prepare_Wait...
@wait.end
@wait.end
  Rx
  Rx
prepare_rx

Get & store Rx req
Initialize Rx status
prepare_rx...
@rx_s.start_time
@rx_s.start_time
 get next device request
 get next device request
PB_MSG_DISCONNECT
PB_MSG_DISCONNECT
PB_MSG_TERMINATE
PB_MSG_TERMINATE
P2G4_WAIT
P2G4_WAIT
P2G4_TX(v2)
P2G4_TX(v2)
P2G4_MSG_RX(v2)
P2G4_MSG_RX(v2)
P2G4_MSG_RSSI_MEAS
P2G4_MSG_RSSI_MEAS
P2G4_MSG_CCA
P2G4_MSG_CCA
request type?
request type?
Disconnect all active devices
Disconnect all active devices
Wait
Wait
Tx
Tx
Rx
Rx
RSSI
RSSI
Rx FSM
Rx FSM
 Rx FSM
 Rx FSM
rx_search_
reeval
rx_search_...
Otherwise
Otherwise
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)
Note: A rx_sync loss goes back to rx_...
@+1µs
@+1µs
Text is not SVG - cannot display