Skip to content

Commit

Permalink
Correct ufsi timing calculation
Browse files Browse the repository at this point in the history
When calculating ufsi, the function was relying
on the slot processed by the unicast fhss timer
callback, which can be delayed. When it happens
the slot value is wrong, and the ufsi is incorrect.

The ufsi is then used by the peer to determined
the reply channel, so the devices are thus
unsynchronized until the next uplink packet.
  • Loading branch information
AlbanJeantheau-silabs authored and Arto Kinnunen committed Jun 14, 2021
1 parent 560619d commit d6f4421
Showing 1 changed file with 24 additions and 5 deletions.
29 changes: 24 additions & 5 deletions source/Service_Libs/fhss/fhss_ws.c
Original file line number Diff line number Diff line change
Expand Up @@ -499,16 +499,35 @@ static uint32_t fhss_ws_calculate_ufsi(fhss_structure_t *fhss_structure, uint32_
}
}
cur_slot--;
uint32_t remaining_time_ms = 0;
if (fhss_structure->ws->unicast_timer_running == true) {
remaining_time_ms = US_TO_MS(get_remaining_slots_us(fhss_structure, fhss_unicast_handler, MS_TO_US(dwell_time) - NS_TO_US((int64_t)(fhss_structure->ws->drift_per_millisecond_ns * dwell_time))));
}

uint32_t time_to_tx = 0;
uint32_t cur_time = fhss_structure->callbacks.read_timestamp(fhss_structure->fhss_api);
if (cur_time < tx_time) {
time_to_tx = US_TO_MS(tx_time - cur_time);
}
uint64_t ms_since_seq_start = (cur_slot * dwell_time) + (dwell_time - remaining_time_ms) + time_to_tx;
uint64_t ms_since_seq_start;
if (fhss_structure->ws->unicast_timer_running == true) {
if (fhss_structure->ws->next_uc_timeout < cur_time) {
// The unicast timer has already expired, so count all previous slots
// plus 1 completed slot
// plus the time from timer expiration to now
// plus the time until Tx
ms_since_seq_start = ((cur_slot + 1) * dwell_time) + US_TO_MS(cur_time - fhss_structure->ws->next_uc_timeout) + time_to_tx;
} else {
// The unicast timer is still running, so count all previous slots
// plus the remaining time in the slot
// plus the time until Tx
uint32_t remaining_time_ms = US_TO_MS(fhss_structure->ws->next_uc_timeout - cur_time);
ms_since_seq_start = (cur_slot * dwell_time) + (dwell_time - remaining_time_ms) + time_to_tx;
}
} else {
// The unicast timer is not running. Act as if the slot has completed.
// count all previous slots
// plus 1 completed slot
// plus the time until Tx
ms_since_seq_start = ( (cur_slot + 1) * dwell_time) + time_to_tx;
}

uint32_t seq_length = 0x10000;
if (fhss_structure->ws->fhss_configuration.ws_uc_channel_function == WS_TR51CF) {
ms_since_seq_start %= (dwell_time * fhss_structure->number_of_uc_channels);
Expand Down

0 comments on commit d6f4421

Please sign in to comment.