From 904752e3dd84f1bc24733af8755b9aa7db0d3b2d Mon Sep 17 00:00:00 2001 From: Denny Sheirer Date: Sun, 22 Mar 2020 09:31:56 +0000 Subject: [PATCH] Resolves #688. Updates HackRF Sample Rate options and sets usable bandwidth for the tuner to 75% of the sample rate. (#689) Co-authored-by: Denny --- .../tuner/hackrf/HackRFTunerController.java | 64 ++++++++++++++----- .../tuner/hackrf/HackRFTunerEditor.java | 10 ++- 2 files changed, 55 insertions(+), 19 deletions(-) diff --git a/src/main/java/io/github/dsheirer/source/tuner/hackrf/HackRFTunerController.java b/src/main/java/io/github/dsheirer/source/tuner/hackrf/HackRFTunerController.java index 2696f234..395b0b5f 100644 --- a/src/main/java/io/github/dsheirer/source/tuner/hackrf/HackRFTunerController.java +++ b/src/main/java/io/github/dsheirer/source/tuner/hackrf/HackRFTunerController.java @@ -40,6 +40,7 @@ import javax.usb.UsbException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.Arrays; +import java.util.EnumSet; public class HackRFTunerController extends USBTunerController { @@ -56,7 +57,7 @@ public class HackRFTunerController extends USBTunerController public static final long MIN_FREQUENCY = 10000000l; public static final long MAX_FREQUENCY = 6000000000l; public static final long DEFAULT_FREQUENCY = 101100000; - public static final double USABLE_BANDWIDTH_PERCENT = 0.95; + public static final double USABLE_BANDWIDTH_PERCENT = 0.75; public static final int DC_SPIKE_AVOID_BUFFER = 5000; private NativeBufferConverter mNativeBufferConverter = new ByteSampleConverter(); @@ -337,8 +338,14 @@ public class HackRFTunerController extends USBTunerController { if(config instanceof HackRFTunerConfiguration) { - HackRFTunerConfiguration hackRFConfig = - (HackRFTunerConfiguration)config; + HackRFTunerConfiguration hackRFConfig = (HackRFTunerConfiguration)config; + + //Convert legacy sample rate setting to new sample rates + if(!hackRFConfig.getSampleRate().isValidSampleRate()) + { + mLog.warn("Changing legacy HackRF Sample Rates Setting [" + hackRFConfig.getSampleRate().name() + "] to current valid setting"); + hackRFConfig.setSampleRate(HackRFSampleRate.RATE_2_3); + } try { @@ -499,6 +506,11 @@ public class HackRFTunerController extends USBTunerController */ public void setSampleRate(HackRFSampleRate rate) throws UsbException, SourceException { + if(!rate.isValidSampleRate()) + { + rate = HackRFSampleRate.RATE_2_3; + } + setSampleRateManual(rate.getRate(), 1); mFrequencyController.setSampleRate(rate.getRate()); @@ -566,30 +578,45 @@ public class HackRFTunerController extends USBTunerController public enum HackRFSampleRate { - RATE2_016MHZ(2016000, "2.016 MHz", BasebandFilter.F3_50), - RATE3_024MHZ(3024000, "3.024 MHz", BasebandFilter.F5_00), - RATE4_464MHZ(4464000, "4.464 MHz", BasebandFilter.F6_00), - RATE5_376MHZ(5376000, "5.376 MHz", BasebandFilter.F7_00), - RATE7_488MHZ(7488000, "7.488 MHz", BasebandFilter.F9_00), - RATE10_080MHZ(10080000, "10.080 MHz", BasebandFilter.F12_00), - RATE12_000MHZ(12000000, "12.000 MHz", BasebandFilter.F14_00), - RATE13_440MHZ(13440000, "13.440 MHz", BasebandFilter.F15_00), - RATE14_976MHZ(14976000, "14.976 MHz", BasebandFilter.F20_00), - RATE19_968MHZ(19968000, "19.968 MHz", BasebandFilter.F24_00); + RATE_2_3(2300000, "2.300 MHz", BasebandFilter.F1_75), + RATE_3_3(3300000, "3.300 MHz", BasebandFilter.F2_50), + RATE_4_6(4600000, "4.600 MHz", BasebandFilter.F3_50), + RATE_6_6(6600000, "6.600 MHz", BasebandFilter.F5_00), + RATE_7_3(7300000, "7.300 MHz", BasebandFilter.F5_50), + RATE_8_0(8000000, "8.000 MHz", BasebandFilter.F6_00), + RATE_9_3(9300000, "9.300 MHz", BasebandFilter.F7_00), + RATE_10_6(10600000, "10.600 MHz", BasebandFilter.F8_00), + RATE_12_0(12000000, "12.000 MHz", BasebandFilter.F9_00), + RATE_13_3(13300000, "13.300 MHz", BasebandFilter.F10_00), + RATE_16_0(16000000, "16.000 MHz", BasebandFilter.F12_00), + RATE_18_6(18600000, "18.600 MHz", BasebandFilter.F14_00), + RATE_20_0(20000000, "20.000 MHz", BasebandFilter.F15_00), + + //These sample rates are deprecated. They're maintained here for backward compatibility with user settings + RATE2_016MHZ(2016000, "*2.016 MHz", BasebandFilter.F3_50), + RATE3_024MHZ(3024000, "*3.024 MHz", BasebandFilter.F5_00), + RATE4_464MHZ(4464000, "*4.464 MHz", BasebandFilter.F6_00), + RATE5_376MHZ(5376000, "*5.376 MHz", BasebandFilter.F7_00), + RATE7_488MHZ(7488000, "*7.488 MHz", BasebandFilter.F9_00), + RATE10_080MHZ(10080000, "*10.080 MHz", BasebandFilter.F12_00), + RATE12_000MHZ(12000000, "*12.000 MHz", BasebandFilter.F14_00), + RATE13_440MHZ(13440000, "*13.440 MHz", BasebandFilter.F15_00), + RATE14_976MHZ(14976000, "*14.976 MHz", BasebandFilter.F20_00), + RATE19_968MHZ(19968000, "*19.968 MHz", BasebandFilter.F24_00); private int mRate; private String mLabel; private BasebandFilter mFilter; - private HackRFSampleRate(int rate, - String label, - BasebandFilter filter) + private HackRFSampleRate(int rate, String label, BasebandFilter filter) { mRate = rate; mLabel = label; mFilter = filter; } + public static EnumSet VALID_SAMPLE_RATES = EnumSet.range(RATE_2_3, RATE_20_0); + public int getRate() { return mRate; @@ -609,6 +636,11 @@ public class HackRFTunerController extends USBTunerController { return mFilter; } + + public boolean isValidSampleRate() + { + return VALID_SAMPLE_RATES.contains(this); + } } public enum BasebandFilter diff --git a/src/main/java/io/github/dsheirer/source/tuner/hackrf/HackRFTunerEditor.java b/src/main/java/io/github/dsheirer/source/tuner/hackrf/HackRFTunerEditor.java index 37059523..e1e8fe5e 100644 --- a/src/main/java/io/github/dsheirer/source/tuner/hackrf/HackRFTunerEditor.java +++ b/src/main/java/io/github/dsheirer/source/tuner/hackrf/HackRFTunerEditor.java @@ -46,6 +46,7 @@ import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.text.DecimalFormat; +import java.util.Collections; public class HackRFTunerEditor extends TunerConfigurationEditor { @@ -122,15 +123,18 @@ public class HackRFTunerEditor extends TunerConfigurationEditor }); add(mTunerInfo); - mComboSampleRate = new JComboBox<>(HackRFSampleRate.values()); + + HackRFSampleRate[] validRates = HackRFSampleRate.VALID_SAMPLE_RATES + .toArray(new HackRFSampleRate[HackRFSampleRate.VALID_SAMPLE_RATES.size()]); + mComboSampleRate = new JComboBox<>(validRates); mComboSampleRate.setEnabled(false); mComboSampleRate.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - HackRFSampleRate sampleRate = - (HackRFSampleRate)mComboSampleRate.getSelectedItem(); + HackRFSampleRate sampleRate = (HackRFSampleRate)mComboSampleRate.getSelectedItem(); + try {