Skip to content

Commit 1ca1d0b

Browse files
author
Jarkko Paso
committed
FHSS: Continued fhss_structure cleaning
1 parent 93b7e32 commit 1ca1d0b

File tree

15 files changed

+417
-385
lines changed

15 files changed

+417
-385
lines changed

source/Service_Libs/fhss/fhss.c

Lines changed: 155 additions & 130 deletions
Large diffs are not rendered by default.

source/Service_Libs/fhss/fhss.h

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,31 @@ struct fhss_failed_tx
5757
uint8_t retries_done;
5858
ns_list_link_t link;
5959
};
60+
typedef NS_LIST_HEAD(fhss_failed_tx_t, link) fhss_failed_tx_list_t;
61+
6062

6163
struct fhss_bs
6264
{
6365
uint8_t uc_channel_index;
66+
uint8_t current_superframe;
67+
uint8_t current_channel_index;
68+
uint8_t own_hop;
69+
uint8_t beacons_received_timer;
70+
uint8_t broadcast_start_superframe;
71+
uint8_t synch_infos_sent_counter;
72+
bool tx_allowed;
73+
bool send_synch_info_on_next_broadcast_channel;
74+
bool beacon_received_on_this_bc_channel;
6475
uint16_t channel_list_counter;
65-
fhss_configuration_t fhss_configuration;
76+
uint16_t synch_panid;
77+
uint32_t synch_interval;
78+
struct fhss_statistics *fhss_stats_ptr;
79+
struct fhss_beacon_info *fhss_beacon_info_store;
80+
struct fhss_configuration fhss_configuration;
81+
struct fhss_synch_configuration synch_configuration;
82+
struct fhss_synch_monitor synch_monitor;
83+
fhss_failed_tx_list_t fhss_failed_tx_list;
84+
uint8_t fhss_scramble_table[MAX_SCRAMBLE_TABLE_INDEXES];
6685
};
6786

6887
fhss_structure_t *fhss_enable(fhss_api_t *fhss_api, const fhss_configuration_t *fhss_configuration, const fhss_timer_t *fhss_timer, fhss_statistics_t *fhss_statistics);
@@ -76,6 +95,7 @@ uint32_t fhss_get_tx_time(fhss_structure_t *fhss_structure, uint16_t bytes_to_se
7695
* @return microseconds left to start of next superframe
7796
*/
7897
uint32_t fhss_get_remaining_time_to_next_superframe(const fhss_structure_t *fhss_struct);
98+
int8_t fhss_set_synch_configuration(fhss_structure_t *fhss_structure, const fhss_synch_configuration_t *fhss_synch_configuration);
7999
int fhss_set_callbacks(fhss_structure_t *fhss_structure);
80100

81101
#endif /* FHSS_H_ */

source/Service_Libs/fhss/fhss_beacon.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,20 +39,20 @@ int fhss_beacon_update_payload(fhss_structure_t *fhss_structure,
3939
return -1;
4040
}
4141

42-
const fhss_synch_configuration_t *config = &fhss_structure->synch_configuration;
42+
const fhss_synch_configuration_t *config = &fhss_structure->bs->synch_configuration;
4343

44-
payload->channel_index = fhss_structure->current_channel_index;
44+
payload->channel_index = fhss_structure->bs->current_channel_index;
4545

4646
payload->sender_unicast_channel = 0;
4747

48-
payload->current_superframe = fhss_structure->current_superframe;
48+
payload->current_superframe = fhss_structure->bs->current_superframe;
4949

5050
// This assumes that the time is always in the range of 0..2**16, which
5151
// should be the case as the superframe length field is also in that range.
5252
payload->remaining_slots = (uint16_t) fhss_get_remaining_time_to_next_superframe(fhss_structure);
5353
payload->channel_list_counter = fhss_structure->bs->channel_list_counter;
5454

55-
payload->hop_count = fhss_structure->own_hop;
55+
payload->hop_count = fhss_structure->bs->own_hop;
5656
payload->number_of_broadcast_channels = config->fhss_number_of_bc_channels;
5757
payload->number_of_tx_slots = config->fhss_number_of_tx_slots;
5858
payload->time_since_last_beacon = 0; // XXX not available yet

source/Service_Libs/fhss/fhss_beacon_tasklet.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,21 +74,21 @@ static void fhss_beacon_tasklet_func(arm_event_s* event)
7474
// skip the init event as there will be a timer event after
7575
if (event->event_type == FHSS_TIMER_EVENT) {
7676
// Stop network when lost number of FHSS_SYNCHRONIZATION_LOST synchronization beacons from parent in a row.
77-
if (fhss_structure->beacons_received_timer >= FHSS_SYNCHRONIZATION_LOST) {
77+
if (fhss_structure->bs->beacons_received_timer >= FHSS_SYNCHRONIZATION_LOST) {
7878
fhss_structure->callbacks.synch_lost_notification(fhss_structure->fhss_api);
7979
fhss_stats_update(fhss_structure, STATS_FHSS_SYNCH_LOST, 1);
8080
tr_err("FHSS synchronization lost");
8181
} else {
82-
uint16_t bc_density = (fhss_structure->number_of_channels / fhss_structure->synch_configuration.fhss_number_of_bc_channels);
83-
uint16_t channel_dwell_time = ((uint32_t)fhss_structure->synch_configuration.fhss_superframe_length * fhss_structure->synch_configuration.fhss_number_of_superframes) / 1000;
82+
uint16_t bc_density = (fhss_structure->number_of_channels / fhss_structure->bs->synch_configuration.fhss_number_of_bc_channels);
83+
uint16_t channel_dwell_time = ((uint32_t)fhss_structure->bs->synch_configuration.fhss_superframe_length * fhss_structure->bs->synch_configuration.fhss_number_of_superframes) / 1000;
8484

8585
fhss_beacon_periodic_start(fhss_structure, (bc_density * channel_dwell_time) * 2);
8686
// Send synchronization request
8787
fhss_structure->callbacks.send_fhss_frame(fhss_structure->fhss_api, FHSS_SYNCH_REQUEST_FRAME);
88-
fhss_structure->beacons_received_timer++;
88+
fhss_structure->bs->beacons_received_timer++;
8989
#ifdef FEA_TRACE_SUPPORT
9090
if (!fhss_get_parent_address(fhss_structure, parent_address)) {
91-
tr_debug("Update synch, attempt: %u, %s", fhss_structure->beacons_received_timer, trace_array(parent_address, 8));
91+
tr_debug("Update synch, attempt: %u, %s", fhss_structure->bs->beacons_received_timer, trace_array(parent_address, 8));
9292
} else {
9393
tr_err("No synch parent found");
9494
}
@@ -99,9 +99,9 @@ static void fhss_beacon_tasklet_func(arm_event_s* event)
9999
else if(event->event_type == FHSS_COMPARE_SYNCH_PARENT)
100100
{
101101
if (fhss_compare_with_synch_parent_address(fhss_structure, fhss_structure->synch_parent)) {
102-
fhss_structure->synch_monitor.avg_synch_fix = 0;
103-
if(fhss_structure->synch_monitor.avg_synch_fix_counter > 0) {
104-
fhss_structure->synch_monitor.avg_synch_fix_counter = 0;
102+
fhss_structure->bs->synch_monitor.avg_synch_fix = 0;
103+
if(fhss_structure->bs->synch_monitor.avg_synch_fix_counter > 0) {
104+
fhss_structure->bs->synch_monitor.avg_synch_fix_counter = 0;
105105
}
106106
// Send synchronization request
107107
fhss_structure->callbacks.send_fhss_frame(fhss_structure->fhss_api, FHSS_SYNCH_REQUEST_FRAME);
@@ -116,8 +116,8 @@ static void fhss_beacon_tasklet_func(arm_event_s* event)
116116
}
117117
else if(event->event_type == FHSS_BROADCAST_CHANNEL)
118118
{
119-
uint16_t superframe_length = fhss_structure->synch_configuration.fhss_superframe_length;
120-
uint8_t number_of_superframes = fhss_structure->synch_configuration.fhss_number_of_superframes;
119+
uint16_t superframe_length = fhss_structure->bs->synch_configuration.fhss_superframe_length;
120+
uint8_t number_of_superframes = fhss_structure->bs->synch_configuration.fhss_number_of_superframes;
121121
// Given broadcast time is channel length minus 1 superframe
122122
fhss_structure->callbacks.broadcast_notify(fhss_structure->fhss_api, (uint32_t)superframe_length * (number_of_superframes - 1));
123123
}

source/Service_Libs/fhss/fhss_channel.c

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,10 @@ uint8_t fhss_add_channel_list_counter(uint8_t index, uint16_t number_of_channels
9191
static void fhss_generate_broadcast_start_superframe(fhss_structure_t *fhss_structure)
9292
{
9393
// If the number of superframes is low, allow broadcast on any superframe
94-
if (fhss_structure->synch_configuration.fhss_number_of_superframes < 8) {
95-
fhss_structure->broadcast_start_superframe = 0;
94+
if (fhss_structure->bs->synch_configuration.fhss_number_of_superframes < 8) {
95+
fhss_structure->bs->broadcast_start_superframe = 0;
9696
} else {
97-
fhss_structure->broadcast_start_superframe = randLIB_get_random_in_range(0, NUMBER_OF_BC_START_SUPERFRAMES - 1);
97+
fhss_structure->bs->broadcast_start_superframe = randLIB_get_random_in_range(0, NUMBER_OF_BC_START_SUPERFRAMES - 1);
9898
}
9999
}
100100

@@ -113,7 +113,7 @@ bool fhss_change_to_next_channel(fhss_structure_t *fhss_structure)
113113
bool broadcast_channel = false;
114114

115115
uint16_t number_of_channels = fhss_structure->number_of_channels;
116-
uint8_t number_of_broadcast_channels = fhss_structure->synch_configuration.fhss_number_of_bc_channels;
116+
uint8_t number_of_broadcast_channels = fhss_structure->bs->synch_configuration.fhss_number_of_bc_channels;
117117
uint8_t unicast_channel_index = fhss_structure->bs->uc_channel_index;
118118
uint8_t channel_index_tmp;
119119

@@ -124,18 +124,18 @@ bool fhss_change_to_next_channel(fhss_structure_t *fhss_structure)
124124
*/
125125
/* Get broadcast channel */
126126
if (fhss_is_current_channel_broadcast(fhss_structure) == true) {
127-
channel_index_tmp = fhss_calc_channel_shuffle((number_of_channels - number_of_broadcast_channels) + fhss_get_bc_index(fhss_structure), fhss_structure->number_of_channels, fhss_structure->synch_configuration.fhss_number_of_bc_channels);
127+
channel_index_tmp = fhss_calc_channel_shuffle((number_of_channels - number_of_broadcast_channels) + fhss_get_bc_index(fhss_structure), fhss_structure->number_of_channels, fhss_structure->bs->synch_configuration.fhss_number_of_bc_channels);
128128
fhss_generate_broadcast_start_superframe(fhss_structure);
129129
broadcast_channel = true;
130130
} else { /* Get unicast channel */
131-
channel_index_tmp = fhss_calc_channel_shuffle(unicast_channel_index, fhss_structure->number_of_channels, fhss_structure->synch_configuration.fhss_number_of_bc_channels);
131+
channel_index_tmp = fhss_calc_channel_shuffle(unicast_channel_index, fhss_structure->number_of_channels, fhss_structure->bs->synch_configuration.fhss_number_of_bc_channels);
132132
if (++fhss_structure->bs->uc_channel_index >= number_of_channels - number_of_broadcast_channels) {
133133
fhss_structure->bs->uc_channel_index = 0;
134134
}
135135
}
136136
// Reset Beacon received flag when channel has changed
137-
fhss_structure->beacon_received_on_this_bc_channel = false;
138-
channel_index_tmp = fhss_add_channel_list_counter(channel_index_tmp, fhss_structure->number_of_channels, fhss_structure->bs->channel_list_counter, fhss_structure->fhss_scramble_table);
137+
fhss_structure->bs->beacon_received_on_this_bc_channel = false;
138+
channel_index_tmp = fhss_add_channel_list_counter(channel_index_tmp, fhss_structure->number_of_channels, fhss_structure->bs->channel_list_counter, fhss_structure->bs->fhss_scramble_table);
139139
next_channel = channel_list_get_channel(fhss_structure->bs->fhss_configuration.channel_mask, channel_index_tmp);
140140

141141
fhss_structure->rx_channel = next_channel;
@@ -153,8 +153,8 @@ bool fhss_change_to_next_channel(fhss_structure_t *fhss_structure)
153153
static uint8_t fhss_get_bc_index(const fhss_structure_t *fhss_structure)
154154
{
155155
uint16_t number_of_channels = fhss_structure->number_of_channels;
156-
uint8_t number_of_bc_channels = fhss_structure->synch_configuration.fhss_number_of_bc_channels;
157-
uint8_t cur_channel_index = fhss_structure->current_channel_index;
156+
uint8_t number_of_bc_channels = fhss_structure->bs->synch_configuration.fhss_number_of_bc_channels;
157+
uint8_t cur_channel_index = fhss_structure->bs->current_channel_index;
158158

159159
return cur_channel_index / (number_of_channels/number_of_bc_channels);
160160
}
@@ -164,7 +164,7 @@ uint8_t fhss_get_offset(fhss_structure_t *fhss_structure, const uint8_t *ptr)
164164
uint8_t i;
165165
uint8_t index = *ptr++;
166166

167-
if (fhss_structure->number_of_channels == fhss_structure->synch_configuration.fhss_number_of_bc_channels) {
167+
if (fhss_structure->number_of_channels == fhss_structure->bs->synch_configuration.fhss_number_of_bc_channels) {
168168
// If all channels are defined as broadcast channels then return 0 to avoid division by 0.
169169
// This could happen e.g. in OTA case when fast download is needed.
170170
return 0;
@@ -176,7 +176,7 @@ uint8_t fhss_get_offset(fhss_structure_t *fhss_structure, const uint8_t *ptr)
176176
index ^= *ptr++;
177177
}
178178
// Offset must be < number of unicast channels
179-
index %= (fhss_structure->number_of_channels - fhss_structure->synch_configuration.fhss_number_of_bc_channels);
179+
index %= (fhss_structure->number_of_channels - fhss_structure->bs->synch_configuration.fhss_number_of_bc_channels);
180180

181181
return index;
182182
}
@@ -189,13 +189,13 @@ bool fhss_is_current_channel_broadcast(fhss_structure_t *fhss_structure)
189189
}
190190

191191
// Should always have broadcast channels with FHSS
192-
if (!fhss_structure->synch_configuration.fhss_number_of_bc_channels) {
192+
if (!fhss_structure->bs->synch_configuration.fhss_number_of_bc_channels) {
193193
return true;
194194
}
195195

196-
uint8_t channel_index = fhss_structure->current_channel_index;
196+
uint8_t channel_index = fhss_structure->bs->current_channel_index;
197197
uint16_t number_of_channels = fhss_structure->number_of_channels;
198-
uint8_t number_of_broadcast_channels = fhss_structure->synch_configuration.fhss_number_of_bc_channels;
198+
uint8_t number_of_broadcast_channels = fhss_structure->bs->synch_configuration.fhss_number_of_bc_channels;
199199

200200
if (!(channel_index % (number_of_channels / number_of_broadcast_channels))) {
201201
return true;
@@ -211,14 +211,14 @@ static uint8_t fhss_get_destination_channel(fhss_structure_t *fhss_structure, ui
211211
if (fhss_structure) {
212212
if (fhss_is_current_channel_broadcast(fhss_structure) == false) {
213213
destination_offset = fhss_get_offset(fhss_structure, destination_address);
214-
uc_index = fhss_calculate_uc_index(fhss_structure->current_channel_index, fhss_structure->number_of_channels,
215-
fhss_structure->synch_configuration.fhss_number_of_bc_channels) + destination_offset;
216-
if (uc_index >= (fhss_structure->number_of_channels - fhss_structure->synch_configuration.fhss_number_of_bc_channels)) {
217-
uc_index -= (fhss_structure->number_of_channels - fhss_structure->synch_configuration.fhss_number_of_bc_channels);
214+
uc_index = fhss_calculate_uc_index(fhss_structure->bs->current_channel_index, fhss_structure->number_of_channels,
215+
fhss_structure->bs->synch_configuration.fhss_number_of_bc_channels) + destination_offset;
216+
if (uc_index >= (fhss_structure->number_of_channels - fhss_structure->bs->synch_configuration.fhss_number_of_bc_channels)) {
217+
uc_index -= (fhss_structure->number_of_channels - fhss_structure->bs->synch_configuration.fhss_number_of_bc_channels);
218218
}
219219

220-
uc_index = fhss_calc_channel_shuffle(uc_index, fhss_structure->number_of_channels, fhss_structure->synch_configuration.fhss_number_of_bc_channels);
221-
uc_index = fhss_add_channel_list_counter(uc_index, fhss_structure->number_of_channels, fhss_structure->bs->channel_list_counter, fhss_structure->fhss_scramble_table);
220+
uc_index = fhss_calc_channel_shuffle(uc_index, fhss_structure->number_of_channels, fhss_structure->bs->synch_configuration.fhss_number_of_bc_channels);
221+
uc_index = fhss_add_channel_list_counter(uc_index, fhss_structure->number_of_channels, fhss_structure->bs->channel_list_counter, fhss_structure->bs->fhss_scramble_table);
222222
return channel_list_get_channel(fhss_structure->bs->fhss_configuration.channel_mask, uc_index);
223223
}
224224
return fhss_structure->rx_channel;
@@ -246,21 +246,21 @@ int fhss_change_to_parent_channel(fhss_structure_t *fhss_structure)
246246
uint8_t destination_channel;
247247
uint8_t destination_offset;
248248
if (fhss_structure) {
249-
if (fhss_structure->number_of_channels != fhss_structure->synch_configuration.fhss_number_of_bc_channels) {
249+
if (fhss_structure->number_of_channels != fhss_structure->bs->synch_configuration.fhss_number_of_bc_channels) {
250250
uint8_t parent_address[8];
251251
if (fhss_get_parent_address(fhss_structure, parent_address)) {
252252
return -1;
253253
}
254254

255255
destination_offset = fhss_get_offset(fhss_structure, parent_address);
256256

257-
uc_index = fhss_calculate_uc_index(fhss_structure->current_channel_index, fhss_structure->number_of_channels,
258-
fhss_structure->synch_configuration.fhss_number_of_bc_channels) + destination_offset;
259-
if (uc_index >= (fhss_structure->number_of_channels - fhss_structure->synch_configuration.fhss_number_of_bc_channels)) {
260-
uc_index -= (fhss_structure->number_of_channels - fhss_structure->synch_configuration.fhss_number_of_bc_channels);
257+
uc_index = fhss_calculate_uc_index(fhss_structure->bs->current_channel_index, fhss_structure->number_of_channels,
258+
fhss_structure->bs->synch_configuration.fhss_number_of_bc_channels) + destination_offset;
259+
if (uc_index >= (fhss_structure->number_of_channels - fhss_structure->bs->synch_configuration.fhss_number_of_bc_channels)) {
260+
uc_index -= (fhss_structure->number_of_channels - fhss_structure->bs->synch_configuration.fhss_number_of_bc_channels);
261261
}
262-
uc_index = fhss_calc_channel_shuffle(uc_index, fhss_structure->number_of_channels, fhss_structure->synch_configuration.fhss_number_of_bc_channels);
263-
uc_index = fhss_add_channel_list_counter(uc_index, fhss_structure->number_of_channels, fhss_structure->bs->channel_list_counter, fhss_structure->fhss_scramble_table);
262+
uc_index = fhss_calc_channel_shuffle(uc_index, fhss_structure->number_of_channels, fhss_structure->bs->synch_configuration.fhss_number_of_bc_channels);
263+
uc_index = fhss_add_channel_list_counter(uc_index, fhss_structure->number_of_channels, fhss_structure->bs->channel_list_counter, fhss_structure->bs->fhss_scramble_table);
264264
destination_channel = channel_list_get_channel(fhss_structure->bs->fhss_configuration.channel_mask, uc_index);
265265
fhss_structure->callbacks.change_channel(fhss_structure->fhss_api, destination_channel);
266266
#ifdef FHSS_CHANNEL_DEBUG

source/Service_Libs/fhss/fhss_common.c

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -93,31 +93,6 @@ int8_t fhss_set_datarate(fhss_structure_t *fhss_structure, uint32_t datarate)
9393
return 0;
9494
}
9595

96-
int8_t fhss_set_synch_configuration(fhss_structure_t *fhss_structure, const fhss_synch_configuration_t *fhss_synch_configuration)
97-
{
98-
if (!fhss_structure) {
99-
return -1;
100-
}
101-
if (!fhss_synch_configuration) {
102-
return -2;
103-
}
104-
// None of the configurations can be set zero
105-
if( fhss_synch_configuration->fhss_number_of_bc_channels == 0 || fhss_synch_configuration->fhss_number_of_tx_slots == 0
106-
|| fhss_synch_configuration->fhss_number_of_superframes == 0 || fhss_synch_configuration->fhss_superframe_length == 0) {
107-
return -3;
108-
}
109-
// Number of channels must be divisible with the number of broadcast channels.
110-
// Number of superframes must be divisible with the number of TX slots
111-
if (((fhss_structure->number_of_channels % fhss_synch_configuration->fhss_number_of_bc_channels) != 0) ||
112-
((fhss_synch_configuration->fhss_number_of_superframes % fhss_synch_configuration->fhss_number_of_tx_slots) != 0) ||
113-
(fhss_synch_configuration->fhss_number_of_superframes <= fhss_synch_configuration->fhss_number_of_tx_slots)) {
114-
return -4;
115-
}
116-
fhss_structure->synch_configuration = *fhss_synch_configuration;
117-
fhss_structure->own_hop = 0;
118-
return 0;
119-
}
120-
12196
fhss_structure_t *fhss_get_object_with_api(const fhss_api_t *fhss_api)
12297
{
12398
if (!fhss_api || !fhss_struct) {

0 commit comments

Comments
 (0)