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); + } + } }