34
34
35
35
// Enable this flag to use channel traces
36
36
// #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*/
37
44
38
45
#define DEF_2E24 0x1000000
39
46
#define IE_HEADER_LENGTH_MASK 0x007f
@@ -108,7 +115,6 @@ static int32_t fhss_ws_calc_bc_channel(fhss_structure_t *fhss_structure)
108
115
109
116
static void fhss_broadcast_handler (const fhss_api_t * fhss_api , uint16_t delay )
110
117
{
111
- (void ) delay ;
112
118
int32_t next_channel ;
113
119
fhss_structure_t * fhss_structure = fhss_get_object_with_api (fhss_api );
114
120
if (!fhss_structure ) {
@@ -121,12 +127,12 @@ static void fhss_broadcast_handler(const fhss_api_t *fhss_api, uint16_t delay)
121
127
return ;
122
128
}
123
129
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 );
125
131
fhss_structure -> ws -> is_on_bc_channel = true;
126
132
next_channel = fhss_structure -> ws -> bc_channel = fhss_ws_calc_bc_channel (fhss_structure );
127
133
} else {
128
134
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 );
130
136
fhss_structure -> ws -> is_on_bc_channel = false;
131
137
// Should return to own (unicast) listening channel after broadcast channel
132
138
next_channel = fhss_structure -> rx_channel ;
@@ -135,6 +141,11 @@ static void fhss_broadcast_handler(const fhss_api_t *fhss_api, uint16_t delay)
135
141
#endif /*FHSS_CHANNEL_DEBUG*/
136
142
}
137
143
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*/
138
149
fhss_ws_start_tx_poll_timer (fhss_structure , fhss_structure -> callbacks .read_tx_queue_size (fhss_structure -> fhss_api , true),
139
150
fhss_structure -> ws -> fhss_configuration .fhss_bc_dwell_interval );
140
151
}
@@ -162,7 +173,11 @@ static uint32_t fhss_ws_calculate_ufsi(fhss_structure_t *fhss_structure, uint32_
162
173
}
163
174
cur_slot -- ;
164
175
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
+ }
166
181
uint64_t ms_since_seq_start = (cur_slot * dwell_time ) + (dwell_time - remaining_time ) + time_to_tx ;
167
182
uint32_t seq_length = 0x10000 ;
168
183
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
181
196
if (fhss_structure -> ws -> is_on_bc_channel == true) {
182
197
remaining_time += (broadcast_interval - dwell_time );
183
198
}
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 ;
185
200
return (broadcast_interval - remaining_time ) + time_to_tx ;
186
201
}
187
202
@@ -194,7 +209,7 @@ static uint16_t fhss_ws_calculate_destination_slot(fhss_ws_neighbor_timing_info_
194
209
if (neighbor_timing_info -> uc_timing_info .unicast_channel_function == WS_TR51CF ) {
195
210
seq_length = neighbor_timing_info -> uc_timing_info .unicast_number_of_channels ;
196
211
}
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 );
198
213
return (own_floor (((float )((tx_time - ufsi_timestamp )/1000 + dest_ms_since_seq_start ) / dwell_time )) % seq_length );
199
214
}
200
215
@@ -230,7 +245,7 @@ static void fhss_ws_synch_state_set_callback(const fhss_api_t *api, fhss_states
230
245
static void fhss_ws_update_uc_channel_callback (fhss_structure_t * fhss_structure )
231
246
{
232
247
uint8_t mac_address [8 ];
233
- int32_t next_channel ;
248
+ int32_t next_channel = fhss_structure -> rx_channel ;
234
249
fhss_structure -> callbacks .read_mac_address (fhss_structure -> fhss_api , mac_address );
235
250
if (fhss_structure -> ws -> fhss_configuration .ws_channel_function == WS_FIXED_CHANNEL ) {
236
251
return ;
@@ -255,6 +270,11 @@ static void fhss_ws_update_uc_channel_callback(fhss_structure_t *fhss_structure)
255
270
tr_info ("%" PRIu32 " UC %u %u" , fhss_structure -> platform_functions .fhss_get_timestamp (fhss_structure -> fhss_api ), next_channel , fhss_structure -> ws -> uc_slot );
256
271
#endif /*FHSS_CHANNEL_DEBUG*/
257
272
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*/
258
278
}
259
279
260
280
static 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)
575
595
fhss_structure -> fhss_api -> data_tx_done = & fhss_ws_data_tx_done_callback ;
576
596
fhss_structure -> fhss_api -> data_tx_fail = & fhss_ws_data_tx_fail_callback ;
577
597
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 ;
579
599
fhss_structure -> fhss_api -> get_retry_period = NULL ;
580
600
fhss_structure -> fhss_api -> write_synch_info = & fhss_ws_write_synch_info_callback ;
581
601
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],
595
615
return -1 ;
596
616
}
597
617
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 ;
599
619
uint32_t true_bc_interval_offset = (bc_timing_info -> broadcast_interval_offset + time_from_reception_ms ) % bc_timing_info -> broadcast_interval ;
600
620
uint32_t timeout = ((bc_timing_info -> broadcast_interval - true_bc_interval_offset )* 1000 );
601
621
fhss_start_timer (fhss_structure , timeout , fhss_broadcast_handler );
0 commit comments