Merges #34 Major redesign of Tuner, Channel and Alias management.

Changes to model, view and controller components and updates all gui
editors.  Removes the configuration panel and tree and replaces with 3
new panels.  Updates playlist.xml to a new playlist_v2.xml format.
This commit is contained in:
denny
2016-04-01 08:23:49 -04:00
450 changed files with 19560 additions and 22805 deletions

View File

@@ -24,6 +24,7 @@ import javax.xml.bind.annotation.XmlTransient;
public class ColorSetting extends Setting
{
@SuppressWarnings( "unused" )
private static final int NO_TRANSLUCENCY = 255;
private static final int SPECTRUM_TRANSLUCENCY = 128;
private static final int CONFIG_TRANSLUCENCY = 60;

View File

@@ -17,7 +17,6 @@
******************************************************************************/
package settings;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
@@ -33,17 +32,14 @@ public class ColorSettingResetAllMenuItem extends JMenuItem
{
private static final long serialVersionUID = 1L;
private ColorSettingName mColorSettingName;
private SettingsManager mSettingsManager;
private Color mCurrentColor;
public ColorSettingResetAllMenuItem( SettingsManager settingsManager,
ColorSettingName colorSettingName )
public ColorSettingResetAllMenuItem( SettingsManager settingsManager,
ColorSettingName colorSettingName )
{
super( "Reset - " + colorSettingName.getLabel() );
mSettingsManager = settingsManager;
mColorSettingName = colorSettingName;
addActionListener( new ActionListener()
{

View File

@@ -17,7 +17,6 @@
******************************************************************************/
package settings;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
@@ -35,7 +34,6 @@ public class ColorSettingResetMenuItem extends JMenuItem
private ColorSettingName mColorSettingName;
private SettingsManager mSettingsManager;
private Color mCurrentColor;
public ColorSettingResetMenuItem( SettingsManager settingsManager,
ColorSettingName colorSettingName )

View File

@@ -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.TunerConfiguration;
import source.tuner.TunerConfigurationAssignment;
import source.tuner.TunerType;
import source.tuner.airspy.AirspyTunerConfiguration;
import source.tuner.configuration.TunerConfiguration;
import source.tuner.fcd.proV1.FCD1TunerConfiguration;
import source.tuner.fcd.proplusV2.FCD2TunerConfiguration;
import source.tuner.hackrf.HackRFTunerConfiguration;
@@ -54,21 +52,17 @@ 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
{
private ArrayList<Setting> mSettings = new ArrayList<Setting>();
private List<Setting> mSettings = new ArrayList<Setting>();
private ArrayList<TunerConfiguration> mTunerConfiguration =
private List<TunerConfiguration> mTunerConfiguration =
new ArrayList<TunerConfiguration>();
private ArrayList<TunerConfigurationAssignment> mConfigurationAssignments =
new ArrayList<TunerConfigurationAssignment>();
private ArrayList<RecordingConfiguration> mRecordingConfigurations =
private List<RecordingConfiguration> mRecordingConfigurations =
new ArrayList<RecordingConfiguration>();
public Settings()
@@ -76,7 +70,7 @@ public class Settings
}
@XmlElement( name="recording_configuration" )
public ArrayList<RecordingConfiguration> getRecordingConfigurations()
public List<RecordingConfiguration> getRecordingConfigurations()
{
return mRecordingConfigurations;
}
@@ -89,7 +83,6 @@ public class Settings
public void addRecordingConfiguration( RecordingConfiguration config )
{
mRecordingConfigurations.add( config );
}
public void removeRecordingConfiguration( RecordingConfiguration config )
@@ -98,45 +91,18 @@ public class Settings
}
@XmlElement( name="tuner_configuration" )
public ArrayList<TunerConfiguration> getTunerConfigurations()
public List<TunerConfiguration> getTunerConfigurations()
{
return mTunerConfiguration;
}
public void setTunerConfigurations( ArrayList<TunerConfiguration> configs )
public void setTunerConfigurations( List<TunerConfiguration> configs )
{
mTunerConfiguration = configs;
}
public void addTunerConfiguration( TunerConfiguration config )
{
mTunerConfiguration.add( config );
}
public void removeTunerConfiguration( TunerConfiguration config )
{
mTunerConfiguration.remove( config );
}
public ArrayList<TunerConfiguration> getTunerConfigurations( TunerType type )
{
ArrayList<TunerConfiguration> configs =
new ArrayList<TunerConfiguration>();
for( TunerConfiguration config: mTunerConfiguration )
{
if( config.getTunerType() == type )
{
configs.add( config );
}
}
return configs;
}
@XmlElement( name="setting" )
public ArrayList<Setting> getSettings()
public List<Setting> getSettings()
{
return mSettings;
}
@@ -254,59 +220,6 @@ public class Settings
return icons;
}
@XmlElement( name="tuner_configuration_assignment" )
public ArrayList<TunerConfigurationAssignment> getSelectedTunerConfiguration()
{
return mConfigurationAssignments;
}
public void setSelectedTunerConfiguration( ArrayList<TunerConfigurationAssignment> 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 )

View File

@@ -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,9 @@ import java.nio.file.Path;
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,19 +48,14 @@ 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;
import controller.ThreadPoolManager;
public class SettingsManager
public class SettingsManager implements Listener<TunerConfigurationEvent>
{
private final static Logger mLog =
LoggerFactory.getLogger( SettingsManager.class );
@@ -76,8 +74,25 @@ public class SettingsManager
private HashMap<String,ImageIcon> mResizedIcons =
new HashMap<String,ImageIcon>();
public SettingsManager()
private TunerConfigurationModel mTunerConfigurationModel;
private ThreadPoolManager mThreadPoolManager;
private boolean mLoadingSettings = false;
private AtomicBoolean mSettingsSavePending = new AtomicBoolean();
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
mTunerConfigurationModel.addListener( this );
init();
}
@@ -101,6 +116,15 @@ public class SettingsManager
refreshIcons();
}
@Override
public void receive( TunerConfigurationEvent t )
{
if( !mLoadingSettings )
{
scheduleSettingsSave();
}
}
/**
* Reloads the icon hash map, and sets up the default iconology. If the
@@ -180,7 +204,7 @@ public class SettingsManager
broadcastSettingChange( setting );
save();
scheduleSettingsSave();
}
public void resetColorSetting( ColorSettingName name )
@@ -226,7 +250,7 @@ public class SettingsManager
broadcastSettingChange( setting );
save();
scheduleSettingsSave();
}
public MapIcon[] getMapIcons()
@@ -323,7 +347,7 @@ public class SettingsManager
broadcastSettingDeleted( existing );
save();
scheduleSettingsSave();
}
}
@@ -346,7 +370,7 @@ public class SettingsManager
existing.setName( icon.getName() );
existing.setPath( icon.getPath() );
broadcastSettingChange( existing );
save();
scheduleSettingsSave();
}
}
@@ -363,7 +387,7 @@ public class SettingsManager
existing.setName( newName );
existing.setPath( newPath );
broadcastSettingChange( existing );
save();
scheduleSettingsSave();
}
}
@@ -386,6 +410,12 @@ public class SettingsManager
}
MapIcon mapIcon = mIcons.get( name );
if( mapIcon == null )
{
mapIcon = new MapIcon( name, name );
mIcons.put( name, mapIcon );
}
if( mapIcon != null )
{
@@ -399,11 +429,12 @@ public class SettingsManager
}
else
{
mResizedIcons.put( mergedName, mapIcon.getImageIcon() );
return mapIcon.getImageIcon();
}
}
/* Use the default Icon */
@SuppressWarnings( "unused" )
String mergedDefault = mCurrentDefaultIconName + height;
if( mResizedIcons.containsKey( mergedDefault ) )
@@ -431,7 +462,8 @@ public class SettingsManager
}
/* Something happened ... the above should always return an icon */
mLog.error( "couldn't return an icon named [" + name + "] of heigh [" + height + "]" );
mLog.error( "SettingsManager - couldn't return an icon named [" +
name + "] of heigh [" + height + "]" );
}
return null;
@@ -516,7 +548,7 @@ public class SettingsManager
defaultIconSetting.setName( icon.getName() );
save();
scheduleSettingsSave();
broadcastSettingChange( defaultIconSetting );
}
@@ -530,12 +562,12 @@ public class SettingsManager
{
mSettings.addSetting( setting );
save();
scheduleSettingsSave();
broadcastSettingChange( setting );
}
public ArrayList<RecordingConfiguration> getRecordingConfigurations()
public List<RecordingConfiguration> getRecordingConfigurations()
{
return mSettings.getRecordingConfigurations();
}
@@ -543,106 +575,15 @@ public class SettingsManager
public void addRecordingConfiguration( RecordingConfiguration config )
{
mSettings.addRecordingConfiguration( config );
save();
scheduleSettingsSave();
}
public void removeRecordingConfiguration( RecordingConfiguration config )
{
mSettings.removeRecordingConfiguration( config );
save();
scheduleSettingsSave();
}
public ArrayList<TunerConfiguration> getTunerConfigurations( TunerType type )
{
ArrayList<TunerConfiguration> 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( "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 );
@@ -668,11 +609,13 @@ public class SettingsManager
loc.setGeoPosition( position );
loc.setZoom( zoom );
save();
scheduleSettingsSave();
}
public void save()
private void save()
{
saveTunerConfigurationModel();
JAXBContext context = null;
SystemProperties props = SystemProperties.getInstance();
@@ -698,7 +641,8 @@ public class SettingsManager
}
catch( Exception e )
{
mLog.error( "couldn't create file to save settings [" + filePath.toString() + "]", e );
mLog.error( "SettingsManager - couldn't create file to save "
+ "settings [" + filePath.toString() + "]", e );
}
OutputStream out = null;
@@ -719,12 +663,14 @@ public class SettingsManager
}
catch ( JAXBException e )
{
mLog.error( "jaxb exception while saving settings", e );
mLog.error( "SettingsManager - jaxb exception while saving " +
"settings", e );
}
}
catch ( Exception e )
{
mLog.error( "couldn't open outputstream to save settings [" + filePath.toString() + "]" );
mLog.error( "SettingsManager - coulcn't open outputstream to " +
"save settings [" + filePath.toString() + "]" );
}
finally
{
@@ -748,9 +694,11 @@ public class SettingsManager
*/
public void load( Path settingsPath )
{
mLoadingSettings = true;
if( Files.exists( settingsPath ) )
{
mLog.info( "loading settings file [" + settingsPath.toString() + "]" );
mLog.info( "SettingsManager - loading settings file [" + settingsPath.toString() + "]" );
JAXBContext context = null;
@@ -770,13 +718,13 @@ public class SettingsManager
}
catch ( JAXBException e )
{
mLog.error( "jaxb exception while loading " +
mLog.error( "SettingsManager - jaxb exception while loading " +
"settings", e );
}
}
catch ( Exception e )
{
mLog.error( "coulcn't open inputstream to " +
mLog.error( "SettingsManager - coulcn't open inputstream to " +
"load settings [" + settingsPath.toString() + "]", e );
}
finally
@@ -789,7 +737,7 @@ public class SettingsManager
}
catch ( IOException e )
{
mLog.error( "exception while closing " +
mLog.error( "SettingsManager - exception while closing " +
"the settings file inputstream reader", e );
}
}
@@ -797,13 +745,38 @@ public class SettingsManager
}
else
{
mLog.info( "settings does not exist [" + settingsPath.toString() + "]" );
mLog.info( "SettingsManager - settings does not exist [" +
settingsPath.toString() + "]" );
}
if( mSettings == null )
{
mSettings = new Settings();
}
loadTunerConfigurationModel();
mLoadingSettings = false;
}
private void loadTunerConfigurationModel()
{
if( mSettings != null )
{
mTunerConfigurationModel.clear();
mTunerConfigurationModel.addTunerConfigurations(
mSettings.getTunerConfigurations() );
}
}
private void saveTunerConfigurationModel()
{
if( mSettings != null )
{
mSettings.setTunerConfigurations(
mTunerConfigurationModel.getTunerConfigurations() );
}
}
public void broadcastSettingChange( Setting setting )
@@ -853,4 +826,35 @@ public class SettingsManager
{
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();
}
}
}