@@ -66,7 +66,7 @@ fhss_structure_t *fhss_ws_enable(fhss_api_t *fhss_api, const fhss_ws_configurati
66
66
}
67
67
fhss_struct -> ws = ns_dyn_mem_alloc (sizeof (fhss_ws_t ));
68
68
if (!fhss_struct -> ws ) {
69
- ns_dyn_mem_free ( fhss_struct );
69
+ fhss_free_instance ( fhss_api );
70
70
return NULL ;
71
71
}
72
72
memset (fhss_struct -> ws , 0 , sizeof (fhss_ws_t ));
@@ -76,7 +76,7 @@ fhss_structure_t *fhss_ws_enable(fhss_api_t *fhss_api, const fhss_ws_configurati
76
76
return fhss_struct ;
77
77
}
78
78
79
- static void fhss_ws_update_bc_channel (fhss_structure_t * fhss_structure )
79
+ static int32_t fhss_ws_calc_bc_channel (fhss_structure_t * fhss_structure )
80
80
{
81
81
int32_t next_channel ;
82
82
@@ -98,30 +98,32 @@ static void fhss_ws_update_bc_channel(fhss_structure_t *fhss_structure)
98
98
#ifdef FHSS_CHANNEL_DEBUG
99
99
tr_info ("%" PRIu32 " BC %u %u" , fhss_structure -> platform_functions .fhss_get_timestamp (fhss_structure -> fhss_api ), next_channel , fhss_structure -> ws -> bc_slot );
100
100
#endif /*FHSS_CHANNEL_DEBUG*/
101
- fhss_structure -> callbacks . change_channel ( fhss_structure -> fhss_api , next_channel ) ;
101
+ return next_channel ;
102
102
}
103
103
104
104
static void fhss_broadcast_handler (const fhss_api_t * fhss_api , uint16_t delay )
105
105
{
106
106
(void ) delay ;
107
+ int32_t next_channel ;
107
108
fhss_structure_t * fhss_structure = fhss_get_object_with_api (fhss_api );
108
109
if (!fhss_structure ) {
109
110
return ;
110
111
}
111
112
if (fhss_structure -> ws -> is_on_bc_channel == false) {
112
113
fhss_start_timer (fhss_structure , fhss_structure -> ws -> fhss_configuration .fhss_bc_dwell_interval * 1000 , fhss_broadcast_handler );
113
114
fhss_structure -> ws -> is_on_bc_channel = true;
114
- fhss_ws_update_bc_channel (fhss_structure );
115
+ next_channel = fhss_ws_calc_bc_channel (fhss_structure );
115
116
} else {
116
117
uint32_t timeout = (fhss_structure -> ws -> fhss_configuration .fhss_broadcast_interval - fhss_structure -> ws -> fhss_configuration .fhss_bc_dwell_interval ) * 1000 ;
117
118
fhss_start_timer (fhss_structure , timeout , fhss_broadcast_handler );
118
119
fhss_structure -> ws -> is_on_bc_channel = false;
119
120
// Should return to own (unicast) listening channel after broadcast channel
120
- fhss_structure -> callbacks . change_channel ( fhss_structure -> fhss_api , fhss_structure -> rx_channel ) ;
121
+ next_channel = fhss_structure -> rx_channel ;
121
122
#ifdef FHSS_CHANNEL_DEBUG
122
123
tr_info ("%" PRIu32 " UC %u" , fhss_structure -> platform_functions .fhss_get_timestamp (fhss_structure -> fhss_api ), fhss_structure -> rx_channel );
123
124
#endif /*FHSS_CHANNEL_DEBUG*/
124
125
}
126
+ fhss_structure -> callbacks .change_channel (fhss_structure -> fhss_api , next_channel );
125
127
}
126
128
127
129
static int own_floor (float value )
@@ -172,7 +174,7 @@ static uint32_t fhss_ws_get_sf_timeout_callback(fhss_structure_t *fhss_structure
172
174
return fhss_structure -> ws -> fhss_configuration .fhss_uc_dwell_interval * 1000 ;
173
175
}
174
176
175
- static void fhss_ws_handle_state_set (const fhss_api_t * api , fhss_states fhss_state , uint16_t pan_id )
177
+ static void fhss_ws_synch_state_set_callback (const fhss_api_t * api , fhss_states fhss_state , uint16_t pan_id )
176
178
{
177
179
(void ) pan_id ;
178
180
fhss_structure_t * fhss_structure = fhss_get_object_with_api (api );
@@ -201,7 +203,7 @@ static void fhss_ws_update_uc_channel_callback(fhss_structure_t *fhss_structure)
201
203
int32_t next_channel ;
202
204
fhss_structure -> callbacks .read_mac_address (fhss_structure -> fhss_api , mac_address );
203
205
if (fhss_structure -> ws -> fhss_configuration .ws_channel_function == WS_FIXED_CHANNEL ) {
204
-
206
+ return ;
205
207
} else if (fhss_structure -> ws -> fhss_configuration .ws_channel_function == WS_TR51CF ) {
206
208
next_channel = fhss_structure -> rx_channel = tr51_get_uc_channel_index (fhss_structure -> ws -> uc_slot , mac_address , fhss_structure -> number_of_channels );
207
209
if (++ fhss_structure -> ws -> uc_slot == fhss_structure -> number_of_channels ) {
@@ -250,7 +252,11 @@ static int fhss_ws_tx_handle_callback(const fhss_api_t *api, bool is_broadcast_a
250
252
} else if (fhss_structure -> ws -> fhss_configuration .ws_channel_function == WS_VENDOR_DEF_CF ) {
251
253
if (fhss_structure -> ws -> fhss_configuration .vendor_defined_cf ) {
252
254
tx_channel = fhss_structure -> ws -> fhss_configuration .vendor_defined_cf (fhss_structure -> fhss_api , fhss_structure -> ws -> bc_slot , destination_address , fhss_structure -> ws -> fhss_configuration .bsi , fhss_structure -> number_of_channels );
255
+ } else {
256
+ return -1 ;
253
257
}
258
+ } else {
259
+ return -1 ;
254
260
}
255
261
#ifdef FHSS_CHANNEL_DEBUG
256
262
tr_debug ("TX channel: %u %u" , tx_channel , destination_slot + 1 );
@@ -371,7 +377,7 @@ int fhss_ws_set_callbacks(fhss_structure_t *fhss_structure)
371
377
fhss_structure -> fhss_api -> receive_frame = & fhss_ws_receive_frame_callback ;
372
378
fhss_structure -> fhss_api -> data_tx_done = & fhss_ws_data_tx_done_callback ;
373
379
fhss_structure -> fhss_api -> data_tx_fail = & fhss_ws_data_tx_fail_callback ;
374
- fhss_structure -> fhss_api -> synch_state_set = & fhss_ws_handle_state_set ;
380
+ fhss_structure -> fhss_api -> synch_state_set = & fhss_ws_synch_state_set_callback ;
375
381
fhss_structure -> fhss_api -> read_timestamp = & fhss_read_timestamp_cb ;
376
382
fhss_structure -> fhss_api -> get_retry_period = NULL ;
377
383
fhss_structure -> fhss_api -> write_synch_info = & fhss_ws_write_synch_info_callback ;
0 commit comments