|
35 | 35 |
|
36 | 36 | #define TRACE_GROUP "fhss"
|
37 | 37 |
|
| 38 | +static int fhss_reset(fhss_structure_t *fhss_structure); |
38 | 39 | static void fhss_destroy_scramble_table(fhss_structure_t *fhss_structure);
|
39 | 40 | static bool fhss_is_bc_sending_superframe(fhss_structure_t *fhss_structure);
|
40 | 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);
|
@@ -68,19 +69,7 @@ fhss_structure_t *fhss_enable(fhss_api_t *fhss_api, const fhss_configuration_t *
|
68 | 69 | }
|
69 | 70 | ns_list_init(&fhss_struct->fhss_failed_tx_list);
|
70 | 71 | fhss_struct->own_hop = 0xff;
|
71 |
| - fhss_destroy_scramble_table(fhss_struct); |
72 |
| - fhss_struct->platform_functions.fhss_timer_stop(fhss_superframe_handler, fhss_struct->fhss_api); |
73 |
| - fhss_struct->synch_panid = 0xffff; |
74 |
| - fhss_beacon_periodic_stop(fhss_struct); |
75 |
| - if (fhss_is_synch_root(fhss_struct) == false) { |
76 |
| - fhss_struct->own_hop = 0xff; |
77 |
| - } |
78 |
| - fhss_struct->tx_allowed = false; |
79 |
| - fhss_struct->synch_interval = (uint32_t) (fhss_struct->fhss_configuration.fhss_max_synch_interval/BEACON_INTERVAL_INIT_DIVIDER) * 1000; |
80 |
| - memset(fhss_struct->synch_parent, 0xff, 8); |
81 |
| - fhss_struct->send_synch_info_on_next_broadcast_channel = false; |
82 |
| - fhss_failed_list_free(fhss_struct); |
83 |
| - fhss_struct->fhss_state = FHSS_UNSYNCHRONIZED; |
| 72 | + fhss_reset(fhss_struct); |
84 | 73 |
|
85 | 74 | if (fhss_beacon_create_tasklet(fhss_struct) < 0) {
|
86 | 75 | // XXX: should we free the fhss_structure here?
|
@@ -636,6 +625,35 @@ static int fhss_flush_beacon_info_storage(fhss_structure_t *fhss_structure)
|
636 | 625 | return 0;
|
637 | 626 | }
|
638 | 627 |
|
| 628 | +static int fhss_reset(fhss_structure_t *fhss_structure) |
| 629 | +{ |
| 630 | + if (fhss_structure) { |
| 631 | + fhss_destroy_scramble_table(fhss_structure); |
| 632 | + fhss_structure->platform_functions.fhss_timer_stop(fhss_superframe_handler, fhss_structure->fhss_api); |
| 633 | + fhss_structure->synch_panid = 0xffff; |
| 634 | + fhss_beacon_periodic_stop(fhss_structure); |
| 635 | + fhss_structure->current_superframe = 0; |
| 636 | + fhss_structure->current_channel_index = 0; |
| 637 | + fhss_structure->channel_list_counter = 0; |
| 638 | + if (fhss_is_synch_root(fhss_structure) == false) { |
| 639 | + fhss_structure->own_hop = 0xff; |
| 640 | + } |
| 641 | + fhss_structure->tx_allowed = false; |
| 642 | + fhss_structure->synch_interval = (uint32_t) (fhss_structure->fhss_configuration.fhss_max_synch_interval/BEACON_INTERVAL_INIT_DIVIDER) * 1000; |
| 643 | + fhss_structure->rx_channel = 0; |
| 644 | + fhss_structure->beacons_received_timer = 0; |
| 645 | + memset(fhss_structure->synch_parent, 0xff, 8); |
| 646 | + fhss_structure->send_synch_info_on_next_broadcast_channel = false; |
| 647 | + memset(&fhss_structure->synch_configuration, 0, sizeof(fhss_synch_configuration_t)); |
| 648 | + fhss_structure->synch_infos_sent_counter = 0; |
| 649 | + fhss_structure->broadcast_start_superframe = 0; |
| 650 | + fhss_failed_list_free(fhss_structure); |
| 651 | + fhss_structure->fhss_state = FHSS_UNSYNCHRONIZED; |
| 652 | + return 0; |
| 653 | + } |
| 654 | + return -1; |
| 655 | +} |
| 656 | + |
639 | 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)
|
640 | 658 | {
|
641 | 659 | if (!fhss_structure || !source_address || !synch_info) {
|
@@ -720,7 +738,11 @@ static int fhss_handle_state_set(fhss_structure_t *fhss_structure, fhss_states f
|
720 | 738 |
|
721 | 739 | if (fhss_state == FHSS_UNSYNCHRONIZED) {
|
722 | 740 | tr_debug("FHSS down");
|
723 |
| - 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); |
724 | 746 | } else {
|
725 | 747 | // Do not synchronize to current pan
|
726 | 748 | if (fhss_structure->synch_panid == pan_id) {
|
|
0 commit comments