Decouples DecoderState from the Decoder and makes DecoderState inherit

from Module so that Decoder can function independent of DecoderSTate and
DecoderState can more cleanly interface with other modules. 

Resolves issue with LTR-type decoders where the AudioModule was
filtering demodulated audio buffers before the decoder received the
audio - demodulated audio buffers are now copied before creating
AudioPackets.
This commit is contained in:
denny
2015-09-26 05:45:34 -04:00
parent eb1c2fc7a1
commit 9c69733034
57 changed files with 885 additions and 480 deletions

View File

@@ -18,6 +18,7 @@
package module.decode.state;
import message.Message;
import module.decode.DecoderType;
import module.decode.state.DecoderStateEvent.Event;
import org.slf4j.Logger;
@@ -32,21 +33,18 @@ public class AlwaysUnsquelchedDecoderState extends DecoderState
private final static Logger mLog =
LoggerFactory.getLogger( AlwaysUnsquelchedDecoderState.class );
private String mProtocol;
private DecoderType mDecoderType;
public AlwaysUnsquelchedDecoderState( String protocol )
public AlwaysUnsquelchedDecoderState( DecoderType decoderType )
{
super( null );
mProtocol = protocol;
mDecoderType = decoderType;
}
@Override
public void init()
{
mLog.debug( "init() - broadcasting unsquelch event" );
broadcast( new DecoderStateEvent( this, Event.ALWAYS_UNSQUELCH, State.IDLE ) );
}
@Override
@@ -62,7 +60,7 @@ public class AlwaysUnsquelchedDecoderState extends DecoderState
sb.append( "Activity Summary\n" );
sb.append( "\tDecoder:\t" );
sb.append( mProtocol );
sb.append( mDecoderType );
sb.append( "\n\n" );
return sb.toString();
@@ -79,4 +77,21 @@ public class AlwaysUnsquelchedDecoderState extends DecoderState
{
/* Not implemented */
}
@Override
public DecoderType getDecoderType()
{
return mDecoderType;
}
@Override
public void start()
{
broadcast( new DecoderStateEvent( this, Event.ALWAYS_UNSQUELCH, State.IDLE ) );
}
@Override
public void stop()
{
}
}

View File

@@ -17,9 +17,9 @@ import settings.SettingsManager;
import controller.channel.Channel;
/**
* Channel Collection assembles a primary channel panel and any related traffic
* channel panels, provides contextual access to the primary channel and
* supports channel selection for the primary or any traffic channels.
* Channel Collection assembles a primary channel panel and any related decoder
* state panels, provides contextual access to the channel and supports channel
* selection.
*/
public class ChannelCollectionPanel extends JPanel
{

View File

@@ -79,7 +79,7 @@ public class ChannelState extends Module implements ICallEventProvider,
private final static Logger mLog =
LoggerFactory.getLogger( ChannelState.class );
public static final long FADE_TIMEOUT_DELAY = 1000;
public static final long FADE_TIMEOUT_DELAY = 1200;
public static final long RESET_TIMEOUT_DELAY = 2000;
private State mState = State.IDLE;
@@ -165,9 +165,7 @@ public class ChannelState extends Module implements ICallEventProvider,
private boolean isEndingState()
{
return mState == State.IDLE ||
mState == State.FADE ||
mState == State.END;
return mState == State.FADE || mState == State.END;
}
@@ -391,13 +389,13 @@ public class ChannelState extends Module implements ICallEventProvider,
}
@Override
public void setCallEventListener( Listener<CallEvent> listener )
public void addCallEventListener( Listener<CallEvent> listener )
{
mCallEventListener = listener;
}
@Override
public void removeCallEventListener()
public void removeCallEventListener( Listener<CallEvent> listener )
{
mCallEventListener = null;
}

View File

@@ -103,9 +103,9 @@ public class ChannelStatePanel extends JPanel
init();
for( Decoder decoder: getChannel().getProcessingChain().getDecoders() )
for( DecoderState decoderState: getChannel().getProcessingChain().getDecoderStates() )
{
DecoderPanel panel = DecoderFactory.getDecoderPanel( mSettingsManager, decoder );
DecoderPanel panel = DecoderFactory.getDecoderPanel( mSettingsManager, decoderState );
mDecoderPanels.add( panel );
add( panel, "grow,span" );
}
@@ -447,9 +447,9 @@ public class ChannelStatePanel extends JPanel
{
StringBuilder sb = new StringBuilder();
for( Decoder decoder: mChannel.getProcessingChain().getDecoders() )
for( DecoderState decoderState: mChannel.getProcessingChain().getDecoderStates() )
{
sb.append( decoder.getDecoderState().getActivitySummary() );
sb.append( decoderState.getActivitySummary() );
}
new ActivitySummaryFrame( sb.toString(), ChannelStatePanel.this );

View File

@@ -23,14 +23,13 @@ import java.awt.Font;
import javax.swing.JLabel;
import javax.swing.JPanel;
import alias.Alias;
import module.decode.Decoder;
import sample.Listener;
import settings.ColorSetting;
import settings.ColorSetting.ColorSettingName;
import settings.Setting;
import settings.SettingChangeListener;
import settings.SettingsManager;
import alias.Alias;
public abstract class DecoderPanel extends JPanel
implements Listener<ChangedAttribute>, SettingChangeListener
@@ -47,16 +46,16 @@ public abstract class DecoderPanel extends JPanel
protected Color mColorLabelAuxDecoder;
protected SettingsManager mSettingsManager;
protected Decoder mDecoder;
protected DecoderState mDecoderState;
public DecoderPanel( SettingsManager settingsManager, Decoder decoder )
public DecoderPanel( SettingsManager settingsManager, DecoderState decoderState )
{
mSettingsManager = settingsManager;
mSettingsManager.addListener( this );
mDecoder = decoder;
mDecoderState = decoderState;
mDecoder.getDecoderState().setChangedAttributeListener( this );
mDecoderState.setChangedAttributeListener( this );
}
public void dispose()
@@ -64,13 +63,13 @@ public abstract class DecoderPanel extends JPanel
mSettingsManager.removeListener( this );
mSettingsManager = null;
mDecoder.getDecoderState().removeChangedAttributeListener();
mDecoder = null;
mDecoderState.removeChangedAttributeListener();
mDecoderState = null;
}
public Decoder getDecoder()
public DecoderState getDecoderState()
{
return mDecoder;
return mDecoderState;
}
protected void init()

View File

@@ -1,11 +1,21 @@
package module.decode.state;
import message.IMessageListener;
import message.Message;
import module.Module;
import module.decode.DecoderType;
import module.decode.event.ActivitySummaryProvider;
import module.decode.event.CallEvent;
import module.decode.event.ICallEventProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sample.Broadcaster;
import sample.Listener;
import alias.AliasList;
import audio.metadata.IMetadataProvider;
import audio.metadata.Metadata;
/**
* Channel state monitors the stream of decoded messages produced by the
@@ -13,16 +23,23 @@ import alias.AliasList;
*
* Provides access to a textual activity summary of events observed.
*/
public abstract class DecoderState implements ActivitySummaryProvider,
Listener<Message>,
ICallEventProvider,
IChangedAttributeProvider,
IDecoderStateEventListener,
IDecoderStateEventProvider
public abstract class DecoderState extends Module
implements ActivitySummaryProvider,
Listener<Message>,
ICallEventProvider,
IChangedAttributeProvider,
IDecoderStateEventListener,
IDecoderStateEventProvider,
IMessageListener,
IMetadataProvider
{
private Listener<CallEvent> mCallEventListener;
private final static Logger mLog = LoggerFactory.getLogger( DecoderState.class );
/* This has to be a broadcaster in order for references to persist */
private Broadcaster<CallEvent> mCallEventBroadcaster = new Broadcaster<>();
private Listener<ChangedAttribute> mChangedAttributeListener;
private Listener<DecoderStateEvent> mDecoderStateListener;
private Listener<Metadata> mMetadataListener;
private DecoderStateEventListener mDecoderStateEventListener =
new DecoderStateEventListener();
@@ -36,6 +53,8 @@ public abstract class DecoderState implements ActivitySummaryProvider,
mAliasList = aliasList;
}
public abstract DecoderType getDecoderType();
public AliasList getAliasList()
{
return mAliasList;
@@ -69,9 +88,11 @@ public abstract class DecoderState implements ActivitySummaryProvider,
*/
public void dispose()
{
mCallEventListener = null;
mCallEventBroadcaster.dispose();
mCallEventBroadcaster = null;
mChangedAttributeListener = null;
mDecoderStateListener = null;
mMetadataListener = null;
mAliasList = null;
}
@@ -86,28 +107,25 @@ public abstract class DecoderState implements ActivitySummaryProvider,
*/
protected void broadcast( CallEvent event )
{
if( mCallEventListener != null )
{
mCallEventListener.receive( event );
}
mCallEventBroadcaster.broadcast( event );
}
/**
* Adds a call event listener
*/
@Override
public void setCallEventListener( Listener<CallEvent> listener )
public void addCallEventListener( Listener<CallEvent> listener )
{
mCallEventListener = listener;
mCallEventBroadcaster.addListener( listener );
}
/**
* Removes the call event listener
*/
@Override
public void removeCallEventListener()
public void removeCallEventListener( Listener<CallEvent> listener )
{
mCallEventListener = null;
mCallEventBroadcaster.removeListener( listener );
}
@Override
@@ -183,4 +201,33 @@ public abstract class DecoderState implements ActivitySummaryProvider,
{
mDecoderStateListener = null;
}
/**
* Broadcasts metadata to a registered listener
*/
protected void broadcast( Metadata metadata )
{
if( mMetadataListener != null )
{
mMetadataListener.receive( metadata );
}
}
@Override
public void setMetadataListener( Listener<Metadata> listener )
{
mMetadataListener = listener;
}
@Override
public void removeMetadataListener()
{
mMetadataListener = null;
}
@Override
public Listener<Message> getMessageListener()
{
return this;
}
}

View File

@@ -21,6 +21,18 @@ public class DecoderStateEvent
mFrequency = frequency;
}
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append( "Decoder State Event - source[" + mSource.getClass() +
"] event[" + mEvent.toString() +
"] state[" + mState.toString() +
"] frequency [" + mFrequency + "]" );
return sb.toString();
}
public Object getSource()
{
return mSource;

View File

@@ -315,13 +315,13 @@ public class TrafficChannelManager extends Module
}
@Override
public void setCallEventListener( Listener<CallEvent> listener )
public void addCallEventListener( Listener<CallEvent> listener )
{
mCallEventListener = listener;
}
@Override
public void removeCallEventListener()
public void removeCallEventListener( Listener<CallEvent> listener )
{
mCallEventListener = null;
}