Updated P25 channel display to show relevant site information.

Changed Site ID Alias to a string from integer to support P25 style site identifiers (RFSS-Site)
This commit is contained in:
dennis.sheirer
2014-11-26 12:09:21 +00:00
parent 86899e8a77
commit 1ff69404f4
16 changed files with 286 additions and 107 deletions

View File

@@ -57,7 +57,7 @@ public class AliasList implements Comparable<AliasList>
private HashMap<String,Alias> mMDC1200 = new HashMap<String,Alias>();
private HashMap<String,Alias> mMobileID = new HashMap<String,Alias>();
private HashMap<String,Alias> mMPT1327 = new HashMap<String,Alias>();
private HashMap<Integer, Alias> mSiteID = new HashMap<Integer,Alias>();
private HashMap<String, Alias> mSiteID = new HashMap<String,Alias>();
private HashMap<Integer, Alias> mStatus = new HashMap<Integer,Alias>();
private HashMap<String,Alias> mTalkgroup = new HashMap<String,Alias>();
private HashMap<Integer,Alias> mUniqueID = new HashMap<Integer,Alias>();
@@ -203,7 +203,7 @@ public class AliasList implements Comparable<AliasList>
}
}
public Alias getSiteID( int siteID )
public Alias getSiteID( String siteID )
{
return mSiteID.get( siteID );
}

View File

@@ -24,21 +24,21 @@ import alias.AliasIDType;
public class SiteID extends AliasID
{
private int mSite;
private String mSite;
public SiteID()
{
}
@XmlAttribute
public int getSite()
public String getSite()
{
return mSite;
}
public void setSite( int site )
public void setSite( String site )
{
this.mSite = site;
mSite = site;
}
public String toString()
@@ -47,18 +47,11 @@ public class SiteID extends AliasID
}
@Override
public boolean matches( AliasID id )
public boolean matches( AliasID otherID )
{
boolean retVal = false;
if( id instanceof SiteID )
{
SiteID uid = (SiteID)id;
retVal = ( mSite == uid.getSite() );
}
return retVal;
return otherID != null &&
otherID instanceof SiteID &&
getSite().contentEquals( ( (SiteID)otherID).getSite() );
}
@Override

View File

@@ -24,6 +24,7 @@ import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout;
@@ -31,16 +32,12 @@ import net.miginfocom.swing.MigLayout;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import controller.ConfigurableNode;
public class SiteIDEditor extends JPanel implements ActionListener
{
private static final long serialVersionUID = 1L;
private final static Logger mLog =
LoggerFactory.getLogger( SiteIDEditor.class );
LoggerFactory.getLogger( SiteIDEditor.class );
private SiteIDNode mSiteIDNode;
private JLabel mLabelName;
private JTextField mTextSiteID;
public SiteIDEditor( SiteIDNode siteIDNode )
@@ -52,7 +49,7 @@ public class SiteIDEditor extends JPanel implements ActionListener
private void initGUI()
{
setLayout( new MigLayout( "fill,wrap 2", "[right][left]", "[][][][grow]" ) );
setLayout( new MigLayout( "fill,wrap 2", "[right][left]", "[][][][][grow]" ) );
add( new JLabel( "Site ID" ), "span,align center" );
@@ -61,6 +58,16 @@ public class SiteIDEditor extends JPanel implements ActionListener
mTextSiteID = new JTextField(
String.valueOf( mSiteIDNode.getSiteID().getSite() ) );
add( mTextSiteID, "growx,push" );
JTextArea description = new JTextArea( "Enter a site number. "
+ "For P25 systems, use the format RR-SS, where RR = RF "
+ "Subsystem and SS = Site Number. For example, RFSS 1 and "
+ "Site 3 would be: 01-03");
description.setLineWrap( true );
description.setBackground( getBackground() );
add( description, "growx,span" );
JButton btnSave = new JButton( "Save" );
btnSave.addActionListener( SiteIDEditor.this );
@@ -82,23 +89,11 @@ public class SiteIDEditor extends JPanel implements ActionListener
if( siteIDString != null )
{
try
{
int id = Integer.parseInt( siteIDString );
mSiteIDNode.getSiteID().setSite( id );
((ConfigurableNode)mSiteIDNode.getParent()).sort();
mSiteIDNode.getSiteID().setSite( siteIDString );
mSiteIDNode.save();
mSiteIDNode.show();
}
catch( Exception ex )
{
mLog.error( "SiteIDEditor - error parsing int site " +
"id from [" + siteIDString + "]" );
}
mSiteIDNode.save();
mSiteIDNode.show();
}
else
{
@@ -108,8 +103,7 @@ public class SiteIDEditor extends JPanel implements ActionListener
}
else if( command.contentEquals( "Reset" ) )
{
mTextSiteID.setText(
String.valueOf( mSiteIDNode.getSiteID().getSite() ) );
mTextSiteID.setText( mSiteIDNode.getSiteID().getSite() );
}
mSiteIDNode.refresh();

View File

@@ -90,7 +90,7 @@ public class SiteEditor extends JPanel implements ActionListener
}
else
{
JOptionPane.showMessageDialog( SiteEditor.this, "Please enter a system name" );
JOptionPane.showMessageDialog( SiteEditor.this, "Please enter a site name" );
}
}
else if( command.contentEquals( "Reset" ) )

View File

@@ -668,12 +668,17 @@ public abstract class ChannelState implements Listener<Message>
FROM_TALKGROUP_TYPE,
MESSAGE,
MESSAGE_TYPE,
NAC,
SITE,
SITE_ALIAS,
SITE_NAME,
SOURCE,
SYSTEM,
SYSTEM_NAME,
SQUELCH,
TO_TALKGROUP,
TO_TALKGROUP_ALIAS,
TO_TALKGROUP_TYPE;
TO_TALKGROUP_TYPE,
WACN;
}
}

View File

@@ -38,8 +38,8 @@ public class LTRNetActivitySummary implements ActivitySummaryProvider
private TreeSet<String> mTalkgroups = new TreeSet<String>();
private TreeSet<String> mESNs = new TreeSet<String>();
private TreeSet<Integer> mUniqueIDs = new TreeSet<Integer>();
private TreeSet<Integer> mNeighborIDs = new TreeSet<Integer>();
private TreeSet<Integer> mSiteIDs = new TreeSet<Integer>();
private TreeSet<String> mNeighborIDs = new TreeSet<String>();
private TreeSet<String> mSiteIDs = new TreeSet<String>();
private HashMap<Integer,Double> mReceiveFrequencies =
new HashMap<Integer,Double>();
private HashMap<Integer,Double> mTransmitFrequencies =
@@ -106,9 +106,9 @@ public class LTRNetActivitySummary implements ActivitySummaryProvider
case ID_ESNL:
break;
case ID_NBOR:
int neighborID = ltr.getNeighborID();
String neighborID = ltr.getNeighborID();
if( neighborID != sINT_NULL_VALUE )
if( neighborID != null )
{
mNeighborIDs.add( neighborID );
}
@@ -123,9 +123,9 @@ public class LTRNetActivitySummary implements ActivitySummaryProvider
break;
case ID_SITE:
int siteID = ltr.getSiteID();
String siteID = ltr.getSiteID();
if( siteID != sINT_NULL_VALUE )
if( siteID != null )
{
mSiteIDs.add( siteID );
}
@@ -198,17 +198,17 @@ public class LTRNetActivitySummary implements ActivitySummaryProvider
}
else
{
Iterator<Integer> it = mSiteIDs.iterator();
Iterator<String> it = mSiteIDs.iterator();
while( it.hasNext() )
{
sb.append( "Site:\t" );
int siteID = it.next();
String siteID = it.next();
sb.append( siteID );
Alias siteAlias = mAliasList.getSiteID( siteID );
Alias siteAlias = mAliasList.getSiteID( String.valueOf( siteID ) );
if( siteAlias != null )
{
@@ -378,17 +378,17 @@ public class LTRNetActivitySummary implements ActivitySummaryProvider
}
else
{
Iterator<Integer> it = mNeighborIDs.iterator();
Iterator<String> it = mNeighborIDs.iterator();
while( it.hasNext() )
{
int neighbor = it.next();
String neighbor = it.next();
sb.append( " " );
sb.append( neighbor );
sb.append( " " );
Alias alias = mAliasList.getSiteID( neighbor );
Alias alias = mAliasList.getSiteID( String.valueOf( neighbor ) );
if( alias != null )
{

View File

@@ -210,8 +210,8 @@ public class LTRNetOSWMessage extends LTRNetMessage
sb.append( " MHz" );
break;
case ID_SITE:
int siteId = getSiteID();
if( siteId != sINT_NULL_VALUE )
String siteId = getSiteID();
if( siteId != null )
{
sb.append( "SITE ID: " );
sb.append( siteId );
@@ -221,10 +221,10 @@ public class LTRNetOSWMessage extends LTRNetMessage
break;
case ID_NBOR:
int neighborRank = getNeighborRank();
int neighborId = getNeighborID();
String neighborId = getNeighborID();
if( neighborRank != sINT_NULL_VALUE &&
neighborId != sINT_NULL_VALUE )
neighborId != null )
{
sb.append( "NEIGHBOR SITE " );
sb.append( neighborRank );
@@ -354,16 +354,14 @@ public class LTRNetOSWMessage extends LTRNetMessage
return null;
}
public int getSiteID()
public String getSiteID()
{
int retVal = sINT_NULL_VALUE;
if( mMessageType == MessageType.ID_SITE )
{
retVal = mMessage.getInt( 23, 32 );
return String.valueOf( mMessage.getInt( 23, 32 ) );
}
return retVal;
return null;
}
public Alias getSiteIDAlias()
@@ -376,16 +374,14 @@ public class LTRNetOSWMessage extends LTRNetMessage
return null;
}
public int getNeighborID()
public String getNeighborID()
{
int retVal = sINT_NULL_VALUE;
if( mMessageType == MessageType.ID_NBOR )
{
retVal = mMessage.getInt( 23, 32 );
return String.valueOf( mMessage.getInt( 23, 32 ) );
}
return retVal;
return null;
}
private Alias getNeighborIDAlias()

View File

@@ -33,7 +33,7 @@ public class MPT1327ActivitySummary implements ActivitySummaryProvider,
private AliasList mAliasList;
private TreeSet<String> mIdents = new TreeSet<String>();
private int mSite;
private String mSite;
/**
* Compiles a summary of active talkgroups, unique radio ids encountered
@@ -103,7 +103,7 @@ public class MPT1327ActivitySummary implements ActivitySummaryProvider,
sb.append( "Decoder:\tMPT-1327\n" );
sb.append( "Site:\t" );
if( mSite != 0 )
if( mSite != null )
{
sb.append( mSite );
@@ -118,21 +118,6 @@ public class MPT1327ActivitySummary implements ActivitySummaryProvider,
sb.append( "\n" );
}
}
sb.append( "Network:\t" );
if( ( mSite & 0x4000 ) == 0x4000 )
{
sb.append( "National #" );
int net = (int)Long.rotateRight( ( mSite & 0x3000 ) , 12 );
sb.append( net );
sb.append( "\n" );
}
else
{
sb.append( "Regional\n" );
}
}
else
{

View File

@@ -36,7 +36,7 @@ import decode.mpt1327.MPT1327Message.IdentType;
public class MPT1327ChannelState extends ChannelState
{
private int mSite;
private String mSite;
private String mFromTalkgroup;
private String mToTalkgroup;
private int mChannelNumber;
@@ -153,9 +153,9 @@ public class MPT1327ChannelState extends ChannelState
.build() );
break;
case ALH:
int sys = mpt.getSiteID();
String sys = mpt.getSiteID();
if( sys != 0 && sys != mSite )
if( sys != null && !sys.contentEquals( mSite ) )
{
mSite = sys;
broadcastChange( ChangedAttribute.CHANNEL_SITE_NUMBER );
@@ -315,7 +315,7 @@ public class MPT1327ChannelState extends ChannelState
super.reset();
}
public int getSite()
public String getSite()
{
return mSite;
}

View File

@@ -327,19 +327,19 @@ public class MPT1327Message extends Message
/**
* MPT1327 Site identifier
*/
public int getSiteID()
public String getSiteID()
{
if( mMessageType == MPTMessageType.BCAST )
{
return mMessage.getInt( B1_SYSTEM_ID );
return String.valueOf( mMessage.getInt( B1_SYSTEM_ID ) );
}
else if( mMessageType == MPTMessageType.ALH )
{
return mMessage.getInt( B2_SYSTEM_ID );
return String.valueOf( mMessage.getInt( B2_SYSTEM_ID ) );
}
else
{
return 0;
return null;
}
}
@@ -348,7 +348,7 @@ public class MPT1327Message extends Message
*/
public boolean hasSystemID()
{
return getSiteID() != 0;
return getSiteID() != null;
}
public SystemDefinition getSystemDefinition()
@@ -599,7 +599,7 @@ public class MPT1327Message extends Message
break;
case ACKT:
sb.append( " SITE:" );
sb.append( format( getSiteID(), 5 ) );
sb.append( getSiteID() );
sb.append( " LONG ACK MESSAGE" );
@@ -619,7 +619,7 @@ public class MPT1327Message extends Message
break;
case ACKQ:
sb.append( " SYSTEM:" );
sb.append( format( getSiteID(), 5 ) );
sb.append( getSiteID() );
sb.append( " CALL QUEUED FROM:" );
@@ -637,7 +637,7 @@ public class MPT1327Message extends Message
break;
case ACKX:
sb.append( " SYSTEM:" );
sb.append( format( getSiteID(), 5 ) );
sb.append( getSiteID() );
sb.append( " MESSAGE REJECTED FROM:" );
@@ -687,7 +687,7 @@ public class MPT1327Message extends Message
case ALHX:
case ALHF:
sb.append( " SYSTEM:" );
sb.append( format( getSiteID(), 5 ) );
sb.append( getSiteID() );
if( hasToID() )
{
@@ -706,7 +706,7 @@ public class MPT1327Message extends Message
break;
case BCAST:
sb.append( " SYSTEM:" );
sb.append( format( getSiteID(), 5 ) );
sb.append( getSiteID() );
SystemDefinition sysdef = getSystemDefinition();

View File

@@ -191,9 +191,9 @@ public class MPT1327Panel extends ChannelStatePanel
return null;
}
private Alias getSiteAlias( int site )
private Alias getSiteAlias( String site )
{
if( site != 0 && mAliasList != null )
if( site != null && mAliasList != null )
{
return mAliasList.getSiteID( site );
}

View File

@@ -18,6 +18,7 @@
package decode.p25;
import message.Message;
import alias.Alias;
import alias.AliasList;
import audio.SquelchListener;
import audio.SquelchListener.SquelchState;
@@ -25,10 +26,20 @@ import controller.channel.ProcessingChain;
import controller.state.AuxChannelState;
import controller.state.ChannelState;
import decode.p25.message.P25Message;
import decode.p25.message.pdu.RFSSStatusBroadcastExtended;
import decode.p25.message.tsbk.osp.control.RFSSStatusBroadcast;
public class P25ChannelState extends ChannelState
{
private P25ActivitySummary mActivitySummary;
private String mNAC;
private String mSystem;
private String mSite;
private String mSiteAlias;
private String mFromTalkgroup;
private String mFromAlias;
private String mToTalkgroup;
private String mToAlias;
public P25ChannelState( ProcessingChain chain, AliasList aliasList )
{
@@ -52,6 +63,73 @@ public class P25ChannelState extends ChannelState
{
mActivitySummary.receive( (P25Message)message );
}
if( message instanceof RFSSStatusBroadcast )
{
RFSSStatusBroadcast rfss = (RFSSStatusBroadcast)message;
if( mNAC == null || !mNAC.contentEquals( rfss.getNAC() ) )
{
mNAC = rfss.getNAC();
broadcastChange( ChangedAttribute.NAC );
}
if( mSystem == null || !mSystem.contentEquals( rfss.getSystemID() ) )
{
mSystem = rfss.getSystemID();
broadcastChange( ChangedAttribute.SYSTEM );
}
String site = rfss.getRFSubsystemID() + "-" + rfss.getSiteID();
if( mSite == null || !mSite.contentEquals( site ) )
{
mSite = site;
broadcastChange( ChangedAttribute.SITE );
}
}
else if( message instanceof RFSSStatusBroadcastExtended )
{
RFSSStatusBroadcastExtended rfss = (RFSSStatusBroadcastExtended)message;
if( mNAC == null || !mNAC.contentEquals( rfss.getNAC() ) )
{
mNAC = rfss.getNAC();
broadcastChange( ChangedAttribute.NAC );
}
if( mSystem == null || !mSystem.contentEquals( rfss.getSystemID() ) )
{
mSystem = rfss.getSystemID();
broadcastChange( ChangedAttribute.SYSTEM );
}
String site = rfss.getRFSubsystemID() + "-" + rfss.getSiteID();
if( mSite == null || !mSite.contentEquals( site ) )
{
mSite = site;
if( mAliasList != null )
{
Alias alias = mAliasList.getSiteID( mSite );
if( alias != null )
{
mSiteAlias = alias.getName();
broadcastChange( ChangedAttribute.SITE_ALIAS );
}
}
broadcastChange( ChangedAttribute.SITE );
}
}
}
@@ -76,4 +154,44 @@ public class P25ChannelState extends ChannelState
return sb.toString();
}
public String getNAC()
{
return mNAC;
}
public String getSystem()
{
return mSystem;
}
public String getSiteAlias()
{
return mSiteAlias;
}
public String getSite()
{
return mSite;
}
public String getFromTalkgroup()
{
return mFromTalkgroup;
}
public String getFromAlias()
{
return mFromAlias;
}
public String getToTalkgroup()
{
return mToTalkgroup;
}
public String getToAlias()
{
return mToAlias;
}
}

View File

@@ -36,6 +36,17 @@ public class P25Panel extends ChannelStatePanel
private JLabel mChannelLabel;
private JLabel mProtocol = new JLabel( "P25" );
private JLabel mFrom = new JLabel( " " );
private JLabel mFromAlias = new JLabel( " " );
private JLabel mNAC = new JLabel( "NAC:" );
private JLabel mTo = new JLabel( " " );
private JLabel mToAlias = new JLabel( " " );
private JLabel mSystem = new JLabel( "SYS:" );
private JLabel mSite = new JLabel( "Site:" );
private JLabel mSiteAlias = new JLabel( "WACN:" );
public P25Panel( Channel channel )
{
@@ -62,11 +73,45 @@ public class P25Panel extends ChannelStatePanel
mProtocol.setFont( mFontDecoder );
mProtocol.setForeground( mColorLabelDecoder );
mFrom.setFont( mFontDecoder );
mFrom.setForeground( mColorLabelDecoder );
mFromAlias.setFont( mFontDecoder );
mFromAlias.setForeground( mColorLabelDecoder );
mNAC.setFont( mFontDecoder );
mNAC.setForeground( mColorLabelDecoder );
mTo.setFont( mFontDecoder );
mTo.setForeground( mColorLabelDecoder );
mToAlias.setFont( mFontDecoder );
mToAlias.setForeground( mColorLabelDecoder );
mSystem.setFont( mFontDecoder );
mSystem.setForeground( mColorLabelDecoder );
mSiteAlias.setFont( mFontDecoder );
mSiteAlias.setForeground( mColorLabelDecoder );
mSite.setFont( mFontDecoder );
mSite.setForeground( mColorLabelDecoder );
add( mStateLabel );
add( mSourceLabel );
add( mChannelLabel, "wrap" );
add( mProtocol, "wrap" );
add( mProtocol );
add( mFrom );
add( mFromAlias, "wrap" );
add( mNAC );
add( mTo );
add( mToAlias, "wrap" );
add( mSystem );
add( mSite );
add( mSiteAlias, "wrap" );
}
@Override
@@ -77,11 +122,13 @@ public class P25Panel extends ChannelStatePanel
@Override
public void run()
{
final P25ChannelState channelState = (P25ChannelState)mChannel.
getProcessingChain().getChannelState();
switch( changedAttribute )
{
case CHANNEL_STATE:
mStateLabel.setText( mChannel.getProcessingChain().
getChannelState().getState().getDisplayValue() );
mStateLabel.setText( channelState.getState().getDisplayValue() );
break;
case SOURCE:
mSourceLabel.setText( mChannel.getSourceConfiguration()
@@ -92,6 +139,31 @@ public class P25Panel extends ChannelStatePanel
case SYSTEM_NAME:
mChannelLabel.setText( mChannel.getChannelDisplayName() );
break;
case NAC:
mNAC.setText( "NAC:" + channelState.getNAC() );
break;
case SYSTEM:
mSystem.setText( "SYS:" + channelState.getSystem() );
break;
case SITE:
mSite.setText( "SITE:" + channelState.getSite() );
break;
case SITE_ALIAS:
mSiteAlias.setText( channelState.getSiteAlias() );
break;
case FROM_TALKGROUP:
mFrom.setText( channelState.getFromTalkgroup() );
break;
case FROM_TALKGROUP_ALIAS:
mFromAlias.setText( channelState.getFromAlias() );
break;
case TO_TALKGROUP:
mTo.setText( channelState.getToTalkgroup() );
break;
case TO_TALKGROUP_ALIAS:
mToAlias.setText( channelState.getToAlias() );
break;
}
repaint();

View File

@@ -75,7 +75,7 @@ public class P25Message extends Message
@Override
public String getEventType()
{
return "P25 " + mDUID.name();
return mDUID.name();
}
@Override

View File

@@ -0,0 +1,15 @@
package decode.p25.message.tdu;
import alias.AliasList;
import bits.BitSetBuffer;
import decode.p25.message.P25Message;
import decode.p25.reference.DataUnitID;
public class TDUMessage extends P25Message
{
public TDUMessage( BitSetBuffer message, DataUnitID duid,
AliasList aliasList )
{
super( message, duid, aliasList );
}
}

View File

@@ -17,6 +17,7 @@ import decode.p25.TrellisHalfRate;
import decode.p25.message.P25Message;
import decode.p25.message.pdu.PDUMessage;
import decode.p25.message.pdu.PDUMessageFactory;
import decode.p25.message.tdu.TDUMessage;
import decode.p25.message.tsbk.TSBKMessage;
import decode.p25.message.tsbk.TSBKMessageFactory;
import decode.p25.reference.DataUnitID;
@@ -321,7 +322,7 @@ public class P25MessageFramer implements Listener<Dibit>
break;
case TDU:
mComplete = true;
dispatch( new P25Message( mMessage.copy(), mDUID, mAliasList ) );
dispatch( new TDUMessage( mMessage.copy(), mDUID, mAliasList ) );
break;
case TDULC:
mComplete = true;