From 218eeb1848bc9b6339aab23537eee348d3d0c920 Mon Sep 17 00:00:00 2001 From: denny Date: Sat, 12 Mar 2016 12:54:48 -0500 Subject: [PATCH] WIP #34 - more work on tuner model and view. Includes new tuner configuration and tuner configuration assignment editors. Beginning of tuner editor panel rework. Removes most of the remaining JTree configuration pieces. Updates the settings manager to load and save tuners and refactors all of the tuner configuration management out into the tuner configuration model. --- src/controller/BaseNode.java | 196 -------- src/controller/ConfigurableNode.java | 54 --- .../ConfigurationControllerModel.java | 246 ---------- src/controller/ConfigurationTreePanel.java | 117 ----- src/controller/ControllerPanel.java | 76 +-- .../ControllerTreeCellRenderer.java | 127 ----- src/controller/EmptyEditor.java | 59 --- src/controller/OldConfigurationEditor.java | 74 --- src/gui/SDRTrunk.java | 78 ++- src/gui/editor/EmptyEditor.java | 2 +- src/module/decode/p25/P25DecodeEditor.java | 2 +- src/settings/Settings.java | 24 +- src/settings/SettingsManager.java | 168 +++---- src/source/SourceManager.java | 18 +- src/source/TunerModel.java | 184 -------- .../recording/RecordingEditorPanel.java | 130 ----- src/source/recording/RecordingGroupNode.java | 101 ---- src/source/recording/RecordingNode.java | 82 ---- .../recording/RecordingSourceManager.java | 2 +- src/source/tuner/Tuner.java | 21 +- src/source/tuner/TunerController.java | 1 + src/source/tuner/TunerEditor.java | 207 +++++--- src/source/tuner/TunerEditorOld.java | 75 +++ ...{TunerChangeEvent.java => TunerEvent.java} | 7 +- src/source/tuner/TunerGroupNode.java | 35 -- src/source/tuner/TunerManager.java | 199 +------- src/source/tuner/TunerModel.java | 294 ++++++++++++ src/source/tuner/TunerNode.java | 166 ------- src/source/tuner/TunerSelectionListener.java | 23 - src/source/tuner/TunerType.java | 2 +- src/source/{ => tuner}/TunerViewPanel.java | 47 +- src/source/tuner/airspy/AirspyTuner.java | 12 +- .../airspy/AirspyTunerConfiguration.java | 2 +- .../airspy/AirspyTunerConfigurationPanel.java | 68 +-- .../tuner/airspy/AirspyTunerController.java | 2 +- .../TunerConfiguration.java | 4 +- .../TunerConfigurationAssignment.java | 4 +- .../TunerConfigurationEditor.java | 20 + .../TunerConfigurationEvent.java | 45 ++ .../TunerConfigurationFactory.java | 64 +++ .../TunerConfigurationModel.java | 370 +++++++++++++++ src/source/tuner/ettus/B100Tuner.java | 8 +- src/source/tuner/fcd/FCDTuner.java | 12 +- src/source/tuner/fcd/FCDTunerController.java | 2 +- .../fcd/proV1/FCD1TunerConfiguration.java | 2 +- .../proV1/FCD1TunerConfigurationPanel.java | 50 +- .../tuner/fcd/proV1/FCD1TunerController.java | 2 +- .../fcd/proplusV2/FCD2TunerConfiguration.java | 2 +- .../FCD2TunerConfigurationPanel.java | 90 ++-- .../fcd/proplusV2/FCD2TunerController.java | 2 +- src/source/tuner/hackrf/HackRFTuner.java | 12 +- .../hackrf/HackRFTunerConfiguration.java | 2 +- .../hackrf/HackRFTunerConfigurationPanel.java | 82 ++-- .../tuner/hackrf/HackRFTunerController.java | 2 +- src/source/tuner/rtl/RTL2832Tuner.java | 12 +- .../tuner/rtl/RTL2832TunerController.java | 2 - .../tuner/rtl/e4k/E4KTunerConfiguration.java | 2 +- .../rtl/e4k/E4KTunerConfigurationPanel.java | 94 ++-- .../tuner/rtl/e4k/E4KTunerController.java | 2 +- .../rtl/r820t/R820TTunerConfiguration.java | 2 +- ... => R820TTunerConfigurationEditorOld.java} | 135 +++--- .../tuner/rtl/r820t/R820TTunerController.java | 18 +- .../tuner/rtl/r820t/R820TTunerEditor.java | 446 ++++++++++++++++++ .../rtl/r820t/R820TTunerEditorPanel.java | 121 ----- src/spectrum/SpectralDisplayPanel.java | 55 ++- src/spectrum/SpectrumFrame.java | 12 +- 66 files changed, 1983 insertions(+), 2594 deletions(-) delete mode 100644 src/controller/BaseNode.java delete mode 100644 src/controller/ConfigurableNode.java delete mode 100644 src/controller/ConfigurationControllerModel.java delete mode 100644 src/controller/ConfigurationTreePanel.java delete mode 100644 src/controller/ControllerTreeCellRenderer.java delete mode 100644 src/controller/EmptyEditor.java delete mode 100644 src/controller/OldConfigurationEditor.java delete mode 100644 src/source/TunerModel.java delete mode 100644 src/source/recording/RecordingEditorPanel.java delete mode 100644 src/source/recording/RecordingGroupNode.java delete mode 100644 src/source/recording/RecordingNode.java create mode 100644 src/source/tuner/TunerEditorOld.java rename src/source/tuner/{TunerChangeEvent.java => TunerEvent.java} (68%) delete mode 100644 src/source/tuner/TunerGroupNode.java create mode 100644 src/source/tuner/TunerModel.java delete mode 100644 src/source/tuner/TunerNode.java delete mode 100644 src/source/tuner/TunerSelectionListener.java rename src/source/{ => tuner}/TunerViewPanel.java (61%) rename src/source/tuner/{ => configuration}/TunerConfiguration.java (96%) rename src/source/tuner/{ => configuration}/TunerConfigurationAssignment.java (96%) create mode 100644 src/source/tuner/configuration/TunerConfigurationEditor.java create mode 100644 src/source/tuner/configuration/TunerConfigurationEvent.java create mode 100644 src/source/tuner/configuration/TunerConfigurationFactory.java create mode 100644 src/source/tuner/configuration/TunerConfigurationModel.java rename src/source/tuner/rtl/r820t/{R820TTunerConfigurationPanel.java => R820TTunerConfigurationEditorOld.java} (88%) create mode 100644 src/source/tuner/rtl/r820t/R820TTunerEditor.java delete mode 100644 src/source/tuner/rtl/r820t/R820TTunerEditorPanel.java diff --git a/src/controller/BaseNode.java b/src/controller/BaseNode.java deleted file mode 100644 index 89bbdfa6..00000000 --- a/src/controller/BaseNode.java +++ /dev/null @@ -1,196 +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 controller; - -import java.awt.Color; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.TreeNode; - -public class BaseNode extends DefaultMutableTreeNode - implements Comparable -{ - private static final long serialVersionUID = 1L; - - /** - * Model backing the JTree and nodes. Since we're primarily interacting - * with the model via JTree tree nodes via context menus, injecting a - * reference to the model facilitates nodal access to the model's methods - */ - protected ConfigurationControllerModel mModel = null; - - /** - * Implements a base node that has a reference to the underlying - * tree data model to facilitate tree node operations from nodal context - * menus. - */ - public BaseNode( Object object ) - { - super( object ); - } - - /** - * Override this method to return a custom icon for the node - * @return - */ - public String getIconPath() - { - return null; - } - - public Color getBackgroundColor() - { - return null; - } - - public String toString() - { - if( getUserObject() != null ) - { - return (String)getUserObject(); - } - else - { - return "SDRTrunk"; - } - } - - public JPanel getEditor() - { - return new EmptyEditor(); - } - - /** - * Comparator to support nodal sorting/ordering - */ - @Override - public int compareTo( BaseNode node ) - { - return toString().compareTo( node.toString() ); - } - - /** - * This method only needs to be called once on the root node and all nodes - * in the tree will then have a reference to the model via getModel() - */ - public void setModel( ConfigurationControllerModel model ) - { - mModel = model; - } - - /** - * Returns reference to the SystemTreeModel. Only ConfigurableNode types - * or children are allowed in this tree, so this method assumes that the - * node or parent is of ConfigurableNode class or subclass. - * - * Reference to the model is required to enable node context operations - * like adding/deleting/stopping/starting. - */ - public ConfigurationControllerModel getModel() - { - if( mModel == null ) - { - TreeNode parent = getParent(); - - if( parent != null ) - { - return ((BaseNode)parent).getModel(); - } - else - { - return null; - } - } - else - { - return mModel; - } - } - - /** - * Supports a context menu for any children of the BaseNode. Override the - * method in the child node to provide a custom context menu for that node. - */ - public JPopupMenu getContextMenu() - { - return null; - } - - /** - * Invokes a recursive delete() on all children to perform any cleanup - * operations prior to deleting. Override this method to perform cleanup - * operations specific to the node. Remember to also either invoke - * super.delete(), or specifically call .delete() on any children of the - * node with the custom delete method. - */ - public void delete() - { - for( int x = 0; x < getChildCount(); x++ ) - { - BaseNode node = (BaseNode)getChildAt( x ); - - //Tell the node to delete its children - node.delete(); - - //Delete the child node - getModel().deleteNode( node ); - } - } - - public void show() - { - getModel().showNode( this ); - } - - public void refresh() - { - if( getModel() != null ) - { - getModel().nodeChanged( this ); - } - } - - public void sort() - { - List nodesToSort = new ArrayList(); - - while( children().hasMoreElements() ) - { - BaseNode child = (BaseNode)children().nextElement(); - - nodesToSort.add( child ); - - getModel().removeNodeFromParent( child ); - } - - if( !nodesToSort.isEmpty() ) - { - Collections.sort( nodesToSort ); - - for( BaseNode node: nodesToSort ) - { - getModel().insertNodeInto( node, this, getChildCount() ); - } - } - } -} diff --git a/src/controller/ConfigurableNode.java b/src/controller/ConfigurableNode.java deleted file mode 100644 index 77da7453..00000000 --- a/src/controller/ConfigurableNode.java +++ /dev/null @@ -1,54 +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 controller; - -import playlist.PlaylistManager; - -public abstract class ConfigurableNode extends BaseNode -{ - private static final long serialVersionUID = 1L; - - private PlaylistManager mPlaylistManager; - - public ConfigurableNode( PlaylistManager playlistManager, Object object ) - { - super( object ); - - mPlaylistManager = playlistManager; - } - - protected PlaylistManager getPlaylistManager() - { - return mPlaylistManager; - } - - /** - * Saves changes to the node - */ - public void save() - { - mPlaylistManager.save(); - - BaseNode parent = (BaseNode)getParent(); - - if( parent instanceof ConfigurableNode ) - { - ((ConfigurableNode)parent).sort(); - } - } -} diff --git a/src/controller/ConfigurationControllerModel.java b/src/controller/ConfigurationControllerModel.java deleted file mode 100644 index c3f28c87..00000000 --- a/src/controller/ConfigurationControllerModel.java +++ /dev/null @@ -1,246 +0,0 @@ -/******************************************************************************* - * SDR Trunk - * Copyright (C) 2014,2015 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 controller; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import javax.swing.JTree; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.MutableTreeNode; -import javax.swing.tree.TreePath; - -import module.decode.DecoderType; -import settings.SettingsManager; -import source.SourceManager; -import source.tuner.Tuner; -import source.tuner.TunerGroupNode; -import source.tuner.TunerNode; -import source.tuner.TunerSelectionListener; -import controller.channel.Channel; -import controller.channel.ChannelModel; -import controller.channel.ChannelProcessingManager; - -public class ConfigurationControllerModel extends DefaultTreeModel -{ - private static final long serialVersionUID = 1L; - - private JTree mTree; - - private ArrayList mTunerSelectionListeners = - new ArrayList(); - - private TunerGroupNode mTunerGroupNode; - - private ChannelModel mChannelModel; - private ChannelProcessingManager mChannelProcessingManager; - private SettingsManager mSettingsManager; - private SourceManager mSourceManager; - - /** - * Implements a merged system controller and (tree) model. The user will - * primarily interact with the system nodes via the tree view, so from a - * design perspective, the model and the control are necessarily merged to - * work well with the JTree as the system view. - */ - public ConfigurationControllerModel( ChannelModel channelModel, - ChannelProcessingManager channelProcessingManager, - SettingsManager settingsManager, - SourceManager sourceManager ) - { - super( new BaseNode( null ) ); - - mChannelModel = channelModel; - mChannelProcessingManager = channelProcessingManager; - mSettingsManager = settingsManager; - mSourceManager = sourceManager; - - /** - * Give the root node a reference to this model, so that all nodes can - * invoke add/delete operations on the tree via context menu - */ - ((BaseNode)getRoot()).setModel( this ); - } - - public JTree getTree() - { - return mTree; - } - - /** - * init() gets invoked manually/externally, after all of the references - * are established in the constructor - */ - public void init() - { - /** - * Add the tuner group node - */ - mTunerGroupNode = new TunerGroupNode(); - insertNodeInto( mTunerGroupNode, (MutableTreeNode)root, 0 ); - addTuners( mTunerGroupNode ); - - /** - * Add the recording group node - */ -// mRecordingGroupNode = new RecordingGroupNode(); -// insertNodeInto( mRecordingGroupNode, (MutableTreeNode)root, 1 ); -// mRecordingGroupNode.loadRecordings(); - -// /** -// * Add the playlist node -// */ -// mPlaylistNode = new PlaylistNode( mChannelModel, mChannelProcessingManager, -// mPlaylistManager, mSettingsManager, mSourceManager ); -// insertNodeInto( mPlaylistNode, (MutableTreeNode)root, 1 ); -// mPlaylistNode.loadPlaylist(); - } - - public void showNode( DefaultMutableTreeNode node ) - { - if( mTree != null && node != null ) - { - mTree.setSelectionPath( new TreePath( node.getPath() ) ); - } - } - - public void setTree( JTree tree ) - { - mTree = tree; - } - - private void addTuners( TunerGroupNode parent ) - { - List tuners = mSourceManager.getTunerManager().getTuners(); - - for( Tuner tuner: tuners ) - { - TunerNode child = new TunerNode( mChannelModel, - mChannelProcessingManager, mSettingsManager, tuner ); - - insertNodeInto( child, parent, parent.getChildCount() ); - - parent.sort(); - - show( child ); - } - - } - - /** - * Convenience method to add a new default system, site and channel to - * the tree - */ - public void createChannel( long frequency, DecoderType decoder ) - { - throw new UnsupportedOperationException( "This has to be updated to new channel model format" ); -// System system = new System(); -// -// Site site = new Site(); -// system.addSite( site ); -// -// Channel channel = new Channel(); -// channel.setDecodeConfiguration( -// DecodeConfigFactory.getDecodeConfiguration( decoder ) ); -// SourceConfigTuner sourceConfig = new SourceConfigTuner(); -// sourceConfig.setFrequency( frequency ); -// channel.setSourceConfiguration( sourceConfig ); -// mResourceManager.getChannelManager().channelChanged( new ChannelEvent( channel, Event.NOTIFICATION_ADD ) ); -// channel.setEnabled( true, true ); -// site.addChannel( channel ); -// -// mPlaylistNode.getPlaylist().getSystemList().addSystem( system ); -// -// SystemNode systemNode = new SystemNode( system ); -// SystemListNode systemListNode = mPlaylistNode.getSystemListNode(); -// addNode( systemNode, systemListNode, systemListNode.getChildCount() ); -// systemNode.init(); -// -// systemNode.save(); - } - - public void addNode( BaseNode child, BaseNode parent, int index ) - { - insertNodeInto( child, parent, index ); - show( child ); - } - - public void deleteNode( BaseNode node ) - { - node.delete(); - } - - private void show( BaseNode node ) - { - if( mTree != null ) - { - mTree.scrollPathToVisible( new TreePath( node.getPath() ) ); - } - } - - public void addListener( TunerSelectionListener listener ) - { - mTunerSelectionListeners.add( listener ); - } - - public void removeListener( TunerSelectionListener listener ) - { - mTunerSelectionListeners.remove( listener ); - } - - /** - * Notifies registered listeners that the tuner has been selected - */ - public void fireTunerSelectedEvent( Tuner tuner ) - { - Iterator it = - mTunerSelectionListeners.iterator(); - - while( it.hasNext() ) - { - it.next().tunerSelected( tuner ); - } - } - - /** - * Fires a tuner selection event for the first tuner listed in the tree. - * This is mainly used on application startup to show the spectral display - * of the first tuner in the spectrum panel. - */ - public void fireFirstTunerSelected() - { - if( mTunerGroupNode.getChildCount() > 0 ) - { - TunerNode node = (TunerNode)mTunerGroupNode.getChildAt( 0 ); - - fireTunerSelectedEvent( node.getTuner() ); - } - } - - public ArrayList getCurrentChannelConfigs() - { - return null; - } - - private ArrayList getChannelConfigs( DefaultMutableTreeNode parent ) - { - return null; - } -} diff --git a/src/controller/ConfigurationTreePanel.java b/src/controller/ConfigurationTreePanel.java deleted file mode 100644 index 9644f1b8..00000000 --- a/src/controller/ConfigurationTreePanel.java +++ /dev/null @@ -1,117 +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 controller; - -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; - -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; -import javax.swing.JTree; -import javax.swing.SwingUtilities; -import javax.swing.event.TreeSelectionListener; -import javax.swing.tree.TreeSelectionModel; - -import net.miginfocom.swing.MigLayout; - -public class ConfigurationTreePanel extends JPanel -{ - private static final long serialVersionUID = 1L; - - protected JTree mSystemTree; - protected ConfigurationControllerModel mTreeModel; - - public ConfigurationTreePanel( ConfigurationControllerModel model ) - { - mTreeModel = model; - - initGUI(); - } - - private void initGUI() - { - setLayout( new MigLayout( "insets 0 0 0 0", "[grow,fill]", "[grow,fill][]") ); - - mSystemTree = new JTree( mTreeModel ); - mSystemTree.getSelectionModel().setSelectionMode( - TreeSelectionModel.SINGLE_TREE_SELECTION ); - mSystemTree.setShowsRootHandles( true ); - mSystemTree.addMouseListener( new MouseHandler() ); - mSystemTree.setCellRenderer( new ControllerTreeCellRenderer() ); - - //Give the model a reference to the tree, so that it can force newly - //added nodes to be displayed - mTreeModel.setTree( mSystemTree ); - - JScrollPane treeScroll = new JScrollPane( mSystemTree ); - add( treeScroll, "cell 0 0,span,grow" ); - } - - public void addTreeSelectionListener( TreeSelectionListener listener ) - { - mSystemTree.addTreeSelectionListener( listener ); - } - - public class MouseHandler implements MouseListener - { - public MouseHandler() - { - } - - @Override - public void mouseClicked( MouseEvent event ) - { - if( SwingUtilities.isRightMouseButton( event ) ) - { - int row = mSystemTree.getRowForLocation( event.getX(), - event.getY() ); - - if( row != -1 ) - { - mSystemTree.setSelectionRow( row ); - - Object selectedNode = - mSystemTree.getLastSelectedPathComponent(); - - if( selectedNode instanceof BaseNode ) - { - JPopupMenu contextMenu = - ((BaseNode)selectedNode).getContextMenu(); - - if( contextMenu != null ) - { - contextMenu.show( mSystemTree, - event.getX(), - event.getY() ); - } - } - } - } - } - - @Override - public void mousePressed( MouseEvent e ){} - @Override - public void mouseReleased( MouseEvent e ){} - @Override - public void mouseEntered( MouseEvent e ){} - @Override - public void mouseExited( MouseEvent e ){} - } -} diff --git a/src/controller/ControllerPanel.java b/src/controller/ControllerPanel.java index bcb21c13..a90becf8 100644 --- a/src/controller/ControllerPanel.java +++ b/src/controller/ControllerPanel.java @@ -35,8 +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 source.tuner.TunerModel; +import source.tuner.TunerViewPanel; import spectrum.ChannelSpectrumPanel; import alias.AliasController; import alias.AliasModel; @@ -55,36 +55,21 @@ public class ControllerPanel extends JPanel { private static final long serialVersionUID = 1L; - private ChannelList mChannelStateList; - - private TunerViewPanel mTunerManagerPanel; - - private CallEventPanel mCallEventPanel; - - private MessageActivityPanel mMessageActivityPanel; - - private ChannelSpectrumPanel mChannelSpectrumPanel; - private AliasController mAliasController; - - private ChannelController mChannelController; - - private JideTabbedPane mTabbedPane; - -// protected ConfigurationTreePanel mSystemControlViewPanel; -// protected OldConfigurationEditor mConfigurationEditor; -// protected JideSplitPane mSystemControlSplitPane; - - protected JTable mChannelActivityTable = new JTable(); private AudioPanel mAudioPanel; - private MapPanel mMapPanel; - + private CallEventPanel mCallEventPanel; + private ChannelController mChannelController; + private ChannelList mChannelStateList; private ChannelModel mChannelModel; - private ConfigurationControllerModel mController; - protected SettingsManager mSettingsManager; + private ChannelSpectrumPanel mChannelSpectrumPanel; + private MapPanel mMapPanel; + private MessageActivityPanel mMessageActivityPanel; + private TunerViewPanel mTunerManagerPanel; + + private JideTabbedPane mTabbedPane; + protected JTable mChannelActivityTable = new JTable(); public ControllerPanel( AudioManager audioManager, - ConfigurationControllerModel controller, AliasModel aliasModel, ChannelModel channelModel, ChannelMapModel channelMapModel, @@ -95,29 +80,27 @@ public class ControllerPanel extends JPanel TunerModel tunerModel ) { mChannelModel = channelModel; - mController = controller; - mSettingsManager = settingsManager; - mAudioPanel = new AudioPanel( mSettingsManager, sourceManager, audioManager ); + mAudioPanel = new AudioPanel( settingsManager, sourceManager, audioManager ); - mMapPanel = new MapPanel( mapService, mSettingsManager ); + mMapPanel = new MapPanel( mapService, settingsManager ); mMessageActivityPanel = new MessageActivityPanel( channelProcessingManager ); - mCallEventPanel = new CallEventPanel( mSettingsManager, channelProcessingManager ); + mCallEventPanel = new CallEventPanel( settingsManager, channelProcessingManager ); - mChannelSpectrumPanel = new ChannelSpectrumPanel( mSettingsManager, + mChannelSpectrumPanel = new ChannelSpectrumPanel( settingsManager, channelProcessingManager ); mChannelStateList = new ChannelList( channelModel, channelProcessingManager, - mSettingsManager ); + settingsManager ); mChannelController = new ChannelController( channelModel, channelMapModel, sourceManager, aliasModel ); - mAliasController = new AliasController( aliasModel, mSettingsManager ); + mAliasController = new AliasController( aliasModel, settingsManager ); - mTunerManagerPanel = new TunerViewPanel( tunerModel, mSettingsManager ); + mTunerManagerPanel = new TunerViewPanel( tunerModel ); init(); } @@ -128,17 +111,6 @@ public class ControllerPanel extends JPanel "[grow,fill]", "[grow,fill]") ); -// //System Configuration View and Editor -// mConfigurationEditor = new OldConfigurationEditor(); -// -// mSystemControlViewPanel = new ConfigurationTreePanel( mController ); -// mSystemControlViewPanel.addTreeSelectionListener( mConfigurationEditor ); - -// mSystemControlSplitPane = new JideSplitPane( JideSplitPane.HORIZONTAL_SPLIT ); -// mSystemControlSplitPane.setDividerSize( 5 ); -// mSystemControlSplitPane.add( mSystemControlViewPanel ); -// mSystemControlSplitPane.add( mConfigurationEditor ); - //Tabbed View - configuration, calls, messages, map mTabbedPane = new JideTabbedPane(); mTabbedPane.setFont( this.getFont() ); @@ -146,7 +118,6 @@ public class ControllerPanel extends JPanel mTabbedPane.addTab( "Tuners", mTunerManagerPanel ); mTabbedPane.addTab( "Channels", mChannelController ); mTabbedPane.addTab( "Aliases", mAliasController ); -// mTabbedPane.addTab( "Configuration", mSystemControlSplitPane ); mTabbedPane.addTab( "Channel Spectrum", mChannelSpectrumPanel ); mTabbedPane.addTab( "Events", mCallEventPanel ); mTabbedPane.addTab( "Messages", mMessageActivityPanel ); @@ -191,6 +162,10 @@ public class ControllerPanel extends JPanel audioChannelListSplit.setDividerSize( 5 ); audioChannelListSplit.add( mAudioPanel ); audioChannelListSplit.add( channelStateListScroll ); + + //Set preferred size to influence the split between these panels + audioChannelListSplit.setPreferredSize( new Dimension( 400, 500 ) ); + mTabbedPane.setPreferredSize( new Dimension( 880, 500 ) ); JideSplitPane channelSplit = new JideSplitPane( JideSplitPane.HORIZONTAL_SPLIT ); channelSplit.setDividerSize( 5 ); @@ -199,9 +174,4 @@ public class ControllerPanel extends JPanel add( channelSplit ); } - - public ConfigurationControllerModel getController() - { - return mController; - } } diff --git a/src/controller/ControllerTreeCellRenderer.java b/src/controller/ControllerTreeCellRenderer.java deleted file mode 100644 index 42a791d4..00000000 --- a/src/controller/ControllerTreeCellRenderer.java +++ /dev/null @@ -1,127 +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 controller; - -import java.awt.Color; -import java.awt.Component; -import java.awt.Image; -import java.util.HashMap; - -import javax.swing.ImageIcon; -import javax.swing.JTree; -import javax.swing.tree.DefaultTreeCellRenderer; - -public class ControllerTreeCellRenderer extends DefaultTreeCellRenderer -{ - private static final long serialVersionUID = 1L; - - public static final int MAX_ICON_HEIGHT = 16; - private HashMap mIcons = new HashMap(); - - public ControllerTreeCellRenderer() - { - } - - @Override - public Component getTreeCellRendererComponent( JTree tree, - Object value, boolean selected, boolean expanded, boolean isLeaf, - int row, boolean focused ) - { - Component c = super.getTreeCellRendererComponent( tree, value, selected, - expanded, isLeaf, row, focused ); - - if( value instanceof BaseNode ) - { - BaseNode node = (BaseNode)value; - - ImageIcon icon = getIcon( node ); - - setIcon( icon ); - - Color background = node.getBackgroundColor(); - - if( background != null ) - { - setBackground( background ); - setOpaque( true ); - - if( selected ) - { - if( background == Color.CYAN ) - { - setForeground( Color.ORANGE ); - } - else if( background == Color.GREEN ) - { - setForeground( Color.MAGENTA ); - } - else if( background == Color.RED ) - { - setForeground( Color.YELLOW ); - } - } - } - else - { - setOpaque( false ); - } - } - - return c; - } - - private ImageIcon getIcon( BaseNode node ) - { - ImageIcon icon = null; - - String filepath = node.getIconPath(); - - if( filepath != null ) - { - if( mIcons.containsKey( filepath ) ) - { - icon = mIcons.get( filepath ); - } - else - { - icon = new ImageIcon( filepath ); - - if( icon.getIconHeight() > MAX_ICON_HEIGHT ) - { - Image image = icon.getImage(); - - double scale = (double)icon.getIconHeight() / (double)MAX_ICON_HEIGHT; - - int scaledWidth = (int)( (double)icon.getIconWidth() / scale ); - - Image scaledImage = image.getScaledInstance( scaledWidth, - MAX_ICON_HEIGHT, java.awt.Image.SCALE_SMOOTH ); - - mIcons.put( filepath, new ImageIcon( scaledImage ) ); - } - else - { - mIcons.put( filepath, icon ); - } - - } - } - - return icon; - } -} diff --git a/src/controller/EmptyEditor.java b/src/controller/EmptyEditor.java deleted file mode 100644 index 83f21de3..00000000 --- a/src/controller/EmptyEditor.java +++ /dev/null @@ -1,59 +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 controller; - -import java.awt.BorderLayout; -import java.awt.Dimension; - -import javax.swing.JLabel; -import javax.swing.JPanel; - -public class EmptyEditor extends JPanel -{ - private static final long serialVersionUID = 1L; - - public EmptyEditor() - { - setLayout( new BorderLayout() ); - setPreferredSize( new Dimension( 200, (int)getPreferredSize().getHeight() ) ); - - String text = "" - + "

SDR Trunk

" - + "
" - + "

Use the tree structure to the left to configure SDRTrunk" - + " to use multiple SDR tuners and sound card sources to" - + " decode multiple trunked and digital radio channels.

" - + "
" - + "

Each tree branch can be accessed by clicking on the branch" - + " and a configuration editor will appear here.

" - + "
" - + "

Many of the branches contain context sensitive menus that " - + " you can access by right-clicking on the node.

" - + "
" - + "

To begin, right-click on the 'Systems' branch under 'Playlist'" - + "and create a new 'System'. Right-click the 'System' node to create " - + "a new 'Site'. Right-click on the 'Site' node to create a new Channel.

" - + "
" - + "

In the new channel, select a channel source and decoder " - + "and select event logging and recording options. Check 'Enabled'" - + " and hit the 'Save' button to begin decoding.

" - + ""; - - add( new JLabel( text ), BorderLayout.NORTH ); - } -} diff --git a/src/controller/OldConfigurationEditor.java b/src/controller/OldConfigurationEditor.java deleted file mode 100644 index 29d504ee..00000000 --- a/src/controller/OldConfigurationEditor.java +++ /dev/null @@ -1,74 +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 controller; - - -import java.awt.BorderLayout; - -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTree; -import javax.swing.event.TreeSelectionEvent; -import javax.swing.event.TreeSelectionListener; - -public class OldConfigurationEditor extends JPanel - implements TreeSelectionListener -{ - private static final long serialVersionUID = 1L; - - /** - * Host for configuration editor display panels - */ - public OldConfigurationEditor() - { - init(); - } - - public void init() - { - setPanel( new EmptyEditor() ); - } - - public void setPanel( JPanel display ) - { - removeAll(); - - setLayout( new BorderLayout() ); - - JScrollPane scroll = new JScrollPane( display ); - - add( scroll, BorderLayout.CENTER ); - - revalidate(); - repaint(); - } - - @Override - public void valueChanged( TreeSelectionEvent e ) - { - JTree tree = (JTree)e.getSource(); - - BaseNode node = - (BaseNode)tree.getLastSelectedPathComponent(); - - if( node != null ) - { - setPanel( node.getEditor() ); - } - } -} diff --git a/src/gui/SDRTrunk.java b/src/gui/SDRTrunk.java index 16658a8f..dc84bb70 100644 --- a/src/gui/SDRTrunk.java +++ b/src/gui/SDRTrunk.java @@ -54,11 +54,12 @@ import org.slf4j.LoggerFactory; import playlist.PlaylistManager; import properties.SystemProperties; import record.RecorderManager; +import sample.Listener; import settings.SettingsManager; import source.SourceManager; -import source.TunerModel; -import source.tuner.Tuner; -import source.tuner.TunerSelectionListener; +import source.tuner.TunerEvent; +import source.tuner.TunerModel; +import source.tuner.configuration.TunerConfigurationModel; import spectrum.SpectralDisplayPanel; import util.TimeStamp; import alias.AliasModel; @@ -67,7 +68,6 @@ import audio.AudioManager; import com.jidesoft.swing.JideSplitPane; -import controller.ConfigurationControllerModel; import controller.ControllerPanel; import controller.ThreadPoolManager; import controller.ThreadPoolManager.ThreadType; @@ -77,7 +77,7 @@ import controller.channel.ChannelProcessingManager; import controller.channel.ChannelSelectionManager; import controller.channel.map.ChannelMapModel; -public class SDRTrunk +public class SDRTrunk implements Listener { private final static Logger mLog = LoggerFactory.getLogger( SDRTrunk.class ); @@ -115,7 +115,10 @@ public class SDRTrunk //Log current properties setting SystemProperties.getInstance().logCurrentSettings(); - mSettingsManager = new SettingsManager(); + TunerConfigurationModel tunerConfigurationModel = new TunerConfigurationModel(); + TunerModel tunerModel = new TunerModel( tunerConfigurationModel ); + + mSettingsManager = new SettingsManager( tunerConfigurationModel ); ThreadPoolManager threadPoolManager = new ThreadPoolManager(); @@ -129,12 +132,9 @@ public class SDRTrunk RecorderManager recorderManager = new RecorderManager( threadPoolManager ); - SourceManager sourceManager = new SourceManager( mSettingsManager, - threadPoolManager ); + SourceManager sourceManager = new SourceManager( tunerModel, + mSettingsManager, threadPoolManager ); - TunerModel tunerModel = new TunerModel(); - tunerModel.addTuners( sourceManager.getTunerManager().getTuners() ); - ChannelProcessingManager channelProcessingManager = new ChannelProcessingManager( channelModel, channelMapModel, aliasModel, eventLogManager, recorderManager, @@ -156,18 +156,15 @@ public class SDRTrunk MapService mapService = new MapService( mSettingsManager ); channelProcessingManager.addMessageListener( mapService ); - ConfigurationControllerModel configurationControllerModel = - new ConfigurationControllerModel( channelModel, channelProcessingManager, - mSettingsManager, sourceManager ); - - mControllerPanel = new ControllerPanel( audioManager, configurationControllerModel, - aliasModel, channelModel, channelMapModel, channelProcessingManager, + mControllerPanel = new ControllerPanel( audioManager, aliasModel, + channelModel, channelMapModel, channelProcessingManager, mapService, mSettingsManager, sourceManager, tunerModel ); - mSpectralPanel = new SpectralDisplayPanel( configurationControllerModel, - channelModel, channelProcessingManager, mSettingsManager ); - - mTitle = getTitle(); + mSpectralPanel = new SpectralDisplayPanel( channelModel, + channelProcessingManager, mSettingsManager ); + + tunerModel.addListener( mSpectralPanel.getTunerEventListener() ); + tunerModel.addListener( this ); PlaylistManager playlistManager = new PlaylistManager( threadPoolManager, aliasModel, channelModel, channelMapModel ); @@ -186,6 +183,8 @@ public class SDRTrunk //Initialize the GUI initGUI(); + + tunerModel.requestFirstTunerDisplay(); //Start the gui EventQueue.invokeLater( new Runnable() @@ -221,36 +220,17 @@ public class SDRTrunk "[grow,fill]", "[grow,fill]") ); - //init() the controller to load tuners and playlists - mControllerPanel.getController().init(); - /** * Setup main JFrame window */ + mTitle = getTitle(); mMainGui.setTitle( mTitle ); mMainGui.setBounds( 100, 100, 1280, 800 ); mMainGui.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); - - mControllerPanel.getController().addListener( new TunerSelectionListener() - { - @Override - public void tunerSelected( Tuner tuner ) - { - if( tuner != null ) - { - mMainGui.setTitle( mTitle + " - " + tuner.getName() ); - } - else - { - mMainGui.setTitle( mTitle ); - } - } - } ); - //Fire first tuner selection so it is displayed in the spectrum/waterfall - mControllerPanel.getController().fireFirstTunerSelected(); - - mSpectralPanel.setPreferredSize( new Dimension( 1280, 400 ) ); + //Set preferred sizes to influence the split + mSpectralPanel.setPreferredSize( new Dimension( 1280, 300 ) ); + mControllerPanel.setPreferredSize( new Dimension( 1280, 500 ) ); JideSplitPane splitPane = new JideSplitPane( JideSplitPane.VERTICAL_SPLIT ); splitPane.setDividerSize( 5 ); @@ -487,5 +467,13 @@ public class SDRTrunk return sb.toString(); } - + + @Override + public void receive( TunerEvent event ) + { + if( event.getEvent() == TunerEvent.Event.REQUEST_MAIN_SPECTRAL_DISPLAY ) + { + mMainGui.setTitle( mTitle + " - " + event.getTuner().getName() ); + } + } } diff --git a/src/gui/editor/EmptyEditor.java b/src/gui/editor/EmptyEditor.java index 4578df0b..128407fc 100644 --- a/src/gui/editor/EmptyEditor.java +++ b/src/gui/editor/EmptyEditor.java @@ -10,7 +10,7 @@ public class EmptyEditor extends Editor public EmptyEditor() { - setLayout( new MigLayout( "", "[center]", "[grow]" ) ); + setLayout( new MigLayout( "insets 0 0 0 0", "[center]", "[grow]" ) ); add( new JLabel( "Please select an item" ), "wrap" ); } diff --git a/src/module/decode/p25/P25DecodeEditor.java b/src/module/decode/p25/P25DecodeEditor.java index c87d1e7c..ccdfb281 100644 --- a/src/module/decode/p25/P25DecodeEditor.java +++ b/src/module/decode/p25/P25DecodeEditor.java @@ -33,7 +33,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import source.SourceEditor; -import source.tuner.TunerEditor; +import source.tuner.TunerEditorOld; import controller.channel.ChannelConfigurationEditor; import controller.channel.ConfigurationValidationException; diff --git a/src/settings/Settings.java b/src/settings/Settings.java index 464e4d46..1166592a 100644 --- a/src/settings/Settings.java +++ b/src/settings/Settings.java @@ -28,10 +28,10 @@ import map.DefaultIcon; import map.MapIcon; import settings.ColorSetting.ColorSettingName; import source.recording.RecordingConfiguration; -import source.tuner.TunerConfiguration; -import source.tuner.TunerConfigurationAssignment; import source.tuner.TunerType; import source.tuner.airspy.AirspyTunerConfiguration; +import source.tuner.configuration.TunerConfiguration; +import source.tuner.configuration.TunerConfigurationAssignment; import source.tuner.fcd.proV1.FCD1TunerConfiguration; import source.tuner.fcd.proplusV2.FCD2TunerConfiguration; import source.tuner.hackrf.HackRFTunerConfiguration; @@ -60,15 +60,15 @@ import source.tuner.rtl.r820t.R820TTunerConfiguration; @XmlRootElement( name = "SDRTrunk_settings" ) public class Settings { - private ArrayList mSettings = new ArrayList(); + private List mSettings = new ArrayList(); - private ArrayList mTunerConfiguration = + private List mTunerConfiguration = new ArrayList(); - private ArrayList mConfigurationAssignments = + private List mConfigurationAssignments = new ArrayList(); - private ArrayList mRecordingConfigurations = + private List mRecordingConfigurations = new ArrayList(); public Settings() @@ -76,7 +76,7 @@ public class Settings } @XmlElement( name="recording_configuration" ) - public ArrayList getRecordingConfigurations() + public List getRecordingConfigurations() { return mRecordingConfigurations; } @@ -98,12 +98,12 @@ public class Settings } @XmlElement( name="tuner_configuration" ) - public ArrayList getTunerConfigurations() + public List getTunerConfigurations() { return mTunerConfiguration; } - public void setTunerConfigurations( ArrayList configs ) + public void setTunerConfigurations( List configs ) { mTunerConfiguration = configs; } @@ -136,7 +136,7 @@ public class Settings } @XmlElement( name="setting" ) - public ArrayList getSettings() + public List getSettings() { return mSettings; } @@ -255,12 +255,12 @@ public class Settings } @XmlElement( name="tuner_configuration_assignment" ) - public ArrayList getSelectedTunerConfiguration() + public List getSelectedTunerConfiguration() { return mConfigurationAssignments; } - public void setSelectedTunerConfiguration( ArrayList configs ) + public void setSelectedTunerConfiguration( List configs ) { mConfigurationAssignments = configs; } diff --git a/src/settings/SettingsManager.java b/src/settings/SettingsManager.java index 3cac8abe..9529c9f6 100644 --- a/src/settings/SettingsManager.java +++ b/src/settings/SettingsManager.java @@ -1,6 +1,6 @@ /******************************************************************************* * SDR Trunk - * Copyright (C) 2014 Dennis Sheirer + * Copyright (C) 2014-2016 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 @@ -30,6 +30,7 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import javax.swing.ImageIcon; import javax.xml.bind.JAXBContext; @@ -45,19 +46,13 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import properties.SystemProperties; +import sample.Listener; import settings.ColorSetting.ColorSettingName; import source.recording.RecordingConfiguration; -import source.tuner.TunerConfiguration; -import source.tuner.TunerConfigurationAssignment; -import source.tuner.TunerType; -import source.tuner.airspy.AirspyTunerConfiguration; -import source.tuner.fcd.proV1.FCD1TunerConfiguration; -import source.tuner.fcd.proplusV2.FCD2TunerConfiguration; -import source.tuner.hackrf.HackRFTunerConfiguration; -import source.tuner.rtl.e4k.E4KTunerConfiguration; -import source.tuner.rtl.r820t.R820TTunerConfiguration; +import source.tuner.configuration.TunerConfigurationEvent; +import source.tuner.configuration.TunerConfigurationModel; -public class SettingsManager +public class SettingsManager implements Listener { private final static Logger mLog = LoggerFactory.getLogger( SettingsManager.class ); @@ -76,8 +71,20 @@ public class SettingsManager private HashMap mResizedIcons = new HashMap(); - public SettingsManager() + private TunerConfigurationModel mTunerConfigurationModel; + private boolean mLoading = false; + + public SettingsManager( TunerConfigurationModel tunerConfigurationModel ) { + //TODO: move settings and icons into a SettingsModel and an IconModel + //and update this class to only provide loading, saving, and model + //change detection producing a save. + + mTunerConfigurationModel = tunerConfigurationModel; + + //Register for tuner config events so that we can save the settings + mTunerConfigurationModel.addListener( this ); + init(); } @@ -101,6 +108,15 @@ public class SettingsManager refreshIcons(); } + + @Override + public void receive( TunerConfigurationEvent t ) + { + if( !mLoading ) + { + save(); + } + } /** * Reloads the icon hash map, and sets up the default iconology. If the @@ -542,7 +558,7 @@ public class SettingsManager broadcastSettingChange( setting ); } - public ArrayList getRecordingConfigurations() + public List getRecordingConfigurations() { return mSettings.getRecordingConfigurations(); } @@ -559,98 +575,6 @@ public class SettingsManager save(); } - public ArrayList getTunerConfigurations( TunerType type ) - { - ArrayList configs = getSettings() - .getTunerConfigurations( type ); - - return configs; - } - - public void deleteTunerConfiguration( TunerConfiguration config ) - { - getSettings().removeTunerConfiguration( config ); - save(); - } - - public TunerConfiguration addNewTunerConfiguration( TunerType type, - String name ) - { - switch( type ) - { - case AIRSPY_R820T: - AirspyTunerConfiguration airspyConfig = - new AirspyTunerConfiguration( name ); - - getSettings().addTunerConfiguration( airspyConfig ); - - save(); - return airspyConfig; - case ELONICS_E4000: - E4KTunerConfiguration e4KConfig = - new E4KTunerConfiguration( name ); - - getSettings().addTunerConfiguration( e4KConfig ); - - save(); - return e4KConfig; - case FUNCUBE_DONGLE_PRO: - FCD1TunerConfiguration config = - new FCD1TunerConfiguration( name ); - - getSettings().addTunerConfiguration( config ); - - save(); - - return config; - case FUNCUBE_DONGLE_PRO_PLUS: - FCD2TunerConfiguration configPlus = - new FCD2TunerConfiguration( name ); - - getSettings().addTunerConfiguration( configPlus ); - - save(); - - return configPlus; - case HACKRF: - HackRFTunerConfiguration hackConfig = - new HackRFTunerConfiguration( name ); - - getSettings().addTunerConfiguration( hackConfig ); - - save(); - - return hackConfig; - case RAFAELMICRO_R820T: - R820TTunerConfiguration r820TConfig = - new R820TTunerConfiguration( name ); - - getSettings().addTunerConfiguration( r820TConfig ); - - save(); - - return r820TConfig; - default: - throw new IllegalArgumentException( "TunerConfiguration" - + "Directory - tuner type is unrecognized [" + - type.toString() + "]" ); - } - } - - public TunerConfigurationAssignment getSelectedTunerConfiguration( - TunerType type, String address ) - { - return mSettings.getConfigurationAssignment( type, address ); - } - - public void setSelectedTunerConfiguration( TunerType type, - String address, TunerConfiguration config ) - { - mSettings.setConfigurationAssignment( type, address, config.getName() ); - - save(); - } - public MapViewSetting getMapViewSetting( String name, GeoPosition position, int zoom ) { MapViewSetting loc = mSettings.getMapViewSetting( name ); @@ -681,6 +605,8 @@ public class SettingsManager public void save() { + saveTunerConfigurationModel(); + JAXBContext context = null; SystemProperties props = SystemProperties.getInstance(); @@ -759,6 +685,8 @@ public class SettingsManager */ public void load( Path settingsPath ) { + mLoading = true; + if( Files.exists( settingsPath ) ) { mLog.info( "SettingsManager - loading settings file [" + @@ -817,6 +745,36 @@ public class SettingsManager { mSettings = new Settings(); } + + loadTunerConfigurationModel(); + + mLoading = false; + } + + private void loadTunerConfigurationModel() + { + if( mSettings != null ) + { + mTunerConfigurationModel.clear(); + + mTunerConfigurationModel.addTunerConfigurations( + mSettings.getTunerConfigurations() ); + + mTunerConfigurationModel.addTunerConfigurationAssignments( + mSettings.getSelectedTunerConfiguration() ); + } + } + + private void saveTunerConfigurationModel() + { + if( mSettings != null ) + { + mSettings.setTunerConfigurations( + mTunerConfigurationModel.getTunerConfigurations() ); + + mSettings.setSelectedTunerConfiguration( + mTunerConfigurationModel.getTunerConfigurationAssignments() ); + } } public void broadcastSettingChange( Setting setting ) diff --git a/src/source/SourceManager.java b/src/source/SourceManager.java index c4a06e19..450a8b53 100644 --- a/src/source/SourceManager.java +++ b/src/source/SourceManager.java @@ -18,13 +18,15 @@ package source; import settings.SettingsManager; +import source.config.SourceConfigTuner; import source.config.SourceConfiguration; import source.mixer.MixerEditor; import source.mixer.MixerManager; import source.recording.RecordingEditor; import source.recording.RecordingSourceManager; -import source.tuner.TunerEditor; +import source.tuner.TunerEditorOld; import source.tuner.TunerManager; +import source.tuner.TunerModel; import controller.ThreadPoolManager; public class SourceManager @@ -32,13 +34,19 @@ public class SourceManager private MixerManager mMixerManager; private RecordingSourceManager mRecordingSourceManager; private TunerManager mTunerManager; + private TunerModel mTunerModel; - public SourceManager( SettingsManager settingsManager, + public SourceManager( TunerModel tunerModel, + SettingsManager settingsManager, ThreadPoolManager threadPoolManager ) { + mTunerModel = tunerModel; mMixerManager = new MixerManager(); mRecordingSourceManager = new RecordingSourceManager( settingsManager ); - mTunerManager = new TunerManager( mMixerManager, settingsManager, threadPoolManager ); + mTunerManager = new TunerManager( mMixerManager, tunerModel, threadPoolManager ); + + //TODO: change mixer & recording managers to be models and hand them + //in via the constructor. Perform loading outside of this class. } public MixerManager getMixerManager() @@ -67,7 +75,7 @@ public class SourceManager retVal = mMixerManager.getSource( config ); break; case TUNER: - retVal = mTunerManager.getSource( config, bandwidth ); + retVal = mTunerModel.getSource( (SourceConfigTuner)config, bandwidth ); break; case RECORDING: retVal = mRecordingSourceManager.getSource( config, bandwidth ); @@ -89,7 +97,7 @@ public class SourceManager configuredPanel = new MixerEditor( this, config ); break; case TUNER: - configuredPanel = new TunerEditor( this, config ); + configuredPanel = new TunerEditorOld( this, config ); break; case RECORDING: configuredPanel = new RecordingEditor( this, config ); diff --git a/src/source/TunerModel.java b/src/source/TunerModel.java deleted file mode 100644 index 4e5655a4..00000000 --- a/src/source/TunerModel.java +++ /dev/null @@ -1,184 +0,0 @@ -package source; - -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.table.AbstractTableModel; - -import sample.Listener; -import source.tuner.Tuner; -import source.tuner.TunerChangeEvent; - -public class TunerModel extends AbstractTableModel - implements Listener -{ - private static final long serialVersionUID = 1L; - - private static final int TUNER_CLASS = 0; - private static final int TUNER_TYPE = 1; - private static final int SAMPLE_RATE = 2; - private static final int FREQUENCY = 3; - private static final int CHANNEL_COUNT = 4; - private static final int SPECTRAL_DISPLAY = 5; - - private static final String MHZ = " MHz"; - private static final String[] COLUMNS = - { "Class", "Type", "Sample Rate", "Frequency", "Channels", "Spectrum" }; - - private List mTuners = new ArrayList<>(); - private DecimalFormat mFrequencyFormat = new DecimalFormat( "0.00000" ); - private DecimalFormat mSampleRateFormat = new DecimalFormat( "0.000" ); - - public TunerModel() - { - } - - /** - * List of Tuners currently in the model - */ - public List getTuners() - { - return mTuners; - } - - public Tuner getTuner( int index ) - { - if( index < mTuners.size() ) - { - return mTuners.get( index ); - } - - return null; - } - - 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 ); - - fireTableRowsInserted( index, index ); - - tuner.addTunerChangeListener( this ); - } - } - - /** - * Removes the Tuner from this model - */ - public void removeTuner( Tuner tuner ) - { - if( mTuners.contains( tuner ) ) - { - tuner.removeTunerChangeListener( this ); - - int index = mTuners.indexOf( tuner ); - - mTuners.remove( tuner ); - - fireTableRowsDeleted( index, index ); - } - } - - - @Override - public void receive( TunerChangeEvent event ) - { - if( event.getTuner() != null ) - { - int index = mTuners.indexOf( event.getTuner() ); - - if( index >= 0 ) - { - switch( event.getEvent() ) - { - case CHANNEL_COUNT: - fireTableCellUpdated( index, CHANNEL_COUNT ); - break; - case FREQUENCY: - fireTableCellUpdated( index, FREQUENCY ); - break; - case SAMPLE_RATE: - fireTableCellUpdated( index, SAMPLE_RATE ); - break; - case SPECTRAL_DISPLAY: - fireTableCellUpdated( index, SPECTRAL_DISPLAY ); - default: - break; - } - } - } - } - - @Override - public int getRowCount() - { - return mTuners.size(); - } - - @Override - public int getColumnCount() - { - return 6; - } - - @Override - public Object getValueAt( int rowIndex, int columnIndex ) - { - if( rowIndex < mTuners.size() ) - { - Tuner tuner = mTuners.get( rowIndex ); - - switch( columnIndex ) - { - case TUNER_CLASS: - return tuner.getTunerClass().getVendorDescription(); - case TUNER_TYPE: - return tuner.getTunerType().getLabel(); - case SAMPLE_RATE: - int sampleRate = tuner.getSampleRate(); - - return mSampleRateFormat.format( sampleRate / 1E6D ) + MHZ; - case FREQUENCY: - try - { - long frequency = tuner.getFrequency(); - - return mFrequencyFormat.format( frequency / 1E6D ) + MHZ; - } - catch( Exception e ) - { - return 0; - } - case CHANNEL_COUNT: - return tuner.getChannelCount(); - case SPECTRAL_DISPLAY: - return "TBD"; - default: - break; - } - } - - return null; - } - - @Override - public String getColumnName( int columnIndex ) - { - return COLUMNS[ columnIndex ]; - } -} diff --git a/src/source/recording/RecordingEditorPanel.java b/src/source/recording/RecordingEditorPanel.java deleted file mode 100644 index 408538d5..00000000 --- a/src/source/recording/RecordingEditorPanel.java +++ /dev/null @@ -1,130 +0,0 @@ -package source.recording; - -import gui.control.JFrequencyControl; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.FocusEvent; -import java.awt.event.FocusListener; -import java.io.File; - -import javax.swing.JButton; -import javax.swing.JFileChooser; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JTextField; - -import net.miginfocom.swing.MigLayout; - -public class RecordingEditorPanel extends JPanel -{ - private static final long serialVersionUID = 1L; - - private RecordingNode mRecordingNode; - - private JTextField mRecordingAlias; - private JLabel mFilePathLabel; - - public RecordingEditorPanel( RecordingNode recordingNode ) - { - mRecordingNode = recordingNode; - - initGUI(); - } - - private void initGUI() - { - setLayout( new MigLayout( "fill,wrap 2", "[right,grow][grow]", "[][][][][][grow]" ) ); - - add( new JLabel( "I/Q Recording" ), "span,align left" ); - - add( new JLabel( "Alias:" ) ); - - mRecordingAlias = new JTextField( mRecordingNode.getRecording() - .getRecordingConfiguration().getAlias() ); - - mRecordingAlias.addFocusListener( new FocusListener() - { - @Override - public void focusLost( FocusEvent arg0 ) - { - String alias = mRecordingAlias.getText(); - - if( alias != null ) - { - mRecordingNode.getRecording().setAlias( alias ); - } - } - - @Override - public void focusGained( FocusEvent arg0 ) {} - } ); - - add( mRecordingAlias, "wrap" ); - - JButton mFileSelectionButton = new JButton( "File ..." ); - mFileSelectionButton.addActionListener( new ActionListener() - { - @Override - public void actionPerformed( ActionEvent arg0 ) - { - if( mRecordingNode.getRecording().hasChannels() ) - { - JOptionPane.showMessageDialog( RecordingEditorPanel.this, - "This recording is currently in replay. Please " - + "disable any channels that are using this " - + "recording before changing the recording file." ); - } - else - { - final JFileChooser fc = new JFileChooser(); - - int returnVal = fc.showOpenDialog( RecordingEditorPanel.this ); - - if ( returnVal == JFileChooser.APPROVE_OPTION ) - { - File file = fc.getSelectedFile(); - - if( file != null && file.exists() ) - { - mRecordingNode.getRecording() - .getRecordingConfiguration() - .setFilePath( file.getAbsolutePath() ); - - if( mFilePathLabel != null ) - { - mFilePathLabel.setText( file.getName() ); - } - } - } - } - } - } ); - add( mFileSelectionButton ); - - String filePath = mRecordingNode.getRecording() - .getRecordingConfiguration().getFilePath(); - - if( filePath != null ) - { - mFilePathLabel = new JLabel( filePath ); - } - else - { - mFilePathLabel = new JLabel( "Please select a recording" ); - } - - add( mFilePathLabel, "wrap" ); - - add( new JLabel( "Center Frequency:" ), "span,align left" ); - - JFrequencyControl frequencyControl = new JFrequencyControl( - mRecordingNode.getRecording().getRecordingConfiguration() - .getCenterFrequency() ); - - frequencyControl.addListener( mRecordingNode.getRecording() ); - - add( frequencyControl, "span,align left" ); - } -} diff --git a/src/source/recording/RecordingGroupNode.java b/src/source/recording/RecordingGroupNode.java deleted file mode 100644 index 3e9d4631..00000000 --- a/src/source/recording/RecordingGroupNode.java +++ /dev/null @@ -1,101 +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.recording; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.List; - -import javax.swing.JMenuItem; -import javax.swing.JPopupMenu; - -import settings.SettingsManager; -import source.SourceManager; -import controller.BaseNode; - -public class RecordingGroupNode extends BaseNode -{ - private static final long serialVersionUID = 1L; - - private SettingsManager mSettingsManager; - - public RecordingGroupNode( SourceManager sourceManager, SettingsManager settingsManager ) - { - super( sourceManager ); - - mSettingsManager = settingsManager; - } - - private SourceManager getSourceManager() - { - return (SourceManager)getUserObject(); - } - - public String toString() - { - return "Recordings [" + this.getChildCount() + "]"; - } - - public JPopupMenu getContextMenu() - { - JPopupMenu menu = new JPopupMenu(); - - JMenuItem addRecordingItem = new JMenuItem( "Add Recording" ); - - addRecordingItem.addActionListener( new ActionListener() - { - @Override - public void actionPerformed( ActionEvent e ) - { - RecordingConfiguration config = new RecordingConfiguration(); - - mSettingsManager.addRecordingConfiguration( config ); - - Recording recording = getSourceManager() - .getRecordingSourceManager().addRecording( config ); - - RecordingNode node = new RecordingNode( getSourceManager(), recording ); - - getModel().addNode( node, RecordingGroupNode.this, 0 ); - - sort(); - - node.show(); - } - } ); - - menu.add( addRecordingItem ); - - return menu; - } - - public void loadRecordings() - { - List recordings = getSourceManager() - .getRecordingSourceManager().getRecordings(); - - for( Recording recording: recordings ) - { - RecordingNode node = new RecordingNode( getSourceManager(), recording ); - - getModel().addNode( node, this, 0 ); - } - - sort(); - } -} diff --git a/src/source/recording/RecordingNode.java b/src/source/recording/RecordingNode.java deleted file mode 100644 index 920602e3..00000000 --- a/src/source/recording/RecordingNode.java +++ /dev/null @@ -1,82 +0,0 @@ -package source.recording; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; - -import source.SourceManager; -import controller.BaseNode; - -public class RecordingNode extends BaseNode -{ - private static final long serialVersionUID = 1L; - - private JPanel mEditor; - - private SourceManager mSourceManager; - - public RecordingNode( SourceManager sourceManager, Recording recording ) - { - super( recording ); - } - - public Recording getRecording() - { - return (Recording)getUserObject(); - } - - public String toString() - { - return getRecording().toString(); - } - - @Override - public JPanel getEditor() - { - if( mEditor == null ) - { - mEditor = new RecordingEditorPanel( this ); - } - - return mEditor; - } - - public JPopupMenu getContextMenu() - { - JPopupMenu menu = new JPopupMenu(); - - JMenuItem deleteItem = new JMenuItem( "Delete" ); - - deleteItem.addActionListener( new ActionListener() - { - @Override - public void actionPerformed( ActionEvent e ) - { - if( getRecording().hasChannels() ) - { - JOptionPane.showMessageDialog( getModel().getTree(), - "Can't delete recording - currently in use. Please" - + " disable any channel(s) that are using this " - + "recording before deleting it", - "Can't delete recording", - JOptionPane.ERROR_MESSAGE ); - } - else - { - mSourceManager.getRecordingSourceManager() - .removeRecording( getRecording() ); - - getModel().removeNodeFromParent( RecordingNode.this ); - } - } - } ); - - menu.add( deleteItem ); - - return menu; - } -} diff --git a/src/source/recording/RecordingSourceManager.java b/src/source/recording/RecordingSourceManager.java index a047b170..fa0ae8b7 100644 --- a/src/source/recording/RecordingSourceManager.java +++ b/src/source/recording/RecordingSourceManager.java @@ -131,7 +131,7 @@ public class RecordingSourceManager private void loadRecordings() { - ArrayList recordingConfigurations = + List recordingConfigurations = mSettingsManager.getRecordingConfigurations(); mLog.info( "RecordingSourceManager - discovered [" + diff --git a/src/source/tuner/Tuner.java b/src/source/tuner/Tuner.java index cc4a8195..0a0215f2 100644 --- a/src/source/tuner/Tuner.java +++ b/src/source/tuner/Tuner.java @@ -31,6 +31,7 @@ import sample.Listener; import sample.complex.ComplexBuffer; import settings.SettingsManager; import source.SourceException; +import source.tuner.configuration.TunerConfiguration; import source.tuner.frequency.FrequencyChangeEvent; import source.tuner.frequency.FrequencyChangeEvent.Event; import source.tuner.frequency.IFrequencyChangeProcessor; @@ -55,7 +56,7 @@ public abstract class Tuner implements IFrequencyChangeProcessor, protected List mFrequencyChangeProcessors = new CopyOnWriteArrayList<>(); - protected List> mTunerChangeListeners = + protected List> mTunerChangeListeners = new ArrayList<>(); public Tuner( String name ) @@ -79,12 +80,6 @@ public abstract class Tuner implements IFrequencyChangeProcessor, mName = name; } - /** - * Return an editor panel for the tuner - */ - public abstract JPanel getEditor( SettingsManager settingsManager ); - - /** * Applies the settings from a saved tuner configuration setting object */ @@ -223,7 +218,7 @@ public abstract class Tuner implements IFrequencyChangeProcessor, /** * Registers the listener */ - public void addTunerChangeListener( Listener listener ) + public void addTunerChangeListener( Listener listener ) { mTunerChangeListeners.add( listener ); } @@ -231,7 +226,7 @@ public abstract class Tuner implements IFrequencyChangeProcessor, /** * Removes the registered listener */ - public void removeTunerChangeListener( Listener listener ) + public void removeTunerChangeListener( Listener listener ) { mTunerChangeListeners.remove( listener ); } @@ -239,9 +234,9 @@ public abstract class Tuner implements IFrequencyChangeProcessor, /** * Broadcasts the tuner change event */ - public void broadcast( TunerChangeEvent event ) + public void broadcast( TunerEvent event ) { - for( Listener listener: mTunerChangeListeners ) + for( Listener listener: mTunerChangeListeners ) { listener.receive( event ); } @@ -277,11 +272,11 @@ public abstract class Tuner implements IFrequencyChangeProcessor, if( event.getEvent() == Event.NOTIFICATION_FREQUENCY_CHANGE ) { - broadcast( new TunerChangeEvent( this, TunerChangeEvent.Event.FREQUENCY ) ); + broadcast( new TunerEvent( this, TunerEvent.Event.FREQUENCY ) ); } else if( event.getEvent() == Event.NOTIFICATION_SAMPLE_RATE_CHANGE ) { - broadcast( new TunerChangeEvent( this, TunerChangeEvent.Event.SAMPLE_RATE ) ); + broadcast( new TunerEvent( this, TunerEvent.Event.SAMPLE_RATE ) ); } } diff --git a/src/source/tuner/TunerController.java b/src/source/tuner/TunerController.java index 65a6d859..832b4b2f 100644 --- a/src/source/tuner/TunerController.java +++ b/src/source/tuner/TunerController.java @@ -25,6 +25,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import source.SourceException; +import source.tuner.configuration.TunerConfiguration; import source.tuner.frequency.FrequencyController; import source.tuner.frequency.FrequencyController.Tunable; import source.tuner.frequency.IFrequencyChangeProcessor; diff --git a/src/source/tuner/TunerEditor.java b/src/source/tuner/TunerEditor.java index 2be792a1..18799074 100644 --- a/src/source/tuner/TunerEditor.java +++ b/src/source/tuner/TunerEditor.java @@ -1,75 +1,168 @@ -/******************************************************************************* - * 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.tuner; -import controller.channel.Channel; -import controller.channel.ConfigurationValidationException; import gui.control.JFrequencyControl; -import source.SourceEditor; -import source.SourceManager; -import source.config.SourceConfigTuner; -import source.config.SourceConfiguration; +import gui.editor.Editor; +import gui.editor.EmptyEditor; -public class TunerEditor extends SourceEditor +import java.awt.Dimension; + +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.RowFilter; +import javax.swing.table.TableRowSorter; + +import net.miginfocom.swing.MigLayout; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import source.tuner.configuration.TunerConfiguration; +import source.tuner.configuration.TunerConfigurationModel; + +import com.jidesoft.swing.JideSplitPane; + +public class TunerEditor extends Editor { - private static final long serialVersionUID = 1L; - private JFrequencyControl mFrequencyControl; - - public TunerEditor( SourceManager sourceManager, - SourceConfiguration config ) - { - super( sourceManager, config ); - - initGUI(); - } + private static final long serialVersionUID = 1L; - public void reset() + private final static Logger mLog = LoggerFactory.getLogger( TunerEditor.class ); + + private TunerConfigurationModel mTunerConfigurationModel; + private JTable mTunerConfigurationTable; + private TableRowSorter mRowSorter; + private ConfigurationRowFilter mRowFilter = new ConfigurationRowFilter(); + private JFrequencyControl mFrequencyControl = new JFrequencyControl(); + + public TunerEditor( TunerConfigurationModel tunerConfigurationModel ) { - mFrequencyControl.setFrequency( - ((SourceConfigTuner)mConfig).getFrequency(), false ); + mTunerConfigurationModel = tunerConfigurationModel; + init(); } + public void init() + { + setLayout( new MigLayout( "insets 0 0 0 0", "[grow,fill]", "[grow,fill]" ) ); + + JPanel listPanel = new JPanel(); + listPanel.setLayout( new MigLayout( "fill,wrap 1", + "[grow,fill]", "[][][grow,fill][]" ) ); + listPanel.add( mFrequencyControl ); + +// mFrequencyControl.addListener( this ); +// /* Add frequency control as frequency change listener. */ +// mController.addListener( mFrequencyControl ); +// mFrequencyControl.setFrequency( mController.getFrequency(), false ); + + mTunerConfigurationTable = new JTable( mTunerConfigurationModel ); + mRowSorter = new TableRowSorter<>( mTunerConfigurationModel ); + mRowSorter.setRowFilter( mRowFilter ); + mTunerConfigurationTable.setRowSorter( mRowSorter ); + + listPanel.add( new JLabel( "Tuner Configurations" ) ); + listPanel.add( mTunerConfigurationTable ); + + JPanel buttonPanel = new JPanel(); + buttonPanel.setLayout( new MigLayout( "insets 0 0 0 0", + "[grow,fill][grow,fill]", "[grow,fill]" ) ); + + JButton newButton = new JButton( "New" ); + buttonPanel.add( newButton ); + + JButton deleteButton = new JButton( "Delete" ); + buttonPanel.add( deleteButton ); + + listPanel.add( buttonPanel ); + + //Set preferred size on both scrollers to same width, so they split the space + JScrollPane listScroller = new JScrollPane( listPanel ); + listScroller.setPreferredSize( new Dimension( 200, 80 ) ); + + JPanel editorPanel = new EmptyEditor(); + JScrollPane editorScroller = new JScrollPane( editorPanel ); + editorScroller.setPreferredSize( new Dimension( 200, 80 ) ); + + JideSplitPane splitPane = + new JideSplitPane( JideSplitPane.HORIZONTAL_SPLIT ); + splitPane.add( listScroller ); + splitPane.add( editorScroller ); + + add( splitPane ); + } + + @Override public void save() { - ((SourceConfigTuner)mConfig).setFrequency( mFrequencyControl.getFrequency() ); + } + + @Override + public void setItem( Tuner tuner ) + { + super.setItem( tuner ); + + if( hasItem() ) + { + mRowFilter.setTunerType( tuner.getTunerType() ); + + TunerConfiguration assigned = mTunerConfigurationModel + .getTunerConfiguration( tuner.getTunerType(), tuner.getUniqueID() ); + + int modelIndex = mTunerConfigurationModel.getRowIndex( assigned ); + + if( modelIndex >= 0 ) + { + int viewIndex = mTunerConfigurationTable.convertRowIndexToView( modelIndex ); + + if( viewIndex >= 0 ) + { + mTunerConfigurationTable.setRowSelectionInterval( viewIndex, viewIndex ); + } + } + } + else + { + mRowFilter.setTunerType( null ); + } + + mRowSorter.setRowFilter( mRowFilter ); } - private void initGUI() + public class ConfigurationRowFilter extends RowFilter { - mFrequencyControl = new JFrequencyControl(); + private TunerType mTunerType; - mFrequencyControl.setFrequency( - ((SourceConfigTuner)mConfig).getFrequency(), false ); - - add( mFrequencyControl ); - } - - @Override - public void setConfiguration( Channel channel ) - { - // TODO Auto-generated method stub - - } - - @Override - public void validateConfiguration() throws ConfigurationValidationException - { - // TODO Auto-generated method stub + public ConfigurationRowFilter() + { + } + public void setTunerType( TunerType type ) + { + mTunerType = type; + } + + @Override + public boolean include( javax.swing.RowFilter.Entry entry ) + { + if( mTunerType == null ) + { + return true; + } + else + { + TunerConfigurationModel model = entry.getModel(); + TunerConfiguration config = model.getTunerConfiguration( entry.getIdentifier() ); + + if( config != null ) + { + return config.getTunerType() == mTunerType; + } + } + + return false; + } } + } diff --git a/src/source/tuner/TunerEditorOld.java b/src/source/tuner/TunerEditorOld.java new file mode 100644 index 00000000..b17339e0 --- /dev/null +++ b/src/source/tuner/TunerEditorOld.java @@ -0,0 +1,75 @@ +/******************************************************************************* + * 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.tuner; + +import controller.channel.Channel; +import controller.channel.ConfigurationValidationException; +import gui.control.JFrequencyControl; +import source.SourceEditor; +import source.SourceManager; +import source.config.SourceConfigTuner; +import source.config.SourceConfiguration; + +public class TunerEditorOld extends SourceEditor +{ + private static final long serialVersionUID = 1L; + private JFrequencyControl mFrequencyControl; + + public TunerEditorOld( SourceManager sourceManager, + SourceConfiguration config ) + { + super( sourceManager, config ); + + initGUI(); + } + + public void reset() + { + mFrequencyControl.setFrequency( + ((SourceConfigTuner)mConfig).getFrequency(), false ); + } + + public void save() + { + ((SourceConfigTuner)mConfig).setFrequency( mFrequencyControl.getFrequency() ); + } + + private void initGUI() + { + mFrequencyControl = new JFrequencyControl(); + + mFrequencyControl.setFrequency( + ((SourceConfigTuner)mConfig).getFrequency(), false ); + + add( mFrequencyControl ); + } + + @Override + public void setConfiguration( Channel channel ) + { + // TODO Auto-generated method stub + + } + + @Override + public void validateConfiguration() throws ConfigurationValidationException + { + // TODO Auto-generated method stub + + } +} diff --git a/src/source/tuner/TunerChangeEvent.java b/src/source/tuner/TunerEvent.java similarity index 68% rename from src/source/tuner/TunerChangeEvent.java rename to src/source/tuner/TunerEvent.java index 72bf366c..cccdc8fa 100644 --- a/src/source/tuner/TunerChangeEvent.java +++ b/src/source/tuner/TunerEvent.java @@ -1,11 +1,11 @@ package source.tuner; -public class TunerChangeEvent +public class TunerEvent { private Tuner mTuner; private Event mEvent; - public TunerChangeEvent( Tuner tuner, Event event ) + public TunerEvent( Tuner tuner, Event event ) { mTuner = tuner; mEvent = event; @@ -28,6 +28,7 @@ public class TunerChangeEvent CHANNEL_COUNT, FREQUENCY, SAMPLE_RATE, - SPECTRAL_DISPLAY; + REQUEST_MAIN_SPECTRAL_DISPLAY, + REQUEST_SECONDARY_SPECTRAL_DISPLAY; } } diff --git a/src/source/tuner/TunerGroupNode.java b/src/source/tuner/TunerGroupNode.java deleted file mode 100644 index 4a3c8247..00000000 --- a/src/source/tuner/TunerGroupNode.java +++ /dev/null @@ -1,35 +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.tuner; - -import controller.BaseNode; - -public class TunerGroupNode extends BaseNode -{ - private static final long serialVersionUID = 1L; - - public TunerGroupNode() - { - super( null ); - } - - public String toString() - { - return "Tuners [" + this.getChildCount() + "]"; - } -} diff --git a/src/source/tuner/TunerManager.java b/src/source/tuner/TunerManager.java index 38b10e0a..d423d860 100644 --- a/src/source/tuner/TunerManager.java +++ b/src/source/tuner/TunerManager.java @@ -1,6 +1,6 @@ /******************************************************************************* * SDR Trunk - * Copyright (C) 2014,2015 Dennis Sheirer + * Copyright (C) 2014-2016 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 @@ -17,15 +17,7 @@ ******************************************************************************/ 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; @@ -34,15 +26,10 @@ import org.usb4java.DeviceDescriptor; import org.usb4java.DeviceList; import org.usb4java.LibUsb; -import settings.SettingsManager; -import source.Source; import source.SourceException; -import source.config.SourceConfigTuner; -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; @@ -51,7 +38,6 @@ 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; @@ -60,17 +46,15 @@ public class TunerManager private final static Logger mLog = LoggerFactory.getLogger( TunerManager.class ); - private ArrayList mTuners = new ArrayList(); - private MixerManager mMixerManager; - private SettingsManager mSettingsManager; + private TunerModel mTunerModel; private ThreadPoolManager mThreadPoolManager; public TunerManager( MixerManager mixerManager, - SettingsManager settingsManager, + TunerModel tunerModel, ThreadPoolManager threadPoolManager ) { - mSettingsManager = settingsManager; + mTunerModel = tunerModel; mThreadPoolManager = threadPoolManager; initTuners(); @@ -84,57 +68,6 @@ public class TunerManager LibUsb.exit( null ); } - /** - * Iterates current tuners to get a tuner channel source for the frequency - * specified in the channel config's source config object - */ - public Source getSource( SourceConfiguration config, int bandwidth ) - { - TunerChannelSource retVal = null; - - if( config instanceof SourceConfigTuner ) - { - SourceConfigTuner tunerConfig = (SourceConfigTuner)config; - - TunerChannel tunerChannel = tunerConfig.getTunerChannel(); - - tunerChannel.setBandwidth( bandwidth ); - - Iterator it = mTuners.iterator(); - - Tuner tuner; - - while( it.hasNext() && retVal == null ) - { - tuner = it.next(); - - try - { - retVal = tuner.getChannel( tunerChannel ); - } - catch ( RejectedExecutionException ree ) - { - mLog.error( "couldn't provide tuner channel source", ree ); - } - catch ( SourceException e ) - { - mLog.error( "error obtaining channel from tuner [" + - tuner.getName() + "]", e ); - } - } - } - - return retVal; - } - - /** - * Get list of current tuners - */ - public List getTuners() - { - return mTuners; - } - /** * Loads all USB tuners and USB/Mixer tuner devices */ @@ -192,9 +125,19 @@ public class TunerManager if( status.isLoaded() ) { Tuner tuner = status.getTuner(); - sb.append( "] LOADED: " ); - sb.append( tuner.toString() ); - mTuners.add( tuner ); + + try + { + mTunerModel.addTuner( tuner ); + sb.append( "] LOADED: " ); + sb.append( tuner.toString() ); + } + catch( Exception e ) + { + sb.append( "] NOT LOADED: " ); + sb.append( status.getInfo() ); + sb.append( " Error:" + e.getMessage() ); + } } else { @@ -276,13 +219,6 @@ public class TunerManager AirspyTuner tuner = new AirspyTuner( airspyController ); - TunerConfiguration config = getTunerConfiguration( tuner ); - - if( config != null ) - { - tuner.apply( config ); - } - return new TunerInitStatus( tuner, "LOADED" ); } catch( SourceException se ) @@ -301,11 +237,6 @@ public class TunerManager { return new TunerInitStatus( null, "Ettus B100 tuner not currently " + "supported" ); -// case ETTUS_USRP_B100: -// mTuners.add( new B100Tuner( device ) ); -// status = sLOADED; -// reason = null; -// break; } private TunerInitStatus initFuncubeProTuner( Device device, @@ -328,13 +259,6 @@ public class TunerManager FCDTuner tuner = new FCDTuner( dataline, controller ); - TunerConfiguration config = getTunerConfiguration( tuner ); - - if( config != null ) - { - tuner.apply( config ); - } - return new TunerInitStatus( tuner, "LOADED" ); } catch ( SourceException e ) @@ -373,13 +297,6 @@ public class TunerManager FCDTuner tuner = new FCDTuner( dataline, controller ); - TunerConfiguration config = getTunerConfiguration( tuner ); - - if( config != null ) - { - tuner.apply( config ); - } - return new TunerInitStatus( tuner, "LOADED" ); } catch ( SourceException e ) @@ -412,13 +329,6 @@ public class TunerManager HackRFTuner tuner = new HackRFTuner( hackRFController ); - TunerConfiguration config = getTunerConfiguration( tuner ); - - if( config != null ) - { - tuner.apply( config ); - } - return new TunerInitStatus( tuner, "LOADED" ); } catch( SourceException se ) @@ -465,14 +375,6 @@ public class TunerManager RTL2832Tuner rtlTuner = new RTL2832Tuner( tunerClass, controller ); - TunerConfiguration config = - getTunerConfiguration( rtlTuner ); - - if( config != null ) - { - rtlTuner.apply( config ); - } - return new TunerInitStatus( rtlTuner, "LOADED" ); } catch( SourceException se ) @@ -492,14 +394,6 @@ public class TunerManager RTL2832Tuner rtlTuner = new RTL2832Tuner( tunerClass, controller ); - TunerConfiguration config = - getTunerConfiguration( rtlTuner ); - - if( config != null ) - { - rtlTuner.apply( config ); - } - return new TunerInitStatus( rtlTuner, "LOADED" ); } catch( SourceException se ) @@ -522,54 +416,6 @@ public class TunerManager return new TunerInitStatus( null, reason ); } - - /** - * Get a stored tuner configuration or create a default tuner configuration - * for the tuner type, connected at the address. - * - * Note: a named tuner configuration will be stored for for each tuner type - * and address combination. - * @param type - tuner type - * @param address - current usb address/port - * @return - stored tuner configuration or default configuration - */ - private TunerConfiguration getTunerConfiguration( Tuner tuner ) - { - TunerConfigurationAssignment selected = mSettingsManager - .getSelectedTunerConfiguration( tuner.getTunerType(), tuner.getUniqueID() ); - - ArrayList configs = mSettingsManager - .getTunerConfigurations( tuner.getTunerType() ); - - TunerConfiguration config = null; - - if( selected != null ) - { - for( TunerConfiguration tunerConfig: configs ) - { - if( tunerConfig.getName().contentEquals( selected.getTunerConfigurationName() ) ) - { - config = tunerConfig; - } - } - } - - //If we're still null at this point, create a default config - if( config == null ) - { - String name = "Default-" + tuner.getUniqueID(); - - config = mSettingsManager.addNewTunerConfiguration( - tuner.getTunerType(), name ); - } - - //Persist the config as the selected tuner configuration. The method - //auto-saves the setting - mSettingsManager.setSelectedTunerConfiguration( - tuner.getTunerType(), tuner.getUniqueID(), config ); - - return config; - } /** * Gets the first tuner mixer dataline that corresponds to the tuner class. @@ -625,15 +471,4 @@ public class TunerManager } } - public static JPanel getEditor( SettingsManager settingsManager, Tuner tuner ) - { - JPanel editor = tuner.getEditor( settingsManager ); - - if( editor != null ) - { - return editor; - } - - return new EmptyEditor(); - } } diff --git a/src/source/tuner/TunerModel.java b/src/source/tuner/TunerModel.java new file mode 100644 index 00000000..14ca0a3d --- /dev/null +++ b/src/source/tuner/TunerModel.java @@ -0,0 +1,294 @@ +package source.tuner; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.RejectedExecutionException; + +import javax.swing.table.AbstractTableModel; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import sample.Listener; +import source.Source; +import source.SourceException; +import source.config.SourceConfigTuner; +import source.tuner.TunerEvent.Event; +import source.tuner.configuration.TunerConfiguration; +import source.tuner.configuration.TunerConfigurationModel; + +public class TunerModel extends AbstractTableModel implements Listener +{ + private static final long serialVersionUID = 1L; + + private final static Logger mLog = LoggerFactory.getLogger( TunerModel.class ); + + private static final int TUNER_CLASS = 0; + private static final int TUNER_TYPE = 1; + private static final int SAMPLE_RATE = 2; + private static final int FREQUENCY = 3; + private static final int CHANNEL_COUNT = 4; + private static final int SPECTRAL_DISPLAY = 5; + + private static final String MHZ = " MHz"; + private static final String[] COLUMNS = + { "Class", "Type", "Sample Rate", "Frequency", "Channels", "Spectrum" }; + + private List mTuners = new ArrayList<>(); + private List> mTunerEventListeners = new ArrayList<>(); + private DecimalFormat mFrequencyFormat = new DecimalFormat( "0.00000" ); + private DecimalFormat mSampleRateFormat = new DecimalFormat( "0.000" ); + + private TunerConfigurationModel mTunerConfigurationModel; + + public TunerModel( TunerConfigurationModel tunerConfigurationModel ) + { + mTunerConfigurationModel = tunerConfigurationModel; + } + + public TunerConfigurationModel getTunerConfigurationModel() + { + return mTunerConfigurationModel; + } + + /** + * List of Tuners currently in the model + */ + public List getTuners() + { + return mTuners; + } + + public Tuner getTuner( int index ) + { + if( index < mTuners.size() ) + { + return mTuners.get( index ); + } + + return null; + } + + 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 ) ) + { + //Get the tuner configuration and apply it to the tuner - this + //call should always produce a tuner configuration + TunerConfiguration config = mTunerConfigurationModel + .getTunerConfiguration( tuner.getTunerType(), tuner.getUniqueID() ); + + try + { + tuner.apply( config ); + + mTuners.add( tuner ); + + int index = mTuners.indexOf( tuner ); + + fireTableRowsInserted( index, index ); + + tuner.addTunerChangeListener( this ); + } + catch( SourceException se ) + { + mLog.error( "Couldn't apply tuner configuration to tuner - [" + + tuner.getTunerType().name() + "] with id [" + + tuner.getUniqueID() + "] - tuner will not be included" ); + } + + } + } + + /** + * Removes the Tuner from this model + */ + public void removeTuner( Tuner tuner ) + { + if( mTuners.contains( tuner ) ) + { + tuner.removeTunerChangeListener( this ); + + int index = mTuners.indexOf( tuner ); + + mTuners.remove( tuner ); + + fireTableRowsDeleted( index, index ); + } + } + + public void addListener( Listener listener ) + { + mTunerEventListeners.add( listener ); + } + + public void removeListener( Listener listener ) + { + mTunerEventListeners.remove( listener ); + } + + public void broadcast( TunerEvent event ) + { + for( Listener listener: mTunerEventListeners ) + { + listener.receive( event ); + } + } + + /** + * Requests to display the first tuner in this model. Invoke this method + * after all listeners have registered and tuners have been added to this + * model, in order to inform the primary display to use the first tuner. + */ + public void requestFirstTunerDisplay() + { + if( mTuners.size() > 0 ) + { + broadcast( new TunerEvent( mTuners.get( 0 ), + Event.REQUEST_MAIN_SPECTRAL_DISPLAY ) ); + } + } + + @Override + public void receive( TunerEvent event ) + { + if( event.getTuner() != null ) + { + int index = mTuners.indexOf( event.getTuner() ); + + if( index >= 0 ) + { + switch( event.getEvent() ) + { + case CHANNEL_COUNT: + fireTableCellUpdated( index, CHANNEL_COUNT ); + break; + case FREQUENCY: + fireTableCellUpdated( index, FREQUENCY ); + break; + case SAMPLE_RATE: + fireTableCellUpdated( index, SAMPLE_RATE ); + break; + case REQUEST_MAIN_SPECTRAL_DISPLAY: + fireTableCellUpdated( index, SPECTRAL_DISPLAY ); + default: + break; + } + } + } + + broadcast( event ); + } + + @Override + public int getRowCount() + { + return mTuners.size(); + } + + @Override + public int getColumnCount() + { + return 6; + } + + @Override + public Object getValueAt( int rowIndex, int columnIndex ) + { + if( rowIndex < mTuners.size() ) + { + Tuner tuner = mTuners.get( rowIndex ); + + switch( columnIndex ) + { + case TUNER_CLASS: + return tuner.getTunerClass().getVendorDescription(); + case TUNER_TYPE: + return tuner.getTunerType().getLabel(); + case SAMPLE_RATE: + int sampleRate = tuner.getSampleRate(); + + return mSampleRateFormat.format( sampleRate / 1E6D ) + MHZ; + case FREQUENCY: + try + { + long frequency = tuner.getFrequency(); + + return mFrequencyFormat.format( frequency / 1E6D ) + MHZ; + } + catch( Exception e ) + { + return 0; + } + case CHANNEL_COUNT: + return tuner.getChannelCount(); + case SPECTRAL_DISPLAY: + return "TBD"; + default: + break; + } + } + + return null; + } + + @Override + public String getColumnName( int columnIndex ) + { + return COLUMNS[ columnIndex ]; + } + + /** + * Iterates current tuners to get a tuner channel source for the frequency + * specified in the channel config's source config object. + * + * Returns null if no tuner can source the channel + */ + public Source getSource( SourceConfigTuner config, int bandwidth ) + { + TunerChannelSource retVal = null; + + TunerChannel tunerChannel = config.getTunerChannel(); + + tunerChannel.setBandwidth( bandwidth ); + + Iterator it = mTuners.iterator(); + + Tuner tuner; + + while( it.hasNext() && retVal == null ) + { + tuner = it.next(); + + try + { + retVal = tuner.getChannel( tunerChannel ); + } + catch ( RejectedExecutionException ree ) + { + mLog.error( "couldn't provide tuner channel source", ree ); + } + catch ( SourceException e ) + { + mLog.error( "error obtaining channel from tuner [" + + tuner.getName() + "]", e ); + } + } + + return retVal; + } + +} diff --git a/src/source/tuner/TunerNode.java b/src/source/tuner/TunerNode.java deleted file mode 100644 index fdba9a08..00000000 --- a/src/source/tuner/TunerNode.java +++ /dev/null @@ -1,166 +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.tuner; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.text.DecimalFormat; - -import javax.swing.JMenuItem; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import playlist.PlaylistManager; -import settings.SettingsManager; -import source.SourceException; -import source.tuner.frequency.FrequencyChangeEvent; -import source.tuner.frequency.IFrequencyChangeProcessor; -import spectrum.SpectrumFrame; -import controller.BaseNode; -import controller.channel.ChannelModel; -import controller.channel.ChannelProcessingManager; - -public class TunerNode extends BaseNode implements IFrequencyChangeProcessor -{ - private final static Logger mLog = - LoggerFactory.getLogger( TunerNode.class ); - - private static final long serialVersionUID = 1L; - private static DecimalFormat FREQUENCY_FORMAT = new DecimalFormat( "0.00000" ); - private static DecimalFormat SAMPLE_RATE_FORMAT = new DecimalFormat( "0.000" ); - - private long mFrequency; - private int mSampleRate; - private ChannelModel mChannelModel; - private ChannelProcessingManager mChannelProcessingManager; - private SettingsManager mSettingsManager; - - public TunerNode( ChannelModel channelModel, - ChannelProcessingManager channelProcessingManager, - SettingsManager settingsManager, - Tuner tuner ) - { - super( tuner ); //does this make it a super tuner? - - mChannelModel = channelModel; - mChannelProcessingManager = channelProcessingManager; - mSettingsManager = settingsManager; - - tuner.addFrequencyChangeProcessor( this ); - - try - { - mFrequency = tuner.getFrequency(); - mSampleRate = tuner.getSampleRate(); - } - catch ( SourceException e ) - { - mLog.error( "TunerNode - error reading frequency and sample rate " - + "from tuner", e ); - } - } - - @Override - public JPanel getEditor() - { - return getTuner().getEditor( mSettingsManager ); - } - - public Tuner getTuner() - { - return (Tuner)getUserObject(); - } - - public String toString() - { - StringBuilder sb = new StringBuilder(); - - sb.append( getTuner().getName() ); - - sb.append( " " ); - sb.append( FREQUENCY_FORMAT.format( (double)mFrequency / 1E6d ) ); - sb.append( " [" ); - sb.append( SAMPLE_RATE_FORMAT.format( (double)mSampleRate / 1E6d ) ); - sb.append( "] MHz" ); - - return sb.toString(); - } - - public JPopupMenu getContextMenu() - { - JPopupMenu retVal = new JPopupMenu(); - - JMenuItem showSpectrumItem = new JMenuItem( "Show in Main Spectrum" ); - showSpectrumItem.addActionListener( new ActionListener() - { - @Override - public void actionPerformed( ActionEvent e ) - { - getModel().fireTunerSelectedEvent( getTuner() ); - } - } ); - - retVal.add( showSpectrumItem ); - - JMenuItem newSpectrumItem = new JMenuItem( "New Spectrum Window" ); - newSpectrumItem.addActionListener( new ActionListener() - { - @Override - public void actionPerformed( ActionEvent e ) - { - SpectrumFrame frame = new SpectrumFrame( getModel(), mChannelModel, - mChannelProcessingManager, mSettingsManager, getTuner() ); - } - } ); - - retVal.add( newSpectrumItem ); - - return retVal; - } - - @Override - public void frequencyChanged( FrequencyChangeEvent event ) - { - switch( event.getEvent() ) - { - case NOTIFICATION_FREQUENCY_CHANGE: - long frequency = event.getValue().longValue(); - - if( mFrequency != frequency ) - { - mFrequency = frequency; - getModel().nodeChanged( TunerNode.this ); - } - break; - case NOTIFICATION_SAMPLE_RATE_CHANGE: - int sampleRate = event.getValue().intValue(); - - if( mSampleRate != sampleRate ) - { - mSampleRate = sampleRate; - getModel().nodeChanged( TunerNode.this ); - } - break; - default: - break; - } - } -} diff --git a/src/source/tuner/TunerSelectionListener.java b/src/source/tuner/TunerSelectionListener.java deleted file mode 100644 index 52ebff6d..00000000 --- a/src/source/tuner/TunerSelectionListener.java +++ /dev/null @@ -1,23 +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.tuner; - -public interface TunerSelectionListener -{ - public void tunerSelected( Tuner tuner ); -} diff --git a/src/source/tuner/TunerType.java b/src/source/tuner/TunerType.java index 75dc06ca..65b293f3 100644 --- a/src/source/tuner/TunerType.java +++ b/src/source/tuner/TunerType.java @@ -19,7 +19,7 @@ package source.tuner; public enum TunerType { - AIRSPY_R820T( "R820T/R820T2" ), + AIRSPY_R820T( "Airspy R820T" ), ELONICS_E4000( "E4000" ), ETTUS_WBX( "WBX" ), ETTUS_VARIOUS( "Ettus Tuner" ), diff --git a/src/source/TunerViewPanel.java b/src/source/tuner/TunerViewPanel.java similarity index 61% rename from src/source/TunerViewPanel.java rename to src/source/tuner/TunerViewPanel.java index 5b577bfb..c6a5879d 100644 --- a/src/source/TunerViewPanel.java +++ b/src/source/tuner/TunerViewPanel.java @@ -1,8 +1,5 @@ -package source; +package source.tuner; -import gui.editor.EmptyEditor; - -import java.awt.Component; import java.awt.Dimension; import javax.swing.JPanel; @@ -17,10 +14,6 @@ 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 @@ -29,21 +22,22 @@ public class TunerViewPanel extends JPanel private final static Logger mLog = LoggerFactory.getLogger( TunerViewPanel.class ); private TunerModel mTunerModel; - private SettingsManager mSettingsManager; - private JideSplitPane mSplitPane; private JTable mTunerTable; + + private JideSplitPane mSplitPane; + private TunerEditor mTunerEditor; - public TunerViewPanel( TunerModel tunerModel, SettingsManager settingsManager ) + public TunerViewPanel( TunerModel tunerModel ) { mTunerModel = tunerModel; - mSettingsManager = settingsManager; + mTunerEditor = new TunerEditor( mTunerModel.getTunerConfigurationModel() ); init(); } private void init() { - setLayout( new MigLayout( "insets 1 1 1 1", "[fill,grow]", "[fill,grow]" ) ); + setLayout( new MigLayout( "insets 0 0 0 0", "[fill,grow]", "[fill,grow]" ) ); mTunerTable = new JTable( mTunerModel ); mTunerTable.setSelectionMode( ListSelectionModel.SINGLE_SELECTION ); @@ -56,29 +50,8 @@ public class TunerViewPanel extends JPanel { int row = mTunerTable.getSelectedRow(); int modelRow = mTunerTable.convertRowIndexToModel( row ); - - Tuner selected = mTunerModel.getTuner( modelRow ); - - 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(); + mTunerEditor.setItem( mTunerModel.getTuner( modelRow ) ); } } } ); @@ -86,7 +59,7 @@ public class TunerViewPanel extends JPanel JScrollPane listScroller = new JScrollPane( mTunerTable ); listScroller.setPreferredSize( new Dimension( 400, 20 ) ); - JScrollPane editorScroller = new JScrollPane( new EmptyEditor() ); + JScrollPane editorScroller = new JScrollPane( mTunerEditor ); editorScroller.setPreferredSize( new Dimension( 400, 80 ) ); mSplitPane = new JideSplitPane(); @@ -96,4 +69,6 @@ public class TunerViewPanel extends JPanel add( mSplitPane ); } + + } diff --git a/src/source/tuner/airspy/AirspyTuner.java b/src/source/tuner/airspy/AirspyTuner.java index 4637bfc8..3d1406f3 100644 --- a/src/source/tuner/airspy/AirspyTuner.java +++ b/src/source/tuner/airspy/AirspyTuner.java @@ -29,13 +29,13 @@ import sample.complex.ComplexBuffer; import settings.SettingsManager; import source.SourceException; import source.tuner.Tuner; -import source.tuner.TunerChangeEvent; +import source.tuner.TunerEvent; import source.tuner.TunerChannel; import source.tuner.TunerChannelSource; import source.tuner.TunerClass; -import source.tuner.TunerConfiguration; import source.tuner.TunerType; import source.tuner.airspy.AirspyTunerController.BoardID; +import source.tuner.configuration.TunerConfiguration; public class AirspyTuner extends Tuner { @@ -54,12 +54,6 @@ public class AirspyTuner extends Tuner mController.addListener( this ); } - @Override - public JPanel getEditor( SettingsManager settingsManager ) - { - return new AirspyTunerEditorPanel( this, settingsManager ); - } - public AirspyTunerController getController() { return mController; @@ -142,7 +136,7 @@ public class AirspyTuner extends Tuner if( source != null ) { - broadcast( new TunerChangeEvent( this, TunerChangeEvent.Event.CHANNEL_COUNT ) ); + broadcast( new TunerEvent( this, TunerEvent.Event.CHANNEL_COUNT ) ); } return source; diff --git a/src/source/tuner/airspy/AirspyTunerConfiguration.java b/src/source/tuner/airspy/AirspyTunerConfiguration.java index 52a3a818..5b50c348 100644 --- a/src/source/tuner/airspy/AirspyTunerConfiguration.java +++ b/src/source/tuner/airspy/AirspyTunerConfiguration.java @@ -19,9 +19,9 @@ package source.tuner.airspy; import javax.xml.bind.annotation.XmlAttribute; -import source.tuner.TunerConfiguration; import source.tuner.TunerType; import source.tuner.airspy.AirspyTunerController.Gain; +import source.tuner.configuration.TunerConfiguration; public class AirspyTunerConfiguration extends TunerConfiguration { diff --git a/src/source/tuner/airspy/AirspyTunerConfigurationPanel.java b/src/source/tuner/airspy/AirspyTunerConfigurationPanel.java index 937a63f8..781c52e2 100644 --- a/src/source/tuner/airspy/AirspyTunerConfigurationPanel.java +++ b/src/source/tuner/airspy/AirspyTunerConfigurationPanel.java @@ -47,11 +47,11 @@ import org.usb4java.LibUsbException; import settings.SettingsManager; import source.SourceException; -import source.tuner.TunerConfiguration; -import source.tuner.TunerConfigurationAssignment; import source.tuner.TunerType; import source.tuner.airspy.AirspyTunerController.Gain; import source.tuner.airspy.AirspyTunerController.GainMode; +import source.tuner.configuration.TunerConfiguration; +import source.tuner.configuration.TunerConfigurationAssignment; public class AirspyTunerConfigurationPanel extends JPanel { @@ -126,8 +126,8 @@ public class AirspyTunerConfigurationPanel extends JPanel if( serial != null ) { - savedConfig = mSettingsManager.getSelectedTunerConfiguration( - TunerType.AIRSPY_R820T, serial ); +// savedConfig = mSettingsManager.getSelectedTunerConfiguration( +// TunerType.AIRSPY_R820T, serial ); } if( savedConfig != null ) @@ -145,8 +145,8 @@ public class AirspyTunerConfigurationPanel extends JPanel if( serial != null ) { - mSettingsManager.setSelectedTunerConfiguration( TunerType.AIRSPY_R820T, - serial, mSelectedConfig ); +// mSettingsManager.setSelectedTunerConfiguration( TunerType.AIRSPY_R820T, +// serial, mSelectedConfig ); } } @@ -515,16 +515,16 @@ public class AirspyTunerConfigurationPanel extends JPanel @Override public void actionPerformed( ActionEvent e ) { - TunerConfiguration config = - mSettingsManager.addNewTunerConfiguration( - TunerType.AIRSPY_R820T, - "New Configuration" ); - - mComboConfigurations.setModel( getModel() ); - - mComboConfigurations.setSelectedItem( config ); - - repaint(); +// TunerConfiguration config = +// mSettingsManager.addNewTunerConfiguration( +// TunerType.AIRSPY_R820T, +// "New Configuration" ); +// +// mComboConfigurations.setModel( getModel() ); +// +// mComboConfigurations.setSelectedItem( config ); +// +// repaint(); } } ); @@ -555,7 +555,7 @@ public class AirspyTunerConfigurationPanel extends JPanel if( n == JOptionPane.YES_OPTION ) { - mSettingsManager.deleteTunerConfiguration( selected ); +// mSettingsManager.deleteTunerConfiguration( selected ); mComboConfigurations.setModel( getModel() ); @@ -631,8 +631,8 @@ public class AirspyTunerConfigurationPanel extends JPanel mGainModeCombo.setSelectedItem( Gain.getGainMode( gain ) ); mGain.setValue( gain.getValue() ); - mSettingsManager.setSelectedTunerConfiguration( - TunerType.AIRSPY_R820T, mController.getDeviceInfo().getSerialNumber(), config ); +// mSettingsManager.setSelectedTunerConfiguration( +// TunerType.AIRSPY_R820T, mController.getDeviceInfo().getSerialNumber(), config ); save(); } @@ -656,16 +656,16 @@ public class AirspyTunerConfigurationPanel extends JPanel */ private ComboBoxModel getModel() { - ArrayList configs = - mSettingsManager.getTunerConfigurations( TunerType.AIRSPY_R820T ); +// ArrayList configs = +// mSettingsManager.getTunerConfigurations( TunerType.AIRSPY_R820T ); DefaultComboBoxModel model = new DefaultComboBoxModel(); - for( TunerConfiguration config: configs ) - { - model.addElement( (AirspyTunerConfiguration)config ); - } +// for( TunerConfiguration config: configs ) +// { +// model.addElement( (AirspyTunerConfiguration)config ); +// } return model; } @@ -675,16 +675,16 @@ public class AirspyTunerConfigurationPanel extends JPanel */ private AirspyTunerConfiguration getNamedConfiguration( String name ) { - ArrayList configs = - mSettingsManager.getTunerConfigurations( TunerType.AIRSPY_R820T ); +// ArrayList configs = +// mSettingsManager.getTunerConfigurations( TunerType.AIRSPY_R820T ); - for( TunerConfiguration config: configs ) - { - if( config.getName().contentEquals( name ) ) - { - return (AirspyTunerConfiguration)config; - } - } +// for( TunerConfiguration config: configs ) +// { +// if( config.getName().contentEquals( name ) ) +// { +// return (AirspyTunerConfiguration)config; +// } +// } return null; } diff --git a/src/source/tuner/airspy/AirspyTunerController.java b/src/source/tuner/airspy/AirspyTunerController.java index fb82784d..e132e59e 100644 --- a/src/source/tuner/airspy/AirspyTunerController.java +++ b/src/source/tuner/airspy/AirspyTunerController.java @@ -28,8 +28,8 @@ import sample.Broadcaster; import sample.Listener; import sample.complex.ComplexBuffer; import source.SourceException; -import source.tuner.TunerConfiguration; import source.tuner.TunerController; +import source.tuner.configuration.TunerConfiguration; import controller.ThreadPoolManager; import controller.ThreadPoolManager.ThreadType; import dsp.filter.dc.DCRemovalFilter_RB; diff --git a/src/source/tuner/TunerConfiguration.java b/src/source/tuner/configuration/TunerConfiguration.java similarity index 96% rename from src/source/tuner/TunerConfiguration.java rename to src/source/tuner/configuration/TunerConfiguration.java index d82977da..eee31f3f 100644 --- a/src/source/tuner/TunerConfiguration.java +++ b/src/source/tuner/configuration/TunerConfiguration.java @@ -15,11 +15,13 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package source.tuner; +package source.tuner.configuration; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlType; +import source.tuner.TunerType; + /** * Abstract class to hold a named configuration for a specific type of tuner */ diff --git a/src/source/tuner/TunerConfigurationAssignment.java b/src/source/tuner/configuration/TunerConfigurationAssignment.java similarity index 96% rename from src/source/tuner/TunerConfigurationAssignment.java rename to src/source/tuner/configuration/TunerConfigurationAssignment.java index 0cb450bf..3e3fcf2e 100644 --- a/src/source/tuner/TunerConfigurationAssignment.java +++ b/src/source/tuner/configuration/TunerConfigurationAssignment.java @@ -15,10 +15,12 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see ******************************************************************************/ -package source.tuner; +package source.tuner.configuration; import javax.xml.bind.annotation.XmlAttribute; +import source.tuner.TunerType; + public class TunerConfigurationAssignment { private TunerType mTunerType; diff --git a/src/source/tuner/configuration/TunerConfigurationEditor.java b/src/source/tuner/configuration/TunerConfigurationEditor.java new file mode 100644 index 00000000..1c02f4b0 --- /dev/null +++ b/src/source/tuner/configuration/TunerConfigurationEditor.java @@ -0,0 +1,20 @@ +package source.tuner.configuration; + +import gui.editor.Editor; + +public abstract class TunerConfigurationEditor extends Editor +{ + private static final long serialVersionUID = 1L; + + private TunerConfigurationModel mTunerConfigurationModel; + + public TunerConfigurationEditor( TunerConfigurationModel model ) + { + mTunerConfigurationModel = model; + } + + public TunerConfigurationModel getTunerConfigurationModel() + { + return mTunerConfigurationModel; + } +} diff --git a/src/source/tuner/configuration/TunerConfigurationEvent.java b/src/source/tuner/configuration/TunerConfigurationEvent.java new file mode 100644 index 00000000..3815c7b7 --- /dev/null +++ b/src/source/tuner/configuration/TunerConfigurationEvent.java @@ -0,0 +1,45 @@ +package source.tuner.configuration; + +public class TunerConfigurationEvent +{ + private TunerConfiguration mTunerConfiguration; + private TunerConfigurationAssignment mTunerConfigurationAssignment; + private Event mEvent; + + public TunerConfigurationEvent( TunerConfiguration configuration, Event event ) + { + mTunerConfiguration = configuration; + mEvent = event; + } + + public TunerConfigurationEvent( TunerConfigurationAssignment assignment, Event event ) + { + mTunerConfigurationAssignment = assignment; + mEvent = event; + } + + public TunerConfiguration getConfiguration() + { + return mTunerConfiguration; + } + + public TunerConfigurationAssignment getAssignment() + { + return mTunerConfigurationAssignment; + } + + public Event getEvent() + { + return mEvent; + } + + public enum Event + { + CONFIGURATION_ADD, + CONFIGURATION_REMOVE, + CONFIGURATION_CHANGE, + ASSIGNMENT_ADD, + ASSIGNMENT_REMOVE, + ASSIGNMENT_CHANGE; + } +} diff --git a/src/source/tuner/configuration/TunerConfigurationFactory.java b/src/source/tuner/configuration/TunerConfigurationFactory.java new file mode 100644 index 00000000..2af4a4eb --- /dev/null +++ b/src/source/tuner/configuration/TunerConfigurationFactory.java @@ -0,0 +1,64 @@ +package source.tuner.configuration; + +import source.tuner.Tuner; +import source.tuner.TunerType; +import source.tuner.airspy.AirspyTunerConfiguration; +import source.tuner.fcd.proV1.FCD1TunerConfiguration; +import source.tuner.fcd.proplusV2.FCD2TunerConfiguration; +import source.tuner.hackrf.HackRFTunerConfiguration; +import source.tuner.rtl.RTL2832Tuner; +import source.tuner.rtl.e4k.E4KTunerConfiguration; +import source.tuner.rtl.r820t.R820TTunerConfiguration; +import source.tuner.rtl.r820t.R820TTunerEditor; + +public class TunerConfigurationFactory +{ + public static TunerConfiguration getTunerConfiguration( TunerType type, String name ) + { + switch( type ) + { + case AIRSPY_R820T: + return new AirspyTunerConfiguration( name ); + case ELONICS_E4000: + return new E4KTunerConfiguration( name ); + case FUNCUBE_DONGLE_PRO: + return new FCD1TunerConfiguration( name ); + case FUNCUBE_DONGLE_PRO_PLUS: + return new FCD2TunerConfiguration( name ); + case HACKRF: + return new HackRFTunerConfiguration( name ); + case RAFAELMICRO_R820T: + return new R820TTunerConfiguration( name ); + default: + throw new IllegalArgumentException( "Unrecognized tuner type [" + + type.name() + "] - can't create named [" + name + "] tuner" + + " configuration" ); + } + } + + public static TunerConfigurationEditor getEditor( Tuner tuner, + TunerConfigurationModel model ) + { + switch( tuner.getTunerType() ) + { + case AIRSPY_R820T: + break; + case ELONICS_E4000: + break; + case FUNCUBE_DONGLE_PRO: + break; + case FUNCUBE_DONGLE_PRO_PLUS: + break; + case HACKRF: + break; + case RAFAELMICRO_R820T: + return new R820TTunerEditor( model, (RTL2832Tuner)tuner ); + case UNKNOWN: + default: + break; + } + + return null; + } + +} diff --git a/src/source/tuner/configuration/TunerConfigurationModel.java b/src/source/tuner/configuration/TunerConfigurationModel.java new file mode 100644 index 00000000..d41bd7c7 --- /dev/null +++ b/src/source/tuner/configuration/TunerConfigurationModel.java @@ -0,0 +1,370 @@ +package source.tuner.configuration; + +import java.util.ArrayList; +import java.util.List; + +import javax.swing.RowFilter; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.TableRowSorter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import sample.Listener; +import source.tuner.TunerType; +import source.tuner.TunerViewPanel; +import source.tuner.configuration.TunerConfigurationEvent.Event; + +public class TunerConfigurationModel extends AbstractTableModel +{ + private static final long serialVersionUID = 1L; + private final static Logger mLog = + LoggerFactory.getLogger( TunerConfigurationModel.class ); + + private static final int TUNER_TYPE = 0; + private static final int CONFIGURATION_NAME = 1; + private static final String[] COLUMN_HEADERS = { "Tuner Type", "Name" }; + + private List> mConfigurationListeners = new ArrayList<>(); + private List mTunerConfigurations = new ArrayList<>(); + private List mTunerConfigurationAssignments = new ArrayList<>(); + + /** + * Table model for managing tuner configurations and tuner configuration + * assignments. Provides tuner configuration events to registered listeners + */ + public TunerConfigurationModel() + { + } + + /** + * Adds the list of tuner configurations to the model + */ + public void addTunerConfigurations( List configs ) + { + for( TunerConfiguration config: configs ) + { + addTunerConfiguration( config ); + } + } + + /** + * Returns of list of tuner configurations from the model + */ + public List getTunerConfigurations() + { + return mTunerConfigurations; + } + + /** + * Adds the tuner configuration to the model firing a table model row add + * event and broadcasting a tuner configuration event. + */ + public void addTunerConfiguration( TunerConfiguration config ) + { + if( !mTunerConfigurations.contains( config ) ) + { + mTunerConfigurations.add( config ); + + int index = mTunerConfigurations.indexOf( config ); + + fireTableRowsInserted( index, index ); + + broadcast( new TunerConfigurationEvent( config, Event.CONFIGURATION_ADD ) ); + } + } + + /** + * Removes the tuner configuration from the model firing a table model row + * delete event and broadcasting a tuner configuration event. + */ + public void removeTunerConfiguration( TunerConfiguration config ) + { + if( mTunerConfigurations.contains( config ) ) + { + int index = mTunerConfigurations.indexOf( config ); + + mTunerConfigurations.remove( config ); + + fireTableRowsDeleted( index, index ); + + broadcast( new TunerConfigurationEvent( config, Event.CONFIGURATION_REMOVE ) ); + } + } + + /** + * Removes all tuner configurations and assignments from the model and + * fires a table clear event and broadcasts a tuner configuration event for + * each row removed. + */ + public void clear() + { + for( TunerConfiguration config: mTunerConfigurations ) + { + broadcast( new TunerConfigurationEvent( config, Event.CONFIGURATION_REMOVE ) ); + } + + int size = mTunerConfigurations.size(); + + mTunerConfigurations.clear(); + + fireTableRowsDeleted( 0, size - 1 ); + + for( TunerConfigurationAssignment assignment: mTunerConfigurationAssignments ) + { + broadcast( new TunerConfigurationEvent( assignment, Event.ASSIGNMENT_REMOVE ) ); + } + + mTunerConfigurationAssignments.clear(); + } + + /** + * Registers a tuner configuration event listener + */ + public void addListener( Listener listener ) + { + mConfigurationListeners.add( listener ); + } + + /** + * Removes the tuner configuration event listener + */ + public void removeListener( Listener listener ) + { + mConfigurationListeners.remove( listener ); + } + + /** + * Broadcasts a tuner configuration event + */ + public void broadcast( TunerConfigurationEvent event ) + { + for( Listener listener: mConfigurationListeners ) + { + listener.receive( event ); + } + } + + /** + * Adds a list of tuner configuration assignments to the model + */ + public void addTunerConfigurationAssignments( List assignments ) + { + for( TunerConfigurationAssignment assigment: assignments ) + { + addTunerConfigurationAssignment( assigment ); + } + } + + /** + * Returns of list of tuner configurations from the model + */ + public List getTunerConfigurationAssignments() + { + return mTunerConfigurationAssignments; + } + + /** + * Adds a tuner configuration assigment to the model + */ + public void addTunerConfigurationAssignment( TunerConfigurationAssignment assignment ) + { + mTunerConfigurationAssignments.add( assignment ); + + broadcast( new TunerConfigurationEvent( assignment, Event.ASSIGNMENT_ADD ) ); + } + + /** + * Removes a tuner configuration assignment from the model + */ + public void removeTunerConfigurationAssignment( TunerConfigurationAssignment assignment ) + { + mTunerConfigurationAssignments.remove( assignment ); + + broadcast( new TunerConfigurationEvent( assignment, Event.ASSIGNMENT_REMOVE ) ); + } + + /** + * Returns the tuner configuration that is assigned to the tuner with the + * tuner type and uniqueID, or creates a new tuner configuration and tuner + * configuration assignment for the tuner. + */ + public TunerConfiguration getTunerConfiguration( TunerType type, String uniqueID ) + { + String configurationName = null; + + TunerConfigurationAssignment assignment = getTunerConfigurationAssignment( type, uniqueID ); + + if( assignment != null ) + { + configurationName = assignment.getTunerConfigurationName(); + } + + if( configurationName == null ) + { + configurationName = "Default-" + uniqueID; + } + + List configs = getTunerConfigurations( type ); + + for( TunerConfiguration config: configs ) + { + if( config.getName().contentEquals( configurationName ) ) + { + if( assignment == null ) + { + assignTunerConfiguration( config, configurationName ); + } + + return config; + } + } + + //We didn't find the config so create a new one and assign it + TunerConfiguration config = TunerConfigurationFactory + .getTunerConfiguration( type, configurationName ); + + addTunerConfiguration( config ); + assignTunerConfiguration( config, configurationName ); + + return config; + } + + /** + * Assigns the tuner configuration to the tuner identified by the uniqueID + */ + public void assignTunerConfiguration( TunerConfiguration config, String uniqueID ) + { + TunerConfigurationAssignment assignment = + getTunerConfigurationAssignment( config.getTunerType(), uniqueID ); + + Event event = Event.ASSIGNMENT_CHANGE; + + if( assignment == null ) + { + assignment = new TunerConfigurationAssignment(); + assignment.setUniqueID( uniqueID ); + + addTunerConfigurationAssignment( assignment ); + + event = Event.ASSIGNMENT_ADD; + } + + assignment.setTunerConfigurationName( config.getName() ); + + broadcast( new TunerConfigurationEvent( assignment, event ) ); + } + + /** + * Returns the tuner configuration assiged to the tuner type and unique id + */ + private TunerConfigurationAssignment getTunerConfigurationAssignment( TunerType type, String uniqueID ) + { + for( TunerConfigurationAssignment assignment: mTunerConfigurationAssignments ) + { + if( assignment.getTunerType() == type && + assignment.getUniqueID().contentEquals( uniqueID ) ) + { + return assignment; + } + } + + return null; + } + + /** + * Returns all tuner configurations for the specified tuner type + */ + public List getTunerConfigurations( TunerType type ) + { + List configs = new ArrayList<>(); + + for( TunerConfiguration config: mTunerConfigurations ) + { + if( config.getTunerType() == type ) + { + configs.add( config ); + } + } + + return configs; + } + + /** + * Column names for the table model + */ + @Override + public String getColumnName( int column ) + { + return COLUMN_HEADERS[ column ]; + } + + /** + * Tuner configuration model row count + */ + @Override + public int getRowCount() + { + return mTunerConfigurations.size(); + } + + /** + * Tuner configuration model column count + */ + @Override + public int getColumnCount() + { + return COLUMN_HEADERS.length; + } + + /** + * Returns the row index for the specified configuration or -1 + */ + public int getRowIndex( TunerConfiguration configuration ) + { + if( mTunerConfigurations.contains( configuration ) ) + { + return mTunerConfigurations.indexOf( configuration ); + } + + return -1; + } + + /** + * Returns the configuration at the specified index or null + */ + public TunerConfiguration getTunerConfiguration( int index ) + { + if( index >= 0 && index < mTunerConfigurations.size() ) + { + return mTunerConfigurations.get( index ); + } + + return null; + } + + /** + * Returns the value at the indicated table cell + */ + @Override + public Object getValueAt( int row, int column ) + { + if( row >= 0 && row < mTunerConfigurations.size() ) + { + TunerConfiguration config = mTunerConfigurations.get( row ); + + switch( column ) + { + case TUNER_TYPE: + return config.getTunerType().getLabel(); + case CONFIGURATION_NAME: + return config.getName(); + default: + break; + } + } + + return null; + } + +} diff --git a/src/source/tuner/ettus/B100Tuner.java b/src/source/tuner/ettus/B100Tuner.java index b14e0e77..40e4c6b8 100644 --- a/src/source/tuner/ettus/B100Tuner.java +++ b/src/source/tuner/ettus/B100Tuner.java @@ -30,8 +30,8 @@ import source.tuner.Tuner; import source.tuner.TunerChannel; import source.tuner.TunerChannelSource; import source.tuner.TunerClass; -import source.tuner.TunerConfiguration; import source.tuner.TunerType; +import source.tuner.configuration.TunerConfiguration; import source.tuner.usb.USBTunerDevice; import controller.ThreadPoolManager; @@ -68,12 +68,6 @@ public class B100Tuner extends Tuner return TunerType.ETTUS_WBX; } - @Override - public JPanel getEditor( SettingsManager settingsManager ) - { - return new B100TunerEditorPanel( this, settingsManager ); - } - @Override public void apply( TunerConfiguration config ) throws SourceException { diff --git a/src/source/tuner/fcd/FCDTuner.java b/src/source/tuner/fcd/FCDTuner.java index e2a1bcfa..9ce5087b 100644 --- a/src/source/tuner/fcd/FCDTuner.java +++ b/src/source/tuner/fcd/FCDTuner.java @@ -28,12 +28,12 @@ import settings.SettingsManager; import source.SourceException; import source.tuner.MixerTuner; import source.tuner.MixerTunerDataLine; -import source.tuner.TunerChangeEvent; +import source.tuner.TunerEvent; import source.tuner.TunerChannel; import source.tuner.TunerChannelSource; import source.tuner.TunerClass; -import source.tuner.TunerConfiguration; import source.tuner.TunerType; +import source.tuner.configuration.TunerConfiguration; public class FCDTuner extends MixerTuner { @@ -80,12 +80,6 @@ public class FCDTuner extends MixerTuner return mController.getUSBAddress(); } - @Override - public JPanel getEditor( SettingsManager settingsManager ) - { - return mController.getEditor( this, settingsManager ); - } - @Override public void apply( TunerConfiguration config )throws SourceException { @@ -118,7 +112,7 @@ public class FCDTuner extends MixerTuner if( source != null ) { - broadcast( new TunerChangeEvent( this, TunerChangeEvent.Event.CHANNEL_COUNT ) ); + broadcast( new TunerEvent( this, TunerEvent.Event.CHANNEL_COUNT ) ); } return source; diff --git a/src/source/tuner/fcd/FCDTunerController.java b/src/source/tuner/fcd/FCDTunerController.java index ca602ed2..d1fdfd62 100644 --- a/src/source/tuner/fcd/FCDTunerController.java +++ b/src/source/tuner/fcd/FCDTunerController.java @@ -36,9 +36,9 @@ import org.usb4java.LibUsbException; import settings.SettingsManager; import source.SourceException; import source.tuner.TunerClass; -import source.tuner.TunerConfiguration; import source.tuner.TunerController; import source.tuner.TunerType; +import source.tuner.configuration.TunerConfiguration; import source.tuner.fcd.proV1.FCD1TunerController.Block; public abstract class FCDTunerController extends TunerController diff --git a/src/source/tuner/fcd/proV1/FCD1TunerConfiguration.java b/src/source/tuner/fcd/proV1/FCD1TunerConfiguration.java index 29a7b0f4..43152221 100644 --- a/src/source/tuner/fcd/proV1/FCD1TunerConfiguration.java +++ b/src/source/tuner/fcd/proV1/FCD1TunerConfiguration.java @@ -19,8 +19,8 @@ package source.tuner.fcd.proV1; import javax.xml.bind.annotation.XmlAttribute; -import source.tuner.TunerConfiguration; import source.tuner.TunerType; +import source.tuner.configuration.TunerConfiguration; import source.tuner.fcd.proV1.FCD1TunerController.LNAEnhance; import source.tuner.fcd.proV1.FCD1TunerController.LNAGain; import source.tuner.fcd.proV1.FCD1TunerController.MixerGain; diff --git a/src/source/tuner/fcd/proV1/FCD1TunerConfigurationPanel.java b/src/source/tuner/fcd/proV1/FCD1TunerConfigurationPanel.java index b54bef0b..051d597f 100644 --- a/src/source/tuner/fcd/proV1/FCD1TunerConfigurationPanel.java +++ b/src/source/tuner/fcd/proV1/FCD1TunerConfigurationPanel.java @@ -49,8 +49,8 @@ import org.slf4j.LoggerFactory; import settings.SettingsManager; import source.SourceException; -import source.tuner.TunerConfiguration; import source.tuner.TunerType; +import source.tuner.configuration.TunerConfiguration; import source.tuner.fcd.proV1.FCD1TunerController.LNAEnhance; import source.tuner.fcd.proV1.FCD1TunerController.LNAGain; import source.tuner.fcd.proV1.FCD1TunerController.MixerGain; @@ -426,14 +426,14 @@ public class FCD1TunerConfigurationPanel extends JPanel @Override public void actionPerformed( ActionEvent e ) { - TunerConfiguration config = - mSettingsManager.addNewTunerConfiguration( - TunerType.FUNCUBE_DONGLE_PRO, - "New Configuration" ); +// TunerConfiguration config = +// mSettingsManager.addNewTunerConfiguration( +// TunerType.FUNCUBE_DONGLE_PRO, +// "New Configuration" ); mComboConfigurations.setModel( getModel() ); - mComboConfigurations.setSelectedItem( config ); +// mComboConfigurations.setSelectedItem( config ); repaint(); } @@ -470,7 +470,7 @@ public class FCD1TunerConfigurationPanel extends JPanel if( n == JOptionPane.YES_OPTION ) { - mSettingsManager.deleteTunerConfiguration( selected ); +// mSettingsManager.deleteTunerConfiguration( selected ); mComboConfigurations.setModel( getModel() ); @@ -505,9 +505,9 @@ public class FCD1TunerConfigurationPanel extends JPanel mCorrectionGain.setValue( config.getGainCorrection() ); mCorrectionPhase.setValue( config.getPhaseCorrection() ); - mSettingsManager.setSelectedTunerConfiguration( - TunerType.FUNCUBE_DONGLE_PRO, - mController.getUSBAddress(), config ); +// mSettingsManager.setSelectedTunerConfiguration( +// TunerType.FUNCUBE_DONGLE_PRO, +// mController.getUSBAddress(), config ); } catch ( SourceException e1 ) { @@ -524,16 +524,16 @@ public class FCD1TunerConfigurationPanel extends JPanel private ComboBoxModel getModel() { - ArrayList configs = - mSettingsManager.getTunerConfigurations( TunerType.FUNCUBE_DONGLE_PRO ); +// ArrayList configs = +// mSettingsManager.getTunerConfigurations( TunerType.FUNCUBE_DONGLE_PRO ); DefaultComboBoxModel model = new DefaultComboBoxModel(); - for( TunerConfiguration config: configs ) - { - model.addElement( (FCD1TunerConfiguration)config ); - } +// for( TunerConfiguration config: configs ) +// { +// model.addElement( (FCD1TunerConfiguration)config ); +// } return model; } @@ -541,16 +541,16 @@ public class FCD1TunerConfigurationPanel extends JPanel @SuppressWarnings( "unused" ) private FCD1TunerConfiguration getNamedConfiguration( String name ) { - ArrayList configs = - mSettingsManager.getTunerConfigurations( TunerType.FUNCUBE_DONGLE_PRO ); +// ArrayList configs = +// mSettingsManager.getTunerConfigurations( TunerType.FUNCUBE_DONGLE_PRO ); - for( TunerConfiguration config: configs ) - { - if( config.getName().contentEquals( name ) ) - { - return (FCD1TunerConfiguration)config; - } - } +// for( TunerConfiguration config: configs ) +// { +// if( config.getName().contentEquals( name ) ) +// { +// return (FCD1TunerConfiguration)config; +// } +// } return null; } diff --git a/src/source/tuner/fcd/proV1/FCD1TunerController.java b/src/source/tuner/fcd/proV1/FCD1TunerController.java index 8de3053c..005950b1 100644 --- a/src/source/tuner/fcd/proV1/FCD1TunerController.java +++ b/src/source/tuner/fcd/proV1/FCD1TunerController.java @@ -32,8 +32,8 @@ import org.usb4java.DeviceDescriptor; import settings.SettingsManager; import source.SourceException; import source.tuner.TunerClass; -import source.tuner.TunerConfiguration; import source.tuner.TunerType; +import source.tuner.configuration.TunerConfiguration; import source.tuner.fcd.FCDCommand; import source.tuner.fcd.FCDTuner; import source.tuner.fcd.FCDTunerController; diff --git a/src/source/tuner/fcd/proplusV2/FCD2TunerConfiguration.java b/src/source/tuner/fcd/proplusV2/FCD2TunerConfiguration.java index 06a4de4d..b2955570 100644 --- a/src/source/tuner/fcd/proplusV2/FCD2TunerConfiguration.java +++ b/src/source/tuner/fcd/proplusV2/FCD2TunerConfiguration.java @@ -19,8 +19,8 @@ package source.tuner.fcd.proplusV2; import javax.xml.bind.annotation.XmlAttribute; -import source.tuner.TunerConfiguration; import source.tuner.TunerType; +import source.tuner.configuration.TunerConfiguration; public class FCD2TunerConfiguration extends TunerConfiguration { diff --git a/src/source/tuner/fcd/proplusV2/FCD2TunerConfigurationPanel.java b/src/source/tuner/fcd/proplusV2/FCD2TunerConfigurationPanel.java index 8bd20ac9..991d0b11 100644 --- a/src/source/tuner/fcd/proplusV2/FCD2TunerConfigurationPanel.java +++ b/src/source/tuner/fcd/proplusV2/FCD2TunerConfigurationPanel.java @@ -48,9 +48,9 @@ import org.slf4j.LoggerFactory; import settings.SettingsManager; import source.SourceException; -import source.tuner.TunerConfiguration; -import source.tuner.TunerConfigurationAssignment; import source.tuner.TunerType; +import source.tuner.configuration.TunerConfiguration; +import source.tuner.configuration.TunerConfigurationAssignment; public class FCD2TunerConfigurationPanel extends JPanel { @@ -218,26 +218,26 @@ public class FCD2TunerConfigurationPanel extends JPanel * Lookup the save config and apply that config to update all of the * controls */ - TunerConfigurationAssignment savedConfig = mSettingsManager - .getSelectedTunerConfiguration( - TunerType.FUNCUBE_DONGLE_PRO_PLUS, - mController.getUSBAddress() ); - - if( savedConfig != null ) - { - mSelectedConfig = getNamedConfiguration( - savedConfig.getTunerConfigurationName() ); - } +// TunerConfigurationAssignment savedConfig = mSettingsManager +// .getSelectedTunerConfiguration( +// TunerType.FUNCUBE_DONGLE_PRO_PLUS, +// mController.getUSBAddress() ); +// +// if( savedConfig != null ) +// { +// mSelectedConfig = getNamedConfiguration( +// savedConfig.getTunerConfigurationName() ); +// } if( mSelectedConfig == null ) { mSelectedConfig = mComboConfigurations.getItemAt( 0 ); - //Store this config as the default for this tuner at this address - mSettingsManager - .setSelectedTunerConfiguration( - TunerType.FUNCUBE_DONGLE_PRO_PLUS, - mController.getUSBAddress(), mSelectedConfig ); +// //Store this config as the default for this tuner at this address +// mSettingsManager +// .setSelectedTunerConfiguration( +// TunerType.FUNCUBE_DONGLE_PRO_PLUS, +// mController.getUSBAddress(), mSelectedConfig ); } mComboConfigurations.setSelectedItem( mSelectedConfig ); @@ -252,15 +252,15 @@ public class FCD2TunerConfigurationPanel extends JPanel @Override public void actionPerformed( ActionEvent e ) { - TunerConfiguration config = - mSettingsManager - .addNewTunerConfiguration( - TunerType.FUNCUBE_DONGLE_PRO_PLUS, - "New Configuration" ); +// TunerConfiguration config = +// mSettingsManager +// .addNewTunerConfiguration( +// TunerType.FUNCUBE_DONGLE_PRO_PLUS, +// "New Configuration" ); mComboConfigurations.setModel( getModel() ); - mComboConfigurations.setSelectedItem( config ); +// mComboConfigurations.setSelectedItem( config ); repaint(); } @@ -293,8 +293,8 @@ public class FCD2TunerConfigurationPanel extends JPanel if( n == JOptionPane.YES_OPTION ) { - mSettingsManager - .deleteTunerConfiguration( selected ); +// mSettingsManager +// .deleteTunerConfiguration( selected ); mComboConfigurations.setModel( getModel() ); @@ -322,9 +322,9 @@ public class FCD2TunerConfigurationPanel extends JPanel mMixerGain.setSelected( config.getGainMixer() ); mFrequencyCorrection.setValue( config.getFrequencyCorrection() ); - mSettingsManager.setSelectedTunerConfiguration( - TunerType.FUNCUBE_DONGLE_PRO_PLUS, - mController.getUSBAddress(), config ); +// mSettingsManager.setSelectedTunerConfiguration( +// TunerType.FUNCUBE_DONGLE_PRO_PLUS, +// mController.getUSBAddress(), config ); } catch ( SourceException e1 ) { @@ -341,34 +341,34 @@ public class FCD2TunerConfigurationPanel extends JPanel private ComboBoxModel getModel() { - ArrayList configs = - mSettingsManager - .getTunerConfigurations( TunerType.FUNCUBE_DONGLE_PRO_PLUS ); +// ArrayList configs = +// mSettingsManager +// .getTunerConfigurations( TunerType.FUNCUBE_DONGLE_PRO_PLUS ); DefaultComboBoxModel model = new DefaultComboBoxModel(); - for( TunerConfiguration config: configs ) - { - model.addElement( (FCD2TunerConfiguration)config ); - } +// for( TunerConfiguration config: configs ) +// { +// model.addElement( (FCD2TunerConfiguration)config ); +// } return model; } private FCD2TunerConfiguration getNamedConfiguration( String name ) { - ArrayList configs = - mSettingsManager - .getTunerConfigurations( TunerType.FUNCUBE_DONGLE_PRO_PLUS ); +// ArrayList configs = +// mSettingsManager +// .getTunerConfigurations( TunerType.FUNCUBE_DONGLE_PRO_PLUS ); - for( TunerConfiguration config: configs ) - { - if( config.getName().contentEquals( name ) ) - { - return (FCD2TunerConfiguration)config; - } - } +// for( TunerConfiguration config: configs ) +// { +// if( config.getName().contentEquals( name ) ) +// { +// return (FCD2TunerConfiguration)config; +// } +// } return null; } diff --git a/src/source/tuner/fcd/proplusV2/FCD2TunerController.java b/src/source/tuner/fcd/proplusV2/FCD2TunerController.java index 96a31b85..da7520c1 100644 --- a/src/source/tuner/fcd/proplusV2/FCD2TunerController.java +++ b/src/source/tuner/fcd/proplusV2/FCD2TunerController.java @@ -30,8 +30,8 @@ import org.usb4java.DeviceDescriptor; import settings.SettingsManager; import source.SourceException; import source.tuner.TunerClass; -import source.tuner.TunerConfiguration; import source.tuner.TunerType; +import source.tuner.configuration.TunerConfiguration; import source.tuner.fcd.FCDCommand; import source.tuner.fcd.FCDTuner; import source.tuner.fcd.FCDTunerController; diff --git a/src/source/tuner/hackrf/HackRFTuner.java b/src/source/tuner/hackrf/HackRFTuner.java index aee8570b..a0a52613 100644 --- a/src/source/tuner/hackrf/HackRFTuner.java +++ b/src/source/tuner/hackrf/HackRFTuner.java @@ -29,12 +29,12 @@ import sample.complex.ComplexBuffer; import settings.SettingsManager; import source.SourceException; import source.tuner.Tuner; -import source.tuner.TunerChangeEvent; +import source.tuner.TunerEvent; import source.tuner.TunerChannel; import source.tuner.TunerChannelSource; import source.tuner.TunerClass; -import source.tuner.TunerConfiguration; import source.tuner.TunerType; +import source.tuner.configuration.TunerConfiguration; import source.tuner.hackrf.HackRFTunerController.BoardID; public class HackRFTuner extends Tuner @@ -75,12 +75,6 @@ public class HackRFTuner extends Tuner return TunerType.HACKRF; } - @Override - public JPanel getEditor( SettingsManager settingsManager ) - { - return new HackRFTunerEditorPanel( this, settingsManager ); - } - @Override public void apply( TunerConfiguration config ) throws SourceException { @@ -113,7 +107,7 @@ public class HackRFTuner extends Tuner if( source != null ) { - broadcast( new TunerChangeEvent( this, TunerChangeEvent.Event.CHANNEL_COUNT ) ); + broadcast( new TunerEvent( this, TunerEvent.Event.CHANNEL_COUNT ) ); } return source; diff --git a/src/source/tuner/hackrf/HackRFTunerConfiguration.java b/src/source/tuner/hackrf/HackRFTunerConfiguration.java index 66d85e25..33356fc0 100644 --- a/src/source/tuner/hackrf/HackRFTunerConfiguration.java +++ b/src/source/tuner/hackrf/HackRFTunerConfiguration.java @@ -20,8 +20,8 @@ package source.tuner.hackrf; import javax.xml.bind.annotation.XmlAttribute; -import source.tuner.TunerConfiguration; import source.tuner.TunerType; +import source.tuner.configuration.TunerConfiguration; import source.tuner.hackrf.HackRFTunerController.HackRFLNAGain; import source.tuner.hackrf.HackRFTunerController.HackRFSampleRate; import source.tuner.hackrf.HackRFTunerController.HackRFVGAGain; diff --git a/src/source/tuner/hackrf/HackRFTunerConfigurationPanel.java b/src/source/tuner/hackrf/HackRFTunerConfigurationPanel.java index 1acd7269..88aa95d6 100644 --- a/src/source/tuner/hackrf/HackRFTunerConfigurationPanel.java +++ b/src/source/tuner/hackrf/HackRFTunerConfigurationPanel.java @@ -50,9 +50,9 @@ import org.slf4j.LoggerFactory; import settings.SettingsManager; import source.SourceException; -import source.tuner.TunerConfiguration; -import source.tuner.TunerConfigurationAssignment; import source.tuner.TunerType; +import source.tuner.configuration.TunerConfiguration; +import source.tuner.configuration.TunerConfigurationAssignment; import source.tuner.hackrf.HackRFTunerController.HackRFLNAGain; import source.tuner.hackrf.HackRFTunerController.HackRFSampleRate; import source.tuner.hackrf.HackRFTunerController.HackRFVGAGain; @@ -117,11 +117,11 @@ public class HackRFTunerConfigurationPanel extends JPanel mLog.error( "couldn't read hackrf serial number", e2 ); } - if( serial != null ) - { - savedConfig = mSettingsManager.getSelectedTunerConfiguration( - TunerType.HACKRF, serial ); - } +// if( serial != null ) +// { +// savedConfig = mSettingsManager.getSelectedTunerConfiguration( +// TunerType.HACKRF, serial ); +// } if( savedConfig != null ) { @@ -136,12 +136,12 @@ public class HackRFTunerConfigurationPanel extends JPanel //Store this config as the default for this tuner at this address - if( serial != null ) - { - mSettingsManager - .setSelectedTunerConfiguration( TunerType.HACKRF, - serial, mSelectedConfig ); - } +// if( serial != null ) +// { +// mSettingsManager +// .setSelectedTunerConfiguration( TunerType.HACKRF, +// serial, mSelectedConfig ); +// } } mComboConfigurations.setSelectedItem( mSelectedConfig ); @@ -416,15 +416,15 @@ public class HackRFTunerConfigurationPanel extends JPanel @Override public void actionPerformed( ActionEvent e ) { - TunerConfiguration config = - mSettingsManager - .addNewTunerConfiguration( - TunerType.HACKRF, - "New Configuration" ); +// TunerConfiguration config = +// mSettingsManager +// .addNewTunerConfiguration( +// TunerType.HACKRF, +// "New Configuration" ); mComboConfigurations.setModel( getModel() ); - mComboConfigurations.setSelectedItem( config ); +// mComboConfigurations.setSelectedItem( config ); repaint(); } @@ -457,8 +457,8 @@ public class HackRFTunerConfigurationPanel extends JPanel if( n == JOptionPane.YES_OPTION ) { - mSettingsManager - .deleteTunerConfiguration( selected ); +// mSettingsManager +// .deleteTunerConfiguration( selected ); mComboConfigurations.setModel( getModel() ); @@ -493,10 +493,10 @@ public class HackRFTunerConfigurationPanel extends JPanel mComboSampleRate.setSelectedItem( mSelectedConfig.getSampleRate() ); - mSettingsManager.setSelectedTunerConfiguration( - TunerType.HACKRF, mController.getSerial().getSerialNumber(), config ); +// mSettingsManager.setSelectedTunerConfiguration( +// TunerType.HACKRF, mController.getSerial().getSerialNumber(), config ); } - catch ( UsbException | SourceException e1 ) + catch ( SourceException e1 ) { JOptionPane.showMessageDialog( HackRFTunerConfigurationPanel.this, @@ -516,17 +516,17 @@ public class HackRFTunerConfigurationPanel extends JPanel */ private ComboBoxModel getModel() { - ArrayList configs = - mSettingsManager - .getTunerConfigurations( TunerType.HACKRF ); +// ArrayList configs = +// mSettingsManager +// .getTunerConfigurations( TunerType.HACKRF ); DefaultComboBoxModel model = new DefaultComboBoxModel(); - for( TunerConfiguration config: configs ) - { - model.addElement( (HackRFTunerConfiguration)config ); - } +// for( TunerConfiguration config: configs ) +// { +// model.addElement( (HackRFTunerConfiguration)config ); +// } return model; } @@ -536,17 +536,17 @@ public class HackRFTunerConfigurationPanel extends JPanel */ private HackRFTunerConfiguration getNamedConfiguration( String name ) { - ArrayList configs = - mSettingsManager - .getTunerConfigurations( TunerType.HACKRF ); +// ArrayList configs = +// mSettingsManager +// .getTunerConfigurations( TunerType.HACKRF ); - for( TunerConfiguration config: configs ) - { - if( config.getName().contentEquals( name ) ) - { - return (HackRFTunerConfiguration)config; - } - } +// for( TunerConfiguration config: configs ) +// { +// if( config.getName().contentEquals( name ) ) +// { +// return (HackRFTunerConfiguration)config; +// } +// } return null; } diff --git a/src/source/tuner/hackrf/HackRFTunerController.java b/src/source/tuner/hackrf/HackRFTunerController.java index cf4146d1..a4545dc2 100644 --- a/src/source/tuner/hackrf/HackRFTunerController.java +++ b/src/source/tuner/hackrf/HackRFTunerController.java @@ -81,8 +81,8 @@ import sample.Listener; import sample.adapter.ByteSampleAdapter; import sample.complex.ComplexBuffer; import source.SourceException; -import source.tuner.TunerConfiguration; import source.tuner.TunerController; +import source.tuner.configuration.TunerConfiguration; import controller.ThreadPoolManager; import controller.ThreadPoolManager.ThreadType; diff --git a/src/source/tuner/rtl/RTL2832Tuner.java b/src/source/tuner/rtl/RTL2832Tuner.java index 55c7dfed..1cbbd6ce 100644 --- a/src/source/tuner/rtl/RTL2832Tuner.java +++ b/src/source/tuner/rtl/RTL2832Tuner.java @@ -30,12 +30,12 @@ import sample.complex.ComplexBuffer; import settings.SettingsManager; import source.SourceException; import source.tuner.Tuner; -import source.tuner.TunerChangeEvent; +import source.tuner.TunerEvent; import source.tuner.TunerChannel; import source.tuner.TunerChannelSource; import source.tuner.TunerClass; -import source.tuner.TunerConfiguration; import source.tuner.TunerType; +import source.tuner.configuration.TunerConfiguration; import source.tuner.frequency.IFrequencyChangeListener; import source.tuner.rtl.RTL2832TunerController.SampleRate; import controller.ThreadPoolManager; @@ -89,12 +89,6 @@ public class RTL2832Tuner extends Tuner return mController.getTunerType(); } - @Override - public JPanel getEditor( SettingsManager settingsManager ) - { - return mController.getEditor( settingsManager ); - } - @Override public void apply( TunerConfiguration config ) throws SourceException { @@ -161,7 +155,7 @@ public class RTL2832Tuner extends Tuner if( source != null ) { - broadcast( new TunerChangeEvent( this, TunerChangeEvent.Event.CHANNEL_COUNT ) ); + broadcast( new TunerEvent( this, TunerEvent.Event.CHANNEL_COUNT ) ); } } catch( Exception e ) diff --git a/src/source/tuner/rtl/RTL2832TunerController.java b/src/source/tuner/rtl/RTL2832TunerController.java index 802bd15b..5efa45d4 100644 --- a/src/source/tuner/rtl/RTL2832TunerController.java +++ b/src/source/tuner/rtl/RTL2832TunerController.java @@ -363,8 +363,6 @@ public abstract class RTL2832TunerController extends TunerController } } - public abstract JPanel getEditor( SettingsManager settingsManager ); - public abstract void setSampleRateFilters( int sampleRate ) throws SourceException; diff --git a/src/source/tuner/rtl/e4k/E4KTunerConfiguration.java b/src/source/tuner/rtl/e4k/E4KTunerConfiguration.java index d7d82a62..5c699d4d 100644 --- a/src/source/tuner/rtl/e4k/E4KTunerConfiguration.java +++ b/src/source/tuner/rtl/e4k/E4KTunerConfiguration.java @@ -19,8 +19,8 @@ package source.tuner.rtl.e4k; import javax.xml.bind.annotation.XmlAttribute; -import source.tuner.TunerConfiguration; import source.tuner.TunerType; +import source.tuner.configuration.TunerConfiguration; import source.tuner.rtl.RTL2832TunerController.SampleRate; import source.tuner.rtl.e4k.E4KTunerController.E4KEnhanceGain; import source.tuner.rtl.e4k.E4KTunerController.E4KGain; diff --git a/src/source/tuner/rtl/e4k/E4KTunerConfigurationPanel.java b/src/source/tuner/rtl/e4k/E4KTunerConfigurationPanel.java index ed3a4ac7..b411ff5e 100644 --- a/src/source/tuner/rtl/e4k/E4KTunerConfigurationPanel.java +++ b/src/source/tuner/rtl/e4k/E4KTunerConfigurationPanel.java @@ -50,9 +50,9 @@ import org.usb4java.LibUsbException; import settings.SettingsManager; import source.SourceException; -import source.tuner.TunerConfiguration; -import source.tuner.TunerConfigurationAssignment; import source.tuner.TunerType; +import source.tuner.configuration.TunerConfiguration; +import source.tuner.configuration.TunerConfigurationAssignment; import source.tuner.rtl.RTL2832TunerController.SampleRate; import source.tuner.rtl.e4k.E4KTunerController.E4KEnhanceGain; import source.tuner.rtl.e4k.E4KTunerController.E4KGain; @@ -108,15 +108,15 @@ public class E4KTunerConfigurationPanel extends JPanel mComboConfigurations.setModel( getModel() ); /* Determine which tuner configuration should be selected/displayed */ - TunerConfigurationAssignment savedConfig = mSettingsManager - .getSelectedTunerConfiguration( - TunerType.ELONICS_E4000, mController.getUniqueID() ); - - if( savedConfig != null ) - { - mSelectedConfig = getNamedConfiguration( - savedConfig.getTunerConfigurationName() ); - } +// TunerConfigurationAssignment savedConfig = mSettingsManager +// .getSelectedTunerConfiguration( +// TunerType.ELONICS_E4000, mController.getUniqueID() ); +// +// if( savedConfig != null ) +// { +// mSelectedConfig = getNamedConfiguration( +// savedConfig.getTunerConfigurationName() ); +// } /* If we couldn't determine the saved/selected config, use the first one */ if( mSelectedConfig == null ) @@ -124,10 +124,10 @@ public class E4KTunerConfigurationPanel extends JPanel mSelectedConfig = mComboConfigurations.getItemAt( 0 ); //Store this config as the default for this tuner at this address - mSettingsManager - .setSelectedTunerConfiguration( - TunerType.ELONICS_E4000, - mController.getUniqueID(), mSelectedConfig ); +// mSettingsManager +// .setSelectedTunerConfiguration( +// TunerType.ELONICS_E4000, +// mController.getUniqueID(), mSelectedConfig ); } mComboConfigurations.setSelectedItem( mSelectedConfig ); @@ -168,10 +168,10 @@ public class E4KTunerConfigurationPanel extends JPanel /* Reset this named config as the assigned config for this * tuner */ - mSettingsManager - .setSelectedTunerConfiguration( - TunerType.ELONICS_E4000, - mController.getUniqueID(), mSelectedConfig ); +// mSettingsManager +// .setSelectedTunerConfiguration( +// TunerType.ELONICS_E4000, +// mController.getUniqueID(), mSelectedConfig ); save(); } @@ -541,15 +541,15 @@ public class E4KTunerConfigurationPanel extends JPanel @Override public void actionPerformed( ActionEvent e ) { - TunerConfiguration config = - mSettingsManager - .addNewTunerConfiguration( - TunerType.ELONICS_E4000, - "New Configuration" ); +// TunerConfiguration config = +// mSettingsManager +// .addNewTunerConfiguration( +// TunerType.ELONICS_E4000, +// "New Configuration" ); mComboConfigurations.setModel( getModel() ); - mComboConfigurations.setSelectedItem( config ); +// mComboConfigurations.setSelectedItem( config ); repaint(); } @@ -582,8 +582,8 @@ public class E4KTunerConfigurationPanel extends JPanel if( n == JOptionPane.YES_OPTION ) { - mSettingsManager - .deleteTunerConfiguration( selected ); +// mSettingsManager +// .deleteTunerConfiguration( selected ); mComboConfigurations.setModel( getModel() ); @@ -623,8 +623,8 @@ public class E4KTunerConfigurationPanel extends JPanel mComboSampleRate.setSelectedItem( mSelectedConfig.getSampleRate() ); - mSettingsManager.setSelectedTunerConfiguration( - TunerType.ELONICS_E4000, mController.getUniqueID(), config ); +// mSettingsManager.setSelectedTunerConfiguration( +// TunerType.ELONICS_E4000, mController.getUniqueID(), config ); } catch ( SourceException e1 ) { @@ -646,17 +646,17 @@ public class E4KTunerConfigurationPanel extends JPanel */ private ComboBoxModel getModel() { - ArrayList configs = - mSettingsManager - .getTunerConfigurations( TunerType.ELONICS_E4000 ); +// ArrayList configs = +// mSettingsManager +// .getTunerConfigurations( TunerType.ELONICS_E4000 ); DefaultComboBoxModel model = new DefaultComboBoxModel(); - for( TunerConfiguration config: configs ) - { - model.addElement( (E4KTunerConfiguration)config ); - } +// for( TunerConfiguration config: configs ) +// { +// model.addElement( (E4KTunerConfiguration)config ); +// } return model; } @@ -666,17 +666,17 @@ public class E4KTunerConfigurationPanel extends JPanel */ private E4KTunerConfiguration getNamedConfiguration( String name ) { - ArrayList configs = - mSettingsManager - .getTunerConfigurations( TunerType.ELONICS_E4000 ); - - for( TunerConfiguration config: configs ) - { - if( config.getName().contentEquals( name ) ) - { - return (E4KTunerConfiguration)config; - } - } +// ArrayList configs = +// mSettingsManager +// .getTunerConfigurations( TunerType.ELONICS_E4000 ); +// +// for( TunerConfiguration config: configs ) +// { +// if( config.getName().contentEquals( name ) ) +// { +// return (E4KTunerConfiguration)config; +// } +// } return null; } diff --git a/src/source/tuner/rtl/e4k/E4KTunerController.java b/src/source/tuner/rtl/e4k/E4KTunerController.java index b727fa74..6f4df48c 100644 --- a/src/source/tuner/rtl/e4k/E4KTunerController.java +++ b/src/source/tuner/rtl/e4k/E4KTunerController.java @@ -32,8 +32,8 @@ import org.usb4java.LibUsbException; import settings.SettingsManager; import source.SourceException; -import source.tuner.TunerConfiguration; import source.tuner.TunerType; +import source.tuner.configuration.TunerConfiguration; import source.tuner.rtl.RTL2832TunerController; import controller.ThreadPoolManager; diff --git a/src/source/tuner/rtl/r820t/R820TTunerConfiguration.java b/src/source/tuner/rtl/r820t/R820TTunerConfiguration.java index 8ecc7795..95686f66 100644 --- a/src/source/tuner/rtl/r820t/R820TTunerConfiguration.java +++ b/src/source/tuner/rtl/r820t/R820TTunerConfiguration.java @@ -19,8 +19,8 @@ package source.tuner.rtl.r820t; import javax.xml.bind.annotation.XmlAttribute; -import source.tuner.TunerConfiguration; import source.tuner.TunerType; +import source.tuner.configuration.TunerConfiguration; import source.tuner.rtl.RTL2832TunerController.SampleRate; import source.tuner.rtl.r820t.R820TTunerController.R820TGain; import source.tuner.rtl.r820t.R820TTunerController.R820TLNAGain; diff --git a/src/source/tuner/rtl/r820t/R820TTunerConfigurationPanel.java b/src/source/tuner/rtl/r820t/R820TTunerConfigurationEditorOld.java similarity index 88% rename from src/source/tuner/rtl/r820t/R820TTunerConfigurationPanel.java rename to src/source/tuner/rtl/r820t/R820TTunerConfigurationEditorOld.java index 413dc8ea..1a310ba1 100644 --- a/src/source/tuner/rtl/r820t/R820TTunerConfigurationPanel.java +++ b/src/source/tuner/rtl/r820t/R820TTunerConfigurationEditorOld.java @@ -50,21 +50,22 @@ import org.usb4java.LibUsbException; import settings.SettingsManager; import source.SourceException; -import source.tuner.TunerConfiguration; -import source.tuner.TunerConfigurationAssignment; import source.tuner.TunerType; +import source.tuner.configuration.TunerConfiguration; +import source.tuner.configuration.TunerConfigurationAssignment; import source.tuner.rtl.RTL2832TunerController.SampleRate; import source.tuner.rtl.r820t.R820TTunerController.R820TGain; import source.tuner.rtl.r820t.R820TTunerController.R820TLNAGain; import source.tuner.rtl.r820t.R820TTunerController.R820TMixerGain; import source.tuner.rtl.r820t.R820TTunerController.R820TVGAGain; -public class R820TTunerConfigurationPanel extends JPanel +public class R820TTunerConfigurationEditorOld extends JPanel { - private final static Logger mLog = - LoggerFactory.getLogger( R820TTunerConfigurationPanel.class ); - private static final long serialVersionUID = 1L; + + private final static Logger mLog = + LoggerFactory.getLogger( R820TTunerConfigurationEditorOld.class ); + private static final R820TGain DEFAULT_GAIN = R820TGain.GAIN_279; private SettingsManager mSettingsManager; @@ -86,7 +87,7 @@ public class R820TTunerConfigurationPanel extends JPanel private JComboBox mComboSampleRate; - public R820TTunerConfigurationPanel( SettingsManager settingsManager, + public R820TTunerConfigurationEditorOld( SettingsManager settingsManager, R820TTunerController controller ) { mSettingsManager = settingsManager; @@ -110,27 +111,27 @@ public class R820TTunerConfigurationPanel extends JPanel mComboConfigurations.setModel( getModel() ); /* Determine which tuner configuration should be selected/displayed */ - TunerConfigurationAssignment savedConfig = mSettingsManager - .getSelectedTunerConfiguration( - TunerType.RAFAELMICRO_R820T, mController.getUniqueID() ); - - if( savedConfig != null ) - { - mSelectedConfig = getNamedConfiguration( - savedConfig.getTunerConfigurationName() ); - } +// TunerConfigurationAssignment savedConfig = mSettingsManager +// .getSelectedTunerConfiguration( +// TunerType.RAFAELMICRO_R820T, mController.getUniqueID() ); +// +// if( savedConfig != null ) +// { +// mSelectedConfig = getNamedConfiguration( +// savedConfig.getTunerConfigurationName() ); +// } /* If we couldn't determine the saved/selected config, use the first one */ - if( mSelectedConfig == null ) - { - mSelectedConfig = mComboConfigurations.getItemAt( 0 ); - - //Store this config as the default for this tuner at this address - mSettingsManager - .setSelectedTunerConfiguration( - TunerType.RAFAELMICRO_R820T, - mController.getUniqueID(), mSelectedConfig ); - } +// if( mSelectedConfig == null ) +// { +// mSelectedConfig = mComboConfigurations.getItemAt( 0 ); +// +// //Store this config as the default for this tuner at this address +// mSettingsManager +// .setSelectedTunerConfiguration( +// TunerType.RAFAELMICRO_R820T, +// mController.getUniqueID(), mSelectedConfig ); +// } mComboConfigurations.setSelectedItem( mSelectedConfig ); @@ -217,7 +218,7 @@ public class R820TTunerConfigurationPanel extends JPanel catch ( SourceException e1 ) { JOptionPane.showMessageDialog( - R820TTunerConfigurationPanel.this, + R820TTunerConfigurationEditorOld.this, "R820T Tuner Controller - couldn't apply " + "frequency correction value: " + value + e1.getLocalizedMessage() ); @@ -256,7 +257,7 @@ public class R820TTunerConfigurationPanel extends JPanel catch ( SourceException | LibUsbException eSampleRate ) { JOptionPane.showMessageDialog( - R820TTunerConfigurationPanel.this, + R820TTunerConfigurationEditorOld.this, "R820T Tuner Controller - couldn't apply the sample " + "rate setting [" + sampleRate.getLabel() + "] " + eSampleRate.getLocalizedMessage() ); @@ -380,7 +381,7 @@ public class R820TTunerConfigurationPanel extends JPanel catch ( UsbException e ) { JOptionPane.showMessageDialog( - R820TTunerConfigurationPanel.this, + R820TTunerConfigurationEditorOld.this, "R820T Tuner Controller - couldn't apply the gain " + "setting - " + e.getLocalizedMessage() ); @@ -431,7 +432,7 @@ public class R820TTunerConfigurationPanel extends JPanel catch ( UsbException e ) { JOptionPane.showMessageDialog( - R820TTunerConfigurationPanel.this, + R820TTunerConfigurationEditorOld.this, "R820T Tuner Controller - couldn't apply the mixer " + "gain setting - " + e.getLocalizedMessage() ); @@ -477,7 +478,7 @@ public class R820TTunerConfigurationPanel extends JPanel catch ( UsbException e ) { JOptionPane.showMessageDialog( - R820TTunerConfigurationPanel.this, + R820TTunerConfigurationEditorOld.this, "R820T Tuner Controller - couldn't apply the LNA " + "gain setting - " + e.getLocalizedMessage() ); @@ -521,7 +522,7 @@ public class R820TTunerConfigurationPanel extends JPanel catch ( UsbException e ) { JOptionPane.showMessageDialog( - R820TTunerConfigurationPanel.this, + R820TTunerConfigurationEditorOld.this, "R820T Tuner Controller - couldn't apply the VGA " + "gain setting - " + e.getLocalizedMessage() ); @@ -548,17 +549,17 @@ public class R820TTunerConfigurationPanel extends JPanel @Override public void actionPerformed( ActionEvent e ) { - TunerConfiguration config = - mSettingsManager - .addNewTunerConfiguration( - TunerType.RAFAELMICRO_R820T, - "New Configuration" ); - - mComboConfigurations.setModel( getModel() ); - - mComboConfigurations.setSelectedItem( config ); - - repaint(); +// TunerConfiguration config = +// mSettingsManager +// .addNewTunerConfiguration( +// TunerType.RAFAELMICRO_R820T, +// "New Configuration" ); +// +// mComboConfigurations.setModel( getModel() ); +// +// mComboConfigurations.setSelectedItem( config ); +// +// repaint(); } } ); @@ -581,7 +582,7 @@ public class R820TTunerConfigurationPanel extends JPanel if( selected != null ) { int n = JOptionPane.showConfirmDialog( - R820TTunerConfigurationPanel.this, + R820TTunerConfigurationEditorOld.this, "Are you sure you want to delete '" + selected.getName() + "'?", "Are you sure?", @@ -589,8 +590,8 @@ public class R820TTunerConfigurationPanel extends JPanel if( n == JOptionPane.YES_OPTION ) { - mSettingsManager - .deleteTunerConfiguration( selected ); +// mSettingsManager +// .deleteTunerConfiguration( selected ); mComboConfigurations.setModel( getModel() ); @@ -630,13 +631,13 @@ public class R820TTunerConfigurationPanel extends JPanel mComboSampleRate.setSelectedItem( mSelectedConfig.getSampleRate() ); - mSettingsManager.setSelectedTunerConfiguration( - TunerType.RAFAELMICRO_R820T, mController.getUniqueID(), config ); +// mSettingsManager.setSelectedTunerConfiguration( +// TunerType.RAFAELMICRO_R820T, mController.getUniqueID(), config ); } catch ( SourceException e1 ) { JOptionPane.showMessageDialog( - R820TTunerConfigurationPanel.this, + R820TTunerConfigurationEditorOld.this, "R820T Tuner Controller - couldn't " + "apply the tuner configuration settings - " + e1.getLocalizedMessage() ); @@ -653,17 +654,17 @@ public class R820TTunerConfigurationPanel extends JPanel */ private ComboBoxModel getModel() { - ArrayList configs = - mSettingsManager - .getTunerConfigurations( TunerType.RAFAELMICRO_R820T ); +// ArrayList configs = +// mSettingsManager +// .getTunerConfigurations( TunerType.RAFAELMICRO_R820T ); DefaultComboBoxModel model = new DefaultComboBoxModel(); - for( TunerConfiguration config: configs ) - { - model.addElement( (R820TTunerConfiguration)config ); - } +// for( TunerConfiguration config: configs ) +// { +// model.addElement( (R820TTunerConfiguration)config ); +// } return model; } @@ -673,17 +674,17 @@ public class R820TTunerConfigurationPanel extends JPanel */ private R820TTunerConfiguration getNamedConfiguration( String name ) { - ArrayList configs = - mSettingsManager - .getTunerConfigurations( TunerType.RAFAELMICRO_R820T ); - - for( TunerConfiguration config: configs ) - { - if( config.getName().contentEquals( name ) ) - { - return (R820TTunerConfiguration)config; - } - } +// ArrayList configs = +// mSettingsManager +// .getTunerConfigurations( TunerType.RAFAELMICRO_R820T ); +// +// for( TunerConfiguration config: configs ) +// { +// if( config.getName().contentEquals( name ) ) +// { +// return (R820TTunerConfiguration)config; +// } +// } return null; } diff --git a/src/source/tuner/rtl/r820t/R820TTunerController.java b/src/source/tuner/rtl/r820t/R820TTunerController.java index 109458e2..766c1091 100644 --- a/src/source/tuner/rtl/r820t/R820TTunerController.java +++ b/src/source/tuner/rtl/r820t/R820TTunerController.java @@ -1,6 +1,6 @@ /******************************************************************************* * SDR Trunk - * Copyright (C) 2014 Dennis Sheirer + * Copyright (C) 2014-2016 Dennis Sheirer * * Java port of librtlsdr * @@ -33,10 +33,9 @@ import org.usb4java.Device; import org.usb4java.DeviceDescriptor; import org.usb4java.LibUsbException; -import settings.SettingsManager; import source.SourceException; -import source.tuner.TunerConfiguration; import source.tuner.TunerType; +import source.tuner.configuration.TunerConfiguration; import source.tuner.rtl.RTL2832TunerController; import controller.ThreadPoolManager; @@ -136,19 +135,6 @@ public class R820TTunerController extends RTL2832TunerController } } - /** - * Controller gui editor component for this tuner - */ - public JPanel getEditor( SettingsManager settingsManager ) - { - if( mEditor == null ) - { - mEditor = new R820TTunerEditorPanel( this, settingsManager ); - } - - return mEditor; - } - /** * Not implemented. */ diff --git a/src/source/tuner/rtl/r820t/R820TTunerEditor.java b/src/source/tuner/rtl/r820t/R820TTunerEditor.java new file mode 100644 index 00000000..0d106f8a --- /dev/null +++ b/src/source/tuner/rtl/r820t/R820TTunerEditor.java @@ -0,0 +1,446 @@ +/******************************************************************************* + * SDR Trunk + * Copyright (C) 2014-2016 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.tuner.rtl.r820t; + +import java.awt.EventQueue; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.text.DecimalFormat; + +import javax.swing.BorderFactory; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JSpinner; +import javax.swing.JTextField; +import javax.swing.SpinnerModel; +import javax.swing.SpinnerNumberModel; +import javax.swing.SwingConstants; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.usb.UsbException; + +import net.miginfocom.swing.MigLayout; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.usb4java.LibUsbException; + +import source.SourceException; +import source.tuner.configuration.TunerConfiguration; +import source.tuner.configuration.TunerConfigurationEditor; +import source.tuner.configuration.TunerConfigurationEvent; +import source.tuner.configuration.TunerConfigurationEvent.Event; +import source.tuner.configuration.TunerConfigurationModel; +import source.tuner.rtl.RTL2832Tuner; +import source.tuner.rtl.RTL2832TunerController.SampleRate; +import source.tuner.rtl.r820t.R820TTunerController.R820TGain; +import source.tuner.rtl.r820t.R820TTunerController.R820TLNAGain; +import source.tuner.rtl.r820t.R820TTunerController.R820TMixerGain; +import source.tuner.rtl.r820t.R820TTunerController.R820TVGAGain; + +public class R820TTunerEditor extends TunerConfigurationEditor +{ + private final static Logger mLog = + LoggerFactory.getLogger( R820TTunerEditor.class ); + + private static final long serialVersionUID = 1L; + private static final R820TGain DEFAULT_GAIN = R820TGain.GAIN_279; + + private R820TTunerController mController; + + private JTextField mConfigurationName; + private JSpinner mFrequencyCorrection; + private JComboBox mComboMasterGain; + private JComboBox mComboMixerGain; + private JComboBox mComboLNAGain; + private JComboBox mComboVGAGain; + private JComboBox mComboSampleRate; + + public R820TTunerEditor( TunerConfigurationModel tunerConfigurationModel, + RTL2832Tuner tuner ) + { + super( tunerConfigurationModel ); + mController = (R820TTunerController)tuner.getController(); + + init(); + } + + @Override + public void save() + { + if( hasItem() ) + { + R820TTunerConfiguration config = getConfiguration(); + + config.setName( mConfigurationName.getText() ); + + double value = ((SpinnerNumberModel)mFrequencyCorrection + .getModel()).getNumber().doubleValue(); + config.setFrequencyCorrection( value ); + + config.setSampleRate( (SampleRate)mComboSampleRate.getSelectedItem() ); + + R820TGain gain = (R820TGain)mComboMasterGain.getSelectedItem(); + config.setMasterGain( gain ); + + R820TMixerGain mixerGain = (R820TMixerGain)mComboMixerGain.getSelectedItem(); + config.setMixerGain( mixerGain ); + + R820TLNAGain lnaGain = (R820TLNAGain)mComboLNAGain.getSelectedItem(); + config.setLNAGain( lnaGain ); + + R820TVGAGain vgaGain = (R820TVGAGain)mComboVGAGain.getSelectedItem(); + config.setVGAGain( vgaGain ); + + getTunerConfigurationModel().broadcast( + new TunerConfigurationEvent( getConfiguration(), Event.CONFIGURATION_CHANGE ) ); + } + } + + @Override + public void setItem( TunerConfiguration item ) + { + super.setItem( item ); + + if( hasItem() ) + { + R820TTunerConfiguration config = getConfiguration(); + + mConfigurationName.setText( config.getName() ); + mFrequencyCorrection.setValue( config.getFrequencyCorrection() ); + mComboSampleRate.setSelectedItem( config.getSampleRate() ); + mComboMasterGain.setSelectedItem( config.getMasterGain() ); + mComboMixerGain.setSelectedItem( config.getMixerGain() ); + mComboLNAGain.setSelectedItem( config.getLNAGain() ); + mComboVGAGain.setSelectedItem( config.getVGAGain() ); + } + } + + private R820TTunerConfiguration getConfiguration() + { + if( hasItem() ) + { + return (R820TTunerConfiguration)getItem(); + } + + return null; + } + + private void init() + { + setLayout( new MigLayout( "fill,wrap 2", "[right][grow]", "[][][grow]" ) ); + + add( new JLabel( "R820T Tuner" ), "span, align center" ); + + /** + * Tuner Configuration Name + */ + mConfigurationName = new JTextField(); + mConfigurationName.addFocusListener( new FocusListener() + { + @Override + public void focusLost( FocusEvent e ) + { + save(); + } + @Override + public void focusGained( FocusEvent e ) {} + } ); + + add( new JLabel( "Configuration:" ) ); + add( mConfigurationName, "growx,push" ); + + /** + * Frequency Correction + */ + SpinnerModel model = + new SpinnerNumberModel( 0.0, //initial value + -1000.0, //min + 1000.0, //max + 0.1 ); //step + + mFrequencyCorrection = new JSpinner( model ); + + JSpinner.NumberEditor editor = + (JSpinner.NumberEditor)mFrequencyCorrection.getEditor(); + + DecimalFormat format = editor.getFormat(); + format.setMinimumFractionDigits( 1 ); + editor.getTextField().setHorizontalAlignment( SwingConstants.CENTER ); + + mFrequencyCorrection.addChangeListener( new ChangeListener() + { + @Override + public void stateChanged( ChangeEvent e ) + { + final double value = ((SpinnerNumberModel)mFrequencyCorrection + .getModel()).getNumber().doubleValue(); + + try + { + mController.setFrequencyCorrection( value ); + } + catch ( SourceException e1 ) + { + mLog.error( "Error setting frequency correction value", e1 ); + } + + save(); + } + } ); + + add( new JLabel( "Correction PPM:" ) ); + add( mFrequencyCorrection, "growx,push" ); + + /** + * Sample Rate + */ + mComboSampleRate = new JComboBox<>( SampleRate.values() ); + mComboSampleRate.addActionListener( new ActionListener() + { + @Override + public void actionPerformed( ActionEvent e ) + { + SampleRate sampleRate = + (SampleRate)mComboSampleRate.getSelectedItem(); + try + { + + mController.setSampleRate( sampleRate ); + save(); + } + catch ( SourceException | LibUsbException eSampleRate ) + { + JOptionPane.showMessageDialog( + R820TTunerEditor.this, + "R820T Tuner Controller - couldn't apply the sample " + + "rate setting [" + sampleRate.getLabel() + "] " + + eSampleRate.getLocalizedMessage() ); + + mLog.error( "R820T Tuner Controller - couldn't apply sample " + + "rate setting [" + sampleRate.getLabel() + "]", + eSampleRate ); + } + } + } ); + add( new JLabel( "Sample Rate:" ) ); + add( mComboSampleRate, "growx,push" ); + + /** + * Gain Controls + */ + JPanel gainPanel = new JPanel(); + gainPanel.setLayout( new MigLayout( "", "[grow,fill]", "[grow,fill]" ) ); + gainPanel.setBorder( BorderFactory.createTitledBorder( "Gain" ) ); + + /* Master Gain Control */ + mComboMasterGain = new JComboBox( R820TGain.values() ); + + mComboMasterGain.addActionListener( new ActionListener() + { + @Override + public void actionPerformed( ActionEvent arg0 ) + { + try + { + R820TGain gain = (R820TGain)mComboMasterGain.getSelectedItem(); + + mController.setGain( (R820TGain)mComboMasterGain.getSelectedItem(), true ); + + if( gain == R820TGain.MANUAL ) + { + mComboMixerGain.setSelectedItem( gain.getMixerGain() ); + mComboMixerGain.setEnabled( true ); + + mComboLNAGain.setSelectedItem( gain.getLNAGain() ); + mComboLNAGain.setEnabled( true ); + + mComboVGAGain.setSelectedItem( gain.getVGAGain() ); + mComboVGAGain.setEnabled( true ); + } + else + { + mComboMixerGain.setEnabled( false ); + mComboMixerGain.setSelectedItem( gain.getMixerGain() ); + + mComboLNAGain.setEnabled( false ); + mComboLNAGain.setSelectedItem( gain.getLNAGain() ); + + mComboVGAGain.setEnabled( false ); + mComboVGAGain.setSelectedItem( gain.getVGAGain() ); + } + + save(); + } + catch ( UsbException e ) + { + JOptionPane.showMessageDialog( + R820TTunerEditor.this, + "R820T Tuner Controller - couldn't apply the gain " + + "setting - " + e.getLocalizedMessage() ); + + mLog.error( "R820T Tuner Controller - couldn't apply " + + "gain setting - ", e ); + } + } + } ); + mComboMasterGain.setToolTipText( "Select AUTOMATIC for auto " + + "gain, MANUAL to enable
independent control of " + + "Mixer, LNA and Enhance gain
" + + "settings, or one of the individual gain settings for
" + + "semi-manual gain control" ); + gainPanel.add( new JLabel( "Master" ) ); + gainPanel.add( mComboMasterGain ); + + /* Mixer Gain Control */ + mComboMixerGain = new JComboBox( R820TMixerGain.values() ); + mComboMixerGain.addActionListener( new ActionListener() + { + @Override + public void actionPerformed( ActionEvent arg0 ) + { + EventQueue.invokeLater( new Runnable() + { + @Override + public void run() + { + try + { + R820TMixerGain mixerGain = + (R820TMixerGain)mComboMixerGain.getSelectedItem(); + + if( mixerGain == null ) + { + mixerGain = DEFAULT_GAIN.getMixerGain(); + } + + if( mComboMixerGain.isEnabled() ) + { + mController.setMixerGain( mixerGain, true ); + } + + save(); + } + catch ( UsbException e ) + { + JOptionPane.showMessageDialog( R820TTunerEditor.this, + "R820T Tuner Controller - couldn't apply the mixer " + + "gain setting - " + e.getLocalizedMessage() ); + + mLog.error( "R820T Tuner Controller - couldn't apply mixer " + + "gain setting - ", e ); + } + } + } ); + } + } ); + mComboMixerGain.setToolTipText( "Mixer Gain. Set master gain " + + "to MASTER to enable adjustment" ); + mComboMixerGain.setEnabled( false ); + gainPanel.add( new JLabel( "Mixer" ) ); + gainPanel.add( mComboMixerGain, "wrap" ); + + /* LNA Gain Control */ + mComboLNAGain = new JComboBox( R820TLNAGain.values() ); + mComboLNAGain.addActionListener( new ActionListener() + { + @Override + public void actionPerformed( ActionEvent arg0 ) + { + try + { + R820TLNAGain lnaGain = + (R820TLNAGain)mComboLNAGain.getSelectedItem(); + + if ( lnaGain == null ) + { + lnaGain = DEFAULT_GAIN.getLNAGain(); + } + + if( mComboLNAGain.isEnabled() ) + { + mController.setLNAGain( lnaGain, true ); + } + + save(); + } + catch ( UsbException e ) + { + JOptionPane.showMessageDialog( R820TTunerEditor.this, + "R820T Tuner Controller - couldn't apply the LNA " + + "gain setting - " + e.getLocalizedMessage() ); + + mLog.error( "R820T Tuner Controller - couldn't apply LNA " + + "gain setting - ", e ); + } + } + } ); + mComboLNAGain.setToolTipText( "LNA Gain. Set master gain " + + "to MANUAL to enable adjustment" ); + mComboLNAGain.setEnabled( false ); + gainPanel.add( new JLabel( "LNA" ) ); + gainPanel.add( mComboLNAGain ); + + /* VGA Gain Control */ + mComboVGAGain = new JComboBox( R820TVGAGain.values() ); + mComboVGAGain.addActionListener( new ActionListener() + { + @Override + public void actionPerformed( ActionEvent arg0 ) + { + try + { + R820TVGAGain vgaGain = + (R820TVGAGain)mComboVGAGain.getSelectedItem(); + + if( vgaGain == null ) + { + vgaGain = DEFAULT_GAIN.getVGAGain(); + } + + if( mComboVGAGain.isEnabled() ) + { + mController.setVGAGain( vgaGain, true ); + } + + save(); + } + catch ( UsbException e ) + { + JOptionPane.showMessageDialog( R820TTunerEditor.this, + "R820T Tuner Controller - couldn't apply the VGA " + + "gain setting - " + e.getLocalizedMessage() ); + + mLog.error( "R820T Tuner Controller - couldn't apply VGA " + + "gain setting", e ); + } + } + } ); + mComboVGAGain.setToolTipText( "VGA Gain. Set master gain " + + "to MANUAL to enable adjustment" ); + mComboVGAGain.setEnabled( false ); + gainPanel.add( new JLabel( "VGA" ) ); + gainPanel.add( mComboVGAGain, "wrap" ); + + add( gainPanel, "span" ); + } +} diff --git a/src/source/tuner/rtl/r820t/R820TTunerEditorPanel.java b/src/source/tuner/rtl/r820t/R820TTunerEditorPanel.java deleted file mode 100644 index c761a07a..00000000 --- a/src/source/tuner/rtl/r820t/R820TTunerEditorPanel.java +++ /dev/null @@ -1,121 +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.tuner.rtl.r820t; - -import gui.control.JFrequencyControl; - -import java.awt.Color; -import java.awt.EventQueue; - -import javax.swing.JLabel; -import javax.swing.JPanel; - -import net.miginfocom.swing.MigLayout; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import settings.SettingsManager; -import source.SourceException; -import source.tuner.frequency.FrequencyChangeEvent; -import source.tuner.frequency.FrequencyChangeEvent.Event; -import source.tuner.frequency.IFrequencyChangeProcessor; -import source.tuner.rtl.RTL2832InfoPanel; - -import com.jidesoft.swing.JideTabbedPane; - -public class R820TTunerEditorPanel extends JPanel implements IFrequencyChangeProcessor -{ - private final static Logger mLog = - LoggerFactory.getLogger( R820TTunerEditorPanel.class ); - - private static final long serialVersionUID = 1L; - - private R820TTunerController mController; - private SettingsManager mSettingsManager; - - private JFrequencyControl mFrequencyControl; - - public R820TTunerEditorPanel( R820TTunerController controller, - SettingsManager settingsManager ) - { - mController = controller; - mSettingsManager = settingsManager; - - initGUI(); - } - - private void initGUI() - { - setLayout( new MigLayout( "fill,wrap 2", "[right][grow]", "[][][grow]" ) ); - - add( new JLabel( "RTL2832 with R820T Tuner" ), "span 2, align center, wrap" ); - - mFrequencyControl = new JFrequencyControl(); - - mFrequencyControl.addListener( this ); - - /* Add frequency control as frequency change listener. */ - mController.addListener( mFrequencyControl ); - - mFrequencyControl.setFrequency( mController.getFrequency(), false ); - - add( mFrequencyControl, "span 2, align center, wrap" ); - - JideTabbedPane tabs = new JideTabbedPane(); - tabs.setFont( this.getFont() ); - tabs.setForeground( Color.BLACK ); - - tabs.addTab( "Configuration", - new R820TTunerConfigurationPanel( mSettingsManager, mController ) ); - - tabs.addTab( "Info", new RTL2832InfoPanel( mController ) ); - - add( tabs, "grow,push,span" ); - } - - /** - * Frequency change listener for the frequency control gui component to - * apply end-user requested frequency changes against the tuner - */ - @Override - public void frequencyChanged( FrequencyChangeEvent event ) - { - if( event.getEvent() == Event.NOTIFICATION_FREQUENCY_CHANGE ) - { - final long frequency = event.getValue().longValue(); - - EventQueue.invokeLater( new Runnable() - { - @Override - public void run() - { - try - { - mController.setFrequency( frequency ); - } - catch ( SourceException e ) - { - mLog.error( "R820T Tuner Controller - error setting frequency [" + - frequency + "]", e ); - } - } - } ); - } - } -} diff --git a/src/spectrum/SpectralDisplayPanel.java b/src/spectrum/SpectralDisplayPanel.java index 0ef337c0..c3b27325 100644 --- a/src/spectrum/SpectralDisplayPanel.java +++ b/src/spectrum/SpectralDisplayPanel.java @@ -62,7 +62,7 @@ import settings.ColorSettingMenuItem; import settings.SettingsManager; import source.SourceException; import source.tuner.Tuner; -import source.tuner.TunerSelectionListener; +import source.tuner.TunerEvent; import source.tuner.frequency.FrequencyChangeEvent; import source.tuner.frequency.FrequencyChangeEvent.Event; import source.tuner.frequency.IFrequencyChangeProcessor; @@ -78,7 +78,6 @@ import spectrum.menu.SmoothingTypeItem; import com.jidesoft.swing.JideSplitPane; -import controller.ConfigurationControllerModel; import controller.channel.Channel; import controller.channel.ChannelModel; import controller.channel.ChannelProcessingManager; @@ -89,8 +88,7 @@ import dsp.filter.smoothing.SmoothingFilter.SmoothingType; public class SpectralDisplayPanel extends JPanel implements Listener, IFrequencyChangeProcessor, - IDFTWidthChangeProcessor, - TunerSelectionListener + IDFTWidthChangeProcessor { private static final long serialVersionUID = 1L; @@ -114,7 +112,6 @@ public class SpectralDisplayPanel extends JPanel private OverlayPanel mOverlayPanel; private DFTProcessor mDFTProcessor; private DFTResultsConverter mDFTConverter; - private ConfigurationControllerModel mControllerModel; private ChannelModel mChannelModel; private ChannelProcessingManager mChannelProcessingManager; private SettingsManager mSettingsManager; @@ -132,12 +129,10 @@ public class SpectralDisplayPanel extends JPanel * the DFT is translated to decibels for display in the spectrum and * waterfall components. */ - public SpectralDisplayPanel( ConfigurationControllerModel controllerModel, - ChannelModel channelModel, + public SpectralDisplayPanel( ChannelModel channelModel, ChannelProcessingManager channelProcessingManager, SettingsManager settingsManager ) { - mControllerModel = controllerModel; mChannelModel = channelModel; mChannelProcessingManager = channelProcessingManager; mSettingsManager = settingsManager; @@ -146,12 +141,6 @@ public class SpectralDisplayPanel extends JPanel mOverlayPanel = new OverlayPanel( mSettingsManager, mChannelModel ); mWaterfallPanel = new WaterfallPanel( mSettingsManager ); - //Register to receive tuner selection events - if( mControllerModel != null ) - { - mControllerModel.addListener( (TunerSelectionListener)this ); - } - init(); loadSettings(); @@ -190,12 +179,6 @@ public class SpectralDisplayPanel extends JPanel /* De-register from receiving samples when the window closes */ clearTuner(); - if( mControllerModel != null ) - { - mControllerModel.removeListener( (TunerSelectionListener)this ); - } - - mControllerModel = null; mSettingsManager = null; mDFTProcessor.dispose(); @@ -217,6 +200,11 @@ public class SpectralDisplayPanel extends JPanel mTuner = null; } + public Listener getTunerEventListener() + { + return new TunerSelectionListener( this ); + } + /** * Queues an FFT size change request. The scheduled executor will apply * the change when it runs. @@ -442,11 +430,10 @@ public class SpectralDisplayPanel extends JPanel } /** - * Responds to tuner selection event by deregistering from the current + * Responds to tuner event by deregistering from the current * complex sample buffer source and registering with the tuner argument. */ - @Override - public void tunerSelected( Tuner tuner ) + public void showTuner( Tuner tuner ) { clearTuner(); @@ -975,4 +962,26 @@ public class SpectralDisplayPanel extends JPanel } ); } } + + /** + * Provides tuner event listener interface for showing tuners in this display + */ + public class TunerSelectionListener implements Listener + { + private SpectralDisplayPanel mSpectralDisplayPanel; + + public TunerSelectionListener( SpectralDisplayPanel spectralDisplayPanel ) + { + mSpectralDisplayPanel = spectralDisplayPanel; + } + + @Override + public void receive( TunerEvent event ) + { + if( event.getEvent() == TunerEvent.Event.REQUEST_MAIN_SPECTRAL_DISPLAY ) + { + mSpectralDisplayPanel.showTuner( event.getTuner() ); + } + } + } } diff --git a/src/spectrum/SpectrumFrame.java b/src/spectrum/SpectrumFrame.java index a094be24..a3e1e5d1 100644 --- a/src/spectrum/SpectrumFrame.java +++ b/src/spectrum/SpectrumFrame.java @@ -26,7 +26,6 @@ import javax.swing.JFrame; import net.miginfocom.swing.MigLayout; import settings.SettingsManager; import source.tuner.Tuner; -import controller.ConfigurationControllerModel; import controller.channel.ChannelModel; import controller.channel.ChannelProcessingManager; @@ -36,8 +35,7 @@ public class SpectrumFrame extends JFrame implements WindowListener private SpectralDisplayPanel mSpectralDisplayPanel; - public SpectrumFrame( ConfigurationControllerModel controllerModel, - ChannelModel channelModel, + public SpectrumFrame( ChannelModel channelModel, ChannelProcessingManager channelProcessingManager, SettingsManager settingsManager, Tuner tuner ) @@ -48,10 +46,10 @@ public class SpectrumFrame extends JFrame implements WindowListener setLayout( new MigLayout( "insets 0 0 0 0", "[grow]", "[grow]") ); - mSpectralDisplayPanel = new SpectralDisplayPanel( controllerModel, - channelModel, channelProcessingManager, settingsManager ); - - mSpectralDisplayPanel.tunerSelected( tuner ); + mSpectralDisplayPanel = new SpectralDisplayPanel( channelModel, + channelProcessingManager, settingsManager ); + + mSpectralDisplayPanel.showTuner( tuner ); add( mSpectralDisplayPanel, "grow" ); /* Register a shutdown listener */