Skip to content

Commit 3e8112b

Browse files
author
Jarkko Paso
authored
Merge pull request ARMmbed#1578 from ARMmbed/IOTTHD-2286
FHSS: Added vendor defined CF support
2 parents 4cd6c49 + 80e4270 commit 3e8112b

File tree

2 files changed

+24
-5
lines changed

2 files changed

+24
-5
lines changed

nanostack/fhss_config.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,17 @@ typedef struct fhss_configuration
7878

7979
} fhss_configuration_t;
8080

81+
/**
82+
* @brief Get channel using vendor defined channel function.
83+
* @param api FHSS instance.
84+
* @param slot Slot number in channel schedule.
85+
* @param eui64 EUI-64 address of node for which the (unicast) schedule is calculated. NULL for broadcast schedule.
86+
* @param bsi Broadcast schedule identifier used in (broadcast) schedule calculation.
87+
* @param number_of_channels Number of channels in schedule.
88+
* @return Channel.
89+
*/
90+
typedef int32_t fhss_vendor_defined_cf(const fhss_api_t *api, uint16_t slot, uint8_t eui64[8], uint16_t bsi, uint16_t number_of_channels);
91+
8192
/**
8293
* \brief Struct fhss_ws_configuration defines configuration of WS FHSS.
8394
*/
@@ -101,6 +112,9 @@ typedef struct fhss_ws_configuration
101112
/** Channel mask. */
102113
uint32_t channel_mask[8];
103114

115+
/** Vendor defined channel function. */
116+
fhss_vendor_defined_cf *vendor_defined_cf;
117+
104118
} fhss_ws_configuration_t;
105119

106120
/**

source/Service_Libs/fhss/fhss_ws.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,8 @@ fhss_structure_t *fhss_ws_enable(fhss_api_t *fhss_api, const fhss_ws_configurati
6767

6868
static void fhss_ws_update_bc_channel(fhss_structure_t *fhss_structure)
6969
{
70-
uint8_t mac_address[8];
7170
int32_t next_channel;
72-
fhss_structure->callbacks.read_mac_address(fhss_structure->fhss_api, mac_address);
71+
7372
if (fhss_structure->ws->fhss_configuration.ws_channel_function == WS_FIXED_CHANNEL) {
7473

7574
} else if (fhss_structure->ws->fhss_configuration.ws_channel_function == WS_TR51CF) {
@@ -81,7 +80,9 @@ static void fhss_ws_update_bc_channel(fhss_structure_t *fhss_structure)
8180
next_channel = dh1cf_get_bc_channel_index(fhss_structure->ws->bc_slot, fhss_structure->ws->fhss_configuration.bsi, fhss_structure->number_of_channels);
8281
fhss_structure->ws->bc_slot++;
8382
} else if (fhss_structure->ws->fhss_configuration.ws_channel_function == WS_VENDOR_DEF_CF) {
84-
//TODO: Callback to get channel schedule from application
83+
if (fhss_structure->ws->fhss_configuration.vendor_defined_cf) {
84+
next_channel = fhss_structure->ws->fhss_configuration.vendor_defined_cf(fhss_structure->fhss_api, fhss_structure->ws->bc_slot, NULL, fhss_structure->ws->fhss_configuration.bsi, fhss_structure->number_of_channels);
85+
}
8586
}
8687
#ifdef FHSS_CHANNEL_DEBUG
8788
tr_info("%"PRIu32" BC %u %u", fhss_structure->platform_functions.fhss_get_timestamp(fhss_structure->fhss_api), next_channel, fhss_structure->ws->bc_slot);
@@ -200,7 +201,9 @@ static void fhss_ws_update_uc_channel_callback(fhss_structure_t *fhss_structure)
200201
next_channel = fhss_structure->rx_channel = dh1cf_get_uc_channel_index(fhss_structure->ws->uc_slot, mac_address, fhss_structure->number_of_channels);
201202
fhss_structure->ws->uc_slot++;
202203
} else if (fhss_structure->ws->fhss_configuration.ws_channel_function == WS_VENDOR_DEF_CF) {
203-
//TODO: Callback to get channel schedule from application
204+
if (fhss_structure->ws->fhss_configuration.vendor_defined_cf) {
205+
next_channel = fhss_structure->rx_channel = fhss_structure->ws->fhss_configuration.vendor_defined_cf(fhss_structure->fhss_api, fhss_structure->ws->bc_slot, mac_address, fhss_structure->ws->fhss_configuration.bsi, fhss_structure->number_of_channels);
206+
}
204207
}
205208
// Do not switch unicast channel when broadcast channel is active.
206209
if (fhss_structure->ws->is_on_bc_channel == true) {
@@ -235,7 +238,9 @@ static int fhss_ws_tx_handle_callback(const fhss_api_t *api, bool is_broadcast_a
235238
} else if(fhss_structure->ws->fhss_configuration.ws_channel_function == WS_DH1CF) {
236239
tx_channel = dh1cf_get_uc_channel_index(destination_slot, destination_address, fhss_structure->number_of_channels);
237240
} else if (fhss_structure->ws->fhss_configuration.ws_channel_function == WS_VENDOR_DEF_CF) {
238-
241+
if (fhss_structure->ws->fhss_configuration.vendor_defined_cf) {
242+
tx_channel = fhss_structure->ws->fhss_configuration.vendor_defined_cf(fhss_structure->fhss_api, fhss_structure->ws->bc_slot, destination_address, fhss_structure->ws->fhss_configuration.bsi, fhss_structure->number_of_channels);
243+
}
239244
}
240245
#ifdef FHSS_CHANNEL_DEBUG
241246
tr_debug("TX channel: %u %u", tx_channel, destination_slot+1);

0 commit comments

Comments
 (0)