diff options
author | Harsh Sharma <harsh.sharma@multitech.com> | 2019-09-10 15:43:13 -0500 |
---|---|---|
committer | Harsh Sharma <harsh.sharma@multitech.com> | 2019-09-10 15:43:13 -0500 |
commit | b87daded156a82be522b9de16e61f8d433212811 (patch) | |
tree | f9f56db26db735dbcda6bfcf5e99635e5d82f88f | |
parent | 85d14240291277e9484e319cc5eb20ea58e21f52 (diff) | |
download | packet_forwarder_mtac_full-b87daded156a82be522b9de16e61f8d433212811.tar.gz packet_forwarder_mtac_full-b87daded156a82be522b9de16e61f8d433212811.tar.bz2 packet_forwarder_mtac_full-b87daded156a82be522b9de16e61f8d433212811.zip |
Revert "Added Spectral Scan Thead"
This reverts commit 85d14240291277e9484e319cc5eb20ea58e21f52
-rw-r--r-- | lora_pkt_fwd/src/lora_pkt_fwd.c | 550 |
1 files changed, 8 insertions, 542 deletions
diff --git a/lora_pkt_fwd/src/lora_pkt_fwd.c b/lora_pkt_fwd/src/lora_pkt_fwd.c index 9da3812..ca19e28 100644 --- a/lora_pkt_fwd/src/lora_pkt_fwd.c +++ b/lora_pkt_fwd/src/lora_pkt_fwd.c @@ -45,8 +45,6 @@ Maintainer: Michael Coracin #include <arpa/inet.h> /* IP address conversion stuff */ #include <netdb.h> /* gai_strerror */ -#include <spawn.h> -#include <sys/wait.h> #include <pthread.h> #include "trace.h" @@ -58,8 +56,6 @@ Maintainer: Michael Coracin #include "loragw_gps.h" #include "loragw_aux.h" #include "loragw_reg.h" -#include "loragw_radio.h" -#include "loragw_fpga.h" /* -------------------------------------------------------------------------- */ /* --- PRIVATE MACROS ------------------------------------------------------- */ @@ -105,11 +101,12 @@ Maintainer: Michael Coracin #define MIN_FSK_PREAMB 3 /* minimum FSK preamble length for this application */ #define STD_FSK_PREAMB 5 -#define STATUS_SIZE 50000 +#define STATUS_SIZE 200 #define TX_BUFF_SIZE ((540 * NB_PKT_MAX) + 30 + STATUS_SIZE) #define UNIX_GPS_EPOCH_OFFSET 315964800 /* Number of seconds ellapsed between 01.Jan.1970 00:00:00 and 06.Jan.1980 00:00:00 */ + #define DEFAULT_BEACON_FREQ_HZ 869525000 #define DEFAULT_BEACON_FREQ_NB 1 #define DEFAULT_BEACON_FREQ_STEP 0 @@ -118,29 +115,6 @@ Maintainer: Michael Coracin #define DEFAULT_BEACON_POWER 14 #define DEFAULT_BEACON_INFODESC 0 -#define DEFAULT_freq_START 867000000 /* start frequency, Hz */ -#define DEFAULT_freq_STOP 870000000 /* stop frequency, Hz */ -#define DEFAULT_freq_step 1000000 /* frequency step, Hz */ -#define DEFAULT_SAMPLES 65535 /* number of RSSI reads */ -#define DEFAULT_CHAN_BW LGW_SX127X_RXBW_62K5_HZ /* channel bandwidth */ -#define DEFAULT_SX127X_RSSI_OFFSET -120 - -#define RSSI_RANGE 256 - -#define MAX_FREQ 1000000000 -#define MIN_FREQ 800000000 -#define MIN_freq_step 5000 - -#define FPGA_FEATURE_SPECTRAL_SCAN 1 -#define FPGA_FEATURE_LBT 2 - -/* When FPGA supports LBT, there are few more constraints on above constants */ -#define LBT_DEFAULT_SAMPLES 129*129 /* number of RSSI reads, hard-coded in FPGA*/ -#define LBT_MIN_FREQ_STEP 100000 - -#define HISTOGRAM_CLEAN_TIMEOUT 10000 -#define HISTOGRAM_READY_TIMEOUT 1000 - /* -------------------------------------------------------------------------- */ /* --- PRIVATE VARIABLES (GLOBAL) ------------------------------------------- */ @@ -235,26 +209,6 @@ static struct coord_s meas_gps_err; /* GPS position of the gateway */ static pthread_mutex_t mx_stat_rep = PTHREAD_MUTEX_INITIALIZER; /* control access to the status report */ static bool report_ready = false; /* true when there is a new report to send to the server */ static char status_report[STATUS_SIZE]; /* status report as a JSON object */ -static char serialized_string[STATUS_SIZE]; - -/* spectral scan parameters */ -static pthread_mutex_t mx_scan_config = PTHREAD_MUTEX_INITIALIZER; /* control access to the spectral scan config */ -static pthread_mutex_t mx_scan_report = PTHREAD_MUTEX_INITIALIZER; /* control access to the spectral scan config */ -static bool scan_ready = false; /* true when there is a new report to send to the server */ -static char scan_report[STATUS_SIZE]; /* status report as a JSON object */ - -struct scan_config_s -{ - uint32_t freq_init; - uint32_t freq_start; - uint32_t freq_stop; - uint32_t freq_step; - uint16_t samples; - int8_t rssi_floor; - int8_t rssi_offset; - enum lgw_sx127x_rxbw_e channel_bw_khz; - bool read; -} scan_config, scan_config_new, scan_config_update; /* beacon parameters */ static uint32_t beacon_period = 0; /* set beaconing period, must be a sub-multiple of 86400, the nb of sec in a day */ @@ -304,141 +258,10 @@ void thread_gps(void); void thread_valid(void); void thread_jit(void); void thread_timersync(void); -void thread_spectralscan(void); - -extern char **environ; - /* -------------------------------------------------------------------------- */ /* --- PRIVATE FUNCTIONS DEFINITION ----------------------------------------- */ -static uint8_t map_bandwidth(enum lgw_sx127x_rxbw_e channel_bw_khz){ - switch (channel_bw_khz) { - case LGW_SX127X_RXBW_12K5_HZ: - return 25; - case LGW_SX127X_RXBW_25K_HZ: - return 50; - case LGW_SX127X_RXBW_50K_HZ: - return 100; - case LGW_SX127X_RXBW_62K5_HZ: - return 125; - case LGW_SX127X_RXBW_100K_HZ: - return 200; - case LGW_SX127X_RXBW_125K_HZ: - return 250; - case LGW_SX127X_RXBW_250K_HZ: - return 500; - default: - printf("ERROR: Invalid bandwidth.\n"); - return -1; - } -} - -static int reset_fpga(bool lbt_support, uint16_t samples) { - int x; - /* Reconnect to FPGA with sw reset and configure */ - x = lgw_disconnect(); - if(x != 0) { - printf("ERROR: Failed to disconnect from FPGA\n"); - return EXIT_FAILURE; - } - x = lgw_connect(false, LGW_DEFAULT_NOTCH_FREQ); /* FPGA reset/configure */ - if(x != 0) { - printf("ERROR: Failed to connect to FPGA\n"); - return EXIT_FAILURE; - } - if (lbt_support == false) { - x = lgw_fpga_reg_w(LGW_FPGA_HISTO_NB_READ, samples-1); - if( x != LGW_REG_SUCCESS ) - { - printf( "ERROR: Failed to configure FPGA\n" ); - return EXIT_FAILURE; - } - } - return EXIT_SUCCESS; -} - -static int setup_spectral_scan(bool *lbt_support, uint64_t *freq_reg, uint32_t *freq_nb) { - - int x; /* return code for functions */ - int32_t reg_val; - - /* Check if FPGA supports Spectral Scan */ - lgw_fpga_reg_r(LGW_FPGA_FEATURE, ®_val); - if (TAKE_N_BITS_FROM((uint8_t)reg_val, FPGA_FEATURE_SPECTRAL_SCAN, 1) != true) { - printf("ERROR: Spectral Scan is not supported (0x%x)\n", (uint8_t)reg_val); - return EXIT_FAILURE; - } - - /* Check if FPGA supports LBT, in order to apply proper constraints on spectral scan parameters */ - lgw_fpga_reg_r(LGW_FPGA_FEATURE, ®_val); - - if (TAKE_N_BITS_FROM((uint8_t)reg_val, FPGA_FEATURE_LBT, 1) == true) { - printf("WARNING: The FPGA supports LBT, so running spectral scan with specific constraints\n"); - printf(" => Check the parameters summary below\n"); - /* Get start frequency from FPGA */ - lgw_fpga_reg_r(LGW_FPGA_LBT_INITIAL_FREQ, ®_val); - switch (reg_val) { - case 0: - scan_config.freq_init = 915000000; - break; - case 1: - scan_config.freq_init = 863000000; - break; - default: - printf("ERROR: init frequency %d is not supported\n", reg_val); - return EXIT_FAILURE; - } - - /* Check parameters based on LBT constraints */ - if (scan_config.freq_start < scan_config.freq_init) { - printf("ERROR: start frequency %d is not supported, should be >=%d\n", scan_config.freq_start, scan_config.freq_init); - return EXIT_FAILURE; - } - if (scan_config.freq_stop > (scan_config.freq_init + 255*LBT_MIN_FREQ_STEP)) { - printf("ERROR: stop frequency %d is not supported, should be <%d\n", scan_config.freq_stop, scan_config.freq_init + 255*LBT_MIN_FREQ_STEP); - return EXIT_FAILURE; - } - if (scan_config.freq_step < LBT_MIN_FREQ_STEP) { - printf("ERROR: step frequency %d is not supported, should be >=%d\n", scan_config.freq_step, LBT_MIN_FREQ_STEP); - return EXIT_FAILURE; - } else { - /* Ensure the given step is a multiple of LBT_MIN_FREQ_STEP */ - scan_config.freq_step = (scan_config.freq_step / LBT_MIN_FREQ_STEP) * LBT_MIN_FREQ_STEP; - } - - /* Overload hard-coded spectral scan parameters */ - scan_config.samples = LBT_DEFAULT_SAMPLES; - - /* Spectral scan sequence is slightly different depending if LBT is there or not */ - *lbt_support = true; - } else { - /* Reconnect to FPGA with sw reset and configure */ - x = lgw_disconnect(); - if(x != 0) { - printf("ERROR: Failed to disconnect from FPGA\n"); - return EXIT_FAILURE; - } - x = lgw_connect(false, LGW_DEFAULT_NOTCH_FREQ); /* FPGA reset/configure */ - if(x != 0) { - printf("ERROR: Failed to connect to FPGA\n"); - return EXIT_FAILURE; - } - /* Some spectral scan options are only available when there is no LBT support */ - x = lgw_fpga_reg_w(LGW_FPGA_HISTO_NB_READ, scan_config.samples-1); - if( x != LGW_REG_SUCCESS ) - { - printf( "ERROR: Failed to configure FPGA\n" ); - return EXIT_FAILURE; - } - - /* Initialize frequency */ - *freq_reg = ((uint64_t)scan_config.freq_start << 19) / (uint64_t)32000000; - lgw_fpga_reg_w(LGW_FPGA_HISTO_SCAN_FREQ, (int32_t)freq_reg); - } - *freq_nb = (uint32_t)((scan_config.freq_stop - scan_config.freq_start) / scan_config.freq_step) + 1; -} - static void sig_handler(int sigio) { if (sigio == SIGQUIT) { quit_sig = true; @@ -670,7 +493,8 @@ static int parse_SX1301_configuration(const char * conf_file) { } if (rfconf.enable == false) { /* radio disabled, nothing else to parse */ MSG("INFO: radio %i disabled\n", i); - } else { /* radio enabled, will parse the other parameters */ + } +// } else { /* radio enabled, will parse the other parameters */ snprintf(param_name, sizeof param_name, "radio_%i.freq", i); rfconf.freq_hz = (uint32_t)json_object_dotget_number(conf_obj, param_name); snprintf(param_name, sizeof param_name, "radio_%i.rssi_offset", i); @@ -704,8 +528,8 @@ static int parse_SX1301_configuration(const char * conf_file) { } else { rfconf.tx_enable = false; } - MSG("INFO: radio %i enabled (type %s), center frequency %u, RSSI offset %f, tx enabled %d, tx_notch_freq %u\n", i, str, rfconf.freq_hz, rfconf.rssi_offset, rfconf.tx_enable, rfconf.tx_notch_freq); - } + MSG("INFO: radio %i %sabled (type %s), center frequency %u, RSSI offset %f, tx enabled %d, tx_notch_freq %u\n", i, (rfconf.enable?"en":"dis"), str, rfconf.freq_hz, rfconf.rssi_offset, rfconf.tx_enable, rfconf.tx_notch_freq); +// } /* all parameters parsed, submitting configuration to the HAL */ if (lgw_rxrf_setconf(i, rfconf) != LGW_HAL_SUCCESS) { MSG("ERROR: invalid configuration for radio %i\n", i); @@ -1168,6 +992,7 @@ int main(void) char *global_cfg_path= "global_conf.json"; /* contain global (typ. network-wide) configuration */ char *local_cfg_path = "local_conf.json"; /* contain node specific configuration, overwrite global parameters for parameters that are defined in both */ char *debug_cfg_path = "debug_conf.json"; /* if present, all other configuration files are ignored */ + /* threads */ pthread_t thrid_up; pthread_t thrid_down; @@ -1175,7 +1000,6 @@ int main(void) pthread_t thrid_valid; pthread_t thrid_jit; pthread_t thrid_timersync; - pthread_t thrid_spectralscan; /* network socket creation */ struct addrinfo hints; @@ -1425,13 +1249,6 @@ int main(void) } } - i = pthread_create( &thrid_spectralscan, NULL, (void * (*)(void *))thread_spectralscan, NULL); - if (i != 0) { - MSG("ERROR: [main] impossible to create spectral scan thread\n"); - exit(EXIT_FAILURE); - } - - /* configure signal handling */ sigemptyset(&sigact.sa_mask); sigact.sa_flags = 0; @@ -1618,8 +1435,6 @@ int main(void) } } - pthread_join(thrid_spectralscan, NULL); /* don't wait for spec scan thread */ - /* if an exit signal was received, try to quit properly */ if (exit_sig) { /* shut down network sockets */ @@ -2037,21 +1852,6 @@ void thread_up(void) { exit(EXIT_FAILURE); } } - if (scan_ready == true) { - pthread_mutex_lock(&mx_scan_report); - j = snprintf((char *)(buff_up + buff_index), TX_BUFF_SIZE-buff_index, ",\"spectral_scan\":%s", serialized_string); - scan_ready = false; - pthread_mutex_unlock(&mx_scan_report); - if (j > 0) { - buff_index += j; - } else { - MSG("ERROR: [up] snprintf failed line %u\n", (__LINE__ - 5)); - exit(EXIT_FAILURE); - } - } else { - MSG("HARSH: Spec Scan not ready"); - pthread_mutex_unlock(&mx_scan_report); - } /* end of JSON datagram payload */ buff_up[buff_index] = '}'; @@ -2121,7 +1921,6 @@ void thread_down(void) { /* JSON parsing variables */ JSON_Value *root_val = NULL; JSON_Object *txpk_obj = NULL; - JSON_Object *specscan_obj = NULL; JSON_Value *val = NULL; /* needed to detect the absence of some fields */ const char *str; /* pointer to sub-strings in the JSON data */ short x0, x1; @@ -2453,61 +2252,12 @@ void thread_down(void) { /* look for JSON sub-object 'txpk' */ txpk_obj = json_object_get_object(json_value_get_object(root_val), "txpk"); - specscan_obj = json_object_get_object(json_value_get_object(root_val), "scan"); - if (txpk_obj == NULL && specscan_obj == NULL) { + if (txpk_obj == NULL) { MSG("WARNING: [down] no \"txpk\" object in JSON, TX aborted\n"); json_value_free(root_val); continue; } - if (specscan_obj != NULL) { - bool valid_config = true; - val = json_object_get_value(specscan_obj, "freq_start"); /* fetch value (if possible) */ - if (json_value_get_type(val) == JSONNumber) { - scan_config_update.freq_start = (uint32_t)json_value_get_number(val); - } else { - MSG("INFO: [down] freq_start is not a number, ignoring scan config\n"); - valid_config = false; - } - val = json_object_get_value(specscan_obj, "freq_stop"); /* fetch value (if possible) */ - if (json_value_get_type(val) == JSONNumber) { - scan_config_update.freq_stop = (uint32_t)json_value_get_number(val); - } else { - MSG("INFO: [down] freq_stop is not a number, ignoring scan config\n"); - valid_config = false; - } - val = json_object_get_value(specscan_obj, "freq_step"); /* fetch value (if possible) */ - if (json_value_get_type(val) == JSONNumber) { - scan_config_update.freq_step = (uint32_t)json_value_get_number(val); - } else { - MSG("INFO: [down] freq_step is not a number, ignoring scan config\n"); - valid_config = false; - } - val = json_object_get_value(specscan_obj, "samples"); /* fetch value (if possible) */ - if (json_value_get_type(val) == JSONNumber) { - scan_config_update.samples = (uint32_t)json_value_get_number(val); - } else { - MSG("INFO: [down] freq_step is not a number, ignoring scan config\n"); - valid_config = false; - } - val = json_object_get_value(specscan_obj, "rssi_offset"); /* fetch value (if possible) */ - if (json_value_get_type(val) == JSONNumber) { - scan_config_update.rssi_offset = (uint32_t)json_value_get_number(val); - } else { - MSG("INFO: [down] freq_step is not a number, ignoring scan config\n"); - valid_config = false; - } - scan_config_update.channel_bw_khz = DEFAULT_CHAN_BW; - scan_config_update.read = false; - pthread_mutex_lock(&mx_scan_config); - if (valid_config) { - scan_config_new = scan_config_update; - } - pthread_mutex_unlock(&mx_scan_config); - - } else { - MSG("INFO: [down] spec scan object is not valid\n"); - } /* Parse "immediate" tag, or target timestamp, or UTC time to be converted by GPS (mandatory) */ i = json_object_get_boolean(txpk_obj,"imme"); /* can be 1 if true, 0 if false, or -1 if not a JSON boolean */ if (i == 1) { @@ -3143,288 +2893,4 @@ void thread_valid(void) { MSG("\nINFO: End of validation thread\n"); } -/* -------------------------------------------------------------------------- */ -/* --- THREAD 6: Spectral Scan --- */ - -void thread_spectralscan(void) { - struct timeval tv; - /* Application parameters */ - int i, j, k; /* loop and temporary variables */ - int x; /* return code for functions */ - int32_t reg_val; - - /* Parameter parsing */ - double arg_lf[3] = {0,0,0}; - unsigned arg_u = 0; - int arg_i = 0; - char arg_s[64]; - - /* Application parameters */ - - /* Local var */ - bool lbt_support = false; - bool do_scan = false; - uint16_t histogram_clean_retry = 0; - uint16_t histogram_ready_retry = 0; - uint16_t histogram_clean_counter = 0; - uint16_t histogram_ready_counter = 0; - uint16_t retry_limit = 5; - int freq_idx; - uint32_t freq_nb; - int old_min = -1; - uint64_t freq_reg; - uint32_t freq; - uint8_t read_burst[RSSI_RANGE*2]; - uint16_t rssi_histo; - uint16_t rssi_cumu; - - - scan_config.freq_init = DEFAULT_freq_START; - scan_config.freq_start = DEFAULT_freq_START; - scan_config.freq_stop = DEFAULT_freq_STOP; - scan_config.freq_step = DEFAULT_freq_step; - scan_config.samples = DEFAULT_SAMPLES; - scan_config.rssi_offset = DEFAULT_SX127X_RSSI_OFFSET; - scan_config.channel_bw_khz = DEFAULT_CHAN_BW; - scan_config.read = false; - pthread_mutex_lock(&mx_scan_config); - scan_config_new = scan_config; - pthread_mutex_unlock(&mx_scan_config); - - while (!exit_sig && !quit_sig) { - gettimeofday(&tv, NULL); - // Form the seconds of the day - long hms = tv.tv_sec % 86400; - int hour = hms / 3600; - int min = (hms % 3600) / 60; - int sec = (hms % 3600) % 60; // or hms % SEC_PER_MIN - if (min != old_min) { - pthread_mutex_lock(&mx_scan_config); - if (scan_config_new.read == false) { - scan_config = scan_config_new; - scan_config_new.read = true; - } - pthread_mutex_unlock(&mx_scan_config); - /* Main loop */ - setup_spectral_scan(&lbt_support, &freq_reg, &freq_nb); - JSON_Value *root_value = json_value_init_object(); - JSON_Object *root_object = json_value_get_object(root_value); - JSON_Array *interests_arr = NULL; - json_object_set_number(root_object, "bandwidth", map_bandwidth(scan_config.channel_bw_khz)); - char eui[17]; - sprintf(&eui[0], "%016llX", lgwm); - json_object_set_string(root_object, "eui", eui); - json_object_set_value(root_object, "results", json_value_init_array()); - interests_arr = json_object_get_array(root_object, "results"); - json_object_set_number(root_object, "freq_start", scan_config.freq_start); - json_object_set_number(root_object, "freq_stop", scan_config.freq_stop); - json_object_set_number(root_object, "freq_inc", scan_config.freq_step); - json_object_set_number(root_object, "rssi_floor", -160); - json_object_set_number(root_object, "rssi_offset", scan_config.rssi_offset); - json_object_set_number(root_object, "samples", scan_config.samples); - - struct timespec t1; - time_t t; - t = time(NULL); - clock_gettime(CLOCK_MONOTONIC, &t1); - char scan_timestamp[24]; - strftime(scan_timestamp, sizeof scan_timestamp, "%F %T %Z", gmtime(&t)); - json_object_set_string(root_object, "time", scan_timestamp); - for(j = 0; j < freq_nb; j++) { - /* Current frequency */ - if (exit_sig || quit_sig) exit(EXIT_FAILURE); - freq = scan_config.freq_start + j * scan_config.freq_step; - struct timespec t2; - clock_gettime(CLOCK_MONOTONIC, &t2); - - // double scan_time = difftimespec(t2, t1); - int scan_time = (int)(1000 * difftimespec(t2, t1)); - if (lbt_support == false) { - /* Set SX127x */ - x = lgw_setup_sx127x(freq, MOD_FSK, scan_config.channel_bw_khz, 0); - if( x != 0 ) { - MSG( "ERROR: SX127x setup failed\n" ); - exit(EXIT_FAILURE); - } - - /* Start FPGA state machine for spectral scal */ - lgw_fpga_reg_w(LGW_FPGA_CTRL_FEATURE_START, 1); - } else { - /* Do Nothing */ - /* LBT setup has already done the necessary */ - } - - /* Clean histogram */ - lgw_fpga_reg_w(LGW_FPGA_CTRL_CLEAR_HISTO_MEM, 1); - uint8_t reg_stat_old = 255; - uint8_t reg_stat_new; - /* Wait for histogram clean to start */ - do { - if (histogram_clean_counter > HISTOGRAM_CLEAN_TIMEOUT) { - reg_stat_new = reg_val; - if (reg_stat_new != reg_stat_old) { - MSG("reg_val:%u\n", reg_val); - } - reg_stat_old = reg_stat_new; - if (histogram_clean_retry >= retry_limit) { - printf("\nRetry limit reached. Exiting"); - setup_spectral_scan(&lbt_support, &freq_reg, &freq_nb); - - } else { - printf(" - ERROR: Histogram clean timed out! Resetting FPGA and trying again\n"); - x = reset_fpga(lbt_support, scan_config.samples); - if( x != 0 ) { - printf( "ERROR: SX127x reset failed\n" ); - setup_spectral_scan(&lbt_support, &freq_reg, &freq_nb); - } - lgw_fpga_reg_w(LGW_FPGA_CTRL_CLEAR_HISTO_MEM, 1); - if (lbt_support == false) { - x = lgw_setup_sx127x(freq, MOD_FSK, scan_config.channel_bw_khz, 0); - if( x != 0 ) { - printf( "ERROR: SX127x setup failed\n" ); - // return EXIT_FAILURE; - } - lgw_fpga_reg_w(LGW_FPGA_CTRL_FEATURE_START, 1); - } - histogram_clean_counter = 0; - histogram_clean_retry++; - printf("%d", freq); - } - } - wait_ms(10); - lgw_fpga_reg_r(LGW_FPGA_STATUS, ®_val); - histogram_clean_counter++; - } - while((TAKE_N_BITS_FROM((uint8_t)reg_val, 0, 5)) != 1); /* Clear has started */ - - /* Set scan frequency during clear process */ - if (lbt_support == false) { - /* We can directly set the scan frequency */ - freq_reg = ((uint64_t)freq << 19) / (uint64_t)32000000; - lgw_fpga_reg_w(LGW_FPGA_HISTO_SCAN_FREQ, (int32_t)freq_reg); - } else { - /* The possible scan frequencies are hard-coded in FPGA, we give an offset from freq_init */ - freq_idx = (freq - scan_config.freq_init) / LBT_MIN_FREQ_STEP; - MSG(" (idx=%i) ", freq_idx); - lgw_fpga_reg_w(LGW_FPGA_SCAN_FREQ_OFFSET, freq_idx); - } - - /* Release FPGA state machine */ - lgw_fpga_reg_w(LGW_FPGA_CTRL_CLEAR_HISTO_MEM, 0); - - /* Wait for histogram ready */ - do { - if (histogram_ready_counter > HISTOGRAM_READY_TIMEOUT) { - if (histogram_ready_retry >= retry_limit) { - MSG("\nRetry limit reached. Exiting"); - setup_spectral_scan(&lbt_support, &freq_reg, &freq_nb); - } else { - MSG(" - ERROR: Histogram ready timed out! Resetting FPGA and trying again\n"); - x = reset_fpga(lbt_support, scan_config.samples); - if( x != 0 ) { - MSG( "ERROR: SX127x reset failed\n" ); - exit(EXIT_FAILURE); - } - lgw_fpga_reg_w(LGW_FPGA_CTRL_CLEAR_HISTO_MEM, 1); - if (lbt_support == false) { - x = lgw_setup_sx127x(freq, MOD_FSK, scan_config.channel_bw_khz, 0); - if( x != 0 ) { - MSG( "ERROR: SX127x setup failed\n" ); - exit(EXIT_FAILURE); - - } - lgw_fpga_reg_w(LGW_FPGA_CTRL_FEATURE_START, 1); - } - histogram_ready_counter = 0; - histogram_ready_retry++; - printf("%d", freq); - if (lbt_support == false) { - freq_reg = ((uint64_t)freq << 19) / (uint64_t)32000000; - lgw_fpga_reg_w(LGW_FPGA_HISTO_SCAN_FREQ, (int32_t)freq_reg); - } else { - freq_idx = (freq - scan_config.freq_init) / LBT_MIN_FREQ_STEP; - MSG(" (idx=%i) ", freq_idx); - lgw_fpga_reg_w(LGW_FPGA_SCAN_FREQ_OFFSET, freq_idx); - } - lgw_fpga_reg_w(LGW_FPGA_CTRL_CLEAR_HISTO_MEM, 0); - } - } - wait_ms(1000); - lgw_fpga_reg_r(LGW_FPGA_STATUS, ®_val); - histogram_ready_counter++; - } - while((TAKE_N_BITS_FROM((uint8_t)reg_val, 5, 1)) != 1); - - if (lbt_support == false) { - /* Stop FPGA state machine for spectral scan */ - lgw_fpga_reg_w(LGW_FPGA_CTRL_FEATURE_START, 0); - } else { - /* Do Nothing */ - /* LBT is running */ - } - - /* Read histogram */ - lgw_fpga_reg_w(LGW_FPGA_CTRL_ACCESS_HISTO_MEM, 1); /* HOST gets access to FPGA RAM */ - lgw_fpga_reg_w(LGW_FPGA_HISTO_RAM_ADDR, 0); - lgw_fpga_reg_rb(LGW_FPGA_HISTO_RAM_DATA, read_burst, RSSI_RANGE*2); - lgw_fpga_reg_w(LGW_FPGA_CTRL_ACCESS_HISTO_MEM, 0); /* FPGA gets access to RAM back */ - - rssi_cumu = 0; - k = 0; - char param_name[32]; - char *seria_string = NULL; - JSON_Value *scan_value = json_value_init_object(); - JSON_Object *scan_object = json_value_get_object(scan_value); - char scan_string[1024] = ""; - snprintf(scan_string, sizeof scan_string, "%d, %d", freq, scan_time); - - float rssi_thresh[] = {0.1,0.3,0.5,0.8,1}; - for (i = 0; i < RSSI_RANGE; i++) { - rssi_histo = (uint16_t)read_burst[2*i] | ((uint16_t)read_burst[2*i+1] << 8); - rssi_cumu += rssi_histo; - if (rssi_cumu > scan_config.samples) { - MSG(" - WARNING: number of RSSI points higher than expected (%u,%u)", rssi_cumu, scan_config.samples); - rssi_cumu = scan_config.samples; - } - if (rssi_cumu > rssi_thresh[k]*scan_config.samples) { - // MSG(" %d%%<%.1f", (uint16_t)(rssi_thresh[k]*100), -i/2.0); - snprintf(param_name, sizeof param_name, "rssi_%d", (uint16_t)(rssi_thresh[k]*100)); - json_object_set_number(scan_object, param_name, -i/2.0); - k++; - } - if (rssi_histo > 0) { - // MSG(" %.1f %.1f %.1f ,%d \n", (-i/2.0) + scan_config.rssi_offset, -(i/2.0 + scan_config.rssi_offset), -i/2.0, rssi_histo); - char valid_hiso[1024] = "\""; - float rssi_sample = -i/2.0; - snprintf(valid_hiso, sizeof valid_hiso, ",%.1f,%d", (-i/2.0) + scan_config.rssi_offset, rssi_histo); - strcat(scan_string, valid_hiso); - } - } - json_array_append_string(interests_arr, scan_string); - json_free_serialized_string(seria_string); - json_value_free(scan_value); - } - char array_string[5000] = "[\""; - for (i = 0; i < json_array_get_count(interests_arr); i++) { - const char * v = json_array_get_string(interests_arr, i); - strcat(array_string, v); - if (i < json_array_get_count(interests_arr) - 1 ) { - strcat(array_string,"\",\""); - } - } - strcat(array_string, "\"]"); - json_object_set_value(root_object, "results", json_parse_string(array_string)); - old_min = min; - - pthread_mutex_lock(&mx_scan_report); - scan_ready = true; - strcpy(serialized_string, json_serialize_to_string(root_value)); - pthread_mutex_unlock(&mx_scan_report); - json_value_free(root_value); - } - } - MSG("\nINFO: End of spectral scan thread\n"); -} - - /* --- EOF ------------------------------------------------------------------ */ |