Initial commit of redesigned internal processing and audio management.

Note: Several of the decoders are currently non-functioning in this
commit.  If you want the latest functioning codebase, please checkout
the commit prior to this one.  All decoders will eventually be updated
with this new architecture.

Currently broken:
- Logging and recording
- Aux decoders (Fleetsync/MDC/LoJack/Tait)
- LTR/Passport decoders

Changes in this commit:
- Module architecture for decoders and components with central
provisioning by the DecoderFactory
- Transition from Complex sample stream processing to float buffer
processing for improved memory management
- Redesigned filter structures - to support buffers and streams
- Resolved several memory leak issues
- Universal sharing of the thread pool manager
- Added centralized audio management with call/user prioritization and
new gui with mute/volume controls
- Embedded audio metadata for eventual streaming support
- Redesigned ProcessingChain to support independent re-use
- Added new TrafficChannelManager to handle traffic channel allocations
- Traffic Channel pool size and Call timeout available in P25 and
MPT1327 configs
- Redesigned channel and decoder gui components
This commit is contained in:
denny
2015-09-01 07:10:26 -04:00
parent 538a299246
commit f4d8ea281d
570 changed files with 21578 additions and 17012 deletions

View File

@@ -0,0 +1,88 @@
package module.decode.p25.reference;
/**
* The Data Unit ID (DUID) is part of the Network ID (NID) field and indicates
* the type of message.
*/
public enum DataUnitID
{
NID ( -1, 64, false, "NID ", "Network and Data Unit ID" ),
HDU ( 0, 712, false, "HDU ", "Header Data Unit" ),
TDU ( 3, 64, false, "TDU ", "Simple Terminator Data Unit" ),
LDU1 ( 5, 1632, true, "LDU1 ", "Logical Link Data Unit 1" ),
TSBK1( 7, 260, false, "TSBK1", "Trunking Signaling Block" ),
TSBK2( 7, 260, false, "TSBK2", "Trunking Signaling Block" ),
TSBK3( 7, 260, false, "TSBK3", "Trunking Signaling Block" ),
LDU2 ( 10, 1632, true, "LDU2 ", "Logical Link Data Unit 2" ),
PDU0 ( 12, 260, false, "PDU0 ", "Packet Header Data Unit" ),
PDU1 ( 12, 356, false, "PDU1 ", "Packet Data Unit-Unconfirmed" ),
PDU2 ( 12, 452, false, "PDU2 ", "Packet Data Unit-Unconfirmed" ),
PDU3 ( 12, 548, false, "PDU3 ", "Packet Data Unit-Unconfirmed" ),
PDUC ( 12, 356, false, "PDUC", "Packet Data Unit-Confirmed" ),
TDULC( 15, 352, false, "TDULC", "Terminator Data Unit With Link Control" ),
UNKN ( -1, 0, false, "UNKWN", "Unknown" );
private int mValue;
private int mMessageLength;
private boolean mParity;
private String mLabel;
private String mDescription;
private DataUnitID( int value, int length, boolean parity, String label,
String description )
{
mValue = value;
mMessageLength = length;
mParity = parity;
mLabel = label;
mDescription = description;
}
public int getValue()
{
return mValue;
}
public int getMessageLength()
{
return mMessageLength;
}
public String getLabel()
{
return mLabel;
}
public String getDescription()
{
return mDescription;
}
public boolean getParity()
{
return mParity;
}
public static DataUnitID fromValue( int value )
{
switch( value )
{
case 0:
return HDU;
case 3:
return TDU;
case 5:
return LDU1;
case 7:
return TSBK1;
case 10:
return LDU2;
case 12:
return PDU0;
case 15:
return TDULC;
default:
return UNKN;
}
}
}

View File

@@ -0,0 +1,125 @@
package module.decode.p25.reference;
public enum DenyReason
{
RESERVED( 0x00 ),
REQUESTING_UNIT_NOT_VALID( 0x10 ),
REQUESTING_UNIT_NOT_AUTHORIZED_FOR_SERVICE( 0x11 ),
TARGET_UNIT_NOT_VALID( 0x20 ),
TARGET_UNIT_NOT_AUTHORIZED_FOR_SERVICE( 0x21 ),
TARGET_UNIT_REFUSED_CALL( 0x2F ),
TARGET_GROUP_NOT_VALID( 0x30 ),
TARGET_GROUP_NOT_AUTHORIZED_FOR_SERVICE( 0x31 ),
INVALID_DIALING( 0x40 ),
TELEPHONE_NUMBER_NOT_AUTHORIZED( 0x41 ),
PSTN_NOT_VALID( 0x42 ),
CALL_TIMEOUT( 0x50 ),
LANDLINE_TERMINATED_CALL( 0x51 ),
SUBSCRIBER_UNIT_TERMINATED_CALL( 0x52 ),
CALL_PREEMPTED( 0x5F ),
SITE_ACCESS_DENIAL( 0x60 ),
USER_OR_SYSTEM_DEFINED( 0x61 ),
CALL_OPTIONS_NOT_VALID_FOR_SERVICE( 0xF0 ),
PROTECTION_SERVICE_OPTION_NOT_VALID( 0xF1 ),
DUPLEX_SERVICE_OPTION_NOT_VALID( 0xF2 ),
CIRCUIT_OR_PACKET_MODE_OPTION_NOT_VALID( 0xF3 ),
SYSTEM_DOES_NOT_SUPPORT_SERVICE( 0xFF ),
UNKNOWN( -1 );
private int mCode;
private DenyReason( int code )
{
mCode = code;
}
public static DenyReason fromCode( int code )
{
if( code == 0x10 )
{
return DenyReason.REQUESTING_UNIT_NOT_VALID;
}
else if( code == 0x11 )
{
return REQUESTING_UNIT_NOT_AUTHORIZED_FOR_SERVICE;
}
else if( code == 0x20 )
{
return DenyReason.TARGET_UNIT_NOT_VALID;
}
else if( code == 0x21 )
{
return TARGET_UNIT_NOT_AUTHORIZED_FOR_SERVICE;
}
else if( code == 0x2F )
{
return DenyReason.TARGET_UNIT_REFUSED_CALL;
}
else if( code == 0x30 )
{
return TARGET_GROUP_NOT_VALID;
}
else if( code == 0x31 )
{
return DenyReason.TARGET_GROUP_NOT_AUTHORIZED_FOR_SERVICE;
}
else if( code == 0x40 )
{
return DenyReason.INVALID_DIALING;
}
else if( code == 0x41 )
{
return DenyReason.TELEPHONE_NUMBER_NOT_AUTHORIZED;
}
else if( code == 0x42 )
{
return DenyReason.PSTN_NOT_VALID;
}
else if( code == 0x50 )
{
return CALL_TIMEOUT;
}
else if( code == 0x51 )
{
return LANDLINE_TERMINATED_CALL;
}
else if( code == 0x52 )
{
return SUBSCRIBER_UNIT_TERMINATED_CALL;
}
else if( code == 0x5F )
{
return DenyReason.CALL_PREEMPTED;
}
else if( code == 0x60 )
{
return SITE_ACCESS_DENIAL;
}
else if( code == 0xF0 )
{
return CALL_OPTIONS_NOT_VALID_FOR_SERVICE;
}
else if( code == 0xF1 )
{
return PROTECTION_SERVICE_OPTION_NOT_VALID;
}
else if( code == 0xF2 )
{
return DenyReason.DUPLEX_SERVICE_OPTION_NOT_VALID;
}
else if( code == 0xF3 )
{
return CIRCUIT_OR_PACKET_MODE_OPTION_NOT_VALID;
}
else if( code <= 0x5E )
{
return DenyReason.RESERVED;
}
else if( code >= 0x61 )
{
return DenyReason.USER_OR_SYSTEM_DEFINED;
}
return UNKNOWN;
}
}

View File

@@ -0,0 +1,81 @@
package module.decode.p25.reference;
import java.util.List;
public enum Digit
{
D0( "0", "A" ),
D1( "1", "B" ),
D2( "2", "C" ),
D3( "3", "D" ),
D4( "4", "-" ),
D5( "5", "-" ),
D6( "6", "-" ),
D7( "7", "-" ),
D8( "8", "-" ),
D9( "9", "-" ),
D10( "*", "-" ),
D11( "#", "-" ),
D12( "-", "-" ),
D13( "HOOK FLASH", "-" ),
D14( "PAUSE", "-" ),
D15( "ESC", "NULL" ),
DUNK( "?", "?" );
private String mValue;
private String mEscapedValue;
private Digit( String value, String escapedValue )
{
mValue = value;
mEscapedValue = escapedValue;
}
public String getValue()
{
return mValue;
}
public String getEscapedValue()
{
return mEscapedValue;
}
public static Digit fromValue( int value )
{
if( 0 <= value && value <= 15 )
{
return values()[ value ];
}
return DUNK;
}
public static String decode( List<Integer> values )
{
StringBuilder sb = new StringBuilder();
boolean escape = false;
for( Integer value: values )
{
Digit d = Digit.fromValue( value );
if( d == Digit.D15 )
{
escape = true;
}
else if( escape )
{
sb.append( d.getEscapedValue() );
escape = false;
}
else
{
sb.append( d.getValue() );
}
}
return sb.toString();
}
}

View File

@@ -0,0 +1,65 @@
package module.decode.p25.reference;
public enum Encryption
{
ACCORDION_1_3( 0x00 ),
BATON_AUTO_EVEN( 0x01 ),
FIREFLY_TYPE1( 0x02 ),
MAYFLY_TYPE1( 0x03 ),
SAVILLE( 0x04 ),
BATON_AUTO_ODD( 0x41 ),
UNENCRYPTED( 0x80 ),
DES_OFB( 0x81 ),
TRIPLE_DES_2_KEY( 0x82 ),
TRIPLE_DES_3_KEY( 0x83 ),
AES_256( 0x84 ),
AES_CBC( 0x85 ),
DES_XL( 0x9F ), /* Motorola Proprietary */
DVI_XL( 0xA0 ), /* Motorola Proprietary */
DVP_XL( 0xA1 ), /* Motorola Proprietary */
ADP( 0xAA ),
UNKNOWN( -1 );
private int mValue;
private Encryption( int value )
{
mValue = value;
}
public static Encryption fromValue( int value )
{
switch( value )
{
case 0x00:
return ACCORDION_1_3;
case 0x01:
return BATON_AUTO_EVEN;
case 0x02:
return FIREFLY_TYPE1;
case 0x03:
return MAYFLY_TYPE1;
case 0x04:
return SAVILLE;
case 0x41:
return BATON_AUTO_ODD;
case 0x80:
return UNENCRYPTED;
case 0x82:
return TRIPLE_DES_2_KEY;
case 0x83:
return TRIPLE_DES_3_KEY;
case 0x84:
return AES_256;
case 0x9F:
return DES_OFB;
case 0xA0:
return DVI_XL;
case 0xA1:
return DVP_XL;
default:
return UNKNOWN;
}
}
}

View File

@@ -0,0 +1,71 @@
package module.decode.p25.reference;
public enum ExtendedFunction
{
RADIO_CHECK( 0x0000, "RADIO CHECK" ),
RADIO_DETACH( 0x007D, "RADIO DETACH" ),
RADIO_UNINHIBIT( 0x007E, "RADIO UNINHIBIT" ),
RADIO_INHIBIT( 0x007F, "RADIO INHIBIT" ),
RADIO_CHECK_ACK( 0x0080, "RADIO CHECK ACK" ),
RADIO_DETACH_ACK( 0x00FD, "RADIO DETACH ACK" ),
RADIO_UNINHIBIT_ACK( 0x00FE, "RADIO UNINHIBIT ACK" ),
RADIO_INHIBIT_ACK( 0x00FF, "RADIO INHIBIT ACK" ),
GROUP_CONTROL_COMMAND( 0x0100, "GROUP CONTROL COMMAND" ),
UNIT_DYNAMIC_COMMAND( 0x0200, "UNIT DYNAMIC COMMAND" ),
GROUP_DYNAMIC_COMMAND( 0x0300, "GROUP DYNAMIC COMMAND" ),
UNKNOWN( -1, "UNKNOWN" );
private int mFunction;
private String mLabel;
private ExtendedFunction( int function, String label )
{
mFunction = function;
mLabel = label;
}
public String getLabel()
{
return mLabel;
}
public static ExtendedFunction fromValue( int function )
{
switch( function )
{
case 0x0000:
return RADIO_CHECK;
case 0x007D:
return RADIO_DETACH;
case 0x007E:
return RADIO_UNINHIBIT;
case 0x007F:
return RADIO_INHIBIT;
case 0x0080:
return RADIO_CHECK_ACK;
case 0x00FD:
return RADIO_DETACH_ACK;
case 0x00FE:
return RADIO_UNINHIBIT_ACK;
case 0x00FF:
return RADIO_INHIBIT_ACK;
}
if( ( function & 0x0100 ) == 0x0100 )
{
return GROUP_CONTROL_COMMAND;
}
if( ( function & 0x0200 ) == 0x0200 )
{
return UNIT_DYNAMIC_COMMAND;
}
if( ( function & 0x0300 ) == 0x0300 )
{
return GROUP_DYNAMIC_COMMAND;
}
return UNKNOWN;
}
}

View File

@@ -0,0 +1,38 @@
package module.decode.p25.reference;
public enum IPHeaderCompression
{
NONE( 0, "NONE" ),
RFC1144_COMPRESSED( 1, "RFC-1144 COMPRESSED" ),
RFC1144_UNCOMPRESSED( 2, "RFC-1144 UNCOMPRESSED" ),
UNKNOWN( -1, "UNKNOWN" );
private int mValue;
private String mLabel;
private IPHeaderCompression( int value, String label )
{
mValue = value;
mLabel = label;
}
public int getValue()
{
return mValue;
}
public String getLabel()
{
return mLabel;
}
public static IPHeaderCompression fromValue( int value )
{
if( 0 <= value && value <= 2 )
{
return values()[ value ];
}
return IPHeaderCompression.UNKNOWN;
}
}

View File

@@ -0,0 +1,178 @@
package module.decode.p25.reference;
public enum IPProtocol
{
HOPOPT( 0, "IPV6 HOP-BY-HOP" ),
ICMP( 1, "ICMP" ),
IGMP( 2, "IGMP" ),
GGP( 3, "GGP" ),
IPinIP( 4, "IPinIP" ),
ST( 5, "ST" ),
TCP( 6, "TCP" ),
CBT( 7, "CBT" ),
EGP( 8, "EGP" ),
IGP( 9, "IGP" ),
BBN( 10, "BBN" ),
NVP( 11, "NVP" ),
PUP( 12, "PUP" ),
ARGUS( 13, "ARGUS" ),
EMCON( 14, "EMCON" ),
XNET( 15, "XNET" ),
CHAOS( 16, "CHAOS" ),
UDP( 17, "UDP" ),
MUX( 18, "MUX" ),
DCN( 19, "DCN" ),
HMP( 20, "HMP" ),
PRM( 21, "PRM" ),
XNS_IDP( 22, "XNS-IDP" ),
TRUNK_1( 23, "TRUNK-1" ),
TRUNK_2( 24, "TRUNK-2" ),
LEAF_1( 25, "LEAF-1" ),
LEAF_2( 26, "LEAF-2" ),
RDP( 27, "RDP" ),
IRTP( 28, "IRTP" ),
ISO_TP4( 29, "ISO-TP4" ),
NETBLT( 30, "NETBLT" ),
MFE_NSP( 31, "MFE-NSP" ),
MERIT_INP( 32, "MERIT-INP" ),
DCCP( 33, "DCCP" ),
_3PC( 34, "3PC" ),
IDPR( 35, "IDPR" ),
XTP( 36, "XTP" ),
DDP( 37, "DDP" ),
IDPR_CMTP( 38, "IDPR-CMTP" ),
TPPP( 39, "TP++" ),
IL( 40, "IL" ),
IPV6( 41, "IPV6" ),
SDRP( 42, "SDRP" ),
IPV6_ROUTE( 43, "IPV6-ROUTE" ),
IPV6_FRAG( 44, "IPV6-FRAG" ),
IDRP( 45, "IDRP" ),
RSVP( 46, "RSVP" ),
GRE( 47, "GRE" ),
MHRP( 48, "MHRP" ),
BNA( 49, "BNA" ),
ESP( 50, "ESP" ),
AH( 51, "AH" ),
INLSP( 52, "I-NLSP" ),
SWIPE( 53, "SWIPE" ),
NARP( 54, "NARP" ),
MOBILE( 55, "MOBILE" ),
TLSP( 56, "TLSP" ),
SKIP( 57, "SKIP" ),
IPV6_ICMP( 58, "IPV6-ICMP" ),
IPV6_NONXT( 59, "IPV6-NoNXT" ),
IPV6_OPTS( 60, "IPV6-OPTS" ),
ANY_HOST( 61, "ANY HOST" ),
CFTP( 62, "CFTP" ),
ANY_NETWORK( 63, "ANY NETWORK" ),
SAT_EXPAK( 64, "SAT_EXPAK" ),
KRYPTOLAN( 65, "KRYPTOLAN" ),
RVD( 66, "RVD" ),
IPPC( 67, "IPPC" ),
ANY_DIST( 68, "ANY DISTRIBUTED" ),
SAT_MON( 69, "SAT-MON" ),
VISA( 70, "VISA" ),
IPCU( 71, "IPCU" ),
CPNX( 72, "CPNX" ),
CPHB( 73, "CPHB" ),
WSN( 74, "WSN" ),
PVP( 75, "PVP" ),
BR_SAT_MON( 76, "BR-SAT-MON" ),
SUN_ND( 77, "SUN-ND" ),
WB_MON( 78, "WB-MON" ),
WB_EXPAK( 79, "WB-EXPAK" ),
ISO_IP( 80, "ISO-IP" ),
VMTP( 81, "VMTP" ),
SECURE_VMTP( 82, "SECURE-VMTP" ),
VINES( 83, "VINES" ),
TTP( 84, "TTP" ),
NSFNET_IGP( 85, "NSFNET-IGP" ),
DGP( 86, "DGP" ),
TCF( 87, "TCF" ),
EIGRP( 88, "EIGRP" ),
OSPF( 89, "OSPF" ),
SPRITE_RPC( 90, "SPRITE-RPC" ),
LARP( 91, "LARP" ),
MTP( 92, "MTP" ),
AX25( 93, "AX-25" ),
IPIP( 94, "IPIP" ),
MICP( 95, "MICP" ),
SCC_SP( 96, "SCC-SP" ),
ETHERIP( 97, "ETHER-IP" ),
ENCAP( 98, "ENCAP" ),
ANY_PRIVATE( 99, "ANY PRIVATE" ),
GMTP( 100, "GMTP" ),
IFMP( 101, "IFMP" ),
PNNI( 102, "PNNI" ),
PIM( 103, "PIM" ),
ARIS( 104, "ARIS" ),
SCPS( 105, "SCPS" ),
QNX( 106, "QNX" ),
A_N( 107, "A-N" ),
IPCOMP( 108, "IPCOMP" ),
SNP( 109, "SNP" ),
COMPAQ_PEER( 110, "COMPAQ-PEER" ),
IPXinIP( 111, "IPX-in-IP" ),
VRRP( 112, "VRRP" ),
PGM( 113, "PGM" ),
ANY_0_HOP( 114, "ANY 0-HOP" ),
L2TP( 115, "L2TP" ),
DDX( 116, "DDX" ),
IATP( 117, "IATP" ),
STP( 118, "STP" ),
SRP( 119, "SRP" ),
UTI( 120, "UTI" ),
SMP( 121, "SMP" ),
SM( 122, "SM" ),
PTP( 123, "PTP" ),
ISIS( 124, "IS-IS OVER IPV4" ),
FIRE( 125, "FIRE" ),
CRTP( 126, "CRTP" ),
CRUDP( 127, "CRUDP" ),
SSCOPMCE( 128, "SSCOPMCE" ),
IPLT( 129, "IPLT" ),
SPS( 130, "SPS" ),
PIPE( 131, "PIPE" ),
SCTP( 132, "SCTP" ),
FC( 133, "FC" ),
RSVP_E2E( 134, "RSVP E2E" ),
MOBILITY( 135, "MOBILITY HDR" ),
UDPLITE( 136, "UDP LITE" ),
MPLSinIP( 137, "MPLS-IN-IP" ),
MANET( 138, "MANET" ),
HIP( 139, "HIP" ),
SHIM6( 140, "SHIM6" ),
WESP( 141, "WESP" ),
ROHC( 142, "ROHC" ),
UNKNOWN( -1, "UNKNOWN" );
private int mValue;
private String mLabel;
private IPProtocol( int value, String label )
{
mValue = value;
mLabel = label;
}
public int getValue()
{
return mValue;
}
public String getLabel()
{
return mLabel;
}
public static IPProtocol fromValue( int value )
{
if( 0 <= value && value <= 142 )
{
return values()[ value ];
}
return IPProtocol.UNKNOWN;
}
}

View File

@@ -0,0 +1,106 @@
package module.decode.p25.reference;
public enum LinkControlOpcode
{
GROUP_VOICE_CHANNEL_USER( "GRP_VCH_USER ", "Group Voice Channel User", 0 ),
RESERVED_01( "RESERVED_01 ", "Reserved", 1 ),
GROUP_VOICE_CHANNEL_UPDATE( "GRP_VCH_UPDATE ", "Group Voice Channel Grant Update", 2 ),
UNIT_TO_UNIT_VOICE_CHANNEL_USER( "UU_VCH_USER ", "Unit-to-Unit Voice Channel User", 3 ),
GROUP_VOICE_CHANNEL_UPDATE_EXPLICIT( "GRP_VCH_UPD_EXPL", "Group Voice Channel Update Explicit", 4 ),
UNIT_TO_UNIT_ANSWER_REQUEST( "UU_ANS_REQ ", "Unit-to-Unit Answer Request", 5 ),
TELEPHONE_INTERCONNECT_VOICE_CHANNEL_USER( "TEL_INT_VCH_USER", "Telephone Interconnect Voice Channel User", 6 ),
TELEPHONE_INTERCONNECT_ANSWER_REQUEST( "TEL_INT_ANS_RQST", "Telephone Interconnect Answer Request", 7 ),
RESERVED_08( "RESERVED_08 ", "Reserved", 8 ),
RESERVED_09( "RESERVED_09 ", "Reserved", 9 ),
RESERVED_0A( "RESERVED_0A ", "Reserved", 10 ),
RESERVED_0B( "RESERVED_0B ", "Reserved", 11 ),
RESERVED_0C( "RESERVED_0C ", "Reserved", 12 ),
RESERVED_0D( "RESERVED_0D ", "Reserved", 13 ),
RESERVED_0E( "RESERVED_0E ", "Reserved", 14 ),
CALL_TERMINATION_OR_CANCELLATION( "CALL TERMINATION", "Call Termination Cancellation", 15 ),
GROUP_AFFILIATION_QUERY( "GRP_AFFIL_QUERY ", "Group Affiliation Query", 16 ),
UNIT_REGISTRATION_COMMAND( "UNIT_REG_COMMAND", "Unit Registration Command", 17 ),
UNIT_AUTHENTICATION_COMMAND( "UNIT_AUTHEN_CMD ", "Unit Authentication Command", 18 ),
STATUS_QUERY( "STATUS QUERY ", "Status Query", 19 ),
STATUS_UPDATE( "STATUS_UPDATE ", "Status Update", 20 ),
MESSAGE_UPDATE( "MESSAGE UPDATE ", "Message Update", 21 ),
CALL_ALERT( "CALL ALERT", "Call Alert", 22 ),
EXTENDED_FUNCTION_COMMAND( "EXT FUNC COMMAND", "Extended Function Command", 23 ),
CHANNEL_IDENTIFIER_UPDATE( "CHAN IDEN UPDATE", "Channel Identifier Update", 24 ),
CHANNEL_IDENTIFIER_UPDATE_EXPLICIT( "CHAN IDEN UPD EX", "Channel Identifier Update Explicit", 25 ),
RESERVED_1A( "RESERVED_1A ", "Reserved", 26 ),
RESERVED_1B( "RESERVED_1B ", "Reserved", 27 ),
RESERVED_1C( "RESERVED_1C ", "Reserved", 28 ),
RESERVED_1D( "RESERVED_1D ", "Reserved", 29 ),
RESERVED_1E( "RESERVED_1E ", "Reserved", 30 ),
RESERVED_1F( "RESERVED_1F ", "Reserved", 31 ),
SYSTEM_SERVICE_BROADCAST( "SYS_SVC_BCAST ", "System Service Broadcast", 32 ),
SECONDARY_CONTROL_CHANNEL_BROADCAST( "SEC_CCH_BROADCST", "Secondary Control Channel Broadcast", 33 ),
ADJACENT_SITE_STATUS_BROADCAST( "ADJ SITE STATUS ", "Adjacent Site Status Broadcast", 34 ),
RFSS_STATUS_BROADCAST( "RFSS_STATUS_BCST", "RFSS Status Broadcast", 35 ),
NETWORK_STATUS_BROADCAST( "NET_STATUS_BCAST", "Network Status Broadcast", 36 ),
PROTECTION_PARAMETER_BROADCAST( "ENCRYPT_PAR_BCST", "Protection Parameter Broadcast", 37 ),
SECONDARY_CONTROL_CHANNEL_BROADCAST_EXPLICIT( "SCCB_CCH_BCST_EX", "Secondary Control Channel Broadcast-Explicit", 38 ),
ADJACENT_SITE_STATUS_BROADCAST_EXPLICIT( "ADJ SITE STAT EX", "Adjacent Site Status Broadcast Explicit", 39 ),
RFSS_STATUS_BROADCAST_EXPLICIT( "RFSS STAT BCST E", "RFSS Status Broadcast Explicit", 40 ),
NETWORK_STATUS_BROADCAST_EXPLICIT( "NET STAT BCAST E", "Network Status Broadcast", 41 ),
RESERVED_2A( "RESERVED_2A ", "Reserved", 42 ),
RESERVED_2B( "RESERVED_2B ", "Reserved", 43 ),
RESERVED_2C( "RESERVED_2C ", "Reserved", 44 ),
RESERVED_2D( "RESERVED_2D ", "Reserved", 45 ),
RESERVED_2E( "RESERVED_2E ", "Reserved", 46 ),
RESERVED_2F( "RESERVED_2F ", "Reserved", 47 ),
RESERVED_30( "RESERVED_30 ", "Reserved", 48 ),
RESERVED_31( "RESERVED_31 ", "Reserved", 49 ),
RESERVED_32( "RESERVED_32 ", "Reserved", 50 ),
RESERVED_33( "RESERVED_33 ", "Reserved", 51 ),
RESERVED_34( "RESERVED_34 ", "Reserved", 52 ),
RESERVED_35( "RESERVED_35 ", "Reserved", 53 ),
RESERVED_36( "RESERVED_36 ", "Reserved", 54 ),
RESERVED_37( "RESERVED_37 ", "Reserved", 55 ),
RESERVED_38( "RESERVED_38 ", "Reserved", 56 ),
RESERVED_39( "RESERVED_39 ", "Reserved", 57 ),
RESERVED_3A( "RESERVED_3A ", "Reserved", 58 ),
RESERVED_3B( "RESERVED_3B ", "Reserved", 59 ),
RESERVED_3C( "RESERVED_3C ", "Reserved", 60 ),
RESERVED_3D( "RESERVED_3D ", "Reserved", 61 ),
RESERVED_3E( "RESERVED_3E ", "Reserved", 62 ),
RESERVED_3F( "RESERVED_3F ", "Reserved", 63 ),
UNKNOWN( "UNKNOWN ", "Unknown", -1 );
private String mLabel;
private String mDescription;
private int mCode;
private LinkControlOpcode( String label, String description, int code )
{
mLabel = label;
mDescription = description;
mCode = code;
}
public String getLabel()
{
return mLabel;
}
public String getDescription()
{
return mDescription;
}
public int getCode()
{
return mCode;
}
public static LinkControlOpcode fromValue( int value )
{
if( 0 <= value && value <= 63 )
{
return values()[ value ];
}
return UNKNOWN;
}
}

View File

@@ -0,0 +1,38 @@
package module.decode.p25.reference;
public enum MDPConfigurationOption
{
INTERNAL( "INTERNAL INTERFACE", 0 ),
MDP_SLIP( "MDP SLIP", 1 ),
MDP_PPP( "MDP PPP", 2 ),
UNKNOWN( "UNKNOWN", -1 );
private String mLabel;
private int mValue;
private MDPConfigurationOption( String label, int value )
{
mLabel = label;
mValue = value;
}
public String getLabel()
{
return mLabel;
}
public int getValue()
{
return mValue;
}
public static MDPConfigurationOption fromValue( int value )
{
if( 0 <= value && value <= 2 )
{
return values()[ value ];
}
return UNKNOWN;
}
}

View File

@@ -0,0 +1,106 @@
package module.decode.p25.reference;
public enum Opcode
{
GROUP_VOICE_CHANNEL_GRANT( "GRP_VCH_GRANT ", "Group Voice Channel Grant", 0 ),
RESERVED_01( "RESERVED_01 ", "Reserved", 1 ),
GROUP_VOICE_CHANNEL_GRANT_UPDATE( "GRP_VCH_GRNT_UPD", "Group Voice Channel Grant Update", 2 ),
GROUP_VOICE_CHANNEL_GRANT_UPDATE_EXPLICIT( "GRP_VCH_GRNT_UPX", "Group Voice Channel Grant Update - Explicit", 3 ),
UNIT_TO_UNIT_VOICE_CHANNEL_GRANT( "UU_VCH_GRANT ", "Unit-to-Unit Voice Channel Grant", 4 ),
UNIT_TO_UNIT_ANSWER_REQUEST( "UU_ANS_REQ ", "Unit-to-Unit Answer Request", 5 ),
UNIT_TO_UNIT_VOICE_CHANNEL_GRANT_UPDATE( "UU_VCH_GRANT_UPD", "Unit-to-Unit Voice Channel Grant Update", 6 ),
RESERVED_07( "RESERVED_07 ", "Reserved", 7 ),
TELEPHONE_INTERCONNECT_VOICE_CHANNEL_GRANT( "TEL_INT_VCH_GRNT", "Telephone Interconnect Voice Channel Grant", 8 ),
TELEPHONE_INTERCONNECT_VOICE_CHANNEL_GRANT_UPDATE( "TEL_INT_VCH_GRNU","Telephone Interconnect Voice Channel Grant Update", 9 ),
TELEPHONE_INTERCONNECT_ANSWER_REQUEST( "TEL_INT_ANS_RQST", "Telephone Interconnect Answer Request", 10 ),
RESERVED_0B( "RESERVED_0B ", "Reserved", 11 ),
RESERVED_0C( "RESERVED_0C ", "Reserved", 12 ),
RESERVED_0D( "RESERVED_0D ", "Reserved", 13 ),
RESERVED_0E( "RESERVED_0E ", "Reserved", 14 ),
RESERVED_0F( "RESERVED_0F ", "Reserved", 15 ),
INDIVIDUAL_DATA_CHANNEL_GRANT( "IND_DCH_GRANT ", "Individual Data Channel Grant", 16 ),
GROUP_DATA_CHANNEL_GRANT( "GRP_DCH_GRANT ", "Group Data Channel Grant", 17 ),
GROUP_DATA_CHANNEL_ANNOUNCEMENT( "GRP_DCH_ANNOUNCE", "Group Data Channel Announcement", 18 ),
GROUP_DATA_CHANNEL_ANNOUNCEMENT_EXPLICIT( "GRP_DCH_ANNC_EXP", "Group Data Channel Announcement-Explicit", 19 ),
SNDCP_DATA_CHANNEL_GRANT( "SNDCP_DCH_GRANT ", "SNDCP Data Channel Grant", 20 ),
SNDCP_DATA_PAGE_REQUEST( "SNDCP_DCH_PAG_RQ", "SNDCP Data Page Request", 21 ),
SNDCP_DATA_CHANNEL_ANNOUNCEMENT_EXPLICIT( "SNDCP_DCH_ANN_EX", "SNDCP Data Channel Announcement Explicit", 22 ),
RESERVED_17( "RESERVED_17 ", "Reserved", 23 ),
STATUS_UPDATE( "STATUS_UPDATE ", "Status Update", 24 ),
RESERVED_19( "RESERVED_19 ", "Reserved", 25 ),
STATUS_QUERY( "STATUS_QUERY ", "Status Query", 26 ),
RESERVED_1B( "RESERVED_1B ", "Reserved", 27 ),
MESSAGE_UPDATE( "MESSAGE_UPDATE ", "Message Update", 28 ),
RADIO_UNIT_MONITOR_COMMAND( "RADIO_MONITR_CMD", "Radio Unit Monitor Command", 29 ),
RESERVED_1E( "RESERVED_1E ", "Reserved", 30 ),
CALL_ALERT( "CALL_ALERT ", "Call Alert", 31 ),
ACKNOWLEDGE_RESPONSE( "ACK_RESPONSE_FNE", "Acknowledge Response - FNE", 32 ),
QUEUED_RESPONSE( "QUEUED_RESPONSE ", "Queued Response", 33 ),
RESERVED_22( "RESERVED_22 ", "Reserved", 34 ),
RESERVED_23( "RESERVED_23 ", "Reserved", 35 ),
EXTENDED_FUNCTION_COMMAND( "EXTNDED_FUNC_CMD", "Extended Function Command", 36 ),
RESERVED_25( "RESERVED_25 ", "Reserved", 37 ),
RESERVED_26( "RESERVED_26 ", "Reserved", 38 ),
DENY_RESPONSE( "DENY_RESPONSE ", "Deny Response", 39 ),
GROUP_AFFILIATION_RESPONSE( "GRP_AFFIL_RESP ", "Group Affiliation Response", 40 ),
SECONDARY_CONTROL_CHANNEL_BROADCAST_EXPLICIT( "SCCB_CCH_BCST_EX", "Secondary Control Channel Broadcast-Explicit", 41 ),
GROUP_AFFILIATION_QUERY( "GRP_AFFIL_QUERY ", "Group Affiliation Query", 42 ),
LOCATION_REGISTRATION_RESPONSE( "LOCN_REG_RESPONS", "Location Registration Response", 43 ),
UNIT_REGISTRATION_RESPONSE( "UNIT_REG_RESPONS", "Unit Registration Response", 44 ),
UNIT_REGISTRATION_COMMAND( "UNIT_REG_COMMAND", "Unit Registration Command", 45 ),
AUTHENTICATION_COMMAND( "AUTH_COMMAND ", "Authentication Command", 46 ),
UNIT_DEREGISTRATION_ACKNOWLEDGE( "DE_REGIST_ACK ", "De-Registration Acknowledge", 47 ),
RESERVED_30( "RESERVED_30 ", "Reserved", 48 ),
RESERVED_31( "RESERVED_31 ", "Reserved", 49 ),
RESERVED_32( "RESERVED_32 ", "Reserved", 50 ),
RESERVED_33( "RESERVED_33 ", "Reserved", 51 ),
IDENTIFIER_UPDATE_VHF_UHF_BANDS( "IDEN_UPDATE_VUHF", "Identifier Update for VHF/UHF Bands", 52 ),
TIME_DATE_ANNOUNCEMENT( "TIME_DATE_ANNOUN", "Time and Date Announcement", 53 ),
ROAMING_ADDRESS_COMMAND( "ROAM_ADDR_CMD ", "Roaming Address Command", 54 ),
ROAMING_ADDRESS_UPDATE( "ROAM_ADDR_UPDATE", "Roaming Address Update", 55 ),
SYSTEM_SERVICE_BROADCAST( "SYS_SVC_BCAST ", "System Service Broadcast", 56 ),
SECONDARY_CONTROL_CHANNEL_BROADCAST( "SEC_CCH_BROADCST", "Secondary Control Channel Broadcast", 57 ),
RFSS_STATUS_BROADCAST( "RFSS_STATUS_BCST", "RFSS Status Broadcast", 58 ),
NETWORK_STATUS_BROADCAST( "NET_STATUS_BCAST", "Network Status Broadcast", 59 ),
ADJACENT_STATUS_BROADCAST( "ADJ SITE STATUS ", "Adjacent Site Status Broadcast", 60 ),
IDENTIFIER_UPDATE_NON_VUHF( "IDEN_UPDATE ", "Identifier Update", 61 ),
PROTECTION_PARAMETER_BROADCAST( "ENCRYPT_PAR_BCST", "Protection Parameter Broadcast", 62 ),
PROTECTION_PARAMETER_UPDATE( "ENCRYPT_PAR_UPDT", "Protection Parameter Update", 63 ),
UNKNOWN( "UNKNOWN ", "Unknown", -1 );
private String mLabel;
private String mDescription;
private int mCode;
private Opcode( String label, String description, int code )
{
mLabel = label;
mDescription = description;
mCode = code;
}
public String getLabel()
{
return mLabel;
}
public String getDescription()
{
return mDescription;
}
public int getCode()
{
return mCode;
}
public static Opcode fromValue( int value )
{
if( 0 <= value && value <= 63 )
{
return values()[ value ];
}
return UNKNOWN;
}
}

View File

@@ -0,0 +1,48 @@
package module.decode.p25.reference;
public class P25NetworkCallsign
{
public static final String[] RADIX_50 = new String[]
{ " ", "A", "B", "C", "D", "E", "F", "G",
"H", "I", "J", "K", "L", "M", "N", "O",
"P", "Q", "R", "S", "T", "U", "V", "W",
"X", "Y", "Z", "$", ".", "?", "0", "1",
"2", "3", "4", "5", "6", "7", "8", "9" };
/**
* Decodes the string callsign from which the WACN and System identifiers
* were derived.
*
* Based on code by Eric Carlson at:
* http://www.ericcarlson.net/project-25-callsign.html
*
* @param wacn
* @param systemID
* @return
*/
public static String getCallsign( int wacn, int systemID )
{
int n1 = wacn / 16;
int n2 = 4096 * ( wacn % 16 ) + systemID;
StringBuilder sb = new StringBuilder();
sb.append( getLetter( (int)( n1 / 1600 ) ) );
sb.append( getLetter( (int)( ( n1 / 40 ) % 40 ) ) );
sb.append( getLetter( (int)( n1 % 40 ) ) );
sb.append( getLetter( (int)( n2 / 1600 ) ) );
sb.append( getLetter( (int)( ( n2 / 40 ) % 40 ) ) );
sb.append( getLetter( (int)( n2 % 40 ) ) );
return sb.toString();
}
private static String getLetter( int value )
{
if( 0 <= value && value < 40 )
{
return RADIX_50[ value ];
}
return " ";
}
}

View File

@@ -0,0 +1,67 @@
package module.decode.p25.reference;
public enum PDUFormat
{
F00( "F00", 0 ),
F01( "F01", 1 ),
F02( "F02", 2 ),
F03( "F03", 3 ),
F04( "F04", 4 ),
F05( "F05", 5 ),
F06( "F06", 6 ),
F07( "F07", 7 ),
F08( "F08", 8 ),
F09( "F09", 9 ),
F10( "F10", 10 ),
F11( "F11", 11 ),
F12( "F12", 12 ),
F13( "F13", 13 ),
F14( "F14", 14 ),
F15( "F15", 15 ),
F16( "F16", 16 ),
F17( "F17", 17 ),
F18( "F18", 18 ),
F19( "F19", 19 ),
F20( "F20", 20 ),
UNCONFIRMED_MULTI_BLOCK_TRUNKING_CONTROL( "UNCONFIRMED MBTC", 21 ),
PACKET_DATA( "PACKET DATA", 22 ),
ALTERNATE_MULTI_BLOCK_TRUNKING_CONTROL( "ALTERNATE MBTC", 23 ),
F24( "F24", 24 ),
F25( "F25", 25 ),
F26( "F26", 26 ),
F27( "F27", 27 ),
F28( "F28", 28 ),
F29( "F29", 29 ),
F30( "F30", 30 ),
F31( "F31", 31 ),
UNKNOWN( "UNKN", -1 );
private String mLabel;
private int mValue;
private PDUFormat( String label, int value )
{
mLabel = label;
mValue = value;
}
public String getLabel()
{
return mLabel;
}
public int getValue()
{
return mValue;
}
public static PDUFormat fromValue( int value )
{
if( 0 <= value && value <= 31 )
{
return values()[ value ];
}
return UNKNOWN;
}
}

View File

@@ -0,0 +1,50 @@
package module.decode.p25.reference;
public enum PDUType
{
/* Outbound */
SN_ACTIVATE_TDS_CONTEXT_ACCEPT( "SN-ACTIVATE TDS CONTEXT ACCEPT", 0 ),
SN_DEACTIVATE_TDS_CONTEXT_ACCEPT( "SN-DEACTIVATE TDS CONTEXT ACCEPT", 1 ),
SN_DEACTIVATE_TDS_CONTEXT_REQUEST( "SN-DEACTIVATE TDS CONTEXT REQUEST", 2 ),
SN_ACTIVATE_TDS_CONTEXT_REJECT( "SN-ACTIVATE TDS CONTEXT REJECT", 3 ),
SN_RF_UNCONFIRMED_DATA( "SN-RF UNCONFIRMED DATA", 4 ),
SN_RF_CONFIRMED_DATA( "SN-RF CONFIRMED DATA", 5 ),
/* Inbound */
SN_ACTIVATE_TDS_CONTEXT_REQUEST( "SN-ACTIVATE TDS CONTEXT REQUEST", 0 ),
UNKNOWN( "UNKNOWN", -1 );
private String mLabel;
private int mValue;
private PDUType( String label, int value )
{
mLabel = label;
mValue = value;
}
public String getLabel()
{
return mLabel;
}
public int getValue()
{
return mValue;
}
public static PDUType fromValue( int value, boolean outbound )
{
if( outbound && 0 <= value && value <= 5 )
{
return values()[ value ];
}
else if( value == 0 && !outbound )
{
return SN_ACTIVATE_TDS_CONTEXT_REQUEST;
}
return UNKNOWN;
}
}

View File

@@ -0,0 +1,69 @@
package module.decode.p25.reference;
public enum QueuedResponseReason
{
RESERVED( 0x00 ),
REQUESTING_UNIT_BUSY_OTHER_SERVICE( 0x10 ),
TARGET_UNIT_BUSY_OTHER_SERVICE( 0x20 ),
TARGET_UNIT_QUEUED_THIS_CALL( 0x2F ),
TARGET_GROUP_CURRENTLY_ACTIVE( 0x30 ),
CHANNEL_RESOURCES_UNAVAILABLE( 0x40 ),
TELEPHONE_RESOURCES_UNAVAILABLE( 0x41 ),
DATA_RESOURCES_UNAVAILABLE( 0x42 ),
SUPERSEDING_SERVICE_CURRENTLY_ACTIVE( 0x50 ),
USER_OR_SYSTEM_DEFINED( 0x80 ),
UNKNOWN( -1 );
private int mCode;
private QueuedResponseReason( int code )
{
mCode = code;
}
public static QueuedResponseReason fromCode( int code )
{
if( code == 0x10 )
{
return QueuedResponseReason.REQUESTING_UNIT_BUSY_OTHER_SERVICE;
}
else if( code == 0x20 )
{
return QueuedResponseReason.TARGET_UNIT_BUSY_OTHER_SERVICE;
}
else if( code == 0x2F )
{
return QueuedResponseReason.TARGET_UNIT_QUEUED_THIS_CALL;
}
else if( code == 0x30 )
{
return QueuedResponseReason.TARGET_GROUP_CURRENTLY_ACTIVE;
}
else if( code == 0x40 )
{
return QueuedResponseReason.CHANNEL_RESOURCES_UNAVAILABLE;
}
else if( code == 0x41 )
{
return QueuedResponseReason.TELEPHONE_RESOURCES_UNAVAILABLE;
}
else if( code == 0x42 )
{
return QueuedResponseReason.DATA_RESOURCES_UNAVAILABLE;
}
else if( code == 0x50 )
{
return QueuedResponseReason.SUPERSEDING_SERVICE_CURRENTLY_ACTIVE;
}
else if( code <= 0x7F )
{
return QueuedResponseReason.RESERVED;
}
else if( code >= 0x80 )
{
return QueuedResponseReason.USER_OR_SYSTEM_DEFINED;
}
return UNKNOWN;
}
}

View File

@@ -0,0 +1,20 @@
package module.decode.p25.reference;
public enum Response
{
ACCEPT,
FAIL,
DENY,
REFUSED,
UNKNOWN;
public static Response fromValue( int value )
{
if( 0 <= value && value <= 4 )
{
return values()[ value ];
}
return UNKNOWN;
}
}

View File

@@ -0,0 +1,53 @@
package module.decode.p25.reference;
public enum SNDCPActivationRejectReason
{
R0( 0, "ANY REASON" ),
R1( 1, "MRC NOT PROVISIONED FOR TDS" ),
R2( 2, "MRC DSUT NOT SUPPORTED" ),
R3( 3, "MAX TDS CONTEXTS EXCEEDED" ),
R4( 4, "SNDCP VERSION NOT SUPPORTED" ),
R5( 5, "TDS NOT SUPPORTED BY FNE" ),
R6( 6, "TDS NOT SUPPORTED BY THIS SYSTEM" ),
R7( 7, "IPV4 STATIC ADDRESS NOT CORRECT" ),
R8( 8, "IPV4 STATIC ADDRESS NOT ALLOWED" ),
R9( 9, "IPV4 STATIC ADDRESS IN USE" ),
R10( 10, "IPV4 NOT SUPPORTED" ),
R11( 11, "IPV4 DYNAMIC ADDRESS POOL EMPTY" ),
R12( 12, "IPV4 DYNAMIC ADDRESS NOT SUPPORTED" ),
UNKNOWN( -1, "UNKNOWN" );
private int mValue;
public String mLabel;
private SNDCPActivationRejectReason( int value, String label )
{
mValue = value;
mLabel = label;
}
public int getValue()
{
return mValue;
}
public String getLabel()
{
return mLabel;
}
public String toString()
{
return getLabel();
}
public static SNDCPActivationRejectReason fromValue( int value )
{
if( 0 <= value && value <= 12 )
{
return values()[ value ];
}
return UNKNOWN;
}
}

View File

@@ -0,0 +1,70 @@
package module.decode.p25.reference;
import java.util.ArrayList;
import java.util.List;
public enum Service
{
EXTENDED_SERVICES( 0x800000l ),
EXTENDED_SERVICES_EXTENSION( 0x400000l ),
/* NORMAL SERVICES */
NETWORK_ACTIVE( 0x200000l ),
RESERVED_4( 0x100000l ),
GROUP_VOICE( 0x080000l ),
INDIVIDUAL_VOICE( 0x040000l ),
PSTN_TO_UNIT_VOICE( 0x020000l ),
UNIT_TO_PSTN_VOICE( 0x010000l ),
RESERVED_9( 0x008000l ),
GROUP_DATA( 0x004000l ),
INDIVIDUAL_DATA( 0x002000l ),
RESERVED_12( 0x001000l ),
UNIT_REGISTRATION( 0x000800l ),
GROUP_AFFILIATION( 0x000400l ),
GROUP_AFFILIATION_QUERY( 0x000200l ),
AUTHENTICATION( 0x000100l ),
ENCRYPTION_SETTINGS( 0x000080l ),
USER_STATUS( 0x000040l ),
USER_MESSAGE( 0x000020l ),
UNIT_STATUS( 0x000010l ),
USER_STATUS_QUERY( 0x000008l ),
UNIT_STATUS_QUERY( 0x000004l ),
UNIT_PAGE( 0x000002l ),
EMERGENCY_ALARM( 0x000001l ),
UNKNOWN( 0x0l );
private long mCode;
private Service( long code )
{
mCode = code;
}
public long getCode()
{
return mCode;
}
public static boolean isSupported( Service service, long serviceBitmap )
{
return ( service.getCode() & serviceBitmap ) == service.getCode();
}
public static List<Service> getServices( long serviceBitmap )
{
List<Service> services = new ArrayList<Service>();
for( Service service: values() )
{
if( isSupported( service, serviceBitmap ) )
{
if( service != Service.UNKNOWN )
{
services.add( service );
}
}
}
return services;
}
}

View File

@@ -0,0 +1,99 @@
package module.decode.p25.reference;
public enum ServiceAccessPoint
{
UNENCRYPTED_USER_DATA( "USER DATA", 0 ),
ENCRYPTED_USER_DATA( "ENCRYPTED USER DATA", 1 ),
CIRCUIT_DATA( "CIRCUIT DATA", 2 ),
CIRCUIT_DATA_CONTROL( "CIRCUIT DATA CONTROL", 3 ),
PACKET_DATA( "PACKET DATA", 4 ),
ADDRESS_RESOLUTION_PROTOCOL( "ADDRESS RESOLUTION PROTOCOL", 5 ),
SNDCP_PACKET_DATA_CONTROL( "SNDCP PACKET DATA CONTROL", 6 ),
SAP_7( "7", 7 ),
SAP_8( "8", 8 ),
SAP_9( "9", 9 ),
SAP_10( "10", 10 ),
SAP_11( "11", 11 ),
SAP_12( "12", 12 ),
SAP_13( "13", 13 ),
SAP_14( "14", 14 ),
SAP_15( "15", 15 ),
SAP_16( "16", 16 ),
SAP_17( "17", 17 ),
SAP_18( "18", 18 ),
SAP_19( "19", 19 ),
SAP_20( "20", 20 ),
SAP_21( "21", 21 ),
SAP_22( "22", 22 ),
SAP_23( "23", 23 ),
SAP_24( "24", 24 ),
SAP_25( "25", 25 ),
SAP_26( "26", 26 ),
SAP_27( "27", 27 ),
SAP_28( "28", 28 ),
SAP_29( "29", 29 ),
SAP_30( "30", 30 ),
EXTENDED_ADDRESS( "EXTENDED ADDRESS", 31 ),
REGISTRATION_AND_AUTHORIZATION( "REGISTRATION AND AUTHORIZATION", 32 ),
CHANNEL_REASSIGNMENT( "CHANNEL REASSIGNMENT", 33 ),
SYSTEM_CONFIGURATION( "SYSTEM CONFIGURATION", 34 ),
MR_LOOPBACK( "MOBILE RADIO LOOPBACK", 35 ),
MR_STATISTICS( "MOBILE RADIO STATISTICS", 36 ),
MR_OUT_OF_SERVICE( "MOBILE RADIO OUT OF SERVICE", 37 ),
MR_PAGING( "MOBILE RADIO PAGING", 38 ),
MR_CONFIGURATION( "MOBILE RADIO CONFIGURATION", 39 ),
UNENCRYPTED_KEY_MANAGEMENT_MESSAGE( "UNENCRYPTED KEY MANAGEMENT", 40 ),
ENCRYPTED_KEY_MANAGEMENT_MESSAGE( "ENCRYPTED KEY MANAGEMENT", 41 ),
SAP_42( "42", 42 ),
SAP_43( "43", 43 ),
SAP_44( "44", 44 ),
SAP_45( "45", 45 ),
SAP_46( "46", 46 ),
SAP_47( "47", 47 ),
SAP_48( "48", 48 ),
SAP_49( "49", 49 ),
SAP_50( "50", 50 ),
SAP_51( "51", 51 ),
SAP_52( "52", 52 ),
SAP_53( "53", 53 ),
SAP_54( "54", 54 ),
SAP_55( "55", 55 ),
SAP_56( "56", 56 ),
SAP_57( "57", 57 ),
SAP_58( "58", 58 ),
SAP_59( "59", 59 ),
SAP_60( "60", 60 ),
UNENCRYPTED_TRUNKING_CONTROL( "TRUNKING CONTROL", 61 ),
SAP_62( "62", 62 ),
ENCRYPTED_TRUNKING_CONTROL( "ENCRYPTED TRUNKING CONTROL", 63 ),
UKNOWN( "UNKN", -1 );
private String mLabel;
private int mValue;
private ServiceAccessPoint( String label, int value )
{
mLabel = label;
mValue = value;
}
public String getLabel()
{
return mLabel;
}
public int getValue()
{
return mValue;
}
public static ServiceAccessPoint fromValue( int value )
{
if( 0 <= value && value <= 63 )
{
return values()[ value ];
}
return UKNOWN;
}
}

View File

@@ -0,0 +1,20 @@
package module.decode.p25.reference;
public enum StackOperation
{
CLEAR,
WRITE,
DELETE,
READ,
UNKNOWN;
public static StackOperation fromValue( int value )
{
if( 0 <= value && value <= 3 )
{
return values()[ value ];
}
return UNKNOWN;
}
}

View File

@@ -0,0 +1,21 @@
package module.decode.p25.reference;
public enum Status
{
TALKAROUND,
BUSY,
REPEATER,
IDLE,
UNKNOWN;
public Status fromValue( int value )
{
if( 0 <= value && value <= 3 )
{
return values()[ value ];
}
return UNKNOWN;
}
}

View File

@@ -0,0 +1,299 @@
package module.decode.p25.reference;
public enum Vendor
{
STANDARD( "STANDARD", "STANDARD", 0),
STANDARD_V1( "STANDARD", "STANDARD_01", 1),
V2( "VENDOR02", "V_02", 2),
V3( "VENDOR03", "V_03", 3),
V4( "VENDOR04", "V_04", 4),
V5( "VENDOR05", "V_05", 5),
V6( "VENDOR06", "V_06", 6),
V7( "VENDOR07", "V_07", 7),
V8( "VENDOR08", "V_08", 8),
V9( "VENDOR09", "V_09", 9),
V10( "VENDOR0A", "V_0A", 10),
V11( "VENDOR0B", "V_0B", 11),
V12( "VENDOR0C", "V_0C", 12),
V13( "VENDOR0D", "V_0D", 13),
V14( "VENDOR0E", "V_0E", 14),
V15( "VENDOR0F", "V_0F", 15),
RELM( "RELM BK ", "RELM/BK RADIO", 16),
V17( "VENDOR11", "V_11", 17),
V18( "VENDOR12", "V_12", 18),
V19( "VENDOR13", "V_13", 19),
V20( "VENDOR14", "V_14", 20),
V21( "VENDOR15", "V_15", 21),
V22( "VENDOR16", "V_16", 22),
V23( "VENDOR17", "V_17", 23),
V24( "VENDOR18", "V_18", 24),
V25( "VENDOR19", "V_19", 25),
V26( "VENDOR1A", "V_1A", 26),
V27( "VENDOR1B", "V_1B", 27),
V28( "VENDOR1C", "V_1C", 28),
V29( "VENDOR1D", "V_1D", 29),
V30( "VENDOR1E", "V_1E", 30),
V31( "VENDOR1F", "V_1F", 31),
CYCOMM( "CYCOMM ", "CYCOMM", 32),
V33( "VENDOR21", "V_21", 33),
V34( "VENDOR22", "V_22", 34),
V35( "VENDOR23", "V_23", 35),
V36( "VENDOR24", "V_24", 36),
V37( "VENDOR25", "V_25", 37),
V38( "VENDOR26", "V_26", 38),
V39( "VENDOR27", "V_27", 39),
EFRATOM( "EFRATOM ", "EFRATOM", 40),
V41( "VENDOR29", "V_29", 41),
V42( "VENDOR2A", "V_2A", 42),
V43( "VENDOR2B", "V_2B", 43),
V44( "VENDOR2C", "V_2C", 44),
V45( "VENDOR2D", "V_2D", 45),
V46( "VENDOR2E", "V_2E", 46),
V47( "VENDOR2F", "V_2F", 47),
ERICSSON( "ERICSSON", "ERICSSON", 48),
V49( "VENDOR31", "V_31", 49),
V50( "VENDOR32", "V_32", 50),
V51( "VENDOR33", "V_33", 51),
V52( "VENDOR34", "V_34", 52),
V53( "VENDOR35", "V_35", 53),
V54( "VENDOR36", "V_36", 54),
V55( "VENDOR37", "V_37", 55),
DATRON( "DATRON ", "DATRON", 56),
V57( "VENDOR39", "V_39", 57),
V58( "VENDOR3A", "V_3A", 58),
V59( "VENDOR3B", "V_3B", 59),
V60( "VENDOR3C", "V_3C", 60),
V61( "VENDOR3D", "V_3D", 61),
V62( "VENDOR3E", "V_3E", 62),
V63( "VENDOR3F", "V_3F", 63),
ICOM( "ICOM ", "ICOM", 64),
V65( "VENDOR41", "V_41", 65),
V66( "VENDOR42", "V_42", 66),
V67( "VENDOR43", "V_43", 67),
V68( "VENDOR44", "V_44", 68),
V69( "VENDOR45", "V_45", 69),
V70( "VENDOR46", "V_46", 70),
V71( "VENDOR47", "V_47", 71),
GARMIN( "GARMIN ", "GARMIN", 72),
V73( "VENDOR49", "V_49", 73),
V74( "VENDOR4A", "V_4A", 74),
V75( "VENDOR4B", "V_4B", 75),
V76( "VENDOR4C", "V_4C", 76),
V77( "VENDOR4D", "V_4D", 77),
V78( "VENDOR4E", "V_4E", 78),
V79( "VENDOR4F", "V_4F", 79),
GTE( "GTE ", "GTE", 80),
V81( "VENDOR51", "V_51", 81),
V82( "VENDOR52", "V_52", 82),
V83( "VENDOR53", "V_53", 83),
V84( "VENDOR54", "V_54", 84),
IFR_SYSTEMS( "IFR SYST", "IFR SYSTEMS", 85),
V86( "VENDOR54", "V_56", 86),
V87( "VENDOR57", "V_57", 87),
V88( "VENDOR58", "V_58", 88),
V89( "VENDOR59", "V_59", 89),
V90( "VENDOR5A", "V_5A", 90),
V91( "VENDOR5B", "V_5B", 91),
V92( "VENDOR5C", "V_5C", 92),
V93( "VENDOR5D", "V_5D", 93),
V94( "VENDOR5E", "V_5E", 94),
V95( "VENDOR5F", "V_5F", 95),
GEC_MARCONI( "MARCONI ", "GEC-MARCONI", 96),
V97( "VENDOR61", "V_61", 97),
V98( "VENDOR62", "V_62", 98),
V99( "VENDOR63", "V_63", 99),
V100( "VENDOR64", "V_64", 100),
V101( "VENDOR65", "V_65", 101),
V102( "VENDOR66", "V_66", 102),
V103( "VENDOR67", "V_67", 103),
KENWOOD( "KENWOOD ", "KENWOOD", 104),
V105( "VENDOR69", "V_69", 105),
V106( "VENDOR6A", "V_6A", 106),
V107( "VENDOR6B", "V_6B", 107),
V108( "VENDOR6C", "V_6C", 108),
V109( "VENDOR6D", "V_6D", 109),
V110( "VENDOR6E", "V_6E", 110),
V111( "VENDOR6F", "V_6F", 111),
GLENAYRE( "GLENAYRE", "GLENAYRE ELECTRONICS", 112),
V113( "VENDOR71", "V_71", 113),
V114( "VENDOR72", "V_72", 114),
V115( "VENDOR73", "V_73", 115),
JAPAN_RADIO( "JAPRADCO", "JAPAN RADIO CO", 116),
V117( "VENDOR75", "V_75", 117),
V118( "VENDOR76", "V_76", 118),
V119( "VENDOR77", "V_77", 119),
KOKUSAI( "KOKUSAI ", "KOKUSAI", 120),
V121( "VENDOR79", "V_79", 121),
V122( "VENDOR7A", "V_7A", 122),
V123( "VENDOR7B", "V_7B", 123),
MAXON( "MAXON ", "MAXON", 124),
V125( "VENDOR7D", "V_7D", 125),
V126( "VENDOR7E", "V_7E", 126),
V127( "VENDOR7F", "V_7F", 127),
MIDLAND( "MIDLAND ", "MIDLAND", 128),
V129( "VENDOR81", "V_81", 129),
V130( "VENDOR82", "V_82", 130),
V131( "VENDOR83", "V_83", 131),
V132( "VENDOR84", "V_84", 132),
V133( "VENDOR85", "V_85", 133),
DANIELS( "DANIELS ", "DANIELS ELECTRONICS", 134),
V135( "VENDOR87", "V_87", 135),
V136( "VENDOR88", "V_88", 136),
V137( "VENDOR89", "V_89", 137),
V138( "VENDOR8A", "V_8A", 138),
V139( "VENDOR8B", "V_8B", 139),
V140( "VENDOR8C", "V_8C", 140),
V141( "VENDOR8D", "V_8D", 141),
V142( "VENDOR8E", "V_8E", 142),
V143( "VENDOR8F", "V_8F", 143),
MOTOROLA( "MOTOROLA", "MOTOROLA", 144),
V145( "VENDOR91", "V_91", 145),
V146( "VENDOR92", "V_92", 146),
V147( "VENDOR93", "V_93", 147),
V148( "VENDOR94", "V_94", 148),
V149( "VENDOR95", "V_95", 149),
V150( "VENDOR96", "V_96", 150),
V151( "VENDOR97", "V_97", 151),
V152( "VENDOR98", "V_98", 152),
V153( "VENDOR99", "V_99", 153),
V154( "VENDOR9A", "V_9A", 154),
V155( "VENDOR9B", "V_9B", 155),
V156( "VENDOR9C", "V_9C", 156),
V157( "VENDOR9D", "V_9D", 157),
V158( "VENDOR9E", "V_9E", 158),
V159( "VENDOR9F", "V_9F", 159),
THALES( "THALES ", "THALES", 160),
V161( "VENDORA1", "V_A1", 161),
V162( "VENDORA2", "V_A2", 162),
V163( "VENDORA3", "V_A3", 163),
MACOM( "M/A-COM ", "M/A-COM", 164),
V165( "VENDORA5", "V_A5", 165),
V166( "VENDORA6", "V_A6", 166),
V167( "VENDORA7", "V_A7", 167),
V168( "VENDORA8", "V_A8", 168),
V169( "VENDORA9", "V_A9", 169),
V170( "VENDORAA", "V_AA", 170),
V171( "VENDORAB", "V_AB", 171),
V172( "VENDORAC", "V_AC", 172),
V173( "VENDORAD", "V_AD", 173),
V174( "VENDORAE", "V_AE", 174),
V175( "VENDORAF", "V_AF", 175),
RATHEON( "RATHEON ", "RATHEON", 176),
V177( "VENDORB1", "V_B1", 177),
V178( "VENDORB2", "V_B2", 178),
V179( "VENDORB3", "V_B3", 179),
V180( "VENDORB4", "V_B4", 180),
V181( "VENDORB5", "V_B5", 181),
V182( "VENDORB6", "V_B6", 182),
V183( "VENDORB7", "V_B7", 183),
V184( "VENDORB8", "V_B8", 184),
V185( "VENDORB9", "V_B9", 185),
V186( "VENDORBA", "V_BA", 186),
V187( "VENDORBB", "V_BB", 187),
V188( "VENDORBC", "V_BC", 188),
V189( "VENDORBD", "V_BD", 189),
V190( "VENDORBE", "V_BE", 190),
V191( "VENDORBF", "V_BF", 191),
SEA( "SEA ", "SEA", 192),
V193( "VENDORC1", "V_C1", 193),
V194( "VENDORC2", "V_C2", 194),
V195( "VENDORC3", "V_C3", 195),
V196( "VENDORC4", "V_C4", 196),
V197( "VENDORC5", "V_C5", 197),
V198( "VENDORC6", "V_C6", 198),
V199( "VENDORC7", "V_C7", 199),
SECURICOR( "SECURICO", "SECURICOR", 200),
V201( "VENDORC9", "V_C9", 201),
V202( "VENDORCA", "V_CA", 202),
V203( "VENDORCB", "V_CB", 203),
V204( "VENDORCC", "V_CC", 204),
V205( "VENDORCD", "V_CD", 205),
V206( "VENDORCE", "V_CE", 206),
V207( "VENDORCF", "V_CF", 207),
ADI( "ADI ", "ADI", 208),
V209( "VENDORD1", "V_D1", 209),
V210( "VENDORD2", "V_D2", 210),
V211( "VENDORD3", "V_D3", 211),
V212( "VENDORD4", "V_D4", 212),
V213( "VENDORD5", "V_D5", 213),
V214( "VENDORD6", "V_D6", 214),
V215( "VENDORD7", "V_D7", 215),
TAIT( "TAIT ", "TAIT", 216),
V217( "VENDORD9", "V_D9", 217),
V218( "VENDORDA", "V_DA", 218),
V219( "VENDORDB", "V_DB", 219),
V220( "VENDORDC", "V_DC", 220),
V221( "VENDORDD", "V_DD", 221),
V222( "VENDORDE", "V_DE", 222),
V223( "VENDORDF", "V_DF", 223),
TELETEC( "TELETEC ", "TELETEC", 224),
V225( "VENDORE1", "V_E1", 225),
V226( "VENDORE2", "V_E2", 226),
V227( "VENDORE3", "V_E3", 227),
V228( "VENDORE4", "V_E4", 228),
V229( "VENDORE5", "V_E5", 229),
V230( "VENDORE6", "V_E6", 230),
V231( "VENDORE7", "V_E7", 231),
V232( "VENDORE8", "V_E8", 232),
V233( "VENDORE9", "V_E9", 233),
V234( "VENDOREA", "V_EA", 234),
V235( "VENDOREB", "V_EB", 235),
V236( "VENDOREC", "V_EC", 236),
V237( "VENDORED", "V_ED", 237),
V238( "VENDOREE", "V_EE", 238),
V239( "VENDOREF", "V_EF", 239),
TRANSCRYPT( "TRANSCRPT", "TRANSCRYPT", 240),
V241( "VENDORF1", "V_F1", 241),
V242( "VENDORF2", "V_F2", 242),
V243( "VENDORF3", "V_F3", 243),
V244( "VENDORF4", "V_F4", 244),
V245( "VENDORF5", "V_F5", 245),
V246( "VENDORF6", "V_F6", 246),
V247( "VENDORF7", "V_F7", 247),
V248( "VENDORF8", "V_F8", 248),
V249( "VENDORF9", "V_F9", 249),
V250( "VENDORFA", "V_FA", 250),
V251( "VENDORFB", "V_FB", 251),
V252( "VENDORFC", "V_FC", 252),
V253( "VENDORFD", "V_FD", 253),
V254( "VENDORFE", "V_FE", 254),
V255( "VENDORFF", "V_FF", 255),
VUNK( "UNKNOWN ", "UNKN", -1 );
private String mLabel;
private String mDescription;
private int mValue;
private Vendor( String label, String description, int value )
{
mLabel = label;
mDescription = description;
mValue = value;
}
public String getLabel()
{
return mLabel;
}
public String getDescription()
{
return mDescription;
}
public int getValue()
{
return mValue;
}
public static Vendor fromValue( int value )
{
if( 0 <= value && value <= 255 )
{
return values()[ value ];
}
return VUNK;
}
}

View File

@@ -0,0 +1,106 @@
package module.decode.p25.reference;
public enum VendorLinkControlOpcode
{
RESERVED_00( "OPCODE_00", "RESERVED", 0 ),
RESERVED_01( "OPCODE_01", "RESERVED", 1 ),
RESERVED_02( "OPCODE_02", "RESERVED", 2 ),
RESERVED_03( "OPCODE_03", "RESERVED", 3 ),
RESERVED_04( "OPCODE_04", "RESERVED", 4 ),
RESERVED_05( "OPCODE_05", "RESERVED", 5 ),
RESERVED_06( "OPCODE_06", "RESERVED", 6 ),
RESERVED_07( "OPCODE_07", "RESERVED", 7 ),
RESERVED_08( "OPCODE_0B", "RESERVED", 8 ),
RESERVED_09( "OPCODE_0B", "RESERVED", 9 ),
RESERVED_0A( "OPCODE_0B", "RESERVED", 10 ),
RESERVED_0B( "OPCODE_0B", "RESERVED", 11 ),
RESERVED_0C( "OPCODE_0C", "RESERVED", 12 ),
RESERVED_0D( "OPCODE_0D", "RESERVED", 13 ),
RESERVED_0E( "OPCODE_0E", "RESERVED", 14 ),
RESERVED_0F( "OPCODE_0F", "RESERVED", 15 ),
RESERVED_10( "OPCODE_10", "RESERVED", 16 ),
RESERVED_11( "OPCODE_11", "RESERVED", 17 ),
RESERVED_12( "OPCODE_12", "RESERVED", 18 ),
RESERVED_13( "OPCODE_13", "RESERVED", 19 ),
RESERVED_14( "OPCODE_14", "RESERVED", 20 ),
RESERVED_15( "OPCODE_15", "RESERVED", 21 ),
RESERVED_16( "OPCODE_16", "RESERVED", 22 ),
RESERVED_17( "OPCODE_17", "RESERVED", 23 ),
RESERVED_18( "OPCODE_18", "RESERVED", 24 ),
RESERVED_19( "OPCODE_19", "RESERVED", 25 ),
RESERVED_1A( "OPCODE_1A", "RESERVED", 26 ),
RESERVED_1B( "OPCODE_1B", "RESERVED", 27 ),
RESERVED_1C( "OPCODE_1C", "RESERVED", 28 ),
RESERVED_1D( "OPCODE_1D", "RESERVED", 29 ),
RESERVED_1E( "OPCODE_1E", "RESERVED", 30 ),
RESERVED_1F( "OPCODE_1F", "RESERVED", 31 ),
RESERVED_20( "OPCODE_20", "RESERVED", 32 ),
RESERVED_21( "OPCODE_21", "RESERVED", 33 ),
RESERVED_22( "OPCODE_22", "RESERVED", 34 ),
RESERVED_23( "OPCODE_23", "RESERVED", 35 ),
RESERVED_24( "OPCODE_24", "RESERVED", 36 ),
RESERVED_25( "OPCODE_25", "RESERVED", 37 ),
RESERVED_26( "OPCODE_26", "RESERVED", 38 ),
RESERVED_27( "OPCODE_27", "RESERVED", 39 ),
RESERVED_28( "OPCODE_28", "RESERVED", 40 ),
RESERVED_29( "OPCODE_29", "RESERVED", 41 ),
RESERVED_2A( "OPCODE_2A", "RESERVED", 42 ),
RESERVED_2B( "OPCODE_2B", "RESERVED", 43 ),
RESERVED_2C( "OPCODE_2C", "RESERVED", 44 ),
RESERVED_2D( "OPCODE_2D", "RESERVED", 45 ),
RESERVED_2E( "OPCODE_2E", "RESERVED", 46 ),
RESERVED_2F( "OPCODE_2F", "RESERVED", 47 ),
RESERVED_30( "OPCODE_30", "RESERVED", 48 ),
RESERVED_31( "OPCODE_31", "RESERVED", 49 ),
RESERVED_32( "OPCODE_32", "RESERVED", 50 ),
RESERVED_33( "OPCODE_33", "RESERVED", 51 ),
RESERVED_34( "OPCODE_34", "RESERVED", 52 ),
RESERVED_35( "OPCODE_35", "RESERVED", 53 ),
RESERVED_36( "OPCODE_36", "RESERVED", 54 ),
RESERVED_37( "OPCODE_37", "RESERVED", 55 ),
RESERVED_38( "OPCODE_38", "RESERVED", 56 ),
RESERVED_39( "OPCODE_39", "RESERVED", 57 ),
RESERVED_3A( "OPCODE_3A", "RESERVED", 58 ),
RESERVED_3B( "OPCODE_3B", "RESERVED", 59 ),
RESERVED_3C( "OPCODE_3C", "RESERVED", 60 ),
RESERVED_3D( "OPCODE_3D", "RESERVED", 61 ),
RESERVED_3E( "OPCODE_3E", "RESERVED", 62 ),
RESERVED_3F( "OPCODE_3F", "RESERVED", 63 ),
UNKNOWN( "UNKNOWN OPCODE", "UNKNOWN", -1 );
private String mLabel;
private String mDescription;
private int mCode;
private VendorLinkControlOpcode( String label, String description, int code )
{
mLabel = label;
mDescription = description;
mCode = code;
}
public String getLabel()
{
return mLabel;
}
public String getDescription()
{
return mDescription;
}
public int getCode()
{
return mCode;
}
public static VendorLinkControlOpcode fromValue( int value )
{
if( 0 <= value && value <= 63 )
{
return values()[ value ];
}
return UNKNOWN;
}
}