mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-13 09:07:27 -05:00
P25 work in progress
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
44
src/decode/p25/message/hdu/HDUMessage.java
Normal file
44
src/decode/p25/message/hdu/HDUMessage.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
44
src/decode/p25/message/ldu/LDU1Message.java
Normal file
44
src/decode/p25/message/ldu/LDU1Message.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
44
src/decode/p25/message/ldu/LDU2Message.java
Normal file
44
src/decode/p25/message/ldu/LDU2Message.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
44
src/decode/p25/message/tdu/TDULCMessage.java
Normal file
44
src/decode/p25/message/tdu/TDULCMessage.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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 );
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user