diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2017-08-30 17:42:49 +0200 |
---|---|---|
committer | Andreas Eversberg <jolly@eversberg.eu> | 2017-09-02 07:34:48 +0200 |
commit | a52c89800c9826634bcae3a635b71feb905b3641 (patch) | |
tree | ee3b8c3e86eabf037a453ba2cbfdb279f39ef55d /src/common/sdr_config.c | |
parent | 94ed39f5e28520ba968a604c7eeabf2be0ca35d7 (diff) |
SDR: Split SDR config from main_mobile.c to sdr_config.c
Diffstat (limited to 'src/common/sdr_config.c')
-rw-r--r-- | src/common/sdr_config.c | 262 |
1 files changed, 262 insertions, 0 deletions
diff --git a/src/common/sdr_config.c b/src/common/sdr_config.c new file mode 100644 index 0000000..c4cae55 --- /dev/null +++ b/src/common/sdr_config.c @@ -0,0 +1,262 @@ +/* Config for SDR + * + * (C) 2017 by Andreas Eversberg <jolly@eversberg.eu> + * All Rights Reserved + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +enum paging_signal; + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> +#include <getopt.h> +#include "sample.h" +#include "sdr.h" +#include "sdr_config.h" + +static int got_init = 0; +extern int use_sdr; +sdr_config_t *sdr_config = NULL; + +void sdr_config_init(void) +{ + sdr_config = calloc(1, sizeof(*sdr_config)); + memset(sdr_config, 0, sizeof(*sdr_config)); + sdr_config->device_args = ""; + sdr_config->stream_args = ""; + sdr_config->tune_args = ""; + + got_init = 1; +} + +void sdr_config_print_help(void) +{ + printf("\nSDR options:\n"); + /* - - */ +#ifdef HAVE_UHD + printf(" --sdr-uhd\n"); + printf(" Force UHD driver\n"); +#endif +#ifdef HAVE_SOAPY + printf(" --sdr-soapy\n"); + printf(" Force SoapySDR driver\n"); +#endif + printf(" --sdr-channel <channel #>\n"); + printf(" Give channel number for multi channel SDR device (default = %d)\n", sdr_config->channel); + printf(" --sdr-device-args <args>\n"); + printf(" --sdr-stream-args <args>\n"); + printf(" --sdr-tune-args <args>\n"); + printf(" Optional SDR device arguments, seperated by comma\n"); + printf(" e.g. --sdr-device-args <key>=<value>[,<key>=<value>[,...]]\n"); + printf(" --sdr-samplerate <samplerate>\n"); + printf(" Sample rate to use with SDR. By default it equals the regular sample\n"); + printf(" rate.\n"); + printf(" --sdr-bandwidth <bandwidth>\n"); + printf(" Give IF filter bandwidth to use. If not, sample rate is used.\n"); + printf(" --sdr-rx-antenna <name>\n"); + printf(" SDR device's RX antenna name, use 'list' to get a list\n"); + printf(" --sdr-tx-antenna <name>\n"); + printf(" SDR device's TX antenna name, use 'list' to get a list\n"); + printf(" --sdr-rx-gain <gain>\n"); + printf(" SDR device's RX gain in dB (default = %.1f)\n", sdr_config->rx_gain); + printf(" --sdr-tx-gain <gain>\n"); + printf(" SDR device's TX gain in dB (default = %.1f)\n", sdr_config->tx_gain); + printf(" --write-iq-rx-wave <file>\n"); + printf(" Write received IQ data to given wave file.\n"); + printf(" --write-iq-tx-wave <file>\n"); + printf(" Write transmitted IQ data to given wave file.\n"); + printf(" --read-iq-rx-wave <file>\n"); + printf(" Replace received IQ data by given wave file.\n"); + printf(" --read-iq-tx-wave <file>\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.\n"); +#ifdef HAVE_UHD + printf(" --sdr-uhd-tx-timestamps\n"); + printf(" Use TX timestamps on UHD device. (May not work with some devices!)\n"); +#endif +} + +void sdr_config_print_hotkeys(void) +{ + printf("Press 'i' key to toggle display of RX I/Q vector.\n"); + printf("Press 's' key to toggle display of RX spectrum.\n"); +} + +#define OPT_SDR_UHD 1500 +#define OPT_SDR_SOAPY 1501 +#define OPT_SDR_CHANNEL 1502 +#define OPT_SDR_DEVICE_ARGS 1503 +#define OPT_SDR_STREAM_ARGS 1504 +#define OPT_SDR_TUNE_ARGS 1505 +#define OPT_SDR_RX_ANTENNA 1506 +#define OPT_SDR_TX_ANTENNA 1507 +#define OPT_SDR_RX_GAIN 1508 +#define OPT_SDR_TX_GAIN 1509 +#define OPT_SDR_SAMPLERATE 1510 +#define OPT_SDR_BANDWIDTH 1511 +#define OPT_WRITE_IQ_RX_WAVE 1512 +#define OPT_WRITE_IQ_TX_WAVE 1513 +#define OPT_READ_IQ_RX_WAVE 1514 +#define OPT_READ_IQ_TX_WAVE 1515 +#define OPT_SDR_SWAP_LINKS 1516 +#define OPT_SDR_UHD_TX_TS 1517 + +struct option sdr_config_long_options[] = { + {"sdr-uhd", 0, 0, OPT_SDR_UHD}, + {"sdr-soapy", 0, 0, OPT_SDR_SOAPY}, + {"sdr-channel", 1, 0, OPT_SDR_CHANNEL}, + {"sdr-device-args", 1, 0, OPT_SDR_DEVICE_ARGS}, + {"sdr-stream-args", 1, 0, OPT_SDR_STREAM_ARGS}, + {"sdr-tune-args", 1, 0, OPT_SDR_TUNE_ARGS}, + {"sdr-samplerate", 1, 0, OPT_SDR_SAMPLERATE}, + {"sdr-bandwidth", 1, 0, OPT_SDR_BANDWIDTH}, + {"sdr-rx-antenna", 1, 0, OPT_SDR_RX_ANTENNA}, + {"sdr-tx-antenna", 1, 0, OPT_SDR_TX_ANTENNA}, + {"sdr-rx-gain", 1, 0, OPT_SDR_RX_GAIN}, + {"sdr-tx-gain", 1, 0, OPT_SDR_TX_GAIN}, + {"write-iq-rx-wave", 1, 0, OPT_WRITE_IQ_RX_WAVE}, + {"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}, + {"sdr-uhd-tx-timestamps", 0, 0, OPT_SDR_UHD_TX_TS}, + {0, 0, 0, 0} +}; + +const char *sdr_config_optstring = ""; + +int sdr_config_opt_switch(int c, int *skip_args) +{ + switch (c) { + case OPT_SDR_UHD: +#ifdef HAVE_UHD + sdr_config->uhd = 1; + use_sdr = 1; +#else + fprintf(stderr, "UHD SDR support not compiled in!\n"); + exit(0); +#endif + *skip_args += 1; + break; + case OPT_SDR_SOAPY: +#ifdef HAVE_SOAPY + sdr_config->soapy = 1; + use_sdr = 1; +#else + fprintf(stderr, "SoapySDR support not compiled in!\n"); + exit(0); +#endif + *skip_args += 1; + break; + case OPT_SDR_CHANNEL: + sdr_config->channel = atoi(optarg); + *skip_args += 2; + break; + case OPT_SDR_DEVICE_ARGS: + sdr_config->device_args = strdup(optarg); + *skip_args += 2; + break; + case OPT_SDR_STREAM_ARGS: + sdr_config->stream_args = strdup(optarg); + *skip_args += 2; + break; + case OPT_SDR_TUNE_ARGS: + sdr_config->tune_args = strdup(optarg); + *skip_args += 2; + break; + case OPT_SDR_SAMPLERATE: + sdr_config->samplerate = atoi(optarg); + *skip_args += 2; + break; + case OPT_SDR_BANDWIDTH: + sdr_config->bandwidth = atof(optarg); + *skip_args += 2; + break; + case OPT_SDR_RX_ANTENNA: + sdr_config->rx_antenna = strdup(optarg); + *skip_args += 2; + break; + case OPT_SDR_TX_ANTENNA: + sdr_config->tx_antenna = strdup(optarg); + *skip_args += 2; + break; + case OPT_SDR_RX_GAIN: + sdr_config->rx_gain = atof(optarg); + *skip_args += 2; + break; + case OPT_SDR_TX_GAIN: + sdr_config->tx_gain = atof(optarg); + *skip_args += 2; + break; + case OPT_WRITE_IQ_RX_WAVE: + sdr_config->write_iq_rx_wave = strdup(optarg); + *skip_args += 2; + break; + case OPT_WRITE_IQ_TX_WAVE: + sdr_config->write_iq_tx_wave = strdup(optarg); + *skip_args += 2; + break; + case OPT_READ_IQ_RX_WAVE: + sdr_config->read_iq_rx_wave = strdup(optarg); + *skip_args += 2; + break; + case OPT_READ_IQ_TX_WAVE: + sdr_config->read_iq_tx_wave = strdup(optarg); + *skip_args += 2; + break; + case OPT_SDR_SWAP_LINKS: + sdr_config->swap_links = 1; + *skip_args += 1; + break; + case OPT_SDR_UHD_TX_TS: + sdr_config->uhd_tx_timestamps = 1; + *skip_args += 1; + break; + default: + return -1; + } + + return 0; +} + +int sdr_configure(int samplerate) +{ + if (!got_init) { + fprintf(stderr, "sdr_config_init was not called, please fix!\n"); + abort(); + } + + /* no sdr selected -> return 0 */ + if (!sdr_config->uhd && !sdr_config->soapy) + return 0; + + if ((sdr_config->uhd == 1 && sdr_config->soapy == 1)) { + fprintf(stderr, "You must choose which one you want: --sdr-uhd or --sdr-soapy\n"); + exit(0); + } + + if (sdr_config->samplerate == 0) + sdr_config->samplerate = samplerate; + if (sdr_config->bandwidth == 0.0) + sdr_config->bandwidth = (double)sdr_config->samplerate; + + /* sdr selected -> return 1 */ + return 1; +} + + |