@@ -59,16 +59,23 @@ fhss_structure_t *fhss_enable(fhss_api_t *fhss_api, const fhss_configuration_t *
59
59
if (!fhss_struct ) {
60
60
return NULL ;
61
61
}
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 ;
63
70
fhss_struct -> fhss_stats_ptr = fhss_statistics ;
64
71
fhss_struct -> number_of_channels = channel_count ;
65
72
66
73
// set a invalid id to tasklet_id, so we know that one is not started yet
67
74
fhss_struct -> beacon_tasklet_id = -1 ;
68
75
69
76
// 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 ;
72
79
}
73
80
ns_list_init (& fhss_struct -> fhss_failed_tx_list );
74
81
fhss_struct -> own_hop = 0xff ;
@@ -262,7 +269,7 @@ static int fhss_update_drift_compensation(fhss_structure_t *fhss_structure)
262
269
bc_density = (fhss_structure -> number_of_channels / fhss_structure -> synch_configuration .fhss_number_of_bc_channels );
263
270
channel_dwell_time = ((uint32_t )fhss_structure -> synch_configuration .fhss_superframe_length * fhss_structure -> synch_configuration .fhss_number_of_superframes ) / 1000 ;
264
271
// 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 )) {
266
273
// Last period was half of the current started period and max random period is shorter
267
274
synch_period = (fhss_structure -> synch_interval / 2 ) + (bc_density * channel_dwell_time ) * (fhss_structure -> synch_configuration .fhss_number_of_bc_channels / 2 );
268
275
} else {
@@ -401,14 +408,14 @@ static int fhss_sync_with_beacon(fhss_structure_t *fhss_structure,
401
408
402
409
if (fhss_structure -> fhss_state == FHSS_SYNCHRONIZED ) {
403
410
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 ;
405
412
}
406
413
}
407
414
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 )) {
409
416
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 );
412
419
}
413
420
beacon_interval_random = (bc_density * channel_dwell_time ) * randLIB_get_random_in_range (0 , fhss_number_of_bc_channels /2 );
414
421
} else {
@@ -491,8 +498,8 @@ static bool fhss_check_remaining_tx_time(fhss_structure_t *fhss_structure, uint1
491
498
if (fhss_structure -> fhss_state == FHSS_UNSYNCHRONIZED ) {
492
499
retval = true;
493
500
} 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 ;
496
503
// Calculate needed TX time (us): CCA static period + TX processing delays + transmission time + Ack processing delays + Ack transmission time
497
504
needed_tx_time = CCA_FHSS_PERIOD + tx_processing_delay + fhss_get_tx_time (fhss_structure , tx_length , phy_header_length , phy_tail_length )
498
505
+ 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)
644
651
fhss_structure -> own_hop = 0xff ;
645
652
}
646
653
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 ;
648
655
fhss_structure -> rx_channel = 0 ;
649
656
fhss_structure -> beacons_received_timer = 0 ;
650
657
memset (fhss_structure -> synch_parent , 0xff , 8 );
@@ -807,7 +814,7 @@ static void fhss_beacon_received(fhss_structure_t *fhss_structure, const uint8_t
807
814
808
815
if (synch_info ) {
809
816
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 ;
811
818
fhss_beacon_decode (& temp_payload , synch_info , elapsed_time , fhss_structure -> number_of_channels );
812
819
813
820
// use the received information
@@ -985,7 +992,7 @@ static bool fhss_data_tx_fail_callback(const fhss_api_t *api, uint8_t handle, in
985
992
return false;
986
993
}
987
994
// 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 ) {
989
996
return false;
990
997
}
991
998
// 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
996
1003
fhss_failed_tx_t * fhss_failed_tx = fhss_failed_handle_find (fhss_structure , handle );
997
1004
if (fhss_failed_tx ) {
998
1005
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 ) {
1000
1007
// No more retries. Return false to stop retransmitting.
1001
1008
fhss_failed_handle_remove (fhss_structure , handle );
1002
1009
return false;
0 commit comments