@@ -107,10 +107,13 @@ static void fhss_broadcast_handler(const fhss_api_t *fhss_api, uint16_t delay)
107
107
if (!fhss_structure ) {
108
108
return ;
109
109
}
110
+ // TODO: check parent broadcast timing constantly and calculate drift error
110
111
if (fhss_structure -> ws -> is_on_bc_channel == false) {
111
112
fhss_start_timer (fhss_structure , fhss_structure -> ws -> fhss_configuration .fhss_bc_dwell_interval * 1000 , fhss_broadcast_handler );
112
113
fhss_structure -> ws -> is_on_bc_channel = true;
113
114
next_channel = fhss_ws_calc_bc_channel (fhss_structure );
115
+ // TODO: Randomize polling TX queue when on broadcast channel
116
+ fhss_structure -> callbacks .tx_poll (fhss_structure -> fhss_api );
114
117
} else {
115
118
uint32_t timeout = (fhss_structure -> ws -> fhss_configuration .fhss_broadcast_interval - fhss_structure -> ws -> fhss_configuration .fhss_bc_dwell_interval ) * 1000 ;
116
119
fhss_start_timer (fhss_structure , timeout , fhss_broadcast_handler );
@@ -252,7 +255,7 @@ static int fhss_ws_tx_handle_callback(const fhss_api_t *api, bool is_broadcast_a
252
255
if (!fhss_structure ) {
253
256
return -1 ;
254
257
}
255
- if (is_broadcast_addr ) {
258
+ if (is_broadcast_addr || ( fhss_structure -> ws -> is_on_bc_channel == true) ) {
256
259
return 0 ;
257
260
}
258
261
if (fhss_structure -> fhss_state == FHSS_SYNCHRONIZED ) {
@@ -288,13 +291,22 @@ static int fhss_ws_tx_handle_callback(const fhss_api_t *api, bool is_broadcast_a
288
291
289
292
static bool fhss_ws_check_tx_conditions_callback (const fhss_api_t * api , bool is_broadcast_addr , uint8_t handle , int frame_type , uint16_t frame_length , uint8_t phy_header_length , uint8_t phy_tail_length )
290
293
{
291
- (void ) api ;
292
- (void ) is_broadcast_addr ;
293
294
(void ) handle ;
294
295
(void ) frame_type ;
295
296
(void ) frame_length ;
296
297
(void ) phy_header_length ;
297
298
(void ) phy_tail_length ;
299
+ fhss_structure_t * fhss_structure = fhss_get_object_with_api (api );
300
+ if (!fhss_structure ) {
301
+ return true;
302
+ }
303
+ if (fhss_structure -> ws -> fhss_configuration .ws_channel_function == WS_FIXED_CHANNEL ) {
304
+ return true;
305
+ }
306
+ // Do not allow broadcast destination on unicast channel
307
+ if (is_broadcast_addr && (fhss_structure -> ws -> is_on_bc_channel == false)) {
308
+ return false;
309
+ }
298
310
return true;
299
311
}
300
312
@@ -421,6 +433,16 @@ int fhss_ws_set_parent(fhss_structure_t *fhss_structure, const uint8_t eui64[8],
421
433
if (!fhss_structure -> ws ) {
422
434
return -1 ;
423
435
}
436
+ if (fhss_structure -> ws -> fhss_configuration .ws_channel_function == WS_FIXED_CHANNEL ) {
437
+ return 0 ;
438
+ }
439
+ // Start broadcast schedule when BC intervals are known
440
+ if (bc_timing_info -> broadcast_interval && bc_timing_info -> broadcast_dwell_interval ) {
441
+ fhss_start_timer (fhss_structure , (bc_timing_info -> broadcast_interval - bc_timing_info -> broadcast_interval_offset )* 1000 , fhss_broadcast_handler );
442
+ fhss_structure -> ws -> fhss_configuration .fhss_bc_dwell_interval = bc_timing_info -> broadcast_dwell_interval ;
443
+ fhss_structure -> ws -> fhss_configuration .fhss_broadcast_interval = bc_timing_info -> broadcast_interval ;
444
+ fhss_structure -> ws -> bc_slot = bc_timing_info -> broadcast_slot ;
445
+ }
424
446
//TODO: support multiple parents
425
447
fhss_structure -> ws -> parent_bc_info = bc_timing_info ;
426
448
return 0 ;
0 commit comments