Skip to content

Commit 24f418c

Browse files
author
Jarkko Paso
authored
Merge pull request ARMmbed#1575 from ARMmbed/IOTTHD-2288
Iotthd 2288
2 parents 036e19c + a849c8d commit 24f418c

23 files changed

+561
-715
lines changed

source/Service_Libs/fhss/fhss.c

Lines changed: 223 additions & 156 deletions
Large diffs are not rendered by default.

source/Service_Libs/fhss/fhss.h

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ typedef struct fhss_structure fhss_structure_t;
3131
typedef struct fhss_beacon_info fhss_beacon_info_t;
3232
typedef struct fhss_synch_monitor fhss_synch_monitor_s;
3333
typedef struct fhss_failed_tx fhss_failed_tx_t;
34+
typedef struct fhss_bs fhss_bs_t;
3435

3536
struct fhss_beacon_info
3637
{
@@ -56,11 +57,45 @@ struct fhss_failed_tx
5657
uint8_t retries_done;
5758
ns_list_link_t link;
5859
};
60+
typedef NS_LIST_HEAD(fhss_failed_tx_t, link) fhss_failed_tx_list_t;
61+
62+
63+
struct fhss_bs
64+
{
65+
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:1;
73+
bool send_synch_info_on_next_broadcast_channel:1;
74+
bool beacon_received_on_this_bc_channel:1;
75+
uint16_t channel_list_counter;
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];
85+
};
5986

6087
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);
6188
bool fhss_is_synch_root(fhss_structure_t *fhss_structure);
6289
void fhss_update_beacon_info_lifetimes(fhss_structure_t *fhss_structure, uint32_t timestamp);
6390
uint32_t fhss_get_tx_time(fhss_structure_t *fhss_structure, uint16_t bytes_to_send, uint8_t phy_header_length, uint8_t phy_tail_length);
91+
/**
92+
* Calculate time in microseconds to start of next superframe.
93+
*
94+
* @param fhss_struct FHSS structure
95+
* @return microseconds left to start of next superframe
96+
*/
97+
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);
6499
int fhss_set_callbacks(fhss_structure_t *fhss_structure);
65100

66101
#endif /* FHSS_H_ */

source/Service_Libs/fhss/fhss_beacon.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,26 +39,26 @@ 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);
53-
payload->channel_list_counter = fhss_structure->channel_list_counter;
53+
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
5959
// TODO: Get Beacon length from MAC
6060
uint32_t tx_time = fhss_get_tx_time(fhss_structure, 71, 0, 0);
61-
payload->processing_delay = fhss_structure->fhss_conf.fhss_configuration.fhss_tuning_parameters.tx_processing_delay + tx_time;
61+
payload->processing_delay = fhss_structure->bs->fhss_configuration.fhss_tuning_parameters.tx_processing_delay + tx_time;
6262

6363
payload->superframe_length = config->fhss_superframe_length;
6464

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: 34 additions & 35 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,8 +113,8 @@ 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;
117-
uint8_t unicast_channel_index = fhss_structure->uc_channel_index;
116+
uint8_t number_of_broadcast_channels = fhss_structure->bs->synch_configuration.fhss_number_of_bc_channels;
117+
uint8_t unicast_channel_index = fhss_structure->bs->uc_channel_index;
118118
uint8_t channel_index_tmp;
119119

120120
/* Get the channel number using channel index. Latter (number_of_broadcast_channels) indexes in channel table are broadcast channels and
@@ -124,20 +124,19 @@ 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);
132-
fhss_structure->uc_channel_index++;
133-
if (fhss_structure->uc_channel_index >= number_of_channels - number_of_broadcast_channels) {
134-
fhss_structure->uc_channel_index = 0;
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);
132+
if (++fhss_structure->bs->uc_channel_index >= number_of_channels - number_of_broadcast_channels) {
133+
fhss_structure->bs->uc_channel_index = 0;
135134
}
136135
}
137136
// Reset Beacon received flag when channel has changed
138-
fhss_structure->beacon_received_on_this_bc_channel = false;
139-
channel_index_tmp = fhss_add_channel_list_counter(channel_index_tmp, fhss_structure->number_of_channels, fhss_structure->channel_list_counter, fhss_structure->fhss_scramble_table);
140-
next_channel = channel_list_get_channel(fhss_structure->fhss_conf.fhss_configuration.channel_mask, channel_index_tmp);
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);
139+
next_channel = channel_list_get_channel(fhss_structure->bs->fhss_configuration.channel_mask, channel_index_tmp);
141140

142141
fhss_structure->rx_channel = next_channel;
143142
#ifdef FHSS_CHANNEL_DEBUG
@@ -154,8 +153,8 @@ bool fhss_change_to_next_channel(fhss_structure_t *fhss_structure)
154153
static uint8_t fhss_get_bc_index(const fhss_structure_t *fhss_structure)
155154
{
156155
uint16_t number_of_channels = fhss_structure->number_of_channels;
157-
uint8_t number_of_bc_channels = fhss_structure->synch_configuration.fhss_number_of_bc_channels;
158-
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;
159158

160159
return cur_channel_index / (number_of_channels/number_of_bc_channels);
161160
}
@@ -165,7 +164,7 @@ uint8_t fhss_get_offset(fhss_structure_t *fhss_structure, const uint8_t *ptr)
165164
uint8_t i;
166165
uint8_t index = *ptr++;
167166

168-
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) {
169168
// If all channels are defined as broadcast channels then return 0 to avoid division by 0.
170169
// This could happen e.g. in OTA case when fast download is needed.
171170
return 0;
@@ -177,7 +176,7 @@ uint8_t fhss_get_offset(fhss_structure_t *fhss_structure, const uint8_t *ptr)
177176
index ^= *ptr++;
178177
}
179178
// Offset must be < number of unicast channels
180-
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);
181180

182181
return index;
183182
}
@@ -190,13 +189,13 @@ bool fhss_is_current_channel_broadcast(fhss_structure_t *fhss_structure)
190189
}
191190

192191
// Should always have broadcast channels with FHSS
193-
if (!fhss_structure->synch_configuration.fhss_number_of_bc_channels) {
192+
if (!fhss_structure->bs->synch_configuration.fhss_number_of_bc_channels) {
194193
return true;
195194
}
196195

197-
uint8_t channel_index = fhss_structure->current_channel_index;
196+
uint8_t channel_index = fhss_structure->bs->current_channel_index;
198197
uint16_t number_of_channels = fhss_structure->number_of_channels;
199-
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;
200199

201200
if (!(channel_index % (number_of_channels / number_of_broadcast_channels))) {
202201
return true;
@@ -212,15 +211,15 @@ static uint8_t fhss_get_destination_channel(fhss_structure_t *fhss_structure, ui
212211
if (fhss_structure) {
213212
if (fhss_is_current_channel_broadcast(fhss_structure) == false) {
214213
destination_offset = fhss_get_offset(fhss_structure, destination_address);
215-
uc_index = fhss_calculate_uc_index(fhss_structure->current_channel_index, fhss_structure->number_of_channels,
216-
fhss_structure->synch_configuration.fhss_number_of_bc_channels) + destination_offset;
217-
if (uc_index >= (fhss_structure->number_of_channels - fhss_structure->synch_configuration.fhss_number_of_bc_channels)) {
218-
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);
219218
}
220219

221-
uc_index = fhss_calc_channel_shuffle(uc_index, fhss_structure->number_of_channels, fhss_structure->synch_configuration.fhss_number_of_bc_channels);
222-
uc_index = fhss_add_channel_list_counter(uc_index, fhss_structure->number_of_channels, fhss_structure->channel_list_counter, fhss_structure->fhss_scramble_table);
223-
return channel_list_get_channel(fhss_structure->fhss_conf.fhss_configuration.channel_mask, uc_index);
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);
222+
return channel_list_get_channel(fhss_structure->bs->fhss_configuration.channel_mask, uc_index);
224223
}
225224
return fhss_structure->rx_channel;
226225
}
@@ -247,22 +246,22 @@ int fhss_change_to_parent_channel(fhss_structure_t *fhss_structure)
247246
uint8_t destination_channel;
248247
uint8_t destination_offset;
249248
if (fhss_structure) {
250-
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) {
251250
uint8_t parent_address[8];
252251
if (fhss_get_parent_address(fhss_structure, parent_address)) {
253252
return -1;
254253
}
255254

256255
destination_offset = fhss_get_offset(fhss_structure, parent_address);
257256

258-
uc_index = fhss_calculate_uc_index(fhss_structure->current_channel_index, fhss_structure->number_of_channels,
259-
fhss_structure->synch_configuration.fhss_number_of_bc_channels) + destination_offset;
260-
if (uc_index >= (fhss_structure->number_of_channels - fhss_structure->synch_configuration.fhss_number_of_bc_channels)) {
261-
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);
262261
}
263-
uc_index = fhss_calc_channel_shuffle(uc_index, fhss_structure->number_of_channels, fhss_structure->synch_configuration.fhss_number_of_bc_channels);
264-
uc_index = fhss_add_channel_list_counter(uc_index, fhss_structure->number_of_channels, fhss_structure->channel_list_counter, fhss_structure->fhss_scramble_table);
265-
destination_channel = channel_list_get_channel(fhss_structure->fhss_conf.fhss_configuration.channel_mask, uc_index);
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);
264+
destination_channel = channel_list_get_channel(fhss_structure->bs->fhss_configuration.channel_mask, uc_index);
266265
fhss_structure->callbacks.change_channel(fhss_structure->fhss_api, destination_channel);
267266
#ifdef FHSS_CHANNEL_DEBUG
268267
tr_info("Parent channel: %u", destination_channel);

0 commit comments

Comments
 (0)