From a4d69ce0aa024a75b4e8072322b42054aa1f8880 Mon Sep 17 00:00:00 2001 From: denny Date: Fri, 18 Mar 2016 10:59:36 -0400 Subject: [PATCH] wip #34 - final edits to R820T tuner configuration editor and introduced frequency correction to the airspy tuner configuration. --- src/gui/SDRTrunk.java | 4 +- src/gui/editor/EmptyEditor.java | 9 +- src/settings/Settings.java | 91 +---------- src/settings/SettingsManager.java | 77 ++++++--- src/source/recording/Recording.java | 6 +- src/source/tuner/TunerEditor.java | 96 +++++++++-- .../airspy/AirspyTunerConfiguration.java | 13 ++ .../airspy/AirspyTunerConfigurationPanel.java | 18 +-- .../TunerConfigurationAssignment.java | 66 -------- .../TunerConfigurationFactory.java | 3 +- .../TunerConfigurationModel.java | 45 +++++- .../proV1/FCD1TunerConfigurationPanel.java | 2 +- .../FCD2TunerConfigurationPanel.java | 6 +- .../hackrf/HackRFTunerConfigurationPanel.java | 20 +-- .../rtl/e4k/E4KTunerConfigurationPanel.java | 6 +- .../R820TTunerConfigurationEditorOld.java | 6 +- .../tuner/rtl/r820t/R820TTunerEditor.java | 151 ++++++++++++------ 17 files changed, 333 insertions(+), 286 deletions(-) delete mode 100644 src/source/tuner/configuration/TunerConfigurationAssignment.java diff --git a/src/gui/SDRTrunk.java b/src/gui/SDRTrunk.java index a1eb8c68..83f9f7ee 100644 --- a/src/gui/SDRTrunk.java +++ b/src/gui/SDRTrunk.java @@ -119,10 +119,10 @@ public class SDRTrunk implements Listener TunerConfigurationModel tunerConfigurationModel = new TunerConfigurationModel(); TunerModel tunerModel = new TunerModel( tunerConfigurationModel ); - mSettingsManager = new SettingsManager( tunerConfigurationModel ); - ThreadPoolManager threadPoolManager = new ThreadPoolManager(); + mSettingsManager = new SettingsManager( threadPoolManager, tunerConfigurationModel ); + AliasModel aliasModel = new AliasModel(); ChannelModel channelModel = new ChannelModel(); diff --git a/src/gui/editor/EmptyEditor.java b/src/gui/editor/EmptyEditor.java index 128407fc..7b16ee35 100644 --- a/src/gui/editor/EmptyEditor.java +++ b/src/gui/editor/EmptyEditor.java @@ -8,10 +8,15 @@ public class EmptyEditor extends Editor { private static final long serialVersionUID = 1L; - public EmptyEditor() + public EmptyEditor( String descriptor ) { setLayout( new MigLayout( "insets 0 0 0 0", "[center]", "[grow]" ) ); - add( new JLabel( "Please select an item" ), "wrap" ); + add( new JLabel( "Please select " + descriptor ), "wrap" ); + } + + public EmptyEditor() + { + this( "an item" ); } @Override diff --git a/src/settings/Settings.java b/src/settings/Settings.java index 1166592a..a7f2d261 100644 --- a/src/settings/Settings.java +++ b/src/settings/Settings.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 @@ -28,10 +28,8 @@ import map.DefaultIcon; import map.MapIcon; import settings.ColorSetting.ColorSettingName; import source.recording.RecordingConfiguration; -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; @@ -54,8 +52,7 @@ import source.tuner.rtl.r820t.R820TTunerConfiguration; R820TTunerConfiguration.class, RecordingConfiguration.class, Setting.class, - TunerConfiguration.class, - TunerConfigurationAssignment.class} ) + TunerConfiguration.class } ) @XmlRootElement( name = "SDRTrunk_settings" ) public class Settings @@ -65,9 +62,6 @@ public class Settings private List mTunerConfiguration = new ArrayList(); - private List mConfigurationAssignments = - new ArrayList(); - private List mRecordingConfigurations = new ArrayList(); @@ -89,7 +83,6 @@ public class Settings public void addRecordingConfiguration( RecordingConfiguration config ) { mRecordingConfigurations.add( config ); - } public void removeRecordingConfiguration( RecordingConfiguration config ) @@ -107,33 +100,6 @@ public class Settings { mTunerConfiguration = configs; } - - public void addTunerConfiguration( TunerConfiguration config ) - { - mTunerConfiguration.add( config ); - - } - - public void removeTunerConfiguration( TunerConfiguration config ) - { - mTunerConfiguration.remove( config ); - } - - public ArrayList getTunerConfigurations( TunerType type ) - { - ArrayList configs = - new ArrayList(); - - for( TunerConfiguration config: mTunerConfiguration ) - { - if( config.getTunerType() == type ) - { - configs.add( config ); - } - } - - return configs; - } @XmlElement( name="setting" ) public List getSettings() @@ -254,59 +220,6 @@ public class Settings return icons; } - @XmlElement( name="tuner_configuration_assignment" ) - public List getSelectedTunerConfiguration() - { - return mConfigurationAssignments; - } - - public void setSelectedTunerConfiguration( List configs ) - { - mConfigurationAssignments = configs; - } - - public void addSelectedTunerConfiguration( TunerConfigurationAssignment config ) - { - mConfigurationAssignments.add( config ); - - } - - public void removeSelectedTunerConfiguration( TunerConfigurationAssignment config ) - { - mConfigurationAssignments.remove( config ); - } - - public TunerConfigurationAssignment getConfigurationAssignment( TunerType type, String uniqueID ) - { - for( TunerConfigurationAssignment config: mConfigurationAssignments ) - { - if( config.getTunerType() == type && - uniqueID.contentEquals( config.getUniqueID() ) ) - { - return config; - } - } - - return null; - } - - public void setConfigurationAssignment( TunerType type, - String uniqueID, - String tunerConfigurationName ) - { - TunerConfigurationAssignment config = getConfigurationAssignment( type, uniqueID ); - - if( config == null ) - { - config = new TunerConfigurationAssignment(); - config.setTunerType( type ); - config.setUniqueID( uniqueID ); - addSelectedTunerConfiguration( config ); - } - - config.setTunerConfigurationName( tunerConfigurationName ); - } - public MapViewSetting getMapViewSetting( String name ) { for( Setting setting: mSettings ) diff --git a/src/settings/SettingsManager.java b/src/settings/SettingsManager.java index 4952ea9a..cc5432b5 100644 --- a/src/settings/SettingsManager.java +++ b/src/settings/SettingsManager.java @@ -31,6 +31,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.ImageIcon; import javax.xml.bind.JAXBContext; @@ -45,6 +47,8 @@ import org.jdesktop.swingx.mapviewer.GeoPosition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import controller.ThreadPoolManager; +import playlist.PlaylistManager.PlaylistSaveTask; import properties.SystemProperties; import sample.Listener; import settings.ColorSetting.ColorSettingName; @@ -72,14 +76,19 @@ public class SettingsManager implements Listener new HashMap(); private TunerConfigurationModel mTunerConfigurationModel; - private boolean mLoading = false; + private ThreadPoolManager mThreadPoolManager; + + private boolean mLoadingSettings = false; + private AtomicBoolean mSettingsSavePending = new AtomicBoolean(); - public SettingsManager( TunerConfigurationModel tunerConfigurationModel ) + public SettingsManager( ThreadPoolManager threadPoolManager, + 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. - + + mThreadPoolManager = threadPoolManager; mTunerConfigurationModel = tunerConfigurationModel; //Register for tuner config events so that we can save the settings @@ -112,9 +121,9 @@ public class SettingsManager implements Listener @Override public void receive( TunerConfigurationEvent t ) { - if( !mLoading ) + if( !mLoadingSettings ) { - save(); + scheduleSettingsSave(); } } @@ -196,7 +205,7 @@ public class SettingsManager implements Listener broadcastSettingChange( setting ); - save(); + scheduleSettingsSave(); } public void resetColorSetting( ColorSettingName name ) @@ -242,7 +251,7 @@ public class SettingsManager implements Listener broadcastSettingChange( setting ); - save(); + scheduleSettingsSave(); } public MapIcon[] getMapIcons() @@ -339,7 +348,7 @@ public class SettingsManager implements Listener broadcastSettingDeleted( existing ); - save(); + scheduleSettingsSave(); } } @@ -362,7 +371,7 @@ public class SettingsManager implements Listener existing.setName( icon.getName() ); existing.setPath( icon.getPath() ); broadcastSettingChange( existing ); - save(); + scheduleSettingsSave(); } } @@ -379,7 +388,7 @@ public class SettingsManager implements Listener existing.setName( newName ); existing.setPath( newPath ); broadcastSettingChange( existing ); - save(); + scheduleSettingsSave(); } } @@ -539,7 +548,7 @@ public class SettingsManager implements Listener defaultIconSetting.setName( icon.getName() ); - save(); + scheduleSettingsSave(); broadcastSettingChange( defaultIconSetting ); } @@ -553,7 +562,7 @@ public class SettingsManager implements Listener { mSettings.addSetting( setting ); - save(); + scheduleSettingsSave(); broadcastSettingChange( setting ); } @@ -566,13 +575,13 @@ public class SettingsManager implements Listener public void addRecordingConfiguration( RecordingConfiguration config ) { mSettings.addRecordingConfiguration( config ); - save(); + scheduleSettingsSave(); } public void removeRecordingConfiguration( RecordingConfiguration config ) { mSettings.removeRecordingConfiguration( config ); - save(); + scheduleSettingsSave(); } public MapViewSetting getMapViewSetting( String name, GeoPosition position, int zoom ) @@ -600,11 +609,12 @@ public class SettingsManager implements Listener loc.setGeoPosition( position ); loc.setZoom( zoom ); - save(); + scheduleSettingsSave(); } - public void save() + private void save() { + mLog.debug( "Saving settings" ); saveTunerConfigurationModel(); JAXBContext context = null; @@ -685,7 +695,7 @@ public class SettingsManager implements Listener */ public void load( Path settingsPath ) { - mLoading = true; + mLoadingSettings = true; if( Files.exists( settingsPath ) ) { @@ -748,7 +758,7 @@ public class SettingsManager implements Listener loadTunerConfigurationModel(); - mLoading = false; + mLoadingSettings = false; } private void loadTunerConfigurationModel() @@ -818,4 +828,35 @@ public class SettingsManager implements Listener { mListeners.remove( listener ); } + + /** + * Schedules a settings save task. Subsequent calls to this method will be ignored until the + * save event occurs, thus limiting repetitive saving to a minimum. + */ + private void scheduleSettingsSave() + { + if( !mLoadingSettings ) + { + if( mSettingsSavePending.compareAndSet( false, true ) ) + { + mThreadPoolManager.scheduleOnce( new SettingsSaveTask(), + 2, TimeUnit.SECONDS ); + } + } + } + + /** + * Resets the settings save pending flag to false and proceeds to save the + * settings. + */ + public class SettingsSaveTask implements Runnable + { + @Override + public void run() + { + mSettingsSavePending.set( false ); + + save(); + } + } } diff --git a/src/source/recording/Recording.java b/src/source/recording/Recording.java index bfbe790e..f06192c2 100644 --- a/src/source/recording/Recording.java +++ b/src/source/recording/Recording.java @@ -38,7 +38,7 @@ public class Recording implements Comparable, public void setAlias( String alias ) { mConfiguration.setAlias( alias ); - mSettingsManager.save(); +// mSettingsManager.save(); } public void setRecordingFile( File file ) throws SourceException @@ -51,7 +51,7 @@ public class Recording implements Comparable, } mConfiguration.setFilePath( file.getAbsolutePath() ); - mSettingsManager.save(); +// mSettingsManager.save(); } /** @@ -96,7 +96,7 @@ public class Recording implements Comparable, mConfiguration.setCenterFrequency( frequency ); - mSettingsManager.save(); +// mSettingsManager.save(); mCenterFrequency = frequency; diff --git a/src/source/tuner/TunerEditor.java b/src/source/tuner/TunerEditor.java index 9f310b33..6275174b 100644 --- a/src/source/tuner/TunerEditor.java +++ b/src/source/tuner/TunerEditor.java @@ -10,6 +10,7 @@ import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JLabel; +import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; @@ -43,8 +44,9 @@ public class TunerEditor extends Editor private JLabel mSelectedTunerType = new JLabel( "No Tuner Selected" ); private JButton mNewConfigurationButton = new JButton( "New" ); private JButton mDeleteConfigurationButton = new JButton( "Delete" ); + private JButton mAssignConfigurationButton = new JButton( "Assign" ); private JScrollPane mEditorScroller; - private Editor mEditor = new EmptyEditor<>(); + private Editor mEditor = new EmptyEditor<>( "a tuner" ); private JideSplitPane mEditorSplitPane = new JideSplitPane(); public TunerEditor( TunerConfigurationModel tunerConfigurationModel ) @@ -58,7 +60,7 @@ public class TunerEditor extends Editor setLayout( new MigLayout( "insets 0 0 0 0", "[grow,fill]", "[grow,fill]" ) ); JPanel listPanel = new JPanel(); - listPanel.setLayout( new MigLayout( "fill,wrap 2", "[grow,fill]", "[][][][grow,fill][]" ) ); + listPanel.setLayout( new MigLayout( "fill,wrap 3", "[grow,fill]", "[][][][grow,fill][]" ) ); listPanel.add( mSelectedTunerType, "span" ); @@ -84,7 +86,7 @@ public class TunerEditor extends Editor if( modelRow >= 0 ) { - setConfigurationEditor( mTunerConfigurationModel.getTunerConfiguration( modelRow ) ); + setTunerConfiguration( mTunerConfigurationModel.getTunerConfiguration( modelRow ) ); } } } @@ -118,8 +120,39 @@ public class TunerEditor extends Editor listPanel.add( mNewConfigurationButton ); mDeleteConfigurationButton.setEnabled( false ); + mDeleteConfigurationButton.addActionListener( new ActionListener() + { + @Override + public void actionPerformed( ActionEvent e ) + { + int choice = JOptionPane.showConfirmDialog( TunerEditor.this, + "Do you want to delete this tuner configuration?", + "Delete Tuner Configuration?", JOptionPane.YES_NO_OPTION ); + + if( choice == JOptionPane.YES_OPTION ) + { + TunerConfiguration selected = getSelectedTunerConfiguration(); + + mTunerConfigurationModel.removeTunerConfiguration( selected ); + } + } + } ); listPanel.add( mDeleteConfigurationButton ); + mAssignConfigurationButton.setEnabled( false ); + mAssignConfigurationButton.addActionListener( new ActionListener() + { + @Override + public void actionPerformed( ActionEvent e ) + { + TunerConfiguration selected = getSelectedTunerConfiguration(); + + mTunerConfigurationModel.assignTunerConfiguration( selected ); + setTunerConfiguration( getSelectedTunerConfiguration() ); + } + } ); + listPanel.add( mAssignConfigurationButton ); + //Set preferred size on both scrollers to same width, so they split the space listPanel.setPreferredSize( new Dimension( 100, 80 ) ); JScrollPane listScroller = new JScrollPane( listPanel ); @@ -135,6 +168,23 @@ public class TunerEditor extends Editor add( mEditorSplitPane ); } + private TunerConfiguration getSelectedTunerConfiguration() + { + int tableRow = mTunerConfigurationTable.getSelectedRow(); + + if( tableRow >= 0 ) + { + int modelRow = mTunerConfigurationTable.convertRowIndexToModel( tableRow ); + + if( modelRow >= 0 ) + { + return mTunerConfigurationModel.getTunerConfiguration( modelRow ); + } + } + + return null; + } + @Override public void save() { @@ -161,8 +211,11 @@ public class TunerEditor extends Editor mTunerConfigurationTable.setEnabled( true ); mNewConfigurationButton.setEnabled( true ); - mRowSorter.setRowFilter( new ConfigurationRowFilter( - tuner.getTunerType(), tuner.getUniqueID() ) ); + //Change to an editor for this config's tuner type + mEditor = TunerConfigurationFactory.getEditor( getItem(), mTunerConfigurationModel ); + + mRowSorter.setRowFilter( new ConfigurationRowFilter( tuner.getTunerType(), + tuner.getUniqueID() ) ); TunerConfiguration assigned = mTunerConfigurationModel .getTunerConfiguration( tuner.getTunerType(), tuner.getUniqueID() ); @@ -190,9 +243,6 @@ public class TunerEditor extends Editor //Set the displayed frequency without adjusting the tuner's frequency mFrequencyControl.setFrequency( tuner.getTunerController().getFrequency(), false ); - - mEditor = TunerConfigurationFactory - .getEditor( getItem(), mTunerConfigurationModel ); } else { @@ -212,13 +262,32 @@ public class TunerEditor extends Editor mEditorSplitPane.setDividerLocation( 0, split ); } - private void setConfigurationEditor( TunerConfiguration config ) + private void setTunerConfiguration( TunerConfiguration config ) { if( config != null ) { - if( !mDeleteConfigurationButton.isEnabled() ) + if( !config.isAssigned() ) { - mDeleteConfigurationButton.setEnabled( true ); + if( !mAssignConfigurationButton.isEnabled() ) + { + mAssignConfigurationButton.setEnabled( true ); + } + if( !mDeleteConfigurationButton.isEnabled() ) + { + mDeleteConfigurationButton.setEnabled( true ); + } + } + else + { + if( mAssignConfigurationButton.isEnabled() ) + { + mAssignConfigurationButton.setEnabled( false ); + } + + if( mDeleteConfigurationButton.isEnabled() ) + { + mDeleteConfigurationButton.setEnabled( false ); + } } } else @@ -227,6 +296,11 @@ public class TunerEditor extends Editor { mDeleteConfigurationButton.setEnabled( false ); } + + if( mAssignConfigurationButton.isEnabled() ) + { + mAssignConfigurationButton.setEnabled( false ); + } } mEditor.setItem( config ); diff --git a/src/source/tuner/airspy/AirspyTunerConfiguration.java b/src/source/tuner/airspy/AirspyTunerConfiguration.java index c9c47421..9a62bdbe 100644 --- a/src/source/tuner/airspy/AirspyTunerConfiguration.java +++ b/src/source/tuner/airspy/AirspyTunerConfiguration.java @@ -30,6 +30,7 @@ public class AirspyTunerConfiguration extends TunerConfiguration private int mIFGain = AirspyTunerController.IF_GAIN_DEFAULT; private int mMixerGain = AirspyTunerController.MIXER_GAIN_DEFAULT; private int mLNAGain = AirspyTunerController.LNA_GAIN_DEFAULT; + private double mFrequencyCorrection = 0.0d; private boolean mMixerAGC = false; private boolean mLNAAGC = false; @@ -128,4 +129,16 @@ public class AirspyTunerConfiguration extends TunerConfiguration { mLNAAGC = enabled; } + + @XmlAttribute( name = "frequency_correction" ) + public double getFrequencyCorrection() + { + return mFrequencyCorrection; + } + + public void setFrequencyCorrection( double value ) + { + mFrequencyCorrection = value; + } + } diff --git a/src/source/tuner/airspy/AirspyTunerConfigurationPanel.java b/src/source/tuner/airspy/AirspyTunerConfigurationPanel.java index 781c52e2..60617e57 100644 --- a/src/source/tuner/airspy/AirspyTunerConfigurationPanel.java +++ b/src/source/tuner/airspy/AirspyTunerConfigurationPanel.java @@ -21,7 +21,6 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; -import java.util.ArrayList; import java.util.List; import javax.swing.ComboBoxModel; @@ -47,11 +46,8 @@ import org.usb4java.LibUsbException; import settings.SettingsManager; import source.SourceException; -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 { @@ -119,7 +115,7 @@ public class AirspyTunerConfigurationPanel extends JPanel mComboConfigurations.setModel( getModel() ); /* Determine which tuner configuration should be selected/displayed */ - TunerConfigurationAssignment savedConfig = null; +// TunerConfigurationAssignment savedConfig = null; String serial = null; serial = mController.getDeviceInfo().getSerialNumber(); @@ -130,11 +126,11 @@ public class AirspyTunerConfigurationPanel extends JPanel // TunerType.AIRSPY_R820T, serial ); } - if( savedConfig != null ) - { - mSelectedConfig = getNamedConfiguration( - savedConfig.getTunerConfigurationName() ); - } +// if( savedConfig != null ) +// { +// mSelectedConfig = getNamedConfiguration( +// savedConfig.getTunerConfigurationName() ); +// } /* If we couldn't determine the saved/selected config, use the first one */ if( mSelectedConfig == null ) @@ -694,6 +690,6 @@ public class AirspyTunerConfigurationPanel extends JPanel */ private void save() { - mSettingsManager.save(); +// mSettingsManager.save(); } } diff --git a/src/source/tuner/configuration/TunerConfigurationAssignment.java b/src/source/tuner/configuration/TunerConfigurationAssignment.java deleted file mode 100644 index 3e3fcf2e..00000000 --- a/src/source/tuner/configuration/TunerConfigurationAssignment.java +++ /dev/null @@ -1,66 +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.configuration; - -import javax.xml.bind.annotation.XmlAttribute; - -import source.tuner.TunerType; - -public class TunerConfigurationAssignment -{ - private TunerType mTunerType; - private String mUniqueID; - private String mTunerConfigurationName; - - public TunerConfigurationAssignment() - { - } - - @XmlAttribute( name = "type" ) - public TunerType getTunerType() - { - return mTunerType; - } - - public void setTunerType( TunerType tunerType ) - { - mTunerType = tunerType; - } - - @XmlAttribute( name = "id" ) - public String getUniqueID() - { - return mUniqueID; - } - - public void setUniqueID( String uniqueID ) - { - mUniqueID = uniqueID; - } - - @XmlAttribute( name = "configuration_name" ) - public String getTunerConfigurationName() - { - return mTunerConfigurationName; - } - - public void setTunerConfigurationName( String tunerConfigurationName ) - { - mTunerConfigurationName = tunerConfigurationName; - } -} diff --git a/src/source/tuner/configuration/TunerConfigurationFactory.java b/src/source/tuner/configuration/TunerConfigurationFactory.java index 8a93b54e..d41fc726 100644 --- a/src/source/tuner/configuration/TunerConfigurationFactory.java +++ b/src/source/tuner/configuration/TunerConfigurationFactory.java @@ -61,7 +61,6 @@ public class TunerConfigurationFactory break; } - return new EmptyEditor(); + return new EmptyEditor( "a tuner" ); } - } diff --git a/src/source/tuner/configuration/TunerConfigurationModel.java b/src/source/tuner/configuration/TunerConfigurationModel.java index 64bd45f3..44f4008f 100644 --- a/src/source/tuner/configuration/TunerConfigurationModel.java +++ b/src/source/tuner/configuration/TunerConfigurationModel.java @@ -23,12 +23,13 @@ public class TunerConfigurationModel extends AbstractTableModel private static final int ASSIGNED = 2; private static final String[] COLUMN_HEADERS = { "Tuner Type", "Name", "Assigned" }; - private List> mConfigurationListeners = new ArrayList<>(); + private List> mConfigurationChangeListeners = + new ArrayList<>(); private List mTunerConfigurations = new ArrayList<>(); /** - * Table model for managing tuner configurations and tuner configuration - * assignments. Provides tuner configuration events to registered listeners + * Table model for managing tuner configurations. Provides tuner configuration events to + * registered listeners */ public TunerConfigurationModel() { @@ -115,7 +116,7 @@ public class TunerConfigurationModel extends AbstractTableModel */ public void addListener( Listener listener ) { - mConfigurationListeners.add( listener ); + mConfigurationChangeListeners.add( listener ); } /** @@ -123,7 +124,7 @@ public class TunerConfigurationModel extends AbstractTableModel */ public void removeListener( Listener listener ) { - mConfigurationListeners.remove( listener ); + mConfigurationChangeListeners.remove( listener ); } /** @@ -131,12 +132,44 @@ public class TunerConfigurationModel extends AbstractTableModel */ public void broadcast( TunerConfigurationEvent event ) { - for( Listener listener: mConfigurationListeners ) + for( Listener listener: mConfigurationChangeListeners ) { listener.receive( event ); } } + /** + * Designates the configuration argument as the currently assigned configuration and unassigns + * any other configurations with the same tuner type and unique ID. + */ + public void assignTunerConfiguration( TunerConfiguration configToAssign ) + { + if( configToAssign != null ) + { + List configs = + getTunerConfigurations( configToAssign.getTunerType(), configToAssign.getUniqueID() ); + + for( TunerConfiguration config: configs ) + { + if( config.isAssigned() ) + { + mLog.debug( "Unassigning: " + config.getName() ); + config.setAssigned( false ); + + int index = mTunerConfigurations.indexOf( config ); + fireTableCellUpdated( index, ASSIGNED ); + broadcast( new TunerConfigurationEvent( config, Event.CHANGE ) ); + } + } + + mLog.debug( "Assigning: " + configToAssign.getName() ); + configToAssign.setAssigned( true ); + int index = mTunerConfigurations.indexOf( configToAssign ); + fireTableCellUpdated( index, ASSIGNED ); + broadcast( new TunerConfigurationEvent( configToAssign, Event.CHANGE ) ); + } + } + /** * Returns the tuner configuration that is assigned to the tuner with the * tuner type and uniqueID, or selects the first existing configuration that diff --git a/src/source/tuner/fcd/proV1/FCD1TunerConfigurationPanel.java b/src/source/tuner/fcd/proV1/FCD1TunerConfigurationPanel.java index 051d597f..390f3f21 100644 --- a/src/source/tuner/fcd/proV1/FCD1TunerConfigurationPanel.java +++ b/src/source/tuner/fcd/proV1/FCD1TunerConfigurationPanel.java @@ -557,7 +557,7 @@ public class FCD1TunerConfigurationPanel extends JPanel private void save() { - mSettingsManager.save(); +// mSettingsManager.save(); } public enum Correction { GAIN, PHASE, DC_INPHASE, DC_QUADRATURE }; diff --git a/src/source/tuner/fcd/proplusV2/FCD2TunerConfigurationPanel.java b/src/source/tuner/fcd/proplusV2/FCD2TunerConfigurationPanel.java index 991d0b11..cdcaff7e 100644 --- a/src/source/tuner/fcd/proplusV2/FCD2TunerConfigurationPanel.java +++ b/src/source/tuner/fcd/proplusV2/FCD2TunerConfigurationPanel.java @@ -23,7 +23,6 @@ import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.text.DecimalFormat; -import java.util.ArrayList; import javax.swing.ComboBoxModel; import javax.swing.DefaultComboBoxModel; @@ -48,9 +47,6 @@ import org.slf4j.LoggerFactory; import settings.SettingsManager; import source.SourceException; -import source.tuner.TunerType; -import source.tuner.configuration.TunerConfiguration; -import source.tuner.configuration.TunerConfigurationAssignment; public class FCD2TunerConfigurationPanel extends JPanel { @@ -375,6 +371,6 @@ public class FCD2TunerConfigurationPanel extends JPanel private void save() { - mSettingsManager.save(); +// mSettingsManager.save(); } } diff --git a/src/source/tuner/hackrf/HackRFTunerConfigurationPanel.java b/src/source/tuner/hackrf/HackRFTunerConfigurationPanel.java index 88aa95d6..92ff881b 100644 --- a/src/source/tuner/hackrf/HackRFTunerConfigurationPanel.java +++ b/src/source/tuner/hackrf/HackRFTunerConfigurationPanel.java @@ -23,7 +23,6 @@ import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.text.DecimalFormat; -import java.util.ArrayList; import javax.swing.BorderFactory; import javax.swing.ComboBoxModel; @@ -50,9 +49,6 @@ import org.slf4j.LoggerFactory; import settings.SettingsManager; import source.SourceException; -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; @@ -105,7 +101,7 @@ public class HackRFTunerConfigurationPanel extends JPanel mComboConfigurations.setModel( getModel() ); /* Determine which tuner configuration should be selected/displayed */ - TunerConfigurationAssignment savedConfig = null; +// TunerConfigurationAssignment savedConfig = null; String serial = null; try @@ -122,12 +118,12 @@ public class HackRFTunerConfigurationPanel extends JPanel // savedConfig = mSettingsManager.getSelectedTunerConfiguration( // TunerType.HACKRF, serial ); // } - - if( savedConfig != null ) - { - mSelectedConfig = getNamedConfiguration( - savedConfig.getTunerConfigurationName() ); - } +// +// if( savedConfig != null ) +// { +// mSelectedConfig = getNamedConfiguration( +// savedConfig.getTunerConfigurationName() ); +// } /* If we couldn't determine the saved/selected config, use the first one */ if( mSelectedConfig == null ) @@ -556,6 +552,6 @@ public class HackRFTunerConfigurationPanel extends JPanel */ private void save() { - mSettingsManager.save(); +// mSettingsManager.save(); } } diff --git a/src/source/tuner/rtl/e4k/E4KTunerConfigurationPanel.java b/src/source/tuner/rtl/e4k/E4KTunerConfigurationPanel.java index b411ff5e..3ec3e0db 100644 --- a/src/source/tuner/rtl/e4k/E4KTunerConfigurationPanel.java +++ b/src/source/tuner/rtl/e4k/E4KTunerConfigurationPanel.java @@ -23,7 +23,6 @@ import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.text.DecimalFormat; -import java.util.ArrayList; import javax.swing.BorderFactory; import javax.swing.ComboBoxModel; @@ -50,9 +49,6 @@ import org.usb4java.LibUsbException; import settings.SettingsManager; import source.SourceException; -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; @@ -686,6 +682,6 @@ public class E4KTunerConfigurationPanel extends JPanel */ private void save() { - mSettingsManager.save(); +// mSettingsManager.save(); } } diff --git a/src/source/tuner/rtl/r820t/R820TTunerConfigurationEditorOld.java b/src/source/tuner/rtl/r820t/R820TTunerConfigurationEditorOld.java index 1a310ba1..841a8e49 100644 --- a/src/source/tuner/rtl/r820t/R820TTunerConfigurationEditorOld.java +++ b/src/source/tuner/rtl/r820t/R820TTunerConfigurationEditorOld.java @@ -23,7 +23,6 @@ import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.text.DecimalFormat; -import java.util.ArrayList; import javax.swing.BorderFactory; import javax.swing.ComboBoxModel; @@ -50,9 +49,6 @@ import org.usb4java.LibUsbException; import settings.SettingsManager; import source.SourceException; -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; @@ -694,6 +690,6 @@ public class R820TTunerConfigurationEditorOld extends JPanel */ private void save() { - mSettingsManager.save(); +// mSettingsManager.save(); } } diff --git a/src/source/tuner/rtl/r820t/R820TTunerEditor.java b/src/source/tuner/rtl/r820t/R820TTunerEditor.java index 32d9ab1f..4fa0a41c 100644 --- a/src/source/tuner/rtl/r820t/R820TTunerEditor.java +++ b/src/source/tuner/rtl/r820t/R820TTunerEditor.java @@ -17,18 +17,15 @@ ******************************************************************************/ 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.JSeparator; import javax.swing.JSpinner; import javax.swing.JTextField; @@ -76,6 +73,7 @@ public class R820TTunerEditor extends TunerConfigurationEditor private JComboBox mComboLNAGain; private JComboBox mComboVGAGain; private JComboBox mComboSampleRate; + private boolean mLoading; public R820TTunerEditor( TunerConfigurationModel tunerConfigurationModel, RTL2832Tuner tuner ) @@ -95,7 +93,7 @@ public class R820TTunerEditor extends TunerConfigurationEditor @Override public void save() { - if( hasItem() ) + if( hasItem() && !mLoading ) { R820TTunerConfiguration config = getConfiguration(); @@ -133,14 +131,73 @@ public class R820TTunerEditor extends TunerConfigurationEditor { 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() ); + //Toggle loading so that we don't fire a change event and schedule a settings file save + mLoading = true; + + if( item.isAssigned() ) + { + setControlsEnabled( true ); + 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() ); + } + else + { + setControlsEnabled( false ); + mConfigurationName.setText( config.getName() ); + } + + mLoading = false; } + else + { + setControlsEnabled( false ); + mConfigurationName.setText( "" ); + } + } + /** + * Sets each of the tuner configuration controls to the enabled argument state + */ + private void setControlsEnabled( boolean enabled ) + { + if( mConfigurationName.isEnabled() != enabled ) + { + mConfigurationName.setEnabled( enabled ); + } + + if( mFrequencyCorrection.isEnabled() != enabled ) + { + mFrequencyCorrection.setEnabled( enabled ); + } + + if( mComboSampleRate.isEnabled() != enabled ) + { + mComboSampleRate.setEnabled( enabled ); + } + + if( mComboMasterGain.isEnabled() != enabled ) + { + mComboMasterGain.setEnabled( enabled ); + } + + if( mComboMixerGain.isEnabled() != enabled ) + { + mComboMixerGain.setEnabled( enabled ); + } + + if( mComboLNAGain.isEnabled() != enabled ) + { + mComboLNAGain.setEnabled( enabled ); + } + + if( mComboVGAGain.isEnabled() != enabled ) + { + mComboVGAGain.setEnabled( enabled ); + } } private R820TTunerConfiguration getConfiguration() @@ -164,6 +221,7 @@ public class R820TTunerEditor extends TunerConfigurationEditor * Tuner Configuration Name */ mConfigurationName = new JTextField(); + mConfigurationName.setEnabled( false ); mConfigurationName.addFocusListener( new FocusListener() { @Override @@ -179,6 +237,7 @@ public class R820TTunerEditor extends TunerConfigurationEditor add( mConfigurationName, "span,grow" ); mComboSampleRate = new JComboBox<>( SampleRate.values() ); + mComboSampleRate.setEnabled( false ); mComboSampleRate.addActionListener( new ActionListener() { @Override @@ -219,6 +278,7 @@ public class R820TTunerEditor extends TunerConfigurationEditor 0.1 ); //step mFrequencyCorrection = new JSpinner( model ); + mFrequencyCorrection.setEnabled( false ); JSpinner.NumberEditor editor = (JSpinner.NumberEditor)mFrequencyCorrection.getEditor(); @@ -258,7 +318,7 @@ public class R820TTunerEditor extends TunerConfigurationEditor */ /* Master Gain Control */ mComboMasterGain = new JComboBox( R820TGain.values() ); - + mComboMasterGain.setEnabled( false ); mComboMasterGain.addActionListener( new ActionListener() { @Override @@ -292,7 +352,7 @@ public class R820TTunerEditor extends TunerConfigurationEditor mComboVGAGain.setEnabled( false ); mComboVGAGain.setSelectedItem( gain.getVGAGain() ); } - + save(); } catch ( UsbException e ) @@ -317,54 +377,49 @@ public class R820TTunerEditor extends TunerConfigurationEditor /* Mixer Gain Control */ mComboMixerGain = new JComboBox( R820TMixerGain.values() ); + mComboMixerGain.setEnabled( false ); 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 ); - } + 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 ); - } - } - } ); + 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 ); + add( new JLabel( "Mixer:" ) ); add( mComboMixerGain ); /* LNA Gain Control */ mComboLNAGain = new JComboBox( R820TLNAGain.values() ); + mComboLNAGain.setEnabled( false ); mComboLNAGain.addActionListener( new ActionListener() { @Override @@ -400,12 +455,13 @@ public class R820TTunerEditor extends TunerConfigurationEditor } ); mComboLNAGain.setToolTipText( "LNA Gain. Set master gain " + "to MANUAL to enable adjustment" ); - mComboLNAGain.setEnabled( false ); + add( new JLabel( "LNA:" ) ); add( mComboLNAGain ); /* VGA Gain Control */ mComboVGAGain = new JComboBox( R820TVGAGain.values() ); + mComboVGAGain.setEnabled( false ); mComboVGAGain.addActionListener( new ActionListener() { @Override @@ -441,7 +497,6 @@ public class R820TTunerEditor extends TunerConfigurationEditor } ); mComboVGAGain.setToolTipText( "VGA Gain. Set master gain " + "to MANUAL to enable adjustment" ); - mComboVGAGain.setEnabled( false ); add( new JLabel( "VGA:" ) ); add( mComboVGAGain ); }