Skip to content
This repository was archived by the owner on May 23, 2023. It is now read-only.

Commit ff66ae9

Browse files
author
Jarkko Paso
committed
FHSS: Separate FHSS and WS parameters
- Configuration structs moved
1 parent 6ace69b commit ff66ae9

File tree

10 files changed

+72
-60
lines changed

10 files changed

+72
-60
lines changed

source/Service_Libs/fhss/fhss.c

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -59,16 +59,23 @@ fhss_structure_t *fhss_enable(fhss_api_t *fhss_api, const fhss_configuration_t *
5959
if (!fhss_struct) {
6060
return NULL;
6161
}
62-
fhss_struct->fhss_conf.fhss_configuration = *fhss_configuration;
62+
fhss_struct->bs = ns_dyn_mem_alloc(sizeof(fhss_bs_t));
63+
if (!fhss_struct->bs) {
64+
ns_dyn_mem_free(fhss_struct);
65+
return NULL;
66+
}
67+
memset(fhss_struct->bs, 0, sizeof(fhss_bs_t));
68+
69+
fhss_struct->bs->fhss_configuration = *fhss_configuration;
6370
fhss_struct->fhss_stats_ptr = fhss_statistics;
6471
fhss_struct->number_of_channels = channel_count;
6572

6673
// set a invalid id to tasklet_id, so we know that one is not started yet
6774
fhss_struct->beacon_tasklet_id = -1;
6875

6976
// Default synch interval is 240 seconds
70-
if (!fhss_struct->fhss_conf.fhss_configuration.fhss_max_synch_interval) {
71-
fhss_struct->fhss_conf.fhss_configuration.fhss_max_synch_interval = 240;
77+
if (!fhss_struct->bs->fhss_configuration.fhss_max_synch_interval) {
78+
fhss_struct->bs->fhss_configuration.fhss_max_synch_interval = 240;
7279
}
7380
ns_list_init(&fhss_struct->fhss_failed_tx_list);
7481
fhss_struct->own_hop = 0xff;
@@ -262,7 +269,7 @@ static int fhss_update_drift_compensation(fhss_structure_t *fhss_structure)
262269
bc_density = (fhss_structure->number_of_channels / fhss_structure->synch_configuration.fhss_number_of_bc_channels);
263270
channel_dwell_time = ((uint32_t)fhss_structure->synch_configuration.fhss_superframe_length * fhss_structure->synch_configuration.fhss_number_of_superframes) / 1000;
264271
// Calculate last synchronisation period
265-
if (fhss_structure->synch_interval != ((uint32_t)fhss_structure->fhss_conf.fhss_configuration.fhss_max_synch_interval * 1000)) {
272+
if (fhss_structure->synch_interval != ((uint32_t)fhss_structure->bs->fhss_configuration.fhss_max_synch_interval * 1000)) {
266273
// Last period was half of the current started period and max random period is shorter
267274
synch_period = (fhss_structure->synch_interval / 2) + (bc_density * channel_dwell_time) * (fhss_structure->synch_configuration.fhss_number_of_bc_channels / 2);
268275
} else {
@@ -401,14 +408,14 @@ static int fhss_sync_with_beacon(fhss_structure_t *fhss_structure,
401408

402409
if (fhss_structure->fhss_state == FHSS_SYNCHRONIZED) {
403410
if (fhss_update_synch_monitor(fhss_structure, payload, superframe_own, remaining_time_own, time_to_next_superframe)) {
404-
fhss_structure->synch_interval = (uint32_t) (fhss_structure->fhss_conf.fhss_configuration.fhss_max_synch_interval/BEACON_INTERVAL_INIT_DIVIDER) * 1000;
411+
fhss_structure->synch_interval = (uint32_t) (fhss_structure->bs->fhss_configuration.fhss_max_synch_interval/BEACON_INTERVAL_INIT_DIVIDER) * 1000;
405412
}
406413
}
407414

408-
if (fhss_structure->synch_interval != ((uint32_t)fhss_structure->fhss_conf.fhss_configuration.fhss_max_synch_interval * 1000)) {
415+
if (fhss_structure->synch_interval != ((uint32_t)fhss_structure->bs->fhss_configuration.fhss_max_synch_interval * 1000)) {
409416
fhss_structure->synch_interval *= 2;
410-
if (fhss_structure->synch_interval > ((uint32_t)fhss_structure->fhss_conf.fhss_configuration.fhss_max_synch_interval * 1000)) {
411-
fhss_structure->synch_interval = ((uint32_t)fhss_structure->fhss_conf.fhss_configuration.fhss_max_synch_interval * 1000);
417+
if (fhss_structure->synch_interval > ((uint32_t)fhss_structure->bs->fhss_configuration.fhss_max_synch_interval * 1000)) {
418+
fhss_structure->synch_interval = ((uint32_t)fhss_structure->bs->fhss_configuration.fhss_max_synch_interval * 1000);
412419
}
413420
beacon_interval_random = (bc_density * channel_dwell_time) * randLIB_get_random_in_range(0, fhss_number_of_bc_channels/2);
414421
} else {
@@ -491,8 +498,8 @@ static bool fhss_check_remaining_tx_time(fhss_structure_t *fhss_structure, uint1
491498
if (fhss_structure->fhss_state == FHSS_UNSYNCHRONIZED) {
492499
retval = true;
493500
} else {
494-
tx_processing_delay = fhss_structure->fhss_conf.fhss_configuration.fhss_tuning_parameters.tx_processing_delay;
495-
ack_processing_delay = fhss_structure->fhss_conf.fhss_configuration.fhss_tuning_parameters.ack_processing_delay;
501+
tx_processing_delay = fhss_structure->bs->fhss_configuration.fhss_tuning_parameters.tx_processing_delay;
502+
ack_processing_delay = fhss_structure->bs->fhss_configuration.fhss_tuning_parameters.ack_processing_delay;
496503
// Calculate needed TX time (us): CCA static period + TX processing delays + transmission time + Ack processing delays + Ack transmission time
497504
needed_tx_time = CCA_FHSS_PERIOD + tx_processing_delay + fhss_get_tx_time(fhss_structure, tx_length, phy_header_length, phy_tail_length)
498505
+ ack_processing_delay + fhss_get_tx_time(fhss_structure, ACK_LENGTH, phy_header_length, phy_tail_length);
@@ -644,7 +651,7 @@ static int fhss_reset(fhss_structure_t *fhss_structure)
644651
fhss_structure->own_hop = 0xff;
645652
}
646653
fhss_structure->tx_allowed = false;
647-
fhss_structure->synch_interval = (uint32_t) (fhss_structure->fhss_conf.fhss_configuration.fhss_max_synch_interval/BEACON_INTERVAL_INIT_DIVIDER) * 1000;
654+
fhss_structure->synch_interval = (uint32_t) (fhss_structure->bs->fhss_configuration.fhss_max_synch_interval/BEACON_INTERVAL_INIT_DIVIDER) * 1000;
648655
fhss_structure->rx_channel = 0;
649656
fhss_structure->beacons_received_timer = 0;
650657
memset(fhss_structure->synch_parent, 0xff, 8);
@@ -807,7 +814,7 @@ static void fhss_beacon_received(fhss_structure_t *fhss_structure, const uint8_t
807814

808815
if (synch_info) {
809816
fhss_synchronization_beacon_payload_s temp_payload;
810-
temp_payload.processing_delay = fhss_structure->fhss_conf.fhss_configuration.fhss_tuning_parameters.rx_processing_delay;
817+
temp_payload.processing_delay = fhss_structure->bs->fhss_configuration.fhss_tuning_parameters.rx_processing_delay;
811818
fhss_beacon_decode(&temp_payload, synch_info, elapsed_time, fhss_structure->number_of_channels);
812819

813820
// use the received information
@@ -985,7 +992,7 @@ static bool fhss_data_tx_fail_callback(const fhss_api_t *api, uint8_t handle, in
985992
return false;
986993
}
987994
// Channel retries are disabled -> return
988-
if (fhss_structure->fhss_conf.fhss_configuration.fhss_number_of_channel_retries == 0) {
995+
if (fhss_structure->bs->fhss_configuration.fhss_number_of_channel_retries == 0) {
989996
return false;
990997
}
991998
// Use channel retries only for data frames
@@ -996,7 +1003,7 @@ static bool fhss_data_tx_fail_callback(const fhss_api_t *api, uint8_t handle, in
9961003
fhss_failed_tx_t *fhss_failed_tx = fhss_failed_handle_find(fhss_structure, handle);
9971004
if (fhss_failed_tx) {
9981005
fhss_failed_tx->retries_done++;
999-
if (fhss_failed_tx->retries_done >= fhss_structure->fhss_conf.fhss_configuration.fhss_number_of_channel_retries) {
1006+
if (fhss_failed_tx->retries_done >= fhss_structure->bs->fhss_configuration.fhss_number_of_channel_retries) {
10001007
// No more retries. Return false to stop retransmitting.
10011008
fhss_failed_handle_remove(fhss_structure, handle);
10021009
return false;

source/Service_Libs/fhss/fhss.h

Lines changed: 6 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
{
@@ -57,6 +58,11 @@ struct fhss_failed_tx
5758
ns_list_link_t link;
5859
};
5960

61+
struct fhss_bs
62+
{
63+
fhss_configuration_t fhss_configuration;
64+
};
65+
6066
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);
6167
bool fhss_is_synch_root(fhss_structure_t *fhss_structure);
6268
void fhss_update_beacon_info_lifetimes(fhss_structure_t *fhss_structure, uint32_t timestamp);

source/Service_Libs/fhss/fhss_beacon.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ int fhss_beacon_update_payload(fhss_structure_t *fhss_structure,
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_channel.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ bool fhss_change_to_next_channel(fhss_structure_t *fhss_structure)
137137
// Reset Beacon received flag when channel has changed
138138
fhss_structure->beacon_received_on_this_bc_channel = false;
139139
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);
140+
next_channel = channel_list_get_channel(fhss_structure->bs->fhss_configuration.channel_mask, channel_index_tmp);
141141

142142
fhss_structure->rx_channel = next_channel;
143143
#ifdef FHSS_CHANNEL_DEBUG
@@ -220,7 +220,7 @@ static uint8_t fhss_get_destination_channel(fhss_structure_t *fhss_structure, ui
220220

221221
uc_index = fhss_calc_channel_shuffle(uc_index, fhss_structure->number_of_channels, fhss_structure->synch_configuration.fhss_number_of_bc_channels);
222222
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);
223+
return channel_list_get_channel(fhss_structure->bs->fhss_configuration.channel_mask, uc_index);
224224
}
225225
return fhss_structure->rx_channel;
226226
}
@@ -262,7 +262,7 @@ int fhss_change_to_parent_channel(fhss_structure_t *fhss_structure)
262262
}
263263
uc_index = fhss_calc_channel_shuffle(uc_index, fhss_structure->number_of_channels, fhss_structure->synch_configuration.fhss_number_of_bc_channels);
264264
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);
265+
destination_channel = channel_list_get_channel(fhss_structure->bs->fhss_configuration.channel_mask, uc_index);
266266
fhss_structure->callbacks.change_channel(fhss_structure->fhss_api, destination_channel);
267267
#ifdef FHSS_CHANNEL_DEBUG
268268
tr_info("Parent channel: %u", destination_channel);

source/Service_Libs/fhss/fhss_common.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ int8_t fhss_disable(fhss_structure_t *fhss_structure)
153153
return -1;
154154
}
155155
fhss_structure->fhss_api->synch_state_set(fhss_structure->fhss_api, FHSS_UNSYNCHRONIZED, 0);
156+
ns_dyn_mem_free(fhss_structure->bs);
156157
ns_dyn_mem_free(fhss_structure->ws);
157158
ns_dyn_mem_free(fhss_structure);
158159
fhss_structure = 0;

source/Service_Libs/fhss/fhss_common.h

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,18 +43,12 @@ typedef void fhss_update_superframe_cb(fhss_structure_t *fhss_structure);
4343
*/
4444
typedef uint32_t fhss_read_superframe_timeout_cb(fhss_structure_t *fhss_structure);
4545

46-
union fhss_conf {
47-
fhss_configuration_t fhss_configuration;
48-
fhss_ws_configuration_t fhss_ws_configuration;
49-
};
50-
5146
struct fhss_structure
5247
{
5348
fhss_api_t *fhss_api;
5449
uint32_t datarate;
5550
fhss_states fhss_state;
5651
fhss_timer_t platform_functions;
57-
union fhss_conf fhss_conf;
5852
fhss_synch_configuration_t synch_configuration;
5953

6054
uint8_t fhss_resolution_divider;
@@ -108,6 +102,7 @@ struct fhss_structure
108102
fhss_failed_tx_list_t fhss_failed_tx_list;
109103
fhss_statistics_t *fhss_stats_ptr;
110104

105+
struct fhss_bs *bs;
111106
struct fhss_ws *ws;
112107
fhss_update_channel_cb *update_channel; /**< Update listening channel */
113108
fhss_update_superframe_cb *update_superframe; /**< Update superframe */

0 commit comments

Comments
 (0)