35
35
36
36
#define TRACE_GROUP "fhss"
37
37
38
+ static int fhss_reset (fhss_structure_t * fhss_structure );
39
+ static void fhss_destroy_scramble_table (fhss_structure_t * fhss_structure );
38
40
static bool fhss_is_bc_sending_superframe (fhss_structure_t * fhss_structure );
39
41
static bool fhss_check_remaining_tx_time (fhss_structure_t * fhss_structure , uint16_t tx_length , uint8_t phy_header_length , uint8_t phy_tail_length );
40
42
static bool fhss_is_there_common_divisor (uint16_t i , uint8_t j );
41
43
44
+ 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 )
45
+ {
46
+ if (!fhss_api || !fhss_configuration || !fhss_timer ) {
47
+ tr_err ("Invalid FHSS enable configuration" );
48
+ return NULL ;
49
+ }
50
+ int channel_count = channel_list_count_channels (fhss_configuration -> channel_mask );
51
+ if (channel_count <= 0 ) {
52
+ // There must be at least one configured channel in channel list
53
+ return NULL ;
54
+ }
55
+ fhss_structure_t * fhss_struct = fhss_allocate_instance (fhss_api , fhss_timer );
56
+ if (!fhss_struct ) {
57
+ return NULL ;
58
+ }
59
+ fhss_struct -> fhss_conf .fhss_configuration = * fhss_configuration ;
60
+ fhss_struct -> fhss_stats_ptr = fhss_statistics ;
61
+ fhss_struct -> number_of_channels = channel_count ;
62
+
63
+ // set a invalid id to tasklet_id, so we know that one is not started yet
64
+ fhss_struct -> beacon_tasklet_id = -1 ;
65
+
66
+ // Default synch interval is 240 seconds
67
+ if (!fhss_struct -> fhss_conf .fhss_configuration .fhss_max_synch_interval ) {
68
+ fhss_struct -> fhss_conf .fhss_configuration .fhss_max_synch_interval = 240 ;
69
+ }
70
+ ns_list_init (& fhss_struct -> fhss_failed_tx_list );
71
+ fhss_struct -> own_hop = 0xff ;
72
+ fhss_reset (fhss_struct );
73
+
74
+ if (fhss_beacon_create_tasklet (fhss_struct ) < 0 ) {
75
+ // XXX: should we free the fhss_structure here?
76
+ return NULL ;
77
+ }
78
+
79
+ return fhss_struct ;
80
+ }
81
+
42
82
bool fhss_is_synch_root (fhss_structure_t * fhss_structure )
43
83
{
44
84
if (fhss_structure -> own_hop > 0 ) {
@@ -219,7 +259,7 @@ static int fhss_update_drift_compensation(fhss_structure_t *fhss_structure)
219
259
bc_density = (fhss_structure -> number_of_channels / fhss_structure -> synch_configuration .fhss_number_of_bc_channels );
220
260
channel_dwell_time = ((uint32_t )fhss_structure -> synch_configuration .fhss_superframe_length * fhss_structure -> synch_configuration .fhss_number_of_superframes ) / 1000 ;
221
261
// Calculate last synchronisation period
222
- if (fhss_structure -> synch_interval != ((uint32_t )fhss_structure -> fhss_configuration .fhss_max_synch_interval * 1000 )) {
262
+ if (fhss_structure -> synch_interval != ((uint32_t )fhss_structure -> fhss_conf . fhss_configuration .fhss_max_synch_interval * 1000 )) {
223
263
// Last period was half of the current started period and max random period is shorter
224
264
synch_period = (fhss_structure -> synch_interval / 2 ) + (bc_density * channel_dwell_time ) * (fhss_structure -> synch_configuration .fhss_number_of_bc_channels / 2 );
225
265
} else {
@@ -358,14 +398,14 @@ int fhss_sync_with_beacon(fhss_structure_t *fhss_structure,
358
398
359
399
if (fhss_structure -> fhss_state == FHSS_SYNCHRONIZED ) {
360
400
if (fhss_update_synch_monitor (fhss_structure , payload , superframe_own , remaining_time_own , time_to_next_superframe )) {
361
- fhss_structure -> synch_interval = (uint32_t ) (fhss_structure -> fhss_configuration .fhss_max_synch_interval /BEACON_INTERVAL_INIT_DIVIDER ) * 1000 ;
401
+ fhss_structure -> synch_interval = (uint32_t ) (fhss_structure -> fhss_conf . fhss_configuration .fhss_max_synch_interval /BEACON_INTERVAL_INIT_DIVIDER ) * 1000 ;
362
402
}
363
403
}
364
404
365
- if (fhss_structure -> synch_interval != ((uint32_t )fhss_structure -> fhss_configuration .fhss_max_synch_interval * 1000 )) {
405
+ if (fhss_structure -> synch_interval != ((uint32_t )fhss_structure -> fhss_conf . fhss_configuration .fhss_max_synch_interval * 1000 )) {
366
406
fhss_structure -> synch_interval *= 2 ;
367
- if (fhss_structure -> synch_interval > ((uint32_t )fhss_structure -> fhss_configuration .fhss_max_synch_interval * 1000 )) {
368
- fhss_structure -> synch_interval = ((uint32_t )fhss_structure -> fhss_configuration .fhss_max_synch_interval * 1000 );
407
+ if (fhss_structure -> synch_interval > ((uint32_t )fhss_structure -> fhss_conf . fhss_configuration .fhss_max_synch_interval * 1000 )) {
408
+ fhss_structure -> synch_interval = ((uint32_t )fhss_structure -> fhss_conf . fhss_configuration .fhss_max_synch_interval * 1000 );
369
409
}
370
410
beacon_interval_random = (bc_density * channel_dwell_time ) * randLIB_get_random_in_range (0 , fhss_number_of_bc_channels /2 );
371
411
} else {
@@ -448,8 +488,8 @@ static bool fhss_check_remaining_tx_time(fhss_structure_t *fhss_structure, uint1
448
488
if (fhss_structure -> fhss_state == FHSS_UNSYNCHRONIZED ) {
449
489
retval = true;
450
490
} else {
451
- tx_processing_delay = fhss_structure -> fhss_configuration .fhss_tuning_parameters .tx_processing_delay ;
452
- ack_processing_delay = fhss_structure -> fhss_configuration .fhss_tuning_parameters .ack_processing_delay ;
491
+ tx_processing_delay = fhss_structure -> fhss_conf . fhss_configuration .fhss_tuning_parameters .tx_processing_delay ;
492
+ ack_processing_delay = fhss_structure -> fhss_conf . fhss_configuration .fhss_tuning_parameters .ack_processing_delay ;
453
493
// Calculate needed TX time (us): CCA static period + TX processing delays + transmission time + Ack processing delays + Ack transmission time
454
494
needed_tx_time = CCA_FHSS_PERIOD + tx_processing_delay + fhss_get_tx_time (fhss_structure , tx_length , phy_header_length , phy_tail_length )
455
495
+ ack_processing_delay + fhss_get_tx_time (fhss_structure , ACK_LENGTH , phy_header_length , phy_tail_length );
@@ -585,6 +625,35 @@ static int fhss_flush_beacon_info_storage(fhss_structure_t *fhss_structure)
585
625
return 0 ;
586
626
}
587
627
628
+ static int fhss_reset (fhss_structure_t * fhss_structure )
629
+ {
630
+ if (!fhss_structure ) {
631
+ return -1 ;
632
+ }
633
+ fhss_destroy_scramble_table (fhss_structure );
634
+ fhss_structure -> platform_functions .fhss_timer_stop (fhss_superframe_handler , fhss_structure -> fhss_api );
635
+ fhss_structure -> synch_panid = 0xffff ;
636
+ fhss_beacon_periodic_stop (fhss_structure );
637
+ fhss_structure -> current_superframe = 0 ;
638
+ fhss_structure -> current_channel_index = 0 ;
639
+ fhss_structure -> channel_list_counter = 0 ;
640
+ if (fhss_is_synch_root (fhss_structure ) == false) {
641
+ fhss_structure -> own_hop = 0xff ;
642
+ }
643
+ fhss_structure -> tx_allowed = false;
644
+ fhss_structure -> synch_interval = (uint32_t ) (fhss_structure -> fhss_conf .fhss_configuration .fhss_max_synch_interval /BEACON_INTERVAL_INIT_DIVIDER ) * 1000 ;
645
+ fhss_structure -> rx_channel = 0 ;
646
+ fhss_structure -> beacons_received_timer = 0 ;
647
+ memset (fhss_structure -> synch_parent , 0xff , 8 );
648
+ fhss_structure -> send_synch_info_on_next_broadcast_channel = false;
649
+ memset (& fhss_structure -> synch_configuration , 0 , sizeof (fhss_synch_configuration_t ));
650
+ fhss_structure -> synch_infos_sent_counter = 0 ;
651
+ fhss_structure -> broadcast_start_superframe = 0 ;
652
+ fhss_failed_list_free (fhss_structure );
653
+ fhss_structure -> fhss_state = FHSS_UNSYNCHRONIZED ;
654
+ return 0 ;
655
+ }
656
+
588
657
int fhss_add_beacon_info (fhss_structure_t * fhss_structure , uint16_t pan_id , uint8_t * source_address , uint32_t timestamp , uint8_t * synch_info )
589
658
{
590
659
if (!fhss_structure || !source_address || !synch_info ) {
@@ -669,7 +738,11 @@ static int fhss_handle_state_set(fhss_structure_t *fhss_structure, fhss_states f
669
738
670
739
if (fhss_state == FHSS_UNSYNCHRONIZED ) {
671
740
tr_debug ("FHSS down" );
672
- fhss_down (fhss_structure );
741
+ fhss_reset (fhss_structure );
742
+ fhss_reset_synch_monitor (& fhss_structure -> synch_monitor );
743
+ fhss_stats_update (fhss_structure , STATS_FHSS_DRIFT_COMP , fhss_structure -> synch_monitor .drift_compensation );
744
+ fhss_stats_update (fhss_structure , STATS_FHSS_AVG_SYNCH_FIX , fhss_structure -> synch_monitor .avg_synch_fix );
745
+ fhss_stats_update (fhss_structure , STATS_FHSS_SYNCH_INTERVAL , fhss_structure -> synch_interval / 1000 );
673
746
} else {
674
747
// Do not synchronize to current pan
675
748
if (fhss_structure -> synch_panid == pan_id ) {
@@ -711,7 +784,15 @@ static int fhss_handle_state_set(fhss_structure_t *fhss_structure, fhss_states f
711
784
return 0 ;
712
785
}
713
786
714
- static uint32_t fhss_get_compensation (fhss_structure_t * fhss_structure )
787
+ static void fhss_destroy_scramble_table (fhss_structure_t * fhss_structure )
788
+ {
789
+ if (fhss_structure -> fhss_scramble_table ) {
790
+ ns_dyn_mem_free (fhss_structure -> fhss_scramble_table );
791
+ fhss_structure -> fhss_scramble_table = NULL ;
792
+ }
793
+ }
794
+
795
+ static uint32_t fhss_get_sf_timeout_callback (fhss_structure_t * fhss_structure )
715
796
{
716
797
uint32_t compensation = 0 ;
717
798
/* Drift compensation doesn't work with Linux platform */
@@ -730,7 +811,7 @@ static uint32_t fhss_get_compensation(fhss_structure_t *fhss_structure)
730
811
#else
731
812
(void ) fhss_structure ;
732
813
#endif //__linux__
733
- return compensation ;
814
+ return ( fhss_structure -> synch_configuration . fhss_superframe_length ) + ( compensation * fhss_structure -> platform_functions . fhss_resolution_divider ) ;
734
815
}
735
816
736
817
static void fhss_superframe_callback (fhss_structure_t * fhss_structure )
@@ -850,7 +931,7 @@ int fhss_set_callbacks(fhss_structure_t *fhss_structure)
850
931
// Set internal API
851
932
fhss_structure -> update_channel = fhss_update_channel_callback ;
852
933
fhss_structure -> update_superframe = fhss_superframe_callback ;
853
- fhss_structure -> read_compensation = fhss_get_compensation ;
934
+ fhss_structure -> read_superframe_timeout = fhss_get_sf_timeout_callback ;
854
935
fhss_structure -> handle_state_set = fhss_handle_state_set ;
855
936
return 0 ;
856
937
}
0 commit comments