Adds event logging, code cleanup and some decoder issue resolution.

This commit is contained in:
denny
2015-09-02 19:41:44 -04:00
parent f4d8ea281d
commit 0f85b7260a
124 changed files with 469 additions and 1416 deletions

View File

@@ -18,6 +18,12 @@ public class C4FMSlicer implements RealSampleListener
private Broadcaster<Dibit> mBroadcaster = new Broadcaster<Dibit>();
public void dispose()
{
mBroadcaster.dispose();
mBroadcaster = null;
}
/**
* Primary method for receiving output from the C4FMSymbolFilter. Slices
* (converts) the filtered sample value into a C4FMSymbol decision.

View File

@@ -229,6 +229,13 @@ public class C4FMSymbolFilter implements FrequencyCorrectionResetListener,
mFrequencyCorrectionControl.setListener( this );
}
public void dispose()
{
mGainController = null;
mFrequencyCorrectionControl = null;
mListener = null;
}
@Override
public void receive( float sample )
{

View File

@@ -19,6 +19,14 @@ public abstract class P25Decoder extends Decoder
mMessageProcessor = new P25MessageProcessor( aliasList );
mMessageProcessor.setMessageListener( mMessageBroadcaster );
}
public void dispose()
{
super.dispose();
mMessageProcessor.dispose();
mMessageProcessor = null;
}
@Override
public DecoderType getDecoderType()

View File

@@ -21,10 +21,9 @@ import java.awt.EventQueue;
import javax.swing.JLabel;
import net.miginfocom.swing.MigLayout;
import module.decode.state.ChangedAttribute;
import module.decode.state.DecoderPanel;
import module.decode.state.State;
import net.miginfocom.swing.MigLayout;
import settings.ColorSetting;
import settings.Setting;
import settings.SettingsManager;
@@ -168,6 +167,8 @@ public class P25DecoderPanel extends DecoderPanel
mToAlias.setIcon( null );
}
break;
default:
break;
}
repaint();

View File

@@ -2264,43 +2264,45 @@ public class P25DecoderState extends DecoderState
{
switch( message.getOpcode() )
{
case GROUP_DATA_CHANNEL_ANNOUNCEMENT:
GroupDataChannelAnnouncement gdca = (GroupDataChannelAnnouncement)message;
broadcast( new P25CallEvent.Builder( CallEventType.ANNOUNCEMENT )
.aliasList( getAliasList() )
.channel( gdca.getChannel1() )
.details( ( gdca.isEncrypted() ? "ENCRYPTED" : "" ) +
( gdca.isEmergency() ? " EMERGENCY" : "") )
.frequency( gdca.getDownlinkFrequency1() )
.to( gdca.getGroupAddress1() )
.build() );
if( gdca.hasChannelNumber2() )
{
case GROUP_DATA_CHANNEL_ANNOUNCEMENT:
GroupDataChannelAnnouncement gdca = (GroupDataChannelAnnouncement)message;
broadcast( new P25CallEvent.Builder( CallEventType.ANNOUNCEMENT )
.aliasList( getAliasList() )
.channel( gdca.getChannel2() )
.channel( gdca.getChannel1() )
.details( ( gdca.isEncrypted() ? "ENCRYPTED" : "" ) +
( gdca.isEmergency() ? " EMERGENCY" : "") )
.frequency( gdca.getDownlinkFrequency2() )
.to( gdca.getGroupAddress2() )
.frequency( gdca.getDownlinkFrequency1() )
.to( gdca.getGroupAddress1() )
.build() );
}
break;
case GROUP_DATA_CHANNEL_ANNOUNCEMENT_EXPLICIT:
GroupDataChannelAnnouncementExplicit gdcae =
(GroupDataChannelAnnouncementExplicit)message;
broadcast( new P25CallEvent.Builder( CallEventType.DATA_CALL )
.aliasList( getAliasList() )
.channel( gdcae.getTransmitChannel() )
.details( ( gdcae.isEncrypted() ? "ENCRYPTED" : "" ) +
( gdcae.isEmergency() ? " EMERGENCY" : "") )
.frequency( gdcae.getDownlinkFrequency() )
.to( gdcae.getGroupAddress() )
.build() );
break;
if( gdca.hasChannelNumber2() )
{
broadcast( new P25CallEvent.Builder( CallEventType.ANNOUNCEMENT )
.aliasList( getAliasList() )
.channel( gdca.getChannel2() )
.details( ( gdca.isEncrypted() ? "ENCRYPTED" : "" ) +
( gdca.isEmergency() ? " EMERGENCY" : "") )
.frequency( gdca.getDownlinkFrequency2() )
.to( gdca.getGroupAddress2() )
.build() );
}
break;
case GROUP_DATA_CHANNEL_ANNOUNCEMENT_EXPLICIT:
GroupDataChannelAnnouncementExplicit gdcae =
(GroupDataChannelAnnouncementExplicit)message;
broadcast( new P25CallEvent.Builder( CallEventType.DATA_CALL )
.aliasList( getAliasList() )
.channel( gdcae.getTransmitChannel() )
.details( ( gdcae.isEncrypted() ? "ENCRYPTED" : "" ) +
( gdcae.isEmergency() ? " EMERGENCY" : "") )
.frequency( gdcae.getDownlinkFrequency() )
.to( gdcae.getGroupAddress() )
.build() );
break;
default:
break;
}
}

View File

@@ -31,7 +31,6 @@ import bits.MultiSyncPatternMatcher;
import bits.SoftSyncDetector;
import bits.SyncDetector;
import dsp.psk.CQPSKDemodulator;
import dsp.psk.CQPSKDemodulator2;
import dsp.symbol.Dibit;
import dsp.symbol.FrameSync;
import edac.BCH_63_16_11;
@@ -47,20 +46,12 @@ public class P25MessageFramer implements Listener<Dibit>
private static final int SYNC_MATCH_THRESHOLD = 2;
private static final int SYNC_IN_CALL_THRESHOLD = 4;
private SoftSyncDetector mPrimarySyncDetector = new SoftSyncDetector(
FrameSync.P25_PHASE1_NORMAL.getSync(), SYNC_MATCH_THRESHOLD );
/* Costas Loop phase lock error correction values. A phase lock error of
* 90 degrees requires a correction of 1/4 of the symbol rate (1200Hz). An
* error of 180 degrees requires a correction of 1/2 of the symbol rate */
public static final double SYMBOL_FREQUENCY = 2.0d * Math.PI * 4800.0d / 48000.0d;
public static final double PHASE_CORRECTION_90_DEGREES = SYMBOL_FREQUENCY / 4.0d;
public static final double PHASE_CORRECTION_180_DEGREES = SYMBOL_FREQUENCY / 2.0d;
private MultiSyncPatternMatcher mMatcher = new MultiSyncPatternMatcher( 48 );
private ArrayList<P25MessageAssembler> mAssemblers =
new ArrayList<P25MessageAssembler>();
public static final int TSBK_BEGIN = 64;
public static final int TSBK_CRC_START = 144;
public static final int TSBK_END = 260;
@@ -77,6 +68,13 @@ public class P25MessageFramer implements Listener<Dibit>
public static final int PDU3_END = 548;
public static final int PDU3_DECODED_END = 448;
private SoftSyncDetector mPrimarySyncDetector = new SoftSyncDetector(
FrameSync.P25_PHASE1_NORMAL.getSync(), SYNC_MATCH_THRESHOLD );
private MultiSyncPatternMatcher mMatcher = new MultiSyncPatternMatcher( 48 );
private ArrayList<P25MessageAssembler> mAssemblers =
new ArrayList<P25MessageAssembler>();
private Listener<Message> mListener;
private AliasList mAliasList;
@@ -143,6 +141,26 @@ public class P25MessageFramer implements Listener<Dibit>
}
}
public void dispose()
{
for( P25MessageAssembler a: mAssemblers )
{
a.dispose();
}
mAssemblers.clear();
mListener = null;
mAliasList = null;
mMatcher.dispose();
mMatcher = null;
mPrimarySyncDetector.dispose();
mPrimarySyncDetector = null;
}
private void dispatch( Message message )
{
if( mListener != null )

View File

@@ -10,7 +10,6 @@ import module.decode.p25.message.ldu.LDUMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sample.Broadcaster;
import sample.Listener;
import alias.AliasList;

View File

@@ -110,6 +110,33 @@ public class P25_C4FMDecoder extends P25Decoder implements IRealBufferListener
/* Process and broadcast messages */
mMessageFramer.setListener( getMessageProcessor() );
}
@Override
public void dispose()
{
super.dispose();
mC4FMPreFilter.dispose();
mC4FMPreFilter = null;
mDGC.dispose();
mDGC = null;
mStreamConverter.dispose();
mStreamConverter = null;
mFrequencyCorrectionControl.dispose();
mFrequencyCorrectionControl = null;
mSymbolFilter.dispose();
mSymbolFilter = null;
mMessageFramer.dispose();
mMessageFramer = null;
mC4FMSlicer.dispose();
mC4FMSlicer = null;
}
public Modulation getModulation()
{

View File

@@ -21,7 +21,6 @@ import instrument.tap.Tap;
import instrument.tap.stream.ComplexSampleTap;
import instrument.tap.stream.ComplexTap;
import instrument.tap.stream.DibitTap;
import instrument.tap.stream.FloatTap;
import instrument.tap.stream.QPSKTap;
import java.util.ArrayList;
@@ -30,13 +29,13 @@ import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import controller.channel.Channel.ChannelType;
import sample.Listener;
import sample.complex.ComplexBuffer;
import sample.complex.ComplexBufferToStreamConverter;
import sample.complex.IComplexBufferListener;
import source.tuner.frequency.FrequencyCorrectionControl;
import alias.AliasList;
import controller.channel.Channel.ChannelType;
import dsp.filter.FilterFactory;
import dsp.filter.Window.WindowType;
import dsp.filter.fir.complex.ComplexFIRFilter_CB_CB;
@@ -88,6 +87,29 @@ public class P25_LSMDecoder extends P25Decoder implements IComplexBufferListener
mMessageFramer.setListener( getMessageProcessor() );
}
public void dispose()
{
super.dispose();
mBasebandFilter.dispose();
mBasebandFilter = null;
mStreamConverter.dispose();
mStreamConverter = null;
mAGC.dispose();
mAGC = null;
mCQPSKDemodulator.dispose();
mCQPSKDemodulator = null;
mCQPSKSlicer.dispose();
mCQPSKSlicer = null;
mMessageFramer.dispose();
mMessageFramer = null;
}
@Override
public Listener<ComplexBuffer> getComplexBufferListener()
{

View File

@@ -67,35 +67,35 @@ public class Trellis_1_2_Rate
mConstellationNodes.clear();
}
private String constellationsToString( String label )
{
StringBuilder sb = new StringBuilder();
sb.append( label );
for( ConstellationNode node: mConstellationNodes )
{
sb.append( " " + node.getConstellation().name() );
}
return sb.toString();
}
private String inputsToString()
{
StringBuilder sb = new StringBuilder();
sb.append( " INPUTS: " );
for( ConstellationNode node: mConstellationNodes )
{
sb.append( " " );
sb.append( ( node.getConstellation().getInput().getBit1() ? "1" : "0" ) );
sb.append( ( node.getConstellation().getInput().getBit2() ? "1" : "0" ) );
}
return sb.toString();
}
// private String constellationsToString( String label )
// {
// StringBuilder sb = new StringBuilder();
//
// sb.append( label );
//
// for( ConstellationNode node: mConstellationNodes )
// {
// sb.append( " " + node.getConstellation().name() );
// }
//
// return sb.toString();
// }
//
// private String inputsToString()
// {
// StringBuilder sb = new StringBuilder();
//
// sb.append( " INPUTS: " );
//
// for( ConstellationNode node: mConstellationNodes )
// {
// sb.append( " " );
// sb.append( ( node.getConstellation().getInput().getBit1() ? "1" : "0" ) );
// sb.append( ( node.getConstellation().getInput().getBit2() ? "1" : "0" ) );
// }
//
// return sb.toString();
// }
public boolean decode( BinaryMessage message, int start, int end )
{

View File

@@ -5,7 +5,6 @@ import java.util.List;
import message.Message;
import module.decode.p25.message.hdu.HDUMessage;
import module.decode.p25.message.tdu.lc.TDULinkControlMessage;
import filter.Filter;
import filter.FilterElement;

View File

@@ -4,7 +4,6 @@ import java.util.Collections;
import java.util.List;
import message.Message;
import module.decode.p25.message.tdu.TDUMessage;
import module.decode.p25.message.tdu.lc.TDULinkControlMessage;
import filter.Filter;
import filter.FilterElement;

View File

@@ -2,8 +2,6 @@ package module.decode.p25.message.ldu.lc;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.P25Message.DuplexMode;
import module.decode.p25.message.P25Message.SessionMode;
import module.decode.p25.message.ldu.LDU1Message;
import module.decode.p25.reference.LinkControlOpcode;

View File

@@ -1,7 +1,5 @@
package module.decode.p25.message.ldu.lc;
import module.decode.p25.message.P25Message.DuplexMode;
import module.decode.p25.message.P25Message.SessionMode;
import module.decode.p25.message.ldu.LDU1Message;
import module.decode.p25.reference.LinkControlOpcode;

View File

@@ -1,7 +1,5 @@
package module.decode.p25.message.ldu.lc;
import module.decode.p25.message.P25Message.DuplexMode;
import module.decode.p25.message.P25Message.SessionMode;
import module.decode.p25.message.ldu.LDU1Message;
import module.decode.p25.reference.LinkControlOpcode;

View File

@@ -1,7 +1,5 @@
package module.decode.p25.message.ldu.lc;
import module.decode.p25.message.P25Message.DuplexMode;
import module.decode.p25.message.P25Message.SessionMode;
import module.decode.p25.message.ldu.LDU1Message;
import module.decode.p25.reference.LinkControlOpcode;

View File

@@ -3,7 +3,6 @@ package module.decode.p25.message.pdu;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.reference.DataUnitID;
import module.decode.p25.reference.Opcode;
import alias.AliasList;
import bits.BinaryMessage;
import edac.CRCP25;

View File

@@ -1,20 +1,10 @@
package module.decode.p25.message.pdu.confirmed;
import module.decode.p25.message.pdu.PDUMessage;
import module.decode.p25.reference.DataUnitID;
import module.decode.p25.reference.MDPConfigurationOption;
import module.decode.p25.reference.PDUType;
import module.decode.p25.reference.SNDCPActivationRejectReason;
import module.decode.p25.reference.Vendor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import alias.AliasList;
import bits.BinaryMessage;
import edac.CRC;
import edac.CRCP25;
public class SNDCPActivateTDSContextAccept extends PDUConfirmedMessage
{
public final static Logger mLog =

View File

@@ -1,7 +1,6 @@
package module.decode.p25.message.pdu.confirmed;
import module.decode.p25.reference.PDUType;
import module.decode.p25.reference.SNDCPActivationRejectReason;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@@ -1,7 +1,5 @@
package module.decode.p25.message.pdu.osp.data;
import java.util.Date;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.pdu.PDUMessage;

View File

@@ -2,7 +2,6 @@ package module.decode.p25.message.tdu.lc;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.tsbk.osp.control.SystemService;
import module.decode.p25.reference.LinkControlOpcode;
import module.decode.p25.reference.Service;

View File

@@ -1,6 +1,5 @@
package module.decode.p25.message.tdu.lc;
import module.decode.p25.message.tsbk.osp.control.SystemService;
import module.decode.p25.reference.LinkControlOpcode;
import org.slf4j.Logger;

View File

@@ -2,8 +2,6 @@ package module.decode.p25.message.tdu.lc;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.P25Message.DuplexMode;
import module.decode.p25.message.P25Message.SessionMode;
import module.decode.p25.reference.LinkControlOpcode;
import org.slf4j.Logger;

View File

@@ -3,7 +3,6 @@ package module.decode.p25.message.tdu.lc;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.reference.LinkControlOpcode;
import module.decode.p25.reference.Service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@@ -149,22 +149,22 @@ public abstract class GroupMultiChannelGrant extends ChannelGrant
public long getDownlinkFrequency1()
{
return calculateDownlink( mIdentifierUpdate1, getChannelNumber() );
return calculateDownlink( mIdentifierUpdate1, getChannelNumber1() );
}
public long getUplinkFrequency1()
{
return calculateUplink( mIdentifierUpdate1, getChannelNumber() );
return calculateUplink( mIdentifierUpdate1, getChannelNumber1() );
}
public long getDownlinkFrequency2()
{
return calculateDownlink( mIdentifierUpdate2, getChannelNumber() );
return calculateDownlink( mIdentifierUpdate2, getChannelNumber2() );
}
public long getUplinkFrequency2()
{
return calculateUplink( mIdentifierUpdate2, getChannelNumber() );
return calculateUplink( mIdentifierUpdate2, getChannelNumber2() );
}
}

View File

@@ -1,6 +1,5 @@
package module.decode.p25.message.tsbk.motorola;
import module.decode.p25.message.tsbk.TSBKMessage;
import module.decode.p25.reference.DataUnitID;
import alias.AliasList;
import bits.BinaryMessage;

View File

@@ -3,7 +3,6 @@ package module.decode.p25.message.tsbk.osp.control;
import module.decode.p25.message.tsbk.TSBKMessage;
import module.decode.p25.reference.DataUnitID;
import module.decode.p25.reference.Opcode;
import module.decode.p25.reference.Response;
import module.decode.p25.reference.StackOperation;
import alias.AliasList;
import bits.BinaryMessage;

View File

@@ -3,7 +3,6 @@ package module.decode.p25.message.tsbk.osp.control;
import module.decode.p25.message.tsbk.TSBKMessage;
import module.decode.p25.reference.DataUnitID;
import module.decode.p25.reference.Opcode;
import module.decode.p25.reference.Response;
import alias.AliasList;
import bits.BinaryMessage;

View File

@@ -1,7 +1,6 @@
package module.decode.p25.message.tsbk.osp.voice;
import module.decode.p25.message.tsbk.UnitChannelGrant;
import module.decode.p25.message.tsbk.osp.control.IdentifierUpdate;
import module.decode.p25.reference.DataUnitID;
import module.decode.p25.reference.Opcode;
import alias.AliasList;