diff --git a/src/controller/ControllerPanel.java b/src/controller/ControllerPanel.java
index c9018a7c..79d24625 100644
--- a/src/controller/ControllerPanel.java
+++ b/src/controller/ControllerPanel.java
@@ -35,6 +35,8 @@ import module.decode.state.ChannelList;
import net.miginfocom.swing.MigLayout;
import settings.SettingsManager;
import source.SourceManager;
+import source.TunerViewPanel;
+import source.TunerModel;
import spectrum.ChannelSpectrumPanel;
import alias.AliasController;
import alias.AliasModel;
@@ -55,6 +57,8 @@ public class ControllerPanel extends JPanel
private ChannelList mChannelStateList;
+ private TunerViewPanel mTunerManagerPanel;
+
private CallEventPanel mCallEventPanel;
private MessageActivityPanel mMessageActivityPanel;
@@ -87,7 +91,8 @@ public class ControllerPanel extends JPanel
ChannelProcessingManager channelProcessingManager,
MapService mapService,
SettingsManager settingsManager,
- SourceManager sourceManager )
+ SourceManager sourceManager,
+ TunerModel tunerModel )
{
mChannelModel = channelModel;
mController = controller;
@@ -111,6 +116,8 @@ public class ControllerPanel extends JPanel
sourceManager, aliasModel );
mAliasController = new AliasController( aliasModel, mSettingsManager );
+
+ mTunerManagerPanel = new TunerViewPanel( tunerModel, mSettingsManager );
init();
}
@@ -138,6 +145,7 @@ public class ControllerPanel extends JPanel
mTabbedPane.setForeground( Color.BLACK );
mTabbedPane.addTab( "Channels", mChannelController );
mTabbedPane.addTab( "Aliases", mAliasController );
+ mTabbedPane.addTab( "Tuners", mTunerManagerPanel );
mTabbedPane.addTab( "Configuration", mSystemControlSplitPane );
mTabbedPane.addTab( "Channel Spectrum", mChannelSpectrumPanel );
mTabbedPane.addTab( "Events", mCallEventPanel );
diff --git a/src/gui/SDRTrunk.java b/src/gui/SDRTrunk.java
index 505f0dd9..16658a8f 100644
--- a/src/gui/SDRTrunk.java
+++ b/src/gui/SDRTrunk.java
@@ -56,6 +56,7 @@ import properties.SystemProperties;
import record.RecorderManager;
import settings.SettingsManager;
import source.SourceManager;
+import source.TunerModel;
import source.tuner.Tuner;
import source.tuner.TunerSelectionListener;
import spectrum.SpectralDisplayPanel;
@@ -130,6 +131,9 @@ public class SDRTrunk
SourceManager sourceManager = new SourceManager( mSettingsManager,
threadPoolManager );
+
+ TunerModel tunerModel = new TunerModel();
+ tunerModel.addTuners( sourceManager.getTunerManager().getTuners() );
ChannelProcessingManager channelProcessingManager =
new ChannelProcessingManager( channelModel, channelMapModel,
@@ -158,7 +162,7 @@ public class SDRTrunk
mControllerPanel = new ControllerPanel( audioManager, configurationControllerModel,
aliasModel, channelModel, channelMapModel, channelProcessingManager,
- mapService, mSettingsManager, sourceManager );
+ mapService, mSettingsManager, sourceManager, tunerModel );
mSpectralPanel = new SpectralDisplayPanel( configurationControllerModel,
channelModel, channelProcessingManager, mSettingsManager );
diff --git a/src/source/SampleProvider.java b/src/source/SampleProvider.java
deleted file mode 100644
index 3cc84749..00000000
--- a/src/source/SampleProvider.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * SDR Trunk
- * Copyright (C) 2014 Dennis Sheirer
- *
- * 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
- ******************************************************************************/
-package source;
-
-import sample.SampleType;
-
-public interface SampleProvider
-{
- /**
- * Real or Complex
- */
- public abstract SampleType getSampleType();
-}
diff --git a/src/source/TunerModel.java b/src/source/TunerModel.java
new file mode 100644
index 00000000..dd51250e
--- /dev/null
+++ b/src/source/TunerModel.java
@@ -0,0 +1,88 @@
+package source;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.AbstractListModel;
+
+import source.tuner.Tuner;
+
+public class TunerModel extends AbstractListModel
+{
+ private static final long serialVersionUID = 1L;
+
+ private List mTuners = new ArrayList<>();
+
+ public TunerModel()
+ {
+ }
+
+ /**
+ * List of Tuners currently in the model
+ */
+ public List getTuners()
+ {
+ return mTuners;
+ }
+
+ public void addTuners( List Tuners )
+ {
+ for( Tuner tuner: Tuners )
+ {
+ addTuner( tuner );
+ }
+ }
+
+ /**
+ * Adds the Tuner to this model
+ */
+ public void addTuner( Tuner tuner )
+ {
+ if( !mTuners.contains( tuner ) )
+ {
+ mTuners.add( tuner );
+
+ int index = mTuners.indexOf( tuner );
+
+ fireIntervalAdded( this, index, index );
+ }
+ }
+
+ /**
+ * Removes the Tuner from this model
+ */
+ public void removeTuner( Tuner tuner )
+ {
+ if( mTuners.contains( tuner ) )
+ {
+ int index = mTuners.indexOf( tuner );
+
+ mTuners.remove( tuner );
+
+ fireIntervalRemoved( this, index, index );
+ }
+ }
+
+ /**
+ * Number of Tuners in this model
+ */
+ @Override
+ public int getSize()
+ {
+ return mTuners.size();
+ }
+
+ /**
+ * Returns the Tuner at the specified index
+ */
+ @Override
+ public Tuner getElementAt( int index )
+ {
+ if( index <= mTuners.size() )
+ {
+ return mTuners.get( index );
+ }
+
+ return null;
+ }
+}
diff --git a/src/source/TunerViewPanel.java b/src/source/TunerViewPanel.java
new file mode 100644
index 00000000..e2b9ef57
--- /dev/null
+++ b/src/source/TunerViewPanel.java
@@ -0,0 +1,94 @@
+package source;
+
+import gui.editor.EmptyEditor;
+
+import java.awt.Component;
+
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.ListSelectionModel;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+
+import net.miginfocom.swing.MigLayout;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import settings.SettingsManager;
+import source.tuner.Tuner;
+import source.tuner.TunerManager;
+
+import com.jidesoft.swing.JideSplitPane;
+
+public class TunerViewPanel extends JPanel
+{
+ private static final long serialVersionUID = 1L;
+ private final static Logger mLog = LoggerFactory.getLogger( TunerViewPanel.class );
+
+ private TunerModel mTunerModel;
+ private SettingsManager mSettingsManager;
+ private JideSplitPane mSplitPane;
+ private JList mTunerList;
+
+ public TunerViewPanel( TunerModel tunerModel, SettingsManager settingsManager )
+ {
+ mTunerModel = tunerModel;
+ mSettingsManager = settingsManager;
+
+ init();
+ }
+
+ private void init()
+ {
+ setLayout( new MigLayout( "insets 1 1 1 1", "[fill,grow]", "[fill,grow]" ) );
+
+ mTunerList = new JList<>( mTunerModel );
+ mTunerList.setLayoutOrientation( JList.VERTICAL );
+ mTunerList.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
+ mTunerList.addListSelectionListener( new ListSelectionListener()
+ {
+ @Override
+ public void valueChanged( ListSelectionEvent event )
+ {
+ if( !event.getValueIsAdjusting() )
+ {
+ Tuner selected = mTunerList.getSelectedValue();
+
+ Component component = null;
+
+ if( selected != null )
+ {
+ JPanel tunerEditor = TunerManager
+ .getEditor( mSettingsManager, selected );
+
+ component = new JScrollPane( tunerEditor );
+ }
+ else
+ {
+ component = new EmptyEditor();
+ }
+
+ int split = mSplitPane.getDividerLocation( 0 );
+
+ mSplitPane.remove( 2 );
+ mSplitPane.add( component );
+ mSplitPane.setDividerLocation( 0, split );
+ validate();
+ }
+ }
+ } );
+
+ JScrollPane listScroller = new JScrollPane( mTunerList );
+
+ JScrollPane editorScroller = new JScrollPane( new EmptyEditor() );
+
+ mSplitPane = new JideSplitPane();
+ mSplitPane.setOrientation( JideSplitPane.HORIZONTAL_SPLIT );
+ mSplitPane.add( listScroller );
+ mSplitPane.add( editorScroller );
+
+ add( mSplitPane );
+ }
+}
diff --git a/src/source/tuner/TunerManager.java b/src/source/tuner/TunerManager.java
index 759bf7d6..38b10e0a 100644
--- a/src/source/tuner/TunerManager.java
+++ b/src/source/tuner/TunerManager.java
@@ -17,12 +17,16 @@
******************************************************************************/
package source.tuner;
+import gui.editor.EmptyEditor;
+
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.RejectedExecutionException;
+import javax.swing.JPanel;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.usb4java.Device;
@@ -38,6 +42,7 @@ import source.config.SourceConfiguration;
import source.mixer.MixerManager;
import source.tuner.airspy.AirspyTuner;
import source.tuner.airspy.AirspyTunerController;
+import source.tuner.airspy.AirspyTunerEditorPanel;
import source.tuner.fcd.FCDTuner;
import source.tuner.fcd.proV1.FCD1TunerController;
import source.tuner.fcd.proplusV2.FCD2TunerController;
@@ -46,6 +51,7 @@ import source.tuner.hackrf.HackRFTunerController;
import source.tuner.rtl.RTL2832Tuner;
import source.tuner.rtl.RTL2832TunerController;
import source.tuner.rtl.e4k.E4KTunerController;
+import source.tuner.rtl.e4k.E4KTunerEditorPanel;
import source.tuner.rtl.r820t.R820TTunerController;
import controller.ThreadPoolManager;
@@ -618,4 +624,16 @@ public class TunerManager
return mTuner != null;
}
}
+
+ public static JPanel getEditor( SettingsManager settingsManager, Tuner tuner )
+ {
+ JPanel editor = tuner.getEditor( settingsManager );
+
+ if( editor != null )
+ {
+ return editor;
+ }
+
+ return new EmptyEditor();
+ }
}