P25 - work in progress - this is a fairly stable version of the P25 channel state. There is still work to do, but I'm going to release a test version based on this commit.

- Channel state now processes HDU, TDU, TDULC, PDU, PDULC, LDU1/2, LDULC
This commit is contained in:
dennis.sheirer
2015-02-22 18:46:03 +00:00
parent a0b38afee1
commit d7a03c7196
59 changed files with 2392 additions and 1331 deletions

View File

@@ -98,6 +98,11 @@ public abstract class CallEvent
return mFromID; return mFromID;
} }
public boolean hasFromID()
{
return mFromID != null;
}
public void setFromID( String id ) public void setFromID( String id )
{ {
mFromID = id; mFromID = id;
@@ -108,6 +113,11 @@ public abstract class CallEvent
return mToID; return mToID;
} }
public boolean hasToID()
{
return mToID != null;
}
public void setToID( String id ) public void setToID( String id )
{ {
mToID = id; mToID = id;

View File

@@ -34,7 +34,7 @@ import sample.Listener;
import alias.Alias; import alias.Alias;
import alias.AliasList; import alias.AliasList;
import controller.activity.ActivitySummaryProvider; import controller.activity.ActivitySummaryProvider;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.pdu.PDUMessage; import decode.p25.message.pdu.PDUMessage;
import decode.p25.message.pdu.osp.control.NetworkStatusBroadcastExtended; import decode.p25.message.pdu.osp.control.NetworkStatusBroadcastExtended;
import decode.p25.message.pdu.osp.control.ProtectionParameterBroadcast; import decode.p25.message.pdu.osp.control.ProtectionParameterBroadcast;
@@ -296,7 +296,7 @@ public class P25ActivitySummary implements ActivitySummaryProvider,
sb.append( "\nFREQUENCY BANDS:" ); sb.append( "\nFREQUENCY BANDS:" );
for( Integer id: identifiers ) for( Integer id: identifiers )
{ {
IdentifierProvider band = mBands.get( id ); IBandIdentifier band = mBands.get( id );
sb.append( "\n\t" + id ); sb.append( "\n\t" + id );
sb.append( "- BASE: " + mFrequencyFormatter.format( sb.append( "- BASE: " + mFrequencyFormatter.format(

File diff suppressed because it is too large Load Diff

View File

@@ -10,8 +10,8 @@ import org.slf4j.LoggerFactory;
import sample.Broadcaster; import sample.Broadcaster;
import sample.Listener; import sample.Listener;
import alias.AliasList; import alias.AliasList;
import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.tsbk.osp.control.IdentifierUpdate;
public class P25MessageProcessor implements Listener<Message> public class P25MessageProcessor implements Listener<Message>
{ {
@@ -23,8 +23,8 @@ public class P25MessageProcessor implements Listener<Message>
/* Map of up to 16 band identifiers per RFSS. These identifier update /* Map of up to 16 band identifiers per RFSS. These identifier update
* messages are inserted into any message that conveys channel information * messages are inserted into any message that conveys channel information
* so that the uplink/downlink frequencies can be calculated */ * so that the uplink/downlink frequencies can be calculated */
private HashMap<Integer,IdentifierUpdate> mIdentifierMap = private HashMap<Integer,IBandIdentifier> mBandIdentifierMap =
new HashMap<Integer,IdentifierUpdate>(); new HashMap<Integer,IBandIdentifier>();
private AliasList mAliasList; private AliasList mAliasList;
@@ -48,17 +48,18 @@ public class P25MessageProcessor implements Listener<Message>
for( int identifier: identifiers ) for( int identifier: identifiers )
{ {
receiver.setIdentifierMessage( identifier, receiver.setIdentifierMessage( identifier,
mIdentifierMap.get( identifier ) ); mBandIdentifierMap.get( identifier ) );
} }
} }
/* Store band identifiers so that they can be injected into channel /* Store band identifiers so that they can be injected into channel
* type messages */ * type messages */
if( message instanceof IdentifierUpdate ) if( message instanceof IBandIdentifier )
{ {
IdentifierUpdate identifierUpdate = (IdentifierUpdate)message; IBandIdentifier bandIdentifier = (IBandIdentifier)message;
mIdentifierMap.put( identifierUpdate.getIdentifier(), identifierUpdate ); mBandIdentifierMap.put( bandIdentifier.getIdentifier(),
bandIdentifier );
} }
mBroadcaster.broadcast( message ); mBroadcaster.broadcast( message );
@@ -67,7 +68,7 @@ public class P25MessageProcessor implements Listener<Message>
public void dispose() public void dispose()
{ {
mIdentifierMap.clear(); mBandIdentifierMap.clear();
mBroadcaster.dispose(); mBroadcaster.dispose();
} }

View File

@@ -25,6 +25,7 @@ import settings.ColorSetting;
import settings.Setting; import settings.Setting;
import controller.channel.Channel; import controller.channel.Channel;
import controller.state.ChannelState.ChangedAttribute; import controller.state.ChannelState.ChangedAttribute;
import controller.state.ChannelState.State;
import controller.state.ChannelStatePanel; import controller.state.ChannelStatePanel;
import decode.config.DecodeConfigP25Phase1; import decode.config.DecodeConfigP25Phase1;
@@ -86,7 +87,7 @@ public class P25Panel extends ChannelStatePanel
mFromAlias.setFont( mFontDecoder ); mFromAlias.setFont( mFontDecoder );
mFromAlias.setForeground( mColorLabelDecoder ); mFromAlias.setForeground( mColorLabelDecoder );
mNAC.setFont( mFontDecoder ); mNAC.setFont( mFontDetails );
mNAC.setForeground( mColorLabelDecoder ); mNAC.setForeground( mColorLabelDecoder );
mTo.setFont( mFontDecoder ); mTo.setFont( mFontDecoder );
@@ -95,13 +96,13 @@ public class P25Panel extends ChannelStatePanel
mToAlias.setFont( mFontDecoder ); mToAlias.setFont( mFontDecoder );
mToAlias.setForeground( mColorLabelDecoder ); mToAlias.setForeground( mColorLabelDecoder );
mSystem.setFont( mFontDecoder ); mSystem.setFont( mFontDetails );
mSystem.setForeground( mColorLabelDecoder ); mSystem.setForeground( mColorLabelDecoder );
mSiteAlias.setFont( mFontDecoder ); mSiteAlias.setFont( mFontDecoder );
mSiteAlias.setForeground( mColorLabelDecoder ); mSiteAlias.setForeground( mColorLabelDecoder );
mSite.setFont( mFontDecoder ); mSite.setFont( mFontDetails );
mSite.setForeground( mColorLabelDecoder ); mSite.setForeground( mColorLabelDecoder );
add( mStateLabel ); add( mStateLabel );
@@ -135,7 +136,17 @@ public class P25Panel extends ChannelStatePanel
switch( changedAttribute ) switch( changedAttribute )
{ {
case CHANNEL_STATE: case CHANNEL_STATE:
mStateLabel.setText( channelState.getState().getDisplayValue() ); State state = channelState.getState();
mStateLabel.setText( state.getDisplayValue() );
if( state == State.IDLE )
{
mFrom.setText( null );
mFromAlias.setText( null );
mTo.setText( null );
mToAlias.setText( null );
}
break; break;
case SOURCE: case SOURCE:
mSourceLabel.setText( mChannel.getSourceConfiguration() mSourceLabel.setText( mChannel.getSourceConfiguration()

View File

@@ -1,6 +1,6 @@
package decode.p25.message; package decode.p25.message;
public interface IdentifierProvider public interface IBandIdentifier
{ {
/** /**

View File

@@ -8,7 +8,7 @@ package decode.p25.message;
*/ */
public interface IdentifierReceiver public interface IdentifierReceiver
{ {
public void setIdentifierMessage( int identifier, IdentifierProvider message ); public void setIdentifierMessage( int identifier, IBandIdentifier message );
public int[] getIdentifiers(); public int[] getIdentifiers();
} }

View File

@@ -179,7 +179,7 @@ public class P25Message extends Message
* @param channel - channel number * @param channel - channel number
* @return - frequency in Hertz * @return - frequency in Hertz
*/ */
protected static long calculateUplink( IdentifierProvider iden, int channel ) protected static long calculateUplink( IBandIdentifier iden, int channel )
{ {
long downlink = calculateDownlink( iden, channel ); long downlink = calculateDownlink( iden, channel );
@@ -199,7 +199,7 @@ public class P25Message extends Message
* @param channel - channel number * @param channel - channel number
* @return - frequency in Hertz * @return - frequency in Hertz
*/ */
protected static long calculateDownlink( IdentifierProvider iden, int channel ) protected static long calculateDownlink( IBandIdentifier iden, int channel )
{ {
if( iden != null ) if( iden != null )
{ {

View File

@@ -1,5 +1,6 @@
package decode.p25.message.hdu; package decode.p25.message.hdu;
import alias.Alias;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.P25Message; import decode.p25.message.P25Message;
@@ -58,7 +59,16 @@ public class HDUMessage extends P25Message
if( encryption != Encryption.UNENCRYPTED ) if( encryption != Encryption.UNENCRYPTED )
{ {
sb.append( " ENCRYPTION:" ); sb.append( " ENCRYPTION:" );
sb.append( encryption.name() );
if( encryption == Encryption.UNKNOWN )
{
sb.append( "UNK ALGO ID:" );
sb.append( mMessage.getInt( ALGORITHM_ID ) );
}
else
{
sb.append( encryption.name() );
}
sb.append( " KEY ID:" + getKeyID() ); sb.append( " KEY ID:" + getKeyID() );
sb.append( " MSG INDICATOR:" + getMessageIndicator() ); sb.append( " MSG INDICATOR:" + getMessageIndicator() );
} }
@@ -98,6 +108,12 @@ public class HDUMessage extends P25Message
return mMessage.getHex( TALKGROUP_ID, 4 ); return mMessage.getHex( TALKGROUP_ID, 4 );
} }
@Override
public String getToID()
{
return getTalkgroupID();
}
/* Temporary override */ /* Temporary override */
public boolean isValid() public boolean isValid()
{ {

View File

@@ -3,7 +3,7 @@ package decode.p25.message.ldu.lc;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.ldu.LDU1Message; import decode.p25.message.ldu.LDU1Message;
import decode.p25.reference.LinkControlOpcode; import decode.p25.reference.LinkControlOpcode;
@@ -26,7 +26,7 @@ public class AdjacentSiteStatusBroadcast extends LDU1Message
public static final int[] SYSTEM_SERVICE_CLASS = { 744,745,750,751,752,753, public static final int[] SYSTEM_SERVICE_CLASS = { 744,745,750,751,752,753,
754,755 }; 754,755 };
private IdentifierProvider mIdentifierUpdate; private IBandIdentifier mIdentifierUpdate;
public AdjacentSiteStatusBroadcast( LDU1Message message ) public AdjacentSiteStatusBroadcast( LDU1Message message )
{ {
@@ -100,7 +100,7 @@ public class AdjacentSiteStatusBroadcast extends LDU1Message
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
mIdentifierUpdate = message; mIdentifierUpdate = message;
} }

View File

@@ -3,12 +3,12 @@ package decode.p25.message.ldu.lc;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.ldu.LDU1Message; import decode.p25.message.ldu.LDU1Message;
import decode.p25.reference.LinkControlOpcode; import decode.p25.reference.LinkControlOpcode;
public class ChannelIdentifierUpdate extends LDU1Message public class ChannelIdentifierUpdate extends LDU1Message
implements IdentifierProvider implements IBandIdentifier
{ {
private final static Logger mLog = private final static Logger mLog =
LoggerFactory.getLogger( ChannelIdentifierUpdate.class ); LoggerFactory.getLogger( ChannelIdentifierUpdate.class );

View File

@@ -3,12 +3,12 @@ package decode.p25.message.ldu.lc;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.ldu.LDU1Message; import decode.p25.message.ldu.LDU1Message;
import decode.p25.reference.LinkControlOpcode; import decode.p25.reference.LinkControlOpcode;
public class ChannelIdentifierUpdateExplicit extends LDU1Message public class ChannelIdentifierUpdateExplicit extends LDU1Message
implements IdentifierProvider implements IBandIdentifier
{ {
private final static Logger mLog = private final static Logger mLog =
LoggerFactory.getLogger( ChannelIdentifierUpdateExplicit.class ); LoggerFactory.getLogger( ChannelIdentifierUpdateExplicit.class );

View File

@@ -3,7 +3,7 @@ package decode.p25.message.ldu.lc;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.ldu.LDU1Message; import decode.p25.message.ldu.LDU1Message;
import decode.p25.reference.LinkControlOpcode; import decode.p25.reference.LinkControlOpcode;
@@ -25,8 +25,8 @@ public class GroupVoiceChannelUpdate extends LDU1Message
public static final int[] GROUP_ADDRESS_B = { 732,733,734,735,740,741,742, public static final int[] GROUP_ADDRESS_B = { 732,733,734,735,740,741,742,
743,744,745,750,751,752,753,754,755 }; 743,744,745,750,751,752,753,754,755 };
private IdentifierProvider mIdentifierUpdateA; private IBandIdentifier mIdentifierUpdateA;
private IdentifierProvider mIdentifierUpdateB; private IBandIdentifier mIdentifierUpdateB;
public GroupVoiceChannelUpdate( LDU1Message message ) public GroupVoiceChannelUpdate( LDU1Message message )
{ {
@@ -106,7 +106,7 @@ public class GroupVoiceChannelUpdate extends LDU1Message
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getChannelIdentifierA() ) if( identifier == getChannelIdentifierA() )
{ {

View File

@@ -3,7 +3,7 @@ package decode.p25.message.ldu.lc;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.P25Message.DuplexMode; import decode.p25.message.P25Message.DuplexMode;
import decode.p25.message.P25Message.SessionMode; import decode.p25.message.P25Message.SessionMode;
@@ -29,8 +29,8 @@ public class GroupVoiceChannelUpdateExplicit extends LDU1Message
public static final int[] RECEIVE_CHANNEL = { 740,741,742,743,744,745,750, public static final int[] RECEIVE_CHANNEL = { 740,741,742,743,744,745,750,
751,752,753,754,755 }; 751,752,753,754,755 };
private IdentifierProvider mTransmitIdentifierUpdate; private IBandIdentifier mTransmitIdentifierUpdate;
private IdentifierProvider mReceiveIdentifierUpdate; private IBandIdentifier mReceiveIdentifierUpdate;
public GroupVoiceChannelUpdateExplicit( LDU1Message message ) public GroupVoiceChannelUpdateExplicit( LDU1Message message )
{ {
@@ -120,7 +120,7 @@ public class GroupVoiceChannelUpdateExplicit extends LDU1Message
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getTransmitChannelIdentifier() ) if( identifier == getTransmitChannelIdentifier() )
{ {

View File

@@ -3,7 +3,7 @@ package decode.p25.message.ldu.lc;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.ldu.LDU1Message; import decode.p25.message.ldu.LDU1Message;
import decode.p25.reference.LinkControlOpcode; import decode.p25.reference.LinkControlOpcode;
@@ -24,7 +24,7 @@ public class NetworkStatusBroadcast extends LDU1Message
public static final int[] SYSTEM_SERVICE_CLASS = { 744,745,750,751,752,753, public static final int[] SYSTEM_SERVICE_CLASS = { 744,745,750,751,752,753,
754,755 }; 754,755 };
private IdentifierProvider mIdentifierUpdate; private IBandIdentifier mIdentifierUpdate;
public NetworkStatusBroadcast( LDU1Message source ) public NetworkStatusBroadcast( LDU1Message source )
{ {
@@ -45,7 +45,7 @@ public class NetworkStatusBroadcast extends LDU1Message
sb.append( getMessageStub() ); sb.append( getMessageStub() );
sb.append( " NETWORK:" + getNetworkID() ); sb.append( " NETWORK:" + getNetworkID() );
sb.append( " SYS:" + getSystemID() ); sb.append( " SYS:" + getSystem() );
sb.append( " CHAN:" + getChannel() ); sb.append( " CHAN:" + getChannel() );
sb.append( " " + Service.getServices( getSystemServiceClass() ).toString() ); sb.append( " " + Service.getServices( getSystemServiceClass() ).toString() );
@@ -57,7 +57,7 @@ public class NetworkStatusBroadcast extends LDU1Message
return mMessage.getHex( NETWORK_ID, 5 ); return mMessage.getHex( NETWORK_ID, 5 );
} }
public String getSystemID() public String getSystem()
{ {
return mMessage.getHex( SYSTEM_ID, 3 ); return mMessage.getHex( SYSTEM_ID, 3 );
} }
@@ -83,7 +83,7 @@ public class NetworkStatusBroadcast extends LDU1Message
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
mIdentifierUpdate = message; mIdentifierUpdate = message;
} }

View File

@@ -3,7 +3,7 @@ package decode.p25.message.ldu.lc;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.ldu.LDU1Message; import decode.p25.message.ldu.LDU1Message;
import decode.p25.reference.LinkControlOpcode; import decode.p25.reference.LinkControlOpcode;
@@ -24,8 +24,8 @@ public class NetworkStatusBroadcastExplicit extends LDU1Message
public static final int[] RECEIVE_CHANNEL = { 740,741,742,743,744,745,750, public static final int[] RECEIVE_CHANNEL = { 740,741,742,743,744,745,750,
751,752,753,754,755 }; 751,752,753,754,755 };
private IdentifierProvider mTransmitIdentifierUpdate; private IBandIdentifier mTransmitIdentifierUpdate;
private IdentifierProvider mReceiveIdentifierUpdate; private IBandIdentifier mReceiveIdentifierUpdate;
public NetworkStatusBroadcastExplicit( LDU1Message message ) public NetworkStatusBroadcastExplicit( LDU1Message message )
{ {
@@ -46,7 +46,7 @@ public class NetworkStatusBroadcastExplicit extends LDU1Message
sb.append( getMessageStub() ); sb.append( getMessageStub() );
sb.append( " NETWORK:" + getNetworkID() ); sb.append( " NETWORK:" + getNetworkID() );
sb.append( " SYS:" + getSystemID() ); sb.append( " SYS:" + getSystem() );
sb.append( " TRANSMIT:" + getTransmitChannel() ); sb.append( " TRANSMIT:" + getTransmitChannel() );
sb.append( " RECEIVE:" + getReceiveChannel() ); sb.append( " RECEIVE:" + getReceiveChannel() );
@@ -58,7 +58,7 @@ public class NetworkStatusBroadcastExplicit extends LDU1Message
return mMessage.getHex( NETWORK_ID, 5 ); return mMessage.getHex( NETWORK_ID, 5 );
} }
public String getSystemID() public String getSystem()
{ {
return mMessage.getHex( SYSTEM_ID, 3 ); return mMessage.getHex( SYSTEM_ID, 3 );
} }
@@ -94,7 +94,7 @@ public class NetworkStatusBroadcastExplicit extends LDU1Message
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getTransmitIdentifier() ) if( identifier == getTransmitIdentifier() )
{ {

View File

@@ -3,7 +3,7 @@ package decode.p25.message.ldu.lc;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.ldu.LDU1Message; import decode.p25.message.ldu.LDU1Message;
import decode.p25.message.tsbk.osp.control.SystemService; import decode.p25.message.tsbk.osp.control.SystemService;
@@ -26,7 +26,7 @@ public class RFSSStatusBroadcast extends LDU1Message
public static final int[] SYSTEM_SERVICE_CLASS = { 744,745,750,751,752,753, public static final int[] SYSTEM_SERVICE_CLASS = { 744,745,750,751,752,753,
754,755 }; 754,755 };
private IdentifierProvider mIdentifierUpdate; private IBandIdentifier mIdentifierUpdate;
public RFSSStatusBroadcast( LDU1Message message ) public RFSSStatusBroadcast( LDU1Message message )
{ {
@@ -102,7 +102,7 @@ public class RFSSStatusBroadcast extends LDU1Message
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
mIdentifierUpdate = message; mIdentifierUpdate = message;
} }

View File

@@ -3,7 +3,7 @@ package decode.p25.message.ldu.lc;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.ldu.LDU1Message; import decode.p25.message.ldu.LDU1Message;
import decode.p25.message.tsbk.osp.control.SystemService; import decode.p25.message.tsbk.osp.control.SystemService;
@@ -26,8 +26,8 @@ public class RFSSStatusBroadcastExplicit extends LDU1Message
735,740,741,742,743 }; 735,740,741,742,743 };
public static final int[] SYSTEM_SERVICE_CLASS = { 744,745,750,751,752,753,754,755 }; public static final int[] SYSTEM_SERVICE_CLASS = { 744,745,750,751,752,753,754,755 };
private IdentifierProvider mTransmitIdentifierUpdate; private IBandIdentifier mTransmitIdentifierUpdate;
private IdentifierProvider mReceiveIdentifierUpdate; private IBandIdentifier mReceiveIdentifierUpdate;
public RFSSStatusBroadcastExplicit( LDU1Message source ) public RFSSStatusBroadcastExplicit( LDU1Message source )
{ {
@@ -113,7 +113,7 @@ public class RFSSStatusBroadcastExplicit extends LDU1Message
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getTransmitIdentifier() ) if( identifier == getTransmitIdentifier() )
{ {

View File

@@ -3,7 +3,7 @@ package decode.p25.message.ldu.lc;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.ldu.LDU1Message; import decode.p25.message.ldu.LDU1Message;
import decode.p25.message.tsbk.osp.control.SystemService; import decode.p25.message.tsbk.osp.control.SystemService;
@@ -26,8 +26,8 @@ public class SecondaryControlChannelBroadcast extends LDU1Message
741,742,743 }; 741,742,743 };
public static final int[] SYSTEM_SERVICE_CLASS_B = { 744,745,750,751,752,753,754,755 }; public static final int[] SYSTEM_SERVICE_CLASS_B = { 744,745,750,751,752,753,754,755 };
private IdentifierProvider mIdentifierProviderA; private IBandIdentifier mIdentifierProviderA;
private IdentifierProvider mIdentifierProviderB; private IBandIdentifier mIdentifierProviderB;
public SecondaryControlChannelBroadcast( LDU1Message message ) public SecondaryControlChannelBroadcast( LDU1Message message )
{ {
@@ -111,7 +111,7 @@ public class SecondaryControlChannelBroadcast extends LDU1Message
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getIdentifierA() ) if( identifier == getIdentifierA() )
{ {

View File

@@ -3,7 +3,7 @@ package decode.p25.message.ldu.lc;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.ldu.LDU1Message; import decode.p25.message.ldu.LDU1Message;
import decode.p25.message.tsbk.osp.control.SystemService; import decode.p25.message.tsbk.osp.control.SystemService;
@@ -26,8 +26,8 @@ public class SecondaryControlChannelBroadcastExplicit
public static final int[] SYSTEM_SERVICE_CLASS = { 732,733,734,735,740,741, public static final int[] SYSTEM_SERVICE_CLASS = { 732,733,734,735,740,741,
742,743 }; 742,743 };
private IdentifierProvider mTransmitIdentifierProvider; private IBandIdentifier mTransmitIdentifierProvider;
private IdentifierProvider mReceiveIdentifierProvider; private IBandIdentifier mReceiveIdentifierProvider;
public SecondaryControlChannelBroadcastExplicit( LDU1Message message ) public SecondaryControlChannelBroadcastExplicit( LDU1Message message )
{ {
@@ -104,7 +104,7 @@ public class SecondaryControlChannelBroadcastExplicit
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getTransmitIdentifier() ) if( identifier == getTransmitIdentifier() )
{ {

View File

@@ -3,6 +3,7 @@ package decode.p25.message.pdu;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.P25Message; import decode.p25.message.P25Message;
import decode.p25.message.tsbk.vendor.VendorOpcode;
import decode.p25.reference.DataUnitID; import decode.p25.reference.DataUnitID;
import decode.p25.reference.Opcode; import decode.p25.reference.Opcode;
import decode.p25.reference.PDUFormat; import decode.p25.reference.PDUFormat;
@@ -151,6 +152,16 @@ public class PDUMessage extends P25Message
return Opcode.UNKNOWN; return Opcode.UNKNOWN;
} }
public VendorOpcode getVendorOpcode()
{
if( getFormat() == PDUFormat.ALTERNATE_MULTI_BLOCK_TRUNKING_CONTROL )
{
return VendorOpcode.fromValue( mMessage.getInt( OPCODE ) );
}
return VendorOpcode.UNKNOWN;
}
public int getDataHeaderOffset() public int getDataHeaderOffset()
{ {
return mMessage.getInt( DATA_HEADER_OFFSET ); return mMessage.getInt( DATA_HEADER_OFFSET );

View File

@@ -2,7 +2,7 @@ package decode.p25.message.pdu;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.reference.DataUnitID; import decode.p25.reference.DataUnitID;
import decode.p25.reference.Opcode; import decode.p25.reference.Opcode;
@@ -39,8 +39,8 @@ public abstract class UnitToUnitChannelGrantExtended extends PDUMessage
326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342, 326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,
343,344,345,346,347,348,349,350,351 }; 343,344,345,346,347,348,349,350,351 };
private IdentifierProvider mTransmitIdentifierUpdate; private IBandIdentifier mTransmitIdentifierUpdate;
private IdentifierProvider mReceiveIdentifierUpdate; private IBandIdentifier mReceiveIdentifierUpdate;
public UnitToUnitChannelGrantExtended( BinaryMessage message, public UnitToUnitChannelGrantExtended( BinaryMessage message,
DataUnitID duid, AliasList aliasList ) DataUnitID duid, AliasList aliasList )
@@ -175,7 +175,7 @@ public abstract class UnitToUnitChannelGrantExtended extends PDUMessage
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getTransmitChannelIdentifier() ) if( identifier == getTransmitChannelIdentifier() )
{ {

View File

@@ -2,7 +2,7 @@ package decode.p25.message.pdu.osp.control;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.pdu.PDUMessage; import decode.p25.message.pdu.PDUMessage;
import decode.p25.message.tsbk.osp.control.SystemService; import decode.p25.message.tsbk.osp.control.SystemService;
@@ -31,8 +31,8 @@ public class AdjacentStatusBroadcastExtended extends PDUMessage
230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247, 230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,
248,249,250,251,252,253,254,255 }; 248,249,250,251,252,253,254,255 };
private IdentifierProvider mTransmitIdentifierProvider; private IBandIdentifier mTransmitIdentifierProvider;
private IdentifierProvider mReceiveIdentifierProvider; private IBandIdentifier mReceiveIdentifierProvider;
public AdjacentStatusBroadcastExtended( BinaryMessage message, public AdjacentStatusBroadcastExtended( BinaryMessage message,
DataUnitID duid, AliasList aliasList ) DataUnitID duid, AliasList aliasList )
@@ -136,7 +136,7 @@ public class AdjacentStatusBroadcastExtended extends PDUMessage
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getTransmitIdentifier() ) if( identifier == getTransmitIdentifier() )
{ {

View File

@@ -2,7 +2,7 @@ package decode.p25.message.pdu.osp.control;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.pdu.PDUMessage; import decode.p25.message.pdu.PDUMessage;
import decode.p25.message.tsbk.osp.control.SystemService; import decode.p25.message.tsbk.osp.control.SystemService;
@@ -31,8 +31,8 @@ public class NetworkStatusBroadcastExtended extends PDUMessage
230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247, 230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,
248,249,250,251,252,253,254,255 }; 248,249,250,251,252,253,254,255 };
private IdentifierProvider mTransmitIdentifierUpdate; private IBandIdentifier mTransmitIdentifierUpdate;
private IdentifierProvider mReceiveIdentifierUpdate; private IBandIdentifier mReceiveIdentifierUpdate;
public NetworkStatusBroadcastExtended( BinaryMessage message, public NetworkStatusBroadcastExtended( BinaryMessage message,
DataUnitID duid, AliasList aliasList ) DataUnitID duid, AliasList aliasList )
@@ -135,7 +135,7 @@ public class NetworkStatusBroadcastExtended extends PDUMessage
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getTransmitIdentifier() ) if( identifier == getTransmitIdentifier() )
{ {

View File

@@ -2,7 +2,7 @@ package decode.p25.message.pdu.osp.control;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.pdu.PDUMessage; import decode.p25.message.pdu.PDUMessage;
import decode.p25.message.tsbk.osp.control.SystemService; import decode.p25.message.tsbk.osp.control.SystemService;
@@ -31,8 +31,8 @@ public class RFSSStatusBroadcastExtended extends PDUMessage
230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247, 230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,
248,249,250,251,252,253,254,255 }; 248,249,250,251,252,253,254,255 };
private IdentifierProvider mTransmitIdentifierUpdate; private IBandIdentifier mTransmitIdentifierUpdate;
private IdentifierProvider mReceiveIdentifierUpdate; private IBandIdentifier mReceiveIdentifierUpdate;
public RFSSStatusBroadcastExtended( BinaryMessage message, public RFSSStatusBroadcastExtended( BinaryMessage message,
DataUnitID duid, AliasList aliasList ) DataUnitID duid, AliasList aliasList )
@@ -139,7 +139,7 @@ public class RFSSStatusBroadcastExtended extends PDUMessage
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getTransmitIdentifier() ) if( identifier == getTransmitIdentifier() )
{ {

View File

@@ -4,7 +4,7 @@ import java.util.Date;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.pdu.PDUMessage; import decode.p25.message.pdu.PDUMessage;
import decode.p25.reference.DataUnitID; import decode.p25.reference.DataUnitID;
@@ -36,8 +36,8 @@ public class GroupDataChannelGrantExtended extends PDUMessage
230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247, 230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,
248,249,250,251,252,253,254,255 }; 248,249,250,251,252,253,254,255 };
private IdentifierProvider mTransmitIdentifierUpdate; private IBandIdentifier mTransmitIdentifierUpdate;
private IdentifierProvider mReceiveIdentifierUpdate; private IBandIdentifier mReceiveIdentifierUpdate;
public GroupDataChannelGrantExtended( BinaryMessage message, public GroupDataChannelGrantExtended( BinaryMessage message,
DataUnitID duid, AliasList aliasList ) DataUnitID duid, AliasList aliasList )
@@ -154,7 +154,7 @@ public class GroupDataChannelGrantExtended extends PDUMessage
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getTransmitChannelIdentifier() ) if( identifier == getTransmitChannelIdentifier() )
{ {

View File

@@ -2,7 +2,7 @@ package decode.p25.message.pdu.osp.voice;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.pdu.PDUMessage; import decode.p25.message.pdu.PDUMessage;
import decode.p25.reference.DataUnitID; import decode.p25.reference.DataUnitID;
@@ -34,8 +34,8 @@ public class GroupVoiceChannelGrantExplicit extends PDUMessage
230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247, 230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,
248,249,250,251,252,253,254,255 }; 248,249,250,251,252,253,254,255 };
private IdentifierProvider mTransmitIdentifierUpdate; private IBandIdentifier mTransmitIdentifierUpdate;
private IdentifierProvider mReceiveIdentifierUpdate; private IBandIdentifier mReceiveIdentifierUpdate;
public GroupVoiceChannelGrantExplicit( BinaryMessage message, public GroupVoiceChannelGrantExplicit( BinaryMessage message,
DataUnitID duid, AliasList aliasList ) DataUnitID duid, AliasList aliasList )
@@ -152,7 +152,7 @@ public class GroupVoiceChannelGrantExplicit extends PDUMessage
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getTransmitChannelIdentifier() ) if( identifier == getTransmitChannelIdentifier() )
{ {

View File

@@ -4,7 +4,7 @@ import java.util.Date;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.pdu.PDUMessage; import decode.p25.message.pdu.PDUMessage;
import decode.p25.reference.DataUnitID; import decode.p25.reference.DataUnitID;
@@ -36,8 +36,8 @@ public class TelephoneInterconnectChannelGrantExplicit extends PDUMessage
230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247, 230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,
248,249,250,251,252,253,254,255 }; 248,249,250,251,252,253,254,255 };
private IdentifierProvider mTransmitIdentifierUpdate; private IBandIdentifier mTransmitIdentifierUpdate;
private IdentifierProvider mReceiveIdentifierUpdate; private IBandIdentifier mReceiveIdentifierUpdate;
public TelephoneInterconnectChannelGrantExplicit( BinaryMessage message, public TelephoneInterconnectChannelGrantExplicit( BinaryMessage message,
DataUnitID duid, AliasList aliasList ) DataUnitID duid, AliasList aliasList )
@@ -159,7 +159,7 @@ public class TelephoneInterconnectChannelGrantExplicit extends PDUMessage
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getTransmitChannelIdentifier() ) if( identifier == getTransmitChannelIdentifier() )
{ {

View File

@@ -2,7 +2,7 @@ package decode.p25.message.pdu.osp.voice;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.pdu.PDUMessage; import decode.p25.message.pdu.PDUMessage;
import decode.p25.reference.DataUnitID; import decode.p25.reference.DataUnitID;
@@ -40,8 +40,8 @@ public class UnitToUnitVoiceChannelGrantUpdateExtended extends PDUMessage
326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342, 326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,
343,344,345,346,347,348,349,350,351 }; 343,344,345,346,347,348,349,350,351 };
private IdentifierProvider mTransmitIdentifierUpdate; private IBandIdentifier mTransmitIdentifierUpdate;
private IdentifierProvider mReceiveIdentifierUpdate; private IBandIdentifier mReceiveIdentifierUpdate;
public UnitToUnitVoiceChannelGrantUpdateExtended( BinaryMessage message, public UnitToUnitVoiceChannelGrantUpdateExtended( BinaryMessage message,
DataUnitID duid, AliasList aliasList ) DataUnitID duid, AliasList aliasList )
@@ -182,7 +182,7 @@ public class UnitToUnitVoiceChannelGrantUpdateExtended extends PDUMessage
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getTransmitChannelIdentifier() ) if( identifier == getTransmitChannelIdentifier() )
{ {

View File

@@ -1,265 +0,0 @@
package decode.p25.message.tdu;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import alias.AliasList;
import bits.BinaryMessage;
import decode.p25.message.P25Message;
import decode.p25.reference.DataUnitID;
import decode.p25.reference.LinkControlOpcode;
import decode.p25.reference.Vendor;
import decode.p25.reference.VendorLinkControlOpcode;
import edac.CRC;
import edac.Galois24;
import edac.ReedSolomon_24_12_13;
public class TDULinkControlMessage extends P25Message
{
public final static Logger mLog = LoggerFactory.getLogger( TDULinkControlMessage.class );
public static final int[] LC_HEX_0 = { 64,65,66,67,68,69 };
public static final int[] LC_HEX_1 = { 70,71,72,73,74,75 };
public static final int[] LC_HEX_2 = { 88,89,90,91,92,93 };
public static final int[] LC_HEX_3 = { 94,95,96,97,98,99 };
public static final int[] LC_HEX_4 = { 112,113,114,115,116,117 };
public static final int[] LC_HEX_5 = { 118,119,120,121,122,123 };
public static final int[] LC_HEX_6 = { 136,137,138,139,140,141 };
public static final int[] LC_HEX_7 = { 142,143,144,145,146,147 };
public static final int[] LC_HEX_8 = { 160,161,162,163,164,165 };
public static final int[] LC_HEX_9 = { 166,167,168,169,170,171 };
public static final int[] LC_HEX_10 = { 184,185,186,187,188,189 };
public static final int[] LC_HEX_11 = { 190,191,192,193,194,195 };
public static final int[] RS_HEX_0 = { 208,209,210,211,212,213 };
public static final int[] RS_HEX_1 = { 214,215,216,217,218,219 };
public static final int[] RS_HEX_2 = { 232,233,234,235,236,237 };
public static final int[] RS_HEX_3 = { 238,239,240,241,242,243 };
public static final int[] RS_HEX_4 = { 256,257,258,259,260,261 };
public static final int[] RS_HEX_5 = { 262,263,264,265,266,267 };
public static final int[] RS_HEX_6 = { 280,281,282,283,284,285 };
public static final int[] RS_HEX_7 = { 286,287,288,289,290,291 };
public static final int[] RS_HEX_8 = { 304,305,306,307,308,309 };
public static final int[] RS_HEX_9 = { 310,311,312,313,314,315 };
public static final int[] RS_HEX_10 = { 328,329,330,331,332,333 };
public static final int[] RS_HEX_11 = { 334,335,336,337,338,339 };
public static final int ENCRYPTION_FLAG = 64;
public static final int IMPLICIT_VENDOR_FLAG = 65;
public static final int[] OPCODE = { 66,67,68,69,70,71 };
public static final int[] VENDOR = { 72,73,74,75,88,89,90,91 };
public static final ReedSolomon_24_12_13 mReedSolomonDecoder =
new ReedSolomon_24_12_13();
public TDULinkControlMessage( BinaryMessage message, DataUnitID duid,
AliasList aliasList )
{
super( message, duid, aliasList );
/* NID CRC is checked in the message framer so a constructed message
* means it passed the CRC */
mCRC = new CRC[ 3 ];
mCRC[ 0 ] = CRC.PASSED;
checkCRC();
}
/**
* Constructs a TDULinkControl message from an existing message and bypasses
* the CRC calculation.
*/
protected TDULinkControlMessage( TDULinkControlMessage message )
{
super( message.getSourceMessage(), DataUnitID.TDULC, message.getAliasList() );
mCRC = message.getCRC();
}
public CRC[] getCRC()
{
return mCRC;
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " " );
sb.append( mMessage.toString() );
return sb.toString();
}
public String getMessageStub()
{
StringBuilder sb = new StringBuilder();
sb.append( "NAC:" );
sb.append( getNAC() );
sb.append( " " );
sb.append( getDUID().getLabel() );
sb.append( " " );
if( isEncrypted() )
{
sb.append( "ENCRYPTED" );
}
else
{
if( isImplicitFormat() || getVendor() == Vendor.STANDARD )
{
sb.append( getOpcode().getLabel() );
}
else
{
sb.append( "VENDOR:" + getVendor().getLabel() + " " );
sb.append( getVendorOpcode().getLabel() );
}
}
return sb.toString();
}
public boolean isEncrypted()
{
return mMessage.get( ENCRYPTION_FLAG );
}
public boolean isImplicitFormat()
{
return mMessage.get( IMPLICIT_VENDOR_FLAG );
}
public LinkControlOpcode getOpcode()
{
return LinkControlOpcode.fromValue( mMessage.getInt( OPCODE ) );
}
public VendorLinkControlOpcode getVendorOpcode()
{
return VendorLinkControlOpcode.fromValue( mMessage.getInt( OPCODE ) );
}
public Vendor getVendor()
{
if( isImplicitFormat() )
{
return Vendor.STANDARD;
}
return Vendor.fromValue( mMessage.getInt( VENDOR ) );
}
/**
* Checks and repairs the 12 x 24-bit golay(24,12,8) codewords and then
* checks and repairs the 24 x 6-bit link control and reed-solomon
* RS(24,12,13) parity codewords
*/
private void checkCRC()
{
/* Check the Golay codewords */
int x = 64;
mCRC[ 1 ] = CRC.PASSED;
while( x < mMessage.size() )
{
mMessage = Galois24.checkAndCorrect( mMessage, x );
if( !( mMessage.getCRC() == CRC.PASSED ) )
{
mCRC[ 1 ] = CRC.FAILED_CRC;
}
x += 24;
}
/* Check the Reed-Solomon parity bits. The RS decoder expects the link
* control data and reed solomon parity hex codewords in reverse order.
* The RS(24,12,13) code used by P25 removes the left-hand 47 data hex
* words, so we replace them with zeros. */
int[] input = new int [63];
int[] output = new int [63];
input[ 0 ] = mMessage.getInt( RS_HEX_11 );
input[ 1 ] = mMessage.getInt( RS_HEX_10 );
input[ 2 ] = mMessage.getInt( RS_HEX_9 );
input[ 3 ] = mMessage.getInt( RS_HEX_8 );
input[ 4 ] = mMessage.getInt( RS_HEX_7 );
input[ 5 ] = mMessage.getInt( RS_HEX_6 );
input[ 6 ] = mMessage.getInt( RS_HEX_5 );
input[ 7 ] = mMessage.getInt( RS_HEX_4 );
input[ 8 ] = mMessage.getInt( RS_HEX_3 );
input[ 9 ] = mMessage.getInt( RS_HEX_2 );
input[ 10 ] = mMessage.getInt( RS_HEX_1 );
input[ 11 ] = mMessage.getInt( RS_HEX_0 );
input[ 12 ] = mMessage.getInt( LC_HEX_11 );
input[ 13 ] = mMessage.getInt( LC_HEX_10 );
input[ 14 ] = mMessage.getInt( LC_HEX_9 );
input[ 15 ] = mMessage.getInt( LC_HEX_8 );
input[ 16 ] = mMessage.getInt( LC_HEX_7 );
input[ 17 ] = mMessage.getInt( LC_HEX_6 );
input[ 18 ] = mMessage.getInt( LC_HEX_5 );
input[ 19 ] = mMessage.getInt( LC_HEX_4 );
input[ 20 ] = mMessage.getInt( LC_HEX_3 );
input[ 21 ] = mMessage.getInt( LC_HEX_2 );
input[ 22 ] = mMessage.getInt( LC_HEX_1 );
input[ 23 ] = mMessage.getInt( LC_HEX_0 );
/* indexes 24 - 62 are defaulted to zero */
boolean irrecoverableErrors = mReedSolomonDecoder.decode( input, output );
if( irrecoverableErrors )
{
mCRC[ 2 ] = CRC.FAILED_CRC;
}
else
{
mCRC[ 2 ] = CRC.PASSED;
/* Only fix the link control data hex codewords */
repairHexCodeword( input, output, 12, LC_HEX_11 );
repairHexCodeword( input, output, 13, LC_HEX_10 );
repairHexCodeword( input, output, 14, LC_HEX_9 );
repairHexCodeword( input, output, 15, LC_HEX_8 );
repairHexCodeword( input, output, 16, LC_HEX_7 );
repairHexCodeword( input, output, 17, LC_HEX_6 );
repairHexCodeword( input, output, 18, LC_HEX_5 );
repairHexCodeword( input, output, 19, LC_HEX_4 );
repairHexCodeword( input, output, 20, LC_HEX_3 );
repairHexCodeword( input, output, 21, LC_HEX_2 );
repairHexCodeword( input, output, 22, LC_HEX_1 );
repairHexCodeword( input, output, 23, LC_HEX_0 );
/* If the golay check failed, mark it as corrected too */
if( mCRC[ 1 ] == CRC.FAILED_CRC )
{
mCRC[ 1 ] = CRC.CORRECTED;
}
}
}
private void repairHexCodeword( int[] input, int[] output, int index, int[] indexSet )
{
if( input[ index ] != output[ index ] )
{
mMessage.load( indexSet[ 0 ], 6, output[ index ] );
mCRC[ 2 ] = CRC.CORRECTED;
}
}
/**
* Indicates if the message passed the golay and reed-solomon parity checks
* or was corrected.
*/
public boolean isValid()
{
// mCRC[ 0 ] - always passes (otherwise message wouldn't be constructed )
// mCRC[ 1 ] - golay - always passes or corrected if mCRC[2] is valid
return mCRC[ 2 ] == CRC.PASSED || mCRC[ 2 ] == CRC.CORRECTED;
}
}

View File

@@ -3,7 +3,7 @@ package decode.p25.message.tdu.lc;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.tsbk.osp.control.SystemService; import decode.p25.message.tsbk.osp.control.SystemService;
import decode.p25.reference.LinkControlOpcode; import decode.p25.reference.LinkControlOpcode;
@@ -26,7 +26,7 @@ public class AdjacentSiteStatusBroadcast extends TDULinkControlMessage
public static final int[] SYSTEM_SERVICE_CLASS = { 188,189,190,191,192,193, public static final int[] SYSTEM_SERVICE_CLASS = { 188,189,190,191,192,193,
194,195 }; 194,195 };
private IdentifierProvider mIdentifierUpdate; private IBandIdentifier mIdentifierUpdate;
public AdjacentSiteStatusBroadcast( TDULinkControlMessage source ) public AdjacentSiteStatusBroadcast( TDULinkControlMessage source )
{ {
@@ -100,7 +100,7 @@ public class AdjacentSiteStatusBroadcast extends TDULinkControlMessage
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
mIdentifierUpdate = message; mIdentifierUpdate = message;
} }

View File

@@ -30,7 +30,7 @@ public class CallTermination extends TDULinkControlMessage
sb.append( getMessageStub() ); sb.append( getMessageStub() );
sb.append( " FROM:" + getSourceAddress() ); sb.append( " BY:" + getSourceAddress() );
return sb.toString(); return sb.toString();
} }

View File

@@ -3,11 +3,11 @@ package decode.p25.message.tdu.lc;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.reference.LinkControlOpcode; import decode.p25.reference.LinkControlOpcode;
public class ChannelIdentifierUpdate extends TDULinkControlMessage public class ChannelIdentifierUpdate extends TDULinkControlMessage
implements IdentifierProvider implements IBandIdentifier
{ {
private final static Logger mLog = private final static Logger mLog =
LoggerFactory.getLogger( ChannelIdentifierUpdate.class ); LoggerFactory.getLogger( ChannelIdentifierUpdate.class );

View File

@@ -3,11 +3,11 @@ package decode.p25.message.tdu.lc;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.reference.LinkControlOpcode; import decode.p25.reference.LinkControlOpcode;
public class ChannelIdentifierUpdateExplicit extends TDULinkControlMessage public class ChannelIdentifierUpdateExplicit extends TDULinkControlMessage
implements IdentifierProvider implements IBandIdentifier
{ {
private final static Logger mLog = private final static Logger mLog =
LoggerFactory.getLogger( ChannelIdentifierUpdateExplicit.class ); LoggerFactory.getLogger( ChannelIdentifierUpdateExplicit.class );

View File

@@ -1,9 +1,12 @@
package decode.p25.message.tdu.lc; package decode.p25.message.tdu.lc;
import java.util.Set;
import java.util.TreeSet;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.reference.LinkControlOpcode; import decode.p25.reference.LinkControlOpcode;
@@ -23,8 +26,8 @@ public class GroupVoiceChannelUpdate extends TDULinkControlMessage
public static final int[] GROUP_ADDRESS_B = { 168,169,170,171,184,185,186, public static final int[] GROUP_ADDRESS_B = { 168,169,170,171,184,185,186,
187,188,189,190,191,192,193,194,195 }; 187,188,189,190,191,192,193,194,195 };
private IdentifierProvider mIdentifierUpdateA; private IBandIdentifier mIdentifierUpdateA;
private IdentifierProvider mIdentifierUpdateB; private IBandIdentifier mIdentifierUpdateB;
public GroupVoiceChannelUpdate( TDULinkControlMessage source ) public GroupVoiceChannelUpdate( TDULinkControlMessage source )
{ {
@@ -103,8 +106,23 @@ public class GroupVoiceChannelUpdate extends TDULinkControlMessage
return mMessage.getHex( GROUP_ADDRESS_B, 4 ); return mMessage.getHex( GROUP_ADDRESS_B, 4 );
} }
/**
* Returns a sorted list of addresses contained in the A and B fields
* @return
*/
public Set<String> getAddresses()
{
Set<String> addresses = new TreeSet<String>();
addresses.add( getGroupAddressA() );
addresses.add( getGroupAddressB() );
return addresses;
}
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getChannelIdentifierA() ) if( identifier == getChannelIdentifierA() )
{ {

View File

@@ -3,7 +3,7 @@ package decode.p25.message.tdu.lc;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.P25Message.DuplexMode; import decode.p25.message.P25Message.DuplexMode;
import decode.p25.message.P25Message.SessionMode; import decode.p25.message.P25Message.SessionMode;
@@ -28,8 +28,8 @@ public class GroupVoiceChannelUpdateExplicit extends TDULinkControlMessage
public static final int[] RECEIVE_CHANNEL = { 184,185,186,187,188,189,190, public static final int[] RECEIVE_CHANNEL = { 184,185,186,187,188,189,190,
191,192,193,194,195,196,197,198,199 }; 191,192,193,194,195,196,197,198,199 };
private IdentifierProvider mTransmitIdentifierUpdate; private IBandIdentifier mTransmitIdentifierUpdate;
private IdentifierProvider mReceiveIdentifierUpdate; private IBandIdentifier mReceiveIdentifierUpdate;
public GroupVoiceChannelUpdateExplicit( TDULinkControlMessage source ) public GroupVoiceChannelUpdateExplicit( TDULinkControlMessage source )
{ {
@@ -119,7 +119,7 @@ public class GroupVoiceChannelUpdateExplicit extends TDULinkControlMessage
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getTransmitChannelIdentifier() ) if( identifier == getTransmitChannelIdentifier() )
{ {

View File

@@ -3,7 +3,7 @@ package decode.p25.message.tdu.lc;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.reference.LinkControlOpcode; import decode.p25.reference.LinkControlOpcode;
import decode.p25.reference.Service; import decode.p25.reference.Service;
@@ -13,9 +13,10 @@ public class NetworkStatusBroadcast extends TDULinkControlMessage
{ {
private final static Logger mLog = private final static Logger mLog =
LoggerFactory.getLogger( NetworkStatusBroadcast.class ); LoggerFactory.getLogger( NetworkStatusBroadcast.class );
public static final int[] NETWORK_ID = { 72,73,74,75,88,89,90,91,92,93,94,
95,96,97,98,99,112,113,114,115,116,117,118,119,120,121,122,123 }; public static final int[] WACN = { 72,73,74,75,88,89,90,91,92,93,94,95,96,
public static final int[] SYSTEM_ID = { 136,137,138,139,140,141,142,143,144, 97,98,99,112,113,114,115,116,117,118,119,120,121,122,123 };
public static final int[] SYSTEM = { 136,137,138,139,140,141,142,143,144,
145,146,147 }; 145,146,147 };
public static final int[] IDENTIFIER = { 160,161,162,163 }; public static final int[] IDENTIFIER = { 160,161,162,163 };
public static final int[] CHANNEL = { 164,165,166,167,168,169,170,171,184, public static final int[] CHANNEL = { 164,165,166,167,168,169,170,171,184,
@@ -23,7 +24,7 @@ public class NetworkStatusBroadcast extends TDULinkControlMessage
public static final int[] SYSTEM_SERVICE_CLASS = { 188,189,190,191,192,193, public static final int[] SYSTEM_SERVICE_CLASS = { 188,189,190,191,192,193,
194,195 }; 194,195 };
private IdentifierProvider mIdentifierUpdate; private IBandIdentifier mIdentifierUpdate;
public NetworkStatusBroadcast( TDULinkControlMessage source ) public NetworkStatusBroadcast( TDULinkControlMessage source )
{ {
@@ -43,22 +44,22 @@ public class NetworkStatusBroadcast extends TDULinkControlMessage
sb.append( getMessageStub() ); sb.append( getMessageStub() );
sb.append( " NETWORK:" + getNetworkID() ); sb.append( " NETWORK:" + getWACN() );
sb.append( " SYS:" + getSystemID() ); sb.append( " SYS:" + getSystem() );
sb.append( " CHAN:" + getChannel() ); sb.append( " CHAN:" + getChannel() );
sb.append( " " + Service.getServices( getSystemServiceClass() ).toString() ); sb.append( " " + Service.getServices( getSystemServiceClass() ).toString() );
return sb.toString(); return sb.toString();
} }
public String getNetworkID() public String getWACN()
{ {
return mMessage.getHex( NETWORK_ID, 5 ); return mMessage.getHex( WACN, 5 );
} }
public String getSystemID() public String getSystem()
{ {
return mMessage.getHex( SYSTEM_ID, 3 ); return mMessage.getHex( SYSTEM, 3 );
} }
public int getIdentifier() public int getIdentifier()
@@ -82,7 +83,7 @@ public class NetworkStatusBroadcast extends TDULinkControlMessage
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
mIdentifierUpdate = message; mIdentifierUpdate = message;
} }

View File

@@ -3,7 +3,7 @@ package decode.p25.message.tdu.lc;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.reference.LinkControlOpcode; import decode.p25.reference.LinkControlOpcode;
import decode.p25.reference.Service; import decode.p25.reference.Service;
@@ -13,9 +13,10 @@ public class NetworkStatusBroadcastExplicit extends TDULinkControlMessage
{ {
private final static Logger mLog = private final static Logger mLog =
LoggerFactory.getLogger( NetworkStatusBroadcastExplicit.class ); LoggerFactory.getLogger( NetworkStatusBroadcastExplicit.class );
public static final int[] NETWORK_ID = { 72,73,74,75,88,89,90,91,92,93,94,
95,96,97,98,99,112,113,114,115 }; public static final int[] WACN = { 72,73,74,75,88,89,90,91,92,93,94,95,96,
public static final int[] SYSTEM_ID = { 116,117,118,119,120,121,122,123,136, 97,98,99,112,113,114,115 };
public static final int[] SYSTEM = { 116,117,118,119,120,121,122,123,136,
137,138,139 }; 137,138,139 };
public static final int[] TRANSMIT_IDENTIFIER = { 140,141,142,143 }; public static final int[] TRANSMIT_IDENTIFIER = { 140,141,142,143 };
public static final int[] TRANSMIT_CHANNEL = { 144,145,146,147,160,161,162, public static final int[] TRANSMIT_CHANNEL = { 144,145,146,147,160,161,162,
@@ -24,8 +25,8 @@ public class NetworkStatusBroadcastExplicit extends TDULinkControlMessage
public static final int[] RECEIVE_CHANNEL = { 184,185,186,187,188,189,190, public static final int[] RECEIVE_CHANNEL = { 184,185,186,187,188,189,190,
191,192,193,194,195 }; 191,192,193,194,195 };
private IdentifierProvider mTransmitIdentifierUpdate; private IBandIdentifier mTransmitIdentifierUpdate;
private IdentifierProvider mReceiveIdentifierUpdate; private IBandIdentifier mReceiveIdentifierUpdate;
public NetworkStatusBroadcastExplicit( TDULinkControlMessage source ) public NetworkStatusBroadcastExplicit( TDULinkControlMessage source )
{ {
@@ -45,22 +46,22 @@ public class NetworkStatusBroadcastExplicit extends TDULinkControlMessage
sb.append( getMessageStub() ); sb.append( getMessageStub() );
sb.append( " NETWORK:" + getNetworkID() ); sb.append( " NETWORK:" + getWACN() );
sb.append( " SYS:" + getSystemID() ); sb.append( " SYS:" + getSystem() );
sb.append( " TRANSMIT:" + getTransmitChannel() ); sb.append( " TRANSMIT:" + getTransmitChannel() );
sb.append( " RECEIVE:" + getReceiveChannel() ); sb.append( " RECEIVE:" + getReceiveChannel() );
return sb.toString(); return sb.toString();
} }
public String getNetworkID() public String getWACN()
{ {
return mMessage.getHex( NETWORK_ID, 5 ); return mMessage.getHex( WACN, 5 );
} }
public String getSystemID() public String getSystem()
{ {
return mMessage.getHex( SYSTEM_ID, 3 ); return mMessage.getHex( SYSTEM, 3 );
} }
public int getTransmitIdentifier() public int getTransmitIdentifier()
@@ -94,7 +95,7 @@ public class NetworkStatusBroadcastExplicit extends TDULinkControlMessage
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getTransmitIdentifier() ) if( identifier == getTransmitIdentifier() )
{ {

View File

@@ -3,7 +3,7 @@ package decode.p25.message.tdu.lc;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.tsbk.osp.control.SystemService; import decode.p25.message.tsbk.osp.control.SystemService;
import decode.p25.reference.LinkControlOpcode; import decode.p25.reference.LinkControlOpcode;
@@ -28,7 +28,7 @@ public class RFSSStatusBroadcast extends TDULinkControlMessage
public static final int[] SYSTEM_SERVICE_CLASS = { 188,189,190,191,192,193, public static final int[] SYSTEM_SERVICE_CLASS = { 188,189,190,191,192,193,
194,195 }; 194,195 };
private IdentifierProvider mIdentifierUpdate; private IBandIdentifier mIdentifierUpdate;
public RFSSStatusBroadcast( TDULinkControlMessage source ) public RFSSStatusBroadcast( TDULinkControlMessage source )
{ {
@@ -104,7 +104,7 @@ public class RFSSStatusBroadcast extends TDULinkControlMessage
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
mIdentifierUpdate = message; mIdentifierUpdate = message;
} }

View File

@@ -3,7 +3,7 @@ package decode.p25.message.tdu.lc;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.tsbk.osp.control.SystemService; import decode.p25.message.tsbk.osp.control.SystemService;
import decode.p25.reference.LinkControlOpcode; import decode.p25.reference.LinkControlOpcode;
@@ -28,8 +28,8 @@ public class RFSSStatusBroadcastExplicit extends TDULinkControlMessage
public static final int[] SYSTEM_SERVICE_CLASS = { 188,189,190,191,192,193, public static final int[] SYSTEM_SERVICE_CLASS = { 188,189,190,191,192,193,
194,195 }; 194,195 };
private IdentifierProvider mTransmitIdentifierUpdate; private IBandIdentifier mTransmitIdentifierUpdate;
private IdentifierProvider mReceiveIdentifierUpdate; private IBandIdentifier mReceiveIdentifierUpdate;
public RFSSStatusBroadcastExplicit( TDULinkControlMessage source ) public RFSSStatusBroadcastExplicit( TDULinkControlMessage source )
{ {
@@ -115,7 +115,7 @@ public class RFSSStatusBroadcastExplicit extends TDULinkControlMessage
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getTransmitIdentifier() ) if( identifier == getTransmitIdentifier() )
{ {

View File

@@ -3,7 +3,7 @@ package decode.p25.message.tdu.lc;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.tsbk.osp.control.SystemService; import decode.p25.message.tsbk.osp.control.SystemService;
import decode.p25.reference.LinkControlOpcode; import decode.p25.reference.LinkControlOpcode;
@@ -29,8 +29,8 @@ public class SecondaryControlChannelBroadcast extends TDULinkControlMessage
public static final int[] SYSTEM_SERVICE_CLASS_B = { 188,189,190,191,192, public static final int[] SYSTEM_SERVICE_CLASS_B = { 188,189,190,191,192,
193,194,195 }; 193,194,195 };
private IdentifierProvider mIdentifierProviderA; private IBandIdentifier mIdentifierProviderA;
private IdentifierProvider mIdentifierProviderB; private IBandIdentifier mIdentifierProviderB;
public SecondaryControlChannelBroadcast( TDULinkControlMessage source ) public SecondaryControlChannelBroadcast( TDULinkControlMessage source )
{ {
@@ -114,7 +114,7 @@ public class SecondaryControlChannelBroadcast extends TDULinkControlMessage
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getIdentifierA() ) if( identifier == getIdentifierA() )
{ {

View File

@@ -3,7 +3,7 @@ package decode.p25.message.tdu.lc;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.tsbk.osp.control.SystemService; import decode.p25.message.tsbk.osp.control.SystemService;
import decode.p25.reference.LinkControlOpcode; import decode.p25.reference.LinkControlOpcode;
@@ -25,8 +25,8 @@ public class SecondaryControlChannelBroadcastExplicit
public static final int[] SYSTEM_SERVICE_CLASS = { 168,169,170,171,184, public static final int[] SYSTEM_SERVICE_CLASS = { 168,169,170,171,184,
185,186,187 }; 185,186,187 };
private IdentifierProvider mTransmitIdentifierProvider; private IBandIdentifier mTransmitIdentifierProvider;
private IdentifierProvider mReceiveIdentifierProvider; private IBandIdentifier mReceiveIdentifierProvider;
public SecondaryControlChannelBroadcastExplicit( TDULinkControlMessage source ) public SecondaryControlChannelBroadcastExplicit( TDULinkControlMessage source )
{ {
@@ -103,7 +103,7 @@ public class SecondaryControlChannelBroadcastExplicit
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getTransmitIdentifier() ) if( identifier == getTransmitIdentifier() )
{ {

View File

@@ -85,6 +85,7 @@ public class TDULCMessageFactory
{ {
switch( message.getVendor() ) switch( message.getVendor() )
{ {
case MOTOROLA:
default: default:
break; break;
} }

View File

@@ -6,6 +6,7 @@ import org.slf4j.LoggerFactory;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.P25Message; import decode.p25.message.P25Message;
import decode.p25.message.tsbk.motorola.MotorolaOpcode;
import decode.p25.reference.DataUnitID; import decode.p25.reference.DataUnitID;
import decode.p25.reference.LinkControlOpcode; import decode.p25.reference.LinkControlOpcode;
import decode.p25.reference.Vendor; import decode.p25.reference.Vendor;
@@ -132,16 +133,31 @@ public class TDULinkControlMessage extends P25Message
return mMessage.get( IMPLICIT_VENDOR_FLAG ); return mMessage.get( IMPLICIT_VENDOR_FLAG );
} }
/**
* Standard opcodes when the Vendor is STANDARD
*/
public LinkControlOpcode getOpcode() public LinkControlOpcode getOpcode()
{ {
return LinkControlOpcode.fromValue( mMessage.getInt( OPCODE ) ); return LinkControlOpcode.fromValue( mMessage.getInt( OPCODE ) );
} }
/**
* Returns a generic vendor-neutral opcode. Use this when there is a non
* standard vendor code.
*/
public VendorLinkControlOpcode getVendorOpcode() public VendorLinkControlOpcode getVendorOpcode()
{ {
return VendorLinkControlOpcode.fromValue( mMessage.getInt( OPCODE ) ); return VendorLinkControlOpcode.fromValue( mMessage.getInt( OPCODE ) );
} }
/**
* If the vendor is motorola, returns the Motorola OPCODE for this message
*/
public MotorolaOpcode getMotorolaOpcode()
{
return MotorolaOpcode.fromValue( mMessage.getInt( OPCODE ) );
}
public Vendor getVendor() public Vendor getVendor()
{ {
if( isImplicitFormat() ) if( isImplicitFormat() )

View File

@@ -2,7 +2,7 @@ package decode.p25.message.tsbk;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.reference.DataUnitID; import decode.p25.reference.DataUnitID;
@@ -14,7 +14,7 @@ public abstract class ChannelGrant extends ServiceMessage
public static final int[] CHANNEL_NUMBER = { 92,93,94,95,96,97,98,99,100, public static final int[] CHANNEL_NUMBER = { 92,93,94,95,96,97,98,99,100,
101,102,103 }; 101,102,103 };
private IdentifierProvider mIdentifierUpdate; private IBandIdentifier mIdentifierUpdate;
public ChannelGrant( BinaryMessage message, public ChannelGrant( BinaryMessage message,
DataUnitID duid, DataUnitID duid,
@@ -47,7 +47,7 @@ public abstract class ChannelGrant extends ServiceMessage
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
mIdentifierUpdate = message; mIdentifierUpdate = message;
} }

View File

@@ -2,7 +2,7 @@ package decode.p25.message.tsbk;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.reference.DataUnitID; import decode.p25.reference.DataUnitID;
public abstract class GroupChannelGrantExplicit extends ChannelGrant public abstract class GroupChannelGrantExplicit extends ChannelGrant
@@ -16,8 +16,8 @@ public abstract class GroupChannelGrantExplicit extends ChannelGrant
public static final int[] GROUP_ADDRESS = { 128,129,130,131,132,133,134,135, public static final int[] GROUP_ADDRESS = { 128,129,130,131,132,133,134,135,
136,137,138,139,140,141,142,143 }; 136,137,138,139,140,141,142,143 };
private IdentifierProvider mTransmitIdentifierUpdate; private IBandIdentifier mTransmitIdentifierUpdate;
private IdentifierProvider mReceiveIdentifierUpdate; private IBandIdentifier mReceiveIdentifierUpdate;
public GroupChannelGrantExplicit( BinaryMessage message, public GroupChannelGrantExplicit( BinaryMessage message,
DataUnitID duid, DataUnitID duid,
@@ -85,7 +85,7 @@ public abstract class GroupChannelGrantExplicit extends ChannelGrant
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getTransmitChannelIdentifier() ) if( identifier == getTransmitChannelIdentifier() )
{ {

View File

@@ -2,7 +2,7 @@ package decode.p25.message.tsbk;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.reference.DataUnitID; import decode.p25.reference.DataUnitID;
@@ -21,8 +21,8 @@ public abstract class GroupMultiChannelGrant extends ChannelGrant
public static final int[] GROUP_ADDRESS_2 = { 128,129,130,131,132,133,134, public static final int[] GROUP_ADDRESS_2 = { 128,129,130,131,132,133,134,
135,136,137,138,139,140,141,142,143 }; 135,136,137,138,139,140,141,142,143 };
private IdentifierProvider mIdentifierUpdate1; private IBandIdentifier mIdentifierUpdate1;
private IdentifierProvider mIdentifierUpdate2; private IBandIdentifier mIdentifierUpdate2;
public GroupMultiChannelGrant( BinaryMessage message, public GroupMultiChannelGrant( BinaryMessage message,
DataUnitID duid, DataUnitID duid,
@@ -114,7 +114,7 @@ public abstract class GroupMultiChannelGrant extends ChannelGrant
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getChannelIdentifier1() ) if( identifier == getChannelIdentifier1() )
{ {

View File

@@ -2,7 +2,7 @@ package decode.p25.message.tsbk.motorola;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.reference.DataUnitID; import decode.p25.reference.DataUnitID;
@@ -22,7 +22,7 @@ public class ChannelCWIDUpdate extends MotorolaTSBKMessage
public static final int[] CHANNEL = { 132,133,134,135,136,137,138,139,140, public static final int[] CHANNEL = { 132,133,134,135,136,137,138,139,140,
141,142,143 }; 141,142,143 };
private IdentifierProvider mIdentifierUpdate; private IBandIdentifier mIdentifierUpdate;
public ChannelCWIDUpdate( BinaryMessage message, public ChannelCWIDUpdate( BinaryMessage message,
DataUnitID duid, DataUnitID duid,
@@ -104,7 +104,7 @@ public class ChannelCWIDUpdate extends MotorolaTSBKMessage
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
mIdentifierUpdate = message; mIdentifierUpdate = message;
} }

View File

@@ -59,6 +59,4 @@ public abstract class PatchGroup extends MotorolaTSBKMessage
{ {
return mMessage.getHex( GROUP_ADDRESS_3, 4 ); return mMessage.getHex( GROUP_ADDRESS_3, 4 );
} }
} }

View File

@@ -2,7 +2,7 @@ package decode.p25.message.tsbk.motorola;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.reference.DataUnitID; import decode.p25.reference.DataUnitID;
@@ -24,7 +24,7 @@ public class PatchGroupVoiceChannelGrant extends MotorolaTSBKMessage
public static final int[] SOURCE_ADDRESS = { 120,121,122,123,124,125,126, public static final int[] SOURCE_ADDRESS = { 120,121,122,123,124,125,126,
127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143 }; 127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143 };
private IdentifierProvider mIdentifierUpdate; private IBandIdentifier mIdentifierUpdate;
public PatchGroupVoiceChannelGrant( BinaryMessage message, DataUnitID duid, public PatchGroupVoiceChannelGrant( BinaryMessage message, DataUnitID duid,
AliasList aliasList ) AliasList aliasList )
@@ -122,7 +122,7 @@ public class PatchGroupVoiceChannelGrant extends MotorolaTSBKMessage
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
mIdentifierUpdate = message; mIdentifierUpdate = message;
} }

View File

@@ -2,7 +2,7 @@ package decode.p25.message.tsbk.motorola;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.reference.DataUnitID; import decode.p25.reference.DataUnitID;
@@ -20,8 +20,8 @@ public class PatchGroupVoiceChannelGrantUpdate extends MotorolaTSBKMessage
public static final int[] PATCH_GROUP_ADDRESS_2 = { 128,129,130,131,132,133, public static final int[] PATCH_GROUP_ADDRESS_2 = { 128,129,130,131,132,133,
134,135,136,137,138,139,140,141,142,143 }; 134,135,136,137,138,139,140,141,142,143 };
private IdentifierProvider mIdentifierUpdate1; private IBandIdentifier mIdentifierUpdate1;
private IdentifierProvider mIdentifierUpdate2; private IBandIdentifier mIdentifierUpdate2;
public PatchGroupVoiceChannelGrantUpdate( BinaryMessage message, public PatchGroupVoiceChannelGrantUpdate( BinaryMessage message,
DataUnitID duid, AliasList aliasList ) DataUnitID duid, AliasList aliasList )
@@ -100,7 +100,7 @@ public class PatchGroupVoiceChannelGrantUpdate extends MotorolaTSBKMessage
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getChannelIdentifier1() ) if( identifier == getChannelIdentifier1() )
{ {

View File

@@ -2,7 +2,7 @@ package decode.p25.message.tsbk.osp.control;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.tsbk.TSBKMessage; import decode.p25.message.tsbk.TSBKMessage;
import decode.p25.reference.DataUnitID; import decode.p25.reference.DataUnitID;
@@ -26,7 +26,7 @@ public class AdjacentStatusBroadcast extends TSBKMessage implements IdentifierRe
public static final int[] SYSTEM_SERVICE_CLASS = { 136,137,138,139,140,141, public static final int[] SYSTEM_SERVICE_CLASS = { 136,137,138,139,140,141,
142,143 }; 142,143 };
private IdentifierProvider mIdentifierUpdate; private IBandIdentifier mIdentifierUpdate;
public AdjacentStatusBroadcast( BinaryMessage message, public AdjacentStatusBroadcast( BinaryMessage message,
DataUnitID duid, DataUnitID duid,
@@ -163,7 +163,7 @@ public class AdjacentStatusBroadcast extends TSBKMessage implements IdentifierRe
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
/* we're only expecting 1 identifier, so use whatever is received */ /* we're only expecting 1 identifier, so use whatever is received */
mIdentifierUpdate = message; mIdentifierUpdate = message;

View File

@@ -2,12 +2,12 @@ package decode.p25.message.tsbk.osp.control;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.tsbk.TSBKMessage; import decode.p25.message.tsbk.TSBKMessage;
import decode.p25.reference.DataUnitID; import decode.p25.reference.DataUnitID;
public abstract class IdentifierUpdate extends TSBKMessage public abstract class IdentifierUpdate extends TSBKMessage
implements IdentifierProvider implements IBandIdentifier
{ {
public static final int[] IDENTIFIER = { 80,81,82,83 }; public static final int[] IDENTIFIER = { 80,81,82,83 };

View File

@@ -2,7 +2,7 @@ package decode.p25.message.tsbk.osp.control;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.tsbk.TSBKMessage; import decode.p25.message.tsbk.TSBKMessage;
import decode.p25.reference.DataUnitID; import decode.p25.reference.DataUnitID;
@@ -23,7 +23,7 @@ public class NetworkStatusBroadcast extends TSBKMessage implements IdentifierRec
public static final int[] SYSTEM_SERVICE_CLASS = { 136,137,138,139,140,141, public static final int[] SYSTEM_SERVICE_CLASS = { 136,137,138,139,140,141,
142,143 }; 142,143 };
private IdentifierProvider mIdentifierUpdate; private IBandIdentifier mIdentifierUpdate;
public NetworkStatusBroadcast( BinaryMessage message, public NetworkStatusBroadcast( BinaryMessage message,
DataUnitID duid, DataUnitID duid,
@@ -109,7 +109,7 @@ public class NetworkStatusBroadcast extends TSBKMessage implements IdentifierRec
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
/* we're only expecting 1 identifier, so use whatever is received */ /* we're only expecting 1 identifier, so use whatever is received */
mIdentifierUpdate = message; mIdentifierUpdate = message;

View File

@@ -2,7 +2,7 @@ package decode.p25.message.tsbk.osp.control;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.tsbk.TSBKMessage; import decode.p25.message.tsbk.TSBKMessage;
import decode.p25.reference.DataUnitID; import decode.p25.reference.DataUnitID;
@@ -23,7 +23,7 @@ public class RFSSStatusBroadcast extends TSBKMessage implements IdentifierReceiv
public static final int[] SYSTEM_SERVICE_CLASS = { 136,137,138,139,140,141, public static final int[] SYSTEM_SERVICE_CLASS = { 136,137,138,139,140,141,
142,143 }; 142,143 };
private IdentifierProvider mIdentifierUpdate; private IBandIdentifier mIdentifierUpdate;
public RFSSStatusBroadcast( BinaryMessage message, public RFSSStatusBroadcast( BinaryMessage message,
DataUnitID duid, DataUnitID duid,
@@ -119,7 +119,7 @@ public class RFSSStatusBroadcast extends TSBKMessage implements IdentifierReceiv
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
/* we're only expecting 1 identifier, so use whatever is received */ /* we're only expecting 1 identifier, so use whatever is received */
mIdentifierUpdate = message; mIdentifierUpdate = message;

View File

@@ -5,7 +5,7 @@ import org.slf4j.LoggerFactory;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.message.tsbk.TSBKMessage; import decode.p25.message.tsbk.TSBKMessage;
import decode.p25.reference.DataUnitID; import decode.p25.reference.DataUnitID;
@@ -30,8 +30,8 @@ public class SecondaryControlChannelBroadcast extends TSBKMessage
public static final int[] SYSTEM_SERVICE_CLASS_2 = { 136,137,138,139,140, public static final int[] SYSTEM_SERVICE_CLASS_2 = { 136,137,138,139,140,
141,142,143 }; 141,142,143 };
private IdentifierProvider mIdentifierUpdate1; private IBandIdentifier mIdentifierUpdate1;
private IdentifierProvider mIdentifierUpdate2; private IBandIdentifier mIdentifierUpdate2;
public SecondaryControlChannelBroadcast( BinaryMessage message, public SecondaryControlChannelBroadcast( BinaryMessage message,
DataUnitID duid, DataUnitID duid,
@@ -145,7 +145,7 @@ public class SecondaryControlChannelBroadcast extends TSBKMessage
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getIdentifier1() ) if( identifier == getIdentifier1() )
{ {

View File

@@ -2,7 +2,7 @@ package decode.p25.message.tsbk.osp.data;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.reference.DataUnitID; import decode.p25.reference.DataUnitID;
@@ -22,8 +22,8 @@ public class SNDCPDataChannelAnnouncementExplicit extends SNDCPData
public static final int[] DATA_ACCESS_CONTROL = { 128,129,130,131,132,133, public static final int[] DATA_ACCESS_CONTROL = { 128,129,130,131,132,133,
134,135,136,137,138,139,140,141,142,143 }; 134,135,136,137,138,139,140,141,142,143 };
private IdentifierProvider mIdentifierUpdateTransmit; private IBandIdentifier mIdentifierUpdateTransmit;
private IdentifierProvider mIdentifierUpdateReceive; private IBandIdentifier mIdentifierUpdateReceive;
public SNDCPDataChannelAnnouncementExplicit( BinaryMessage message, public SNDCPDataChannelAnnouncementExplicit( BinaryMessage message,
DataUnitID duid, DataUnitID duid,
@@ -118,7 +118,7 @@ public class SNDCPDataChannelAnnouncementExplicit extends SNDCPData
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getTransmitChannelIdentifier() ) if( identifier == getTransmitChannelIdentifier() )
{ {

View File

@@ -2,7 +2,7 @@ package decode.p25.message.tsbk.osp.data;
import alias.AliasList; import alias.AliasList;
import bits.BinaryMessage; import bits.BinaryMessage;
import decode.p25.message.IdentifierProvider; import decode.p25.message.IBandIdentifier;
import decode.p25.message.IdentifierReceiver; import decode.p25.message.IdentifierReceiver;
import decode.p25.reference.DataUnitID; import decode.p25.reference.DataUnitID;
@@ -18,8 +18,8 @@ public class SNDCPDataChannelGrant extends SNDCPData implements IdentifierReceiv
public static final int[] TARGET_ADDRESS = { 120,121,122,123,124,125,126, public static final int[] TARGET_ADDRESS = { 120,121,122,123,124,125,126,
127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143 }; 127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143 };
private IdentifierProvider mIdentifierUpdateTransmit; private IBandIdentifier mIdentifierUpdateTransmit;
private IdentifierProvider mIdentifierUpdateReceive; private IBandIdentifier mIdentifierUpdateReceive;
public SNDCPDataChannelGrant( BinaryMessage message, public SNDCPDataChannelGrant( BinaryMessage message,
DataUnitID duid, DataUnitID duid,
@@ -91,7 +91,7 @@ public class SNDCPDataChannelGrant extends SNDCPData implements IdentifierReceiv
} }
@Override @Override
public void setIdentifierMessage( int identifier, IdentifierProvider message ) public void setIdentifierMessage( int identifier, IBandIdentifier message )
{ {
if( identifier == getTransmitChannelIdentifier() ) if( identifier == getTransmitChannelIdentifier() )
{ {

View File

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