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

Commit b60b113

Browse files
author
Jarkko Paso
committed
FHSS: Broadcast handler implemented
1 parent 9bf1d1f commit b60b113

File tree

4 files changed

+87
-15
lines changed

4 files changed

+87
-15
lines changed

source/Service_Libs/fhss/channel_functions.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,3 +193,19 @@ int32_t tr51_get_uc_channel_index(uint16_t slot_number, uint8_t *mac, int16_t nu
193193
tr51_calculate_hopping_sequence(channel_table, nearest_prime, first_element, step_size, output_table, NULL, 0);
194194
return output_table[slot_number];
195195
}
196+
197+
int32_t tr51_get_bc_channel_index(uint16_t slot_number, uint16_t bsi, int16_t number_of_channels)
198+
{
199+
uint16_t nearest_prime = tr51_calc_nearest_prime_number(number_of_channels);
200+
int32_t channel_table[nearest_prime];
201+
int32_t output_table[number_of_channels];
202+
uint8_t mac[8] = {0, 0, 0, 0, 0, 0, (uint8_t)(bsi >> 8), (uint8_t)bsi};
203+
uint8_t first_element;
204+
uint8_t step_size;
205+
tr51_calculate_channel_table(number_of_channels, nearest_prime, channel_table);
206+
tr51_compute_cfd(mac, &first_element, &step_size, nearest_prime);
207+
// Not sure yet which one is the correct second parameter
208+
// tr51_calculate_hopping_sequence(channel_table, number_of_channels, first_element, step_size, output_table, NULL, 0);
209+
tr51_calculate_hopping_sequence(channel_table, nearest_prime, first_element, step_size, output_table, NULL, 0);
210+
return output_table[slot_number];
211+
}

source/Service_Libs/fhss/channel_functions.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,15 @@ uint16_t tr51_calculate_hopping_sequence(int32_t *channel_table, uint16_t channe
4646
*/
4747
int32_t tr51_get_uc_channel_index(uint16_t slot_number, uint8_t *mac, int16_t number_of_channels);
4848

49+
/**
50+
* @brief Compute the broadcast schedule channel index using tr51 channel function.
51+
* @param slot_number Current slot number.
52+
* @param bsi Broadcast schedule identifier of the node for which the index is calculated.
53+
* @param number_of_channels Number of channels.
54+
* @return Channel index.
55+
*/
56+
int32_t tr51_get_bc_channel_index(uint16_t slot_number, uint16_t bsi, int16_t number_of_channels);
57+
4958
/**
5059
* @brief Compute the unicast schedule channel index using direct hash channel function.
5160
* @param slot_number Current slot number.

source/Service_Libs/fhss/fhss_ws.c

Lines changed: 59 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -50,22 +50,66 @@ fhss_structure_t *fhss_ws_enable(fhss_api_t *fhss_api, const fhss_ws_configurati
5050
}
5151
fhss_struct->fhss_conf.fhss_ws_configuration = *fhss_configuration;
5252
fhss_struct->number_of_channels = channel_count;
53-
5453
return fhss_struct;
5554
}
5655

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+
57100
static uint32_t fhss_ws_get_sf_timeout_callback(fhss_structure_t *fhss_structure)
58101
{
59102
return fhss_structure->fhss_conf.fhss_ws_configuration.fhss_uc_dwell_interval * 1000;
60103
}
61104

62105
static int fhss_ws_handle_state_set(fhss_structure_t *fhss_structure, fhss_states fhss_state, uint16_t pan_id)
63106
{
64-
(void) fhss_state;
65107
(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;
69113
return 0;
70114
}
71115

@@ -74,26 +118,26 @@ static void fhss_ws_superframe_callback(fhss_structure_t *fhss_structure)
74118
(void) fhss_structure;
75119
}
76120

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)
78122
{
79123
uint8_t mac_address[8];
80124
int32_t next_channel;
81125
fhss_structure->callbacks.read_mac_address(fhss_structure->fhss_api, mac_address);
82126
if (fhss_structure->ws->channel_function == WS_FIXED_CHANNEL) {
83127

84128
} 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;
88132
}
89133
} 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++;
92136
} else if (fhss_structure->ws->channel_function == WS_VENDOR_DEF_CF) {
93137
//TODO: Callback to get channel schedule from application
94138
}
95139
#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);
97141
#endif /*FHSS_CHANNEL_DEBUG*/
98142
fhss_structure->callbacks.change_channel(fhss_structure->fhss_api, next_channel);
99143
}
@@ -112,7 +156,7 @@ static int fhss_ws_tx_handle_callback(const fhss_api_t *api, bool is_broadcast_a
112156
if (fhss_structure->fhss_state == FHSS_SYNCHRONIZED) {
113157
int32_t tx_channel;
114158
//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;
116160
if (fhss_structure->ws->channel_function == WS_TR51CF) {
117161
tx_channel = tr51_get_uc_channel_index(destination_slot, destination_address, fhss_structure->number_of_channels);
118162
} else if(fhss_structure->ws->channel_function == WS_DH1CF) {
@@ -156,7 +200,7 @@ int fhss_ws_set_callbacks(fhss_structure_t *fhss_structure)
156200
fhss_structure->fhss_api->write_synch_info = &fhss_write_synch_info_cb;
157201
fhss_structure->fhss_api->init_callbacks = &fhss_init_callbacks_cb;
158202
// Set internal API
159-
fhss_structure->update_channel = fhss_ws_update_channel_callback;
203+
fhss_structure->update_channel = fhss_ws_update_uc_channel_callback;
160204
fhss_structure->update_superframe = fhss_ws_superframe_callback;
161205
fhss_structure->read_superframe_timeout = fhss_ws_get_sf_timeout_callback;
162206
fhss_structure->handle_state_set = fhss_ws_handle_state_set;
@@ -165,5 +209,6 @@ int fhss_ws_set_callbacks(fhss_structure_t *fhss_structure)
165209
return -1;
166210
}
167211
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;
168213
return 0;
169214
}

source/Service_Libs/fhss/fhss_ws.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ typedef struct fhss_ws fhss_ws_t;
2121
struct fhss_ws
2222
{
2323
fhss_ws_channel_functions channel_function;
24-
uint16_t slot;
24+
uint16_t uc_slot;
25+
uint16_t bc_slot;
26+
bool is_on_bc_channel;
2527
};
2628

2729
fhss_structure_t *fhss_ws_enable(fhss_api_t *fhss_api, const fhss_ws_configuration_t *fhss_configuration, const fhss_timer_t *fhss_timer);

0 commit comments

Comments
 (0)