aboutsummaryrefslogtreecommitdiffstats
path: root/src/common/sdr_config.c
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2017-08-30 17:42:49 +0200
committerAndreas Eversberg <jolly@eversberg.eu>2017-09-02 07:34:48 +0200
commita52c89800c9826634bcae3a635b71feb905b3641 (patch)
treeee3b8c3e86eabf037a453ba2cbfdb279f39ef55d /src/common/sdr_config.c
parent94ed39f5e28520ba968a604c7eeabf2be0ca35d7 (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.c262
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;
+}
+
+