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.
This commit is contained in:
denny
2016-03-12 12:54:48 -05:00
parent 9d4afb8c1f
commit 218eeb1848
66 changed files with 1983 additions and 2594 deletions

View File

@@ -0,0 +1,67 @@
/*******************************************************************************
* 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 <http://www.gnu.org/licenses/>
******************************************************************************/
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
*/
@XmlType( name = "tuner_configuration" )
public abstract class TunerConfiguration
{
protected String mName;
/**
* Default constructor to support JAXB
*/
public TunerConfiguration()
{
this( "Unknown" );
}
public String toString()
{
return mName;
}
/**
* Normal constructor
*/
public TunerConfiguration( String name )
{
mName = name;
}
@XmlAttribute( name = "name" )
public String getName()
{
return mName;
}
public void setName( String name )
{
mName = name;
}
@XmlAttribute( name = "tuner_type" )
public abstract TunerType getTunerType();
}

View File

@@ -0,0 +1,66 @@
/*******************************************************************************
* 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 <http://www.gnu.org/licenses/>
******************************************************************************/
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;
}
}

View File

@@ -0,0 +1,20 @@
package source.tuner.configuration;
import gui.editor.Editor;
public abstract class TunerConfigurationEditor extends Editor<TunerConfiguration>
{
private static final long serialVersionUID = 1L;
private TunerConfigurationModel mTunerConfigurationModel;
public TunerConfigurationEditor( TunerConfigurationModel model )
{
mTunerConfigurationModel = model;
}
public TunerConfigurationModel getTunerConfigurationModel()
{
return mTunerConfigurationModel;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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<Listener<TunerConfigurationEvent>> mConfigurationListeners = new ArrayList<>();
private List<TunerConfiguration> mTunerConfigurations = new ArrayList<>();
private List<TunerConfigurationAssignment> 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<TunerConfiguration> configs )
{
for( TunerConfiguration config: configs )
{
addTunerConfiguration( config );
}
}
/**
* Returns of list of tuner configurations from the model
*/
public List<TunerConfiguration> 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<TunerConfigurationEvent> listener )
{
mConfigurationListeners.add( listener );
}
/**
* Removes the tuner configuration event listener
*/
public void removeListener( Listener<TunerConfigurationEvent> listener )
{
mConfigurationListeners.remove( listener );
}
/**
* Broadcasts a tuner configuration event
*/
public void broadcast( TunerConfigurationEvent event )
{
for( Listener<TunerConfigurationEvent> listener: mConfigurationListeners )
{
listener.receive( event );
}
}
/**
* Adds a list of tuner configuration assignments to the model
*/
public void addTunerConfigurationAssignments( List<TunerConfigurationAssignment> assignments )
{
for( TunerConfigurationAssignment assigment: assignments )
{
addTunerConfigurationAssignment( assigment );
}
}
/**
* Returns of list of tuner configurations from the model
*/
public List<TunerConfigurationAssignment> 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<TunerConfiguration> 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<TunerConfiguration> getTunerConfigurations( TunerType type )
{
List<TunerConfiguration> 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;
}
}