From 8e1aeb01972a148f3da4ec4930ae424ca2196f06 Mon Sep 17 00:00:00 2001 From: gvanem Date: Mon, 11 Mar 2024 12:47:02 +0100 Subject: [PATCH] Added a config key/value 'absdb-mode = [0..3]' setting for SDRPlay. --- dump1090.cfg | 19 +++++++++++++---- src/dump1090.c | 1 + src/misc.h | 2 +- src/sdrplay.c | 55 ++++++++++++++++++++++++++++++-------------------- src/sdrplay.h | 11 +++++----- 5 files changed, 56 insertions(+), 32 deletions(-) diff --git a/dump1090.cfg b/dump1090.cfg index 85bf488..cb3c2d3 100644 --- a/dump1090.cfg +++ b/dump1090.cfg @@ -82,7 +82,7 @@ silent = false # Silent mode for testing network I/O ( tui = curses # Select 'curses' or 'wincon' text-user interface for option `--interactive'. # -# RTLSDR / SDRplay settings used with option `--device ': +# Common RTLSDR / SDRplay settings used with option `--device ': # agc = false # Enable Digital AGC. bias-t = false # Enable Bias-T output. @@ -91,12 +91,23 @@ freq = 1090.0M # Set frequency. gain = auto # Set gain. gain = 31 -if-mode = lif # IF-mode; 'ZIF' or 'LIF'. +ppm = 0 # Set frequency correction (in parts-per-million). rtl-reset = false # Do a USB power-down/up cycle before starting the RTLSDR API +samplerate = 2M # Set sample-rate. + +# +# SDRplay specific settings used with option `--device sdrplay': +# +if-mode = lif # IF-mode; 'ZIF' or 'LIF'. usb-bulk = false # Use USB bulk mode (instead of isochronous) for SDRPlay -ppm = 0 # Set frequency correction (in parts-per-million). -samplerate = 2M # Set sample-rate. +# +# ADSB mode: +# +adsb-mode = 0 # 0 = sdrplay_api_ADSB_DECIMATION (default) + # 1 = sdrplay_api_ADSB_NO_DECIMATION_LOWPASS + # 2 = sdrplay_api_ADSB_NO_DECIMATION_BANDPASS_2MHZ + # 3 = sdrplay_api_ADSB_NO_DECIMATION_BANDPASS_3MHZ # # Include-file of hostile hosts. Some very active IPs. diff --git a/src/dump1090.c b/src/dump1090.c index 755e8b8..7bf92e2 100644 --- a/src/dump1090.c +++ b/src/dump1090.c @@ -120,6 +120,7 @@ static void background_tasks (void); static void modeS_exit (void); static const struct cfg_table config[] = { + { "adsb-mode", ARG_FUNC, (void*) sdrplay_set_adsb_mode }, { "bias-t", ARG_FUNC, (void*) set_bias_tee }, { "usb-bulk", ARG_ATOB, (void*) &Modes.sdrplay.USB_bulk_mode }, { "calibrate", ARG_ATOB, (void*) &Modes.rtlsdr.calibrate }, diff --git a/src/misc.h b/src/misc.h index df2b95e..5a46124 100644 --- a/src/misc.h +++ b/src/misc.h @@ -320,7 +320,7 @@ typedef struct sdrplay_conf { bool disable_DAB_notch; bool USB_bulk_mode; int gain_reduction; - int ADSB_mode; + int ADSB_mode; /**< == sdrplay_api_ControlParamsT::adsbMode */ int BW_mode; int *gains; int gain_count; diff --git a/src/sdrplay.c b/src/sdrplay.c index 0232922..9924cfc 100644 --- a/src/sdrplay.c +++ b/src/sdrplay.c @@ -268,7 +268,7 @@ static void sdrplay_event_callback (sdrplay_api_EventT event_id, sdrplay_api_EventParamsT *params, void *cb_context) { - if (sdr.cancelling) + if (sdr.cancelling || Modes.exit) return; EnterCriticalSection (&Modes.print_mutex); @@ -691,21 +691,7 @@ int sdrplay_read_async (sdrplay_dev *device, sdr.ch_params->rspDuoTunerParams.rfDabNotchEnable = (1 - Modes.sdrplay.disable_DAB_notch); } - switch (Modes.sdrplay.ADSB_mode) - { - case 0: - sdr.ch_params->ctrlParams.adsbMode = sdrplay_api_ADSB_DECIMATION; - break; - case 1: - sdr.ch_params->ctrlParams.adsbMode = sdrplay_api_ADSB_NO_DECIMATION_LOWPASS; - break; - case 2: - sdr.ch_params->ctrlParams.adsbMode = sdrplay_api_ADSB_NO_DECIMATION_BANDPASS_2MHZ; - break; - case 3: - sdr.ch_params->ctrlParams.adsbMode = sdrplay_api_ADSB_NO_DECIMATION_BANDPASS_3MHZ; - break; - } + sdr.ch_params->ctrlParams.adsbMode = Modes.sdrplay.ADSB_mode; if (Modes.sdrplay.if_mode == false) /* Zero-IF mode */ { @@ -724,8 +710,13 @@ int sdrplay_read_async (sdrplay_dev *device, if (Modes.sdrplay.USB_bulk_mode) { - TRACE ("Using streaming USB mode bulk."); - sdr.dev_params->devParams->mode = sdrplay_api_BULK; + TRACE ("Using USB bulk mode"); + sdr.dev_params->devParams->mode = Modes.sdrplay.USB_bulk_mode; + } + else + { + TRACE ("Using USB isochronous mode (default)"); + sdr.dev_params->devParams->mode = sdrplay_api_ISOCH; } if (sdr.ch_params == sdr.dev_params->rxChannelA) @@ -734,8 +725,8 @@ int sdrplay_read_async (sdrplay_dev *device, tuner = 'B'; else tuner = '?'; - TRACE ("Tuner %c: sample-rate: %.0f MS/s, adsbMode: %s.\n" - " decimation-enable: %d, decimation-factor: %d", + TRACE ("'Tuner_%c': sample-rate: %.0f MS/s, adsbMode: %s.\n" + " decimation-enable: %d, decimation-factor: %d", tuner, sdr.dev_params->devParams->fsFreq.fsHz / 1E6, sdrplay_adsb_mode(sdr.ch_params->ctrlParams.adsbMode), sdr.ch_params->ctrlParams.decimation.enable, @@ -761,7 +752,6 @@ int sdrplay_read_async (sdrplay_dev *device, TRACE ("'exit' was set"); break; } - TRACE ("rx_num_callbacks: %llu, sdr.max_sig: %6d, sdr.rx_data_idx: %6u", sdr.rx_num_callbacks, sdr.max_sig, sdr.rx_data_idx); } @@ -837,7 +827,6 @@ int sdrplay_init (const char *name, int index, sdrplay_dev **device) Modes.sdrplay.tuner = sdrplay_api_Tuner_B; /* RSPduo default */ Modes.sdrplay.mode = sdrplay_api_RspDuoMode_Master; /* RSPduo default */ Modes.sdrplay.BW_mode = 1; /* 5 MHz */ - Modes.sdrplay.ADSB_mode = 1; /* for Zero-IF */ Modes.sdrplay.over_sample = true; sdr.rx_data = malloc (MODES_RSP_BUF_SIZE * MODES_RSP_BUFFERS * sizeof(short)); @@ -969,3 +958,25 @@ int sdrplay_exit (sdrplay_dev *device) sdr.chosen_dev = NULL; return (sdr.last_rc); } + +bool sdrplay_set_adsb_mode (const char *arg) +{ + char *end; + sdrplay_api_AdsbModeT mode = strtod (arg, &end); + + if (end == arg || *end != '\0') /* A non-numeric value */ + goto fail; + + if (mode == sdrplay_api_ADSB_DECIMATION || + mode == sdrplay_api_ADSB_NO_DECIMATION_LOWPASS || + mode == sdrplay_api_ADSB_NO_DECIMATION_BANDPASS_2MHZ || + mode == sdrplay_api_ADSB_NO_DECIMATION_BANDPASS_3MHZ) + { + Modes.sdrplay.ADSB_mode = mode; + return (true); + } + +fail: + LOG_STDERR ("\nIllegal 'adsb-mode = %s'\n", arg); + return (false); +} diff --git a/src/sdrplay.h b/src/sdrplay.h index 000680c..f3c66e4 100644 --- a/src/sdrplay.h +++ b/src/sdrplay.h @@ -10,11 +10,12 @@ typedef void (*sdrplay_cb) (uint8_t *buf, uint32_t len, void *ctx); -extern int sdrplay_init (const char *name, int index, sdrplay_dev **device); -extern int sdrplay_exit (sdrplay_dev *device); -extern int sdrplay_set_gain (sdrplay_dev *device, int gain); -extern int sdrplay_cancel_async (sdrplay_dev *device); -extern int sdrplay_read_async (sdrplay_dev *device, +extern int sdrplay_init (const char *name, int index, sdrplay_dev **device); +extern int sdrplay_exit (sdrplay_dev *device); +extern bool sdrplay_set_adsb_mode (const char *arg); +extern int sdrplay_set_gain (sdrplay_dev *device, int gain); +extern int sdrplay_cancel_async (sdrplay_dev *device); +extern int sdrplay_read_async (sdrplay_dev *device, sdrplay_cb cb, void *ctx, uint32_t buf_num,