diff --git a/src/common/main.h b/src/common/main.h index 3e78c34..5924b25 100644 --- a/src/common/main.h +++ b/src/common/main.h @@ -1,6 +1,7 @@ extern int num_kanal; extern int kanal[]; +extern int swap_links; extern int num_audiodev; extern const char *audiodev[]; extern int use_sdr; diff --git a/src/common/main_common.c b/src/common/main_common.c index d4456e0..734fa31 100644 --- a/src/common/main_common.c +++ b/src/common/main_common.c @@ -78,6 +78,8 @@ const char *write_iq_tx_wave = NULL; const char *write_iq_rx_wave = NULL; const char *read_iq_tx_wave = NULL; const char *read_iq_rx_wave = NULL; +int sdr_swap_links = 0; + void print_help_common(const char *arg0, const char *ext_usage) { printf("Usage: %s -k %s[options] [station-id]\n", arg0, ext_usage); @@ -179,6 +181,8 @@ void print_help_common(const char *arg0, const char *ext_usage) printf(" Replace received IQ data by given wave file.\n"); printf(" --read-iq-tx-wave \n"); printf(" Replace transmitted IQ data by given wave file.\n"); + printf(" --sdr-swap-links\n"); + printf(" Swap RX and TX frequencies for loopback tests over the air.r\n"); #endif printf("\nNetwork specific options:\n"); } @@ -220,6 +224,7 @@ void print_hotkeys_common(void) #define OPT_WRITE_IQ_TX_WAVE 1113 #define OPT_READ_IQ_RX_WAVE 1114 #define OPT_READ_IQ_TX_WAVE 1115 +#define OPT_SDR_SWAP_LINKS 1116 static struct option long_options_common[] = { {"help", 0, 0, 'h'}, @@ -260,6 +265,7 @@ static struct option long_options_common[] = { {"write-iq-tx-wave", 1, 0, OPT_WRITE_IQ_TX_WAVE}, {"read-iq-rx-wave", 1, 0, OPT_READ_IQ_RX_WAVE}, {"read-iq-tx-wave", 1, 0, OPT_READ_IQ_TX_WAVE}, + {"sdr-swap-links", 0, 0, OPT_SDR_SWAP_LINKS}, {0, 0, 0, 0} }; @@ -487,6 +493,10 @@ void opt_switch_common(int c, char *arg0, int *skip_args) read_iq_tx_wave = strdup(optarg); *skip_args += 2; break; + case OPT_SDR_SWAP_LINKS: + sdr_swap_links = 1; + *skip_args += 1; + break; default: exit (0); } @@ -570,7 +580,7 @@ void main_common(int *quit, int latency, int interval, void (*myhandler)(void), sdr_samplerate = samplerate; if (sdr_bandwidth == 0.0) sdr_bandwidth = sdr_samplerate; - rc = sdr_init(sdr_uhd, sdr_soapy, sdr_channel, sdr_device_args, sdr_stream_args, sdr_tune_args, sdr_tx_antenna, sdr_rx_antenna, sdr_tx_gain, sdr_rx_gain, sdr_samplerate, sdr_bandwidth, write_iq_tx_wave, write_iq_rx_wave, read_iq_tx_wave, read_iq_rx_wave, latspl); + rc = sdr_init(sdr_uhd, sdr_soapy, sdr_channel, sdr_device_args, sdr_stream_args, sdr_tune_args, sdr_tx_antenna, sdr_rx_antenna, sdr_tx_gain, sdr_rx_gain, sdr_samplerate, sdr_bandwidth, write_iq_tx_wave, write_iq_rx_wave, read_iq_tx_wave, read_iq_rx_wave, latspl, sdr_swap_links); if (rc < 0) return; #endif diff --git a/src/common/sdr.c b/src/common/sdr.c index 41f78c8..b54caf0 100644 --- a/src/common/sdr.c +++ b/src/common/sdr.c @@ -70,6 +70,7 @@ typedef struct sdr_thread { double max_fill_timer; /* timer to display/reset maximum fill */ } sdr_thread_t; +/* preferences */ static int sdr_use_uhd, sdr_use_soapy; static int sdr_channel; static const char *sdr_device_args, *sdr_stream_args, *sdr_tune_args; @@ -82,8 +83,9 @@ static int sdr_oversample; static int sdr_latspl; static int sdr_threads; static sdr_thread_t sdr_thread_read, sdr_thread_write; +static int sdr_swap_links; -int sdr_init(int sdr_uhd, int sdr_soapy, int channel, const char *device_args, const char *stream_args, const char *tune_args, const char *tx_antenna, const char *rx_antenna, double tx_gain, double rx_gain, int samplerate, double bandwidth, const char *write_iq_tx_wave, const char *write_iq_rx_wave, const char *read_iq_tx_wave, const char *read_iq_rx_wave, int latspl) +int sdr_init(int sdr_uhd, int sdr_soapy, int channel, const char *device_args, const char *stream_args, const char *tune_args, const char *tx_antenna, const char *rx_antenna, double tx_gain, double rx_gain, int samplerate, double bandwidth, const char *write_iq_tx_wave, const char *write_iq_rx_wave, const char *read_iq_tx_wave, const char *read_iq_rx_wave, int latspl, int swap_links) { PDEBUG(DSDR, DEBUG_DEBUG, "Init SDR\n"); @@ -106,6 +108,7 @@ int sdr_init(int sdr_uhd, int sdr_soapy, int channel, const char *device_args, c sdr_samplerate = samplerate; sdr_oversample = 1; sdr_latspl = latspl; + sdr_swap_links = swap_links; return 0; } @@ -312,6 +315,14 @@ void *sdr_open(const char __attribute__((__unused__)) *audiodev, double *tx_freq } } + if (sdr_swap_links) { + double temp; + PDEBUG(DSDR, DEBUG_NOTICE, "Sapping RX and TX frequencies!\n"); + temp = rx_center_frequency; + rx_center_frequency = tx_center_frequency; + tx_center_frequency = temp; + } + #ifdef HAVE_UHD if (sdr_use_uhd) { rc = uhd_open(sdr_channel, sdr_device_args, sdr_stream_args, sdr_tune_args, sdr_tx_antenna, sdr_rx_antenna, tx_center_frequency, rx_center_frequency, sdr_samplerate, sdr_tx_gain, sdr_rx_gain, sdr_bandwidth); diff --git a/src/common/sdr.h b/src/common/sdr.h index 68d5cc3..1e2a982 100644 --- a/src/common/sdr.h +++ b/src/common/sdr.h @@ -1,5 +1,5 @@ -int sdr_init(int sdr_uhd, int sdr_soapy, int channel, const char *device_args, const char *stream_args, const char *tune_args, const char *tx_antenna, const char *rx_antenna, double tx_gain, double rx_gain, int samplerate, double bandwidth, const char *write_iq_tx_wave, const char *write_iq_rx_wave, const char *read_iq_tx_wave, const char *read_iq_rx_wave, int latspl); +int sdr_init(int sdr_uhd, int sdr_soapy, int channel, const char *device_args, const char *stream_args, const char *tune_args, const char *tx_antenna, const char *rx_antenna, double tx_gain, double rx_gain, int samplerate, double bandwidth, const char *write_iq_tx_wave, const char *write_iq_rx_wave, const char *read_iq_tx_wave, const char *read_iq_rx_wave, int latspl, int swap_links); int sdr_start(void *inst); void *sdr_open(const char *audiodev, double *tx_frequency, double *rx_frequency, int channels, double paging_frequency, int samplerate, double bandwidth, double sample_deviation); void sdr_close(void *inst);