mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-13 09:07:27 -05:00
P25 Work-in-progress check-in.
This commit is contained in:
116
src/decode/p25/message/P25Message.java
Normal file
116
src/decode/p25/message/P25Message.java
Normal file
@@ -0,0 +1,116 @@
|
||||
package decode.p25.message;
|
||||
|
||||
import decode.p25.reference.DataUnitID;
|
||||
import map.Plottable;
|
||||
import message.Message;
|
||||
import alias.Alias;
|
||||
import bits.BitSetBuffer;
|
||||
|
||||
public class P25Message extends Message
|
||||
{
|
||||
public static final int[] NAC = { 0,1,2,3,4,5,6,7,8,9,10,11 };
|
||||
public static final int[] DUID = { 12,13,14,15 };
|
||||
public static final int[] BCH = { 16,17,18,19,20,21,22,23,24,25,26,27,28,29,
|
||||
30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,
|
||||
54,55,56,57,58,59,60,61,62,63 };
|
||||
|
||||
protected BitSetBuffer mMessage;
|
||||
protected DataUnitID mDUID;
|
||||
|
||||
public P25Message( BitSetBuffer message, DataUnitID duid )
|
||||
{
|
||||
super();
|
||||
|
||||
mMessage = message;
|
||||
mDUID = duid;
|
||||
}
|
||||
|
||||
public String getNAC()
|
||||
{
|
||||
return mMessage.getHex( NAC, 3 );
|
||||
}
|
||||
|
||||
public DataUnitID getDUID()
|
||||
{
|
||||
return mDUID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getErrorStatus()
|
||||
{
|
||||
return "UNK";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMessage()
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
sb.append( "NAC:" );
|
||||
sb.append( getNAC() );
|
||||
sb.append( " " );
|
||||
sb.append( getDUID().name() );
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getBinaryMessage()
|
||||
{
|
||||
return mMessage.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProtocol()
|
||||
{
|
||||
return "P25 Phase 1";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getEventType()
|
||||
{
|
||||
return mDUID.name();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getFromID()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Alias getFromIDAlias()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getToID()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Alias getToIDAlias()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Plottable getPlottable()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return getMessage();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isValid()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
157
src/decode/p25/message/PDUMessage.java
Normal file
157
src/decode/p25/message/PDUMessage.java
Normal file
@@ -0,0 +1,157 @@
|
||||
package decode.p25.message;
|
||||
|
||||
import decode.p25.reference.DataUnitID;
|
||||
import decode.p25.reference.PDUFormat;
|
||||
import decode.p25.reference.ServiceAccessPoint;
|
||||
import decode.p25.reference.Vendor;
|
||||
import bits.BitSetBuffer;
|
||||
|
||||
public class PDUMessage extends P25Message
|
||||
{
|
||||
public static final int PDU_HEADER_DUMMY1 = 66; //Always 0
|
||||
public static final int PDU_HEADER_CONFIRMATION_REQUIRED = 67;
|
||||
public static final int PDU_HEADER_DIRECTION_FLAG = 68;
|
||||
public static final int[] PDU_HEADER_FORMAT = { 69,70,71,72,73 };
|
||||
public static final int PDU_HEADER_DUMMY2 = 74; //Always 1
|
||||
public static final int PDU_HEADER_DUMMY3 = 75; //Always 1
|
||||
public static final int[] PDU_HEADER_SAP_ID = { 76,77,78,79,80 };
|
||||
public static final int[] PDU_HEADER_VENDOR_ID = { 81,82,83,84,85,86,87,88 };
|
||||
public static final int[] PDU_HEADER_LOGICAL_LINK_ID = { 89,90,91,92,93,94,
|
||||
97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114 };
|
||||
public static final int PDU_HEADER_FULL_MESSAGE_FLAG = 115;
|
||||
public static final int[] PDU_HEADER_BLOCKS_TO_FOLLOW = { 116,117,118,119,
|
||||
120,121,122 };
|
||||
public static final int PDU_HEADER_DUMMY4 = 123; //Always 0
|
||||
public static final int PDU_HEADER_DUMMY5 = 124; //Always 0
|
||||
public static final int PDU_HEADER_DUMMY6 = 125; //Always 0
|
||||
public static final int[] PDU_HEADER_PAD_BLOCKS = { 126,127,128,129,130 };
|
||||
public static final int PDU_HEADER_RESYNCHRONIZE_FLAG = 131;
|
||||
public static final int[] PDU_HEADER_SEQUENCE_NUMBER = { 132,133,134 };
|
||||
public static final int[] PDU_HEADER_FRAGMENT_SEQUENCE_NUMBER = { 135,136,
|
||||
137,138 };
|
||||
public static final int PDU_HEADER_DUMMY7 = 139; //Always 0
|
||||
public static final int PDU_HEADER_DUMMY8 = 140; //Always 0
|
||||
public static final int[] PDU_HEADER_DATA_HEADER_OFFSET = { 141,142,143,
|
||||
144,145,146 };
|
||||
public static final int[] PDU_HEADER_CRC = { 147,148,149,150,151,152,153,154,
|
||||
155,156,157,158,159,160,161,162 };
|
||||
|
||||
//status 166,167
|
||||
public PDUMessage( BitSetBuffer message, DataUnitID duid )
|
||||
{
|
||||
super( message, duid );
|
||||
}
|
||||
|
||||
public String getConfirmation()
|
||||
{
|
||||
return mMessage.get( PDU_HEADER_CONFIRMATION_REQUIRED ) ? "CON" : "UNC";
|
||||
}
|
||||
|
||||
public String getDirection()
|
||||
{
|
||||
return mMessage.get( PDU_HEADER_DIRECTION_FLAG ) ? "OSP" : "ISP";
|
||||
}
|
||||
|
||||
public PDUFormat getFormat()
|
||||
{
|
||||
return PDUFormat.fromValue( mMessage.getInt( PDU_HEADER_FORMAT ) );
|
||||
}
|
||||
|
||||
public ServiceAccessPoint getServiceAccessPoint()
|
||||
{
|
||||
return ServiceAccessPoint.fromValue( mMessage.getInt( PDU_HEADER_SAP_ID ) );
|
||||
}
|
||||
|
||||
public Vendor getVendor()
|
||||
{
|
||||
return Vendor.fromValue( mMessage.getInt( PDU_HEADER_VENDOR_ID ) );
|
||||
}
|
||||
|
||||
public String getLogicalLinkID()
|
||||
{
|
||||
return mMessage.getHex( PDU_HEADER_LOGICAL_LINK_ID, 6 );
|
||||
}
|
||||
|
||||
public boolean isFullMessage()
|
||||
{
|
||||
return mMessage.get( PDU_HEADER_FULL_MESSAGE_FLAG );
|
||||
}
|
||||
|
||||
public int getBlockCount()
|
||||
{
|
||||
return mMessage.getInt( PDU_HEADER_BLOCKS_TO_FOLLOW );
|
||||
}
|
||||
|
||||
public int getPadBlockCount()
|
||||
{
|
||||
return mMessage.getInt( PDU_HEADER_PAD_BLOCKS );
|
||||
}
|
||||
|
||||
public boolean isResync()
|
||||
{
|
||||
return mMessage.get( PDU_HEADER_RESYNCHRONIZE_FLAG );
|
||||
}
|
||||
|
||||
public int getSequenceNumber()
|
||||
{
|
||||
return mMessage.getInt( PDU_HEADER_SEQUENCE_NUMBER );
|
||||
}
|
||||
|
||||
public int getFragmentSequenceNumber()
|
||||
{
|
||||
return mMessage.getInt( PDU_HEADER_FRAGMENT_SEQUENCE_NUMBER );
|
||||
}
|
||||
|
||||
public int getDataHeaderOffset()
|
||||
{
|
||||
return mMessage.getInt( PDU_HEADER_DATA_HEADER_OFFSET );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMessage()
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
sb.append( "NAC:" );
|
||||
sb.append( getNAC() );
|
||||
sb.append( " " );
|
||||
sb.append( getDUID().name() );
|
||||
sb.append( " " );
|
||||
sb.append( getConfirmation() );
|
||||
sb.append( " " );
|
||||
sb.append( getDirection() );
|
||||
sb.append( " FMT:" );
|
||||
sb.append( getFormat().getLabel() );
|
||||
|
||||
switch( getFormat() )
|
||||
{
|
||||
case ALTERNATE_MULTI_BLOCK_TRUNKING_CONTROL:
|
||||
case UNCONFIRMED_MULTI_BLOCK_TRUNKING_CONTROL:
|
||||
sb.append( " SAP:" );
|
||||
sb.append( getServiceAccessPoint().getLabel() );
|
||||
sb.append( " VEND:" );
|
||||
sb.append( getVendor().getLabel() );
|
||||
sb.append( " LLID:" );
|
||||
sb.append( getLogicalLinkID() );
|
||||
sb.append( " FMF:" );
|
||||
sb.append( isFullMessage() ? "1" : "0" );
|
||||
sb.append( " BLKS:" );
|
||||
sb.append( getBlockCount() );
|
||||
sb.append( " PAD:" );
|
||||
sb.append( getPadBlockCount() );
|
||||
sb.append( " RESYNC:" );
|
||||
sb.append( isResync() ? "1" : "0" );
|
||||
sb.append( " SEQ:" );
|
||||
sb.append( getSequenceNumber() );
|
||||
sb.append( " FRAG:" );
|
||||
sb.append( getFragmentSequenceNumber() );
|
||||
sb.append( " DHO:" );
|
||||
sb.append( getDataHeaderOffset() );
|
||||
break;
|
||||
default:
|
||||
}
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
}
|
||||
67
src/decode/p25/message/TSBKMessage.java
Normal file
67
src/decode/p25/message/TSBKMessage.java
Normal file
@@ -0,0 +1,67 @@
|
||||
package decode.p25.message;
|
||||
|
||||
import decode.p25.reference.DataUnitID;
|
||||
import decode.p25.reference.Opcode;
|
||||
import decode.p25.reference.Vendor;
|
||||
import bits.BitSetBuffer;
|
||||
|
||||
public class TSBKMessage extends P25Message
|
||||
{
|
||||
public static final int LAST_BLOCK_FLAG = 0;
|
||||
public static final int ENCRYPTED_FLAG = 1;
|
||||
public static final int[] OPCODE = { 2,3,4,5,6,7 };
|
||||
public static final int[] VENDOR_ID = { 8,9,10,11,12,13,14,15 };
|
||||
|
||||
public TSBKMessage( int system, BitSetBuffer message )
|
||||
{
|
||||
super( message, DataUnitID.TSBK1 );
|
||||
}
|
||||
|
||||
public boolean isLastBlock()
|
||||
{
|
||||
return mMessage.get( LAST_BLOCK_FLAG );
|
||||
}
|
||||
|
||||
public boolean isEncrypted()
|
||||
{
|
||||
return mMessage.get( ENCRYPTED_FLAG );
|
||||
}
|
||||
|
||||
public Vendor getVendor()
|
||||
{
|
||||
return Vendor.fromValue( mMessage.getInt( VENDOR_ID ) );
|
||||
}
|
||||
|
||||
public Opcode getOpcode()
|
||||
{
|
||||
return Opcode.fromValue( mMessage.getInt( OPCODE ) );
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMessage()
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
sb.append( "SYSTEM:" );
|
||||
sb.append( getNAC() ); /* NAC is the system id for TSBK messages */
|
||||
sb.append( " VEND:" );
|
||||
sb.append( getVendor().getLabel() );
|
||||
|
||||
if( isEncrypted() )
|
||||
{
|
||||
sb.append( " ENCRYPTED" );
|
||||
}
|
||||
else
|
||||
{
|
||||
Opcode opcode = getOpcode();
|
||||
|
||||
sb.append( " OPCODE:" );
|
||||
sb.append( opcode.name() );
|
||||
sb.append( " [" );
|
||||
sb.append( mMessage.getHex( OPCODE, 2 ) );
|
||||
sb.append( "]" );
|
||||
}
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
31
src/decode/p25/message/TSBKMessageFactory.java
Normal file
31
src/decode/p25/message/TSBKMessageFactory.java
Normal file
@@ -0,0 +1,31 @@
|
||||
package decode.p25.message;
|
||||
|
||||
import bits.BitSetBuffer;
|
||||
import decode.p25.reference.Opcode;
|
||||
import decode.p25.reference.Vendor;
|
||||
|
||||
public class TSBKMessageFactory
|
||||
{
|
||||
public static TSBKMessage getMessage( int system, BitSetBuffer buffer )
|
||||
{
|
||||
int opcode = buffer.getInt( TSBKMessage.OPCODE );
|
||||
|
||||
Vendor vendor = Vendor.fromValue(
|
||||
buffer.getInt( TSBKMessage.VENDOR_ID ) );
|
||||
|
||||
switch( vendor )
|
||||
{
|
||||
case STANDARD:
|
||||
switch( Opcode.fromValue( opcode ) )
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
return new TSBKMessage( system, buffer );
|
||||
case MOTOROLA:
|
||||
default:
|
||||
return new TSBKMessage( system, buffer );
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user