mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-15 01:57:39 -05:00
Updated Call Event handling/display for all decoders and updated channel display values for all decoders.
- Call events now show start-stop timestamps. (or START-In Progress if call is ongoing ) - Call start/stop events are now on the same event line. - Channel panels now display site and/or channel info - LTR call events are limited to CALLs on the current LCN, in order to cut down on false call events resulting from noise. - Passport display channels now show site/channel. - Changed default window used by the DFTProcessor to Cosine, which doesn't have as much FFT bin leakage.
This commit is contained in:
@@ -17,6 +17,8 @@
|
||||
******************************************************************************/
|
||||
package decode.passport;
|
||||
|
||||
import log.Log;
|
||||
|
||||
public enum PassportBand
|
||||
{
|
||||
BAND_800( "800", 800000000 ),
|
||||
@@ -38,6 +40,8 @@ public enum PassportBand
|
||||
BAND_VHF( "VHF", 0 ),
|
||||
BAND_UNKNOWN( "UNK", 0 );
|
||||
|
||||
public static int CHANNEL_BANDWIDTH = 12500; //Hertz
|
||||
|
||||
private String mDescription;
|
||||
private int mBase;
|
||||
|
||||
@@ -59,6 +63,17 @@ public enum PassportBand
|
||||
}
|
||||
}
|
||||
|
||||
public long getFrequency( int channel )
|
||||
{
|
||||
return ( mBase + ( channel * CHANNEL_BANDWIDTH ) );
|
||||
}
|
||||
|
||||
public int getChannel( long frequency )
|
||||
{
|
||||
return Math.round( (float)( frequency - mBase ) /
|
||||
(float)CHANNEL_BANDWIDTH );
|
||||
}
|
||||
|
||||
public String getDescription()
|
||||
{
|
||||
return mDescription;
|
||||
|
||||
@@ -26,6 +26,7 @@ public class PassportCallEvent extends CallEvent
|
||||
{
|
||||
private int mChannel;
|
||||
private long mFrequency;
|
||||
private int mValidCallMessages = 1;
|
||||
|
||||
public PassportCallEvent( CallEventType callEventType,
|
||||
AliasList aliasList,
|
||||
@@ -42,6 +43,29 @@ public class PassportCallEvent extends CallEvent
|
||||
mFrequency = frequency;
|
||||
}
|
||||
|
||||
public boolean addMessage( PassportMessage message )
|
||||
{
|
||||
String tg = message.getToID();
|
||||
|
||||
if( tg.contentEquals( getToID() ) )
|
||||
{
|
||||
mValidCallMessages++;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isValid()
|
||||
{
|
||||
if( getCallEventType() == CallEventType.CALL )
|
||||
{
|
||||
return mValidCallMessages > 1;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private Alias getAlias( String talkgroup )
|
||||
{
|
||||
if( hasAliasList() )
|
||||
|
||||
@@ -17,11 +17,15 @@
|
||||
******************************************************************************/
|
||||
package decode.passport;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import log.Log;
|
||||
import message.Message;
|
||||
import alias.Alias;
|
||||
import alias.AliasList;
|
||||
import audio.AudioType;
|
||||
import audio.SquelchListener;
|
||||
import controller.activity.CallEvent;
|
||||
import controller.activity.CallEvent.CallEventType;
|
||||
import controller.channel.ProcessingChain;
|
||||
import controller.state.AuxChannelState;
|
||||
@@ -34,9 +38,10 @@ public class PassportChannelState extends ChannelState
|
||||
private String mMobileID;
|
||||
private Alias mMobileIDAlias;
|
||||
private int mChannelNumber;
|
||||
private long mFrequency;
|
||||
private PassportCallEvent mCurrentCallEvent;
|
||||
private int mSiteNumber;
|
||||
private PassportBand mSiteBand;
|
||||
private PassportActivitySummary mActivitySummary;
|
||||
private HashMap<Integer,String> mActiveCalls = new HashMap<Integer,String>();
|
||||
|
||||
public PassportChannelState( ProcessingChain channel, AliasList aliasList )
|
||||
{
|
||||
@@ -44,7 +49,7 @@ public class PassportChannelState extends ChannelState
|
||||
|
||||
mActivitySummary = new PassportActivitySummary( aliasList );
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getActivitySummary()
|
||||
{
|
||||
@@ -66,7 +71,7 @@ public class PassportChannelState extends ChannelState
|
||||
public void receive( Message message )
|
||||
{
|
||||
super.receive( message );
|
||||
|
||||
|
||||
if( message instanceof PassportMessage )
|
||||
{
|
||||
mActivitySummary.receive( message );
|
||||
@@ -78,44 +83,109 @@ public class PassportChannelState extends ChannelState
|
||||
switch( passport.getMessageType() )
|
||||
{
|
||||
case CA_STRT:
|
||||
setTalkgroup( String.valueOf( passport.getTalkgroupID() ) );
|
||||
setTalkgroupAlias( passport.getTalkgroupIDAlias() );
|
||||
|
||||
if( mTalkgroupAlias != null )
|
||||
if( mChannelNumber == 0 )
|
||||
{
|
||||
try
|
||||
{
|
||||
if( mTalkgroupAlias.hasAudioType() )
|
||||
mChannelNumber = passport.getLCN();
|
||||
}
|
||||
|
||||
if( passport.getLCN() == mChannelNumber )
|
||||
{
|
||||
setTalkgroup( String.valueOf( passport.getTalkgroupID() ) );
|
||||
setTalkgroupAlias( passport.getTalkgroupIDAlias() );
|
||||
|
||||
if( mTalkgroupAlias != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
mAudioTypeListener.setAudioType(
|
||||
mTalkgroupAlias.getAudioType() );
|
||||
if( mTalkgroupAlias.hasAudioType() )
|
||||
{
|
||||
mAudioTypeListener.setAudioType(
|
||||
mTalkgroupAlias.getAudioType() );
|
||||
}
|
||||
}
|
||||
}
|
||||
catch( Exception e )
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
catch( Exception e )
|
||||
{
|
||||
Log.error( "Error setting audio for "
|
||||
+ "passport call", e );
|
||||
}
|
||||
}
|
||||
|
||||
PassportCallEvent current =
|
||||
getCurrentPassportCallEvent();
|
||||
|
||||
/* If we're already in a call event, add the message
|
||||
* to the current call event ... if false, then we
|
||||
* have a different call ... cleanup the old one. */
|
||||
if( current != null && !current.addMessage( passport ) )
|
||||
{
|
||||
Log.info( "Current call event - testing" );
|
||||
|
||||
if( current.isValid() )
|
||||
{
|
||||
final PassportCallEvent endEvent =
|
||||
getCurrentPassportCallEvent();
|
||||
|
||||
mCallEventModel.setEnd( endEvent );
|
||||
}
|
||||
else
|
||||
{
|
||||
mCallEventModel.remove( current );
|
||||
}
|
||||
|
||||
current = null;
|
||||
setCurrentCallEvent( null );
|
||||
}
|
||||
|
||||
if( current == null )
|
||||
{
|
||||
mCurrentCallEvent = new PassportCallEvent
|
||||
.Builder( CallEventType.CALL )
|
||||
.aliasList( mAliasList )
|
||||
.channel( mChannelNumber )
|
||||
.frequency( passport.getLCNFrequency() )
|
||||
.to( String.valueOf( passport.getTalkgroupID() ) )
|
||||
.build();
|
||||
|
||||
mCallEventModel.add( mCurrentCallEvent );
|
||||
}
|
||||
|
||||
State state = getState();
|
||||
|
||||
if( state == State.IDLE || state == State.CALL )
|
||||
{
|
||||
setState( State.CALL );
|
||||
}
|
||||
else if( state == State.DATA )
|
||||
{
|
||||
setState( State.DATA );
|
||||
}
|
||||
}
|
||||
|
||||
mChannelNumber = passport.getLCN();
|
||||
mFrequency = passport.getLCNFrequency();
|
||||
|
||||
if( getState() != State.CALL )
|
||||
else
|
||||
{
|
||||
mCurrentCallEvent = new PassportCallEvent
|
||||
.Builder( CallEventType.CALL_START )
|
||||
.aliasList( mAliasList )
|
||||
.channel( mChannelNumber )
|
||||
.frequency( mFrequency )
|
||||
.to( String.valueOf( passport.getTalkgroupID() ) )
|
||||
.build();
|
||||
//Call Detection
|
||||
int lcn = passport.getLCN();
|
||||
String tg = String.valueOf( passport.getTalkgroupID() );
|
||||
|
||||
mCallEventModel.add( mCurrentCallEvent );
|
||||
if( !mActiveCalls.containsKey( lcn ) ||
|
||||
!mActiveCalls.get( lcn ).contentEquals( tg ) )
|
||||
{
|
||||
mActiveCalls.put( lcn, tg );
|
||||
|
||||
PassportCallEvent event = new PassportCallEvent
|
||||
.Builder( CallEventType.CALL_DETECT )
|
||||
.aliasList( mAliasList )
|
||||
.channel( lcn )
|
||||
.details( "Site: " + passport.getSite() )
|
||||
.frequency( passport.getLCNFrequency() )
|
||||
.to( tg )
|
||||
.build();
|
||||
|
||||
mCallEventModel.add( event );
|
||||
}
|
||||
}
|
||||
|
||||
setState( State.CALL );
|
||||
break;
|
||||
case DA_STRT:
|
||||
//TODO: add channel number checking and log a call event if on another site
|
||||
setTalkgroup( String.valueOf( passport.getTalkgroupID() ) );
|
||||
setTalkgroupAlias( passport.getTalkgroupIDAlias() );
|
||||
setState( State.DATA );
|
||||
@@ -129,12 +199,48 @@ public class PassportChannelState extends ChannelState
|
||||
setMobileID( passport.getMobileID() );
|
||||
setMobileIDAlias( passport.getMobileIDAlias() );
|
||||
|
||||
if( mCurrentCallEvent != null )
|
||||
final String mid = passport.getMobileID();
|
||||
|
||||
final PassportCallEvent event =
|
||||
getCurrentPassportCallEvent();
|
||||
|
||||
if( event != null && mid != null )
|
||||
{
|
||||
mCurrentCallEvent.setFromID( mMobileID );
|
||||
mCallEventModel.setFromID( event, mid );
|
||||
}
|
||||
|
||||
setState( State.CALL );
|
||||
break;
|
||||
case RA_REGI:
|
||||
mCallEventModel.add( new PassportCallEvent
|
||||
.Builder( CallEventType.REGISTER )
|
||||
.aliasList( mAliasList )
|
||||
.channel( passport.getLCN() )
|
||||
.frequency( passport.getLCNFrequency() )
|
||||
.to( passport.getToID() )
|
||||
.build() );
|
||||
//TODO: add logic to recognize the register event and suppress the subsequent
|
||||
//call messages, but capture the group assignments.
|
||||
setState( State.DATA );
|
||||
break;
|
||||
case SY_IDLE:
|
||||
PassportBand band = passport.getSiteBand();
|
||||
|
||||
if( mSiteBand == null || mSiteBand != band )
|
||||
{
|
||||
mSiteBand = band;
|
||||
|
||||
mSiteNumber = passport.getSite();
|
||||
|
||||
long frequency = mProcessingChain.getChannel()
|
||||
.getTunerChannel().getFrequency();
|
||||
|
||||
mChannelNumber = mSiteBand.getChannel( frequency );
|
||||
|
||||
broadcastChange( ChangedAttribute.CHANNEL_NUMBER );
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -152,21 +258,33 @@ public class PassportChannelState extends ChannelState
|
||||
*/
|
||||
if( getState().canChangeTo( State.FADE ) )
|
||||
{
|
||||
mCallEventModel.add(
|
||||
new PassportCallEvent.Builder( type )
|
||||
.aliasList( getAliasList() )
|
||||
.channel( mChannelNumber )
|
||||
.frequency( mProcessingChain.getChannel()
|
||||
.getTunerChannel().getFrequency() )
|
||||
.to( mTalkgroup )
|
||||
.build() );
|
||||
final PassportCallEvent current = getCurrentPassportCallEvent();
|
||||
|
||||
if( current != null )
|
||||
{
|
||||
mCallEventModel.setEnd( current );
|
||||
}
|
||||
}
|
||||
|
||||
setCurrentCallEvent( null );
|
||||
|
||||
mActiveCalls.clear();
|
||||
|
||||
super.fade( type );
|
||||
}
|
||||
|
||||
public PassportCallEvent getCurrentPassportCallEvent()
|
||||
{
|
||||
CallEvent current = getCurrentCallEvent();
|
||||
|
||||
if( current != null )
|
||||
{
|
||||
return (PassportCallEvent)current;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Make the ConventionalChannelState always unsquelched
|
||||
*/
|
||||
@@ -190,6 +308,16 @@ public class PassportChannelState extends ChannelState
|
||||
super.reset();
|
||||
}
|
||||
|
||||
public int getChannelNumber()
|
||||
{
|
||||
return mChannelNumber;
|
||||
}
|
||||
|
||||
public int getSiteNumber()
|
||||
{
|
||||
return mSiteNumber;
|
||||
}
|
||||
|
||||
public String getTalkgroup()
|
||||
{
|
||||
return mTalkgroup;
|
||||
|
||||
@@ -207,11 +207,6 @@ public class PassportMessage extends Message
|
||||
return PassportBand.lookup( getInt( sNEIGHBOR_BAND ) );
|
||||
}
|
||||
|
||||
public long getFrequency( int base, int channel )
|
||||
{
|
||||
return ( base + ( channel * 12500 ) );
|
||||
}
|
||||
|
||||
public int getFree()
|
||||
{
|
||||
return getInt( sFREE );
|
||||
@@ -233,7 +228,7 @@ public class PassportMessage extends Message
|
||||
{
|
||||
PassportBand band = getNeighborBand();
|
||||
|
||||
return getFrequency( band.getBase(), getFree() );
|
||||
return band.getFrequency( getFree() );
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -377,15 +372,13 @@ public class PassportMessage extends Message
|
||||
@Override
|
||||
public String getToID()
|
||||
{
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
return String.valueOf( getTalkgroupID() );
|
||||
}
|
||||
|
||||
@Override
|
||||
public Alias getToIDAlias()
|
||||
{
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
return getTalkgroupIDAlias();
|
||||
}
|
||||
|
||||
public long getSiteFrequency( int channel )
|
||||
@@ -396,9 +389,7 @@ public class PassportMessage extends Message
|
||||
|
||||
if( band != PassportBand.BAND_UNKNOWN )
|
||||
{
|
||||
int base = band.getBase();
|
||||
|
||||
return getFrequency( base, channel );
|
||||
return band.getFrequency( channel );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -493,7 +484,7 @@ public class PassportMessage extends Message
|
||||
sb.append( getFreeFrequencyFormatted() );
|
||||
break;
|
||||
case CA_ENDD:
|
||||
sb.append( "END TG:" );
|
||||
sb.append( "END TG:" );
|
||||
sb.append( format( getTalkgroupID(), 5 ) );
|
||||
sb.append( "/" );
|
||||
Alias endAlias = getTalkgroupIDAlias();
|
||||
|
||||
@@ -19,6 +19,7 @@ package decode.passport;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import log.Log;
|
||||
import message.Message;
|
||||
import message.MessageType;
|
||||
import sample.Broadcaster;
|
||||
|
||||
@@ -41,7 +41,7 @@ public class PassportPanel extends ChannelStatePanel
|
||||
private JLabel mToTalkgroup = new JLabel();
|
||||
private JLabel mToTalkgroupAlias = new JLabel();
|
||||
|
||||
private JLabel mFromTalkgroupType = new JLabel( " " );
|
||||
private JLabel mSiteAndChannel = new JLabel( "Site:" );
|
||||
private JLabel mFromTalkgroup = new JLabel();
|
||||
private JLabel mFromTalkgroupAlias = new JLabel();
|
||||
|
||||
@@ -86,8 +86,8 @@ public class PassportPanel extends ChannelStatePanel
|
||||
mToTalkgroupAlias.setFont( mFontDecoder );
|
||||
mToTalkgroupAlias.setForeground( mColorLabelDecoder );
|
||||
|
||||
mFromTalkgroupType.setFont( mFontDecoder );
|
||||
mFromTalkgroupType.setForeground( mColorLabelDecoder );
|
||||
mSiteAndChannel.setFont( mFontDecoder );
|
||||
mSiteAndChannel.setForeground( mColorLabelDecoder );
|
||||
|
||||
mFromTalkgroup.setFont( mFontDecoder );
|
||||
mFromTalkgroup.setForeground( mColorLabelDecoder );
|
||||
@@ -103,7 +103,7 @@ public class PassportPanel extends ChannelStatePanel
|
||||
add( mToTalkgroup );
|
||||
add( mToTalkgroupAlias, "wrap" );
|
||||
|
||||
add( mFromTalkgroupType );
|
||||
add( mSiteAndChannel );
|
||||
add( mFromTalkgroup );
|
||||
add( mFromTalkgroupAlias, "wrap" );
|
||||
}
|
||||
@@ -135,7 +135,16 @@ public class PassportPanel extends ChannelStatePanel
|
||||
mChannelLabel.setText( mChannel.getChannelDisplayName() );
|
||||
break;
|
||||
case TO_TALKGROUP:
|
||||
mToTalkgroup.setText( state.getTalkgroup() );
|
||||
String tg = state.getTalkgroup();
|
||||
|
||||
if( tg != null )
|
||||
{
|
||||
mToTalkgroup.setText( "TG:" + tg );
|
||||
}
|
||||
else
|
||||
{
|
||||
mToTalkgroup.setText( null );
|
||||
}
|
||||
break;
|
||||
case TO_TALKGROUP_ALIAS:
|
||||
Alias toAlias = state.getTalkgroupAlias();
|
||||
@@ -156,16 +165,14 @@ public class PassportPanel extends ChannelStatePanel
|
||||
case FROM_TALKGROUP:
|
||||
String mid = state.getMobileID();
|
||||
|
||||
mFromTalkgroup.setText( state.getMobileID() );
|
||||
|
||||
if( mid != null )
|
||||
{
|
||||
mFromTalkgroupType.setText( "Mobile ID" );
|
||||
}
|
||||
else
|
||||
{
|
||||
mFromTalkgroupType.setText( " " );
|
||||
}
|
||||
if( mid != null )
|
||||
{
|
||||
mFromTalkgroup.setText( "MIN:" + mid );
|
||||
}
|
||||
else
|
||||
{
|
||||
mFromTalkgroup.setText( null );
|
||||
}
|
||||
break;
|
||||
case FROM_TALKGROUP_ALIAS:
|
||||
Alias fromAlias = state.getMobileIDAlias();
|
||||
@@ -183,6 +190,15 @@ public class PassportPanel extends ChannelStatePanel
|
||||
mFromTalkgroupAlias.setIcon( null );
|
||||
}
|
||||
break;
|
||||
case CHANNEL_NUMBER:
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append( "Site: " );
|
||||
sb.append( state.getSiteNumber() );
|
||||
sb.append( "/" );
|
||||
sb.append( state.getChannelNumber() );
|
||||
|
||||
mSiteAndChannel.setText( sb.toString() );
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -222,9 +238,9 @@ public class PassportPanel extends ChannelStatePanel
|
||||
{
|
||||
mToTalkgroupAlias.setForeground( mColorLabelDecoder );
|
||||
}
|
||||
if( mFromTalkgroupType != null )
|
||||
if( mSiteAndChannel != null )
|
||||
{
|
||||
mFromTalkgroupType.setForeground( mColorLabelDecoder );
|
||||
mSiteAndChannel.setForeground( mColorLabelDecoder );
|
||||
}
|
||||
if( mFromTalkgroup != null )
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user