@@ -111,7 +111,7 @@ static void fhss_broadcast_handler(const fhss_api_t *fhss_api, uint16_t delay)
111
111
if (!fhss_structure ) {
112
112
return ;
113
113
}
114
- // TODO: check parent broadcast timing constantly and calculate drift error
114
+
115
115
if (fhss_structure -> ws -> is_on_bc_channel == false) {
116
116
fhss_start_timer (fhss_structure , fhss_structure -> ws -> fhss_configuration .fhss_bc_dwell_interval * 1000 , fhss_broadcast_handler );
117
117
fhss_structure -> ws -> is_on_bc_channel = true;
@@ -503,13 +503,20 @@ int fhss_ws_set_parent(fhss_structure_t *fhss_structure, const uint8_t eui64[8],
503
503
if (fhss_structure -> ws -> fhss_configuration .ws_channel_function == WS_FIXED_CHANNEL ) {
504
504
return 0 ;
505
505
}
506
- // Start broadcast schedule when BC intervals are known
507
- if (bc_timing_info -> broadcast_interval && bc_timing_info -> broadcast_dwell_interval ) {
508
- fhss_start_timer (fhss_structure , (bc_timing_info -> broadcast_interval - bc_timing_info -> broadcast_interval_offset )* 1000 , fhss_broadcast_handler );
509
- fhss_structure -> ws -> fhss_configuration .fhss_bc_dwell_interval = bc_timing_info -> broadcast_dwell_interval ;
510
- fhss_structure -> ws -> fhss_configuration .fhss_broadcast_interval = bc_timing_info -> broadcast_interval ;
511
- fhss_structure -> ws -> bc_slot = bc_timing_info -> broadcast_slot ;
506
+ if (!bc_timing_info -> broadcast_interval || !bc_timing_info -> broadcast_dwell_interval ) {
507
+ return -1 ;
512
508
}
509
+
510
+ uint32_t time_from_reception_ms = (fhss_structure -> fhss_api -> read_timestamp (fhss_structure -> fhss_api ) - bc_timing_info -> bt_rx_timestamp )/1000 ;
511
+ uint32_t true_bc_interval_offset = (bc_timing_info -> broadcast_interval_offset + time_from_reception_ms ) % bc_timing_info -> broadcast_interval ;
512
+ uint32_t timeout = ((bc_timing_info -> broadcast_interval - true_bc_interval_offset )* 1000 );
513
+ fhss_start_timer (fhss_structure , timeout , fhss_broadcast_handler );
514
+ uint16_t slots_since_reception = (bc_timing_info -> broadcast_interval_offset + time_from_reception_ms ) / bc_timing_info -> broadcast_interval ;
515
+ // TODO: Calculate drift error
516
+ fhss_structure -> ws -> fhss_configuration .fhss_bc_dwell_interval = bc_timing_info -> broadcast_dwell_interval ;
517
+ fhss_structure -> ws -> fhss_configuration .fhss_broadcast_interval = bc_timing_info -> broadcast_interval ;
518
+ fhss_structure -> ws -> bc_slot = bc_timing_info -> broadcast_slot + slots_since_reception ;
519
+
513
520
//TODO: support multiple parents
514
521
fhss_structure -> ws -> parent_bc_info = bc_timing_info ;
515
522
return 0 ;
0 commit comments