3434
3535// Enable this flag to use channel traces
3636// #define FHSS_CHANNEL_DEBUG
37+ // Enable this flag to use debug callbacks
38+ // #define FHSS_CHANNEL_DEBUG_CBS
39+
40+ #ifdef FHSS_CHANNEL_DEBUG_CBS
41+ void (* fhss_uc_switch )(void ) = NULL ;
42+ void (* fhss_bc_switch )(void ) = NULL ;
43+ #endif /*FHSS_CHANNEL_DEBUG_CBS*/
3744
3845#define DEF_2E24 0x1000000
3946#define IE_HEADER_LENGTH_MASK 0x007f
@@ -108,7 +115,6 @@ static int32_t fhss_ws_calc_bc_channel(fhss_structure_t *fhss_structure)
108115
109116static void fhss_broadcast_handler (const fhss_api_t * fhss_api , uint16_t delay )
110117{
111- (void ) delay ;
112118 int32_t next_channel ;
113119 fhss_structure_t * fhss_structure = fhss_get_object_with_api (fhss_api );
114120 if (!fhss_structure ) {
@@ -121,12 +127,12 @@ static void fhss_broadcast_handler(const fhss_api_t *fhss_api, uint16_t delay)
121127 return ;
122128 }
123129 if (fhss_structure -> ws -> is_on_bc_channel == false) {
124- fhss_start_timer (fhss_structure , fhss_structure -> ws -> fhss_configuration .fhss_bc_dwell_interval * 1000 , fhss_broadcast_handler );
130+ fhss_start_timer (fhss_structure , fhss_structure -> ws -> fhss_configuration .fhss_bc_dwell_interval * 1000 - ( delay * fhss_structure -> platform_functions . fhss_resolution_divider ) , fhss_broadcast_handler );
125131 fhss_structure -> ws -> is_on_bc_channel = true;
126132 next_channel = fhss_structure -> ws -> bc_channel = fhss_ws_calc_bc_channel (fhss_structure );
127133 } else {
128134 uint32_t timeout = (fhss_structure -> ws -> fhss_configuration .fhss_broadcast_interval - fhss_structure -> ws -> fhss_configuration .fhss_bc_dwell_interval ) * 1000 ;
129- fhss_start_timer (fhss_structure , timeout , fhss_broadcast_handler );
135+ fhss_start_timer (fhss_structure , timeout - ( delay * fhss_structure -> platform_functions . fhss_resolution_divider ) , fhss_broadcast_handler );
130136 fhss_structure -> ws -> is_on_bc_channel = false;
131137 // Should return to own (unicast) listening channel after broadcast channel
132138 next_channel = fhss_structure -> rx_channel ;
@@ -135,6 +141,11 @@ static void fhss_broadcast_handler(const fhss_api_t *fhss_api, uint16_t delay)
135141#endif /*FHSS_CHANNEL_DEBUG*/
136142 }
137143 fhss_structure -> callbacks .change_channel (fhss_structure -> fhss_api , next_channel );
144+ #ifdef FHSS_CHANNEL_DEBUG_CBS
145+ if (fhss_bc_switch ) {
146+ fhss_bc_switch ();
147+ }
148+ #endif /*FHSS_CHANNEL_DEBUG_CBS*/
138149 fhss_ws_start_tx_poll_timer (fhss_structure , fhss_structure -> callbacks .read_tx_queue_size (fhss_structure -> fhss_api , true),
139150 fhss_structure -> ws -> fhss_configuration .fhss_bc_dwell_interval );
140151}
@@ -162,7 +173,11 @@ static uint32_t fhss_ws_calculate_ufsi(fhss_structure_t *fhss_structure, uint32_
162173 }
163174 cur_slot -- ;
164175 uint32_t remaining_time = (fhss_structure -> platform_functions .fhss_get_remaining_slots (fhss_unicast_handler , fhss_structure -> fhss_api ) / 1000 );
165- uint32_t time_to_tx = (tx_time - fhss_structure -> fhss_api -> read_timestamp (fhss_structure -> fhss_api )) / 1000 ;
176+ uint32_t time_to_tx = 0 ;
177+ uint32_t cur_time = fhss_structure -> callbacks .read_timestamp (fhss_structure -> fhss_api );
178+ if (cur_time < tx_time ) {
179+ time_to_tx = (tx_time - cur_time ) / 1000 ;
180+ }
166181 uint64_t ms_since_seq_start = (cur_slot * dwell_time ) + (dwell_time - remaining_time ) + time_to_tx ;
167182 uint32_t seq_length = 0x10000 ;
168183 if (fhss_structure -> ws -> fhss_configuration .ws_channel_function == WS_TR51CF ) {
@@ -181,7 +196,7 @@ static uint32_t fhss_ws_calculate_broadcast_interval_offset(fhss_structure_t *fh
181196 if (fhss_structure -> ws -> is_on_bc_channel == true) {
182197 remaining_time += (broadcast_interval - dwell_time );
183198 }
184- uint32_t time_to_tx = (tx_time - fhss_structure -> fhss_api -> read_timestamp (fhss_structure -> fhss_api )) / 1000 ;
199+ uint32_t time_to_tx = (tx_time - fhss_structure -> callbacks . read_timestamp (fhss_structure -> fhss_api )) / 1000 ;
185200 return (broadcast_interval - remaining_time ) + time_to_tx ;
186201}
187202
@@ -194,7 +209,7 @@ static uint16_t fhss_ws_calculate_destination_slot(fhss_ws_neighbor_timing_info_
194209 if (neighbor_timing_info -> uc_timing_info .unicast_channel_function == WS_TR51CF ) {
195210 seq_length = neighbor_timing_info -> uc_timing_info .unicast_number_of_channels ;
196211 }
197- uint32_t dest_ms_since_seq_start = own_ceil ((float )(ufsi * seq_length * dwell_time ) / DEF_2E24 );
212+ uint32_t dest_ms_since_seq_start = own_ceil ((float )(( uint64_t ) ufsi * seq_length * dwell_time ) / DEF_2E24 );
198213 return (own_floor (((float )((tx_time - ufsi_timestamp )/1000 + dest_ms_since_seq_start ) / dwell_time )) % seq_length );
199214}
200215
@@ -230,7 +245,7 @@ static void fhss_ws_synch_state_set_callback(const fhss_api_t *api, fhss_states
230245static void fhss_ws_update_uc_channel_callback (fhss_structure_t * fhss_structure )
231246{
232247 uint8_t mac_address [8 ];
233- int32_t next_channel ;
248+ int32_t next_channel = fhss_structure -> rx_channel ;
234249 fhss_structure -> callbacks .read_mac_address (fhss_structure -> fhss_api , mac_address );
235250 if (fhss_structure -> ws -> fhss_configuration .ws_channel_function == WS_FIXED_CHANNEL ) {
236251 return ;
@@ -255,6 +270,11 @@ static void fhss_ws_update_uc_channel_callback(fhss_structure_t *fhss_structure)
255270 tr_info ("%" PRIu32 " UC %u %u" , fhss_structure -> platform_functions .fhss_get_timestamp (fhss_structure -> fhss_api ), next_channel , fhss_structure -> ws -> uc_slot );
256271#endif /*FHSS_CHANNEL_DEBUG*/
257272 fhss_structure -> callbacks .change_channel (fhss_structure -> fhss_api , next_channel );
273+ #ifdef FHSS_CHANNEL_DEBUG_CBS
274+ if (fhss_uc_switch ) {
275+ fhss_uc_switch ();
276+ }
277+ #endif /*FHSS_CHANNEL_DEBUG_CBS*/
258278}
259279
260280static int fhss_ws_tx_handle_callback (const fhss_api_t * api , bool is_broadcast_addr , uint8_t * destination_address , int frame_type , uint16_t frame_length , uint8_t phy_header_length , uint8_t phy_tail_length , uint32_t tx_time )
@@ -575,7 +595,7 @@ int fhss_ws_set_callbacks(fhss_structure_t *fhss_structure)
575595 fhss_structure -> fhss_api -> data_tx_done = & fhss_ws_data_tx_done_callback ;
576596 fhss_structure -> fhss_api -> data_tx_fail = & fhss_ws_data_tx_fail_callback ;
577597 fhss_structure -> fhss_api -> synch_state_set = & fhss_ws_synch_state_set_callback ;
578- fhss_structure -> fhss_api -> read_timestamp = & fhss_read_timestamp_cb ;
598+ fhss_structure -> fhss_api -> read_timestamp = NULL ;
579599 fhss_structure -> fhss_api -> get_retry_period = NULL ;
580600 fhss_structure -> fhss_api -> write_synch_info = & fhss_ws_write_synch_info_callback ;
581601 fhss_structure -> fhss_api -> init_callbacks = & fhss_init_callbacks_cb ;
@@ -595,7 +615,7 @@ int fhss_ws_set_parent(fhss_structure_t *fhss_structure, const uint8_t eui64[8],
595615 return -1 ;
596616 }
597617
598- uint32_t time_from_reception_ms = (fhss_structure -> fhss_api -> read_timestamp (fhss_structure -> fhss_api ) - bc_timing_info -> bt_rx_timestamp )/1000 ;
618+ uint32_t time_from_reception_ms = (fhss_structure -> callbacks . read_timestamp (fhss_structure -> fhss_api ) - bc_timing_info -> bt_rx_timestamp )/1000 ;
599619 uint32_t true_bc_interval_offset = (bc_timing_info -> broadcast_interval_offset + time_from_reception_ms ) % bc_timing_info -> broadcast_interval ;
600620 uint32_t timeout = ((bc_timing_info -> broadcast_interval - true_bc_interval_offset )* 1000 );
601621 fhss_start_timer (fhss_structure , timeout , fhss_broadcast_handler );
0 commit comments