Skip to content

Commit 681dedd

Browse files
author
Jarkko Paso
authored
Merge pull request ARMmbed#1613 from ARMmbed/IOTTHD-2320
Iotthd 2320
2 parents 7e59035 + cfa5fd9 commit 681dedd

File tree

7 files changed

+99
-3
lines changed

7 files changed

+99
-3
lines changed

nanostack/fhss_config.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
extern "C" {
2929
#endif
3030

31+
#include "fhss_ws_extension.h"
32+
3133
/**
3234
* @brief WS channel functions.
3335
*/
@@ -89,6 +91,14 @@ typedef struct fhss_configuration
8991
*/
9092
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);
9193

94+
/**
95+
* @brief Get neighbor timing/hopping schedule.
96+
* @param api FHSS instance.
97+
* @param eui64 EUI-64 address of node for which the info is requested.
98+
* @return Neighbor timing/hopping schedule.
99+
*/
100+
typedef fhss_ws_neighbor_timing_info_t *fhss_get_neighbor_info(const fhss_api_t *api, uint8_t eui64[8]);
101+
92102
/**
93103
* \brief Struct fhss_ws_configuration defines configuration of WS FHSS.
94104
*/
@@ -115,6 +125,9 @@ typedef struct fhss_ws_configuration
115125
/** Vendor defined channel function. */
116126
fhss_vendor_defined_cf *vendor_defined_cf;
117127

128+
/** Get neighbor timing/hopping schedule. */
129+
fhss_get_neighbor_info *get_neighbor_info;
130+
118131
} fhss_ws_configuration_t;
119132

120133
/**

nanostack/fhss_ws_extension.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
#ifndef FHSS_WS_EXT_H
2424
#define FHSS_WS_EXT_H
2525

26+
#include "ns_types.h"
27+
#include "fhss_api.h"
2628

2729
#ifdef __cplusplus
2830
extern "C" {
@@ -61,6 +63,22 @@ typedef struct fhss_ws_neighbor_timing_info {
6163
broadcast_timing_info_t bc_timing_info; /**< Neighbor broadcast timing info */
6264
} fhss_ws_neighbor_timing_info_t;
6365

66+
/**
67+
* @brief Set parent which broadcast channels must be listened by FHSS.
68+
* @param fhss_api FHSS instance.
69+
* @param eui64 EUI-64 address of parent.
70+
* @param bc_timing_info Pointer to parent broadcast timing/hopping schedule info.
71+
* @return 0 on success, -1 on fail.
72+
*/
73+
extern int ns_fhss_ws_set_parent(const fhss_api_t *fhss_api, const uint8_t eui64[8], const broadcast_timing_info_t *bc_timing_info);
74+
75+
/**
76+
* @brief Remove parent which was set by ns_fhss_ws_set_parent function.
77+
* @param fhss_api FHSS instance.
78+
* @param eui64 EUI-64 address of parent.
79+
* @return 0 on success, -1 on fail.
80+
*/
81+
extern int ns_fhss_ws_remove_parent(const fhss_api_t *fhss_api, const uint8_t eui64[8]);
6482

6583
#ifdef __cplusplus
6684
}

source/Service_Libs/fhss/fhss_configuration_interface.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,24 @@ fhss_api_t *ns_fhss_ws_create(const fhss_ws_configuration_t *fhss_configuration,
6262
return this;
6363
}
6464

65+
int ns_fhss_ws_set_parent(const fhss_api_t *fhss_api, const uint8_t eui64[8], const broadcast_timing_info_t *bc_timing_info)
66+
{
67+
fhss_structure_t *fhss_structure = fhss_get_object_with_api(fhss_api);
68+
if (!fhss_structure || !eui64 || !bc_timing_info) {
69+
return -1;
70+
}
71+
return fhss_ws_set_parent(fhss_structure, eui64, bc_timing_info);
72+
}
73+
74+
int ns_fhss_ws_remove_parent(const fhss_api_t *fhss_api, const uint8_t eui64[8])
75+
{
76+
fhss_structure_t *fhss_structure = fhss_get_object_with_api(fhss_api);
77+
if (!fhss_structure || !eui64) {
78+
return -1;
79+
}
80+
return fhss_ws_remove_parent(fhss_structure, eui64);
81+
}
82+
6583
int ns_fhss_delete(fhss_api_t *fhss_api)
6684
{
6785
fhss_structure_t *fhss_structure = fhss_get_object_with_api(fhss_api);

source/Service_Libs/fhss/fhss_ws.c

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,11 @@ static uint32_t fhss_ws_calculate_ufsi(fhss_structure_t *fhss_structure, uint32_
158158
return own_floor((float)(ms_since_seq_start * DEF_2E24) / (seq_length*dwell_time));
159159
}
160160

161-
static uint16_t fhss_ws_calculate_destination_slot(fhss_structure_t *fhss_structure, uint32_t ufsi, uint32_t ufsi_timestamp, uint8_t dwell_time, uint32_t tx_time)
161+
static uint16_t fhss_ws_calculate_destination_slot(fhss_structure_t *fhss_structure, fhss_ws_neighbor_timing_info_t *neighbor_timing_info, uint32_t tx_time)
162162
{
163+
uint_fast24_t ufsi = neighbor_timing_info->uc_timing_info.ufsi;
164+
uint32_t ufsi_timestamp = neighbor_timing_info->uc_timing_info.utt_rx_timestamp;
165+
uint8_t dwell_time = neighbor_timing_info->uc_timing_info.unicast_dwell_interval;
163166
uint32_t seq_length = 0x10000;
164167
if (fhss_structure->ws->fhss_configuration.ws_channel_function == WS_TR51CF) {
165168
seq_length = fhss_structure->number_of_channels;
@@ -241,9 +244,12 @@ static int fhss_ws_tx_handle_callback(const fhss_api_t *api, bool is_broadcast_a
241244
return 0;
242245
}
243246
if (fhss_structure->fhss_state == FHSS_SYNCHRONIZED) {
247+
fhss_ws_neighbor_timing_info_t *neighbor_timing_info = fhss_structure->ws->fhss_configuration.get_neighbor_info(api, destination_address);
248+
if (!neighbor_timing_info) {
249+
return -1;
250+
}
251+
uint16_t destination_slot = fhss_ws_calculate_destination_slot(fhss_structure, neighbor_timing_info, tx_time);
244252
int32_t tx_channel;
245-
//TODO: Get destination UFSI, timestamp and dwell time from neighbour table
246-
uint16_t destination_slot = fhss_ws_calculate_destination_slot(fhss_structure, 0, 0, fhss_structure->ws->fhss_configuration.fhss_uc_dwell_interval, tx_time);
247253
if (fhss_structure->ws->fhss_configuration.ws_channel_function == WS_TR51CF) {
248254
tx_channel = tr51_get_uc_channel_index(destination_slot, destination_address, fhss_structure->number_of_channels, NULL, 0);
249255
} else if(fhss_structure->ws->fhss_configuration.ws_channel_function == WS_DH1CF) {
@@ -383,3 +389,24 @@ int fhss_ws_set_callbacks(fhss_structure_t *fhss_structure)
383389
fhss_structure->fhss_api->init_callbacks = &fhss_init_callbacks_cb;
384390
return 0;
385391
}
392+
393+
int fhss_ws_set_parent(fhss_structure_t *fhss_structure, const uint8_t eui64[8], const broadcast_timing_info_t *bc_timing_info)
394+
{
395+
(void) eui64;
396+
if (!fhss_structure->ws) {
397+
return -1;
398+
}
399+
//TODO: support multiple parents
400+
fhss_structure->ws->parent_bc_info = bc_timing_info;
401+
return 0;
402+
}
403+
404+
int fhss_ws_remove_parent(fhss_structure_t *fhss_structure, const uint8_t eui64[8])
405+
{
406+
(void) eui64;
407+
if (!fhss_structure->ws) {
408+
return -1;
409+
}
410+
fhss_structure->ws->parent_bc_info = NULL;
411+
return 0;
412+
}

source/Service_Libs/fhss/fhss_ws.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,12 @@ struct fhss_ws
2424
uint16_t bc_slot;
2525
bool is_on_bc_channel;
2626
struct fhss_ws_configuration fhss_configuration;
27+
const struct broadcast_timing_info *parent_bc_info;
2728
};
2829

2930
fhss_structure_t *fhss_ws_enable(fhss_api_t *fhss_api, const fhss_ws_configuration_t *fhss_configuration, const fhss_timer_t *fhss_timer);
3031
int fhss_ws_set_callbacks(fhss_structure_t *fhss_structure);
32+
int fhss_ws_set_parent(fhss_structure_t *fhss_structure, const uint8_t eui64[8], const broadcast_timing_info_t *bc_timing_info);
33+
int fhss_ws_remove_parent(fhss_structure_t *fhss_structure, const uint8_t eui64[8]);
3134

3235
#endif /*FHSS_WS_H_*/

test/nanostack/unittest/service_libs/fhss_ws/test_fhss_ws.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,18 @@
4747

4848
static fhss_api_t fhss_api;
4949
static fhss_ws_t ws;
50+
static fhss_ws_neighbor_timing_info_t neighbor_info;
5051

5152
static int32_t app_channel_function(const fhss_api_t *api, uint16_t slot, uint8_t eui64[8], uint16_t bsi, uint16_t number_of_channels)
5253
{
5354
return VENDOR_CHANNEL;
5455
}
5556

57+
static fhss_ws_neighbor_timing_info_t *app_get_neighbor_info(const fhss_api_t *api, uint8_t eui64[8])
58+
{
59+
return &neighbor_info;
60+
}
61+
5662
static void disable_fhss_struct(void)
5763
{
5864
// With this setting, FHSS structure cannot be found
@@ -84,6 +90,7 @@ static fhss_api_t *test_generate_fhss_api(void)
8490
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_uc_dwell_interval = 200;
8591
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_bc_dwell_interval = 250;
8692
fhss_common_stub.fhss_struct.ws->fhss_configuration.fhss_broadcast_interval = 1000;
93+
fhss_common_stub.fhss_struct.ws->fhss_configuration.get_neighbor_info = &app_get_neighbor_info;
8794
fhss_common_stub.fhss_struct.number_of_channels = 50;
8895
fhss_common_stub.fhss_struct.rx_channel = DEFAULT_CHANNEL;
8996
fhss_common_stub.fhss_struct.fhss_state = FHSS_UNSYNCHRONIZED;

test/nanostack/unittest/stub/fhss_ws_stub.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,13 @@ fhss_structure_t *fhss_ws_enable(fhss_api_t *fhss_api, const fhss_ws_configurati
3737
}
3838
return &fhss_ws_stub.fhss_struct;
3939
}
40+
41+
int fhss_ws_set_parent(fhss_structure_t *fhss_structure, uint8_t eui64[8], broadcast_timing_info_t *bc_timing_info)
42+
{
43+
return 0;
44+
}
45+
46+
int fhss_ws_remove_parent(fhss_structure_t *fhss_structure, const uint8_t eui64[8])
47+
{
48+
return 0;
49+
}

0 commit comments

Comments
 (0)