@@ -295,6 +295,7 @@ static void fhss_broadcast_handler(const fhss_api_t *fhss_api, uint16_t delay)
295
295
// stop broadcast schedule
296
296
fhss_structure -> ws -> is_on_bc_channel = false;
297
297
fhss_structure -> ws -> synchronization_time = 0 ;
298
+ fhss_structure -> ws -> broadcast_timer_running = false;
298
299
return ;
299
300
}
300
301
if (fhss_structure -> ws -> is_on_bc_channel == false) {
@@ -479,6 +480,7 @@ static int16_t fhss_ws_synch_state_set_callback(const fhss_api_t *api, fhss_stat
479
480
// Start broadcast schedule when BC intervals are known
480
481
if (fhss_broadcast_interval && fhss_bc_dwell_interval ) {
481
482
fhss_broadcast_handler (fhss_structure -> fhss_api , 0 );
483
+ fhss_structure -> ws -> broadcast_timer_running = true;
482
484
}
483
485
// Start unicast schedule
484
486
if ((fhss_structure -> ws -> fhss_configuration .ws_uc_channel_function != WS_FIXED_CHANNEL )) {
@@ -491,6 +493,7 @@ static int16_t fhss_ws_synch_state_set_callback(const fhss_api_t *api, fhss_stat
491
493
eventOS_callback_timer_stop (fhss_structure -> fhss_event_timer );
492
494
fhss_stop_timer (fhss_structure , fhss_unicast_handler );
493
495
fhss_stop_timer (fhss_structure , fhss_broadcast_handler );
496
+ fhss_structure -> ws -> broadcast_timer_running = false;
494
497
}
495
498
496
499
fhss_structure -> fhss_state = fhss_state ;
@@ -853,8 +856,13 @@ static uint32_t fhss_ws_get_retry_period_callback(const fhss_api_t *api, uint8_t
853
856
if (!fhss_structure ) {
854
857
return return_value ;
855
858
}
859
+ // We don't know the broadcast schedule, use large backoff with MAC retries
860
+ if (fhss_structure -> ws -> broadcast_timer_running == false) {
861
+ return 100000 ;
862
+ }
863
+ // We don't know the TX/RX slots, use randomised large backoff with MAC retries
856
864
if (fhss_structure -> own_hop == 0xff ) {
857
- return return_value ;
865
+ return (( uint32_t ) randLIB_get_random_in_range ( 50 , 150 ) * 1000 ) ;
858
866
}
859
867
if (fhss_structure -> ws -> is_on_bc_channel == true) {
860
868
return return_value ;
@@ -955,6 +963,7 @@ int fhss_ws_set_parent(fhss_structure_t *fhss_structure, const uint8_t eui64[8],
955
963
timeout -= MS_TO_US (bc_timing_info -> broadcast_interval - bc_timing_info -> broadcast_dwell_interval );
956
964
}
957
965
fhss_ws_start_timer (fhss_structure , timeout , fhss_broadcast_handler );
966
+ fhss_structure -> ws -> broadcast_timer_running = true;
958
967
uint16_t slots_since_reception = (bc_timing_info -> broadcast_interval_offset + time_from_reception_ms ) / bc_timing_info -> broadcast_interval ;
959
968
// TODO: Calculate drift error
960
969
fhss_structure -> ws -> fhss_configuration .fhss_bc_dwell_interval = bc_timing_info -> broadcast_dwell_interval ;
0 commit comments