mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-13 00:57:31 -05:00
P25 - updated automatic and direct frequency control to cleanup the code and allow P25 to better track frequency and PPM changes in the tuner and provide a cleaner implementation of the AFC component in the processing chain of all of the other decoders.
Changed C4FM symbol filter to reset frequency tracking values when the tuner's frequency or PPM values change. Moved all frequency control pieces into the source.tuner.frequency package.
This commit is contained in:
@@ -5,12 +5,12 @@ import java.util.ArrayList;
|
||||
import java.util.concurrent.RejectedExecutionException;
|
||||
|
||||
import source.SourceException;
|
||||
import source.tuner.FrequencyChangeEvent;
|
||||
import source.tuner.FrequencyChangeListener;
|
||||
import source.tuner.TunerChannel;
|
||||
import source.tuner.TunerChannelProvider;
|
||||
import source.tuner.TunerChannelSource;
|
||||
import source.tuner.FrequencyChangeEvent.Attribute;
|
||||
import source.tuner.frequency.FrequencyChangeEvent;
|
||||
import source.tuner.frequency.FrequencyChangeListener;
|
||||
import source.tuner.frequency.FrequencyChangeEvent.Attribute;
|
||||
import controller.ResourceManager;
|
||||
import controller.ThreadPoolManager;
|
||||
|
||||
@@ -92,7 +92,7 @@ public class Recording implements Comparable<Recording>,
|
||||
{
|
||||
if( event.getAttribute() == Attribute.FREQUENCY )
|
||||
{
|
||||
int frequency = (int)event.getValue();
|
||||
long frequency = event.getValue().longValue();
|
||||
|
||||
mConfiguration.setCenterFrequency( frequency );
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ import javax.swing.JOptionPane;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JTextField;
|
||||
|
||||
import source.tuner.FrequencyChangeListener;
|
||||
import source.tuner.frequency.FrequencyChangeListener;
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
public class RecordingEditorPanel extends JPanel
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
package source.tuner;
|
||||
|
||||
|
||||
public interface DirectFrequencyController
|
||||
{
|
||||
public void setListener( FrequencyChangeListener listener );
|
||||
|
||||
public long getFrequencyCorrection();
|
||||
}
|
||||
@@ -22,10 +22,16 @@ import java.util.concurrent.RejectedExecutionException;
|
||||
|
||||
import javax.swing.JPanel;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import sample.Listener;
|
||||
import sample.complex.ComplexBuffer;
|
||||
import source.SourceException;
|
||||
import source.tuner.FrequencyChangeEvent.Attribute;
|
||||
import source.tuner.frequency.FrequencyChangeBroadcaster;
|
||||
import source.tuner.frequency.FrequencyChangeEvent;
|
||||
import source.tuner.frequency.FrequencyChangeListener;
|
||||
import source.tuner.frequency.FrequencyChangeEvent.Attribute;
|
||||
import controller.ResourceManager;
|
||||
import controller.ThreadPoolManager;
|
||||
|
||||
@@ -36,6 +42,8 @@ public abstract class Tuner implements FrequencyChangeBroadcaster,
|
||||
FrequencyChangeListener,
|
||||
TunerChannelProvider
|
||||
{
|
||||
private final static Logger mLog = LoggerFactory.getLogger( Tuner.class );
|
||||
|
||||
private String mName;
|
||||
|
||||
/**
|
||||
|
||||
@@ -33,7 +33,9 @@ import sample.complex.ComplexSample;
|
||||
import sample.complex.ComplexSampleAssembler;
|
||||
import source.ComplexSource;
|
||||
import source.SourceException;
|
||||
import source.tuner.FrequencyChangeEvent.Attribute;
|
||||
import source.tuner.frequency.FrequencyChangeEvent;
|
||||
import source.tuner.frequency.FrequencyChangeListener;
|
||||
import source.tuner.frequency.FrequencyChangeEvent.Attribute;
|
||||
import util.Oscillator;
|
||||
import controller.ThreadPoolManager;
|
||||
import controller.ThreadPoolManager.ThreadType;
|
||||
@@ -173,7 +175,7 @@ public class TunerChannelSource extends ComplexSource
|
||||
case SAMPLE_RATE_ERROR:
|
||||
break;
|
||||
case SAMPLE_RATE:
|
||||
int sampleRate = (int)event.getValue();
|
||||
int sampleRate = event.getValue().intValue();
|
||||
|
||||
if( mTunerSampleRate != sampleRate )
|
||||
{
|
||||
@@ -196,7 +198,7 @@ public class TunerChannelSource extends ComplexSource
|
||||
}
|
||||
break;
|
||||
case FREQUENCY_ERROR:
|
||||
mTunerFrequencyError = (int)event.getValue();
|
||||
mTunerFrequencyError = event.getValue().intValue();
|
||||
|
||||
long frequencyErrorOffset = mTunerFrequency -
|
||||
mTunerChannel.getFrequency() -
|
||||
@@ -205,7 +207,7 @@ public class TunerChannelSource extends ComplexSource
|
||||
mSineWaveGenerator.setFrequency( frequencyErrorOffset );
|
||||
break;
|
||||
case FREQUENCY:
|
||||
int frequency = (int)event.getValue();
|
||||
long frequency = event.getValue().longValue();
|
||||
|
||||
/* If the frequency is updated, the AFC will also get reset, so
|
||||
* we don't include the frequency error value here */
|
||||
|
||||
@@ -26,7 +26,9 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import source.SourceException;
|
||||
import source.tuner.FrequencyController.Tunable;
|
||||
import source.tuner.frequency.FrequencyChangeListener;
|
||||
import source.tuner.frequency.FrequencyController;
|
||||
import source.tuner.frequency.FrequencyController.Tunable;
|
||||
import controller.ThreadPoolManager;
|
||||
|
||||
public abstract class TunerController implements Tunable
|
||||
|
||||
@@ -29,6 +29,8 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import source.SourceException;
|
||||
import source.tuner.frequency.FrequencyChangeEvent;
|
||||
import source.tuner.frequency.FrequencyChangeListener;
|
||||
import spectrum.SpectrumFrame;
|
||||
import controller.BaseNode;
|
||||
|
||||
@@ -127,7 +129,7 @@ public class TunerNode extends BaseNode implements FrequencyChangeListener
|
||||
switch( event.getAttribute() )
|
||||
{
|
||||
case FREQUENCY:
|
||||
int frequency = (int)event.getValue();
|
||||
long frequency = event.getValue().longValue();
|
||||
|
||||
if( mFrequency != frequency )
|
||||
{
|
||||
@@ -136,7 +138,7 @@ public class TunerNode extends BaseNode implements FrequencyChangeListener
|
||||
}
|
||||
break;
|
||||
case SAMPLE_RATE:
|
||||
int sampleRate = (int)event.getValue();
|
||||
int sampleRate = event.getValue().intValue();
|
||||
|
||||
if( mSampleRate != sampleRate )
|
||||
{
|
||||
|
||||
@@ -25,7 +25,6 @@ import sample.Listener;
|
||||
import sample.adapter.ShortAdapter;
|
||||
import sample.complex.ComplexBuffer;
|
||||
import source.SourceException;
|
||||
import source.tuner.FrequencyChangeListener;
|
||||
import source.tuner.MixerTuner;
|
||||
import source.tuner.MixerTunerDataLine;
|
||||
import source.tuner.TunerChannel;
|
||||
@@ -33,6 +32,7 @@ import source.tuner.TunerChannelSource;
|
||||
import source.tuner.TunerClass;
|
||||
import source.tuner.TunerConfiguration;
|
||||
import source.tuner.TunerType;
|
||||
import source.tuner.frequency.FrequencyChangeListener;
|
||||
import controller.ResourceManager;
|
||||
import controller.ThreadPoolManager;
|
||||
|
||||
|
||||
@@ -30,11 +30,11 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import source.SourceException;
|
||||
import source.tuner.FrequencyChangeEvent;
|
||||
import source.tuner.FrequencyChangeEvent.Attribute;
|
||||
import source.tuner.FrequencyChangeListener;
|
||||
import source.tuner.fcd.FCDTuner;
|
||||
import source.tuner.fcd.FCDTunerDetailsPanel;
|
||||
import source.tuner.frequency.FrequencyChangeEvent;
|
||||
import source.tuner.frequency.FrequencyChangeListener;
|
||||
import source.tuner.frequency.FrequencyChangeEvent.Attribute;
|
||||
|
||||
import com.jidesoft.swing.JideTabbedPane;
|
||||
|
||||
@@ -99,12 +99,12 @@ public class FCD1TunerEditorPanel extends JPanel implements FrequencyChangeListe
|
||||
{
|
||||
try
|
||||
{
|
||||
mController.setFrequency( event.getValue() );
|
||||
mController.setFrequency( event.getValue().longValue() );
|
||||
}
|
||||
catch ( SourceException e )
|
||||
{
|
||||
mLog.error( "FCTProController - error setting frequency [" +
|
||||
event.getValue() + "]", e );
|
||||
event.getValue().longValue() + "]", e );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,11 +30,11 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import source.SourceException;
|
||||
import source.tuner.FrequencyChangeEvent;
|
||||
import source.tuner.FrequencyChangeEvent.Attribute;
|
||||
import source.tuner.FrequencyChangeListener;
|
||||
import source.tuner.fcd.FCDTuner;
|
||||
import source.tuner.fcd.FCDTunerDetailsPanel;
|
||||
import source.tuner.frequency.FrequencyChangeEvent;
|
||||
import source.tuner.frequency.FrequencyChangeListener;
|
||||
import source.tuner.frequency.FrequencyChangeEvent.Attribute;
|
||||
|
||||
import com.jidesoft.swing.JideTabbedPane;
|
||||
|
||||
@@ -99,12 +99,12 @@ public class FCD2TunerEditorPanel extends JPanel implements FrequencyChangeListe
|
||||
//Disregard the bandwidth, which shouldn't be changing
|
||||
try
|
||||
{
|
||||
mController.setFrequency( event.getValue() );
|
||||
mController.setFrequency( event.getValue().longValue() );
|
||||
}
|
||||
catch ( SourceException e )
|
||||
{
|
||||
mLog.error( "FCDProController - error setting frequency [" +
|
||||
event.getValue() + "]", e );
|
||||
event.getValue().longValue() + "]", e );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
181
src/source/tuner/frequency/AutomaticFrequencyControl.java
Normal file
181
src/source/tuner/frequency/AutomaticFrequencyControl.java
Normal file
@@ -0,0 +1,181 @@
|
||||
package source.tuner.frequency;
|
||||
|
||||
/*******************************************************************************
|
||||
* SDR Trunk
|
||||
* Copyright (C) 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 <http://www.gnu.org/licenses/>
|
||||
******************************************************************************/
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import sample.real.RealSampleListener;
|
||||
import source.tuner.frequency.FrequencyChangeEvent.Attribute;
|
||||
import buffer.FloatAveragingBuffer;
|
||||
|
||||
public class AutomaticFrequencyControl extends FrequencyCorrectionControl
|
||||
implements RealSampleListener
|
||||
{
|
||||
private final static Logger mLog =
|
||||
LoggerFactory.getLogger( AutomaticFrequencyControl.class );
|
||||
|
||||
private static float LARGE_ERROR = 0.300f;
|
||||
private static float MEDIUM_ERROR = 0.150f;
|
||||
private static float SMALL_ERROR = 0.030f;
|
||||
private static float FINE_ERROR = 0.015f;
|
||||
|
||||
private static int LARGE_FREQUENCY_CORRECTION = 1500; //Hertz
|
||||
private static int MEDIUM_FREQUENCY_CORRECTION = 500;
|
||||
private static int SMALL_FREQUENCY_CORRECTION = 100;
|
||||
private static int FINE_FREQUENCY_CORRECTION = 50;
|
||||
|
||||
private static int SAMPLE_THRESHOLD = 15000;
|
||||
private Mode mMode = Mode.FAST;
|
||||
|
||||
private FloatAveragingBuffer mBuffer =
|
||||
new FloatAveragingBuffer( SAMPLE_THRESHOLD );
|
||||
|
||||
private int mSampleCounter = 0;
|
||||
private int mSkipCounter = 0;
|
||||
private int mSkipThreshold = 4;
|
||||
private int mErrorCorrection = 0;
|
||||
|
||||
public enum Mode
|
||||
{
|
||||
NORMAL,FAST;
|
||||
}
|
||||
|
||||
/**
|
||||
* Automatic Frequency Control. Monitors DC bias present in an FM
|
||||
* demodulated audio stream and issues automatic frequency corrections to
|
||||
* maintain the DC bias close to zero.
|
||||
*
|
||||
* @param maximum - maximum allowable (+/-) frequency correction value.
|
||||
*/
|
||||
public AutomaticFrequencyControl( int maximum )
|
||||
{
|
||||
super( maximum );
|
||||
}
|
||||
|
||||
public void dispose()
|
||||
{
|
||||
super.dispose();
|
||||
|
||||
mBuffer = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the error correction value to zero and broadcasts a change event
|
||||
*/
|
||||
public void reset()
|
||||
{
|
||||
mErrorCorrection = 0;
|
||||
mMode = Mode.FAST;
|
||||
dispatch();
|
||||
}
|
||||
|
||||
/**
|
||||
* Broadcasts a frequency correction change event to the registered listener
|
||||
*/
|
||||
private void dispatch()
|
||||
{
|
||||
if( mListener != null )
|
||||
{
|
||||
mListener.frequencyChanged(
|
||||
new FrequencyChangeEvent( Attribute.FREQUENCY_ERROR,
|
||||
mErrorCorrection ) );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void receive( float sample )
|
||||
{
|
||||
if( mMode == Mode.FAST )
|
||||
{
|
||||
float average = mBuffer.get( sample );
|
||||
|
||||
mSampleCounter++;
|
||||
|
||||
if( mSampleCounter >= SAMPLE_THRESHOLD )
|
||||
{
|
||||
mSampleCounter = 0;
|
||||
|
||||
update( average );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mSkipCounter++;
|
||||
|
||||
if( mSkipCounter >= mSkipThreshold )
|
||||
{
|
||||
mSkipCounter = 0;
|
||||
|
||||
float average = mBuffer.get( sample );
|
||||
|
||||
mSampleCounter++;
|
||||
|
||||
if( mSampleCounter >= SAMPLE_THRESHOLD )
|
||||
{
|
||||
mSampleCounter = 0;
|
||||
|
||||
update( average );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void update( float average )
|
||||
{
|
||||
mMode = Mode.NORMAL;
|
||||
|
||||
if( average > LARGE_ERROR )
|
||||
{
|
||||
adjust( -LARGE_FREQUENCY_CORRECTION );
|
||||
mMode = Mode.FAST;
|
||||
}
|
||||
else if( average > MEDIUM_ERROR )
|
||||
{
|
||||
adjust( -MEDIUM_FREQUENCY_CORRECTION );
|
||||
mMode = Mode.FAST;
|
||||
}
|
||||
else if( average > SMALL_ERROR )
|
||||
{
|
||||
adjust( -SMALL_FREQUENCY_CORRECTION );
|
||||
}
|
||||
else if( average > FINE_ERROR )
|
||||
{
|
||||
adjust( -FINE_FREQUENCY_CORRECTION );
|
||||
}
|
||||
else if( average < -LARGE_ERROR )
|
||||
{
|
||||
adjust( LARGE_FREQUENCY_CORRECTION );
|
||||
mMode = Mode.FAST;
|
||||
}
|
||||
else if( average < -MEDIUM_ERROR )
|
||||
{
|
||||
adjust( MEDIUM_FREQUENCY_CORRECTION );
|
||||
mMode = Mode.FAST;
|
||||
}
|
||||
else if( average < -SMALL_ERROR )
|
||||
{
|
||||
adjust( SMALL_FREQUENCY_CORRECTION );
|
||||
}
|
||||
else if( average < -FINE_ERROR )
|
||||
{
|
||||
adjust( FINE_FREQUENCY_CORRECTION );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,8 @@
|
||||
* 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;
|
||||
package source.tuner.frequency;
|
||||
|
||||
|
||||
public interface FrequencyChangeBroadcaster
|
||||
{
|
||||
@@ -1,4 +1,4 @@
|
||||
package source.tuner;
|
||||
package source.tuner.frequency;
|
||||
|
||||
public class FrequencyChangeEvent
|
||||
{
|
||||
@@ -12,9 +12,9 @@ public class FrequencyChangeEvent
|
||||
}
|
||||
|
||||
private Attribute mAttribute;
|
||||
private long mValue;
|
||||
private Number mValue;
|
||||
|
||||
public FrequencyChangeEvent( Attribute attribute, long value )
|
||||
public FrequencyChangeEvent( Attribute attribute, Number value )
|
||||
{
|
||||
mAttribute = attribute;
|
||||
mValue = value;
|
||||
@@ -25,10 +25,8 @@ public class FrequencyChangeEvent
|
||||
return mAttribute;
|
||||
}
|
||||
|
||||
public long getValue()
|
||||
public Number getValue()
|
||||
{
|
||||
return mValue;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -15,7 +15,8 @@
|
||||
* 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;
|
||||
package source.tuner.frequency;
|
||||
|
||||
|
||||
/**
|
||||
* Interface for broadcasting changes to frequency, bandwidth, sample rate,
|
||||
@@ -15,15 +15,20 @@
|
||||
* 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;
|
||||
package source.tuner.frequency;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import source.SourceException;
|
||||
import source.tuner.FrequencyChangeEvent.Attribute;
|
||||
import source.tuner.frequency.FrequencyChangeEvent.Attribute;
|
||||
|
||||
public class FrequencyController
|
||||
{
|
||||
private final static Logger mLog = LoggerFactory.getLogger( FrequencyController.class );
|
||||
|
||||
private Tunable mTunable;
|
||||
private long mFrequency = 101100000;
|
||||
private long mTunedFrequency = 101100000;
|
||||
@@ -167,6 +172,10 @@ public class FrequencyController
|
||||
/* Reset the frequency, but don't broadcast a change */
|
||||
setFrequency( mFrequency, false );
|
||||
}
|
||||
|
||||
broadcastFrequencyChangeEvent( new FrequencyChangeEvent(
|
||||
Attribute.SAMPLE_RATE_ERROR, mFrequencyCorrection ) );
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
164
src/source/tuner/frequency/FrequencyCorrectionControl.java
Normal file
164
src/source/tuner/frequency/FrequencyCorrectionControl.java
Normal file
@@ -0,0 +1,164 @@
|
||||
package source.tuner.frequency;
|
||||
|
||||
/*******************************************************************************
|
||||
* SDR Trunk
|
||||
* Copyright (C) 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 <http://www.gnu.org/licenses/>
|
||||
******************************************************************************/
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import source.tuner.frequency.FrequencyChangeEvent.Attribute;
|
||||
|
||||
/**
|
||||
* Frequency control for providing frequency error correction to a tuner channel
|
||||
*/
|
||||
public class FrequencyCorrectionControl implements FrequencyChangeListener
|
||||
{
|
||||
private final static Logger mLog =
|
||||
LoggerFactory.getLogger( FrequencyCorrectionControl.class );
|
||||
|
||||
protected FrequencyChangeListener mListener;
|
||||
protected FrequencyCorrectionResetListener mResetListener;
|
||||
|
||||
protected int mErrorCorrection = 0;
|
||||
private int mMaximumCorrection = 3000;
|
||||
|
||||
/**
|
||||
* Frequency correction controller.
|
||||
*
|
||||
* @param maximum - defines the maximum +/- allowable frequency correction
|
||||
* value
|
||||
*/
|
||||
public FrequencyCorrectionControl( int maximum )
|
||||
{
|
||||
mMaximumCorrection = maximum;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cleanup
|
||||
*/
|
||||
public void dispose()
|
||||
{
|
||||
mListener = null;
|
||||
mResetListener = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a listener to receive frequency correction events
|
||||
*/
|
||||
public void setListener( FrequencyChangeListener listener )
|
||||
{
|
||||
mListener = listener;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a listener to receive frequency correction resets
|
||||
*/
|
||||
public void setListener( FrequencyCorrectionResetListener listener )
|
||||
{
|
||||
mResetListener = listener;
|
||||
}
|
||||
|
||||
/**
|
||||
* Listener for source frequency or frequency offset value changes to
|
||||
* reset this frequency controller value to zero.
|
||||
*/
|
||||
@Override
|
||||
public void frequencyChanged( FrequencyChangeEvent event )
|
||||
{
|
||||
Attribute attribute = event.getAttribute();
|
||||
|
||||
if( attribute == Attribute.FREQUENCY ||
|
||||
attribute == Attribute.SAMPLE_RATE_ERROR )
|
||||
{
|
||||
reset();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets frequency correction value to zero and notifies any reset
|
||||
* listeners
|
||||
*/
|
||||
protected void reset()
|
||||
{
|
||||
setErrorCorrection( 0, false );
|
||||
|
||||
if( mResetListener != null )
|
||||
{
|
||||
mResetListener.resetFrequencyCorrection();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets frequency correction to the specified value and broadcasts a change
|
||||
*/
|
||||
public void setErrorCorrection( int correction )
|
||||
{
|
||||
setErrorCorrection( correction, true );
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets frequency correction to the specified value
|
||||
*/
|
||||
public void setErrorCorrection( int correction, boolean broadcast )
|
||||
{
|
||||
mErrorCorrection = correction;
|
||||
|
||||
/* Limit frequency correction to +/- max correction value */
|
||||
if( mErrorCorrection > mMaximumCorrection )
|
||||
{
|
||||
mErrorCorrection = mMaximumCorrection;
|
||||
}
|
||||
else if( mErrorCorrection < -mMaximumCorrection )
|
||||
{
|
||||
mErrorCorrection = -mMaximumCorrection;
|
||||
}
|
||||
|
||||
/* Broadcast a change event */
|
||||
if( broadcast && mListener != null )
|
||||
{
|
||||
mListener.frequencyChanged(
|
||||
new FrequencyChangeEvent( Attribute.FREQUENCY_ERROR,
|
||||
mErrorCorrection ) );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Increments the frequency error correction value by the specified adjustment
|
||||
*/
|
||||
public void adjust( int adjustment )
|
||||
{
|
||||
setErrorCorrection( getErrorCorrection() + adjustment );
|
||||
}
|
||||
|
||||
/**
|
||||
* Current frequency error correction value
|
||||
* @return
|
||||
*/
|
||||
public int getErrorCorrection()
|
||||
{
|
||||
return mErrorCorrection;
|
||||
}
|
||||
|
||||
/**
|
||||
* Listener interface to be notified when this control is reset to a zero
|
||||
* frequency correction value
|
||||
*/
|
||||
public interface FrequencyCorrectionResetListener
|
||||
{
|
||||
public void resetFrequencyCorrection();
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package source.tuner;
|
||||
package source.tuner.frequency;
|
||||
|
||||
public class FrequencyLimitException extends Exception
|
||||
{
|
||||
@@ -31,9 +31,9 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import source.SourceException;
|
||||
import source.tuner.FrequencyChangeEvent;
|
||||
import source.tuner.FrequencyChangeEvent.Attribute;
|
||||
import source.tuner.FrequencyChangeListener;
|
||||
import source.tuner.frequency.FrequencyChangeEvent;
|
||||
import source.tuner.frequency.FrequencyChangeListener;
|
||||
import source.tuner.frequency.FrequencyChangeEvent.Attribute;
|
||||
import source.tuner.hackrf.HackRFTunerController.BoardID;
|
||||
|
||||
import com.jidesoft.swing.JideTabbedPane;
|
||||
@@ -114,11 +114,11 @@ public class HackRFTunerEditorPanel extends JPanel
|
||||
{
|
||||
try
|
||||
{
|
||||
mController.setFrequency( event.getValue() );
|
||||
mController.setFrequency( event.getValue().longValue() );
|
||||
}
|
||||
catch ( SourceException e )
|
||||
{
|
||||
mLog.error( "error setting frequency [" + event.getValue() + "]", e );
|
||||
mLog.error( "error setting frequency [" + event.getValue().longValue() + "]", e );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,13 +28,13 @@ import org.usb4java.LibUsbException;
|
||||
import sample.Listener;
|
||||
import sample.complex.ComplexBuffer;
|
||||
import source.SourceException;
|
||||
import source.tuner.FrequencyChangeListener;
|
||||
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.frequency.FrequencyChangeListener;
|
||||
import source.tuner.rtl.RTL2832TunerController.SampleRate;
|
||||
import controller.ResourceManager;
|
||||
import controller.ThreadPoolManager;
|
||||
|
||||
@@ -55,8 +55,8 @@ import sample.Listener;
|
||||
import sample.adapter.ByteSampleAdapter;
|
||||
import sample.complex.ComplexBuffer;
|
||||
import source.SourceException;
|
||||
import source.tuner.FrequencyChangeEvent;
|
||||
import source.tuner.FrequencyChangeEvent.Attribute;
|
||||
import source.tuner.frequency.FrequencyChangeEvent;
|
||||
import source.tuner.frequency.FrequencyChangeEvent.Attribute;
|
||||
import source.tuner.TunerController;
|
||||
import source.tuner.TunerType;
|
||||
import buffer.FloatAveragingBuffer;
|
||||
|
||||
@@ -31,9 +31,9 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import source.SourceException;
|
||||
import source.tuner.FrequencyChangeEvent;
|
||||
import source.tuner.FrequencyChangeListener;
|
||||
import source.tuner.FrequencyChangeEvent.Attribute;
|
||||
import source.tuner.frequency.FrequencyChangeEvent;
|
||||
import source.tuner.frequency.FrequencyChangeListener;
|
||||
import source.tuner.frequency.FrequencyChangeEvent.Attribute;
|
||||
import source.tuner.rtl.RTL2832InfoPanel;
|
||||
|
||||
import com.jidesoft.swing.JideTabbedPane;
|
||||
@@ -100,7 +100,7 @@ public class E4KTunerEditorPanel extends JPanel implements FrequencyChangeListen
|
||||
{
|
||||
if( event.getAttribute() == Attribute.FREQUENCY )
|
||||
{
|
||||
final int frequency = (int)event.getValue();
|
||||
final long frequency = event.getValue().longValue();
|
||||
|
||||
EventQueue.invokeLater( new Runnable()
|
||||
{
|
||||
|
||||
@@ -31,9 +31,9 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import source.SourceException;
|
||||
import source.tuner.FrequencyChangeEvent;
|
||||
import source.tuner.FrequencyChangeListener;
|
||||
import source.tuner.FrequencyChangeEvent.Attribute;
|
||||
import source.tuner.frequency.FrequencyChangeEvent;
|
||||
import source.tuner.frequency.FrequencyChangeListener;
|
||||
import source.tuner.frequency.FrequencyChangeEvent.Attribute;
|
||||
import source.tuner.rtl.RTL2832InfoPanel;
|
||||
|
||||
import com.jidesoft.swing.JideTabbedPane;
|
||||
@@ -99,7 +99,7 @@ public class R820TTunerEditorPanel extends JPanel implements FrequencyChangeList
|
||||
{
|
||||
if( event.getAttribute() == Attribute.FREQUENCY )
|
||||
{
|
||||
final int frequency = (int)event.getValue();
|
||||
final long frequency = event.getValue().longValue();
|
||||
|
||||
EventQueue.invokeLater( new Runnable()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user