From c2fcc9e85de98d78f2b94f8efc8b6071e5e20608 Mon Sep 17 00:00:00 2001 From: Denny Date: Fri, 9 Feb 2018 07:11:38 -0500 Subject: [PATCH] 321 - adds a preferred tuner option to the channel's source configuration so that on startup, the application attempts to source the channel from the preferred tuner. If the tuner is currently not available, or if the tuner cannot source the channel, then the next available tuner is selected. --- sdr-trunk.ipr | 104 +++++++++ .../source/SourceConfigurationEditor.java | 5 +- .../github/dsheirer/source/SourceManager.java | 5 + .../source/config/SourceConfigTuner.java | 9 + .../dsheirer/source/tuner/TunerModel.java | 51 ++++- .../source/tuner/TunerSourceEditor.java | 216 +++++++++++++----- 6 files changed, 324 insertions(+), 66 deletions(-) create mode 100644 sdr-trunk.ipr diff --git a/sdr-trunk.ipr b/sdr-trunk.ipr new file mode 100644 index 00000000..912b20d7 --- /dev/null +++ b/sdr-trunk.ipr @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.6 + + + + + + + + + + + + + diff --git a/src/main/java/io/github/dsheirer/source/SourceConfigurationEditor.java b/src/main/java/io/github/dsheirer/source/SourceConfigurationEditor.java index 4f404e2b..8a903f3e 100644 --- a/src/main/java/io/github/dsheirer/source/SourceConfigurationEditor.java +++ b/src/main/java/io/github/dsheirer/source/SourceConfigurationEditor.java @@ -25,7 +25,8 @@ import io.github.dsheirer.source.mixer.MixerSourceEditor; import io.github.dsheirer.source.tuner.TunerSourceEditor; import net.miginfocom.swing.MigLayout; -import javax.swing.*; +import javax.swing.DefaultComboBoxModel; +import javax.swing.JComboBox; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -43,7 +44,7 @@ public class SourceConfigurationEditor extends Editor mMixerSourceEditor = new MixerSourceEditor( sourceManager ); mMixerSourceEditor.setSaveRequestListener( this ); - mTunerSourceEditor = new TunerSourceEditor(); + mTunerSourceEditor = new TunerSourceEditor(sourceManager.getTunerModel()); mTunerSourceEditor.setSaveRequestListener( this ); init(); diff --git a/src/main/java/io/github/dsheirer/source/SourceManager.java b/src/main/java/io/github/dsheirer/source/SourceManager.java index 1a798b69..4af01bfd 100644 --- a/src/main/java/io/github/dsheirer/source/SourceManager.java +++ b/src/main/java/io/github/dsheirer/source/SourceManager.java @@ -59,6 +59,11 @@ public class SourceManager return mTunerManager; } + public TunerModel getTunerModel() + { + return mTunerModel; + } + public Source getSource(SourceConfiguration config, int bandwidth) throws SourceException { diff --git a/src/main/java/io/github/dsheirer/source/config/SourceConfigTuner.java b/src/main/java/io/github/dsheirer/source/config/SourceConfigTuner.java index 36686771..2b926be9 100644 --- a/src/main/java/io/github/dsheirer/source/config/SourceConfigTuner.java +++ b/src/main/java/io/github/dsheirer/source/config/SourceConfigTuner.java @@ -69,6 +69,15 @@ public class SourceConfigTuner extends SourceConfiguration return mPreferredTuner; } + /** + * Indicates if this configuration has a specified preferred tuner + */ + @JsonIgnore + public boolean hasPreferredTuner() + { + return mPreferredTuner != null; + } + /** * Specifies the preferred tuner to use for this configuration * @param preferredTuner to use, if available diff --git a/src/main/java/io/github/dsheirer/source/tuner/TunerModel.java b/src/main/java/io/github/dsheirer/source/tuner/TunerModel.java index 3b7aa297..e5e52ee0 100644 --- a/src/main/java/io/github/dsheirer/source/tuner/TunerModel.java +++ b/src/main/java/io/github/dsheirer/source/tuner/TunerModel.java @@ -70,6 +70,28 @@ public class TunerModel extends AbstractTableModel implements Listener Tuners ) { for( Tuner tuner: Tuners ) @@ -270,6 +292,31 @@ public class TunerModel extends AbstractTableModel implements Listener it = mTuners.iterator(); Tuner tuner; + + if(config.hasPreferredTuner()) + { + tuner = getTuner(config.getPreferredTuner()); + + if(tuner != null) + { + try + { + retVal = tuner.getChannel( tunerChannel ); + + if(retVal != null) + { + return retVal; + } + } + catch(Exception e) + { + //Fall through to logger below + } + } + + mLog.info("Unable to source channel [" + config.getFrequency() + "] from preferred tuner [" + + config.getPreferredTuner() + "] - searching for another tuner"); + } while( it.hasNext() && retVal == null ) { @@ -285,12 +332,10 @@ public class TunerModel extends AbstractTableModel implements Listener ******************************************************************************/ @@ -26,70 +26,164 @@ import io.github.dsheirer.source.tuner.frequency.FrequencyChangeEvent; import io.github.dsheirer.source.tuner.frequency.IFrequencyChangeProcessor; import net.miginfocom.swing.MigLayout; +import javax.swing.DefaultComboBoxModel; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + public class TunerSourceEditor extends Editor { private static final long serialVersionUID = 1L; + private static final String NO_PREFERRED_TUNER = "(none)"; + private static final String UNAVAILABLE_TUNER = " (unavailable)"; private JFrequencyControl mFrequencyControl; + private JComboBox mTunerNameComboBox; + private TunerModel mTunerModel; + private List mCurrentTunerNames; - public TunerSourceEditor() - { - init(); - } + public TunerSourceEditor(TunerModel tunerModel) + { + mTunerModel = tunerModel; + init(); + } - private void init() - { - setLayout( new MigLayout( "insets 0 0 0 0", "[left]", "" ) ); - mFrequencyControl = new JFrequencyControl(); - mFrequencyControl.setEnabled( false ); - mFrequencyControl.addListener( new IFrequencyChangeProcessor() - { - @Override - public void frequencyChanged( FrequencyChangeEvent event ) - { - setModified( true ); - } - } ); - add( mFrequencyControl ); - } + private void init() + { + loadTunerNames(); - public void save() - { - if( hasItem() && isModified() ) - { - SourceConfigTuner config = new SourceConfigTuner(); - config.setFrequency( mFrequencyControl.getFrequency() ); - getItem().setSourceConfiguration( config ); - } + setLayout(new MigLayout("insets 0 0 0 0", "[left]", "")); + mFrequencyControl = new JFrequencyControl(); + mFrequencyControl.setEnabled(false); + mFrequencyControl.addListener(new IFrequencyChangeProcessor() + { + @Override + public void frequencyChanged(FrequencyChangeEvent event) + { + setModified(true); + } + }); + add(mFrequencyControl); - setModified( false ); - } - - @Override - public void setItem( Channel item ) - { - super.setItem( item ); - - if( hasItem() ) - { - SourceConfiguration config = getItem().getSourceConfiguration(); - - mFrequencyControl.setEnabled( true ); + mTunerNameComboBox = new JComboBox<>(mCurrentTunerNames.toArray(new String[mCurrentTunerNames.size()])); + mTunerNameComboBox.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + setModified(true); + } + }); + add(new JLabel("Preferred Tuner:")); + add(mTunerNameComboBox); + } - if( config instanceof SourceConfigTuner ) - { - mFrequencyControl.setFrequency( ((SourceConfigTuner)config).getFrequency(), false ); - setModified( false ); - } - else - { - mFrequencyControl.setFrequency( 101000000, false ); - setModified( true ); - } - } - else - { - mFrequencyControl.setEnabled( false ); - setModified( false ); - } - } + private void loadTunerNames() + { + mCurrentTunerNames = new ArrayList<>(); + + for(Tuner tuner: mTunerModel.getTuners()) + { + mCurrentTunerNames.add(tuner.getName()); + } + + Collections.sort(mCurrentTunerNames); + + mCurrentTunerNames.add(0, NO_PREFERRED_TUNER); + } + + private void updateTunerNameCombo(String preferredTuner) + { + if(preferredTuner != null && !mCurrentTunerNames.contains(preferredTuner)) + { + List updatedTunerNameList = new ArrayList<>(mCurrentTunerNames); + String unavailableTuner = preferredTuner + UNAVAILABLE_TUNER; + updatedTunerNameList.add(unavailableTuner); + String[] tunerNameArray = updatedTunerNameList.toArray(new String[updatedTunerNameList.size()]); + mTunerNameComboBox.setModel(new DefaultComboBoxModel<>(tunerNameArray)); + mTunerNameComboBox.setSelectedItem(unavailableTuner); + } + else + { + String[] tunerNameArray = mCurrentTunerNames.toArray(new String[mCurrentTunerNames.size()]); + mTunerNameComboBox.setModel(new DefaultComboBoxModel<>(tunerNameArray)); + + if(preferredTuner == null) + { + mTunerNameComboBox.setSelectedItem(NO_PREFERRED_TUNER); + } + else + { + mTunerNameComboBox.setSelectedItem(preferredTuner); + } + } + } + + public void save() + { + if(hasItem() && isModified()) + { + SourceConfigTuner config = new SourceConfigTuner(); + config.setFrequency(mFrequencyControl.getFrequency()); + + String preferredTuner = (String)mTunerNameComboBox.getSelectedItem(); + + if(preferredTuner != null) + { + if(preferredTuner.equalsIgnoreCase(NO_PREFERRED_TUNER)) + { + config.setPreferredTuner(null); + } + else if(preferredTuner.contains(UNAVAILABLE_TUNER)) + { + //don't do anything - the config already contains this unavailable tuner name + } + else + { + config.setPreferredTuner(preferredTuner); + } + } + + getItem().setSourceConfiguration(config); + } + + setModified(false); + } + + @Override + public void setItem(Channel item) + { + super.setItem(item); + + if(hasItem()) + { + SourceConfiguration config = getItem().getSourceConfiguration(); + + mFrequencyControl.setEnabled(true); + + if(config instanceof SourceConfigTuner) + { + SourceConfigTuner tunerConfig = (SourceConfigTuner)config; + + mFrequencyControl.setFrequency(tunerConfig.getFrequency(), false); + + updateTunerNameCombo(tunerConfig.getPreferredTuner()); + + setModified(false); + } + else + { + mFrequencyControl.setFrequency(101000000, false); + setModified(true); + } + } + else + { + mFrequencyControl.setEnabled(false); + setModified(false); + } + } }