@@ -50,22 +50,66 @@ fhss_structure_t *fhss_ws_enable(fhss_api_t *fhss_api, const fhss_ws_configurati
50
50
}
51
51
fhss_struct -> fhss_conf .fhss_ws_configuration = * fhss_configuration ;
52
52
fhss_struct -> number_of_channels = channel_count ;
53
-
54
53
return fhss_struct ;
55
54
}
56
55
56
+ static void fhss_ws_update_bc_channel (fhss_structure_t * fhss_structure )
57
+ {
58
+ uint8_t mac_address [8 ];
59
+ int32_t next_channel ;
60
+ fhss_structure -> callbacks .read_mac_address (fhss_structure -> fhss_api , mac_address );
61
+ if (fhss_structure -> ws -> channel_function == WS_FIXED_CHANNEL ) {
62
+
63
+ } else if (fhss_structure -> ws -> channel_function == WS_TR51CF ) {
64
+ // TODO: Second parameter is BSI which needs to be implemented in FHSS configurations
65
+ next_channel = tr51_get_bc_channel_index (fhss_structure -> ws -> bc_slot , 0xffff , fhss_structure -> number_of_channels );
66
+ if (++ fhss_structure -> ws -> bc_slot == fhss_structure -> number_of_channels ) {
67
+ fhss_structure -> ws -> bc_slot = 0 ;
68
+ }
69
+ } else if (fhss_structure -> ws -> channel_function == WS_DH1CF ) {
70
+ // TODO: Second parameter is BSI which needs to be implemented in FHSS configurations
71
+ next_channel = dh1cf_get_bc_channel_index (fhss_structure -> ws -> bc_slot , 0xffff , fhss_structure -> number_of_channels );
72
+ fhss_structure -> ws -> bc_slot ++ ;
73
+ } else if (fhss_structure -> ws -> channel_function == WS_VENDOR_DEF_CF ) {
74
+ //TODO: Callback to get channel schedule from application
75
+ }
76
+ #ifdef FHSS_CHANNEL_DEBUG
77
+ tr_info ("%" PRIu32 " BC %u %u" , fhss_structure -> platform_functions .fhss_get_timestamp (fhss_structure -> fhss_api ), next_channel , fhss_structure -> ws -> bc_slot );
78
+ #endif /*FHSS_CHANNEL_DEBUG*/
79
+ fhss_structure -> callbacks .change_channel (fhss_structure -> fhss_api , next_channel );
80
+ }
81
+
82
+ static void fhss_broadcast_handler (const fhss_api_t * fhss_api , uint16_t delay )
83
+ {
84
+ (void ) delay ;
85
+ fhss_structure_t * fhss_structure = fhss_get_object_with_api (fhss_api );
86
+ if (!fhss_structure ) {
87
+ return ;
88
+ }
89
+ if (fhss_structure -> ws -> is_on_bc_channel == false) {
90
+ fhss_start_timer (fhss_structure , fhss_structure -> fhss_conf .fhss_ws_configuration .fhss_bc_dwell_interval * 1000 , fhss_broadcast_handler );
91
+ fhss_structure -> ws -> is_on_bc_channel = true;
92
+ fhss_ws_update_bc_channel (fhss_structure );
93
+ } else {
94
+ uint32_t timeout = (fhss_structure -> fhss_conf .fhss_ws_configuration .fhss_broadcast_interval - fhss_structure -> fhss_conf .fhss_ws_configuration .fhss_bc_dwell_interval ) * 1000 ;
95
+ fhss_start_timer (fhss_structure , timeout , fhss_broadcast_handler );
96
+ fhss_structure -> ws -> is_on_bc_channel = false;
97
+ }
98
+ }
99
+
57
100
static uint32_t fhss_ws_get_sf_timeout_callback (fhss_structure_t * fhss_structure )
58
101
{
59
102
return fhss_structure -> fhss_conf .fhss_ws_configuration .fhss_uc_dwell_interval * 1000 ;
60
103
}
61
104
62
105
static int fhss_ws_handle_state_set (fhss_structure_t * fhss_structure , fhss_states fhss_state , uint16_t pan_id )
63
106
{
64
- (void ) fhss_state ;
65
107
(void ) pan_id ;
66
- //TODO: Remove hard coded channel function
67
- fhss_structure -> ws -> channel_function = WS_TR51CF ;
68
- fhss_start_timer (fhss_structure , fhss_structure -> fhss_conf .fhss_ws_configuration .fhss_uc_dwell_interval * 1000 , fhss_superframe_handler );
108
+ if (fhss_state == FHSS_SYNCHRONIZED ) {
109
+ fhss_start_timer (fhss_structure , fhss_structure -> fhss_conf .fhss_ws_configuration .fhss_uc_dwell_interval * 1000 , fhss_superframe_handler );
110
+ }
111
+
112
+ fhss_structure -> fhss_state = fhss_state ;
69
113
return 0 ;
70
114
}
71
115
@@ -74,26 +118,26 @@ static void fhss_ws_superframe_callback(fhss_structure_t *fhss_structure)
74
118
(void ) fhss_structure ;
75
119
}
76
120
77
- static void fhss_ws_update_channel_callback (fhss_structure_t * fhss_structure )
121
+ static void fhss_ws_update_uc_channel_callback (fhss_structure_t * fhss_structure )
78
122
{
79
123
uint8_t mac_address [8 ];
80
124
int32_t next_channel ;
81
125
fhss_structure -> callbacks .read_mac_address (fhss_structure -> fhss_api , mac_address );
82
126
if (fhss_structure -> ws -> channel_function == WS_FIXED_CHANNEL ) {
83
127
84
128
} else if (fhss_structure -> ws -> channel_function == WS_TR51CF ) {
85
- next_channel = fhss_structure -> rx_channel = tr51_get_uc_channel_index (fhss_structure -> ws -> slot , mac_address , fhss_structure -> number_of_channels );
86
- if (++ fhss_structure -> ws -> slot == fhss_structure -> number_of_channels ) {
87
- fhss_structure -> ws -> slot = 0 ;
129
+ next_channel = fhss_structure -> rx_channel = tr51_get_uc_channel_index (fhss_structure -> ws -> uc_slot , mac_address , fhss_structure -> number_of_channels );
130
+ if (++ fhss_structure -> ws -> uc_slot == fhss_structure -> number_of_channels ) {
131
+ fhss_structure -> ws -> uc_slot = 0 ;
88
132
}
89
133
} else if (fhss_structure -> ws -> channel_function == WS_DH1CF ) {
90
- next_channel = fhss_structure -> rx_channel = dh1cf_get_uc_channel_index (fhss_structure -> ws -> slot , mac_address , fhss_structure -> number_of_channels );
91
- fhss_structure -> ws -> slot ++ ;
134
+ next_channel = fhss_structure -> rx_channel = dh1cf_get_uc_channel_index (fhss_structure -> ws -> uc_slot , mac_address , fhss_structure -> number_of_channels );
135
+ fhss_structure -> ws -> uc_slot ++ ;
92
136
} else if (fhss_structure -> ws -> channel_function == WS_VENDOR_DEF_CF ) {
93
137
//TODO: Callback to get channel schedule from application
94
138
}
95
139
#ifdef FHSS_CHANNEL_DEBUG
96
- tr_info ("%" PRIu32 " UC %u %u" , fhss_structure -> platform_functions .fhss_get_timestamp (fhss_structure -> fhss_api ), next_channel , fhss_structure -> ws -> slot );
140
+ tr_info ("%" PRIu32 " UC %u %u" , fhss_structure -> platform_functions .fhss_get_timestamp (fhss_structure -> fhss_api ), next_channel , fhss_structure -> ws -> uc_slot );
97
141
#endif /*FHSS_CHANNEL_DEBUG*/
98
142
fhss_structure -> callbacks .change_channel (fhss_structure -> fhss_api , next_channel );
99
143
}
@@ -112,7 +156,7 @@ static int fhss_ws_tx_handle_callback(const fhss_api_t *api, bool is_broadcast_a
112
156
if (fhss_structure -> fhss_state == FHSS_SYNCHRONIZED ) {
113
157
int32_t tx_channel ;
114
158
//TODO: Compute destination slot using neighbour table
115
- uint16_t destination_slot = fhss_structure -> ws -> slot ;
159
+ uint16_t destination_slot = fhss_structure -> ws -> uc_slot ;
116
160
if (fhss_structure -> ws -> channel_function == WS_TR51CF ) {
117
161
tx_channel = tr51_get_uc_channel_index (destination_slot , destination_address , fhss_structure -> number_of_channels );
118
162
} else if (fhss_structure -> ws -> channel_function == WS_DH1CF ) {
@@ -156,7 +200,7 @@ int fhss_ws_set_callbacks(fhss_structure_t *fhss_structure)
156
200
fhss_structure -> fhss_api -> write_synch_info = & fhss_write_synch_info_cb ;
157
201
fhss_structure -> fhss_api -> init_callbacks = & fhss_init_callbacks_cb ;
158
202
// Set internal API
159
- fhss_structure -> update_channel = fhss_ws_update_channel_callback ;
203
+ fhss_structure -> update_channel = fhss_ws_update_uc_channel_callback ;
160
204
fhss_structure -> update_superframe = fhss_ws_superframe_callback ;
161
205
fhss_structure -> read_superframe_timeout = fhss_ws_get_sf_timeout_callback ;
162
206
fhss_structure -> handle_state_set = fhss_ws_handle_state_set ;
@@ -165,5 +209,6 @@ int fhss_ws_set_callbacks(fhss_structure_t *fhss_structure)
165
209
return -1 ;
166
210
}
167
211
memset (fhss_structure -> ws , 0 , sizeof (fhss_ws_t ));
212
+ fhss_structure -> ws -> channel_function = fhss_structure -> fhss_conf .fhss_ws_configuration .ws_channel_function ;
168
213
return 0 ;
169
214
}
0 commit comments