@@ -107,10 +107,13 @@ static void fhss_broadcast_handler(const fhss_api_t *fhss_api, uint16_t delay)
107107 if (!fhss_structure ) {
108108 return ;
109109 }
110+ // TODO: check parent broadcast timing constantly and calculate drift error
110111 if (fhss_structure -> ws -> is_on_bc_channel == false) {
111112 fhss_start_timer (fhss_structure , fhss_structure -> ws -> fhss_configuration .fhss_bc_dwell_interval * 1000 , fhss_broadcast_handler );
112113 fhss_structure -> ws -> is_on_bc_channel = true;
113114 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 );
114117 } else {
115118 uint32_t timeout = (fhss_structure -> ws -> fhss_configuration .fhss_broadcast_interval - fhss_structure -> ws -> fhss_configuration .fhss_bc_dwell_interval ) * 1000 ;
116119 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
252255 if (!fhss_structure ) {
253256 return -1 ;
254257 }
255- if (is_broadcast_addr ) {
258+ if (is_broadcast_addr || ( fhss_structure -> ws -> is_on_bc_channel == true) ) {
256259 return 0 ;
257260 }
258261 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
288291
289292static 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 )
290293{
291- (void ) api ;
292- (void ) is_broadcast_addr ;
293294 (void ) handle ;
294295 (void ) frame_type ;
295296 (void ) frame_length ;
296297 (void ) phy_header_length ;
297298 (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+ }
298310 return true;
299311}
300312
@@ -421,6 +433,16 @@ int fhss_ws_set_parent(fhss_structure_t *fhss_structure, const uint8_t eui64[8],
421433 if (!fhss_structure -> ws ) {
422434 return -1 ;
423435 }
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+ }
424446 //TODO: support multiple parents
425447 fhss_structure -> ws -> parent_bc_info = bc_timing_info ;
426448 return 0 ;
0 commit comments