P25 work in progress

This commit is contained in:
dennis.sheirer
2014-12-23 22:43:55 +00:00
parent d15ff407bd
commit 86cb5b2f4b
20 changed files with 865 additions and 266 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -19,6 +19,7 @@ package decode.p25;
import instrument.Instrumentable;
import instrument.tap.Tap;
import instrument.tap.stream.DibitTap;
import instrument.tap.stream.FloatTap;
import java.util.ArrayList;
@@ -36,9 +37,9 @@ import dsp.agc.RealAutomaticGainControl;
import dsp.filter.ComplexFIRFilter;
import dsp.filter.FilterFactory;
import dsp.filter.Window.WindowType;
import dsp.fsk.P25MessageFramer;
import dsp.fsk.C4FMSlicer;
import dsp.fsk.C4FMSymbolFilter;
import dsp.fsk.P25MessageFramer;
import dsp.nbfm.FMDiscriminator;
public class P25Decoder extends Decoder implements Instrumentable
@@ -49,6 +50,7 @@ public class P25Decoder extends Decoder implements Instrumentable
private static final String INSTRUMENT_INPUT_TO_AGC = "Tap Point: Input to AGC";
private static final String INSTRUMENT_AGC_TO_SYMBOL_FILTER = "Tap Point: AGC to Symbol Filter";
private static final String INSTRUMENT_SYMBOL_FILTER_TO_SLICER = "Tap Point: Symbol Filter to Slicer";
private static final String INSTRUMENT_SLICER_OUTPUT = "Tap Point: Slicer Output";
private List<Tap> mAvailableTaps;
private ComplexFIRFilter mBasebandFilter = new ComplexFIRFilter(
@@ -125,6 +127,7 @@ public class P25Decoder extends Decoder implements Instrumentable
mAvailableTaps.add( new FloatTap( INSTRUMENT_INPUT_TO_AGC, 0, 1.0f ) );
mAvailableTaps.add( new FloatTap( INSTRUMENT_AGC_TO_SYMBOL_FILTER, 0, 1.0f ) );
mAvailableTaps.add( new FloatTap( INSTRUMENT_SYMBOL_FILTER_TO_SLICER, 0, 0.1f ) );
mAvailableTaps.add( new DibitTap( INSTRUMENT_SLICER_OUTPUT, 0, 0.1f ) );
mAvailableTaps.addAll( mSymbolFilter.getTaps() );
}
@@ -155,6 +158,10 @@ public class P25Decoder extends Decoder implements Instrumentable
mSymbolFilter.setListener( symbolSlicer );
symbolSlicer.setListener( mSlicer );
break;
case INSTRUMENT_SLICER_OUTPUT:
DibitTap slicer = (DibitTap)tap;
mSlicer.addListener( slicer );
break;
}
}
@@ -176,6 +183,10 @@ public class P25Decoder extends Decoder implements Instrumentable
case INSTRUMENT_SYMBOL_FILTER_TO_SLICER:
mSymbolFilter.setListener( mSlicer );
break;
case INSTRUMENT_SLICER_OUTPUT:
DibitTap slicerTap = (DibitTap)tap;
mSlicer.removeListener( slicerTap );
break;
}
}

View File

@@ -0,0 +1,44 @@
package decode.p25.message.hdu;
import alias.AliasList;
import bits.BitSetBuffer;
import crc.CRC;
import decode.p25.message.P25Message;
import decode.p25.reference.DataUnitID;
public class HDUMessage extends P25Message
{
public HDUMessage( BitSetBuffer message, DataUnitID duid,
AliasList aliasList )
{
super( message, duid, aliasList );
/* NID CRC is checked in the message framer, thus a constructed message
* means it passed the CRC */
mCRC = new CRC[ 2 ];
mCRC[ 0 ] = CRC.PASSED;
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( "NAC:" );
sb.append( getNAC() );
sb.append( " " );
sb.append( getDUID().getLabel() );
sb.append( " " );
sb.append( mMessage.toString() );
return sb.toString();
}
/* Temporary override */
public boolean isValid()
{
return true;
}
}

View File

@@ -0,0 +1,44 @@
package decode.p25.message.ldu;
import alias.AliasList;
import bits.BitSetBuffer;
import crc.CRC;
import decode.p25.message.P25Message;
import decode.p25.reference.DataUnitID;
public class LDU1Message extends P25Message
{
public LDU1Message( BitSetBuffer message, DataUnitID duid,
AliasList aliasList )
{
super( message, duid, aliasList );
/* NID CRC is checked in the message framer, thus a constructed message
* means it passed the CRC */
mCRC = new CRC[ 2 ];
mCRC[ 0 ] = CRC.PASSED;
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( "NAC:" );
sb.append( getNAC() );
sb.append( " " );
sb.append( getDUID().getLabel() );
sb.append( " " );
sb.append( mMessage.toString() );
return sb.toString();
}
/* Temporary override */
public boolean isValid()
{
return true;
}
}

View File

@@ -0,0 +1,44 @@
package decode.p25.message.ldu;
import alias.AliasList;
import bits.BitSetBuffer;
import crc.CRC;
import decode.p25.message.P25Message;
import decode.p25.reference.DataUnitID;
public class LDU2Message extends P25Message
{
public LDU2Message( BitSetBuffer message, DataUnitID duid,
AliasList aliasList )
{
super( message, duid, aliasList );
/* NID CRC is checked in the message framer, thus a constructed message
* means it passed the CRC */
mCRC = new CRC[ 2 ];
mCRC[ 0 ] = CRC.PASSED;
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( "NAC:" );
sb.append( getNAC() );
sb.append( " " );
sb.append( getDUID().getLabel() );
sb.append( " " );
sb.append( mMessage.toString() );
return sb.toString();
}
/* Temporary override */
public boolean isValid()
{
return true;
}
}

View File

@@ -92,7 +92,7 @@ public abstract class UnitToUnitChannelGrantExtended extends PDUMessage
return mMessage.get( EMERGENCY_FLAG );
}
public boolean isEncryptedChannel()
public boolean isEncrypted()
{
return mMessage.get( ENCRYPTED_CHANNEL_FLAG );
}

View File

@@ -86,7 +86,7 @@ public class GroupDataChannelGrantExtended extends PDUMessage
return mMessage.get( EMERGENCY_FLAG );
}
public boolean isEncryptedChannel()
public boolean isEncrypted()
{
return mMessage.get( ENCRYPTED_CHANNEL_FLAG );
}

View File

@@ -84,7 +84,7 @@ public class GroupVoiceChannelGrantExplicit extends PDUMessage
return mMessage.get( EMERGENCY_FLAG );
}
public boolean isEncryptedChannel()
public boolean isEncrypted()
{
return mMessage.get( ENCRYPTED_CHANNEL_FLAG );
}

View File

@@ -99,7 +99,7 @@ public class UnitToUnitVoiceChannelGrantUpdateExtended extends PDUMessage
return mMessage.get( EMERGENCY_FLAG );
}
public boolean isEncryptedChannel()
public boolean isEncrypted()
{
return mMessage.get( ENCRYPTED_CHANNEL_FLAG );
}

View File

@@ -0,0 +1,44 @@
package decode.p25.message.tdu;
import alias.AliasList;
import bits.BitSetBuffer;
import crc.CRC;
import decode.p25.message.P25Message;
import decode.p25.reference.DataUnitID;
public class TDULCMessage extends P25Message
{
public TDULCMessage( BitSetBuffer message, DataUnitID duid,
AliasList aliasList )
{
super( message, duid, aliasList );
/* NID CRC is checked in the message framer, thus a constructed message
* means it passed the CRC */
mCRC = new CRC[ 2 ];
mCRC[ 0 ] = CRC.PASSED;
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( "NAC:" );
sb.append( getNAC() );
sb.append( " " );
sb.append( getDUID().getLabel() );
sb.append( " " );
sb.append( mMessage.toString() );
return sb.toString();
}
/* Temporary override */
public boolean isValid()
{
return true;
}
}

View File

@@ -20,6 +20,7 @@ import decode.p25.message.tsbk.osp.control.LocationRegistrationResponse;
import decode.p25.message.tsbk.osp.control.MessageUpdate;
import decode.p25.message.tsbk.osp.control.NetworkStatusBroadcast;
import decode.p25.message.tsbk.osp.control.ProtectionParameterUpdate;
import decode.p25.message.tsbk.osp.control.QueuedResponse;
import decode.p25.message.tsbk.osp.control.RFSSStatusBroadcast;
import decode.p25.message.tsbk.osp.control.RadioUnitMonitorCommand;
import decode.p25.message.tsbk.osp.control.RoamingAddressCommand;
@@ -125,6 +126,8 @@ public class TSBKMessageFactory
case NETWORK_STATUS_BROADCAST:
return new NetworkStatusBroadcast( message, duid,
aliasList );
case QUEUED_RESPONSE:
return new QueuedResponse( message, duid, aliasList );
case PROTECTION_PARAMETER_UPDATE:
return new ProtectionParameterUpdate( message, duid,
aliasList );

View File

@@ -55,6 +55,19 @@ public class AuthenticationCommand extends TSBKMessage
{
return mMessage.getHex( TARGET_ID, 6 );
}
public String getFullTargetID()
{
StringBuilder sb = new StringBuilder();
sb.append( getWACN() );
sb.append( "-" );
sb.append( getSystemID() );
sb.append( "-" );
sb.append( getTargetID() );
return sb.toString();
}
@Override
public String getToID()

View File

@@ -18,7 +18,7 @@ public enum DataUnitID
PDU1 ( 12, 356, false, "PDU1 ", "Packet Data Unit" ),
PDU2 ( 12, 452, false, "PDU2 ", "Packet Data Unit" ),
PDU3 ( 12, 548, false, "PDU3 ", "Packet Data Unit" ),
TDULC( 15, 372, false, "TDULC", "Terminator Data Unit With Link Control" ),
TDULC( 15, 352, false, "TDULC", "Terminator Data Unit With Link Control" ),
UNKN ( -1, 0, false, "UNKWN", "Unknown" );
private int mValue;