Compare commits

..

46 Commits

Author SHA1 Message Date
Denny Sheirer
4cd8f8209f Merge pull request #216 from DSheirer/215-audio-recording-handles-part-2
215 audio recording handles part 2
2017-03-03 15:49:24 +00:00
Denny
61bfef5798 Incrementing build to version 0.3.0 beta8 2017-03-03 10:44:50 -05:00
Denny
ef172a04c6 Cleanup - removed synchronized blocks since the buffer processor thread is the only thread managing recorders. 2017-03-03 10:04:21 -05:00
Denny
a877afcceb Updates buffer processing in recorder manager so that we're not blocking any of the decoding channel producer threads that are trying to push audio packets to the recorder manager. Adds an overflowable packet queue and services the queue once a second followed by an idle recorder check (and disposal). 2017-03-03 10:01:32 -05:00
Denny
980ad72d4d Incrementing build to 0.3.0 beta7 2017-03-03 06:01:09 -05:00
Denny Sheirer
9b746cc032 Merge pull request #215 from DSheirer/198-audio-recorder-handles-left-open
Resolves issue audio recorders left open
2017-03-03 10:58:08 +00:00
Denny
f51ae0b5da Resolves issue with periodic instances of audio recorders not being shutdown correctly. Adds recorder monitor as a fail-safe to automatically shutdown recorders that don't receive an end-call indication. 2017-03-03 05:56:32 -05:00
Denny Sheirer
561078e9bf Merge pull request #214 from DSheirer/210-playlist-saving-all-times
Resolves issue with the playlist saving all of the time
2017-03-03 00:34:25 +00:00
Denny
e052b01f9b Resolves issue with the playlist saving all of the time due to audio streaming broadcast events. 2017-03-02 19:33:10 -05:00
Denny
09cf4fcfd7 Resolves issue with empty string list models in channel editor 2017-02-26 10:29:14 -05:00
Denny
5e731d0e9f Resolves issue with alias list and group combo box value editing. 2017-02-26 06:51:58 -05:00
Denny Sheirer
670a02b0ba Merge pull request #209 from DSheirer/153-cursor-frequency-artifacts
Resolves issue with spectral display rendering artifacts
2017-02-26 10:48:59 +00:00
Denny
9ef156b061 Resolves issue with spectral display rendering artifacts from cursor frequency readout when accessing menu items directly above the spectral display. 2017-02-26 05:47:26 -05:00
Denny
d9cf1b19f3 Removes assert() usage throughout project and replaces with Validate from apache commons. 2017-02-25 16:03:35 -05:00
Denny
a4a339b505 Resolves issue with FCD2 tuner frequency. 2017-02-25 14:58:51 -05:00
Denny
119370c46e Resolves issue with FCD2 tuner frequency. 2017-02-25 14:57:25 -05:00
Denny
4eb66e6045 Updated readme file with screen shot and link to new Version 0.3.0 user's manual. 2017-02-25 06:18:59 -05:00
Denny Sheirer
8827ecd0e9 Merge pull request #207 from DSheirer/206-alias-list-npe-null-list-name
206 alias list npe null list name
2017-02-24 10:25:29 +00:00
Denny
8660002f93 Incrementing build to beta 6 2017-02-24 05:24:38 -05:00
Denny
2058fcbc1d Resolves issue #206 - alias list throws NPE on aliases that don't have a list name specified. 2017-02-24 05:23:48 -05:00
Denny
9515dfa380 Incrementing build for 0.3.0 beta #5 2017-02-20 20:25:43 -05:00
Denny
9e9a604c6a Merge remote-tracking branch 'origin/master' 2017-02-20 20:20:11 -05:00
Denny
234e313b7a Resolves issue with Null Pointer exception in alias list 2017-02-20 20:19:47 -05:00
Denny Sheirer
e1e7169029 Merge pull request #203 from DSheirer/199-utf8-encoding-of-metadata
Resolves issue with UTF-8 encoding of Shoutcast 2 metadata updates.
2017-02-17 23:09:10 +00:00
Denny
f3605db0ed Resolves issue where metadata is UTF-8 URL encoded versus UTF-8 String encoding. 2017-02-17 18:08:01 -05:00
Denny Sheirer
c0a6d578c7 Merge pull request #202 from DSheirer/201-audio-stream-failed-reconnect
Resolves issue with audio broadcasters attempting to reconnect if a c…
2017-02-17 22:54:58 +00:00
Denny
79b4b30ec7 Resolves issue with audio broadcasters attempting to reconnect if a connection attempt is not successful. 2017-02-17 17:53:42 -05:00
Denny
17c7466c6b Resolves logic issue in Icecast error handling during resets. 2017-02-13 20:51:10 -05:00
Denny Sheirer
8162d6ffd6 Merge pull request #196 from DSheirer/164-patched-group-streaming-duplicates
Resolves #173 - duplicate streaming calls for patch groups.
2017-02-12 15:59:46 +00:00
Denny
cd60251337 Resolves #173 - duplicate streaming calls for patch groups. 2017-02-12 10:59:06 -05:00
Denny Sheirer
5647879b37 Merge pull request #195 from DSheirer/173-p25-tdma-channel-frequencies-incorrect
Resolves #173 - logging/management of  P25 TDMA channels.
2017-02-12 15:21:50 +00:00
Denny
6916d95cdf Resolves #173 - logging/management of P25 TDMA channels. There is no Phase II decoder support yet. 2017-02-12 10:20:45 -05:00
Denny Sheirer
a0c32f6fe0 Merge pull request #194 from DSheirer/193-icecast-tcp-write-timeout-exception
Resolves #193 - adds handling for MINA WriteTimeoutException
2017-02-12 13:05:11 +00:00
Denny
c3d60dc174 Resolves #193 - adds handling for MINA WriteTimeoutException error. Resets connection when this occurs. 2017-02-12 08:04:27 -05:00
Denny Sheirer
e55a2226a2 Merge pull request #192 from DSheirer/189-shoutcast-ultravox-UTF8-encoding
Resolves #189 - add UTF-8 encoding to shoutcast v2
2017-02-12 12:45:10 +00:00
Denny
9f01678b00 Resolves #189 - add UTF-8 encoding to shoutcast v2 (ultravox) XML metadata update values. 2017-02-12 07:43:51 -05:00
Denny Sheirer
46425e9cae Merge pull request #191 from DSheirer/188-p25-activity-summary-cleanup
188 p25 activity summary cleanup
2017-02-12 12:31:45 +00:00
Denny
3726401563 Resolves #188 - cleanup of the P25 and MPT activity summaries. Resolves an issue in the SNDCP downlink/uplink channel frequencies. 2017-02-12 07:30:32 -05:00
Denny
a3e50acfe3 Incrementing build to 0.3.0-beta4 2017-02-11 09:02:35 -05:00
Denny
cf0018e6ba Incrementing build to 0.3.0-beta4 2017-02-11 07:22:54 -05:00
Denny Sheirer
e8055dcab0 Merge pull request #187 from DSheirer/186-p25-c4fm-decoder-no-worky
Resolves #186 - p25 C4FM decoder wasn't working (at all).
2017-02-11 12:17:58 +00:00
Denny
fce3d5c4f3 Resolves #186 - p25 C4FM decoder wasn't working (at all). 2017-02-11 07:17:23 -05:00
Denny Sheirer
9cc0d367a8 Merge pull request #185 from DSheirer/183-alias-list-throws-npe-on-empty-name
Resolves #183 - alias list throws NPE when created with a null or emp…
2017-02-11 00:35:16 +00:00
Denny
2ca9e5d5ce Resolves #183 - alias list throws NPE when created with a null or empty name and receives alias updates. 2017-02-10 19:34:50 -05:00
Denny Sheirer
861203c3a0 Merge pull request #184 from DSheirer/181-patch-group-audio-priority
Resolves #181 - patch group audio priority will assume the highest (l…
2017-02-11 00:31:42 +00:00
Denny
7c930deefe Resolves #181 - patch group audio priority will assume the highest (listenable) audio priority and override a 'Do Not Monitor' setting if any of the other aliases have an audio priority defined. 2017-02-10 19:31:09 -05:00
105 changed files with 7980 additions and 6649 deletions

View File

@@ -18,6 +18,7 @@
<w>talkgroup</w>
<w>tgid</w>
<w>ultravox</w>
<w>wacn</w>
<w>xtea</w>
</words>
</dictionary>

View File

@@ -18,6 +18,7 @@
buffers. Bounded queues have ability to enter/exit overflow state when queue
size reaches overflow threshold and reset when queue size falls below the reset
threshold. Channel state will show OVERFLOW in red/yellow.
- Improves handling of P25 TDMA channels (NO Phase 2 decoder support yet)
- Updated airspy controller for airspy-mini specific sample rate handling.
- New developer remez filter designer tool and internal usage

View File

@@ -2,18 +2,10 @@
A cross-platform java application for decoding, monitoring, recording and streaming trunked mobile and related radio protocols using Software Defined Radios (SDR).
* [Getting Started](https://github.com/DSheirer/sdrtrunk/wiki/GettingStarted)
* [User's Manual](https://github.com/DSheirer/sdrtrunk/wiki/UserManual)
* [User's Manual Version 0.2.0](https://github.com/DSheirer/sdrtrunk/wiki/UserManual)
* [User's Manual Version 0.3.0](https://github.com/DSheirer/sdrtrunk/wiki/UserManual_Version0.3.0)
* [Download](https://github.com/DSheirer/sdrtrunk/releases)
* [Support](https://groups.google.com/forum/#!forum/sdrtrunk)
![](https://github.com/DSheirer/sdrtrunk/wiki/images/SDRTrunk_application.png)
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-67489234-1', 'auto');
ga('send', 'pageview');
</script>
![sdrtrunk Application Overview - Version 0.3.0](https://github.com/DSheirer/sdrtrunk/wiki/images/ApplicationOverview_V0.3.0.png)
**Figure 1:** sdrtrunk **Version 0.3.0** Application Screenshot

View File

@@ -7,7 +7,7 @@
<property name="major" value="0"/>
<property name="minor" value="3"/>
<property name="patch" value="0"/>
<property name="release" value="-beta3"/>
<property name="release" value="-beta8"/>
<property name="filename" value="sdrtrunk_${major}.${minor}.${patch}${release}"/>
<!-- Build properties -->

View File

@@ -185,27 +185,6 @@ public class Alias
*/
public void validate()
{
//Check for duplicate broadcast channels
List<BroadcastChannel> broadcastChannels = getBroadcastChannels();
if(broadcastChannels.size() > 0)
{
Set<String> channelNames = new TreeSet<>();
for(BroadcastChannel broadcastChannel: broadcastChannels)
{
String channelName = broadcastChannel.getChannelName();
if(channelName == null || channelName.isEmpty() || channelNames.contains(channelName))
{
removeAliasID(broadcastChannel);
}
else
{
channelNames.add(channelName);
}
}
}
}
/**
* Returns the priority level of this alias, if defined, or the default priority
@@ -336,9 +315,9 @@ public class Alias
* List of broadcast channels specified for this alias.
*/
@XmlTransient
public List<BroadcastChannel> getBroadcastChannels()
public Set<BroadcastChannel> getBroadcastChannels()
{
List<BroadcastChannel> broadcastChannels = new ArrayList<>();
Set<BroadcastChannel> broadcastChannels = new TreeSet<>();
for(AliasID id: getId())
{

View File

@@ -631,36 +631,47 @@ public class AliasList implements Listener<AliasEvent>
return mName;
}
/**
* Indicates if this alias list has a non-null, non-empty name
*/
private boolean hasName()
{
return mName != null && !mName.isEmpty();
}
/**
* Receive alias change event notifications and modify this list accordingly
*/
@Override
public void receive(AliasEvent event)
{
Alias alias = event.getAlias();
switch(event.getEvent())
if(hasName())
{
case ADD:
if(alias.getList() != null && getName().equalsIgnoreCase(alias.getList()))
{
addAlias(alias);
}
break;
case CHANGE:
if(alias.getList() != null && getName().equalsIgnoreCase(alias.getList()))
{
addAlias(alias);
}
break;
case DELETE:
if(alias.getList() != null && getName().equalsIgnoreCase(alias.getList()))
{
removeAlias(alias);
}
break;
default:
break;
Alias alias = event.getAlias();
switch(event.getEvent())
{
case ADD:
if(alias.getList() != null && getName().equalsIgnoreCase(alias.getList()))
{
addAlias(alias);
}
break;
case CHANGE:
if(alias.getList() != null && getName().equalsIgnoreCase(alias.getList()))
{
addAlias(alias);
}
break;
case DELETE:
if(alias.getList() != null && getName().equalsIgnoreCase(alias.getList()))
{
removeAlias(alias);
}
break;
default:
break;
}
}
}
}

View File

@@ -1,22 +1,28 @@
/*******************************************************************************
* SDR Trunk
* Copyright (C) 2014-2016 Dennis Sheirer
*
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
******************************************************************************/
package alias;
import alias.AliasEvent.Event;
import alias.id.broadcast.BroadcastChannel;
import sample.Broadcaster;
import sample.Listener;
import javax.swing.table.AbstractTableModel;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@@ -24,195 +30,192 @@ import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.swing.table.AbstractTableModel;
import alias.id.broadcast.BroadcastChannel;
import sample.Broadcaster;
import sample.Listener;
import alias.AliasEvent.Event;
/**
* Alias Model
*/
public class AliasModel extends AbstractTableModel
{
private static final long serialVersionUID = 1L;
private static final long serialVersionUID = 1L;
public static final int COLUMN_LIST = 0;
public static final int COLUMN_GROUP = 1;
public static final int COLUMN_NAME = 2;
public static final int COLUMN_ICON = 3;
public static final int COLUMN_COLOR = 4;
public static final int COLUMN_LIST = 0;
public static final int COLUMN_GROUP = 1;
public static final int COLUMN_NAME = 2;
public static final int COLUMN_ICON = 3;
public static final int COLUMN_COLOR = 4;
private List<Alias> mAliases = new CopyOnWriteArrayList<>();
private Broadcaster<AliasEvent> mAliasEventBroadcaster = new Broadcaster<>();
private Map<String,AliasList> mAliasListMap = new HashMap<>();
private List<Alias> mAliases = new CopyOnWriteArrayList<>();
private Broadcaster<AliasEvent> mAliasEventBroadcaster = new Broadcaster<>();
private Map<String,AliasList> mAliasListMap = new HashMap<>();
public AliasModel()
{
}
public AliasModel()
{
}
/**
* Unmodifiable list of all aliases currently in the model
*/
public List<Alias> getAliases()
{
return Collections.unmodifiableList( mAliases );
}
public Alias getAliasAtIndex( int row )
{
if( mAliases.size() >= row )
{
return mAliases.get( row );
}
return null;
}
public AliasList getAliasList( String name )
{
if( mAliasListMap.containsKey( name ) )
{
return mAliasListMap.get( name );
}
AliasList aliasList = new AliasList( name );
for( Alias alias: mAliases )
{
if( alias.getList().equalsIgnoreCase( name ) )
{
aliasList.addAlias( alias );
}
}
/**
* Unmodifiable list of all aliases currently in the model
*/
public List<Alias> getAliases()
{
return Collections.unmodifiableList(mAliases);
}
mAliasListMap.put( name, aliasList );
public Alias getAliasAtIndex(int row)
{
if(mAliases.size() >= row)
{
return mAliases.get(row);
}
//Register the new alias list to receive updates from this model
addListener( aliasList );
return aliasList;
}
/**
* Returns a list of unique alias list names from across the alias set
*/
public List<String> getListNames()
{
List<String> listNames = new ArrayList<>();
for( Alias alias: mAliases )
{
if( alias.hasList() && !listNames.contains( alias.getList() ) )
{
listNames.add( alias.getList() );
}
}
Collections.sort( listNames );
return listNames;
}
/**
* Returns a list of alias group names for all aliases
*/
public List<String> getGroupNames()
{
List<String> groupNames = new ArrayList<>();
return null;
}
for( Alias alias: mAliases )
{
if( alias.hasGroup() && !groupNames.contains( alias.getGroup() ) )
{
groupNames.add( alias.getGroup() );
}
}
public AliasList getAliasList(String name)
{
if(name != null && mAliasListMap.containsKey(name))
{
return mAliasListMap.get(name);
}
Collections.sort( groupNames );
return groupNames;
}
AliasList aliasList = new AliasList(name);
/**
* Returns a list of alias group names for all aliases that have a matching
* list name value
*/
public List<String> getGroupNames( String listName )
{
List<String> groupNames = new ArrayList<>();
if(name != null)
{
for(Alias alias : mAliases)
{
if(alias.hasList() && alias.getList().equalsIgnoreCase(name))
{
aliasList.addAlias(alias);
}
}
if( listName != null )
{
for( Alias alias: mAliases )
{
if( alias.hasList() &&
alias.hasGroup() &&
listName.equals( alias.getList() ) &&
!groupNames.contains( alias.getGroup() ) )
{
groupNames.add( alias.getGroup() );
}
}
}
mAliasListMap.put(name, aliasList);
Collections.sort( groupNames );
return groupNames;
}
//Register the new alias list to receive updates from this model
addListener(aliasList);
}
/**
* Bulk loading of aliases
*/
public void addAliases( List<Alias> aliases )
{
for( Alias alias: aliases )
{
addAlias( alias );
}
}
return aliasList;
}
/**
* Adds the alias to the model
*/
public int addAlias( Alias alias )
{
if( alias != null )
{
mAliases.add( alias );
/**
* Returns a list of unique alias list names from across the alias set
*/
public List<String> getListNames()
{
List<String> listNames = new ArrayList<>();
int index = mAliases.size() - 1;
for(Alias alias : mAliases)
{
if(alias.hasList() && !listNames.contains(alias.getList()))
{
listNames.add(alias.getList());
}
}
fireTableRowsInserted( index, index );
broadcast( new AliasEvent( alias, Event.ADD ) );
Collections.sort(listNames);
return index;
}
return -1;
}
/**
* Removes the channel from the model and broadcasts a channel remove event
*/
public void removeAlias( Alias alias )
{
if( alias != null )
{
int index = mAliases.indexOf( alias );
mAliases.remove( alias );
fireTableRowsDeleted( index, index );
broadcast( new AliasEvent( alias, Event.DELETE ) );
}
}
return listNames;
}
/**
* Returns a list of alias group names for all aliases
*/
public List<String> getGroupNames()
{
List<String> groupNames = new ArrayList<>();
for(Alias alias : mAliases)
{
if(alias.hasGroup() && !groupNames.contains(alias.getGroup()))
{
groupNames.add(alias.getGroup());
}
}
Collections.sort(groupNames);
return groupNames;
}
/**
* Returns a list of alias group names for all aliases that have a matching
* list name value
*/
public List<String> getGroupNames(String listName)
{
List<String> groupNames = new ArrayList<>();
if(listName != null)
{
for(Alias alias : mAliases)
{
if(alias.hasList() &&
alias.hasGroup() &&
listName.equals(alias.getList()) &&
!groupNames.contains(alias.getGroup()))
{
groupNames.add(alias.getGroup());
}
}
}
Collections.sort(groupNames);
return groupNames;
}
/**
* Bulk loading of aliases
*/
public void addAliases(List<Alias> aliases)
{
for(Alias alias : aliases)
{
addAlias(alias);
}
}
/**
* Adds the alias to the model
*/
public int addAlias(Alias alias)
{
if(alias != null)
{
mAliases.add(alias);
int index = mAliases.size() - 1;
fireTableRowsInserted(index, index);
broadcast(new AliasEvent(alias, Event.ADD));
return index;
}
return -1;
}
/**
* Removes the channel from the model and broadcasts a channel remove event
*/
public void removeAlias(Alias alias)
{
if(alias != null)
{
int index = mAliases.indexOf(alias);
mAliases.remove(alias);
fireTableRowsDeleted(index, index);
broadcast(new AliasEvent(alias, Event.DELETE));
}
}
/**
* Renames any broadcast channels that have the previous name.
*
* @param previousName to rename
* @param newName to assign to the broadcast channel
*/
@@ -223,11 +226,11 @@ public class AliasModel extends AbstractTableModel
return;
}
for(Alias alias: mAliases)
for(Alias alias : mAliases)
{
if(alias.hasBroadcastChannel(previousName))
{
for(BroadcastChannel broadcastChannel: alias.getBroadcastChannels())
for(BroadcastChannel broadcastChannel : alias.getBroadcastChannels())
{
if(broadcastChannel.getChannelName().contentEquals(previousName))
{
@@ -238,85 +241,85 @@ public class AliasModel extends AbstractTableModel
}
}
@Override
public int getRowCount()
{
return mAliases.size();
}
@Override
public int getRowCount()
{
return mAliases.size();
}
@Override
public int getColumnCount()
{
return 5;
}
@Override
public int getColumnCount()
{
return 5;
}
@Override
public String getColumnName( int columnIndex )
{
switch( columnIndex )
{
case COLUMN_LIST:
return "List";
case COLUMN_GROUP:
return "Group";
case COLUMN_NAME:
return "Name";
case COLUMN_ICON:
return "Icon";
case COLUMN_COLOR:
return "Color";
}
return null;
}
@Override
public String getColumnName(int columnIndex)
{
switch(columnIndex)
{
case COLUMN_LIST:
return "List";
case COLUMN_GROUP:
return "Group";
case COLUMN_NAME:
return "Name";
case COLUMN_ICON:
return "Icon";
case COLUMN_COLOR:
return "Color";
}
@Override
public Class<?> getColumnClass( int columnIndex )
{
if( columnIndex == COLUMN_COLOR )
{
return Integer.class;
}
return String.class;
}
return null;
}
@Override
public boolean isCellEditable( int rowIndex, int columnIndex )
{
return false;
}
@Override
public Class<?> getColumnClass(int columnIndex)
{
if(columnIndex == COLUMN_COLOR)
{
return Integer.class;
}
@Override
public Object getValueAt( int rowIndex, int columnIndex )
{
Alias alias = mAliases.get( rowIndex );
switch( columnIndex )
{
case COLUMN_LIST:
return alias.getList();
case COLUMN_GROUP:
return alias.getGroup();
case COLUMN_NAME:
return alias.getName();
case COLUMN_ICON:
return alias.getIconName();
case COLUMN_COLOR:
return alias.getColor();
}
return null;
}
return String.class;
}
@Override
public void setValueAt( Object aValue, int rowIndex, int columnIndex )
{
throw new IllegalArgumentException( "Not yet implemented" );
}
public void broadcast( AliasEvent event )
{
@Override
public boolean isCellEditable(int rowIndex, int columnIndex)
{
return false;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex)
{
Alias alias = mAliases.get(rowIndex);
switch(columnIndex)
{
case COLUMN_LIST:
return alias.getList();
case COLUMN_GROUP:
return alias.getGroup();
case COLUMN_NAME:
return alias.getName();
case COLUMN_ICON:
return alias.getIconName();
case COLUMN_COLOR:
return alias.getColor();
}
return null;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex)
{
throw new IllegalArgumentException("Not yet implemented");
}
public void broadcast(AliasEvent event)
{
Alias alias = event.getAlias();
//Validate the alias following a user action that changed the alias or any alias IDs
@@ -325,23 +328,23 @@ public class AliasModel extends AbstractTableModel
alias.validate();
}
if( event.getEvent() == Event.CHANGE )
{
int index = mAliases.indexOf( event.getAlias() );
fireTableRowsUpdated( index, index );
}
mAliasEventBroadcaster.broadcast( event );
}
public void addListener( Listener<AliasEvent> listener )
{
mAliasEventBroadcaster.addListener( listener );
}
public void removeListener( Listener<AliasEvent> listener )
{
mAliasEventBroadcaster.removeListener( listener );
}
if(event.getEvent() == Event.CHANGE)
{
int index = mAliases.indexOf(event.getAlias());
fireTableRowsUpdated(index, index);
}
mAliasEventBroadcaster.broadcast(event);
}
public void addListener(Listener<AliasEvent> listener)
{
mAliasEventBroadcaster.addListener(listener);
}
public void removeListener(Listener<AliasEvent> listener)
{
mAliasEventBroadcaster.removeListener(listener);
}
}

View File

@@ -40,10 +40,11 @@ public class AliasNameEditor extends Editor<Alias>
{
private static final long serialVersionUID = 1L;
private static ComboBoxModel<String> EMPTY_MODEL = new DefaultComboBoxModel<>();
private static ComboBoxModel<String> EMPTY_LIST_MODEL = new DefaultComboBoxModel<>();
private static ComboBoxModel<String> EMPTY_GROUP_MODEL = new DefaultComboBoxModel<>();
private JComboBox<String> mListCombo = new JComboBox<>(EMPTY_MODEL);
private JComboBox<String> mGroupCombo = new JComboBox<>(EMPTY_MODEL);
private JComboBox<String> mListCombo = new JComboBox<>(EMPTY_LIST_MODEL);
private JComboBox<String> mGroupCombo = new JComboBox<>(EMPTY_GROUP_MODEL);
private JComboBox<Icon> mIconCombo;
private JTextField mName;
private JButton mButtonColor;
@@ -110,7 +111,7 @@ public class AliasNameEditor extends Editor<Alias>
if(groups.isEmpty())
{
mGroupCombo.setModel(EMPTY_MODEL);
mGroupCombo.setModel(EMPTY_GROUP_MODEL);
}
else
{
@@ -238,7 +239,7 @@ public class AliasNameEditor extends Editor<Alias>
if(listNames.isEmpty())
{
mListCombo.setModel(EMPTY_MODEL);
mListCombo.setModel(EMPTY_LIST_MODEL);
}
else
{
@@ -253,7 +254,7 @@ public class AliasNameEditor extends Editor<Alias>
if(groupNames.isEmpty())
{
mGroupCombo.setModel(EMPTY_MODEL);
mGroupCombo.setModel(EMPTY_GROUP_MODEL);
}
else
{
@@ -285,8 +286,8 @@ public class AliasNameEditor extends Editor<Alias>
}
else
{
mListCombo.setModel(EMPTY_MODEL);
mGroupCombo.setModel(EMPTY_MODEL);
mListCombo.setModel(EMPTY_LIST_MODEL);
mGroupCombo.setModel(EMPTY_GROUP_MODEL);
mName.setText(null);
mButtonColor.setBackground(getBackground());

View File

@@ -24,12 +24,20 @@ import alias.id.AliasIDType;
import alias.id.broadcast.BroadcastChannel;
import alias.id.priority.Priority;
import alias.id.talkgroup.TalkgroupID;
import gui.SDRTrunk;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import playlist.version1.System;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
public class PatchGroupAlias extends Alias
{
private final static Logger mLog = LoggerFactory.getLogger(PatchGroupAlias.class);
private Alias mPatchGroupAlias;
private List<Alias> mPatchedAliases = new ArrayList<>();
private List<String> mPatchedTalkgroupIDs = new ArrayList<>();
@@ -197,22 +205,44 @@ public class PatchGroupAlias extends Alias
return hasPatchGroupAlias() && getPatchGroupAlias().hasActions();
}
/**
* Returns the highest listenable audio priority defined among the aliases in the group, or returns 'Do Not Monitor'
* if that is the only priority defined. Otherwise, returns default (100) priority.
*/
@Override
public int getCallPriority()
{
int highestPriority = (hasPatchGroupAlias() ? getPatchGroupAlias().getCallPriority() : Priority.DEFAULT_PRIORITY);
boolean hasDoNotMonitor = false;
int highestPriority = (hasPatchGroupAlias() ? getPatchGroupAlias().getCallPriority() : Priority.DEFAULT_PRIORITY + 1);
for(Alias alias: mPatchedAliases)
{
if(!(alias instanceof PatchGroupAlias) &&
alias.hasCallPriority() &&
alias.getCallPriority() < highestPriority)
if(!(alias instanceof PatchGroupAlias) && alias.hasCallPriority() && alias.getCallPriority() < highestPriority)
{
highestPriority = alias.getCallPriority();
if(alias.getCallPriority() == Priority.DO_NOT_MONITOR)
{
hasDoNotMonitor = true;
}
else
{
highestPriority = alias.getCallPriority();
}
}
}
return highestPriority;
if(highestPriority <= Priority.DEFAULT_PRIORITY)
{
return highestPriority;
}
else if(hasDoNotMonitor)
{
return Priority.DO_NOT_MONITOR;
}
else
{
return Priority.DEFAULT_PRIORITY;
}
}
@Override
@@ -273,9 +303,9 @@ public class PatchGroupAlias extends Alias
}
@Override
public List<BroadcastChannel> getBroadcastChannels()
public Set<BroadcastChannel> getBroadcastChannels()
{
List<BroadcastChannel> broadcastChannels = new ArrayList<>();
Set<BroadcastChannel> broadcastChannels = new TreeSet<>();
if(hasPatchGroupAlias())
{
@@ -286,13 +316,7 @@ public class PatchGroupAlias extends Alias
{
if(!(alias instanceof PatchGroupAlias))
{
for(BroadcastChannel broadcastChannel: alias.getBroadcastChannels())
{
if(!broadcastChannels.contains(broadcastChannel))
{
broadcastChannels.add(broadcastChannel);
}
}
broadcastChannels.addAll(alias.getBroadcastChannels());
}
}
@@ -317,4 +341,41 @@ public class PatchGroupAlias extends Alias
return false;
}
public static void main(String[] args)
{
Alias a1 = new Alias("Alias 1");
a1.addAliasID(new BroadcastChannel("Channel 1"));
a1.addAliasID(new BroadcastChannel("Channel 2"));
a1.addAliasID(new BroadcastChannel("Channel 3"));
a1.addAliasID(new BroadcastChannel("Channel 4"));
Alias a2 = new Alias("Alias 1");
a1.addAliasID(new BroadcastChannel("Channel 1"));
a1.addAliasID(new BroadcastChannel("Channel 2"));
a1.addAliasID(new BroadcastChannel("Channel 3"));
a1.addAliasID(new BroadcastChannel("Channel 4"));
Alias a3 = new Alias("Alias 1");
a1.addAliasID(new BroadcastChannel("Channel 1"));
a1.addAliasID(new BroadcastChannel("Channel 2"));
a1.addAliasID(new BroadcastChannel("Channel 3"));
a1.addAliasID(new BroadcastChannel("Channel 4"));
Alias a4 = new Alias("Alias 1");
a1.addAliasID(new BroadcastChannel("Channel 1"));
a1.addAliasID(new BroadcastChannel("Channel 2"));
a1.addAliasID(new BroadcastChannel("Channel 3"));
a1.addAliasID(new BroadcastChannel("Channel 4"));
PatchGroupAlias pga = new PatchGroupAlias();
pga.setPatchGroupAlias(a1);
pga.addPatchedAlias(a2);
pga.addPatchedAlias(a3);
pga.addPatchedAlias(a4);
Set<BroadcastChannel> bc = pga.getBroadcastChannels();
mLog.debug("Channels:" + bc);
}
}

View File

@@ -18,6 +18,8 @@
******************************************************************************/
package alias.id;
import org.apache.commons.lang3.Validate;
import java.util.regex.Pattern;
public class WildcardID implements Comparable<WildcardID>
@@ -45,7 +47,7 @@ public class WildcardID implements Comparable<WildcardID>
*/
public WildcardID(String value)
{
assert(value != null && value.contains(WILDCARD) && value.length() < 10);
Validate.isTrue(value != null && value.contains(WILDCARD) && value.length() < 10);
mValue = value;

View File

@@ -707,9 +707,7 @@ public class BroadcastModel extends AbstractTableModel implements Listener<Audio
if(metadata != null && metadata.isStreamable())
{
List<BroadcastChannel> broadcastChannels = metadata.getBroadcastChannels();
for(BroadcastChannel broadcastChannel : broadcastChannels)
for(BroadcastChannel broadcastChannel : metadata.getBroadcastChannels())
{
String channelName = broadcastChannel.getChannelName();

View File

@@ -156,6 +156,8 @@ public class IcecastHTTPAudioBroadcaster extends IcecastAudioBroadcaster
disconnect();
}
mConnecting.set(false);
}
};
@@ -176,8 +178,6 @@ public class IcecastHTTPAudioBroadcaster extends IcecastAudioBroadcaster
{
mStreamingSession.closeNow();
}
mConnecting.set(false);
}
/**
@@ -256,6 +256,7 @@ public class IcecastHTTPAudioBroadcaster extends IcecastAudioBroadcaster
mSocketConnector = null;
mConnecting.set(false);
super.sessionClosed(session);
}

View File

@@ -25,6 +25,7 @@ import org.apache.mina.core.RuntimeIoException;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.core.write.WriteTimeoutException;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
import org.slf4j.Logger;
@@ -146,6 +147,8 @@ public class IcecastTCPAudioBroadcaster extends IcecastAudioBroadcaster
disconnect();
}
mConnecting.set(false);
}
};
@@ -254,7 +257,7 @@ public class IcecastTCPAudioBroadcaster extends IcecastAudioBroadcaster
disconnect();
connect();
}
if(reason.startsWith("Connection reset"))
else if(reason.startsWith("Connection reset"))
{
mLog.info("Streaming connection reset by remote server - reestablishing connection");
disconnect();
@@ -273,6 +276,12 @@ public class IcecastTCPAudioBroadcaster extends IcecastAudioBroadcaster
mLog.error("Unrecognized IO error: " + reason + ". Streaming halted.", cause);
}
}
else if(ioe instanceof WriteTimeoutException)
{
mLog.info("Network write timeout error - resetting connection");
disconnect();
connect();
}
else
{
setBroadcastState(BroadcastState.ERROR);
@@ -286,8 +295,6 @@ public class IcecastTCPAudioBroadcaster extends IcecastAudioBroadcaster
setBroadcastState(BroadcastState.ERROR);
disconnect();
}
mConnecting.set(false);
}
@Override

View File

@@ -168,6 +168,8 @@ public class ShoutcastV1AudioBroadcaster extends AudioBroadcaster
disconnect();
}
mConnecting.set(false);
}
};

View File

@@ -50,6 +50,7 @@ import properties.SystemProperties;
import util.ThreadPool;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.ConnectException;
import java.net.InetSocketAddress;
import java.util.ArrayList;
@@ -203,6 +204,8 @@ public class ShoutcastV2AudioBroadcaster extends AudioBroadcaster implements IBr
disconnect();
}
mConnecting.set(false);
}
};
@@ -244,43 +247,50 @@ public class ShoutcastV2AudioBroadcaster extends AudioBroadcaster implements IBr
sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?><metadata>");
sb.append(UltravoxMetadata.ALBUM_TITLE.asXML(getConfiguration().getName()));
sb.append(UltravoxMetadata.BROADCAST_CLIENT_APPLICATION.asXML(SystemProperties.getInstance().getApplicationName()));
if(getConfiguration().hasGenre())
try
{
sb.append(UltravoxMetadata.GENRE.asXML(getConfiguration().getGenre()));
}
sb.append(UltravoxMetadata.ALBUM_TITLE.asXML(getConfiguration().getName()));
if(getConfiguration().hasURL())
{
sb.append(UltravoxMetadata.URL.asXML(getConfiguration().getURL()));
}
sb.append(UltravoxMetadata.BROADCAST_CLIENT_APPLICATION.asXML(SystemProperties.getInstance().getApplicationName()));
if(metadata != null)
{
if(metadata.getPrimaryAddressTo().hasAlias())
if(getConfiguration().hasGenre())
{
sb.append(UltravoxMetadata.TITLE_2.asXML(metadata.getPrimaryAddressTo().getAlias().getName()));
}
else if(metadata.getPrimaryAddressTo().hasIdentifier())
{
sb.append(UltravoxMetadata.TITLE_2.asXML(metadata.getPrimaryAddressTo().getIdentifier()));
sb.append(UltravoxMetadata.GENRE.asXML(getConfiguration().getGenre()));
}
if(metadata.getPrimaryAddressFrom().hasAlias())
if(getConfiguration().hasURL())
{
sb.append(UltravoxMetadata.TITLE_3.asXML("From:" + metadata.getPrimaryAddressFrom().getAlias().getName()));
sb.append(UltravoxMetadata.URL.asXML(getConfiguration().getURL()));
}
else if(metadata.getPrimaryAddressFrom().hasIdentifier())
if(metadata != null)
{
sb.append(UltravoxMetadata.TITLE_3.asXML("From:" + metadata.getPrimaryAddressFrom().getIdentifier()));
if(metadata.getPrimaryAddressTo().hasAlias())
{
sb.append(UltravoxMetadata.TITLE_2.asXML(metadata.getPrimaryAddressTo().getAlias().getName()));
}
else if(metadata.getPrimaryAddressTo().hasIdentifier())
{
sb.append(UltravoxMetadata.TITLE_2.asXML(metadata.getPrimaryAddressTo().getIdentifier()));
}
if(metadata.getPrimaryAddressFrom().hasAlias())
{
sb.append(UltravoxMetadata.TITLE_3.asXML("From:" + metadata.getPrimaryAddressFrom().getAlias().getName()));
}
else if(metadata.getPrimaryAddressFrom().hasIdentifier())
{
sb.append(UltravoxMetadata.TITLE_3.asXML("From:" + metadata.getPrimaryAddressFrom().getIdentifier()));
}
}
else
{
sb.append(UltravoxMetadata.TITLE_2.asXML("Scanning ..."));
}
}
else
catch(UnsupportedEncodingException uee)
{
sb.append(UltravoxMetadata.TITLE_2.asXML("Scanning ..."));
mLog.error("UTF-8 Encoding is not supported - shoutcast/ultravox metadata will not be updated");
}
sb.append("</metadata>");

View File

@@ -21,6 +21,7 @@ package audio.broadcast.shoutcast.v2;
import audio.broadcast.BroadcastConfiguration;
import audio.broadcast.BroadcastFormat;
import audio.broadcast.BroadcastServerType;
import org.apache.commons.lang3.Validate;
import javax.xml.bind.annotation.XmlAttribute;
@@ -90,7 +91,7 @@ public class ShoutcastV2Configuration extends BroadcastConfiguration
*/
public void setStreamID(int streamID)
{
assert(1 <= streamID && streamID <= Integer.MAX_VALUE);
Validate.isTrue(1 <= streamID && streamID <= Integer.MAX_VALUE);
mStreamID = streamID;
}

View File

@@ -18,6 +18,8 @@
******************************************************************************/
package audio.broadcast.shoutcast.v2.ultravox;
import org.apache.commons.lang3.Validate;
public class NegotiateMaxPayloadSize extends UltravoxMessage
{
/**
@@ -47,8 +49,8 @@ public class NegotiateMaxPayloadSize extends UltravoxMessage
*/
public void setMaximumPayloadSize(int desiredMaximum, int minimum)
{
assert(desiredMaximum <= 16377);
assert(minimum <= 16377);
Validate.isTrue(desiredMaximum <= 16377);
Validate.isTrue(minimum <= 16377);
StringBuilder sb = new StringBuilder();
sb.append(desiredMaximum).append(":").append(minimum);

View File

@@ -19,6 +19,7 @@
package audio.broadcast.shoutcast.v2.ultravox;
import bits.BinaryMessage;
import org.apache.commons.lang3.Validate;
import java.util.Arrays;
@@ -154,7 +155,7 @@ public abstract class UltravoxMessage
*/
public void setSendQueuePriority(int priority)
{
assert(0 <= priority && priority <= 7);
Validate.isTrue(0 <= priority && priority <= 7);
mMessage.setInt(priority, SEND_QUEUE_PRIORITY);
}

View File

@@ -18,6 +18,9 @@
******************************************************************************/
package audio.broadcast.shoutcast.v2.ultravox;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public enum UltravoxMetadata
{
ALBUM_TITLE("TALB"),
@@ -58,11 +61,11 @@ public enum UltravoxMetadata
* @param value to enclose in XML tags
* @return xml tag wrapped value
*/
public String asXML(String value)
public String asXML(String value) throws UnsupportedEncodingException
{
StringBuilder sb = new StringBuilder();
sb.append("<").append(getXMLTag()).append(">");
sb.append(value);
sb.append(new String(value.getBytes(), "UTF-8"));
sb.append("</").append(getXMLTag()).append(">");
return sb.toString();

View File

@@ -22,6 +22,7 @@ import java.util.BitSet;
import java.util.logging.LogManager;
import edac.CRC;
import org.apache.commons.lang3.Validate;
public class BinaryMessage extends BitSet
{
@@ -456,7 +457,7 @@ public class BinaryMessage extends BitSet
*/
public byte getByte(int index)
{
assert((index + 7) <= size());
Validate.isTrue((index + 7) <= size());
int value = 0;
@@ -481,7 +482,7 @@ public class BinaryMessage extends BitSet
*/
public void setByte(int index, byte value)
{
assert((index + 8) <= size());
Validate.isTrue((index + 8) <= size());
int mask = 0x80;

View File

@@ -17,6 +17,8 @@
******************************************************************************/
package bits;
import org.apache.commons.lang3.Validate;
import java.util.ArrayList;
import java.util.List;
@@ -39,7 +41,7 @@ public class MultiSyncPatternMatcher
public MultiSyncPatternMatcher( int syncSize )
{
assert( syncSize < 64 );
Validate.isTrue(syncSize < 64);
//Setup a bit mask of all ones the length of the sync pattern
mMask = (long)( ( Math.pow( 2, syncSize ) ) - 1 );

View File

@@ -38,7 +38,7 @@ public class ChannelDetailPanel extends JPanel implements Listener<ProcessingCha
private JLabel mSystemLabel;
private JLabel mSiteLabel;
private JLabel mNameLabel;
private JTextArea mDetailTextArea;
private JTextArea mDetailTextPane;
private ChannelProcessingManager mChannelProcessingManager;
private ProcessingChain mProcessingChain;
@@ -82,10 +82,10 @@ public class ChannelDetailPanel extends JPanel implements Listener<ProcessingCha
add(buttonPanel, "wrap");
mDetailTextArea = new JTextArea(EMPTY_DETAILS);
DefaultCaret caret = (DefaultCaret)mDetailTextArea.getCaret();
mDetailTextPane = new JTextArea(EMPTY_DETAILS);
DefaultCaret caret = (DefaultCaret)mDetailTextPane.getCaret();
caret.setUpdatePolicy(DefaultCaret.NEVER_UPDATE);
add(new JScrollPane(mDetailTextArea));
add(new JScrollPane(mDetailTextPane));
}
@Override
@@ -126,7 +126,7 @@ public class ChannelDetailPanel extends JPanel implements Listener<ProcessingCha
mSystemLabel.setText(system);
mSiteLabel.setText(site);
mNameLabel.setText(name);
mDetailTextArea.setText(details);
mDetailTextPane.setText(details);
}
});
}

View File

@@ -19,8 +19,6 @@
package channel.metadata;
import alias.Alias;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sample.Listener;
import java.util.ArrayList;
@@ -30,8 +28,6 @@ import java.util.Map;
public class AttributeMonitor<T>
{
private final static Logger mLog = LoggerFactory.getLogger(AttributeMonitor.class);
private Attribute mAttribute;
private Listener<AttributeChangeRequest> mListener;
private boolean mHeuristicsEnabled = true;
@@ -50,8 +46,8 @@ public class AttributeMonitor<T>
* an internal mapping of values to occurrence counts is updated and a change is emitted once a value that is
* different from the current value, has a higher occurrence count than the current value. If heuristics are
* disabled, then a change is emitted at each change in the value.
* @param t
*
* @param t type
* @return true if the value was changed after processing
*/
public boolean process(T t)
@@ -83,7 +79,7 @@ public class AttributeMonitor<T>
{
int count = mOccurrenceCounts.get(mCurrentValue);
for(Map.Entry<T,Integer> entry: mOccurrenceCounts.entrySet())
for(Map.Entry<T,Integer> entry : mOccurrenceCounts.entrySet())
{
if(entry.getValue() > count)
{
@@ -155,35 +151,4 @@ public class AttributeMonitor<T>
{
return mCurrentValue != null;
}
public static void main(String[] args)
{
AttributeMonitor<String> monitor = new AttributeMonitor<>(Attribute.PRIMARY_ADDRESS_TO, new Listener<AttributeChangeRequest>()
{
@Override
public void receive(AttributeChangeRequest attributeChangeRequest)
{
mLog.debug("Attribute Changed - value:" + attributeChangeRequest.getValue());
}
});
monitor.addIllegalValue("0000");
monitor.addIllegalValue("000000");
monitor.process("ABCD");
monitor.process("EFGH");
monitor.process("0000");
monitor.process("0000");
monitor.process("ABCD");
monitor.reset();
monitor.process("EFGH");
monitor.process("ABCD");
monitor.process("ABCD");
monitor.process("EFGH");
monitor.process("EFGH");
monitor.process("000000");
monitor.process("000000");
monitor.process("000000");
monitor.process("000000");
}
}

View File

@@ -26,6 +26,7 @@ import controller.channel.ChannelUtils;
import icon.IconManager;
import module.ProcessingChain;
import net.miginfocom.swing.MigLayout;
import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import properties.SystemProperties;
@@ -140,7 +141,7 @@ public class ChannelMetadataPanel extends JPanel implements ListSelectionListene
public AliasedValueCellRenderer(Attribute attribute)
{
assert(attribute != null);
Validate.isTrue(attribute != null);
mAttribute = attribute;
setHorizontalAlignment(JLabel.CENTER);
}

View File

@@ -28,6 +28,8 @@ import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
public class Metadata
{
@@ -61,7 +63,7 @@ public class Metadata
private Integer mAudioPriority;
protected Boolean mRecordable = false;
protected Boolean mDoNotRecord;
private List<BroadcastChannel> mBroadcastChannels;
private Set<BroadcastChannel> mBroadcastChannels;
/**
@@ -166,7 +168,7 @@ public class Metadata
/**
* List of de-duplicated broadcast channels aggregated from the primary and secondary TO/FROM aliases.
*/
public List<BroadcastChannel> getBroadcastChannels()
public Set<BroadcastChannel> getBroadcastChannels()
{
if(mBroadcastChannels == null)
{
@@ -582,50 +584,26 @@ public class Metadata
*/
private void determineBroadcastChannels()
{
mBroadcastChannels = new ArrayList<>();
mBroadcastChannels = new TreeSet<>();
if(mPrimaryAddressTo.hasAlias() && mPrimaryAddressTo.getAlias().isStreamable())
{
for(BroadcastChannel broadcastChannel: mPrimaryAddressTo.getAlias().getBroadcastChannels())
{
if(!mBroadcastChannels.contains(broadcastChannel))
{
mBroadcastChannels.add(broadcastChannel);
}
}
mBroadcastChannels.addAll(mPrimaryAddressTo.getAlias().getBroadcastChannels());
}
if(mPrimaryAddressFrom.hasAlias() && mPrimaryAddressFrom.getAlias().isStreamable())
{
for(BroadcastChannel broadcastChannel: mPrimaryAddressFrom.getAlias().getBroadcastChannels())
{
if(!mBroadcastChannels.contains(broadcastChannel))
{
mBroadcastChannels.add(broadcastChannel);
}
}
mBroadcastChannels.addAll(mPrimaryAddressFrom.getAlias().getBroadcastChannels());
}
if(mSecondaryAddressTo.hasAlias() && mSecondaryAddressTo.getAlias().isStreamable())
{
for(BroadcastChannel broadcastChannel: mSecondaryAddressTo.getAlias().getBroadcastChannels())
{
if(!mBroadcastChannels.contains(broadcastChannel))
{
mBroadcastChannels.add(broadcastChannel);
}
}
mBroadcastChannels.addAll(mSecondaryAddressTo.getAlias().getBroadcastChannels());
}
if(mSecondaryAddressFrom.hasAlias() && mSecondaryAddressFrom.getAlias().isStreamable())
{
for(BroadcastChannel broadcastChannel: mSecondaryAddressFrom.getAlias().getBroadcastChannels())
{
if(!mBroadcastChannels.contains(broadcastChannel))
{
mBroadcastChannels.add(broadcastChannel);
}
}
mBroadcastChannels.addAll(mSecondaryAddressFrom.getAlias().getBroadcastChannels());
}
}

View File

@@ -23,6 +23,9 @@ public abstract class DecoderState extends Module implements ActivitySummaryProv
IAttributeChangeRequestProvider, ICallEventProvider, IDecoderStateEventListener,
IDecoderStateEventProvider, IMessageListener
{
protected String DIVIDER1 = "======================================================\n";
protected String DIVIDER2 = "------------------------------------------------------\n";
/* This has to be a broadcaster in order for references to persist */
private Broadcaster<CallEvent> mCallEventBroadcaster = new Broadcaster<>();
private Broadcaster<AttributeChangeRequest> mAttributeChangeRequestBroadcaster = new Broadcaster<>();

View File

@@ -1,269 +1,267 @@
/*******************************************************************************
* SDR Trunk
* Copyright (C) 2014-2016 Dennis Sheirer
*
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
******************************************************************************/
package controller.channel;
import alias.AliasModel;
import gui.editor.Editor;
import net.miginfocom.swing.MigLayout;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Collections;
import java.util.List;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.miginfocom.swing.MigLayout;
import alias.AliasModel;
public class NameConfigurationEditor extends Editor<Channel> implements DocumentListener
{
private static final long serialVersionUID = 1L;
private static final long serialVersionUID = 1L;
private final static Logger mLog = LoggerFactory.getLogger( NameConfigurationEditor.class );
private final static Logger mLog = LoggerFactory.getLogger(NameConfigurationEditor.class);
private static ComboBoxModel<String> EMPTY_MODEL = new DefaultComboBoxModel<>();
private static ComboBoxModel<String> EMPTY_SYSTEM_MODEL = new DefaultComboBoxModel<>();
private static ComboBoxModel<String> EMPTY_SITE_MODEL = new DefaultComboBoxModel<>();
private static ComboBoxModel<String> EMPTY_ALIAS_LIST_MODEL = new DefaultComboBoxModel<>();
private AliasModel mAliasModel;
private ChannelModel mChannelModel;
private JTextField mChannelName;
private JComboBox<String> mSystemNameCombo;
private JComboBox<String> mSiteNameCombo;
private JComboBox<String> mAliasListCombo;
public NameConfigurationEditor( AliasModel aliasModel, ChannelModel model )
{
mAliasModel = aliasModel;
mChannelModel = model;
private AliasModel mAliasModel;
private ChannelModel mChannelModel;
init();
}
private void init()
{
setLayout( new MigLayout( "fill,wrap 4", "[right][grow,fill][right][grow,fill]", "[][][grow]" ) );
private JTextField mChannelName;
private JComboBox<String> mSystemNameCombo;
private JComboBox<String> mSiteNameCombo;
private JComboBox<String> mAliasListCombo;
mChannelName = new JTextField( "" );
mChannelName.getDocument().addDocumentListener( this );
mChannelName.setEnabled( false );
public NameConfigurationEditor(AliasModel aliasModel, ChannelModel model)
{
mAliasModel = aliasModel;
mChannelModel = model;
add( new JLabel( "Name:" ) );
add( mChannelName );
init();
}
mSystemNameCombo = new JComboBox<>( EMPTY_MODEL );
mSystemNameCombo.setEnabled( false );
mSystemNameCombo.setEditable( true );
mSystemNameCombo.addActionListener( new ActionListener()
{
@Override
public void actionPerformed( ActionEvent e )
{
Object selected = mSystemNameCombo.getSelectedItem();
if( selected != null )
{
String system = (String)selected;
List<String> sites = mChannelModel.getSites( system );
private void init()
{
setLayout(new MigLayout("fill,wrap 4", "[right][grow,fill][right][grow,fill]", "[][][grow]"));
if( !sites.contains( getItem().getSite() ) )
{
sites.add( getItem().getSite() );
}
if( sites.isEmpty() )
{
mSiteNameCombo.setModel( EMPTY_MODEL );
}
else
{
mSiteNameCombo.setModel( new DefaultComboBoxModel<String>(
sites.toArray( new String[ sites.size() ] ) ) );;
}
mSiteNameCombo.setSelectedItem( getItem().getSite() );
}
setModified( true );
}
} );
add( new JLabel( "System:" ) );
add( mSystemNameCombo );
mChannelName = new JTextField("");
mChannelName.getDocument().addDocumentListener(this);
mChannelName.setEnabled(false);
mAliasListCombo = new JComboBox<String>();
mAliasListCombo.setEnabled( false );
mAliasListCombo.setEditable( true );
mAliasListCombo.addActionListener( new ActionListener()
{
@Override
public void actionPerformed( ActionEvent e )
{
setModified( true );
}
} );
add( new JLabel( "Alias List:" ) );
add( mAliasListCombo );
mSiteNameCombo = new JComboBox<>( EMPTY_MODEL );
mSiteNameCombo.setEnabled( false );
mSiteNameCombo.setEditable( true );
mSiteNameCombo.addActionListener( new ActionListener()
{
@Override
public void actionPerformed( ActionEvent e )
{
setModified( true );
}
} );
add( new JLabel( "Site:" ) );
add( mSiteNameCombo );
}
@Override
public void save()
{
if( hasItem() && isModified() )
{
getItem().setName( mChannelName.getText() );
Object system = mSystemNameCombo.getSelectedItem();
getItem().setSystem( ( system == null ? null : (String)system ) );
add(new JLabel("Name:"));
add(mChannelName);
Object site = mSiteNameCombo.getSelectedItem();
getItem().setSite( ( site == null ? null : (String)site ) );
mSystemNameCombo = new JComboBox<>(EMPTY_SYSTEM_MODEL);
mSystemNameCombo.setEnabled(false);
mSystemNameCombo.setEditable(true);
mSystemNameCombo.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
Object selected = mSystemNameCombo.getSelectedItem();
Object aliasList = mAliasListCombo.getSelectedItem();
getItem().setAliasListName( aliasList == null ? null : (String)aliasList );
}
setModified( false );
}
if(selected != null)
{
String system = (String)selected;
private void setControlsEnabled( boolean enabled )
{
if( mChannelName.isEnabled() != enabled )
{
mChannelName.setEnabled( enabled );
}
List<String> sites = mChannelModel.getSites(system);
if( mAliasListCombo.isEnabled() != enabled )
{
mAliasListCombo.setEnabled( enabled );
}
if(!sites.contains(getItem().getSite()))
{
sites.add(getItem().getSite());
}
if( mSystemNameCombo.isEnabled() != enabled )
{
mSystemNameCombo.setEnabled( enabled );
}
if( mSiteNameCombo.isEnabled() != enabled )
{
mSiteNameCombo.setEnabled( enabled );
}
}
if(sites.isEmpty())
{
mSiteNameCombo.setModel(EMPTY_SITE_MODEL);
}
else
{
mSiteNameCombo.setModel(new DefaultComboBoxModel<String>(
sites.toArray(new String[sites.size()])));
;
}
@Override
public void setItem( Channel channel )
{
super.setItem( channel );
if( hasItem() )
{
setControlsEnabled( true );
mChannelName.setText( channel.getName() );
mSiteNameCombo.setSelectedItem(getItem().getSite());
}
List<String> systems = mChannelModel.getSystems();
if( systems.isEmpty() )
{
mSystemNameCombo.setModel( EMPTY_MODEL );
}
else
{
mSystemNameCombo.setModel( new DefaultComboBoxModel<String>(
systems.toArray( new String[ systems.size() ] ) ) );;
}
mSystemNameCombo.setSelectedItem( channel.getSystem() );
setModified(true);
}
});
List<String> sites = mChannelModel.getSites( channel.getSystem() );
add(new JLabel("System:"));
add(mSystemNameCombo);
if( sites.isEmpty() )
{
mSiteNameCombo.setModel( EMPTY_MODEL );
}
else
{
mSiteNameCombo.setModel( new DefaultComboBoxModel<String>(
sites.toArray( new String[ sites.size() ] ) ) );;
}
mAliasListCombo = new JComboBox<String>(EMPTY_ALIAS_LIST_MODEL);
mAliasListCombo.setEnabled(false);
mAliasListCombo.setEditable(true);
mAliasListCombo.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
setModified(true);
}
});
if( channel.getSite() != null )
{
mSiteNameCombo.setSelectedItem( channel.getSite() );
}
List<String> lists = mAliasModel.getListNames();
Collections.sort( lists );
mAliasListCombo.setModel( new DefaultComboBoxModel<String>(
lists.toArray( new String[ lists.size() ] ) ) );
if( channel.getAliasListName() != null )
{
mAliasListCombo.setSelectedItem( channel.getAliasListName() );
}
}
else
{
setControlsEnabled( false );
mChannelName.setText( null );
}
setModified( false );
}
add(new JLabel("Alias List:"));
add(mAliasListCombo);
@Override
public void insertUpdate( DocumentEvent e )
{
setModified( true );
}
mSiteNameCombo = new JComboBox<>(EMPTY_SITE_MODEL);
mSiteNameCombo.setEnabled(false);
mSiteNameCombo.setEditable(true);
mSiteNameCombo.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
setModified(true);
}
});
@Override
public void changedUpdate( DocumentEvent e )
{
setModified( true );
}
@Override
public void removeUpdate( DocumentEvent e )
{
setModified( true );
}
add(new JLabel("Site:"));
add(mSiteNameCombo);
}
@Override
public void save()
{
if(hasItem() && isModified())
{
getItem().setName(mChannelName.getText());
Object system = mSystemNameCombo.getSelectedItem();
getItem().setSystem((system == null ? null : (String)system));
Object site = mSiteNameCombo.getSelectedItem();
getItem().setSite((site == null ? null : (String)site));
Object aliasList = mAliasListCombo.getSelectedItem();
getItem().setAliasListName(aliasList == null ? null : (String)aliasList);
}
setModified(false);
}
private void setControlsEnabled(boolean enabled)
{
if(mChannelName.isEnabled() != enabled)
{
mChannelName.setEnabled(enabled);
}
if(mAliasListCombo.isEnabled() != enabled)
{
mAliasListCombo.setEnabled(enabled);
}
if(mSystemNameCombo.isEnabled() != enabled)
{
mSystemNameCombo.setEnabled(enabled);
}
if(mSiteNameCombo.isEnabled() != enabled)
{
mSiteNameCombo.setEnabled(enabled);
}
}
@Override
public void setItem(Channel channel)
{
super.setItem(channel);
if(hasItem())
{
setControlsEnabled(true);
mChannelName.setText(channel.getName());
List<String> systems = mChannelModel.getSystems();
if(systems.isEmpty())
{
mSystemNameCombo.setModel(EMPTY_SYSTEM_MODEL);
}
else
{
mSystemNameCombo.setModel(new DefaultComboBoxModel<String>(
systems.toArray(new String[systems.size()])));
;
}
mSystemNameCombo.setSelectedItem(channel.getSystem());
List<String> sites = mChannelModel.getSites(channel.getSystem());
if(sites.isEmpty())
{
mSiteNameCombo.setModel(EMPTY_SITE_MODEL);
}
else
{
mSiteNameCombo.setModel(new DefaultComboBoxModel<String>(
sites.toArray(new String[sites.size()])));
;
}
if(channel.getSite() != null)
{
mSiteNameCombo.setSelectedItem(channel.getSite());
}
List<String> lists = mAliasModel.getListNames();
Collections.sort(lists);
mAliasListCombo.setModel(new DefaultComboBoxModel<String>(
lists.toArray(new String[lists.size()])));
if(channel.getAliasListName() != null)
{
mAliasListCombo.setSelectedItem(channel.getAliasListName());
}
}
else
{
setControlsEnabled(false);
mChannelName.setText(null);
}
setModified(false);
}
@Override
public void insertUpdate(DocumentEvent e)
{
setModified(true);
}
@Override
public void changedUpdate(DocumentEvent e)
{
setModified(true);
}
@Override
public void removeUpdate(DocumentEvent e)
{
setModified(true);
}
}

View File

@@ -19,6 +19,7 @@ package dsp.filter;
import java.util.ArrayList;
import org.apache.commons.lang3.Validate;
import sample.real.RealSampleListener;
public class FloatFIRFilter implements RealSampleListener
@@ -139,7 +140,7 @@ public class FloatFIRFilter implements RealSampleListener
private void generateIndexMap( int size )
{
//Ensure we have an odd size
assert( size % 2 == 1 );
Validate.isTrue(size % 2 == 1);
mIndexMap = new int[ size ][ size ];

View File

@@ -19,6 +19,7 @@ package dsp.filter;
import java.util.ArrayList;
import org.apache.commons.lang3.Validate;
import sample.real.RealSampleListener;
public class FloatHalfBandFilter implements RealSampleListener
@@ -149,7 +150,7 @@ public class FloatHalfBandFilter implements RealSampleListener
private void generateIndexMap( int size )
{
//Ensure we have an odd size
assert( size % 2 == 1 );
Validate.isTrue(size % 2 == 1);
int mapWidth = ( ( size + 1 ) / 2 ) + 1;

View File

@@ -19,6 +19,7 @@ package dsp.filter;
import java.util.ArrayList;
import org.apache.commons.lang3.Validate;
import sample.real.RealSampleListener;
public class FloatHalfBandNoDecimateFilter implements RealSampleListener
@@ -139,7 +140,7 @@ public class FloatHalfBandNoDecimateFilter implements RealSampleListener
private void generateIndexMap( int size )
{
//Ensure we have an odd size
assert( size % 2 == 1 );
Validate.isTrue(size % 2 == 1);
int mapWidth = ( ( size + 1 ) / 2 ) + 1;

View File

@@ -20,6 +20,7 @@ package dsp.filter.cic;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.Validate;
import sample.Listener;
import sample.complex.ComplexBuffer;
import sample.complex.ComplexSampleListener;
@@ -67,7 +68,7 @@ public class ComplexPrimeCICDecimate implements Listener<ComplexBuffer>
public ComplexPrimeCICDecimate( int decimation, int order,
int passFrequency, int attenuation, WindowType windowType )
{
assert( decimation <= 700 );
Validate.isTrue(decimation <= 700);
List<Integer> stageSizes = getPrimeFactors( decimation );

View File

@@ -20,6 +20,7 @@ package dsp.filter.cic;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -81,7 +82,7 @@ public class RealPrimeCICDecimate
public RealPrimeCICDecimate( int decimation, int order, int passFrequency,
int attenuation, WindowType windowType, int outputBufferSize )
{
assert( decimation <= 700 );
Validate.isTrue(decimation <= 700);
mOutputBufferSize = outputBufferSize;

View File

@@ -1,65 +1,64 @@
package dsp.filter.design;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import dsp.filter.fir.FIRFilterSpecification;
import dsp.filter.fir.remez.RemezFIRFilterDesigner;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class FilterViewer extends Application
{
private final static Logger mLog = LoggerFactory.getLogger( FilterViewer.class );
private final static Logger mLog = LoggerFactory.getLogger(FilterViewer.class);
/**
* Developer tool to visualize filter designs
*/
public FilterViewer()
{
}
@Override
public void start( Stage primaryStage ) throws Exception
{
Scene scene = new Scene( new FilterView( getFilter() ) );
primaryStage.setTitle( "Filter Viewer" );
primaryStage.setScene( scene );
primaryStage.show();
}
public static void main( String[] args )
{
launch( args );
}
/**
* Developer tool to visualize filter designs
*/
public FilterViewer()
{
}
/**
* Provides the filter to visualize. Modify this method to visualize your filter design.
*/
private float[] getFilter()
{
// FIRFilterSpecification specification = FIRFilterSpecification.lowPassBuilder()
// .sampleRate( 48000 )
// .gridDensity( 16 )
// .passBandCutoff( 3200 )
// .passBandAmplitude( 1.0 )
// .passBandRipple( 0.02 )
// .stopBandStart( 4000 )
// .stopBandAmplitude( 0.0 )
// .stopBandRipple( 0.03 )
// .build();
FIRFilterSpecification specification = FIRFilterSpecification.highPassBuilder()
.sampleRate( 24000 )
.stopBandCutoff( 800 )
.stopBandAmplitude( 0.0 )
.stopBandRipple( 0.03 )
.passBandStart( 1000 )
.passBandAmplitude( 1.0 )
.passBandRipple( 0.08 )
.build();
@Override
public void start(Stage primaryStage) throws Exception
{
Scene scene = new Scene(new FilterView(getFilter()));
primaryStage.setTitle("Filter Viewer");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args)
{
launch(args);
}
/**
* Provides the filter to visualize. Modify this method to visualize your filter design.
*/
private float[] getFilter()
{
FIRFilterSpecification specification = FIRFilterSpecification.lowPassBuilder()
.sampleRate(48000)
.gridDensity(16)
.passBandCutoff(2500)
.passBandAmplitude(1.0)
.passBandRipple(0.01)
.stopBandStart(4000)
.stopBandAmplitude(0.0)
.stopBandRipple(0.008)
.build();
// FIRFilterSpecification specification = FIRFilterSpecification.highPassBuilder()
// .sampleRate(24000)
// .stopBandCutoff(800)
// .stopBandAmplitude(0.0)
// .stopBandRipple(0.03)
// .passBandStart(1000)
// .passBandAmplitude(1.0)
// .passBandRipple(0.08)
// .build();
// FIRFilterSpecification specification = FIRFilterSpecification.bandPassBuilder()
// .sampleRate( 48000 )
@@ -71,24 +70,25 @@ public class FilterViewer extends Application
// .passRipple( 0.008)
// .build();
float[] taps = null;
float[] taps = null;
// taps = FilterFactory.getLowPass( 16000, 2400, 73, WindowType.HANNING );
// taps = FilterFactory.getLowPass(48000, 6750, 7500, 60,
// Window.WindowType.HAMMING, true);
try
{
RemezFIRFilterDesigner designer = new RemezFIRFilterDesigner( specification );
if( designer.isValid() )
{
taps = designer.getImpulseResponse();
}
}
catch( FilterDesignException fde )
{
mLog.error( "Filter design error", fde );
}
return taps;
}
try
{
RemezFIRFilterDesigner designer = new RemezFIRFilterDesigner(specification);
if(designer.isValid())
{
taps = designer.getImpulseResponse();
}
}
catch(FilterDesignException fde)
{
mLog.error("Filter design error", fde);
}
return taps;
}
}

View File

@@ -17,6 +17,8 @@
******************************************************************************/
package dsp.filter.halfband.real;
import org.apache.commons.lang3.Validate;
public class HalfBandFilter
{
private float[] mBuffer;
@@ -122,7 +124,7 @@ public class HalfBandFilter
private void generateIndexMap( int size )
{
//Ensure we have an odd size
assert( size % 2 == 1 );
Validate.isTrue(size % 2 == 1);
int mapWidth = ( ( size + 1 ) / 2 ) + 1;

View File

@@ -1,5 +1,6 @@
package dsp.filter.interpolator;
import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -31,7 +32,7 @@ public class RealInterpolator extends Interpolator
public float filter( float[] samples, int offset, float mu )
{
/* Ensure we have enough samples in the array */
assert( samples.length >= offset + 7 );
Validate.isTrue(samples.length >= offset + 7);
/* Identify the filter bank that corresponds to mu */
int index = (int)( NSTEPS * mu );

View File

@@ -18,6 +18,7 @@
******************************************************************************/
package dsp.filter.polyphase;
import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -53,7 +54,7 @@ public class PolyphaseFIRInterpolatingFilter
public PolyphaseFIRInterpolatingFilter( double[] coefficients, int interpolation )
{
/* Ensure coefficients are an integral multiple of the interpolation factor */
assert( coefficients.length % interpolation == 0 );
Validate.isTrue(coefficients.length % interpolation == 0);
mTaps = coefficients;

View File

@@ -17,6 +17,7 @@
******************************************************************************/
package dsp.gain;
import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -49,7 +50,7 @@ public class DirectGainControl implements GainController, RealSampleListener
*/
public DirectGainControl( float gain, float minimum, float maximum, float increment )
{
assert( minimum > 0 );
Validate.isTrue(minimum > 0);
mDefaultGain = gain;
mGain = gain;

View File

@@ -103,35 +103,35 @@ public class DecoderFactory
//Low-pass filter with ~60 dB attenuation and 89 taps
private static final FIRFilterSpecification MPT1327_FILTER_SPECIFICATION = FIRFilterSpecification.lowPassBuilder()
.sampleRate( 48000 )
.gridDensity( 16 )
.passBandCutoff( 3200 )
.passBandAmplitude( 1.0 )
.passBandRipple( 0.02 )
.stopBandStart( 4000 )
.stopBandAmplitude( 0.0 )
.stopBandRipple( 0.03 )
.build();
.sampleRate( 48000 ).gridDensity( 16 ).passBandCutoff( 3200 ).passBandAmplitude( 1.0 ).passBandRipple( 0.02 )
.stopBandStart( 4000 ).stopBandAmplitude( 0.0 ).stopBandRipple( 0.03 ).build();
private static final FIRFilterSpecification P25_C4FM_IQ_SPECIFICATION = FIRFilterSpecification.lowPassBuilder()
.sampleRate(48000).gridDensity(16).passBandCutoff(6750).passBandAmplitude(1.0).passBandRipple(0.01)
.stopBandStart(7000).stopBandAmplitude(0.0).stopBandRipple(0.008).build();
private static final FIRFilterSpecification P25_C4FM_DEMOD_SPECIFICATION = FIRFilterSpecification.lowPassBuilder()
.sampleRate(48000).gridDensity(16).passBandCutoff(2500).passBandAmplitude(1.0).passBandRipple(0.01)
.stopBandStart(4000).stopBandAmplitude(0.0).stopBandRipple(0.008).build();
private static float[] MPT1327_LOWPASS_FILTER;
private static float[] P25_C4FM_IQ_FILTER;
private static float[] P25_C4FM_DEMOD_FILTER;
static
{
try
{
MPT1327_LOWPASS_FILTER = FilterFactory.getTaps(MPT1327_FILTER_SPECIFICATION);
P25_C4FM_IQ_FILTER = FilterFactory.getTaps(P25_C4FM_IQ_SPECIFICATION);
P25_C4FM_DEMOD_FILTER = FilterFactory.getTaps(P25_C4FM_DEMOD_SPECIFICATION);
}
catch(Exception e)
{
mLog.error("Couldn't design MPT1327 bandpass filter");
mLog.error("Couldn't design startup filter(s)");
}
}
public static final boolean NO_REMOVE_DC = false;
public static final boolean REMOVE_DC = true;
public static final int NO_FREQUENCY_CORRECTION = 0;
/**
* Returns a list of one primary decoder and any auxiliary decoders, as
* specified in the configurations.
@@ -228,7 +228,7 @@ public class DecoderFactory
}
modules.add(new FMDemodulatorModule(iqPass, iqStop));
modules.add(new DemodulatedAudioFilterModule(MPT1327_LOWPASS_FILTER, 1.0f));
modules.add(new DemodulatedAudioFilterModule(P25_C4FM_DEMOD_FILTER, 1.0f));
modules.add(new AudioModule(metadata));
break;
case PASSPORT:
@@ -247,7 +247,8 @@ public class DecoderFactory
switch(modulation)
{
case C4FM:
modules.add(new FMDemodulatorModule(6750, 7500));
modules.add(new FMDemodulatorModule(P25_C4FM_IQ_FILTER));
modules.add(new DemodulatedAudioFilterModule(P25_C4FM_DEMOD_FILTER, 1.0f));
modules.add(new P25_C4FMDecoder(aliasList, decodeConfig.getAFCMaximumCorrection()));
modules.add(new P25DecoderState(aliasList, channelType, Modulation.C4FM,
p25Config.getIgnoreDataCalls()));

View File

@@ -389,9 +389,9 @@ public class MPT1327DecoderState extends DecoderState
{
StringBuilder sb = new StringBuilder();
sb.append("Activity Summary\n");
sb.append("Decoder:\tMPT-1327\n");
sb.append("Site:\t");
sb.append("Activity Summary - Decoder: MPT-1327\n");
sb.append(DIVIDER1);
sb.append("Site: ");
if(mSite != null)
{
@@ -403,9 +403,7 @@ public class MPT1327DecoderState extends DecoderState
if(siteAlias != null)
{
sb.append(" ");
sb.append(siteAlias.getName());
sb.append("\n");
sb.append(" ").append(siteAlias.getName()).append("\n");
}
}
}
@@ -414,13 +412,11 @@ public class MPT1327DecoderState extends DecoderState
sb.append("Unknown\n");
}
sb.append("\n\n");
sb.append("Talkgroups\n\n");
sb.append(DIVIDER2).append("Talkgroups: ");
if(mGroups.isEmpty())
{
sb.append(" None\n");
sb.append("None\n");
}
else
{
@@ -429,8 +425,7 @@ public class MPT1327DecoderState extends DecoderState
for(String talkgroup : talkgroups)
{
sb.append(" ");
sb.append(talkgroup);
sb.append("\n ").append(talkgroup);
if(hasAliasList())
{
@@ -450,7 +445,7 @@ public class MPT1327DecoderState extends DecoderState
for(String member : members)
{
sb.append(" >");
sb.append(" >");
sb.append(member);
if(hasAliasList())
@@ -466,27 +461,26 @@ public class MPT1327DecoderState extends DecoderState
sb.append("\n");
}
sb.append("\n");
}
}
sb.append("\n");
sb.append(DIVIDER2).append("All Idents: ");
sb.append("Individual Idents\n");
if(mIdents.isEmpty())
{
sb.append(" None\n");
sb.append("None\n");
}
else
{
sb.append("\n");
Iterator<String> it = mIdents.iterator();
while(it.hasNext())
{
String ident = it.next();
sb.append(" ");
sb.append("");
sb.append(ident);
sb.append(" ");

View File

@@ -148,6 +148,7 @@ public class P25DecoderState extends DecoderState
private static final DecimalFormat mFrequencyFormatter =
new DecimalFormat("0.000000");
private module.decode.p25.message.tsbk.osp.control.NetworkStatusBroadcast mNetworkStatus;
private NetworkStatusBroadcastExtended mNetworkStatusExtended;
private ProtectionParameterBroadcast mProtectionParameterBroadcast;
@@ -2741,7 +2742,7 @@ public class P25DecoderState extends DecoderState
P25CallEvent event = new P25CallEvent.Builder(CallEventType.PATCH_GROUP_CALL)
.aliasList(getAliasList())
.channel(channel)
.channel(channel + (pgvcg.isTDMAChannel() ? " TDMA" : ""))
.details(details.toString())
.frequency(pgvcg.getDownlinkFrequency())
.from(from)
@@ -2752,8 +2753,10 @@ public class P25DecoderState extends DecoderState
broadcast(event);
}
broadcast(new TrafficChannelAllocationEvent(this,
mChannelCallMap.get(channel)));
if(!pgvcg.isTDMAChannel())
{
broadcast(new TrafficChannelAllocationEvent(this, mChannelCallMap.get(channel)));
}
break;
case PATCH_GROUP_CHANNEL_GRANT_UPDATE:
//Cleanup patch groups - auto-expire any patch groups before we allocate a channel
@@ -2772,10 +2775,8 @@ public class P25DecoderState extends DecoderState
{
P25CallEvent event = new P25CallEvent.Builder(CallEventType.PATCH_GROUP_CALL)
.aliasList(getAliasList())
.channel(channel)
.details((gvcgu.isEncrypted() ? "ENCRYPTED " : "") +
"PATCH UPDATE - GROUP 2:" + gvcgu.getPatchGroupAddress2() +
" DN:" + gvcgu.getDownlinkFrequency2())
.channel(channel + (gvcgu.isTDMAChannel1() ? " TDMA" : ""))
.details((gvcgu.isEncrypted() ? "ENCRYPTED " : ""))
.frequency(gvcgu.getDownlinkFrequency1())
.to(to)
.build();
@@ -2784,8 +2785,37 @@ public class P25DecoderState extends DecoderState
broadcast(event);
}
broadcast(new TrafficChannelAllocationEvent(this,
mChannelCallMap.get(channel)));
if(!gvcgu.isTDMAChannel1())
{
broadcast(new TrafficChannelAllocationEvent(this, mChannelCallMap.get(channel)));
}
String channel2 = gvcgu.getChannel2();
String to2 = gvcgu.getPatchGroupAddress2();
if(hasCallEvent(channel2, null, to2))
{
updateCallEvent(channel2, null, to2);
}
else
{
P25CallEvent event = new P25CallEvent.Builder(CallEventType.PATCH_GROUP_CALL)
.aliasList(getAliasList())
.channel(channel2 + (gvcgu.isTDMAChannel2() ? " TDMA" : ""))
.details((gvcgu.isEncrypted() ? "ENCRYPTED " : ""))
.frequency(gvcgu.getDownlinkFrequency2())
.to(to2)
.build();
registerCallEvent(event);
broadcast(event);
}
if(!gvcgu.isTDMAChannel2())
{
broadcast(new TrafficChannelAllocationEvent(this, mChannelCallMap.get(channel2)));
}
break;
case PATCH_GROUP_ADD:
PatchGroupAdd pga = (PatchGroupAdd)tsbk;
@@ -2843,7 +2873,7 @@ public class P25DecoderState extends DecoderState
P25CallEvent event = new P25CallEvent.Builder(CallEventType.DATA_CALL)
.aliasList(getAliasList())
.channel(channel)
.channel(channel + (gdcg.isTDMAChannel() ? " TDMA" : ""))
.details(details.toString())
.frequency(gdcg.getDownlinkFrequency())
.from(from)
@@ -2854,7 +2884,7 @@ public class P25DecoderState extends DecoderState
broadcast(event);
}
if(!mIgnoreDataCalls)
if(!mIgnoreDataCalls && !gdcg.isTDMAChannel())
{
broadcast(new TrafficChannelAllocationEvent(this,
mChannelCallMap.get(channel)));
@@ -2881,7 +2911,7 @@ public class P25DecoderState extends DecoderState
P25CallEvent event = new P25CallEvent.Builder(CallEventType.GROUP_CALL)
.aliasList(getAliasList())
.channel(channel)
.channel(channel + (gvcg.isTDMAChannel() ? " TDMA" : ""))
.details(details.toString())
.frequency(gvcg.getDownlinkFrequency())
.from(from)
@@ -2892,8 +2922,10 @@ public class P25DecoderState extends DecoderState
broadcast(event);
}
broadcast(new TrafficChannelAllocationEvent(this,
mChannelCallMap.get(channel)));
if(!gvcg.isTDMAChannel())
{
broadcast(new TrafficChannelAllocationEvent(this, mChannelCallMap.get(channel)));
}
break;
case GROUP_VOICE_CHANNEL_GRANT_UPDATE:
GroupVoiceChannelGrantUpdate gvcgu =
@@ -2917,8 +2949,7 @@ public class P25DecoderState extends DecoderState
P25CallEvent event = new P25CallEvent.Builder(CallEventType.GROUP_CALL)
.aliasList(getAliasList())
.channel(channel)
.channel(gvcgu.getChannel1())
.channel(gvcgu.getChannel1() + (gvcgu.isTDMAChannel1() ? " TDMA" : ""))
.details(details.toString())
.frequency(gvcgu.getDownlinkFrequency1())
.from(from)
@@ -2929,8 +2960,10 @@ public class P25DecoderState extends DecoderState
broadcast(event);
}
broadcast(new TrafficChannelAllocationEvent(this,
mChannelCallMap.get(channel)));
if(!gvcgu.isTDMAChannel1())
{
broadcast(new TrafficChannelAllocationEvent(this, mChannelCallMap.get(channel)));
}
if(gvcgu.hasChannelNumber2())
{
@@ -2951,7 +2984,7 @@ public class P25DecoderState extends DecoderState
P25CallEvent event2 = new P25CallEvent.Builder(CallEventType.GROUP_CALL)
.aliasList(getAliasList())
.channel(gvcgu.getChannel2())
.channel(gvcgu.getChannel2() + (gvcgu.isTDMAChannel2() ? " TDMA" : ""))
.details(details.toString())
.frequency(gvcgu.getDownlinkFrequency2())
.to(gvcgu.getGroupAddress2())
@@ -2961,8 +2994,10 @@ public class P25DecoderState extends DecoderState
broadcast(event2);
}
broadcast(new TrafficChannelAllocationEvent(this,
mChannelCallMap.get(channel)));
if(!gvcgu.isTDMAChannel2())
{
broadcast(new TrafficChannelAllocationEvent(this, mChannelCallMap.get(channel)));
}
}
break;
case GROUP_VOICE_CHANNEL_GRANT_UPDATE_EXPLICIT:
@@ -2988,7 +3023,7 @@ public class P25DecoderState extends DecoderState
P25CallEvent event = new P25CallEvent.Builder(CallEventType.GROUP_CALL)
.aliasList(getAliasList())
.channel(channel)
.channel(channel + (gvcgue.isTDMAChannel() ? " TDMA" : ""))
.details(details.toString())
.frequency(gvcgue.getDownlinkFrequency())
.from(from)
@@ -2999,8 +3034,10 @@ public class P25DecoderState extends DecoderState
broadcast(event);
}
broadcast(new TrafficChannelAllocationEvent(this,
mChannelCallMap.get(channel)));
if(!gvcgue.isTDMAChannel())
{
broadcast(new TrafficChannelAllocationEvent(this, mChannelCallMap.get(channel)));
}
break;
case INDIVIDUAL_DATA_CHANNEL_GRANT:
IndividualDataChannelGrant idcg = (IndividualDataChannelGrant)message;
@@ -3023,7 +3060,7 @@ public class P25DecoderState extends DecoderState
P25CallEvent event = new P25CallEvent.Builder(CallEventType.DATA_CALL)
.aliasList(getAliasList())
.channel(channel)
.channel(channel + (idcg.isTDMAChannel() ? " TDMA" : ""))
.details(details.toString())
.frequency(idcg.getDownlinkFrequency())
.from(from)
@@ -3034,10 +3071,9 @@ public class P25DecoderState extends DecoderState
broadcast(event);
}
if(!mIgnoreDataCalls)
if(!mIgnoreDataCalls && !idcg.isTDMAChannel())
{
broadcast(new TrafficChannelAllocationEvent(this,
mChannelCallMap.get(channel)));
broadcast(new TrafficChannelAllocationEvent(this, mChannelCallMap.get(channel)));
}
break;
case SNDCP_DATA_CHANNEL_GRANT:
@@ -3060,7 +3096,7 @@ public class P25DecoderState extends DecoderState
P25CallEvent event = new P25CallEvent.Builder(CallEventType.DATA_CALL)
.aliasList(getAliasList())
.channel(channel)
.channel(channel + (sdcg.isTDMAChannel() ? " TDMA" : ""))
.details(details.toString())
.frequency(sdcg.getDownlinkFrequency())
.from(from)
@@ -3071,15 +3107,13 @@ public class P25DecoderState extends DecoderState
broadcast(event);
}
if(!mIgnoreDataCalls)
if(!mIgnoreDataCalls && !sdcg.isTDMAChannel())
{
broadcast(new TrafficChannelAllocationEvent(this,
mChannelCallMap.get(channel)));
broadcast(new TrafficChannelAllocationEvent(this, mChannelCallMap.get(channel)));
}
break;
case TELEPHONE_INTERCONNECT_VOICE_CHANNEL_GRANT:
TelephoneInterconnectVoiceChannelGrant tivcg =
(TelephoneInterconnectVoiceChannelGrant)message;
TelephoneInterconnectVoiceChannelGrant tivcg = (TelephoneInterconnectVoiceChannelGrant)message;
channel = tivcg.getChannel();
from = null;
@@ -3103,7 +3137,7 @@ public class P25DecoderState extends DecoderState
P25CallEvent event = new P25CallEvent.Builder(
CallEventType.TELEPHONE_INTERCONNECT)
.aliasList(getAliasList())
.channel(channel)
.channel(channel + (tivcg.isTDMAChannel() ? " TDMA" : ""))
.details(details.toString())
.frequency(tivcg.getDownlinkFrequency())
.from(from)
@@ -3114,15 +3148,15 @@ public class P25DecoderState extends DecoderState
broadcast(event);
}
broadcast(new TrafficChannelAllocationEvent(this,
mChannelCallMap.get(channel)));
if(!tivcg.isTDMAChannel())
{
broadcast(new TrafficChannelAllocationEvent(this, mChannelCallMap.get(channel)));
}
break;
case TELEPHONE_INTERCONNECT_VOICE_CHANNEL_GRANT_UPDATE:
TelephoneInterconnectVoiceChannelGrantUpdate tivcgu =
(TelephoneInterconnectVoiceChannelGrantUpdate)message;
TelephoneInterconnectVoiceChannelGrantUpdate tivcgu = (TelephoneInterconnectVoiceChannelGrantUpdate)message;
channel = tivcgu.getChannelIdentifier() + "-" +
tivcgu.getChannelNumber();
channel = tivcgu.getChannelIdentifier() + "-" + tivcgu.getChannelNumber();
from = null;
/* Address is ambiguous and could mean either source or target,
@@ -3145,7 +3179,7 @@ public class P25DecoderState extends DecoderState
P25CallEvent event = new P25CallEvent.Builder(
CallEventType.TELEPHONE_INTERCONNECT)
.aliasList(getAliasList())
.channel(channel)
.channel(channel + (tivcgu.isTDMAChannel() ? " TDMA" : ""))
.details(details.toString())
.frequency(tivcgu.getDownlinkFrequency())
.from(from)
@@ -3156,15 +3190,15 @@ public class P25DecoderState extends DecoderState
broadcast(event);
}
broadcast(new TrafficChannelAllocationEvent(this,
mChannelCallMap.get(channel)));
if(!tivcgu.isTDMAChannel())
{
broadcast(new TrafficChannelAllocationEvent(this, mChannelCallMap.get(channel)));
}
break;
case UNIT_TO_UNIT_VOICE_CHANNEL_GRANT:
UnitToUnitVoiceChannelGrant uuvcg =
(UnitToUnitVoiceChannelGrant)message;
UnitToUnitVoiceChannelGrant uuvcg = (UnitToUnitVoiceChannelGrant)message;
channel = uuvcg.getChannelIdentifier() + "-" +
uuvcg.getChannelNumber();
channel = uuvcg.getChannelIdentifier() + "-" + uuvcg.getChannelNumber();
from = uuvcg.getSourceAddress();
to = uuvcg.getTargetAddress();
@@ -3183,7 +3217,7 @@ public class P25DecoderState extends DecoderState
P25CallEvent event = new P25CallEvent.Builder(
CallEventType.UNIT_TO_UNIT_CALL)
.aliasList(getAliasList())
.channel(channel)
.channel(channel + (uuvcg.isTDMAChannel() ? " TDMA" : ""))
.details(details.toString())
.frequency(uuvcg.getDownlinkFrequency())
.from(from)
@@ -3194,15 +3228,15 @@ public class P25DecoderState extends DecoderState
broadcast(event);
}
broadcast(new TrafficChannelAllocationEvent(this,
mChannelCallMap.get(channel)));
if(!uuvcg.isTDMAChannel())
{
broadcast(new TrafficChannelAllocationEvent(this, mChannelCallMap.get(channel)));
}
break;
case UNIT_TO_UNIT_VOICE_CHANNEL_GRANT_UPDATE:
UnitToUnitVoiceChannelGrantUpdate uuvcgu =
(UnitToUnitVoiceChannelGrantUpdate)message;
UnitToUnitVoiceChannelGrantUpdate uuvcgu = (UnitToUnitVoiceChannelGrantUpdate)message;
channel = uuvcgu.getChannelIdentifier() + "-" +
uuvcgu.getChannelNumber();
channel = uuvcgu.getChannelIdentifier() + "-" + uuvcgu.getChannelNumber();
from = uuvcgu.getSourceAddress();
to = uuvcgu.getTargetAddress();
@@ -3221,7 +3255,7 @@ public class P25DecoderState extends DecoderState
P25CallEvent event = new P25CallEvent.Builder(
CallEventType.UNIT_TO_UNIT_CALL)
.aliasList(getAliasList())
.channel(channel)
.channel(channel + (uuvcgu.isTDMAChannel() ? " TDMA" : ""))
.details(details.toString())
.frequency(uuvcgu.getDownlinkFrequency())
.from(from)
@@ -3232,8 +3266,10 @@ public class P25DecoderState extends DecoderState
broadcast(event);
}
broadcast(new TrafficChannelAllocationEvent(this,
mChannelCallMap.get(channel)));
if(!uuvcgu.isTDMAChannel())
{
broadcast(new TrafficChannelAllocationEvent(this, mChannelCallMap.get(channel)));
}
break;
default:
break;
@@ -3343,29 +3379,25 @@ public class P25DecoderState extends DecoderState
{
StringBuilder sb = new StringBuilder();
sb.append("Activity Summary\n");
sb.append("Decoder:\tP25\n");
sb.append("===================== THIS SITE ======================");
sb.append("Activity Summary - Decoder:P25 ").append(getModulation().getLabel()).append("\n");
sb.append(DIVIDER1);
sb.append("SITE ");
if(mNetworkStatus != null)
{
sb.append("\nNAC:\t" + mNetworkStatus.getNAC());
sb.append("\nWACN-SYS:\t" + mNetworkStatus.getWACN());
sb.append("-" + mNetworkStatus.getSystemID());
sb.append(" [");
sb.append(mNetworkStatus.getNetworkCallsign());
sb.append("]");
sb.append("\nLRA:\t" + mNetworkStatus.getLocationRegistrationArea());
sb.append("NAC:" + mNetworkStatus.getNAC());
sb.append("h WACN:" + mNetworkStatus.getWACN());
sb.append("h SYS:" + mNetworkStatus.getSystemID());
sb.append("h [").append(mNetworkStatus.getNetworkCallsign()).append("]");
sb.append(" LRA:" + mNetworkStatus.getLocationRegistrationArea());
}
else if(mNetworkStatusExtended != null)
{
sb.append("\nNAC:\t" + mNetworkStatusExtended.getNAC());
sb.append("\nWACN-SYS:\t" + mNetworkStatusExtended.getWACN());
sb.append("-" + mNetworkStatusExtended.getSystemID());
sb.append(" [");
sb.append(mNetworkStatusExtended.getNetworkCallsign());
sb.append("]");
sb.append("\nLRA:\t" + mNetworkStatusExtended.getLocationRegistrationArea());
sb.append("NAC:" + mNetworkStatusExtended.getNAC());
sb.append("h WACN:" + mNetworkStatusExtended.getWACN());
sb.append("h SYS:" + mNetworkStatusExtended.getSystemID());
sb.append("h [").append(mNetworkStatusExtended.getNetworkCallsign()).append("]");
sb.append(" LRA:" + mNetworkStatusExtended.getLocationRegistrationArea());
}
String site = null;
@@ -3376,11 +3408,10 @@ public class P25DecoderState extends DecoderState
}
else if(mRFSSStatusMessageExtended != null)
{
site = mRFSSStatusMessageExtended.getRFSubsystemID() + "-" +
mRFSSStatusMessageExtended.getSiteID();
site = mRFSSStatusMessageExtended.getRFSubsystemID() + "-" + mRFSSStatusMessageExtended.getSiteID();
}
sb.append("\nRFSS-SITE:\t" + site);
sb.append("h RFSS-SITE:").append(site).append("h");
if(hasAliasList())
{
@@ -3392,121 +3423,120 @@ public class P25DecoderState extends DecoderState
}
}
sb.append("\n").append(DIVIDER2);
if(mNetworkStatus != null)
{
sb.append("\nSERVICES:\t" + SystemService.toString(
mNetworkStatus.getSystemServiceClass()));
sb.append("\nPCCH:\tDNLINK " + mFrequencyFormatter.format(
(double)mNetworkStatus.getDownlinkFrequency() / 1E6d) +
" [" + mNetworkStatus.getIdentifier() + "-" +
mNetworkStatus.getChannel() + "]\n");
sb.append("\tUPLINK " + mFrequencyFormatter.format(
(double)mNetworkStatus.getUplinkFrequency() / 1E6d) + " [" +
mNetworkStatus.getIdentifier() + "-" +
mNetworkStatus.getChannel() + "]\n");
sb.append("SERVICES: " + SystemService.toString(mNetworkStatus.getSystemServiceClass())).append("\n");
sb.append(DIVIDER2);
sb.append("PCCH DOWNLINK ")
.append(mFrequencyFormatter.format((double)mNetworkStatus.getDownlinkFrequency() / 1E6d))
.append(" [").append(mNetworkStatus.getIdentifier()).append("-").append(mNetworkStatus.getChannel())
.append("] UPLINK ")
.append(mFrequencyFormatter.format((double)mNetworkStatus.getUplinkFrequency() / 1E6d))
.append(" [").append(mNetworkStatus.getIdentifier()).append("-").append(mNetworkStatus.getChannel())
.append("]\n");
}
else if(mNetworkStatusExtended != null)
{
sb.append("\nSERVICES:\t" + SystemService.toString(
mNetworkStatusExtended.getSystemServiceClass()));
sb.append("\nPCCH:\tDNLINK " + mFrequencyFormatter.format(
(double)mNetworkStatusExtended.getDownlinkFrequency() / 1E6d) +
" [" + mNetworkStatusExtended.getTransmitIdentifier() + "-" +
mNetworkStatusExtended.getTransmitChannel() + "]\n");
sb.append("\tUPLINK " + mFrequencyFormatter.format(
(double)mNetworkStatusExtended.getUplinkFrequency() / 1E6d) +
" [" + mNetworkStatusExtended.getReceiveIdentifier() + "-" +
mNetworkStatusExtended.getReceiveChannel() + "]");
sb.append("\nSERVICES:").append(SystemService.toString(mNetworkStatusExtended.getSystemServiceClass()))
.append("\n");
sb.append(DIVIDER2);
sb.append("PCCH DOWNLINK ")
.append(mFrequencyFormatter.format((double)mNetworkStatusExtended.getDownlinkFrequency() / 1E6d))
.append(" [").append(mNetworkStatusExtended.getTransmitIdentifier()).append("-")
.append(mNetworkStatusExtended.getTransmitChannel()).append("] UPLINK ")
.append(mFrequencyFormatter.format((double)mNetworkStatusExtended.getUplinkFrequency() / 1E6d))
.append(" [").append(mNetworkStatusExtended.getReceiveIdentifier()).append("-")
.append(mNetworkStatusExtended.getReceiveChannel()).append("]\n");
}
if(mSecondaryControlChannels.isEmpty())
{
sb.append("\nSCCH:\tNONE");
sb.append("SCCH: NONE\n");
}
else
{
for(module.decode.p25.message.tsbk.osp.control.SecondaryControlChannelBroadcast
sec : mSecondaryControlChannels)
for(module.decode.p25.message.tsbk.osp.control.SecondaryControlChannelBroadcast sec : mSecondaryControlChannels)
{
sb.append("\nSCCH:\tDNLINK " + mFrequencyFormatter.format(
(double)sec.getDownlinkFrequency1() / 1E6d) +
" [" + sec.getIdentifier1() + "-" + sec.getChannel1() + "]\n");
sb.append("\tUPLINK " + mFrequencyFormatter.format(
(double)sec.getUplinkFrequency1() / 1E6d) + " [" +
sec.getIdentifier1() + "-" + sec.getChannel1() + "]\n");
sb.append("SCCH DOWNLINK ")
.append(mFrequencyFormatter.format((double)sec.getDownlinkFrequency1() / 1E6d))
.append(" [").append(sec.getIdentifier1()).append("-").append(sec.getChannel1()).append("] UPLINK ")
.append(mFrequencyFormatter.format((double)sec.getUplinkFrequency1() / 1E6d))
.append(" [").append(sec.getIdentifier1()).append("-").append(sec.getChannel1()).append("]");
if(sec.hasChannel2())
{
sb.append("\nSCCH:\tDNLINK " + mFrequencyFormatter.format(
(double)sec.getDownlinkFrequency2() / 1E6d) +
" [" + sec.getIdentifier2() + "-" + sec.getChannel2() + "]\n");
sb.append("\tUPLINK " + mFrequencyFormatter.format(
(double)sec.getUplinkFrequency2() / 1E6d) + " [" +
sec.getIdentifier2() + "-" + sec.getChannel2() + "]");
sb.append(" SCCH 2 DOWNLINK ")
.append(mFrequencyFormatter.format((double)sec.getDownlinkFrequency2() / 1E6d))
.append(" [").append(sec.getIdentifier2()).append("-").append(sec.getChannel2())
.append("] UPLINK ").append(mFrequencyFormatter.format((double)sec.getUplinkFrequency2() / 1E6d))
.append(" [").append(sec.getIdentifier2()).append("-").append(sec.getChannel2()).append("]");
}
sb.append("\n");
}
}
if(mSNDCPDataChannel != null)
{
sb.append("\nSNDCP:");
sb.append("\tDNLINK " + mFrequencyFormatter.format(
(double)mSNDCPDataChannel.getDownlinkFrequency() / 1E6D) +
" [" + mSNDCPDataChannel.getTransmitChannel() + "]");
sb.append("\tUPLINK " + mFrequencyFormatter.format(
(double)mSNDCPDataChannel.getUplinkFrequency() / 1E6D) +
" [" + mSNDCPDataChannel.getReceiveChannel() + "]");
sb.append("SNDCP DOWNLINK ")
.append(mFrequencyFormatter.format((double)mSNDCPDataChannel.getDownlinkFrequency() / 1E6D))
.append(" [").append(mSNDCPDataChannel.getTransmitChannel()).append("]").append(" UPLINK ")
.append(mFrequencyFormatter.format((double)mSNDCPDataChannel.getUplinkFrequency() / 1E6D))
.append(" [").append(mSNDCPDataChannel.getReceiveChannel()).append("]\n");
}
if(mProtectionParameterBroadcast != null)
{
sb.append("\nENCRYPTION:");
sb.append("\nTYPE:\t" + mProtectionParameterBroadcast
.getEncryptionType().name());
sb.append("\nALGORITHM:\t" + mProtectionParameterBroadcast
.getAlgorithmID());
sb.append("\nKEY:\t" + mProtectionParameterBroadcast.getKeyID());
sb.append("\nINBOUND IV:\t" + mProtectionParameterBroadcast
.getInboundInitializationVector());
sb.append("\nOUTBOUND IV:\t" + mProtectionParameterBroadcast
.getOutboundInitializationVector());
sb.append(DIVIDER2);
sb.append("ENCRYPTION TYPE:").append(mProtectionParameterBroadcast.getEncryptionType().name());
sb.append(" ALGORITHM:").append(mProtectionParameterBroadcast.getAlgorithmID());
sb.append(" KEY:").append(mProtectionParameterBroadcast.getKeyID());
sb.append(" INBOUND IV:").append(mProtectionParameterBroadcast.getInboundInitializationVector());
sb.append(" OUTBOUND IV:").append(mProtectionParameterBroadcast.getOutboundInitializationVector());
sb.append("\n");
}
List<Integer> identifiers = new ArrayList<>(mBands.keySet());
Collections.sort(identifiers);
sb.append("\nFREQUENCY BANDS:");
sb.append(DIVIDER2).append("FREQUENCY BANDS:\n");
for(Integer id : identifiers)
{
IBandIdentifier band = mBands.get(id);
sb.append("\n\t" + id);
sb.append("- BASE: " + mFrequencyFormatter.format(
(double)band.getBaseFrequency() / 1E6d));
sb.append(" CHANNEL SIZE: " + mFrequencyFormatter.format(
(double)band.getChannelSpacing() / 1E6d));
sb.append(" UPLINK OFFSET: " + mFrequencyFormatter.format(
(double)band.getTransmitOffset() / 1E6D));
sb.append(band.toString()).append("\n");
// sb.append(" ").append(id);
// sb.append(" - BASE: " + mFrequencyFormatter.format(
// (double)band.getBaseFrequency() / 1E6d));
// sb.append(" CHANNEL SIZE: " + mFrequencyFormatter.format(
// (double)band.getChannelSpacing() / 1E6d));
// sb.append(" UPLINK OFFSET: " + mFrequencyFormatter.format(
// (double)band.getTransmitOffset() / 1E6D));
// sb.append("\n");
}
sb.append("\n\n=================== NEIGHBORS ======================");
sb.append(DIVIDER2).append("NEIGHBOR SITES: ");
if(mNeighborMap.isEmpty())
{
sb.append("\n\tNONE\n");
sb.append("\n----------------------------------------------------");
sb.append("NONE\n");
}
else
{
for(IAdjacentSite neighbor : mNeighborMap.values())
{
sb.append("\nNAC:\t" + ((P25Message)neighbor).getNAC());
sb.append("\nSYSTEM:\t" + neighbor.getSystemID());
sb.append("\nLRA:\t" + neighbor.getLRA());
sb.append("\n");
sb.append("NAC:").append(((P25Message)neighbor).getNAC());
sb.append("h SYSTEM:" + neighbor.getSystemID());
sb.append("h LRA:" + neighbor.getLRA());
String neighborID = neighbor.getRFSS() + "-" + neighbor.getSiteID();
sb.append("\nRFSS-SITE:\t" + neighborID);
sb.append("h RFSS-SITE:" + neighborID);
sb.append("h ");
if(hasAliasList())
{
@@ -3514,18 +3544,16 @@ public class P25DecoderState extends DecoderState
if(siteAlias != null)
{
sb.append(" " + siteAlias.getName());
sb.append(siteAlias.getName());
}
}
sb.append("\nPCCH:\tDNLINK " + mFrequencyFormatter.format(
(double)neighbor.getDownlinkFrequency() / 1E6d) +
" [" + neighbor.getDownlinkChannel() + "]");
sb.append("\n\tUPLINK:" + mFrequencyFormatter.format(
(double)neighbor.getUplinkFrequency() / 1E6d) +
" [" + neighbor.getDownlinkChannel() + "]\n");
sb.append("\nSERVICES:\t" + neighbor.getSystemServiceClass());
sb.append("\n----------------------------------------------------");
sb.append("\n PCCH: DOWNLINK ")
.append(mFrequencyFormatter.format((double)neighbor.getDownlinkFrequency() / 1E6d))
.append(" [").append(neighbor.getDownlinkChannel()).append("] UPLINK:")
.append(mFrequencyFormatter.format((double)neighbor.getUplinkFrequency() / 1E6d))
.append(" [").append(neighbor.getDownlinkChannel()).append("] SERVICES: ")
.append(neighbor.getSystemServiceClass());
}
}

View File

@@ -47,12 +47,10 @@ public class P25_C4FMDecoder extends P25Decoder
private final static Logger mLog = LoggerFactory.getLogger( P25_C4FMDecoder.class );
/* Instrumentation Taps */
private static final String INSTRUMENT_FILTER_OUTPUT = "Tap Point: Pre-Filter Output";
private static final String INSTRUMENT_C4FM_SYMBOL_FILTER_OUTPUT = "Tap Point: Symbol Filter Output";
private static final String INSTRUMENT_C4FM_SLICER_OUTPUT = "Tap Point: C4FM Slicer Output";
private List<TapGroup> mAvailableTaps;
private RealFIRFilter_RB_RB mC4FMPreFilter;
private C4FMSymbolFilter mSymbolFilter;
private C4FMSlicer mC4FMSlicer;
private P25MessageFramer mMessageFramer;
@@ -74,15 +72,9 @@ public class P25_C4FMDecoder extends P25Decoder
{
super( aliasList );
/* Filter demodulated sample buffers */
float[] filter = FilterFactory.getLowPass( 48000, 2500, 4000, 80, WindowType.HANNING, true );
mC4FMPreFilter = new RealFIRFilter_RB_RB( filter, 1.0f );
/* Shape gain and frequency offsets to optimize sample stream */
mSymbolFilter = new C4FMSymbolFilter( frequencyCorrectionMaximum );
mC4FMPreFilter.setListener( mSymbolFilter );
/* Convert samples to symbols */
mC4FMSlicer = new C4FMSlicer();
mSymbolFilter.setListener( mC4FMSlicer );
@@ -100,9 +92,6 @@ public class P25_C4FMDecoder extends P25Decoder
{
super.dispose();
mC4FMPreFilter.dispose();
mC4FMPreFilter = null;
mSymbolFilter.dispose();
mSymbolFilter = null;
@@ -121,7 +110,7 @@ public class P25_C4FMDecoder extends P25Decoder
@Override
public Listener<RealBuffer> getFilteredRealBufferListener()
{
return mC4FMPreFilter;
return mSymbolFilter;
}
/**
@@ -136,8 +125,6 @@ public class P25_C4FMDecoder extends P25Decoder
TapGroup group = new TapGroup( "P25 C4FM Decoder" );
group.add( new FloatBufferTap( INSTRUMENT_FILTER_OUTPUT, 0, 1.0f ) );
group.add( new FloatTap( INSTRUMENT_C4FM_SYMBOL_FILTER_OUTPUT, 0, 0.1f ) );
group.add( new DibitTap( INSTRUMENT_C4FM_SLICER_OUTPUT, 0, 0.1f ) );
@@ -165,11 +152,6 @@ public class P25_C4FMDecoder extends P25Decoder
switch( tap.getName() )
{
case INSTRUMENT_FILTER_OUTPUT:
FloatBufferTap filterOutput = (FloatBufferTap)tap;
mC4FMPreFilter.setListener( filterOutput );
filterOutput.setListener( mSymbolFilter );
break;
case INSTRUMENT_C4FM_SYMBOL_FILTER_OUTPUT:
FloatTap symbolTap = (FloatTap)tap;
mSymbolFilter.setListener( symbolTap );
@@ -201,9 +183,6 @@ public class P25_C4FMDecoder extends P25Decoder
switch( tap.getName() )
{
case INSTRUMENT_FILTER_OUTPUT:
mC4FMPreFilter.setListener( mSymbolFilter );
break;
case INSTRUMENT_C4FM_SYMBOL_FILTER_OUTPUT:
mSymbolFilter.setListener( mC4FMSlicer );
break;

View File

@@ -1,3 +1,21 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message;
public interface IBandIdentifier
@@ -29,4 +47,18 @@ public interface IBandIdentifier
*/
public abstract long getTransmitOffset();
/**
* Downlink (tower to mobile) Frequency for the specified channel
*/
public abstract long getDownlinkFrequency(int channelNumber);
/**
* Uplink (mobile to tower) Frequency for the specified channel
*/
public abstract long getUplinkFrequency(int channelNumber);
/**
* Indicates if this band is an FDMA (false) or TDMA (true) band
*/
public boolean isTDMA();
}

View File

@@ -1,214 +1,188 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message;
import java.text.SimpleDateFormat;
import map.Plottable;
import message.Message;
import module.decode.p25.reference.DataUnitID;
import alias.Alias;
import alias.AliasList;
import bits.BinaryMessage;
import edac.CRC;
import map.Plottable;
import message.Message;
import module.decode.p25.reference.DataUnitID;
import java.text.SimpleDateFormat;
public class P25Message extends Message
{
public enum DuplexMode { HALF, FULL };
public enum SessionMode { PACKET, CIRCUIT };
public static final int[] NAC = { 0,1,2,3,4,5,6,7,8,9,10,11 };
public static final int[] DUID = { 12,13,14,15 };
public static final int[] BCH = { 16,17,18,19,20,21,22,23,24,25,26,27,28,29,
30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,
54,55,56,57,58,59,60,61,62,63 };
protected SimpleDateFormat mTimeDurationFormat =
new SimpleDateFormat( "HH:mm:ss.SSS");
protected BinaryMessage mMessage;
protected DataUnitID mDUID;
protected AliasList mAliasList;
protected CRC[] mCRC;
public P25Message( BinaryMessage message,
DataUnitID duid,
AliasList aliasList )
{
super();
mMessage = message;
mDUID = duid;
mAliasList = aliasList;
}
public CRC[] getCRCResults()
{
return mCRC;
}
public BinaryMessage getSourceMessage()
{
return mMessage;
}
public AliasList getAliasList()
{
return mAliasList;
}
public String getNAC()
{
return mMessage.getHex( NAC, 3 );
}
public DataUnitID getDUID()
{
return mDUID;
}
@Override
public enum DuplexMode {HALF, FULL};
public enum SessionMode {PACKET, CIRCUIT};
public static final int[] NAC = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
public static final int[] DUID = {12, 13, 14, 15};
public static final int[] BCH = {16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63};
protected SimpleDateFormat mTimeDurationFormat = new SimpleDateFormat("HH:mm:ss.SSS");
protected BinaryMessage mMessage;
protected DataUnitID mDUID;
protected AliasList mAliasList;
protected CRC[] mCRC;
public P25Message(BinaryMessage message, DataUnitID duid, AliasList aliasList)
{
super();
mMessage = message;
mDUID = duid;
mAliasList = aliasList;
}
public CRC[] getCRCResults()
{
return mCRC;
}
public BinaryMessage getSourceMessage()
{
return mMessage;
}
public AliasList getAliasList()
{
return mAliasList;
}
public String getNAC()
{
return mMessage.getHex(NAC, 3);
}
public DataUnitID getDUID()
{
return mDUID;
}
@Override
public String getErrorStatus()
{
if( mCRC == null )
{
return "UNKNOWN";
}
return CRC.format( mCRC );
if(mCRC == null)
{
return "UNKNOWN";
}
return CRC.format(mCRC);
}
@Override
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( "NAC:" );
sb.append( getNAC() );
sb.append( " " );
sb.append( getDUID().getLabel() );
sb.append( " DATA UNIT ID:" + mMessage.getInt( DUID ) );
return sb.toString();
StringBuilder sb = new StringBuilder();
sb.append("NAC:");
sb.append(getNAC());
sb.append(" ");
sb.append(getDUID().getLabel());
sb.append(" DATA UNIT ID:" + mMessage.getInt(DUID));
return sb.toString();
}
@Override
@Override
public String getBinaryMessage()
{
return mMessage.toString();
return mMessage.toString();
}
@Override
@Override
public String getProtocol()
{
return "P25 Phase 1";
return "P25 Phase 1";
}
@Override
@Override
public String getEventType()
{
return mDUID.name();
return mDUID.name();
}
@Override
@Override
public String getFromID()
{
return null;
}
@Override
public Alias getFromIDAlias()
{
if( mAliasList != null )
{
return mAliasList.getTalkgroupAlias( getFromID() );
}
return null;
}
@Override
@Override
public Alias getFromIDAlias()
{
if(mAliasList != null)
{
return mAliasList.getTalkgroupAlias(getFromID());
}
return null;
}
@Override
public String getToID()
{
return null;
return null;
}
@Override
@Override
public Alias getToIDAlias()
{
if( mAliasList != null )
{
return mAliasList.getTalkgroupAlias( getToID() );
}
return null;
if(mAliasList != null)
{
return mAliasList.getTalkgroupAlias(getToID());
}
return null;
}
@Override
@Override
public Plottable getPlottable()
{
return null;
return null;
}
@Override
@Override
public String toString()
{
return getMessage();
return getMessage();
}
@Override
@Override
public boolean isValid()
{
if( mCRC != null )
{
for( CRC crc: mCRC )
{
if( crc == CRC.FAILED_CRC )
{
return false;
}
}
}
return true;
}
if(mCRC != null)
{
for(CRC crc : mCRC)
{
if(crc == CRC.FAILED_CRC)
{
return false;
}
}
}
/**
* Calculates the frequency of the uplink channel using the channel number
* and the IdentifierUpdate message.
*
* @param iden - Identifier Update message
* @param channel - channel number
* @return - frequency in Hertz
*/
protected static long calculateUplink( IBandIdentifier iden, int channel )
{
long downlink = calculateDownlink( iden, channel );
if( downlink > 0 && iden != null )
{
return downlink + iden.getTransmitOffset();
}
return 0;
}
/**
* Calculates the frequency of the downlink channel using the channel number
* and the IdentifierUpdate message.
*
* @param iden - Identifier Update message
* @param channel - channel number
* @return - frequency in Hertz
*/
protected static long calculateDownlink( IBandIdentifier iden, int channel )
{
if( iden != null )
{
return iden.getBaseFrequency() +
( channel * iden.getChannelSpacing() );
}
return 0;
}
return true;
}
}

View File

@@ -1,3 +1,21 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.ldu.lc;
import module.decode.p25.message.IAdjacentSite;
@@ -7,142 +25,148 @@ import module.decode.p25.message.ldu.LDU1Message;
import module.decode.p25.message.tsbk.osp.control.SystemService;
import module.decode.p25.reference.LinkControlOpcode;
public class AdjacentSiteStatusBroadcast extends LDU1Message
implements IdentifierReceiver, IAdjacentSite
public class AdjacentSiteStatusBroadcast extends LDU1Message implements IdentifierReceiver, IAdjacentSite
{
public static final int[] LRA = { 364,365,366,367,372,373,374,375 };
public static final int[] SYSTEM_ID = { 384,385,386,387,536,537,538,539,540,
541,546,547 };
public static final int[] RFSS_ID = { 548,549,550,551,556,557,558,559 };
public static final int[] SITE_ID = { 560,561,566,567,568,569,570,571 };
public static final int[] IDENTIFIER = { 720,721,722,723 };
public static final int[] CHANNEL = { 724,725,730,731,732,733,734,735,740,
741,742,743 };
public static final int[] SYSTEM_SERVICE_CLASS = { 744,745,750,751,752,753,
754,755 };
private IBandIdentifier mIdentifierUpdate;
public AdjacentSiteStatusBroadcast( LDU1Message message )
{
super( message );
}
public static final int[] LRA = {364, 365, 366, 367, 372, 373, 374, 375};
public static final int[] SYSTEM_ID = {384, 385, 386, 387, 536, 537, 538, 539, 540, 541, 546, 547};
public static final int[] RFSS_ID = {548, 549, 550, 551, 556, 557, 558, 559};
public static final int[] SITE_ID = {560, 561, 566, 567, 568, 569, 570, 571};
public static final int[] IDENTIFIER = {720, 721, 722, 723};
public static final int[] CHANNEL = {724, 725, 730, 731, 732, 733, 734, 735, 740, 741, 742, 743};
public static final int[] SYSTEM_SERVICE_CLASS = {744, 745, 750, 751, 752, 753, 754, 755};
private IBandIdentifier mIdentifierUpdate;
public AdjacentSiteStatusBroadcast(LDU1Message message)
{
super(message);
}
@Override
public String getEventType()
{
return LinkControlOpcode.ADJACENT_SITE_STATUS_BROADCAST.getDescription();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " LRA:" + getLRA() );
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( " SYS:" + getSystemID() );
sb.append( " SITE:" + getRFSS() + "-" + getSiteID() );
sb.append( " CHAN:" + getChannel() );
sb.append(getMessageStub());
sb.append(" LRA:" + getLRA());
sb.append(" SYS:" + getSystemID());
sb.append(" SITE:" + getRFSS() + "-" + getSiteID());
sb.append(" CHAN:" + getChannel());
sb.append(" " + getSystemServiceClass());
return sb.toString();
}
sb.append( " " + getSystemServiceClass() );
return sb.toString();
}
public String getUniqueID()
{
StringBuilder sb = new StringBuilder();
sb.append( getSystemID() );
sb.append( ":" );
sb.append( getRFSS() );
sb.append( ":" );
sb.append( getSiteID() );
return sb.toString();
}
public String getLRA()
{
return mMessage.getHex( LRA, 2 );
}
public String getSystemID()
{
return mMessage.getHex( SYSTEM_ID, 3 );
}
public String getRFSS()
{
return mMessage.getHex( RFSS_ID, 2 );
}
public String getSiteID()
{
return mMessage.getHex( SITE_ID, 2 );
}
public int getIdentifier()
{
return mMessage.getInt( IDENTIFIER );
}
public String getChannel()
{
return getIdentifier() + "-" + getChannelNumber();
}
public int getChannelNumber()
{
return mMessage.getInt( CHANNEL );
}
public String getSystemServiceClass()
{
return SystemService.toString( mMessage.getInt( SYSTEM_SERVICE_CLASS ) );
}
StringBuilder sb = new StringBuilder();
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
sb.append(getSystemID());
sb.append(":");
sb.append(getRFSS());
sb.append(":");
sb.append(getSiteID());
return sb.toString();
}
public String getLRA()
{
mIdentifierUpdate = message;
return mMessage.getHex(LRA, 2);
}
@Override
public String getSystemID()
{
return mMessage.getHex(SYSTEM_ID, 3);
}
public String getRFSS()
{
return mMessage.getHex(RFSS_ID, 2);
}
public String getSiteID()
{
return mMessage.getHex(SITE_ID, 2);
}
public int getIdentifier()
{
return mMessage.getInt(IDENTIFIER);
}
public String getChannel()
{
return getIdentifier() + "-" + getChannelNumber();
}
public int getChannelNumber()
{
return mMessage.getInt(CHANNEL);
}
public String getSystemServiceClass()
{
return SystemService.toString(mMessage.getInt(SYSTEM_SERVICE_CLASS));
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
mIdentifierUpdate = message;
}
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 1 ];
identifiers[ 0 ] = getIdentifier();
return identifiers;
int[] identifiers = new int[1];
identifiers[0] = getIdentifier();
return identifiers;
}
@Override
public String getDownlinkChannel()
{
return getChannel();
}
@Override
public String getUplinkChannel()
{
return getChannel();
}
public long getDownlinkFrequency()
public String getDownlinkChannel()
{
return calculateDownlink( mIdentifierUpdate, getChannelNumber() );
return getChannel();
}
@Override
public String getUplinkChannel()
{
return getChannel();
}
public long getDownlinkFrequency()
{
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.getDownlinkFrequency(getChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
return calculateUplink( mIdentifierUpdate, getChannelNumber() );
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.getUplinkFrequency(getChannelNumber());
}
return 0;
}
}

View File

@@ -1,3 +1,21 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.ldu.lc;
import module.decode.p25.message.IAdjacentSite;
@@ -6,154 +24,160 @@ import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.ldu.LDU1Message;
import module.decode.p25.reference.LinkControlOpcode;
public class AdjacentSiteStatusBroadcastExplicit extends LDU1Message
implements IdentifierReceiver, IAdjacentSite
public class AdjacentSiteStatusBroadcastExplicit extends LDU1Message implements IdentifierReceiver, IAdjacentSite
{
public static final int[] LRA = { 364,365,366,367,372,373,374,375 };
public static final int[] TRANSMIT_IDENTIFIER = { 376,377,382,383 };
public static final int[] TRANSMIT_CHANNEL = { 384,385,386,387,536,537,538,
539,540,541,546,547 };
public static final int[] RFSS_ID = { 548,549,550,551,556,557,558,559 };
public static final int[] SITE_ID = { 560,561,566,567,568,569,570,571 };
public static final int[] RECEIVE_IDENTIFIER = { 720,721,722,723 };
public static final int[] RECEIVE_CHANNEL = { 724,725,730,731,732,733,734,
735,740,741,742,743 };
private IBandIdentifier mTransmitBand;
private IBandIdentifier mReceiveBand;
public AdjacentSiteStatusBroadcastExplicit( LDU1Message message )
{
super( message );
}
public static final int[] LRA = {364, 365, 366, 367, 372, 373, 374, 375};
public static final int[] TRANSMIT_IDENTIFIER = {376, 377, 382, 383};
public static final int[] TRANSMIT_CHANNEL = {384, 385, 386, 387, 536, 537, 538, 539, 540, 541, 546, 547};
public static final int[] RFSS_ID = {548, 549, 550, 551, 556, 557, 558, 559};
public static final int[] SITE_ID = {560, 561, 566, 567, 568, 569, 570, 571};
public static final int[] RECEIVE_IDENTIFIER = {720, 721, 722, 723};
public static final int[] RECEIVE_CHANNEL = {724, 725, 730, 731, 732, 733, 734, 735, 740, 741, 742, 743};
private IBandIdentifier mTransmitBand;
private IBandIdentifier mReceiveBand;
public AdjacentSiteStatusBroadcastExplicit(LDU1Message message)
{
super(message);
}
@Override
public String getEventType()
{
return LinkControlOpcode.ADJACENT_SITE_STATUS_BROADCAST_EXPLICIT.getDescription();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " LRA:" + getLRA() );
sb.append( " SITE:" + getRFSS() + "-" + getSiteID() );
sb.append( " DNLINK:" + getDownlinkChannel() );
sb.append( " UPLINK:" + getUplinkChannel() );
return sb.toString();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append(getMessageStub());
sb.append(" LRA:" + getLRA());
sb.append(" SITE:" + getRFSS() + "-" + getSiteID());
sb.append(" DNLINK:" + getDownlinkChannel());
sb.append(" UPLINK:" + getUplinkChannel());
return sb.toString();
}
public String getUniqueID()
{
StringBuilder sb = new StringBuilder();
sb.append( getSystemID() );
sb.append( ":" );
sb.append( getRFSS() );
sb.append( ":" );
sb.append( getSiteID() );
return sb.toString();
}
public String getLRA()
{
return mMessage.getHex( LRA, 2 );
}
public String getRFSS()
{
return mMessage.getHex( RFSS_ID, 2 );
}
public String getSystemID()
{
return "***";
}
public String getSiteID()
{
return mMessage.getHex( SITE_ID, 2 );
}
public int getTransmitIdentifier()
{
return mMessage.getInt( TRANSMIT_IDENTIFIER );
}
public int getTransmitChannel()
{
return mMessage.getInt( TRANSMIT_CHANNEL );
}
public String getDownlinkChannel()
{
return getTransmitIdentifier() + "-" + getTransmitChannel();
}
public int getReceiveIdentifier()
{
return mMessage.getInt( RECEIVE_IDENTIFIER );
}
public int getReceiveChannel()
{
return mMessage.getInt( RECEIVE_CHANNEL );
}
public String getUplinkChannel()
{
return getReceiveIdentifier() + "-" + getReceiveChannel();
}
StringBuilder sb = new StringBuilder();
@Override
public String getSystemServiceClass()
{
return "[]";
}
sb.append(getSystemID());
sb.append(":");
sb.append(getRFSS());
sb.append(":");
sb.append(getSiteID());
return sb.toString();
}
public String getLRA()
{
return mMessage.getHex(LRA, 2);
}
public String getRFSS()
{
return mMessage.getHex(RFSS_ID, 2);
}
public String getSystemID()
{
return "***";
}
public String getSiteID()
{
return mMessage.getHex(SITE_ID, 2);
}
public int getTransmitIdentifier()
{
return mMessage.getInt(TRANSMIT_IDENTIFIER);
}
public int getTransmitChannel()
{
return mMessage.getInt(TRANSMIT_CHANNEL);
}
public String getDownlinkChannel()
{
return getTransmitIdentifier() + "-" + getTransmitChannel();
}
public int getReceiveIdentifier()
{
return mMessage.getInt(RECEIVE_IDENTIFIER);
}
public int getReceiveChannel()
{
return mMessage.getInt(RECEIVE_CHANNEL);
}
public String getUplinkChannel()
{
return getReceiveIdentifier() + "-" + getReceiveChannel();
}
@Override
public String getSystemServiceClass()
{
return "[]";
}
public long getDownlinkFrequency()
{
return calculateDownlink( mTransmitBand, getTransmitChannel() );
if(mTransmitBand != null)
{
return mTransmitBand.getDownlinkFrequency(getTransmitChannel());
}
return 0;
}
public long getUplinkFrequency()
{
return calculateUplink( mReceiveBand, getReceiveChannel() );
if(mReceiveBand != null)
{
return mReceiveBand.getUplinkFrequency(getReceiveChannel());
}
return 0;
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
{
if( identifier == getTransmitIdentifier() )
{
mTransmitBand = message;
}
if( identifier == getReceiveIdentifier() )
{
mReceiveBand = message;
}
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if(identifier == getTransmitIdentifier())
{
mTransmitBand = message;
}
if(identifier == getReceiveIdentifier())
{
mReceiveBand = message;
}
}
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[2];
identifiers[0] = getTransmitIdentifier();
identifiers[1] = getReceiveIdentifier();
return identifiers;
}
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 2 ];
identifiers[ 0 ] = getTransmitIdentifier();
identifiers[ 1 ] = getReceiveIdentifier();
return identifiers;
}
}

View File

@@ -1,83 +1,118 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.ldu.lc;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.ldu.LDU1Message;
import module.decode.p25.reference.LinkControlOpcode;
public class ChannelIdentifierUpdate extends LDU1Message
implements IBandIdentifier
public class ChannelIdentifierUpdate extends LDU1Message implements IBandIdentifier
{
public static final int[] IDENTIFIER = { 364,365,366,367 };
public static final int[] BANDWIDTH = { 372,373,374,375,376,377,382,383,384 };
public static final int[] TRANSMIT_OFFSET = { 385,386,387,536,537,538,539,
540,541 };
public static final int[] CHANNEL_SPACING = { 546,547,548,549,550,551,556,
557,558,559 };
public static final int[] BASE_FREQUENCY = { 560,561,566,567,568,569,570,
571,720,721,722,723,724,725,730,731,732,733,734,735,740,741,742,743,744,
745,750,751,752,753,754,755 };
public static final int[] IDENTIFIER = {364, 365, 366, 367};
public static final int[] BANDWIDTH = {372, 373, 374, 375, 376, 377, 382, 383, 384};
public static final int[] TRANSMIT_OFFSET = {385, 386, 387, 536, 537, 538, 539,
540, 541};
public static final int[] CHANNEL_SPACING = {546, 547, 548, 549, 550, 551, 556,
557, 558, 559};
public static final int[] BASE_FREQUENCY = {560, 561, 566, 567, 568, 569, 570,
571, 720, 721, 722, 723, 724, 725, 730, 731, 732, 733, 734, 735, 740, 741, 742, 743, 744,
745, 750, 751, 752, 753, 754, 755};
public ChannelIdentifierUpdate(LDU1Message message)
{
super(message);
}
public ChannelIdentifierUpdate( LDU1Message message )
{
super( message );
}
@Override
public String getEventType()
{
return LinkControlOpcode.CHANNEL_IDENTIFIER_UPDATE.getDescription();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " IDEN:" + getIdentifier() );
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( " BASE:" + getBaseFrequency() );
sb.append( " BW:" + getBandwidth() );
sb.append( " SPACING:" + getChannelSpacing() );
sb.append( " OFFSET:" + getTransmitOffset() );
return sb.toString();
}
sb.append(getMessageStub());
@Override
public int getIdentifier()
{
return mMessage.getInt( IDENTIFIER );
}
sb.append(" IDEN:" + getIdentifier());
/**
sb.append(" BASE:" + getBaseFrequency());
sb.append(" BW:" + getBandwidth());
sb.append(" SPACING:" + getChannelSpacing());
sb.append(" OFFSET:" + getTransmitOffset());
return sb.toString();
}
@Override
public int getIdentifier()
{
return mMessage.getInt(IDENTIFIER);
}
/**
* Channel bandwidth in hertz
*/
@Override
public int getBandwidth()
{
return mMessage.getInt( BANDWIDTH ) * 125;
return mMessage.getInt(BANDWIDTH) * 125;
}
@Override
public long getChannelSpacing()
{
return mMessage.getLong( CHANNEL_SPACING ) * 125l;
return mMessage.getLong(CHANNEL_SPACING) * 125l;
}
@Override
public long getBaseFrequency()
{
return mMessage.getLong( BASE_FREQUENCY ) * 5l;
return mMessage.getLong(BASE_FREQUENCY) * 5l;
}
@Override
@Override
public long getTransmitOffset()
{
return -1 * mMessage.getLong( TRANSMIT_OFFSET ) * 250000l;
return -1 * mMessage.getLong(TRANSMIT_OFFSET) * 250000l;
}
@Override
public long getDownlinkFrequency(int channelNumber)
{
return getBaseFrequency() + (channelNumber * getChannelSpacing());
}
@Override
public long getUplinkFrequency(int channelNumber)
{
return getDownlinkFrequency(channelNumber) + getTransmitOffset();
}
@Override
public boolean isTDMA()
{
return false;
}
}

View File

@@ -4,8 +4,7 @@ import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.ldu.LDU1Message;
import module.decode.p25.reference.LinkControlOpcode;
public class ChannelIdentifierUpdateExplicit extends LDU1Message
implements IBandIdentifier
public class ChannelIdentifierUpdateExplicit extends LDU1Message implements IBandIdentifier
{
public static final int[] IDENTIFIER = { 364,365,366,367 };
public static final int[] BANDWIDTH = { 372,373,374,375 };
@@ -80,4 +79,22 @@ public class ChannelIdentifierUpdateExplicit extends LDU1Message
{
return -1 * mMessage.getLong( TRANSMIT_OFFSET ) * 250000l;
}
@Override
public long getDownlinkFrequency(int channelNumber)
{
return getBaseFrequency() + ( channelNumber * getChannelSpacing() );
}
@Override
public long getUplinkFrequency(int channelNumber)
{
return getDownlinkFrequency(channelNumber) + getTransmitOffset();
}
@Override
public boolean isTDMA()
{
return false;
}
}

View File

@@ -1,3 +1,21 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.ldu.lc;
import module.decode.p25.message.IBandIdentifier;
@@ -5,156 +23,167 @@ import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.ldu.LDU1Message;
import module.decode.p25.reference.LinkControlOpcode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class GroupVoiceChannelUpdate extends LDU1Message
implements IdentifierReceiver
public class GroupVoiceChannelUpdate extends LDU1Message implements IdentifierReceiver
{
private final static Logger mLog =
LoggerFactory.getLogger( GroupVoiceChannelUpdate.class );
public static final int[] IDENTIFIER_A = {364, 365, 366, 367};
public static final int[] CHANNEL_A = {372, 373, 374, 375, 376, 377, 382, 383, 384, 385, 386, 387};
public static final int[] GROUP_ADDRESS_A = {536, 537, 538, 539, 540, 541, 546, 547, 548, 549, 550, 551, 556, 557,
558, 559};
public static final int[] IDENTIFIER_B = {560, 561, 566, 567};
public static final int[] CHANNEL_B = {568, 569, 570, 571, 720, 721, 722, 723, 724, 725, 730, 731};
public static final int[] GROUP_ADDRESS_B = {732, 733, 734, 735, 740, 741, 742, 743, 744, 745, 750, 751, 752, 753,
754, 755};
private IBandIdentifier mIdentifierUpdateA;
private IBandIdentifier mIdentifierUpdateB;
public GroupVoiceChannelUpdate(LDU1Message message)
{
super(message);
}
public static final int[] IDENTIFIER_A = { 364,365,366,367 };
public static final int[] CHANNEL_A = { 372,373,374,375,376,377,382,383,384,
385,386,387 };
public static final int[] GROUP_ADDRESS_A = { 536,537,538,539,540,541,546,
547,548,549,550,551,556,557,558,559 };
public static final int[] IDENTIFIER_B = { 560,561,566,567 };
public static final int[] CHANNEL_B = { 568,569,570,571,720,721,722,723,724,
725,730,731 };
public static final int[] GROUP_ADDRESS_B = { 732,733,734,735,740,741,742,
743,744,745,750,751,752,753,754,755 };
private IBandIdentifier mIdentifierUpdateA;
private IBandIdentifier mIdentifierUpdateB;
public GroupVoiceChannelUpdate( LDU1Message message )
{
super( message );
}
@Override
public String getEventType()
{
return LinkControlOpcode.GROUP_VOICE_CHANNEL_UPDATE.getDescription();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " CHAN A:" + getChannelA() );
sb.append( " GRP A:" + getGroupAddressA() );
if( hasChannelB() )
{
sb.append( " CHAN B:" + getChannelA() );
sb.append( " GRP B:" + getGroupAddressA() );
}
return sb.toString();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append(getMessageStub());
sb.append(" CHAN A:" + getChannelA());
sb.append(" GRP A:" + getGroupAddressA());
if(hasChannelB())
{
sb.append(" CHAN B:" + getChannelA());
sb.append(" GRP B:" + getGroupAddressA());
}
return sb.toString();
}
public int getChannelIdentifierA()
{
return mMessage.getInt(IDENTIFIER_A);
}
public int getChannelIdentifierA()
{
return mMessage.getInt( IDENTIFIER_A );
}
public int getChannelNumberA()
{
return mMessage.getInt( CHANNEL_A );
return mMessage.getInt(CHANNEL_A);
}
public String getChannelA()
{
return getChannelIdentifierA() + "-" + getChannelNumberA();
return getChannelIdentifierA() + "-" + getChannelNumberA();
}
public int getChannelIdentifierB()
{
return mMessage.getInt( IDENTIFIER_B );
}
public int getChannelIdentifierB()
{
return mMessage.getInt(IDENTIFIER_B);
}
public int getChannelNumberB()
{
return mMessage.getInt( CHANNEL_B );
return mMessage.getInt(CHANNEL_B);
}
public String getChannelB()
{
return getChannelIdentifierB() + "-" + getChannelNumberB();
return getChannelIdentifierB() + "-" + getChannelNumberB();
}
public boolean hasChannelB()
{
return getChannelNumberB() != 0;
return getChannelNumberB() != 0;
}
public String getGroupAddressA()
{
return mMessage.getHex( GROUP_ADDRESS_A, 4 );
return mMessage.getHex(GROUP_ADDRESS_A, 4);
}
public String getGroupAddressB()
{
return mMessage.getHex( GROUP_ADDRESS_B, 4 );
return mMessage.getHex(GROUP_ADDRESS_B, 4);
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if( identifier == getChannelIdentifierA() )
{
mIdentifierUpdateA = message;
}
if( identifier == getChannelIdentifierB() )
{
mIdentifierUpdateB = message;
}
if(identifier == getChannelIdentifierA())
{
mIdentifierUpdateA = message;
}
if(identifier == getChannelIdentifierB())
{
mIdentifierUpdateB = message;
}
}
@Override
@Override
public int[] getIdentifiers()
{
if( hasChannelB() )
{
int[] identifiers = new int[ 2 ];
identifiers[ 0 ] = getChannelIdentifierA();
identifiers[ 1 ] = getChannelIdentifierB();
return identifiers;
}
else
{
int[] identifiers = new int[ 1 ];
identifiers[ 0 ] = getChannelIdentifierA();
return identifiers;
}
if(hasChannelB())
{
int[] identifiers = new int[2];
identifiers[0] = getChannelIdentifierA();
identifiers[1] = getChannelIdentifierB();
return identifiers;
}
else
{
int[] identifiers = new int[1];
identifiers[0] = getChannelIdentifierA();
return identifiers;
}
}
public long getDownlinkFrequencyA()
{
return calculateDownlink( mIdentifierUpdateA, getChannelNumberA() );
if(mIdentifierUpdateA != null)
{
return mIdentifierUpdateA.getDownlinkFrequency(getChannelNumberA());
}
return 0;
}
public long getUplinkFrequencyA()
{
return calculateUplink( mIdentifierUpdateA, getChannelNumberA() );
if(mIdentifierUpdateA != null)
{
return mIdentifierUpdateA.getUplinkFrequency(getChannelNumberA());
}
return 0;
}
public long getDownlinkFrequencyB()
{
return calculateDownlink( mIdentifierUpdateB, getChannelNumberA() );
if(mIdentifierUpdateB != null)
{
return mIdentifierUpdateB.getDownlinkFrequency(getChannelNumberB());
}
return 0;
}
public long getUplinkFrequencyB()
{
return calculateUplink( mIdentifierUpdateB, getChannelNumberA() );
if(mIdentifierUpdateB != null)
{
return mIdentifierUpdateB.getUplinkFrequency(getChannelNumberB());
}
return 0;
}
}

View File

@@ -1,3 +1,21 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.ldu.lc;
import module.decode.p25.message.IBandIdentifier;
@@ -5,151 +23,149 @@ import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.ldu.LDU1Message;
import module.decode.p25.reference.LinkControlOpcode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class GroupVoiceChannelUpdateExplicit extends LDU1Message
implements IdentifierReceiver
public class GroupVoiceChannelUpdateExplicit extends LDU1Message implements IdentifierReceiver
{
private final static Logger mLog =
LoggerFactory.getLogger( GroupVoiceChannelUpdateExplicit.class );
public static final int EMERGENCY_FLAG = 376;
public static final int ENCRYPTED_CHANNEL_FLAG = 377;
public static final int DUPLEX_MODE = 382;
public static final int SESSION_MODE = 383;
public static final int[] GROUP_ADDRESS = { 536,537,538,539,540,541,546,547,
548,549,550,551,556,557,558,559 };
public static final int[] TRANSMIT_IDENTIFIER = { 560,561,566,567 };
public static final int[] TRANSMIT_CHANNEL = { 568,569,570,571,720,721,722,
723,724,725,730,731 };
public static final int[] RECEIVE_IDENTIFIER = { 732,733,734,735 };
public static final int[] RECEIVE_CHANNEL = { 740,741,742,743,744,745,750,
751,752,753,754,755 };
public static final int[] GROUP_ADDRESS = {536, 537, 538, 539, 540, 541, 546, 547, 548, 549, 550, 551, 556, 557, 558, 559};
public static final int[] TRANSMIT_IDENTIFIER = {560, 561, 566, 567};
public static final int[] TRANSMIT_CHANNEL = {568, 569, 570, 571, 720, 721, 722, 723, 724, 725, 730, 731};
public static final int[] RECEIVE_IDENTIFIER = {732, 733, 734, 735};
public static final int[] RECEIVE_CHANNEL = {740, 741, 742, 743, 744, 745, 750, 751, 752, 753, 754, 755};
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public GroupVoiceChannelUpdateExplicit(LDU1Message message)
{
super(message);
}
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public GroupVoiceChannelUpdateExplicit( LDU1Message message )
{
super( message );
}
@Override
public String getEventType()
{
return LinkControlOpcode.GROUP_VOICE_CHANNEL_UPDATE_EXPLICIT.getDescription();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
if( isEmergency() )
{
sb.append( " EMERGENCY" );
}
if( isEncryptedChannel() )
{
sb.append( " ENCRYPTED CHANNEL" );
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
return sb.toString();
}
sb.append(getMessageStub());
if(isEmergency())
{
sb.append(" EMERGENCY");
}
if(isEncryptedChannel())
{
sb.append(" ENCRYPTED CHANNEL");
}
return sb.toString();
}
public boolean isEmergency()
{
return mMessage.get( EMERGENCY_FLAG );
return mMessage.get(EMERGENCY_FLAG);
}
public boolean isEncryptedChannel()
{
return mMessage.get( ENCRYPTED_CHANNEL_FLAG );
return mMessage.get(ENCRYPTED_CHANNEL_FLAG);
}
public DuplexMode getDuplexMode()
{
return mMessage.get( DUPLEX_MODE ) ? DuplexMode.FULL : DuplexMode.HALF;
return mMessage.get(DUPLEX_MODE) ? DuplexMode.FULL : DuplexMode.HALF;
}
public SessionMode getSessionMode()
{
return mMessage.get( SESSION_MODE ) ?
SessionMode.CIRCUIT : SessionMode.PACKET;
return mMessage.get(SESSION_MODE) ?
SessionMode.CIRCUIT : SessionMode.PACKET;
}
public int getTransmitChannelIdentifier()
{
return mMessage.getInt( TRANSMIT_IDENTIFIER );
}
public int getTransmitChannelNumber()
{
return mMessage.getInt( TRANSMIT_CHANNEL );
}
public String getTransmitChannel()
{
return getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveChannelIdentifier()
{
return mMessage.getInt( RECEIVE_IDENTIFIER );
}
public int getReceiveChannelNumber()
{
return mMessage.getInt( RECEIVE_CHANNEL );
}
public String getReceiveChannel()
{
return getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber();
}
public String getGroupAddress()
{
return mMessage.getHex( GROUP_ADDRESS, 4 );
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
{
if( identifier == getTransmitChannelIdentifier() )
{
mTransmitIdentifierUpdate = message;
}
if( identifier == getReceiveChannelIdentifier() )
{
mReceiveIdentifierUpdate = message;
}
return mMessage.getInt(TRANSMIT_IDENTIFIER);
}
@Override
public int getTransmitChannelNumber()
{
return mMessage.getInt(TRANSMIT_CHANNEL);
}
public String getTransmitChannel()
{
return getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveChannelIdentifier()
{
return mMessage.getInt(RECEIVE_IDENTIFIER);
}
public int getReceiveChannelNumber()
{
return mMessage.getInt(RECEIVE_CHANNEL);
}
public String getReceiveChannel()
{
return getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber();
}
public String getGroupAddress()
{
return mMessage.getHex(GROUP_ADDRESS, 4);
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if(identifier == getTransmitChannelIdentifier())
{
mTransmitIdentifierUpdate = message;
}
if(identifier == getReceiveChannelIdentifier())
{
mReceiveIdentifierUpdate = message;
}
}
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 2 ];
identifiers[ 0 ] = getTransmitChannelIdentifier();
identifiers[ 1 ] = getReceiveChannelIdentifier();
return identifiers;
int[] identifiers = new int[2];
identifiers[0] = getTransmitChannelIdentifier();
identifiers[1] = getReceiveChannelIdentifier();
return identifiers;
}
public long getDownlinkFrequency()
{
return calculateDownlink( mTransmitIdentifierUpdate,
getTransmitChannelNumber() );
if(mTransmitIdentifierUpdate != null)
{
return mTransmitIdentifierUpdate.getDownlinkFrequency(getTransmitChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
return calculateUplink( mReceiveIdentifierUpdate,
getReceiveChannelNumber() );
if(mReceiveIdentifierUpdate != null)
{
return mReceiveIdentifierUpdate.getUplinkFrequency(getReceiveChannelNumber());
}
return 0;
}
}

View File

@@ -1,3 +1,21 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.ldu.lc;
import module.decode.p25.message.IBandIdentifier;
@@ -6,105 +24,106 @@ import module.decode.p25.message.ldu.LDU1Message;
import module.decode.p25.reference.LinkControlOpcode;
import module.decode.p25.reference.Service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class NetworkStatusBroadcast extends LDU1Message
implements IdentifierReceiver
public class NetworkStatusBroadcast extends LDU1Message implements IdentifierReceiver
{
private final static Logger mLog =
LoggerFactory.getLogger( NetworkStatusBroadcast.class );
public static final int[] NETWORK_ID = { 376,377,382,383,384,385,386,387,
536,537,538,539,540,541,546,547,548,549,550,551 };
public static final int[] SYSTEM_ID = { 556,557,558,559,560,561,566,567,568,
569,570,571 };
public static final int[] IDENTIFIER = { 720,721,722,723 };
public static final int[] CHANNEL = { 724,725,730,731,732,733,734,735,740,
741,742,743 };
public static final int[] SYSTEM_SERVICE_CLASS = { 744,745,750,751,752,753,
754,755 };
private IBandIdentifier mIdentifierUpdate;
public NetworkStatusBroadcast( LDU1Message source )
{
super( source );
}
public static final int[] NETWORK_ID = {376, 377, 382, 383, 384, 385, 386, 387, 536, 537, 538, 539, 540, 541, 546,
547, 548, 549, 550, 551};
public static final int[] SYSTEM_ID = {556, 557, 558, 559, 560, 561, 566, 567, 568, 569, 570, 571};
public static final int[] IDENTIFIER = {720, 721, 722, 723};
public static final int[] CHANNEL = {724, 725, 730, 731, 732, 733, 734, 735, 740, 741, 742, 743};
public static final int[] SYSTEM_SERVICE_CLASS = {744, 745, 750, 751, 752, 753, 754, 755};
private IBandIdentifier mIdentifierUpdate;
public NetworkStatusBroadcast(LDU1Message source)
{
super(source);
}
@Override
public String getEventType()
{
return LinkControlOpcode.NETWORK_STATUS_BROADCAST.getDescription();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " NETWORK:" + getNetworkID() );
sb.append( " SYS:" + getSystem() );
sb.append( " CHAN:" + getChannel() );
sb.append( " " + Service.getServices( getSystemServiceClass() ).toString() );
return sb.toString();
}
public String getNetworkID()
{
return mMessage.getHex( NETWORK_ID, 5 );
}
public String getSystem()
{
return mMessage.getHex( SYSTEM_ID, 3 );
}
public int getIdentifier()
{
return mMessage.getInt( IDENTIFIER );
}
public int getChannelNumber()
{
return mMessage.getInt( CHANNEL );
}
public String getChannel()
{
return getIdentifier() + "-" + getChannelNumber();
}
public int getSystemServiceClass()
{
return mMessage.getInt( SYSTEM_SERVICE_CLASS );
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
@Override
public String getMessage()
{
mIdentifierUpdate = message;
StringBuilder sb = new StringBuilder();
sb.append(getMessageStub());
sb.append(" NETWORK:" + getNetworkID());
sb.append(" SYS:" + getSystem());
sb.append(" CHAN:" + getChannel());
sb.append(" " + Service.getServices(getSystemServiceClass()).toString());
return sb.toString();
}
@Override
public String getNetworkID()
{
return mMessage.getHex(NETWORK_ID, 5);
}
public String getSystem()
{
return mMessage.getHex(SYSTEM_ID, 3);
}
public int getIdentifier()
{
return mMessage.getInt(IDENTIFIER);
}
public int getChannelNumber()
{
return mMessage.getInt(CHANNEL);
}
public String getChannel()
{
return getIdentifier() + "-" + getChannelNumber();
}
public int getSystemServiceClass()
{
return mMessage.getInt(SYSTEM_SERVICE_CLASS);
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
mIdentifierUpdate = message;
}
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 1 ];
identifiers[ 0 ] = getIdentifier();
return identifiers;
int[] identifiers = new int[1];
identifiers[0] = getIdentifier();
return identifiers;
}
public long getDownlinkFrequency()
{
return calculateDownlink( mIdentifierUpdate, getChannelNumber() );
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.getDownlinkFrequency(getChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
return calculateUplink( mIdentifierUpdate, getChannelNumber() );
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.getUplinkFrequency(getChannelNumber());
}
return 0;
}
}

View File

@@ -1,131 +1,150 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.ldu.lc;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.ldu.LDU1Message;
import module.decode.p25.reference.LinkControlOpcode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class NetworkStatusBroadcastExplicit extends LDU1Message
implements IdentifierReceiver
public class NetworkStatusBroadcastExplicit extends LDU1Message implements IdentifierReceiver
{
private final static Logger mLog =
LoggerFactory.getLogger( NetworkStatusBroadcastExplicit.class );
public static final int[] NETWORK_ID = { 364,365,366,367,372,373,374,375,
376,377,382,383,384,385,386,387,536,537,538,539 };
public static final int[] SYSTEM_ID = { 540,541,546,547,548,549,550,551,556,
557,558,559 };
public static final int[] TRANSMIT_IDENTIFIER = { 560,561,566,567 };
public static final int[] TRANSMIT_CHANNEL = { 568,569,570,571,720,721,722,
723,724,725,730,731 };
public static final int[] RECEIVE_IDENTIFIER = { 732,733,734,735 };
public static final int[] RECEIVE_CHANNEL = { 740,741,742,743,744,745,750,
751,752,753,754,755 };
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public NetworkStatusBroadcastExplicit( LDU1Message message )
{
super( message );
}
public static final int[] NETWORK_ID = {364, 365, 366, 367, 372, 373, 374, 375, 376, 377, 382, 383, 384, 385, 386,
387, 536, 537, 538, 539};
public static final int[] SYSTEM_ID = {540, 541, 546, 547, 548, 549, 550, 551, 556, 557, 558, 559};
public static final int[] TRANSMIT_IDENTIFIER = {560, 561, 566, 567};
public static final int[] TRANSMIT_CHANNEL = {568, 569, 570, 571, 720, 721, 722, 723, 724, 725, 730, 731};
public static final int[] RECEIVE_IDENTIFIER = {732, 733, 734, 735};
public static final int[] RECEIVE_CHANNEL = {740, 741, 742, 743, 744, 745, 750, 751, 752, 753, 754, 755};
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public NetworkStatusBroadcastExplicit(LDU1Message message)
{
super(message);
}
@Override
public String getEventType()
{
return LinkControlOpcode.NETWORK_STATUS_BROADCAST_EXPLICIT.getDescription();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " NETWORK:" + getNetworkID() );
sb.append( " SYS:" + getSystem() );
sb.append( " TRANSMIT:" + getTransmitChannel() );
sb.append( " RECEIVE:" + getReceiveChannel() );
return sb.toString();
}
public String getNetworkID()
{
return mMessage.getHex( NETWORK_ID, 5 );
}
public String getSystem()
{
return mMessage.getHex( SYSTEM_ID, 3 );
}
public int getTransmitIdentifier()
{
return mMessage.getInt( TRANSMIT_IDENTIFIER );
}
public int getTransmitChannelNumber()
{
return mMessage.getInt( TRANSMIT_CHANNEL );
}
public String getTransmitChannel()
{
return getTransmitIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveIdentifier()
{
return mMessage.getInt( RECEIVE_IDENTIFIER );
}
public int getReceiveChannelNumber()
{
return mMessage.getInt( RECEIVE_CHANNEL );
}
public String getReceiveChannel()
{
return getReceiveIdentifier() + "-" + getReceiveChannelNumber();
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
@Override
public String getMessage()
{
if( identifier == getTransmitIdentifier() )
{
mTransmitIdentifierUpdate = message;
}
if( identifier == getReceiveIdentifier() )
{
mReceiveIdentifierUpdate = message;
}
StringBuilder sb = new StringBuilder();
sb.append(getMessageStub());
sb.append(" NETWORK:" + getNetworkID());
sb.append(" SYS:" + getSystem());
sb.append(" TRANSMIT:" + getTransmitChannel());
sb.append(" RECEIVE:" + getReceiveChannel());
return sb.toString();
}
@Override
public String getNetworkID()
{
return mMessage.getHex(NETWORK_ID, 5);
}
public String getSystem()
{
return mMessage.getHex(SYSTEM_ID, 3);
}
public int getTransmitIdentifier()
{
return mMessage.getInt(TRANSMIT_IDENTIFIER);
}
public int getTransmitChannelNumber()
{
return mMessage.getInt(TRANSMIT_CHANNEL);
}
public String getTransmitChannel()
{
return getTransmitIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveIdentifier()
{
return mMessage.getInt(RECEIVE_IDENTIFIER);
}
public int getReceiveChannelNumber()
{
return mMessage.getInt(RECEIVE_CHANNEL);
}
public String getReceiveChannel()
{
return getReceiveIdentifier() + "-" + getReceiveChannelNumber();
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if(identifier == getTransmitIdentifier())
{
mTransmitIdentifierUpdate = message;
}
if(identifier == getReceiveIdentifier())
{
mReceiveIdentifierUpdate = message;
}
}
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 2 ];
identifiers[ 0 ] = getTransmitIdentifier();
identifiers[ 1 ] = getReceiveIdentifier();
return identifiers;
int[] identifiers = new int[2];
identifiers[0] = getTransmitIdentifier();
identifiers[1] = getReceiveIdentifier();
return identifiers;
}
public long getDownlinkFrequency()
{
return calculateDownlink( mTransmitIdentifierUpdate,
getTransmitChannelNumber() );
if(mTransmitIdentifierUpdate != null)
{
return mTransmitIdentifierUpdate.getDownlinkFrequency(getTransmitChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
return calculateUplink( mReceiveIdentifierUpdate,
getReceiveChannelNumber() );
if(mReceiveIdentifierUpdate != null)
{
return mReceiveIdentifierUpdate.getUplinkFrequency(getReceiveChannelNumber());
}
return 0;
}
}

View File

@@ -1,3 +1,21 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.ldu.lc;
import module.decode.p25.message.IBandIdentifier;
@@ -6,125 +24,124 @@ import module.decode.p25.message.ldu.LDU1Message;
import module.decode.p25.message.tsbk.osp.control.SystemService;
import module.decode.p25.reference.LinkControlOpcode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class RFSSStatusBroadcast extends LDU1Message
implements IdentifierReceiver
public class RFSSStatusBroadcast extends LDU1Message implements IdentifierReceiver
{
private final static Logger mLog =
LoggerFactory.getLogger( RFSSStatusBroadcast.class );
public static final int[] LRA = {364, 365, 366, 367, 372, 373, 374, 375};
public static final int[] SYSTEM_ID = {384, 385, 386, 387, 536, 537, 538, 539, 540, 541, 546, 547};
public static final int[] RFSS_ID = {548, 549, 550, 551, 556, 557, 558, 559};
public static final int[] SITE_ID = {560, 561, 566, 567, 568, 569, 570, 571};
public static final int[] IDENTIFIER = {720, 721, 722, 723};
public static final int[] CHANNEL = {724, 725, 730, 731, 732, 733, 734, 735, 740, 741, 742, 743};
public static final int[] SYSTEM_SERVICE_CLASS = {744, 745, 750, 751, 752, 753, 754, 755};
private IBandIdentifier mIdentifierUpdate;
public RFSSStatusBroadcast(LDU1Message message)
{
super(message);
}
public static final int[] LRA = { 364,365,366,367,372,373,374,375 };
public static final int[] SYSTEM_ID = { 384,385,386,387,536,537,538,539,540,
541,546,547 };
public static final int[] RFSS_ID = { 548,549,550,551,556,557,558,559 };
public static final int[] SITE_ID = { 560,561,566,567,568,569,570,571 };
public static final int[] IDENTIFIER = { 720,721,722,723 };
public static final int[] CHANNEL = { 724,725,730,731,732,733,734,735,740,
741,742,743 };
public static final int[] SYSTEM_SERVICE_CLASS = { 744,745,750,751,752,753,
754,755 };
private IBandIdentifier mIdentifierUpdate;
public RFSSStatusBroadcast( LDU1Message message )
{
super( message );
}
@Override
public String getEventType()
{
return LinkControlOpcode.RFSS_STATUS_BROADCAST.getDescription();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " LRA:" + getLocationRegistrationArea() );
sb.append( " SYS:" + getSystem() );
sb.append( " SITE:" + getRFSubsystemID() + "-" + getSiteID() );
sb.append( " CHAN:" + getChannelNumber() );
sb.append( " " + SystemService.toString( getSystemServiceClass() ) );
sb.append( " " + mMessage.toString() );
return sb.toString();
}
public String getLocationRegistrationArea()
{
return mMessage.getHex( LRA, 2 );
}
public String getSystem()
{
return mMessage.getHex( SYSTEM_ID, 3 );
}
public String getRFSubsystemID()
{
return mMessage.getHex( RFSS_ID, 2 );
}
public String getSiteID()
{
return mMessage.getHex( SITE_ID, 2 );
}
public int getIdentifier()
{
return mMessage.getInt( IDENTIFIER );
}
public String getChannel()
{
return getIdentifier() + "-" + getChannelNumber();
}
public int getChannelNumber()
{
return mMessage.getInt( CHANNEL );
}
public int getSystemServiceClass()
{
return mMessage.getInt( SYSTEM_SERVICE_CLASS );
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
@Override
public String getMessage()
{
mIdentifierUpdate = message;
StringBuilder sb = new StringBuilder();
sb.append(getMessageStub());
sb.append(" LRA:" + getLocationRegistrationArea());
sb.append(" SYS:" + getSystem());
sb.append(" SITE:" + getRFSubsystemID() + "-" + getSiteID());
sb.append(" CHAN:" + getChannelNumber());
sb.append(" " + SystemService.toString(getSystemServiceClass()));
sb.append(" " + mMessage.toString());
return sb.toString();
}
@Override
public String getLocationRegistrationArea()
{
return mMessage.getHex(LRA, 2);
}
public String getSystem()
{
return mMessage.getHex(SYSTEM_ID, 3);
}
public String getRFSubsystemID()
{
return mMessage.getHex(RFSS_ID, 2);
}
public String getSiteID()
{
return mMessage.getHex(SITE_ID, 2);
}
public int getIdentifier()
{
return mMessage.getInt(IDENTIFIER);
}
public String getChannel()
{
return getIdentifier() + "-" + getChannelNumber();
}
public int getChannelNumber()
{
return mMessage.getInt(CHANNEL);
}
public int getSystemServiceClass()
{
return mMessage.getInt(SYSTEM_SERVICE_CLASS);
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
mIdentifierUpdate = message;
}
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 1 ];
identifiers[ 0 ] = getIdentifier();
return identifiers;
int[] identifiers = new int[1];
identifiers[0] = getIdentifier();
return identifiers;
}
public long getDownlinkFrequency()
{
return calculateDownlink( mIdentifierUpdate, getChannelNumber() );
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.getDownlinkFrequency(getChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
return calculateUplink( mIdentifierUpdate, getChannelNumber() );
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.getUplinkFrequency(getChannelNumber());
}
return 0;
}
}

View File

@@ -1,3 +1,21 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.ldu.lc;
import module.decode.p25.message.IBandIdentifier;
@@ -5,146 +23,148 @@ import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.ldu.LDU1Message;
import module.decode.p25.message.tsbk.osp.control.SystemService;
import module.decode.p25.reference.LinkControlOpcode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class RFSSStatusBroadcastExplicit extends LDU1Message
implements IdentifierReceiver
public class RFSSStatusBroadcastExplicit extends LDU1Message implements IdentifierReceiver
{
private final static Logger mLog =
LoggerFactory.getLogger( RFSSStatusBroadcastExplicit.class );
public static final int[] LRA = {364, 365, 366, 367, 372, 373, 374, 375};
public static final int[] RECEIVE_IDENTIFIER = {376, 377, 382, 383};
public static final int[] RECEIVE_CHANNEL = {384, 385, 386, 387, 536, 537, 538, 539, 540, 541, 546, 547};
public static final int[] RFSS_ID = {548, 549, 550, 551, 556, 557, 558, 559};
public static final int[] SITE_ID = {560, 561, 566, 567, 568, 569, 570, 571};
public static final int[] TRANSMIT_IDENTIFIER = {720, 721, 722, 723};
public static final int[] TRANSMIT_CHANNEL = {724, 725, 730, 731, 732, 733, 734, 735, 740, 741, 742, 743};
public static final int[] SYSTEM_SERVICE_CLASS = {744, 745, 750, 751, 752, 753, 754, 755};
public static final int[] LRA = { 364,365,366,367,372,373,374,375 };
public static final int[] RECEIVE_IDENTIFIER = { 376,377,382,383 };
public static final int[] RECEIVE_CHANNEL = { 384,385,386,387,536,537,538,
539,540,541,546,547 };
public static final int[] RFSS_ID = { 548,549,550,551,556,557,558,559 };
public static final int[] SITE_ID = { 560,561,566,567,568,569,570,571 };
public static final int[] TRANSMIT_IDENTIFIER = { 720,721,722,723 };
public static final int[] TRANSMIT_CHANNEL = { 724,725,730,731,732,733,734,
735,740,741,742,743 };
public static final int[] SYSTEM_SERVICE_CLASS = { 744,745,750,751,752,753,754,755 };
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public RFSSStatusBroadcastExplicit(LDU1Message source)
{
super(source);
}
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public RFSSStatusBroadcastExplicit( LDU1Message source )
{
super( source );
}
@Override
public String getEventType()
{
return LinkControlOpcode.RFSS_STATUS_BROADCAST_EXPLICIT.getDescription();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " LRA:" + getLocationRegistrationArea() );
sb.append( " SITE:" + getRFSubsystemID() + "-" + getSiteID() );
sb.append( " TRANSMIT:" + getTransmitChannelNumber() );
sb.append( " RECEIVE:" + getReceiveChannelNumber() );
sb.append( " " + SystemService.toString( getSystemServiceClass() ) );
sb.append( " " + mMessage.toString() );
return sb.toString();
}
public String getLocationRegistrationArea()
{
return mMessage.getHex( LRA, 2 );
}
public String getRFSubsystemID()
{
return mMessage.getHex( RFSS_ID, 2 );
}
public String getSiteID()
{
return mMessage.getHex( SITE_ID, 2 );
}
public int getTransmitIdentifier()
{
return mMessage.getInt( TRANSMIT_IDENTIFIER );
}
public String getTransmitChannel()
{
return getTransmitIdentifier() + "-" + getTransmitChannelNumber();
}
public int getTransmitChannelNumber()
{
return mMessage.getInt( TRANSMIT_CHANNEL );
}
public int getReceiveIdentifier()
{
return mMessage.getInt( RECEIVE_IDENTIFIER );
}
public String getReceiveChannel()
{
return getReceiveIdentifier() + "-" + getReceiveChannelNumber();
}
public int getReceiveChannelNumber()
{
return mMessage.getInt( RECEIVE_CHANNEL );
}
public int getSystemServiceClass()
{
return mMessage.getInt( SYSTEM_SERVICE_CLASS );
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
@Override
public String getMessage()
{
if( identifier == getTransmitIdentifier() )
{
mTransmitIdentifierUpdate = message;
}
if( identifier == getReceiveIdentifier() )
{
mReceiveIdentifierUpdate = message;
}
StringBuilder sb = new StringBuilder();
sb.append(getMessageStub());
sb.append(" LRA:" + getLocationRegistrationArea());
sb.append(" SITE:" + getRFSubsystemID() + "-" + getSiteID());
sb.append(" TRANSMIT:" + getTransmitChannelNumber());
sb.append(" RECEIVE:" + getReceiveChannelNumber());
sb.append(" " + SystemService.toString(getSystemServiceClass()));
sb.append(" " + mMessage.toString());
return sb.toString();
}
@Override
public String getLocationRegistrationArea()
{
return mMessage.getHex(LRA, 2);
}
public String getRFSubsystemID()
{
return mMessage.getHex(RFSS_ID, 2);
}
public String getSiteID()
{
return mMessage.getHex(SITE_ID, 2);
}
public int getTransmitIdentifier()
{
return mMessage.getInt(TRANSMIT_IDENTIFIER);
}
public String getTransmitChannel()
{
return getTransmitIdentifier() + "-" + getTransmitChannelNumber();
}
public int getTransmitChannelNumber()
{
return mMessage.getInt(TRANSMIT_CHANNEL);
}
public int getReceiveIdentifier()
{
return mMessage.getInt(RECEIVE_IDENTIFIER);
}
public String getReceiveChannel()
{
return getReceiveIdentifier() + "-" + getReceiveChannelNumber();
}
public int getReceiveChannelNumber()
{
return mMessage.getInt(RECEIVE_CHANNEL);
}
public int getSystemServiceClass()
{
return mMessage.getInt(SYSTEM_SERVICE_CLASS);
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if(identifier == getTransmitIdentifier())
{
mTransmitIdentifierUpdate = message;
}
if(identifier == getReceiveIdentifier())
{
mReceiveIdentifierUpdate = message;
}
}
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 2 ];
identifiers[ 0 ] = getTransmitIdentifier();
identifiers[ 1 ] = getReceiveIdentifier();
return identifiers;
int[] identifiers = new int[2];
identifiers[0] = getTransmitIdentifier();
identifiers[1] = getReceiveIdentifier();
return identifiers;
}
public long getDownlinkFrequency()
{
return calculateDownlink( mTransmitIdentifierUpdate, getTransmitChannelNumber() );
if(mTransmitIdentifierUpdate != null)
{
return mTransmitIdentifierUpdate.getDownlinkFrequency(getTransmitChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
return calculateUplink( mReceiveIdentifierUpdate, getReceiveChannelNumber() );
if(mReceiveIdentifierUpdate != null)
{
return mReceiveIdentifierUpdate.getUplinkFrequency(getReceiveChannelNumber());
}
return 0;
}
}

View File

@@ -1,3 +1,21 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.ldu.lc;
import module.decode.p25.message.IBandIdentifier;
@@ -6,151 +24,162 @@ import module.decode.p25.message.ldu.LDU1Message;
import module.decode.p25.message.tsbk.osp.control.SystemService;
import module.decode.p25.reference.LinkControlOpcode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SecondaryControlChannelBroadcast extends LDU1Message
implements IdentifierReceiver
public class SecondaryControlChannelBroadcast extends LDU1Message implements IdentifierReceiver
{
private final static Logger mLog =
LoggerFactory.getLogger( SecondaryControlChannelBroadcast.class );
public static final int[] RFSS_ID = {364, 365, 366, 367, 372, 373, 374, 375};
public static final int[] SITE_ID = {376, 377, 382, 383, 384, 385, 386, 387};
public static final int[] IDENTIFIER_A = {536, 537, 538, 539};
public static final int[] CHANNEL_A = {540, 541, 546, 547, 548, 549, 550, 551, 556, 557, 558, 559};
public static final int[] SYSTEM_SERVICE_CLASS_A = {560, 561, 566, 567, 568, 569, 570, 571};
public static final int[] IDENTIFIER_B = {720, 721, 722, 723};
public static final int[] CHANNEL_B = {724, 725, 730, 731, 732, 733, 734, 735, 740, 741, 742, 743};
public static final int[] SYSTEM_SERVICE_CLASS_B = {744, 745, 750, 751, 752, 753, 754, 755};
public static final int[] RFSS_ID = { 364,365,366,367,372,373,374,375 };
public static final int[] SITE_ID = { 376,377,382,383,384,385,386,387 };
public static final int[] IDENTIFIER_A = { 536,537,538,539 };
public static final int[] CHANNEL_A = { 540,541,546,547,548,549,550,551,
556,557,558,559 };
public static final int[] SYSTEM_SERVICE_CLASS_A = { 560,561,566,567,568,569,570,571 };
public static final int[] IDENTIFIER_B = { 720,721,722,723 };
public static final int[] CHANNEL_B = { 724,725,730,731,732,733,734,735,740,
741,742,743 };
public static final int[] SYSTEM_SERVICE_CLASS_B = { 744,745,750,751,752,753,754,755 };
private IBandIdentifier mIdentifierProviderA;
private IBandIdentifier mIdentifierProviderB;
public SecondaryControlChannelBroadcast(LDU1Message message)
{
super(message);
}
private IBandIdentifier mIdentifierProviderA;
private IBandIdentifier mIdentifierProviderB;
public SecondaryControlChannelBroadcast( LDU1Message message )
{
super( message );
}
@Override
public String getEventType()
{
return LinkControlOpcode.SECONDARY_CONTROL_CHANNEL_BROADCAST.getDescription();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " SITE:" + getRFSubsystemID() + "-" + getSiteID() );
sb.append( " CHAN A:" + getChannelA() );
sb.append( " " + SystemService.toString( getSystemServiceClassA() ) );
sb.append( " CHAN B:" + getChannelB() );
sb.append( " " + SystemService.toString( getSystemServiceClassB() ) );
return sb.toString();
}
public String getRFSubsystemID()
{
return mMessage.getHex( RFSS_ID, 2 );
}
public String getSiteID()
{
return mMessage.getHex( SITE_ID, 2 );
}
public int getIdentifierA()
{
return mMessage.getInt( IDENTIFIER_A );
}
public int getChannelA()
{
return mMessage.getInt( CHANNEL_A );
}
public String getChannelNumberA()
{
return getIdentifierA() + "-" + getChannelA();
}
public int getIdentifierB()
{
return mMessage.getInt( IDENTIFIER_B );
}
public int getChannelB()
{
return mMessage.getInt( CHANNEL_B );
}
public String getChannelNumberB()
{
return getIdentifierB() + "-" + getChannelB();
}
public int getSystemServiceClassA()
{
return mMessage.getInt( SYSTEM_SERVICE_CLASS_A );
}
public int getSystemServiceClassB()
{
return mMessage.getInt( SYSTEM_SERVICE_CLASS_B );
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
@Override
public String getMessage()
{
if( identifier == getIdentifierA() )
{
mIdentifierProviderA = message;
}
if( identifier == getIdentifierB() )
{
mIdentifierProviderB = message;
}
StringBuilder sb = new StringBuilder();
sb.append(getMessageStub());
sb.append(" SITE:" + getRFSubsystemID() + "-" + getSiteID());
sb.append(" CHAN A:" + getChannelA());
sb.append(" " + SystemService.toString(getSystemServiceClassA()));
sb.append(" CHAN B:" + getChannelB());
sb.append(" " + SystemService.toString(getSystemServiceClassB()));
return sb.toString();
}
@Override
public String getRFSubsystemID()
{
return mMessage.getHex(RFSS_ID, 2);
}
public String getSiteID()
{
return mMessage.getHex(SITE_ID, 2);
}
public int getIdentifierA()
{
return mMessage.getInt(IDENTIFIER_A);
}
public int getChannelA()
{
return mMessage.getInt(CHANNEL_A);
}
public String getChannelNumberA()
{
return getIdentifierA() + "-" + getChannelA();
}
public int getIdentifierB()
{
return mMessage.getInt(IDENTIFIER_B);
}
public int getChannelB()
{
return mMessage.getInt(CHANNEL_B);
}
public String getChannelNumberB()
{
return getIdentifierB() + "-" + getChannelB();
}
public int getSystemServiceClassA()
{
return mMessage.getInt(SYSTEM_SERVICE_CLASS_A);
}
public int getSystemServiceClassB()
{
return mMessage.getInt(SYSTEM_SERVICE_CLASS_B);
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if(identifier == getIdentifierA())
{
mIdentifierProviderA = message;
}
if(identifier == getIdentifierB())
{
mIdentifierProviderB = message;
}
}
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 2 ];
identifiers[ 0 ] = getIdentifierA();
identifiers[ 1 ] = getIdentifierB();
return identifiers;
int[] identifiers = new int[2];
identifiers[0] = getIdentifierA();
identifiers[1] = getIdentifierB();
return identifiers;
}
public long getDownlinkFrequencyA()
{
return calculateDownlink( mIdentifierProviderA, getChannelA() );
if(mIdentifierProviderA != null)
{
return mIdentifierProviderA.getDownlinkFrequency(getChannelA());
}
return 0;
}
public long getUplinkFrequencyA()
{
return calculateUplink( mIdentifierProviderA, getChannelA() );
if(mIdentifierProviderA != null)
{
return mIdentifierProviderA.getUplinkFrequency(getChannelA());
}
return 0;
}
public long getDownlinkFrequencyB()
{
return calculateDownlink( mIdentifierProviderB, getChannelB() );
if(mIdentifierProviderB != null)
{
return mIdentifierProviderB.getDownlinkFrequency(getChannelB());
}
return 0;
}
public long getUplinkFrequencyB()
{
return calculateUplink( mIdentifierProviderB, getChannelB() );
if(mIdentifierProviderB != null)
{
return mIdentifierProviderB.getUplinkFrequency(getChannelB());
}
return 0;
}
}

View File

@@ -1,3 +1,21 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.ldu.lc;
import module.decode.p25.message.IBandIdentifier;
@@ -6,136 +24,134 @@ import module.decode.p25.message.ldu.LDU1Message;
import module.decode.p25.message.tsbk.osp.control.SystemService;
import module.decode.p25.reference.LinkControlOpcode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SecondaryControlChannelBroadcastExplicit
extends LDU1Message implements IdentifierReceiver
public class SecondaryControlChannelBroadcastExplicit extends LDU1Message implements IdentifierReceiver
{
private final static Logger mLog =
LoggerFactory.getLogger( SecondaryControlChannelBroadcastExplicit.class );
public static final int[] RFSS_ID = {364, 365, 366, 367, 372, 373, 374, 375};
public static final int[] SITE_ID = {376, 377, 382, 383, 384, 385, 386, 387};
public static final int[] TRANSMIT_IDENTIFIER = {536, 537, 538, 539};
public static final int[] TRANSMIT_CHANNEL = {540, 541, 546, 547, 548, 549, 550, 551, 556, 557, 558, 559};
public static final int[] RECEIVE_IDENTIFIER = {560, 561, 566, 567};
public static final int[] RECEIVE_CHANNEL = {568, 569, 570, 571, 720, 721, 722, 723, 724, 725, 730, 731};
public static final int[] SYSTEM_SERVICE_CLASS = {732, 733, 734, 735, 740, 741, 742, 743};
private IBandIdentifier mTransmitIdentifierProvider;
private IBandIdentifier mReceiveIdentifierProvider;
public SecondaryControlChannelBroadcastExplicit(LDU1Message message)
{
super(message);
}
public static final int[] RFSS_ID = { 364,365,366,367,372,373,374,375 };
public static final int[] SITE_ID = { 376,377,382,383,384,385,386,387 };
public static final int[] TRANSMIT_IDENTIFIER = { 536,537,538,539 };
public static final int[] TRANSMIT_CHANNEL = { 540,541,546,547,548,549,550,
551,556,557,558,559 };
public static final int[] RECEIVE_IDENTIFIER = { 560,561,566,567 };
public static final int[] RECEIVE_CHANNEL = { 568,569,570,571,720,721,722,
723,724,725,730,731 };
public static final int[] SYSTEM_SERVICE_CLASS = { 732,733,734,735,740,741,
742,743 };
private IBandIdentifier mTransmitIdentifierProvider;
private IBandIdentifier mReceiveIdentifierProvider;
public SecondaryControlChannelBroadcastExplicit( LDU1Message message )
{
super( message );
}
@Override
public String getEventType()
{
return LinkControlOpcode.SECONDARY_CONTROL_CHANNEL_BROADCAST_EXPLICIT.getDescription();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " SITE:" + getRFSubsystemID() + "-" + getSiteID() );
sb.append( " TRANSMIT:" + getTransmitChannel() );
sb.append( " RECEIVE:" + getReceiveChannel() );
sb.append( " " + SystemService.toString( getSystemServiceClass() ) );
return sb.toString();
}
public String getRFSubsystemID()
{
return mMessage.getHex( RFSS_ID, 2 );
}
public String getSiteID()
{
return mMessage.getHex( SITE_ID, 2 );
}
public int getTransmitIdentifier()
{
return mMessage.getInt( TRANSMIT_IDENTIFIER );
}
public int getTransmitChannelNumber()
{
return mMessage.getInt( TRANSMIT_CHANNEL );
}
public String getTransmitChannel()
{
return getTransmitIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveIdentifier()
{
return mMessage.getInt( RECEIVE_IDENTIFIER );
}
public int getReceiveChannelNumber()
{
return mMessage.getInt( RECEIVE_CHANNEL );
}
public String getReceiveChannel()
{
return getReceiveIdentifier() + "-" + getReceiveChannelNumber();
}
public int getSystemServiceClass()
{
return mMessage.getInt( SYSTEM_SERVICE_CLASS );
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
@Override
public String getMessage()
{
if( identifier == getTransmitIdentifier() )
{
mTransmitIdentifierProvider = message;
}
if( identifier == getReceiveIdentifier() )
{
mReceiveIdentifierProvider = message;
}
StringBuilder sb = new StringBuilder();
sb.append(getMessageStub());
sb.append(" SITE:" + getRFSubsystemID() + "-" + getSiteID());
sb.append(" TRANSMIT:" + getTransmitChannel());
sb.append(" RECEIVE:" + getReceiveChannel());
sb.append(" " + SystemService.toString(getSystemServiceClass()));
return sb.toString();
}
@Override
public String getRFSubsystemID()
{
return mMessage.getHex(RFSS_ID, 2);
}
public String getSiteID()
{
return mMessage.getHex(SITE_ID, 2);
}
public int getTransmitIdentifier()
{
return mMessage.getInt(TRANSMIT_IDENTIFIER);
}
public int getTransmitChannelNumber()
{
return mMessage.getInt(TRANSMIT_CHANNEL);
}
public String getTransmitChannel()
{
return getTransmitIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveIdentifier()
{
return mMessage.getInt(RECEIVE_IDENTIFIER);
}
public int getReceiveChannelNumber()
{
return mMessage.getInt(RECEIVE_CHANNEL);
}
public String getReceiveChannel()
{
return getReceiveIdentifier() + "-" + getReceiveChannelNumber();
}
public int getSystemServiceClass()
{
return mMessage.getInt(SYSTEM_SERVICE_CLASS);
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if(identifier == getTransmitIdentifier())
{
mTransmitIdentifierProvider = message;
}
if(identifier == getReceiveIdentifier())
{
mReceiveIdentifierProvider = message;
}
}
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 2 ];
identifiers[ 0 ] = getTransmitIdentifier();
identifiers[ 1 ] = getReceiveIdentifier();
return identifiers;
int[] identifiers = new int[2];
identifiers[0] = getTransmitIdentifier();
identifiers[1] = getReceiveIdentifier();
return identifiers;
}
public long getDownlinkFrequency()
{
return calculateDownlink( mTransmitIdentifierProvider,
getTransmitChannelNumber() );
if(mTransmitIdentifierProvider != null)
{
return mTransmitIdentifierProvider.getDownlinkFrequency(getTransmitChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
return calculateUplink( mReceiveIdentifierProvider,
getReceiveChannelNumber() );
if(mReceiveIdentifierProvider != null)
{
return mReceiveIdentifierProvider.getUplinkFrequency(getReceiveChannelNumber());
}
return 0;
}
}

View File

@@ -1,199 +1,220 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.pdu;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.reference.DataUnitID;
import alias.AliasList;
import bits.BinaryMessage;
import edac.CRCP25;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.reference.DataUnitID;
public abstract class UnitToUnitChannelGrantExtended extends PDUMessage
implements IdentifierReceiver
public abstract class UnitToUnitChannelGrantExtended extends PDUMessage implements IdentifierReceiver
{
/* Service Options */
public static final int EMERGENCY_FLAG = 128;
public static final int ENCRYPTED_CHANNEL_FLAG = 129;
public static final int DUPLEX_MODE = 130;
public static final int SESSION_MODE = 131;
public static final int[] SOURCE_ADDRESS = { 88,89,90,91,92,93,94,95,96,97,
98,99,100,101,102,103,104,105,106,107,108,109,110,111 };
public static final int[] SERVICE_OPTIONS = { 128,129,130,131,132,133,134,
135 };
public static final int[] SOURCE_WACN = { 160,161,162,163,164,165,166,167,
168,169,170,171,172,173,174,175,176,177,178,179 };
public static final int[] SOURCE_SYSTEM_ID = { 180,181,182,183,184,185,186,
187,188,189,190,191 };
public static final int[] SOURCE_ID = { 192,193,194,195,196,197,198,199,200,
201,202,203,204,205,206,207,208,209,210,211,212,213,214,215 };
public static final int[] TARGET_ADDRESS = { 216,217,218,219,220,221,222,
223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239 };
public static final int[] TRANSMIT_IDENTIFIER = { 240,241,242,243 };
public static final int[] TRANSMIT_NUMBER = { 244,245,246,247,248,249,250,
251,252,253,254,255 };
public static final int[] RECEIVE_IDENTIFIER = { 256,257,258,259 };
public static final int[] RECEIVE_NUMBER = { 260,261,262,263,264,265,266,
267,268,269,270,271 };
public static final int[] MULTIPLE_BLOCK_CRC = { 320,321,322,323,324,325,
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 };
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public UnitToUnitChannelGrantExtended( BinaryMessage message,
DataUnitID duid, AliasList aliasList )
public static final int[] SOURCE_ADDRESS = {88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
105, 106, 107, 108, 109, 110, 111};
public static final int[] SERVICE_OPTIONS = {128, 129, 130, 131, 132, 133, 134, 135};
public static final int[] SOURCE_WACN = {160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174,
175, 176, 177, 178, 179};
public static final int[] SOURCE_SYSTEM_ID = {180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191};
public static final int[] SOURCE_ID = {192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206,
207, 208, 209, 210, 211, 212, 213, 214, 215};
public static final int[] TARGET_ADDRESS = {216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229,
230, 231, 232, 233, 234, 235, 236, 237, 238, 239};
public static final int[] TRANSMIT_IDENTIFIER = {240, 241, 242, 243};
public static final int[] TRANSMIT_NUMBER = {244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255};
public static final int[] RECEIVE_IDENTIFIER = {256, 257, 258, 259};
public static final int[] RECEIVE_NUMBER = {260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271};
public static final int[] MULTIPLE_BLOCK_CRC = {320, 321, 322, 323, 324, 325, 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};
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public UnitToUnitChannelGrantExtended(BinaryMessage message, DataUnitID duid, AliasList aliasList)
{
super( message, duid, aliasList );
super(message, duid, aliasList);
/* Header block is already error detected/corrected - perform error
* detection correction on the intermediate and final data blocks */
mMessage = CRCP25.correctPDU2( mMessage );
mCRC[ 1 ] = mMessage.getCRC();
* detection correction on the intermediate and final data blocks */
mMessage = CRCP25.correctPDU2(mMessage);
mCRC[1] = mMessage.getCRC();
}
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
if( isEmergency() )
sb.append(getMessageStub());
if(isEmergency())
{
sb.append( " EMERGENCY" );
sb.append(" EMERGENCY");
}
sb.append( " FROM ADDR:" );
sb.append( getSourceAddress() );
sb.append( " ID:" );
sb.append( getSourceID() );
sb.append( " TO:" );
sb.append( getTargetAddress() );
sb.append( " WACN:" );
sb.append( getSourceWACN() );
sb.append( " SYS:" );
sb.append( getSourceSystemID() );
sb.append( " CHAN DN:" + getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber() );
sb.append( " " + getDownlinkFrequency() );
sb.append( " CHAN UP:" + getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber() );
sb.append( " " + getUplinkFrequency() );
sb.append(" FROM ADDR:");
sb.append(getSourceAddress());
sb.append(" ID:");
sb.append(getSourceID());
sb.append(" TO:");
sb.append(getTargetAddress());
sb.append(" WACN:");
sb.append(getSourceWACN());
sb.append(" SYS:");
sb.append(getSourceSystemID());
sb.append(" CHAN DN:" + getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber());
sb.append(" " + getDownlinkFrequency());
sb.append(" CHAN UP:" + getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber());
sb.append(" " + getUplinkFrequency());
return sb.toString();
}
public boolean isEmergency()
{
return mMessage.get( EMERGENCY_FLAG );
return mMessage.get(EMERGENCY_FLAG);
}
public boolean isEncrypted()
{
return mMessage.get( ENCRYPTED_CHANNEL_FLAG );
return mMessage.get(ENCRYPTED_CHANNEL_FLAG);
}
public DuplexMode getDuplexMode()
{
return mMessage.get( DUPLEX_MODE ) ? DuplexMode.FULL : DuplexMode.HALF;
return mMessage.get(DUPLEX_MODE) ? DuplexMode.FULL : DuplexMode.HALF;
}
public SessionMode getSessionMode()
{
return mMessage.get( SESSION_MODE ) ?
SessionMode.CIRCUIT : SessionMode.PACKET;
return mMessage.get(SESSION_MODE) ?
SessionMode.CIRCUIT : SessionMode.PACKET;
}
public String getSourceAddress()
{
return mMessage.getHex( SOURCE_ADDRESS, 6 );
}
public String getSourceID()
{
return mMessage.getHex( SOURCE_ID, 6 );
}
public String getSourceWACN()
{
return mMessage.getHex( SOURCE_WACN, 5 );
}
public String getSourceSystemID()
{
return mMessage.getHex( SOURCE_SYSTEM_ID, 3 );
}
public String getTargetAddress()
{
return mMessage.getHex( TARGET_ADDRESS, 6 );
}
public int getTransmitChannelIdentifier()
{
return mMessage.getInt( TRANSMIT_IDENTIFIER );
}
public int getTransmitChannelNumber()
{
return mMessage.getInt( TRANSMIT_NUMBER );
}
public String getTransmitChannel()
{
return getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveChannelIdentifier()
{
return mMessage.getInt( RECEIVE_IDENTIFIER );
}
public int getReceiveChannelNumber()
{
return mMessage.getInt( RECEIVE_NUMBER );
}
public String getReceiveChannel()
{
return getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber();
}
public long getDownlinkFrequency()
{
return calculateDownlink( mTransmitIdentifierUpdate, getTransmitChannelNumber() );
}
public long getUplinkFrequency()
{
return calculateUplink( mReceiveIdentifierUpdate, getReceiveChannelNumber() );
return mMessage.getHex(SOURCE_ADDRESS, 6);
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
public String getSourceID()
{
if( identifier == getTransmitChannelIdentifier() )
{
mTransmitIdentifierUpdate = message;
}
if( identifier == getReceiveChannelIdentifier() )
{
mReceiveIdentifierUpdate = message;
}
return mMessage.getHex(SOURCE_ID, 6);
}
public String getSourceWACN()
{
return mMessage.getHex(SOURCE_WACN, 5);
}
public String getSourceSystemID()
{
return mMessage.getHex(SOURCE_SYSTEM_ID, 3);
}
public String getTargetAddress()
{
return mMessage.getHex(TARGET_ADDRESS, 6);
}
public int getTransmitChannelIdentifier()
{
return mMessage.getInt(TRANSMIT_IDENTIFIER);
}
public int getTransmitChannelNumber()
{
return mMessage.getInt(TRANSMIT_NUMBER);
}
public String getTransmitChannel()
{
return getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveChannelIdentifier()
{
return mMessage.getInt(RECEIVE_IDENTIFIER);
}
public int getReceiveChannelNumber()
{
return mMessage.getInt(RECEIVE_NUMBER);
}
public String getReceiveChannel()
{
return getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber();
}
public long getDownlinkFrequency()
{
if(mTransmitIdentifierUpdate != null)
{
return mTransmitIdentifierUpdate.getDownlinkFrequency(getTransmitChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
if(mReceiveIdentifierUpdate != null)
{
return mReceiveIdentifierUpdate.getUplinkFrequency(getReceiveChannelNumber());
}
return 0;
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if(identifier == getTransmitChannelIdentifier())
{
mTransmitIdentifierUpdate = message;
}
if(identifier == getReceiveChannelIdentifier())
{
mReceiveIdentifierUpdate = message;
}
}
public int[] getIdentifiers()
{
int[] idens = new int[2];
idens[0] = getTransmitChannelIdentifier();
idens[1] = getReceiveChannelIdentifier();
return idens;
}
public int[] getIdentifiers()
{
int[] idens = new int[ 2 ];
idens[ 0 ] = getTransmitChannelIdentifier();
idens[ 1 ] = getReceiveChannelIdentifier();
return idens;
}
}

View File

@@ -1,5 +1,26 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.pdu.osp.control;
import alias.AliasList;
import bits.BinaryMessage;
import edac.CRCP25;
import module.decode.p25.message.IAdjacentSite;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
@@ -7,43 +28,32 @@ import module.decode.p25.message.pdu.PDUMessage;
import module.decode.p25.message.tsbk.osp.control.SystemService;
import module.decode.p25.reference.DataUnitID;
import module.decode.p25.reference.Opcode;
import alias.AliasList;
import bits.BinaryMessage;
import edac.CRCP25;
public class AdjacentStatusBroadcastExtended extends PDUMessage
implements IdentifierReceiver, IAdjacentSite
public class AdjacentStatusBroadcastExtended extends PDUMessage implements IdentifierReceiver, IAdjacentSite
{
public static final int[] LRA = { 88,89,90,91,92,93,94,95 };
public static final int[] SYSTEM_ID = { 100,101,102,103,104,105,106,107,108,
109,110,111 };
public static final int[] RF_SUBSYSTEM_ID = { 128,129,130,131,132,133,134,
135 };
public static final int[] SITE_ID = { 136,137,138,139,140,141,142,143 };
public static final int[] TRANSMIT_IDENTIFIER = { 160,161,162,163 };
public static final int[] TRANSMIT_CHANNEL = { 164,165,166,167,168,169,170,
171,172,173,174,175 };
public static final int[] RECEIVE_IDENTIFIER = { 176,177,178,179 };
public static final int[] RECEIVE_CHANNEL = { 180,181,182,183,184,185,186,
187,188,189,190,191 };
public static final int[] SYSTEM_SERVICE_CLASS = { 192,193,194,195,196,197,
198,199 };
public static final int[] MULTIPLE_BLOCK_CRC = { 224,225,226,227,228,229,
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 };
private IBandIdentifier mTransmitIdentifierProvider;
private IBandIdentifier mReceiveIdentifierProvider;
public AdjacentStatusBroadcastExtended( BinaryMessage message,
DataUnitID duid, AliasList aliasList )
public static final int[] LRA = {88, 89, 90, 91, 92, 93, 94, 95};
public static final int[] SYSTEM_ID = {100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111};
public static final int[] RF_SUBSYSTEM_ID = {128, 129, 130, 131, 132, 133, 134, 135};
public static final int[] SITE_ID = {136, 137, 138, 139, 140, 141, 142, 143};
public static final int[] TRANSMIT_IDENTIFIER = {160, 161, 162, 163};
public static final int[] TRANSMIT_CHANNEL = {164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175};
public static final int[] RECEIVE_IDENTIFIER = {176, 177, 178, 179};
public static final int[] RECEIVE_CHANNEL = {180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191};
public static final int[] SYSTEM_SERVICE_CLASS = {192, 193, 194, 195, 196, 197, 198, 199};
public static final int[] MULTIPLE_BLOCK_CRC = {224, 225, 226, 227, 228, 229, 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};
private IBandIdentifier mTransmitIdentifierProvider;
private IBandIdentifier mReceiveIdentifierProvider;
public AdjacentStatusBroadcastExtended(BinaryMessage message, DataUnitID duid, AliasList aliasList)
{
super( message, duid, aliasList );
super(message, duid, aliasList);
/* Header block is already error detected/corrected - perform error
* detection correction on the intermediate and final data blocks */
mMessage = CRCP25.correctPDU1( mMessage );
mCRC[ 1 ] = mMessage.getCRC();
* detection correction on the intermediate and final data blocks */
mMessage = CRCP25.correctPDU1(mMessage);
mCRC[1] = mMessage.getCRC();
}
@Override
@@ -51,138 +61,148 @@ public class AdjacentStatusBroadcastExtended extends PDUMessage
{
return Opcode.ADJACENT_STATUS_BROADCAST.getDescription();
}
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " LRA:" + getLRA() );
sb.append( " SYS:" + getSystemID() );
sb.append( " RFSS:" + getRFSS() );
sb.append( " SITE:" + getSiteID() );
sb.append(getMessageStub());
sb.append( " CTRL CHAN:" + getTransmitIdentifier() + "-" + getTransmitChannel() );
sb.append(" LRA:" + getLRA());
sb.append( " DN:" + getDownlinkFrequency() );
sb.append(" SYS:" + getSystemID());
sb.append( " " + getReceiveIdentifier() + "-" + getReceiveChannel() );
sb.append(" RFSS:" + getRFSS());
sb.append(" SITE:" + getSiteID());
sb.append(" CTRL CHAN:" + getTransmitIdentifier() + "-" + getTransmitChannel());
sb.append(" DN:" + getDownlinkFrequency());
sb.append(" " + getReceiveIdentifier() + "-" + getReceiveChannel());
sb.append(" UP:" + getUplinkFrequency());
sb.append(" SYS SVC CLASS:" + getSystemServiceClass());
sb.append( " UP:" + getUplinkFrequency() );
sb.append( " SYS SVC CLASS:" + getSystemServiceClass() );
return sb.toString();
}
public String getUniqueID()
{
StringBuilder sb = new StringBuilder();
sb.append( getSystemID() );
sb.append( ":" );
sb.append( getRFSS() );
sb.append( ":" );
sb.append( getSiteID() );
return sb.toString();
StringBuilder sb = new StringBuilder();
sb.append(getSystemID());
sb.append(":");
sb.append(getRFSS());
sb.append(":");
sb.append(getSiteID());
return sb.toString();
}
public String getSystemID()
{
return mMessage.getHex( SYSTEM_ID, 3 );
}
public String getSiteID()
{
return mMessage.getHex( SITE_ID, 2 );
}
public int getTransmitIdentifier()
{
return mMessage.getInt( TRANSMIT_IDENTIFIER );
}
public int getTransmitChannel()
{
return mMessage.getInt( TRANSMIT_CHANNEL );
}
public int getReceiveIdentifier()
{
return mMessage.getInt( RECEIVE_IDENTIFIER );
}
public int getReceiveChannel()
{
return mMessage.getInt( RECEIVE_CHANNEL );
}
public String getSystemID()
{
return mMessage.getHex(SYSTEM_ID, 3);
}
public String getSiteID()
{
return mMessage.getHex(SITE_ID, 2);
}
public int getTransmitIdentifier()
{
return mMessage.getInt(TRANSMIT_IDENTIFIER);
}
public int getTransmitChannel()
{
return mMessage.getInt(TRANSMIT_CHANNEL);
}
public int getReceiveIdentifier()
{
return mMessage.getInt(RECEIVE_IDENTIFIER);
}
public int getReceiveChannel()
{
return mMessage.getInt(RECEIVE_CHANNEL);
}
public long getDownlinkFrequency()
{
return calculateDownlink( mTransmitIdentifierProvider, getTransmitChannel() );
if(mTransmitIdentifierProvider != null)
{
return mTransmitIdentifierProvider.getDownlinkFrequency(getTransmitChannel());
}
return 0;
}
public long getUplinkFrequency()
{
return calculateUplink( mReceiveIdentifierProvider, getReceiveChannel() );
if(mReceiveIdentifierProvider != null)
{
return mReceiveIdentifierProvider.getUplinkFrequency(getReceiveChannel());
}
return 0;
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if( identifier == getTransmitIdentifier() )
{
mTransmitIdentifierProvider = message;
}
if( identifier == getReceiveIdentifier() )
{
mReceiveIdentifierProvider = message;
}
if(identifier == getTransmitIdentifier())
{
mTransmitIdentifierProvider = message;
}
if(identifier == getReceiveIdentifier())
{
mReceiveIdentifierProvider = message;
}
}
public int[] getIdentifiers()
{
int[] idens = new int[ 2 ];
idens[ 0 ] = getTransmitIdentifier();
idens[ 1 ] = getReceiveIdentifier();
return idens;
}
@Override
public String getRFSS()
{
return mMessage.getHex( RF_SUBSYSTEM_ID, 2 );
}
public int[] getIdentifiers()
{
int[] idens = new int[2];
@Override
public String getLRA()
{
return mMessage.getHex( LRA, 2 );
}
idens[0] = getTransmitIdentifier();
idens[1] = getReceiveIdentifier();
@Override
public String getSystemServiceClass()
{
return SystemService.toString( mMessage.getInt( SYSTEM_SERVICE_CLASS ) );
}
return idens;
}
@Override
public String getDownlinkChannel()
{
return getTransmitIdentifier() + "-" + getTransmitChannel();
}
@Override
public String getRFSS()
{
return mMessage.getHex(RF_SUBSYSTEM_ID, 2);
}
@Override
public String getUplinkChannel()
{
return getReceiveIdentifier() + "-" + getReceiveChannel();
}
@Override
public String getLRA()
{
return mMessage.getHex(LRA, 2);
}
@Override
public String getSystemServiceClass()
{
return SystemService.toString(mMessage.getInt(SYSTEM_SERVICE_CLASS));
}
@Override
public String getDownlinkChannel()
{
return getTransmitIdentifier() + "-" + getTransmitChannel();
}
@Override
public String getUplinkChannel()
{
return getReceiveIdentifier() + "-" + getReceiveChannel();
}
}

View File

@@ -1,5 +1,26 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.pdu.osp.control;
import alias.AliasList;
import bits.BinaryMessage;
import edac.CRCP25;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.pdu.PDUMessage;
@@ -7,42 +28,32 @@ import module.decode.p25.message.tsbk.osp.control.SystemService;
import module.decode.p25.reference.DataUnitID;
import module.decode.p25.reference.Opcode;
import module.decode.p25.reference.P25NetworkCallsign;
import alias.AliasList;
import bits.BinaryMessage;
import edac.CRCP25;
public class NetworkStatusBroadcastExtended extends PDUMessage
implements IdentifierReceiver
public class NetworkStatusBroadcastExtended extends PDUMessage implements IdentifierReceiver
{
public static final int[] LRA = { 88,89,90,91,92,93,94,95 };
public static final int[] SYSTEM_ID = { 100,101,102,103,104,105,106,107,108,
109,110,111 };
public static final int[] WACN = { 160,161,162,163,164,165,166,167,168,169,
170,171,172,173,174,175,176,177,178,179 };
public static final int[] TRANSMIT_IDENTIFIER = { 184,185,186,187 };
public static final int[] TRANSMIT_CHANNEL = { 188,189,190,191,192,193,194,
195,196,197,198,199 };
public static final int[] RECEIVE_IDENTIFIER = { 200,201,202,203 };
public static final int[] RECEIVE_CHANNEL = { 204,205,206,207,208,209,210,
211,212,213,214,215 };
public static final int[] SYSTEM_SERVICE_CLASS = { 216,217,218,219,220,221,
222,223 };
public static final int[] MULTIPLE_BLOCK_CRC = { 224,225,226,227,228,229,
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 };
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public NetworkStatusBroadcastExtended( BinaryMessage message,
DataUnitID duid, AliasList aliasList )
public static final int[] LRA = {88, 89, 90, 91, 92, 93, 94, 95};
public static final int[] SYSTEM_ID = {100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111};
public static final int[] WACN = {160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
176, 177, 178, 179};
public static final int[] TRANSMIT_IDENTIFIER = {184, 185, 186, 187};
public static final int[] TRANSMIT_CHANNEL = {188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199};
public static final int[] RECEIVE_IDENTIFIER = {200, 201, 202, 203};
public static final int[] RECEIVE_CHANNEL = {204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215};
public static final int[] SYSTEM_SERVICE_CLASS = {216, 217, 218, 219, 220, 221, 222, 223};
public static final int[] MULTIPLE_BLOCK_CRC = {224, 225, 226, 227, 228, 229, 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};
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public NetworkStatusBroadcastExtended(BinaryMessage message, DataUnitID duid, AliasList aliasList)
{
super( message, duid, aliasList );
super(message, duid, aliasList);
/* Header block is already error detected/corrected - perform error
* detection correction on the intermediate and final data blocks */
mMessage = CRCP25.correctPDU1( mMessage );
mCRC[ 1 ] = mMessage.getCRC();
* detection correction on the intermediate and final data blocks */
mMessage = CRCP25.correctPDU1(mMessage);
mCRC[1] = mMessage.getCRC();
}
@Override
@@ -50,111 +61,121 @@ public class NetworkStatusBroadcastExtended extends PDUMessage
{
return Opcode.NETWORK_STATUS_BROADCAST.getDescription();
}
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " LRA:" + getLocationRegistrationArea() );
sb.append( " WACN:" + getWACN() );
sb.append( " SYS:" + getSystemID() );
sb.append( " CTRL CHAN:" + getReceiveIdentifier() + "-" + getReceiveChannel() );
sb.append( " DN:" + getDownlinkFrequency() );
sb.append( " " + getTransmitIdentifier() + "-" + getTransmitChannel() );
sb.append( " UP:" + getUplinkFrequency() );
sb.append( " SYS SVC CLASS:" +
SystemService.toString( getSystemServiceClass() ) );
sb.append(getMessageStub());
sb.append(" LRA:" + getLocationRegistrationArea());
sb.append(" WACN:" + getWACN());
sb.append(" SYS:" + getSystemID());
sb.append(" CTRL CHAN:" + getReceiveIdentifier() + "-" + getReceiveChannel());
sb.append(" DN:" + getDownlinkFrequency());
sb.append(" " + getTransmitIdentifier() + "-" + getTransmitChannel());
sb.append(" UP:" + getUplinkFrequency());
sb.append(" SYS SVC CLASS:" +
SystemService.toString(getSystemServiceClass()));
return sb.toString();
}
public String getLocationRegistrationArea()
{
return mMessage.getHex( LRA, 2 );
}
public String getSystemID()
{
return mMessage.getHex( SYSTEM_ID, 3 );
}
public String getWACN()
{
return mMessage.getHex( WACN, 5 );
}
public String getNetworkCallsign()
{
return P25NetworkCallsign.getCallsign( mMessage.getInt( WACN ),
mMessage.getInt( SYSTEM_ID ) );
}
public int getTransmitIdentifier()
{
return mMessage.getInt( TRANSMIT_IDENTIFIER );
}
public int getTransmitChannel()
{
return mMessage.getInt( TRANSMIT_CHANNEL );
}
public int getReceiveIdentifier()
{
return mMessage.getInt( RECEIVE_IDENTIFIER );
}
public int getReceiveChannel()
{
return mMessage.getInt( RECEIVE_CHANNEL );
}
public int getSystemServiceClass()
public String getLocationRegistrationArea()
{
return mMessage.getInt( SYSTEM_SERVICE_CLASS );
}
public long getDownlinkFrequency()
{
return calculateDownlink( mTransmitIdentifierUpdate, getTransmitChannel() );
}
public long getUplinkFrequency()
{
return calculateUplink( mReceiveIdentifierUpdate, getReceiveChannel() );
return mMessage.getHex(LRA, 2);
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
public String getSystemID()
{
if( identifier == getTransmitIdentifier() )
{
mTransmitIdentifierUpdate = message;
}
if( identifier == getReceiveIdentifier() )
{
mReceiveIdentifierUpdate = message;
}
return mMessage.getHex(SYSTEM_ID, 3);
}
public String getWACN()
{
return mMessage.getHex(WACN, 5);
}
public String getNetworkCallsign()
{
return P25NetworkCallsign.getCallsign(mMessage.getInt(WACN),
mMessage.getInt(SYSTEM_ID));
}
public int getTransmitIdentifier()
{
return mMessage.getInt(TRANSMIT_IDENTIFIER);
}
public int getTransmitChannel()
{
return mMessage.getInt(TRANSMIT_CHANNEL);
}
public int getReceiveIdentifier()
{
return mMessage.getInt(RECEIVE_IDENTIFIER);
}
public int getReceiveChannel()
{
return mMessage.getInt(RECEIVE_CHANNEL);
}
public int getSystemServiceClass()
{
return mMessage.getInt(SYSTEM_SERVICE_CLASS);
}
public long getDownlinkFrequency()
{
if(mTransmitIdentifierUpdate != null)
{
return mTransmitIdentifierUpdate.getDownlinkFrequency(getTransmitChannel());
}
return 0;
}
public long getUplinkFrequency()
{
if(mReceiveIdentifierUpdate != null)
{
return mReceiveIdentifierUpdate.getUplinkFrequency(getReceiveChannel());
}
return 0;
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if(identifier == getTransmitIdentifier())
{
mTransmitIdentifierUpdate = message;
}
if(identifier == getReceiveIdentifier())
{
mReceiveIdentifierUpdate = message;
}
}
public int[] getIdentifiers()
{
int[] idens = new int[2];
idens[0] = getTransmitIdentifier();
idens[1] = getReceiveIdentifier();
return idens;
}
public int[] getIdentifiers()
{
int[] idens = new int[ 2 ];
idens[ 0 ] = getTransmitIdentifier();
idens[ 1 ] = getReceiveIdentifier();
return idens;
}
}

View File

@@ -1,48 +1,59 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.pdu.osp.control;
import alias.AliasList;
import bits.BinaryMessage;
import edac.CRCP25;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.pdu.PDUMessage;
import module.decode.p25.message.tsbk.osp.control.SystemService;
import module.decode.p25.reference.DataUnitID;
import module.decode.p25.reference.Opcode;
import alias.AliasList;
import bits.BinaryMessage;
import edac.CRCP25;
public class RFSSStatusBroadcastExtended extends PDUMessage
implements IdentifierReceiver
public class RFSSStatusBroadcastExtended extends PDUMessage implements IdentifierReceiver
{
public static final int[] LRA = { 88,89,90,91,92,93,94,95 };
public static final int ACTIVE_NETWORK_CONNECTION_INDICATOR = 99;
public static final int[] SYSTEM_ID = { 100,101,102,103,104,105,106,107,108,
109,110,111 };
public static final int[] RFSS_ID = { 160,161,162,163,164,165,166,167 };
public static final int[] SITE_ID = { 168,169,170,171,172,173,174,175 };
public static final int[] TRANSMIT_IDENTIFIER = { 184,185,186,187 };
public static final int[] TRANSMIT_CHANNEL = { 188,189,190,191,192,193,194,
195,196,197,198,199 };
public static final int[] RECEIVE_IDENTIFIER = { 200,201,202,203 };
public static final int[] RECEIVE_CHANNEL = { 204,205,206,207,208,209,210,
211,212,213,214,215 };
public static final int[] SYSTEM_SERVICE_CLASS = { 216,217,218,219,220,221,
222,223 };
public static final int[] MULTIPLE_BLOCK_CRC = { 224,225,226,227,228,229,
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 };
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public RFSSStatusBroadcastExtended( BinaryMessage message,
DataUnitID duid, AliasList aliasList )
public static final int[] LRA = {88, 89, 90, 91, 92, 93, 94, 95};
public static final int ACTIVE_NETWORK_CONNECTION_INDICATOR = 99;
public static final int[] SYSTEM_ID = {100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111};
public static final int[] RFSS_ID = {160, 161, 162, 163, 164, 165, 166, 167};
public static final int[] SITE_ID = {168, 169, 170, 171, 172, 173, 174, 175};
public static final int[] TRANSMIT_IDENTIFIER = {184, 185, 186, 187};
public static final int[] TRANSMIT_CHANNEL = {188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199};
public static final int[] RECEIVE_IDENTIFIER = {200, 201, 202, 203};
public static final int[] RECEIVE_CHANNEL = {204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215};
public static final int[] SYSTEM_SERVICE_CLASS = {216, 217, 218, 219, 220, 221, 222, 223};
public static final int[] MULTIPLE_BLOCK_CRC = {224, 225, 226, 227, 228, 229, 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};
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public RFSSStatusBroadcastExtended(BinaryMessage message, DataUnitID duid, AliasList aliasList)
{
super( message, duid, aliasList );
super(message, duid, aliasList);
/* Header block is already error detected/corrected - perform error
* detection correction on the intermediate and final data blocks */
mMessage = CRCP25.correctPDU1( mMessage );
mCRC[ 1 ] = mMessage.getCRC();
* detection correction on the intermediate and final data blocks */
mMessage = CRCP25.correctPDU1(mMessage);
mCRC[1] = mMessage.getCRC();
}
@Override
@@ -50,115 +61,125 @@ public class RFSSStatusBroadcastExtended extends PDUMessage
{
return Opcode.NETWORK_STATUS_BROADCAST.getDescription();
}
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " LRA:" + getLocationRegistrationArea() );
sb.append( " SYS:" + getSystemID() );
sb.append( " SITE:" + getRFSubsystemID() + "-" + getSiteID() );
sb.append( " CTRL CHAN:" + getReceiveIdentifier() + "-" + getReceiveChannel() );
sb.append( " DN:" + getDownlinkFrequency() );
sb.append( " " + getTransmitIdentifier() + "-" + getTransmitChannel() );
sb.append( " UP:" + getUplinkFrequency() );
sb.append( " SYS SVC CLASS:" +
SystemService.toString( getSystemServiceClass() ) );
sb.append(getMessageStub());
sb.append(" LRA:" + getLocationRegistrationArea());
sb.append(" SYS:" + getSystemID());
sb.append(" SITE:" + getRFSubsystemID() + "-" + getSiteID());
sb.append(" CTRL CHAN:" + getReceiveIdentifier() + "-" + getReceiveChannel());
sb.append(" DN:" + getDownlinkFrequency());
sb.append(" " + getTransmitIdentifier() + "-" + getTransmitChannel());
sb.append(" UP:" + getUplinkFrequency());
sb.append(" SYS SVC CLASS:" +
SystemService.toString(getSystemServiceClass()));
return sb.toString();
}
public String getLocationRegistrationArea()
{
return mMessage.getHex( LRA, 2 );
}
public boolean hasActiveNetworkConnection()
{
return mMessage.get( ACTIVE_NETWORK_CONNECTION_INDICATOR );
}
public String getSystemID()
{
return mMessage.getHex( SYSTEM_ID, 3 );
}
public String getRFSubsystemID()
{
return mMessage.getHex( RFSS_ID, 2 );
}
public String getSiteID()
{
return mMessage.getHex( SITE_ID, 2 );
}
public int getTransmitIdentifier()
{
return mMessage.getInt( TRANSMIT_IDENTIFIER );
}
public int getTransmitChannel()
{
return mMessage.getInt( TRANSMIT_CHANNEL );
}
public int getReceiveIdentifier()
{
return mMessage.getInt( RECEIVE_IDENTIFIER );
}
public int getReceiveChannel()
{
return mMessage.getInt( RECEIVE_CHANNEL );
}
public int getSystemServiceClass()
public String getLocationRegistrationArea()
{
return mMessage.getInt( SYSTEM_SERVICE_CLASS );
}
public long getDownlinkFrequency()
{
return calculateDownlink( mTransmitIdentifierUpdate, getTransmitChannel() );
}
public long getUplinkFrequency()
{
return calculateUplink( mReceiveIdentifierUpdate, getReceiveChannel() );
return mMessage.getHex(LRA, 2);
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
public boolean hasActiveNetworkConnection()
{
if( identifier == getTransmitIdentifier() )
{
mTransmitIdentifierUpdate = message;
}
if( identifier == getReceiveIdentifier() )
{
mReceiveIdentifierUpdate = message;
}
return mMessage.get(ACTIVE_NETWORK_CONNECTION_INDICATOR);
}
public String getSystemID()
{
return mMessage.getHex(SYSTEM_ID, 3);
}
public String getRFSubsystemID()
{
return mMessage.getHex(RFSS_ID, 2);
}
public String getSiteID()
{
return mMessage.getHex(SITE_ID, 2);
}
public int getTransmitIdentifier()
{
return mMessage.getInt(TRANSMIT_IDENTIFIER);
}
public int getTransmitChannel()
{
return mMessage.getInt(TRANSMIT_CHANNEL);
}
public int getReceiveIdentifier()
{
return mMessage.getInt(RECEIVE_IDENTIFIER);
}
public int getReceiveChannel()
{
return mMessage.getInt(RECEIVE_CHANNEL);
}
public int getSystemServiceClass()
{
return mMessage.getInt(SYSTEM_SERVICE_CLASS);
}
public long getDownlinkFrequency()
{
if(mTransmitIdentifierUpdate != null)
{
return mTransmitIdentifierUpdate.getDownlinkFrequency(getTransmitChannel());
}
return 0;
}
public long getUplinkFrequency()
{
if(mReceiveIdentifierUpdate != null)
{
return mReceiveIdentifierUpdate.getUplinkFrequency(getReceiveChannel());
}
return 0;
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if(identifier == getTransmitIdentifier())
{
mTransmitIdentifierUpdate = message;
}
if(identifier == getReceiveIdentifier())
{
mReceiveIdentifierUpdate = message;
}
}
public int[] getIdentifiers()
{
int[] idens = new int[2];
idens[0] = getTransmitIdentifier();
idens[1] = getReceiveIdentifier();
return idens;
}
public int[] getIdentifiers()
{
int[] idens = new int[ 2 ];
idens[ 0 ] = getTransmitIdentifier();
idens[ 1 ] = getReceiveIdentifier();
return idens;
}
}

View File

@@ -1,51 +1,63 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.pdu.osp.data;
import alias.AliasList;
import bits.BinaryMessage;
import edac.CRCP25;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.pdu.PDUMessage;
import module.decode.p25.reference.DataUnitID;
import module.decode.p25.reference.Opcode;
import alias.AliasList;
import bits.BinaryMessage;
import edac.CRCP25;
public class GroupDataChannelGrantExtended extends PDUMessage
implements IdentifierReceiver
public class GroupDataChannelGrantExtended extends PDUMessage implements IdentifierReceiver
{
/* Service Options */
public static final int EMERGENCY_FLAG = 128;
public static final int ENCRYPTED_CHANNEL_FLAG = 129;
public static final int DUPLEX_MODE = 130;
public static final int SESSION_MODE = 131;
public static final int[] SOURCE_ADDRESS = { 88,89,90,91,92,93,94,95,96,97,
98,99,100,101,102,103,104,105,106,107,108,109,110,111 };
public static final int[] SERVICE_OPTIONS = { 128,129,130,131,132,133,134,
135 };
public static final int[] TRANSMIT_IDENTIFIER = { 160,161,162,163 };
public static final int[] TRANSMIT_NUMBER = { 164,165,166,167,168,169,170,
171,172,173,174,175 };
public static final int[] RECEIVE_IDENTIFIER = { 176,177,178,179 };
public static final int[] RECEIVE_NUMBER = { 180,181,182,183,184,185,186,
187,188,189,190,191 };
public static final int[] GROUP_ADDRESS = { 192,193,194,195,196,197,198,199,
200,201,202,203,204,205,206,207 };
public static final int[] MULTIPLE_BLOCK_CRC = { 224,225,226,227,228,229,
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 };
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public GroupDataChannelGrantExtended( BinaryMessage message,
DataUnitID duid, AliasList aliasList )
public static final int[] SOURCE_ADDRESS = {88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103,
104, 105, 106, 107, 108, 109, 110, 111};
public static final int[] SERVICE_OPTIONS = {128, 129, 130, 131, 132, 133, 134, 135};
public static final int[] TRANSMIT_IDENTIFIER = {160, 161, 162, 163};
public static final int[] TRANSMIT_NUMBER = {164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175};
public static final int[] RECEIVE_IDENTIFIER = {176, 177, 178, 179};
public static final int[] RECEIVE_NUMBER = {180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191};
public static final int[] GROUP_ADDRESS = {192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
206, 207};
public static final int[] MULTIPLE_BLOCK_CRC = {224, 225, 226, 227, 228, 229, 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};
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public GroupDataChannelGrantExtended(BinaryMessage message, DataUnitID duid, AliasList aliasList)
{
super( message, duid, aliasList );
super(message, duid, aliasList);
/* Header block is already error detected/corrected - perform error
* detection correction on the intermediate and final data blocks */
mMessage = CRCP25.correctPDU1( mMessage );
mCRC[ 1 ] = mMessage.getCRC();
* detection correction on the intermediate and final data blocks */
mMessage = CRCP25.correctPDU1(mMessage);
mCRC[1] = mMessage.getCRC();
}
@Override
@@ -53,125 +65,135 @@ public class GroupDataChannelGrantExtended extends PDUMessage
{
return Opcode.TELEPHONE_INTERCONNECT_VOICE_CHANNEL_GRANT.getDescription();
}
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
if( isEmergency() )
sb.append(getMessageStub());
if(isEmergency())
{
sb.append( " EMERGENCY" );
sb.append(" EMERGENCY");
}
sb.append( " FROM:" );
sb.append( getSourceAddress() );
sb.append( " TO:" );
sb.append( getGroupAddress() );
sb.append( " CHAN DN:" + getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber() );
sb.append( " " + getDownlinkFrequency() );
sb.append( " CHAN UP:" + getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber() );
sb.append( " " + getUplinkFrequency() );
sb.append(" FROM:");
sb.append(getSourceAddress());
sb.append(" TO:");
sb.append(getGroupAddress());
sb.append(" CHAN DN:" + getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber());
sb.append(" " + getDownlinkFrequency());
sb.append(" CHAN UP:" + getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber());
sb.append(" " + getUplinkFrequency());
return sb.toString();
}
public boolean isEmergency()
{
return mMessage.get( EMERGENCY_FLAG );
return mMessage.get(EMERGENCY_FLAG);
}
public boolean isEncrypted()
{
return mMessage.get( ENCRYPTED_CHANNEL_FLAG );
return mMessage.get(ENCRYPTED_CHANNEL_FLAG);
}
public DuplexMode getDuplexMode()
{
return mMessage.get( DUPLEX_MODE ) ? DuplexMode.FULL : DuplexMode.HALF;
return mMessage.get(DUPLEX_MODE) ? DuplexMode.FULL : DuplexMode.HALF;
}
public SessionMode getSessionMode()
{
return mMessage.get( SESSION_MODE ) ?
SessionMode.CIRCUIT : SessionMode.PACKET;
return mMessage.get(SESSION_MODE) ?
SessionMode.CIRCUIT : SessionMode.PACKET;
}
public String getSourceAddress()
{
return mMessage.getHex( SOURCE_ADDRESS, 6 );
return mMessage.getHex(SOURCE_ADDRESS, 6);
}
public String getGroupAddress()
{
return mMessage.getHex( GROUP_ADDRESS, 4 );
}
public int getTransmitChannelIdentifier()
{
return mMessage.getInt( TRANSMIT_IDENTIFIER );
}
public int getTransmitChannelNumber()
{
return mMessage.getInt( TRANSMIT_NUMBER );
}
public String getTransmitChannel()
{
return getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveChannelIdentifier()
{
return mMessage.getInt( RECEIVE_IDENTIFIER );
}
public int getReceiveChannelNumber()
{
return mMessage.getInt( RECEIVE_NUMBER );
}
public String getReceiveChannel()
{
return getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber();
}
public long getDownlinkFrequency()
{
return calculateDownlink( mTransmitIdentifierUpdate, getTransmitChannelNumber() );
}
public long getUplinkFrequency()
{
return calculateUplink( mReceiveIdentifierUpdate, getReceiveChannelNumber() );
return mMessage.getHex(GROUP_ADDRESS, 4);
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
public int getTransmitChannelIdentifier()
{
if( identifier == getTransmitChannelIdentifier() )
{
mTransmitIdentifierUpdate = message;
}
if( identifier == getReceiveChannelIdentifier() )
{
mReceiveIdentifierUpdate = message;
}
return mMessage.getInt(TRANSMIT_IDENTIFIER);
}
public int getTransmitChannelNumber()
{
return mMessage.getInt(TRANSMIT_NUMBER);
}
public String getTransmitChannel()
{
return getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveChannelIdentifier()
{
return mMessage.getInt(RECEIVE_IDENTIFIER);
}
public int getReceiveChannelNumber()
{
return mMessage.getInt(RECEIVE_NUMBER);
}
public String getReceiveChannel()
{
return getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber();
}
public long getDownlinkFrequency()
{
if(mTransmitIdentifierUpdate != null)
{
return mTransmitIdentifierUpdate.getDownlinkFrequency(getTransmitChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
if(mReceiveIdentifierUpdate != null)
{
return mReceiveIdentifierUpdate.getUplinkFrequency(getReceiveChannelNumber());
}
return 0;
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if(identifier == getTransmitChannelIdentifier())
{
mTransmitIdentifierUpdate = message;
}
if(identifier == getReceiveChannelIdentifier())
{
mReceiveIdentifierUpdate = message;
}
}
public int[] getIdentifiers()
{
int[] idens = new int[2];
idens[0] = getTransmitChannelIdentifier();
idens[1] = getReceiveChannelIdentifier();
return idens;
}
public int[] getIdentifiers()
{
int[] idens = new int[ 2 ];
idens[ 0 ] = getTransmitChannelIdentifier();
idens[ 1 ] = getReceiveChannelIdentifier();
return idens;
}
}

View File

@@ -1,51 +1,63 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.pdu.osp.voice;
import alias.AliasList;
import bits.BinaryMessage;
import edac.CRCP25;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.pdu.PDUMessage;
import module.decode.p25.reference.DataUnitID;
import module.decode.p25.reference.Opcode;
import alias.AliasList;
import bits.BinaryMessage;
import edac.CRCP25;
public class GroupVoiceChannelGrantExplicit extends PDUMessage
implements IdentifierReceiver
public class GroupVoiceChannelGrantExplicit extends PDUMessage implements IdentifierReceiver
{
/* Service Options */
public static final int EMERGENCY_FLAG = 128;
public static final int ENCRYPTED_CHANNEL_FLAG = 129;
public static final int DUPLEX_MODE = 130;
public static final int SESSION_MODE = 131;
public static final int[] SOURCE_ADDRESS = { 88,89,90,91,92,93,94,95,96,97,
98,99,100,101,102,103,104,105,106,107,108,109,110,111 };
public static final int[] SERVICE_OPTIONS = { 128,129,130,131,132,133,134,
135 };
public static final int[] TRANSMIT_IDENTIFIER = { 176,177,178,179 };
public static final int[] TRANSMIT_NUMBER = { 180,181,182,183,184,185,186,
187,188,189,190,191 };
public static final int[] RECEIVE_IDENTIFIER = { 192,193,194,195 };
public static final int[] RECEIVE_NUMBER = { 196,197,198,199,200,201,202,
203,204,205,206,207 };
public static final int[] GROUP_ADDRESS = { 208,209,210,211,212,213,214,215,
216,217,218,219,220,221,222,223 };
public static final int[] MULTIPLE_BLOCK_CRC = { 224,225,226,227,228,229,
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 };
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public GroupVoiceChannelGrantExplicit( BinaryMessage message,
DataUnitID duid, AliasList aliasList )
public static final int[] SOURCE_ADDRESS = {88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
105, 106, 107, 108, 109, 110, 111};
public static final int[] SERVICE_OPTIONS = {128, 129, 130, 131, 132, 133, 134, 135};
public static final int[] TRANSMIT_IDENTIFIER = {176, 177, 178, 179};
public static final int[] TRANSMIT_NUMBER = {180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191};
public static final int[] RECEIVE_IDENTIFIER = {192, 193, 194, 195};
public static final int[] RECEIVE_NUMBER = {196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207};
public static final int[] GROUP_ADDRESS = {208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221,
222, 223};
public static final int[] MULTIPLE_BLOCK_CRC = {224, 225, 226, 227, 228, 229, 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};
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public GroupVoiceChannelGrantExplicit(BinaryMessage message, DataUnitID duid, AliasList aliasList)
{
super( message, duid, aliasList );
super(message, duid, aliasList);
/* Header block is already error detected/corrected - perform error
* detection correction on the intermediate and final data blocks */
mMessage = CRCP25.correctPDU1( mMessage );
mCRC[ 1 ] = mMessage.getCRC();
* detection correction on the intermediate and final data blocks */
mMessage = CRCP25.correctPDU1(mMessage);
mCRC[1] = mMessage.getCRC();
}
@Override
@@ -53,125 +65,135 @@ public class GroupVoiceChannelGrantExplicit extends PDUMessage
{
return Opcode.GROUP_VOICE_CHANNEL_GRANT.getDescription();
}
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
if( isEmergency() )
sb.append(getMessageStub());
if(isEmergency())
{
sb.append( " EMERGENCY" );
sb.append(" EMERGENCY");
}
sb.append( " FROM:" );
sb.append( getSourceAddress() );
sb.append( " GRP:" );
sb.append( getGroupAddress() );
sb.append( " CHAN DN:" + getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber() );
sb.append( " " + getDownlinkFrequency() );
sb.append( " CHAN UP:" + getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber() );
sb.append( " " + getUplinkFrequency() );
sb.append(" FROM:");
sb.append(getSourceAddress());
sb.append(" GRP:");
sb.append(getGroupAddress());
sb.append(" CHAN DN:" + getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber());
sb.append(" " + getDownlinkFrequency());
sb.append(" CHAN UP:" + getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber());
sb.append(" " + getUplinkFrequency());
return sb.toString();
}
public boolean isEmergency()
{
return mMessage.get( EMERGENCY_FLAG );
return mMessage.get(EMERGENCY_FLAG);
}
public boolean isEncrypted()
{
return mMessage.get( ENCRYPTED_CHANNEL_FLAG );
return mMessage.get(ENCRYPTED_CHANNEL_FLAG);
}
public DuplexMode getDuplexMode()
{
return mMessage.get( DUPLEX_MODE ) ? DuplexMode.FULL : DuplexMode.HALF;
return mMessage.get(DUPLEX_MODE) ? DuplexMode.FULL : DuplexMode.HALF;
}
public SessionMode getSessionMode()
{
return mMessage.get( SESSION_MODE ) ?
SessionMode.CIRCUIT : SessionMode.PACKET;
return mMessage.get(SESSION_MODE) ?
SessionMode.CIRCUIT : SessionMode.PACKET;
}
public String getSourceAddress()
{
return mMessage.getHex( SOURCE_ADDRESS, 6 );
}
public String getGroupAddress()
{
return mMessage.getHex( GROUP_ADDRESS, 4 );
}
public int getTransmitChannelIdentifier()
{
return mMessage.getInt( TRANSMIT_IDENTIFIER );
}
public int getTransmitChannelNumber()
{
return mMessage.getInt( TRANSMIT_NUMBER );
}
public String getTransmitChannel()
{
return getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveChannelIdentifier()
{
return mMessage.getInt( RECEIVE_IDENTIFIER );
}
public int getReceiveChannelNumber()
{
return mMessage.getInt( RECEIVE_NUMBER );
}
public String getReceiveChannel()
{
return getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber();
}
public long getDownlinkFrequency()
{
return calculateDownlink( mTransmitIdentifierUpdate, getTransmitChannelNumber() );
}
public long getUplinkFrequency()
{
return calculateUplink( mReceiveIdentifierUpdate, getReceiveChannelNumber() );
return mMessage.getHex(SOURCE_ADDRESS, 6);
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
public String getGroupAddress()
{
if( identifier == getTransmitChannelIdentifier() )
{
mTransmitIdentifierUpdate = message;
}
if( identifier == getReceiveChannelIdentifier() )
{
mReceiveIdentifierUpdate = message;
}
return mMessage.getHex(GROUP_ADDRESS, 4);
}
public int getTransmitChannelIdentifier()
{
return mMessage.getInt(TRANSMIT_IDENTIFIER);
}
public int getTransmitChannelNumber()
{
return mMessage.getInt(TRANSMIT_NUMBER);
}
public String getTransmitChannel()
{
return getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveChannelIdentifier()
{
return mMessage.getInt(RECEIVE_IDENTIFIER);
}
public int getReceiveChannelNumber()
{
return mMessage.getInt(RECEIVE_NUMBER);
}
public String getReceiveChannel()
{
return getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber();
}
public long getDownlinkFrequency()
{
if(mTransmitIdentifierUpdate != null)
{
return mTransmitIdentifierUpdate.getDownlinkFrequency(getTransmitChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
if(mReceiveIdentifierUpdate != null)
{
return mReceiveIdentifierUpdate.getUplinkFrequency(getReceiveChannelNumber());
}
return 0;
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if(identifier == getTransmitChannelIdentifier())
{
mTransmitIdentifierUpdate = message;
}
if(identifier == getReceiveChannelIdentifier())
{
mReceiveIdentifierUpdate = message;
}
}
public int[] getIdentifiers()
{
int[] idens = new int[2];
idens[0] = getTransmitChannelIdentifier();
idens[1] = getReceiveChannelIdentifier();
return idens;
}
public int[] getIdentifiers()
{
int[] idens = new int[ 2 ];
idens[ 0 ] = getTransmitChannelIdentifier();
idens[ 1 ] = getReceiveChannelIdentifier();
return idens;
}
}

View File

@@ -1,53 +1,64 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.pdu.osp.voice;
import java.util.Date;
import alias.AliasList;
import bits.BinaryMessage;
import edac.CRCP25;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.pdu.PDUMessage;
import module.decode.p25.reference.DataUnitID;
import module.decode.p25.reference.Opcode;
import alias.AliasList;
import bits.BinaryMessage;
import edac.CRCP25;
public class TelephoneInterconnectChannelGrantExplicit extends PDUMessage
implements IdentifierReceiver
import java.util.Date;
public class TelephoneInterconnectChannelGrantExplicit extends PDUMessage implements IdentifierReceiver
{
/* Service Options */
public static final int EMERGENCY_FLAG = 128;
public static final int ENCRYPTED_CHANNEL_FLAG = 129;
public static final int DUPLEX_MODE = 130;
public static final int SESSION_MODE = 131;
public static final int[] ADDRESS = { 88,89,90,91,92,93,94,95,96,97,
98,99,100,101,102,103,104,105,106,107,108,109,110,111 };
public static final int[] SERVICE_OPTIONS = { 128,129,130,131,132,133,134,
135 };
public static final int[] TRANSMIT_IDENTIFIER = { 160,161,162,163 };
public static final int[] TRANSMIT_NUMBER = { 164,165,166,167,168,169,170,
171,172,173,174,175 };
public static final int[] RECEIVE_IDENTIFIER = { 176,177,178,179 };
public static final int[] RECEIVE_NUMBER = { 180,181,182,183,184,185,186,
187,188,189,190,191 };
public static final int[] CALL_TIMER = { 192,193,194,195,196,197,198,199,
200,201,202,203,204,205,206,207 };
public static final int[] MULTIPLE_BLOCK_CRC = { 224,225,226,227,228,229,
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 };
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public TelephoneInterconnectChannelGrantExplicit( BinaryMessage message,
DataUnitID duid, AliasList aliasList )
public static final int[] ADDRESS = {88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105,
106, 107, 108, 109, 110, 111};
public static final int[] SERVICE_OPTIONS = {128, 129, 130, 131, 132, 133, 134, 135};
public static final int[] TRANSMIT_IDENTIFIER = {160, 161, 162, 163};
public static final int[] TRANSMIT_NUMBER = {164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175};
public static final int[] RECEIVE_IDENTIFIER = {176, 177, 178, 179};
public static final int[] RECEIVE_NUMBER = {180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191};
public static final int[] CALL_TIMER = {192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207};
public static final int[] MULTIPLE_BLOCK_CRC = {224, 225, 226, 227, 228, 229, 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};
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public TelephoneInterconnectChannelGrantExplicit(BinaryMessage message, DataUnitID duid, AliasList aliasList)
{
super( message, duid, aliasList );
super(message, duid, aliasList);
/* Header block is already error detected/corrected - perform error
* detection correction on the intermediate and final data blocks */
mMessage = CRCP25.correctPDU1( mMessage );
mCRC[ 1 ] = mMessage.getCRC();
* detection correction on the intermediate and final data blocks */
mMessage = CRCP25.correctPDU1(mMessage);
mCRC[1] = mMessage.getCRC();
}
@Override
@@ -55,57 +66,57 @@ public class TelephoneInterconnectChannelGrantExplicit extends PDUMessage
{
return Opcode.TELEPHONE_INTERCONNECT_VOICE_CHANNEL_GRANT.getDescription();
}
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
if( isEmergency() )
sb.append(getMessageStub());
if(isEmergency())
{
sb.append( " EMERGENCY" );
sb.append(" EMERGENCY");
}
sb.append( " ADDR:" );
sb.append( getAddress() );
sb.append( " CALL TIMER:" );
sb.append( mTimeDurationFormat.format( new Date( getCallTimer() ) ) );
sb.append( " CHAN DN:" + getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber() );
sb.append( " " + getDownlinkFrequency() );
sb.append( " CHAN UP:" + getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber() );
sb.append( " " + getUplinkFrequency() );
sb.append(" ADDR:");
sb.append(getAddress());
sb.append(" CALL TIMER:");
sb.append(mTimeDurationFormat.format(new Date(getCallTimer())));
sb.append(" CHAN DN:" + getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber());
sb.append(" " + getDownlinkFrequency());
sb.append(" CHAN UP:" + getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber());
sb.append(" " + getUplinkFrequency());
return sb.toString();
}
public boolean isEmergency()
{
return mMessage.get( EMERGENCY_FLAG );
return mMessage.get(EMERGENCY_FLAG);
}
public boolean isEncrypted()
{
return mMessage.get( ENCRYPTED_CHANNEL_FLAG );
return mMessage.get(ENCRYPTED_CHANNEL_FLAG);
}
public DuplexMode getDuplexMode()
{
return mMessage.get( DUPLEX_MODE ) ? DuplexMode.FULL : DuplexMode.HALF;
return mMessage.get(DUPLEX_MODE) ? DuplexMode.FULL : DuplexMode.HALF;
}
public SessionMode getSessionMode()
{
return mMessage.get( SESSION_MODE ) ?
SessionMode.CIRCUIT : SessionMode.PACKET;
return mMessage.get(SESSION_MODE) ?
SessionMode.CIRCUIT : SessionMode.PACKET;
}
public String getAddress()
{
return mMessage.getHex( ADDRESS, 6 );
return mMessage.getHex(ADDRESS, 6);
}
/*
@@ -113,72 +124,82 @@ public class TelephoneInterconnectChannelGrantExplicit extends PDUMessage
*/
public long getCallTimer()
{
int timer = mMessage.getInt( CALL_TIMER );
return timer / 100;
}
public int getTransmitChannelIdentifier()
{
return mMessage.getInt( TRANSMIT_IDENTIFIER );
}
public int getTransmitChannelNumber()
{
return mMessage.getInt( TRANSMIT_NUMBER );
}
public String getTransmitChannel()
{
return getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveChannelIdentifier()
{
return mMessage.getInt( RECEIVE_IDENTIFIER );
}
public int getReceiveChannelNumber()
{
return mMessage.getInt( RECEIVE_NUMBER );
}
public String getReceiveChannel()
{
return getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber();
}
public long getDownlinkFrequency()
{
return calculateDownlink( mTransmitIdentifierUpdate, getTransmitChannelNumber() );
}
public long getUplinkFrequency()
{
return calculateUplink( mReceiveIdentifierUpdate, getReceiveChannelNumber() );
int timer = mMessage.getInt(CALL_TIMER);
return timer / 100;
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
public int getTransmitChannelIdentifier()
{
if( identifier == getTransmitChannelIdentifier() )
{
mTransmitIdentifierUpdate = message;
}
if( identifier == getReceiveChannelIdentifier() )
{
mReceiveIdentifierUpdate = message;
}
return mMessage.getInt(TRANSMIT_IDENTIFIER);
}
public int getTransmitChannelNumber()
{
return mMessage.getInt(TRANSMIT_NUMBER);
}
public String getTransmitChannel()
{
return getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveChannelIdentifier()
{
return mMessage.getInt(RECEIVE_IDENTIFIER);
}
public int getReceiveChannelNumber()
{
return mMessage.getInt(RECEIVE_NUMBER);
}
public String getReceiveChannel()
{
return getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber();
}
public long getDownlinkFrequency()
{
if(mTransmitIdentifierUpdate != null)
{
return mTransmitIdentifierUpdate.getDownlinkFrequency(getTransmitChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
if(mReceiveIdentifierUpdate != null)
{
return mReceiveIdentifierUpdate.getUplinkFrequency(getReceiveChannelNumber());
}
return 0;
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if(identifier == getTransmitChannelIdentifier())
{
mTransmitIdentifierUpdate = message;
}
if(identifier == getReceiveChannelIdentifier())
{
mReceiveIdentifierUpdate = message;
}
}
public int[] getIdentifiers()
{
int[] idens = new int[2];
idens[0] = getTransmitChannelIdentifier();
idens[1] = getReceiveChannelIdentifier();
return idens;
}
public int[] getIdentifiers()
{
int[] idens = new int[ 2 ];
idens[ 0 ] = getTransmitChannelIdentifier();
idens[ 1 ] = getReceiveChannelIdentifier();
return idens;
}
}

View File

@@ -1,57 +1,68 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.pdu.osp.voice;
import alias.AliasList;
import bits.BinaryMessage;
import edac.CRCP25;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.pdu.PDUMessage;
import module.decode.p25.reference.DataUnitID;
import module.decode.p25.reference.Opcode;
import alias.AliasList;
import bits.BinaryMessage;
import edac.CRCP25;
public class UnitToUnitVoiceChannelGrantUpdateExtended extends PDUMessage
implements IdentifierReceiver
public class UnitToUnitVoiceChannelGrantUpdateExtended extends PDUMessage implements IdentifierReceiver
{
/* Service Options */
public static final int EMERGENCY_FLAG = 128;
public static final int ENCRYPTED_CHANNEL_FLAG = 129;
public static final int DUPLEX_MODE = 130;
public static final int SESSION_MODE = 131;
public static final int[] SOURCE_ADDRESS = { 88,89,90,91,92,93,94,95,96,97,
98,99,100,101,102,103,104,105,106,107,108,109,110,111 };
public static final int[] SERVICE_OPTIONS = { 128,129,130,131,132,133,134,
135 };
public static final int[] SOURCE_WACN = { 160,161,162,163,164,165,166,167,
168,169,170,171,172,173,174,175,176,177,178,179 };
public static final int[] SOURCE_SYSTEM_ID = { 180,181,182,183,184,185,186,
187,188,189,190,191 };
public static final int[] SOURCE_ID = { 192,193,194,195,196,197,198,199,200,
201,202,203,204,205,206,207,208,209,210,211,212,213,214,215 };
public static final int[] TARGET_ADDRESS = { 216,217,218,219,220,221,222,
223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239 };
public static final int[] TRANSMIT_IDENTIFIER = { 240,241,242,243 };
public static final int[] TRANSMIT_NUMBER = { 244,245,246,247,248,249,250,
251,252,253,254,255 };
public static final int[] RECEIVE_IDENTIFIER = { 256,257,258,259 };
public static final int[] RECEIVE_NUMBER = { 260,261,262,263,264,265,266,
267,268,269,270,271 };
public static final int[] MULTIPLE_BLOCK_CRC = { 320,321,322,323,324,325,
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 };
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public UnitToUnitVoiceChannelGrantUpdateExtended( BinaryMessage message,
DataUnitID duid, AliasList aliasList )
public static final int[] SOURCE_ADDRESS = {88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
105, 106, 107, 108, 109, 110, 111};
public static final int[] SERVICE_OPTIONS = {128, 129, 130, 131, 132, 133, 134, 135};
public static final int[] SOURCE_WACN = {160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174,
175, 176, 177, 178, 179};
public static final int[] SOURCE_SYSTEM_ID = {180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191};
public static final int[] SOURCE_ID = {192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206,
207, 208, 209, 210, 211, 212, 213, 214, 215};
public static final int[] TARGET_ADDRESS = {216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229,
230, 231, 232, 233, 234, 235, 236, 237, 238, 239};
public static final int[] TRANSMIT_IDENTIFIER = {240, 241, 242, 243};
public static final int[] TRANSMIT_NUMBER = {244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255};
public static final int[] RECEIVE_IDENTIFIER = {256, 257, 258, 259};
public static final int[] RECEIVE_NUMBER = {260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271};
public static final int[] MULTIPLE_BLOCK_CRC = {320, 321, 322, 323, 324, 325, 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};
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public UnitToUnitVoiceChannelGrantUpdateExtended(BinaryMessage message, DataUnitID duid, AliasList aliasList)
{
super( message, duid, aliasList );
super(message, duid, aliasList);
/* Header block is already error detected/corrected - perform error
* detection correction on the intermediate and final data blocks */
mMessage = CRCP25.correctPDU2( mMessage );
mCRC[ 1 ] = mMessage.getCRC();
* detection correction on the intermediate and final data blocks */
mMessage = CRCP25.correctPDU2(mMessage);
mCRC[1] = mMessage.getCRC();
}
@Override
@@ -59,149 +70,159 @@ public class UnitToUnitVoiceChannelGrantUpdateExtended extends PDUMessage
{
return Opcode.UNIT_TO_UNIT_VOICE_CHANNEL_GRANT_UPDATE.getDescription();
}
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
if( isEmergency() )
sb.append(getMessageStub());
if(isEmergency())
{
sb.append( " EMERGENCY" );
sb.append(" EMERGENCY");
}
sb.append( " FROM ADDR:" );
sb.append( getSourceAddress() );
sb.append( " ID:" );
sb.append( getSourceID() );
sb.append( " TO:" );
sb.append( getTargetAddress() );
sb.append( " WACN:" );
sb.append( getSourceWACN() );
sb.append( " SYS:" );
sb.append( getSourceSystemID() );
sb.append( " CHAN DN:" + getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber() );
sb.append( " " + getDownlinkFrequency() );
sb.append( " CHAN UP:" + getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber() );
sb.append( " " + getUplinkFrequency() );
sb.append(" FROM ADDR:");
sb.append(getSourceAddress());
sb.append(" ID:");
sb.append(getSourceID());
sb.append(" TO:");
sb.append(getTargetAddress());
sb.append(" WACN:");
sb.append(getSourceWACN());
sb.append(" SYS:");
sb.append(getSourceSystemID());
sb.append(" CHAN DN:" + getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber());
sb.append(" " + getDownlinkFrequency());
sb.append(" CHAN UP:" + getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber());
sb.append(" " + getUplinkFrequency());
return sb.toString();
}
public boolean isEmergency()
{
return mMessage.get( EMERGENCY_FLAG );
return mMessage.get(EMERGENCY_FLAG);
}
public boolean isEncrypted()
{
return mMessage.get( ENCRYPTED_CHANNEL_FLAG );
return mMessage.get(ENCRYPTED_CHANNEL_FLAG);
}
public DuplexMode getDuplexMode()
{
return mMessage.get( DUPLEX_MODE ) ? DuplexMode.FULL : DuplexMode.HALF;
return mMessage.get(DUPLEX_MODE) ? DuplexMode.FULL : DuplexMode.HALF;
}
public SessionMode getSessionMode()
{
return mMessage.get( SESSION_MODE ) ?
SessionMode.CIRCUIT : SessionMode.PACKET;
return mMessage.get(SESSION_MODE) ?
SessionMode.CIRCUIT : SessionMode.PACKET;
}
public String getSourceAddress()
{
return mMessage.getHex( SOURCE_ADDRESS, 6 );
}
public String getSourceID()
{
return mMessage.getHex( SOURCE_ID, 6 );
}
public String getSourceWACN()
{
return mMessage.getHex( SOURCE_WACN, 5 );
}
public String getSourceSystemID()
{
return mMessage.getHex( SOURCE_SYSTEM_ID, 3 );
}
public String getTargetAddress()
{
return mMessage.getHex( TARGET_ADDRESS, 6 );
}
public int getTransmitChannelIdentifier()
{
return mMessage.getInt( TRANSMIT_IDENTIFIER );
}
public int getTransmitChannelNumber()
{
return mMessage.getInt( TRANSMIT_NUMBER );
}
public String getTransmitChannel()
{
return getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveChannelIdentifier()
{
return mMessage.getInt( RECEIVE_IDENTIFIER );
}
public int getReceiveChannelNumber()
{
return mMessage.getInt( RECEIVE_NUMBER );
}
public String getReceiveChannel()
{
return getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber();
}
public long getDownlinkFrequency()
{
return calculateDownlink( mTransmitIdentifierUpdate, getTransmitChannelNumber() );
}
public long getUplinkFrequency()
{
return calculateUplink( mReceiveIdentifierUpdate, getReceiveChannelNumber() );
return mMessage.getHex(SOURCE_ADDRESS, 6);
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
public String getSourceID()
{
if( identifier == getTransmitChannelIdentifier() )
{
mTransmitIdentifierUpdate = message;
}
if( identifier == getReceiveChannelIdentifier() )
{
mReceiveIdentifierUpdate = message;
}
return mMessage.getHex(SOURCE_ID, 6);
}
public String getSourceWACN()
{
return mMessage.getHex(SOURCE_WACN, 5);
}
public String getSourceSystemID()
{
return mMessage.getHex(SOURCE_SYSTEM_ID, 3);
}
public String getTargetAddress()
{
return mMessage.getHex(TARGET_ADDRESS, 6);
}
public int getTransmitChannelIdentifier()
{
return mMessage.getInt(TRANSMIT_IDENTIFIER);
}
public int getTransmitChannelNumber()
{
return mMessage.getInt(TRANSMIT_NUMBER);
}
public String getTransmitChannel()
{
return getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveChannelIdentifier()
{
return mMessage.getInt(RECEIVE_IDENTIFIER);
}
public int getReceiveChannelNumber()
{
return mMessage.getInt(RECEIVE_NUMBER);
}
public String getReceiveChannel()
{
return getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber();
}
public long getDownlinkFrequency()
{
if(mTransmitIdentifierUpdate != null)
{
return mTransmitIdentifierUpdate.getDownlinkFrequency(getTransmitChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
if(mReceiveIdentifierUpdate != null)
{
return mReceiveIdentifierUpdate.getUplinkFrequency(getReceiveChannelNumber());
}
return 0;
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if(identifier == getTransmitChannelIdentifier())
{
mTransmitIdentifierUpdate = message;
}
if(identifier == getReceiveChannelIdentifier())
{
mReceiveIdentifierUpdate = message;
}
}
public int[] getIdentifiers()
{
int[] idens = new int[2];
idens[0] = getTransmitChannelIdentifier();
idens[1] = getReceiveChannelIdentifier();
return idens;
}
public int[] getIdentifiers()
{
int[] idens = new int[ 2 ];
idens[ 0 ] = getTransmitChannelIdentifier();
idens[ 1 ] = getReceiveChannelIdentifier();
return idens;
}
}

View File

@@ -1,3 +1,21 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tdu.lc;
import module.decode.p25.message.IAdjacentSite;
@@ -6,141 +24,147 @@ import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.tsbk.osp.control.SystemService;
import module.decode.p25.reference.LinkControlOpcode;
public class AdjacentSiteStatusBroadcast extends TDULinkControlMessage
implements IdentifierReceiver, IAdjacentSite
public class AdjacentSiteStatusBroadcast extends TDULinkControlMessage implements IdentifierReceiver, IAdjacentSite
{
public static final int[] LRA = { 72,73,74,75,88,89,90,91 };
public static final int[] SYSTEM_ID = { 96,97,98,99,112,113,114,115,
116,117,118,119 };
public static final int[] RFSS_ID = { 120,121,122,123,136,137,138,139 };
public static final int[] SITE_ID = { 140,141,142,143,144,145,146,147 };
public static final int[] IDENTIFIER = { 160,161,162,163 };
public static final int[] CHANNEL = { 164,165,166,167,168,169,170,
171,184,185,186,187 };
public static final int[] SYSTEM_SERVICE_CLASS = { 188,189,190,191,192,193,
194,195 };
private IBandIdentifier mIdentifierUpdate;
public AdjacentSiteStatusBroadcast( TDULinkControlMessage source )
{
super( source );
}
public static final int[] LRA = {72, 73, 74, 75, 88, 89, 90, 91};
public static final int[] SYSTEM_ID = {96, 97, 98, 99, 112, 113, 114, 115, 116, 117, 118, 119};
public static final int[] RFSS_ID = {120, 121, 122, 123, 136, 137, 138, 139};
public static final int[] SITE_ID = {140, 141, 142, 143, 144, 145, 146, 147};
public static final int[] IDENTIFIER = {160, 161, 162, 163};
public static final int[] CHANNEL = {164, 165, 166, 167, 168, 169, 170, 171, 184, 185, 186, 187};
public static final int[] SYSTEM_SERVICE_CLASS = {188, 189, 190, 191, 192, 193, 194, 195};
private IBandIdentifier mIdentifierUpdate;
public AdjacentSiteStatusBroadcast(TDULinkControlMessage source)
{
super(source);
}
@Override
public String getEventType()
{
return LinkControlOpcode.ADJACENT_SITE_STATUS_BROADCAST.getDescription();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " LRA:" + getLRA() );
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( " SYS:" + getSystemID() );
sb.append( " SITE:" + getRFSS() + "-" + getSiteID() );
sb.append( " CHAN:" + getChannel() );
sb.append(getMessageStub());
sb.append(" LRA:" + getLRA());
sb.append(" SYS:" + getSystemID());
sb.append(" SITE:" + getRFSS() + "-" + getSiteID());
sb.append(" CHAN:" + getChannel());
sb.append(" " + getSystemServiceClass());
return sb.toString();
}
sb.append( " " + getSystemServiceClass() );
return sb.toString();
}
public String getUniqueID()
{
StringBuilder sb = new StringBuilder();
sb.append( getSystemID() );
sb.append( ":" );
sb.append( getRFSS() );
sb.append( ":" );
sb.append( getSiteID() );
return sb.toString();
StringBuilder sb = new StringBuilder();
sb.append(getSystemID());
sb.append(":");
sb.append(getRFSS());
sb.append(":");
sb.append(getSiteID());
return sb.toString();
}
public String getLRA()
{
return mMessage.getHex( LRA, 2 );
}
public String getSystemID()
{
return mMessage.getHex( SYSTEM_ID, 3 );
}
public String getRFSS()
{
return mMessage.getHex( RFSS_ID, 2 );
}
public String getSiteID()
{
return mMessage.getHex( SITE_ID, 2 );
}
public int getIdentifier()
{
return mMessage.getInt( IDENTIFIER );
}
public String getChannel()
{
return getIdentifier() + "-" + getChannelNumber();
}
@Override
public String getDownlinkChannel()
{
return getChannel();
}
@Override
public String getUplinkChannel()
{
return getChannel();
}
public int getChannelNumber()
{
return mMessage.getInt( CHANNEL );
}
public String getSystemServiceClass()
{
return SystemService.toString( mMessage.getInt( SYSTEM_SERVICE_CLASS ) );
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
public String getLRA()
{
mIdentifierUpdate = message;
return mMessage.getHex(LRA, 2);
}
@Override
public String getSystemID()
{
return mMessage.getHex(SYSTEM_ID, 3);
}
public String getRFSS()
{
return mMessage.getHex(RFSS_ID, 2);
}
public String getSiteID()
{
return mMessage.getHex(SITE_ID, 2);
}
public int getIdentifier()
{
return mMessage.getInt(IDENTIFIER);
}
public String getChannel()
{
return getIdentifier() + "-" + getChannelNumber();
}
@Override
public String getDownlinkChannel()
{
return getChannel();
}
@Override
public String getUplinkChannel()
{
return getChannel();
}
public int getChannelNumber()
{
return mMessage.getInt(CHANNEL);
}
public String getSystemServiceClass()
{
return SystemService.toString(mMessage.getInt(SYSTEM_SERVICE_CLASS));
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
mIdentifierUpdate = message;
}
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 1 ];
identifiers[ 0 ] = getIdentifier();
return identifiers;
int[] identifiers = new int[1];
identifiers[0] = getIdentifier();
return identifiers;
}
public long getDownlinkFrequency()
{
return calculateDownlink( mIdentifierUpdate, getChannelNumber() );
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.getDownlinkFrequency(getChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
return calculateUplink( mIdentifierUpdate, getChannelNumber() );
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.getUplinkFrequency(getChannelNumber());
}
return 0;
}
}

View File

@@ -1,3 +1,21 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tdu.lc;
import module.decode.p25.message.IAdjacentSite;
@@ -5,153 +23,162 @@ import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.reference.LinkControlOpcode;
public class AdjacentSiteStatusBroadcastExplicit extends TDULinkControlMessage
implements IdentifierReceiver, IAdjacentSite
public class AdjacentSiteStatusBroadcastExplicit extends TDULinkControlMessage implements IdentifierReceiver, IAdjacentSite
{
public static final int[] LRA = { 72,73,74,75,88,89,90,91 };
public static final int[] TRANSMIT_IDENTIFIER = { 92,93,94,95 };
public static final int[] TRANSMIT_CHANNEL = { 96,97,98,99,112,113,114,115,
116,117,118,119 };
public static final int[] RFSS_ID = { 120,121,122,123,136,137,138,139 };
public static final int[] SITE_ID = { 140,141,142,143,144,145,146,147 };
public static final int[] RECEIVE_IDENTIFIER = { 160,161,162,163 };
public static final int[] RECEIVE_CHANNEL = { 164,165,166,167,168,169,170,
171,184,185,186,187 };
private IBandIdentifier mTransmitBand;
private IBandIdentifier mReceiveBand;
public static final int[] LRA = {72, 73, 74, 75, 88, 89, 90, 91};
public static final int[] TRANSMIT_IDENTIFIER = {92, 93, 94, 95};
public static final int[] TRANSMIT_CHANNEL = {96, 97, 98, 99, 112, 113, 114, 115,
116, 117, 118, 119};
public static final int[] RFSS_ID = {120, 121, 122, 123, 136, 137, 138, 139};
public static final int[] SITE_ID = {140, 141, 142, 143, 144, 145, 146, 147};
public static final int[] RECEIVE_IDENTIFIER = {160, 161, 162, 163};
public static final int[] RECEIVE_CHANNEL = {164, 165, 166, 167, 168, 169, 170,
171, 184, 185, 186, 187};
private IBandIdentifier mTransmitBand;
private IBandIdentifier mReceiveBand;
public AdjacentSiteStatusBroadcastExplicit(TDULinkControlMessage source)
{
super(source);
}
public AdjacentSiteStatusBroadcastExplicit( TDULinkControlMessage source )
{
super( source );
}
@Override
public String getEventType()
{
return LinkControlOpcode.ADJACENT_SITE_STATUS_BROADCAST_EXPLICIT.getDescription();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " LRA:" + getLRA() );
sb.append( " SITE:" + getRFSS() + "-" + getSiteID() );
sb.append( " DNLINK:" + getDownlinkChannel() );
sb.append( " UPLINK:" + getUplinkChannel() );
return sb.toString();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append(getMessageStub());
sb.append(" LRA:" + getLRA());
sb.append(" SITE:" + getRFSS() + "-" + getSiteID());
sb.append(" DNLINK:" + getDownlinkChannel());
sb.append(" UPLINK:" + getUplinkChannel());
return sb.toString();
}
public String getUniqueID()
{
StringBuilder sb = new StringBuilder();
sb.append( getSystemID() );
sb.append( ":" );
sb.append( getRFSS() );
sb.append( ":" );
sb.append( getSiteID() );
return sb.toString();
}
public String getLRA()
{
return mMessage.getHex( LRA, 2 );
}
public String getRFSS()
{
return mMessage.getHex( RFSS_ID, 2 );
}
public String getSystemID()
{
return "***";
}
public String getSiteID()
{
return mMessage.getHex( SITE_ID, 2 );
}
@Override
public String getSystemServiceClass()
{
return "[]";
}
StringBuilder sb = new StringBuilder();
sb.append(getSystemID());
sb.append(":");
sb.append(getRFSS());
sb.append(":");
sb.append(getSiteID());
return sb.toString();
}
public String getLRA()
{
return mMessage.getHex(LRA, 2);
}
public String getRFSS()
{
return mMessage.getHex(RFSS_ID, 2);
}
public String getSystemID()
{
return "***";
}
public String getSiteID()
{
return mMessage.getHex(SITE_ID, 2);
}
@Override
public String getSystemServiceClass()
{
return "[]";
}
public int getTransmitIdentifier()
{
return mMessage.getInt(TRANSMIT_IDENTIFIER);
}
public int getTransmitChannel()
{
return mMessage.getInt(TRANSMIT_CHANNEL);
}
public String getDownlinkChannel()
{
return getTransmitIdentifier() + "-" + getTransmitChannel();
}
public int getReceiveIdentifier()
{
return mMessage.getInt(RECEIVE_IDENTIFIER);
}
public int getReceiveChannel()
{
return mMessage.getInt(RECEIVE_CHANNEL);
}
public String getUplinkChannel()
{
return getReceiveIdentifier() + "-" + getReceiveChannel();
}
public int getTransmitIdentifier()
{
return mMessage.getInt( TRANSMIT_IDENTIFIER );
}
public int getTransmitChannel()
{
return mMessage.getInt( TRANSMIT_CHANNEL );
}
public String getDownlinkChannel()
{
return getTransmitIdentifier() + "-" + getTransmitChannel();
}
public int getReceiveIdentifier()
{
return mMessage.getInt( RECEIVE_IDENTIFIER );
}
public int getReceiveChannel()
{
return mMessage.getInt( RECEIVE_CHANNEL );
}
public String getUplinkChannel()
{
return getReceiveIdentifier() + "-" + getReceiveChannel();
}
public long getDownlinkFrequency()
{
return calculateDownlink( mTransmitBand, getTransmitChannel() );
if(mTransmitBand != null)
{
return mTransmitBand.getDownlinkFrequency(getTransmitChannel());
}
return 0;
}
public long getUplinkFrequency()
{
return calculateUplink( mReceiveBand, getReceiveChannel() );
if(mReceiveBand != null)
{
return mReceiveBand.getUplinkFrequency(getReceiveChannel());
}
return 0;
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
{
if( identifier == getTransmitIdentifier() )
{
mTransmitBand = message;
}
if( identifier == getReceiveIdentifier() )
{
mReceiveBand = message;
}
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if(identifier == getTransmitIdentifier())
{
mTransmitBand = message;
}
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 2 ];
identifiers[ 0 ] = getTransmitIdentifier();
identifiers[ 1 ] = getReceiveIdentifier();
return identifiers;
}
if(identifier == getReceiveIdentifier())
{
mReceiveBand = message;
}
}
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[2];
identifiers[0] = getTransmitIdentifier();
identifiers[1] = getReceiveIdentifier();
return identifiers;
}
}

View File

@@ -1,82 +1,117 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tdu.lc;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.reference.LinkControlOpcode;
public class ChannelIdentifierUpdate extends TDULinkControlMessage
implements IBandIdentifier
public class ChannelIdentifierUpdate extends TDULinkControlMessage implements IBandIdentifier
{
public static final int[] IDENTIFIER = { 72,73,74,75 };
public static final int[] BANDWIDTH = { 88,89,90,91,92,93,94,95,96 };
public static final int[] TRANSMIT_OFFSET = { 97,98,99,112,113,114,115,116,
117 };
public static final int[] CHANNEL_SPACING = { 118,119,120,121,122,123,136,
137,138,139 };
public static final int[] BASE_FREQUENCY = { 140,141,142,143,144,145,146,
147,160,161,162,163,164,165,166,167,168,169,170,171,184,185,186,
187,188,189,190,191,192,193,194,195 };
public ChannelIdentifierUpdate( TDULinkControlMessage source )
{
super( source );
}
public static final int[] IDENTIFIER = {72, 73, 74, 75};
public static final int[] BANDWIDTH = {88, 89, 90, 91, 92, 93, 94, 95, 96};
public static final int[] TRANSMIT_OFFSET = {97, 98, 99, 112, 113, 114, 115, 116,
117};
public static final int[] CHANNEL_SPACING = {118, 119, 120, 121, 122, 123, 136,
137, 138, 139};
public static final int[] BASE_FREQUENCY = {140, 141, 142, 143, 144, 145, 146,
147, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 184, 185, 186,
187, 188, 189, 190, 191, 192, 193, 194, 195};
public ChannelIdentifierUpdate(TDULinkControlMessage source)
{
super(source);
}
@Override
public String getEventType()
{
return LinkControlOpcode.CHANNEL_IDENTIFIER_UPDATE.getDescription();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " IDEN:" + getIdentifier() );
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( " BASE:" + getBaseFrequency() );
sb.append( " BW:" + getBandwidth() );
sb.append( " SPACING:" + getChannelSpacing() );
sb.append( " OFFSET:" + getTransmitOffset() );
return sb.toString();
}
sb.append(getMessageStub());
@Override
public int getIdentifier()
{
return mMessage.getInt( IDENTIFIER );
}
sb.append(" IDEN:" + getIdentifier());
/**
sb.append(" BASE:" + getBaseFrequency());
sb.append(" BW:" + getBandwidth());
sb.append(" SPACING:" + getChannelSpacing());
sb.append(" OFFSET:" + getTransmitOffset());
return sb.toString();
}
@Override
public int getIdentifier()
{
return mMessage.getInt(IDENTIFIER);
}
/**
* Channel bandwidth in hertz
*/
@Override
public int getBandwidth()
{
return mMessage.getInt( BANDWIDTH ) * 125;
return mMessage.getInt(BANDWIDTH) * 125;
}
@Override
public long getChannelSpacing()
{
return mMessage.getLong( CHANNEL_SPACING ) * 125l;
return mMessage.getLong(CHANNEL_SPACING) * 125l;
}
@Override
public long getBaseFrequency()
{
return mMessage.getLong( BASE_FREQUENCY ) * 5l;
return mMessage.getLong(BASE_FREQUENCY) * 5l;
}
@Override
@Override
public long getTransmitOffset()
{
return -1 * mMessage.getLong( TRANSMIT_OFFSET ) * 250000l;
return -1 * mMessage.getLong(TRANSMIT_OFFSET) * 250000l;
}
@Override
public long getDownlinkFrequency(int channelNumber)
{
return getBaseFrequency() + (channelNumber * getChannelSpacing());
}
@Override
public long getUplinkFrequency(int channelNumber)
{
return getDownlinkFrequency(channelNumber) + getTransmitOffset();
}
@Override
public boolean isTDMA()
{
return false;
}
}

View File

@@ -1,82 +1,114 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tdu.lc;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.reference.LinkControlOpcode;
public class ChannelIdentifierUpdateExplicit extends TDULinkControlMessage
implements IBandIdentifier
public class ChannelIdentifierUpdateExplicit extends TDULinkControlMessage implements IBandIdentifier
{
public static final int[] IDENTIFIER = { 72,73,74,75 };
public static final int[] BANDWIDTH = { 88,89,90,91 };
public static final int[] TRANSMIT_OFFSET = { 92,93,94,95,96,97,98,99,112,
113,114,115,116,117 };
public static final int[] CHANNEL_SPACING = { 118,119,120,121,122,
123,136,137,138,139 };
public static final int[] BASE_FREQUENCY = { 140,141,142,143,144,145,146,
147,160,161,162,163,164,165,166,167,168,169,170,171,184,185,186,
187,188,189,190,191,192,193,194,195 };
public ChannelIdentifierUpdateExplicit( TDULinkControlMessage source )
{
super( source );
}
public static final int[] IDENTIFIER = {72, 73, 74, 75};
public static final int[] BANDWIDTH = {88, 89, 90, 91};
public static final int[] TRANSMIT_OFFSET = {92, 93, 94, 95, 96, 97, 98, 99, 112, 113, 114, 115, 116, 117};
public static final int[] CHANNEL_SPACING = {118, 119, 120, 121, 122, 123, 136, 137, 138, 139};
public static final int[] BASE_FREQUENCY = {140, 141, 142, 143, 144, 145, 146, 147, 160, 161, 162, 163, 164, 165,
166, 167, 168, 169, 170, 171, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195};
public ChannelIdentifierUpdateExplicit(TDULinkControlMessage source)
{
super(source);
}
@Override
public String getEventType()
{
return LinkControlOpcode.CHANNEL_IDENTIFIER_UPDATE_EXPLICIT.getDescription();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " IDEN:" + getIdentifier() );
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( " BASE:" + getBaseFrequency() );
sb.append( " BW:" + getBandwidth() );
sb.append( " SPACING:" + getChannelSpacing() );
sb.append( " OFFSET:" + getTransmitOffset() );
return sb.toString();
}
sb.append(getMessageStub());
@Override
public int getIdentifier()
{
return mMessage.getInt( IDENTIFIER );
}
sb.append(" IDEN:" + getIdentifier());
/**
sb.append(" BASE:" + getBaseFrequency());
sb.append(" BW:" + getBandwidth());
sb.append(" SPACING:" + getChannelSpacing());
sb.append(" OFFSET:" + getTransmitOffset());
return sb.toString();
}
@Override
public int getIdentifier()
{
return mMessage.getInt(IDENTIFIER);
}
/**
* Channel bandwidth in hertz
*/
@Override
public int getBandwidth()
{
return mMessage.getInt( BANDWIDTH ) * 125;
return mMessage.getInt(BANDWIDTH) * 125;
}
@Override
public long getChannelSpacing()
{
return mMessage.getLong( CHANNEL_SPACING ) * 125l;
return mMessage.getLong(CHANNEL_SPACING) * 125l;
}
@Override
public long getBaseFrequency()
{
return mMessage.getLong( BASE_FREQUENCY ) * 5l;
return mMessage.getLong(BASE_FREQUENCY) * 5l;
}
@Override
@Override
public long getTransmitOffset()
{
return -1 * mMessage.getLong( TRANSMIT_OFFSET ) * 250000l;
return -1 * mMessage.getLong(TRANSMIT_OFFSET) * 250000l;
}
@Override
public long getDownlinkFrequency(int channelNumber)
{
return getBaseFrequency() + (channelNumber * getChannelSpacing());
}
@Override
public long getUplinkFrequency(int channelNumber)
{
return getDownlinkFrequency(channelNumber) + getTransmitOffset();
}
@Override
public boolean isTDMA()
{
return false;
}
}

View File

@@ -1,176 +1,207 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tdu.lc;
import java.util.Set;
import java.util.TreeSet;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.reference.LinkControlOpcode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class GroupVoiceChannelUpdate extends TDULinkControlMessage
implements IdentifierReceiver
{
private final static Logger mLog =
LoggerFactory.getLogger( GroupVoiceChannelUpdate.class );
import java.util.Set;
import java.util.TreeSet;
public class GroupVoiceChannelUpdate extends TDULinkControlMessage implements IdentifierReceiver
{
public static final int[] IDENTIFIER_A = {72, 73, 74, 75};
public static final int[] CHANNEL_A = {88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99};
public static final int[] GROUP_ADDRESS_A = {112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 136, 137, 138, 139};
public static final int[] IDENTIFIER_B = {140, 141, 142, 143};
public static final int[] CHANNEL_B = {144, 145, 146, 147, 160, 161, 162, 163, 164, 165, 166, 167};
public static final int[] GROUP_ADDRESS_B = {168, 169, 170, 171, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195};
private IBandIdentifier mIdentifierUpdateA;
private IBandIdentifier mIdentifierUpdateB;
public GroupVoiceChannelUpdate(TDULinkControlMessage source)
{
super(source);
}
public static final int[] IDENTIFIER_A = { 72,73,74,75 };
public static final int[] CHANNEL_A = { 88,89,90,91,92,93,94,95,96,97,98,99 };
public static final int[] GROUP_ADDRESS_A = { 112,113,114,115,116,117,118,
119,120,121,122,123,136,137,138,139 };
public static final int[] IDENTIFIER_B = { 140,141,142,143 };
public static final int[] CHANNEL_B = { 144,145,146,147,160,161,162,163,164,
165,166,167 };
public static final int[] GROUP_ADDRESS_B = { 168,169,170,171,184,185,186,
187,188,189,190,191,192,193,194,195 };
private IBandIdentifier mIdentifierUpdateA;
private IBandIdentifier mIdentifierUpdateB;
public GroupVoiceChannelUpdate( TDULinkControlMessage source )
{
super( source );
}
@Override
public String getEventType()
{
return LinkControlOpcode.GROUP_VOICE_CHANNEL_UPDATE.getDescription();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " CHAN A:" + getChannelA() );
sb.append( " GRP A:" + getGroupAddressA() );
if( hasChannelB() )
{
sb.append( " CHAN B:" + getChannelA() );
sb.append( " GRP B:" + getGroupAddressA() );
}
return sb.toString();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append(getMessageStub());
sb.append(" CHAN A:" + getChannelA());
sb.append(" GRP A:" + getGroupAddressA());
if(hasChannelB())
{
sb.append(" CHAN B:" + getChannelA());
sb.append(" GRP B:" + getGroupAddressA());
}
return sb.toString();
}
public int getChannelIdentifierA()
{
return mMessage.getInt(IDENTIFIER_A);
}
public int getChannelIdentifierA()
{
return mMessage.getInt( IDENTIFIER_A );
}
public int getChannelNumberA()
{
return mMessage.getInt( CHANNEL_A );
return mMessage.getInt(CHANNEL_A);
}
public String getChannelA()
{
return getChannelIdentifierA() + "-" + getChannelNumberA();
return getChannelIdentifierA() + "-" + getChannelNumberA();
}
public int getChannelIdentifierB()
{
return mMessage.getInt( IDENTIFIER_B );
}
public int getChannelIdentifierB()
{
return mMessage.getInt(IDENTIFIER_B);
}
public int getChannelNumberB()
{
return mMessage.getInt( CHANNEL_B );
return mMessage.getInt(CHANNEL_B);
}
public String getChannelB()
{
return getChannelIdentifierB() + "-" + getChannelNumberB();
return getChannelIdentifierB() + "-" + getChannelNumberB();
}
public boolean hasChannelB()
{
return getChannelNumberB() != 0;
return getChannelNumberB() != 0;
}
public String getGroupAddressA()
{
return mMessage.getHex( GROUP_ADDRESS_A, 4 );
return mMessage.getHex(GROUP_ADDRESS_A, 4);
}
public String getGroupAddressB()
{
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
public void setIdentifierMessage( int identifier, IBandIdentifier message )
/**
* Returns a sorted list of addresses contained in the A and B fields
*
* @return
*/
public Set<String> getAddresses()
{
if( identifier == getChannelIdentifierA() )
{
mIdentifierUpdateA = message;
}
if( identifier == getChannelIdentifierB() )
{
mIdentifierUpdateB = message;
}
Set<String> addresses = new TreeSet<String>();
addresses.add(getGroupAddressA());
addresses.add(getGroupAddressB());
return addresses;
}
@Override
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if(identifier == getChannelIdentifierA())
{
mIdentifierUpdateA = message;
}
if(identifier == getChannelIdentifierB())
{
mIdentifierUpdateB = message;
}
}
@Override
public int[] getIdentifiers()
{
if( hasChannelB() )
{
int[] identifiers = new int[ 2 ];
identifiers[ 0 ] = getChannelIdentifierA();
identifiers[ 1 ] = getChannelIdentifierB();
return identifiers;
}
else
{
int[] identifiers = new int[ 1 ];
identifiers[ 0 ] = getChannelIdentifierA();
return identifiers;
}
if(hasChannelB())
{
int[] identifiers = new int[2];
identifiers[0] = getChannelIdentifierA();
identifiers[1] = getChannelIdentifierB();
return identifiers;
}
else
{
int[] identifiers = new int[1];
identifiers[0] = getChannelIdentifierA();
return identifiers;
}
}
public long getDownlinkFrequencyA()
{
return calculateDownlink( mIdentifierUpdateA, getChannelNumberA() );
if(mIdentifierUpdateA != null)
{
return mIdentifierUpdateA.getDownlinkFrequency(getChannelNumberA());
}
return 0;
}
public long getUplinkFrequencyA()
{
return calculateUplink( mIdentifierUpdateA, getChannelNumberA() );
if(mIdentifierUpdateA != null)
{
return mIdentifierUpdateA.getUplinkFrequency(getChannelNumberA());
}
return 0;
}
public long getDownlinkFrequencyB()
{
return calculateDownlink( mIdentifierUpdateB, getChannelNumberA() );
if(mIdentifierUpdateB != null)
{
return mIdentifierUpdateB.getDownlinkFrequency(getChannelNumberB());
}
return 0;
}
public long getUplinkFrequencyB()
{
return calculateUplink( mIdentifierUpdateB, getChannelNumberA() );
if(mIdentifierUpdateB != null)
{
return mIdentifierUpdateB.getUplinkFrequency(getChannelNumberB());
}
return 0;
}
}

View File

@@ -1,154 +1,176 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tdu.lc;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.reference.LinkControlOpcode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class GroupVoiceChannelUpdateExplicit extends TDULinkControlMessage
implements IdentifierReceiver
implements IdentifierReceiver
{
private final static Logger mLog =
LoggerFactory.getLogger( GroupVoiceChannelUpdateExplicit.class );
private final static Logger mLog =
LoggerFactory.getLogger(GroupVoiceChannelUpdateExplicit.class);
public static final int EMERGENCY_FLAG = 92;
public static final int ENCRYPTED_CHANNEL_FLAG = 93;
public static final int DUPLEX_MODE = 94;
public static final int SESSION_MODE = 95;
public static final int[] GROUP_ADDRESS = { 112,113,114,115,116,117,118,
119,120,121,122,123,136,137,138,139 };
public static final int[] TRANSMIT_IDENTIFIER = { 140,141,142,143 };
public static final int[] TRANSMIT_CHANNEL = { 144,145,146,147,160,161,162,
163,164,165,166,167 };
public static final int[] RECEIVE_IDENTIFIER = { 168,169,170,171 };
public static final int[] RECEIVE_CHANNEL = { 184,185,186,187,188,189,190,
191,192,193,194,195,196,197,198,199 };
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public GroupVoiceChannelUpdateExplicit( TDULinkControlMessage source )
{
super( source );
}
public static final int[] GROUP_ADDRESS = {112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 136, 137, 138, 139};
public static final int[] TRANSMIT_IDENTIFIER = {140, 141, 142, 143};
public static final int[] TRANSMIT_CHANNEL = {144, 145, 146, 147, 160, 161, 162, 163, 164, 165, 166, 167};
public static final int[] RECEIVE_IDENTIFIER = {168, 169, 170, 171};
public static final int[] RECEIVE_CHANNEL = {184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199};
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public GroupVoiceChannelUpdateExplicit(TDULinkControlMessage source)
{
super(source);
}
@Override
public String getEventType()
{
return LinkControlOpcode.GROUP_VOICE_CHANNEL_UPDATE_EXPLICIT.getDescription();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
if( isEmergency() )
{
sb.append( " EMERGENCY" );
}
if( isEncryptedChannel() )
{
sb.append( " ENCRYPTED CHANNEL" );
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
return sb.toString();
}
sb.append(getMessageStub());
if(isEmergency())
{
sb.append(" EMERGENCY");
}
if(isEncryptedChannel())
{
sb.append(" ENCRYPTED CHANNEL");
}
return sb.toString();
}
public boolean isEmergency()
{
return mMessage.get( EMERGENCY_FLAG );
return mMessage.get(EMERGENCY_FLAG);
}
public boolean isEncryptedChannel()
{
return mMessage.get( ENCRYPTED_CHANNEL_FLAG );
return mMessage.get(ENCRYPTED_CHANNEL_FLAG);
}
public DuplexMode getDuplexMode()
{
return mMessage.get( DUPLEX_MODE ) ? DuplexMode.FULL : DuplexMode.HALF;
return mMessage.get(DUPLEX_MODE) ? DuplexMode.FULL : DuplexMode.HALF;
}
public SessionMode getSessionMode()
{
return mMessage.get( SESSION_MODE ) ?
SessionMode.CIRCUIT : SessionMode.PACKET;
return mMessage.get(SESSION_MODE) ?
SessionMode.CIRCUIT : SessionMode.PACKET;
}
public int getTransmitChannelIdentifier()
{
return mMessage.getInt( TRANSMIT_IDENTIFIER );
}
public int getTransmitChannelNumber()
{
return mMessage.getInt( TRANSMIT_CHANNEL );
}
public String getTransmitChannel()
{
return getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveChannelIdentifier()
{
return mMessage.getInt( RECEIVE_IDENTIFIER );
}
public int getReceiveChannelNumber()
{
return mMessage.getInt( RECEIVE_CHANNEL );
}
public String getReceiveChannel()
{
return getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber();
}
public String getGroupAddress()
{
return mMessage.getHex( GROUP_ADDRESS, 4 );
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
{
if( identifier == getTransmitChannelIdentifier() )
{
mTransmitIdentifierUpdate = message;
}
if( identifier == getReceiveChannelIdentifier() )
{
mReceiveIdentifierUpdate = message;
}
return mMessage.getInt(TRANSMIT_IDENTIFIER);
}
@Override
public int getTransmitChannelNumber()
{
return mMessage.getInt(TRANSMIT_CHANNEL);
}
public String getTransmitChannel()
{
return getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveChannelIdentifier()
{
return mMessage.getInt(RECEIVE_IDENTIFIER);
}
public int getReceiveChannelNumber()
{
return mMessage.getInt(RECEIVE_CHANNEL);
}
public String getReceiveChannel()
{
return getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber();
}
public String getGroupAddress()
{
return mMessage.getHex(GROUP_ADDRESS, 4);
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if(identifier == getTransmitChannelIdentifier())
{
mTransmitIdentifierUpdate = message;
}
if(identifier == getReceiveChannelIdentifier())
{
mReceiveIdentifierUpdate = message;
}
}
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 2 ];
identifiers[ 0 ] = getTransmitChannelIdentifier();
identifiers[ 1 ] = getReceiveChannelIdentifier();
return identifiers;
int[] identifiers = new int[2];
identifiers[0] = getTransmitChannelIdentifier();
identifiers[1] = getReceiveChannelIdentifier();
return identifiers;
}
public long getDownlinkFrequency()
{
return calculateDownlink( mTransmitIdentifierUpdate,
getTransmitChannelNumber() );
if(mTransmitIdentifierUpdate != null)
{
return mTransmitIdentifierUpdate.getDownlinkFrequency(getTransmitChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
return calculateUplink( mReceiveIdentifierUpdate,
getReceiveChannelNumber() );
if(mReceiveIdentifierUpdate != null)
{
return mReceiveIdentifierUpdate.getUplinkFrequency(getReceiveChannelNumber());
}
return 0;
}
}

View File

@@ -1,3 +1,21 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tdu.lc;
import module.decode.p25.message.IBandIdentifier;
@@ -5,106 +23,106 @@ import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.reference.LinkControlOpcode;
import module.decode.p25.reference.Service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class NetworkStatusBroadcast extends TDULinkControlMessage
implements IdentifierReceiver
public class NetworkStatusBroadcast extends TDULinkControlMessage implements IdentifierReceiver
{
private final static Logger mLog =
LoggerFactory.getLogger( NetworkStatusBroadcast.class );
public static final int[] WACN = { 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[] SYSTEM = { 136,137,138,139,140,141,142,143,144,
145,146,147 };
public static final int[] IDENTIFIER = { 160,161,162,163 };
public static final int[] CHANNEL = { 164,165,166,167,168,169,170,171,184,
185,186,187 };
public static final int[] SYSTEM_SERVICE_CLASS = { 188,189,190,191,192,193,
194,195 };
private IBandIdentifier mIdentifierUpdate;
public NetworkStatusBroadcast( TDULinkControlMessage source )
{
super( source );
}
public static final int[] WACN = {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[] SYSTEM = {136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147};
public static final int[] IDENTIFIER = {160, 161, 162, 163};
public static final int[] CHANNEL = {164, 165, 166, 167, 168, 169, 170, 171, 184, 185, 186, 187};
public static final int[] SYSTEM_SERVICE_CLASS = {188, 189, 190, 191, 192, 193, 194, 195};
private IBandIdentifier mIdentifierUpdate;
public NetworkStatusBroadcast(TDULinkControlMessage source)
{
super(source);
}
@Override
public String getEventType()
{
return LinkControlOpcode.NETWORK_STATUS_BROADCAST.getDescription();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " NETWORK:" + getWACN() );
sb.append( " SYS:" + getSystem() );
sb.append( " CHAN:" + getChannel() );
sb.append( " " + Service.getServices( getSystemServiceClass() ).toString() );
return sb.toString();
}
public String getWACN()
{
return mMessage.getHex( WACN, 5 );
}
public String getSystem()
{
return mMessage.getHex( SYSTEM, 3 );
}
public int getIdentifier()
{
return mMessage.getInt( IDENTIFIER );
}
public int getChannelNumber()
{
return mMessage.getInt( CHANNEL );
}
public String getChannel()
{
return getIdentifier() + "-" + getChannelNumber();
}
public int getSystemServiceClass()
{
return mMessage.getInt( SYSTEM_SERVICE_CLASS );
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
@Override
public String getMessage()
{
mIdentifierUpdate = message;
StringBuilder sb = new StringBuilder();
sb.append(getMessageStub());
sb.append(" NETWORK:" + getWACN());
sb.append(" SYS:" + getSystem());
sb.append(" CHAN:" + getChannel());
sb.append(" " + Service.getServices(getSystemServiceClass()).toString());
return sb.toString();
}
@Override
public String getWACN()
{
return mMessage.getHex(WACN, 5);
}
public String getSystem()
{
return mMessage.getHex(SYSTEM, 3);
}
public int getIdentifier()
{
return mMessage.getInt(IDENTIFIER);
}
public int getChannelNumber()
{
return mMessage.getInt(CHANNEL);
}
public String getChannel()
{
return getIdentifier() + "-" + getChannelNumber();
}
public int getSystemServiceClass()
{
return mMessage.getInt(SYSTEM_SERVICE_CLASS);
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
mIdentifierUpdate = message;
}
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 1 ];
identifiers[ 0 ] = getIdentifier();
return identifiers;
int[] identifiers = new int[1];
identifiers[0] = getIdentifier();
return identifiers;
}
public long getDownlinkFrequency()
{
return calculateDownlink( mIdentifierUpdate, getChannelNumber() );
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.getDownlinkFrequency(getChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
return calculateUplink( mIdentifierUpdate, getChannelNumber() );
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.getUplinkFrequency(getChannelNumber());
}
return 0;
}
}

View File

@@ -1,131 +1,146 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tdu.lc;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.reference.LinkControlOpcode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class NetworkStatusBroadcastExplicit extends TDULinkControlMessage
implements IdentifierReceiver
public class NetworkStatusBroadcastExplicit extends TDULinkControlMessage implements IdentifierReceiver
{
private final static Logger mLog =
LoggerFactory.getLogger( NetworkStatusBroadcastExplicit.class );
public static final int[] WACN = {72, 73, 74, 75, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 112, 113, 114, 115};
public static final int[] SYSTEM = {116, 117, 118, 119, 120, 121, 122, 123, 136, 137, 138, 139};
public static final int[] TRANSMIT_IDENTIFIER = {140, 141, 142, 143};
public static final int[] TRANSMIT_CHANNEL = {144, 145, 146, 147, 160, 161, 162, 163, 164, 165, 166, 167};
public static final int[] RECEIVE_IDENTIFIER = {168, 169, 170, 171};
public static final int[] RECEIVE_CHANNEL = {184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195};
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public NetworkStatusBroadcastExplicit(TDULinkControlMessage source)
{
super(source);
}
public static final int[] WACN = { 72,73,74,75,88,89,90,91,92,93,94,95,96,
97,98,99,112,113,114,115 };
public static final int[] SYSTEM = { 116,117,118,119,120,121,122,123,136,
137,138,139 };
public static final int[] TRANSMIT_IDENTIFIER = { 140,141,142,143 };
public static final int[] TRANSMIT_CHANNEL = { 144,145,146,147,160,161,162,
163,164,165,166,167 };
public static final int[] RECEIVE_IDENTIFIER = { 168,169,170,171 };
public static final int[] RECEIVE_CHANNEL = { 184,185,186,187,188,189,190,
191,192,193,194,195 };
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public NetworkStatusBroadcastExplicit( TDULinkControlMessage source )
{
super( source );
}
@Override
public String getEventType()
{
return LinkControlOpcode.NETWORK_STATUS_BROADCAST_EXPLICIT.getDescription();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " NETWORK:" + getWACN() );
sb.append( " SYS:" + getSystem() );
sb.append( " TRANSMIT:" + getTransmitChannel() );
sb.append( " RECEIVE:" + getReceiveChannel() );
return sb.toString();
}
public String getWACN()
{
return mMessage.getHex( WACN, 5 );
}
public String getSystem()
{
return mMessage.getHex( SYSTEM, 3 );
}
public int getTransmitIdentifier()
{
return mMessage.getInt( TRANSMIT_IDENTIFIER );
}
public int getTransmitChannelNumber()
{
return mMessage.getInt( TRANSMIT_CHANNEL );
}
public String getTransmitChannel()
{
return getTransmitIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveIdentifier()
{
return mMessage.getInt( RECEIVE_IDENTIFIER );
}
public int getReceiveChannelNumber()
{
return mMessage.getInt( RECEIVE_CHANNEL );
}
public String getReceiveChannel()
{
return getReceiveIdentifier() + "-" + getReceiveChannelNumber();
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
@Override
public String getMessage()
{
if( identifier == getTransmitIdentifier() )
{
mTransmitIdentifierUpdate = message;
}
if( identifier == getReceiveIdentifier() )
{
mReceiveIdentifierUpdate = message;
}
StringBuilder sb = new StringBuilder();
sb.append(getMessageStub());
sb.append(" NETWORK:" + getWACN());
sb.append(" SYS:" + getSystem());
sb.append(" TRANSMIT:" + getTransmitChannel());
sb.append(" RECEIVE:" + getReceiveChannel());
return sb.toString();
}
@Override
public String getWACN()
{
return mMessage.getHex(WACN, 5);
}
public String getSystem()
{
return mMessage.getHex(SYSTEM, 3);
}
public int getTransmitIdentifier()
{
return mMessage.getInt(TRANSMIT_IDENTIFIER);
}
public int getTransmitChannelNumber()
{
return mMessage.getInt(TRANSMIT_CHANNEL);
}
public String getTransmitChannel()
{
return getTransmitIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveIdentifier()
{
return mMessage.getInt(RECEIVE_IDENTIFIER);
}
public int getReceiveChannelNumber()
{
return mMessage.getInt(RECEIVE_CHANNEL);
}
public String getReceiveChannel()
{
return getReceiveIdentifier() + "-" + getReceiveChannelNumber();
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if(identifier == getTransmitIdentifier())
{
mTransmitIdentifierUpdate = message;
}
if(identifier == getReceiveIdentifier())
{
mReceiveIdentifierUpdate = message;
}
}
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 2 ];
identifiers[ 0 ] = getTransmitIdentifier();
identifiers[ 1 ] = getReceiveIdentifier();
return identifiers;
int[] identifiers = new int[2];
identifiers[0] = getTransmitIdentifier();
identifiers[1] = getReceiveIdentifier();
return identifiers;
}
public long getDownlinkFrequency()
{
return calculateDownlink( mTransmitIdentifierUpdate,
getTransmitChannelNumber() );
if(mTransmitIdentifierUpdate != null)
{
return mTransmitIdentifierUpdate.getDownlinkFrequency(getTransmitChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
return calculateUplink( mReceiveIdentifierUpdate,
getReceiveChannelNumber() );
if(mReceiveIdentifierUpdate != null)
{
return mReceiveIdentifierUpdate.getUplinkFrequency(getReceiveChannelNumber());
}
return 0;
}
}

View File

@@ -1,3 +1,21 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tdu.lc;
import module.decode.p25.message.IBandIdentifier;
@@ -5,128 +23,124 @@ import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.tsbk.osp.control.SystemService;
import module.decode.p25.reference.LinkControlOpcode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class RFSSStatusBroadcast extends TDULinkControlMessage
implements IdentifierReceiver
public class RFSSStatusBroadcast extends TDULinkControlMessage implements IdentifierReceiver
{
private final static Logger mLog =
LoggerFactory.getLogger( RFSSStatusBroadcast.class );
public static final int[] LRA = {72, 73, 74, 75, 88, 89, 90, 91};
public static final int[] SYSTEM_ID = {96, 97, 98, 99, 112, 113, 114, 115, 116, 117, 118, 119};
public static final int[] RFSS_ID = {120, 121, 122, 123, 136, 137, 138, 139};
public static final int[] SITE_ID = {140, 141, 142, 143, 144, 145, 146, 147};
public static final int[] IDENTIFIER = {160, 161, 162, 163};
public static final int[] CHANNEL = {164, 165, 166, 167, 168, 169, 170, 171, 184, 185, 186, 187};
public static final int[] SYSTEM_SERVICE_CLASS = {188, 189, 190, 191, 192, 193, 194, 195};
private IBandIdentifier mIdentifierUpdate;
public RFSSStatusBroadcast(TDULinkControlMessage source)
{
super(source);
}
public static final int[] LRA = { 72,73,74,75,88,89,
90,91 };
public static final int[] SYSTEM_ID = { 96,97,98,99,112,113,114,115,116,117,
118,119 };
public static final int[] RFSS_ID = { 120,121,122,123,136,137,138,
139 };
public static final int[] SITE_ID = { 140,141,142,143,144,145,146,147 };
public static final int[] IDENTIFIER = { 160,161,162,163 };
public static final int[] CHANNEL = { 164,165,166,167,168,169,170,
171,184,185,186,187 };
public static final int[] SYSTEM_SERVICE_CLASS = { 188,189,190,191,192,193,
194,195 };
private IBandIdentifier mIdentifierUpdate;
public RFSSStatusBroadcast( TDULinkControlMessage source )
{
super( source );
}
@Override
public String getEventType()
{
return LinkControlOpcode.RFSS_STATUS_BROADCAST.getDescription();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " LRA:" + getLocationRegistrationArea() );
sb.append( " SYS:" + getSystem() );
sb.append( " SITE:" + getRFSubsystemID() + "-" + getSiteID() );
sb.append( " CHAN:" + getChannelNumber() );
sb.append( " " + SystemService.toString( getSystemServiceClass() ) );
sb.append( " " + mMessage.toString() );
return sb.toString();
}
public String getLocationRegistrationArea()
{
return mMessage.getHex( LRA, 2 );
}
public String getSystem()
{
return mMessage.getHex( SYSTEM_ID, 3 );
}
public String getRFSubsystemID()
{
return mMessage.getHex( RFSS_ID, 2 );
}
public String getSiteID()
{
return mMessage.getHex( SITE_ID, 2 );
}
public int getIdentifier()
{
return mMessage.getInt( IDENTIFIER );
}
public String getChannel()
{
return getIdentifier() + "-" + getChannelNumber();
}
public int getChannelNumber()
{
return mMessage.getInt( CHANNEL );
}
public int getSystemServiceClass()
{
return mMessage.getInt( SYSTEM_SERVICE_CLASS );
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
@Override
public String getMessage()
{
mIdentifierUpdate = message;
StringBuilder sb = new StringBuilder();
sb.append(getMessageStub());
sb.append(" LRA:" + getLocationRegistrationArea());
sb.append(" SYS:" + getSystem());
sb.append(" SITE:" + getRFSubsystemID() + "-" + getSiteID());
sb.append(" CHAN:" + getChannelNumber());
sb.append(" " + SystemService.toString(getSystemServiceClass()));
sb.append(" " + mMessage.toString());
return sb.toString();
}
@Override
public String getLocationRegistrationArea()
{
return mMessage.getHex(LRA, 2);
}
public String getSystem()
{
return mMessage.getHex(SYSTEM_ID, 3);
}
public String getRFSubsystemID()
{
return mMessage.getHex(RFSS_ID, 2);
}
public String getSiteID()
{
return mMessage.getHex(SITE_ID, 2);
}
public int getIdentifier()
{
return mMessage.getInt(IDENTIFIER);
}
public String getChannel()
{
return getIdentifier() + "-" + getChannelNumber();
}
public int getChannelNumber()
{
return mMessage.getInt(CHANNEL);
}
public int getSystemServiceClass()
{
return mMessage.getInt(SYSTEM_SERVICE_CLASS);
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
mIdentifierUpdate = message;
}
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 1 ];
identifiers[ 0 ] = getIdentifier();
return identifiers;
int[] identifiers = new int[1];
identifiers[0] = getIdentifier();
return identifiers;
}
public long getDownlinkFrequency()
{
return calculateDownlink( mIdentifierUpdate, getChannelNumber() );
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.getDownlinkFrequency(getChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
return calculateUplink( mIdentifierUpdate, getChannelNumber() );
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.getUplinkFrequency(getChannelNumber());
}
return 0;
}
}

View File

@@ -1,152 +1,171 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tdu.lc;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.tsbk.osp.control.SystemService;
import module.decode.p25.reference.LinkControlOpcode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class RFSSStatusBroadcastExplicit extends TDULinkControlMessage
implements IdentifierReceiver
public class RFSSStatusBroadcastExplicit extends TDULinkControlMessage implements IdentifierReceiver
{
private final static Logger mLog =
LoggerFactory.getLogger( RFSSStatusBroadcastExplicit.class );
private final static Logger mLog = LoggerFactory.getLogger(RFSSStatusBroadcastExplicit.class);
public static final int[] LRA = {72, 73, 74, 75, 88, 89, 90, 91};
public static final int[] RECEIVE_IDENTIFIER = {92, 93, 94, 95};
public static final int[] RECEIVE_CHANNEL = {96, 97, 98, 99, 112, 113, 114, 115, 116, 117, 118, 119};
public static final int[] RFSS_ID = {120, 121, 122, 123, 136, 137, 138, 139};
public static final int[] SITE_ID = {140, 141, 142, 143, 144, 145, 146, 147};
public static final int[] TRANSMIT_IDENTIFIER = {160, 161, 162, 163};
public static final int[] TRANSMIT_CHANNEL = {164, 165, 166, 167, 168, 169, 170, 171, 184, 185, 186, 187};
public static final int[] SYSTEM_SERVICE_CLASS = {188, 189, 190, 191, 192, 193, 194, 195};
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public RFSSStatusBroadcastExplicit(TDULinkControlMessage source)
{
super(source);
}
public static final int[] LRA = { 72,73,74,75,88,89,90,91 };
public static final int[] RECEIVE_IDENTIFIER = { 92,93,94,95 };
public static final int[] RECEIVE_CHANNEL = { 96,97,98,99,112,113,114,115,
116,117,118,119 };
public static final int[] RFSS_ID = { 120,121,122,123,136,137,138,
139 };
public static final int[] SITE_ID = { 140,141,142,143,144,145,146,147 };
public static final int[] TRANSMIT_IDENTIFIER = { 160,161,162,163 };
public static final int[] TRANSMIT_CHANNEL = { 164,165,166,167,168,169,170,
171,184,185,186,187 };
public static final int[] SYSTEM_SERVICE_CLASS = { 188,189,190,191,192,193,
194,195 };
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public RFSSStatusBroadcastExplicit( TDULinkControlMessage source )
{
super( source );
}
@Override
public String getEventType()
{
return LinkControlOpcode.RFSS_STATUS_BROADCAST_EXPLICIT.getDescription();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " LRA:" + getLocationRegistrationArea() );
sb.append( " SITE:" + getRFSubsystemID() + "-" + getSiteID() );
sb.append( " TRANSMIT:" + getTransmitChannelNumber() );
sb.append( " RECEIVE:" + getReceiveChannelNumber() );
sb.append( " " + SystemService.toString( getSystemServiceClass() ) );
sb.append( " " + mMessage.toString() );
return sb.toString();
}
public String getLocationRegistrationArea()
{
return mMessage.getHex( LRA, 2 );
}
public String getRFSubsystemID()
{
return mMessage.getHex( RFSS_ID, 2 );
}
public String getSiteID()
{
return mMessage.getHex( SITE_ID, 2 );
}
public int getTransmitIdentifier()
{
return mMessage.getInt( TRANSMIT_IDENTIFIER );
}
public String getTransmitChannel()
{
return getTransmitIdentifier() + "-" + getTransmitChannelNumber();
}
public int getTransmitChannelNumber()
{
return mMessage.getInt( TRANSMIT_CHANNEL );
}
public int getReceiveIdentifier()
{
return mMessage.getInt( RECEIVE_IDENTIFIER );
}
public String getReceiveChannel()
{
return getReceiveIdentifier() + "-" + getReceiveChannelNumber();
}
public int getReceiveChannelNumber()
{
return mMessage.getInt( RECEIVE_CHANNEL );
}
public int getSystemServiceClass()
{
return mMessage.getInt( SYSTEM_SERVICE_CLASS );
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
@Override
public String getMessage()
{
if( identifier == getTransmitIdentifier() )
{
mTransmitIdentifierUpdate = message;
}
if( identifier == getReceiveIdentifier() )
{
mReceiveIdentifierUpdate = message;
}
StringBuilder sb = new StringBuilder();
sb.append(getMessageStub());
sb.append(" LRA:" + getLocationRegistrationArea());
sb.append(" SITE:" + getRFSubsystemID() + "-" + getSiteID());
sb.append(" TRANSMIT:" + getTransmitChannelNumber());
sb.append(" RECEIVE:" + getReceiveChannelNumber());
sb.append(" " + SystemService.toString(getSystemServiceClass()));
sb.append(" " + mMessage.toString());
return sb.toString();
}
@Override
public String getLocationRegistrationArea()
{
return mMessage.getHex(LRA, 2);
}
public String getRFSubsystemID()
{
return mMessage.getHex(RFSS_ID, 2);
}
public String getSiteID()
{
return mMessage.getHex(SITE_ID, 2);
}
public int getTransmitIdentifier()
{
return mMessage.getInt(TRANSMIT_IDENTIFIER);
}
public String getTransmitChannel()
{
return getTransmitIdentifier() + "-" + getTransmitChannelNumber();
}
public int getTransmitChannelNumber()
{
return mMessage.getInt(TRANSMIT_CHANNEL);
}
public int getReceiveIdentifier()
{
return mMessage.getInt(RECEIVE_IDENTIFIER);
}
public String getReceiveChannel()
{
return getReceiveIdentifier() + "-" + getReceiveChannelNumber();
}
public int getReceiveChannelNumber()
{
return mMessage.getInt(RECEIVE_CHANNEL);
}
public int getSystemServiceClass()
{
return mMessage.getInt(SYSTEM_SERVICE_CLASS);
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if(identifier == getTransmitIdentifier())
{
mTransmitIdentifierUpdate = message;
}
if(identifier == getReceiveIdentifier())
{
mReceiveIdentifierUpdate = message;
}
}
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 2 ];
identifiers[ 0 ] = getTransmitIdentifier();
identifiers[ 1 ] = getReceiveIdentifier();
return identifiers;
int[] identifiers = new int[2];
identifiers[0] = getTransmitIdentifier();
identifiers[1] = getReceiveIdentifier();
return identifiers;
}
public long getDownlinkFrequency()
{
return calculateDownlink( mTransmitIdentifierUpdate, getTransmitChannelNumber() );
if(mTransmitIdentifierUpdate != null)
{
return mTransmitIdentifierUpdate.getDownlinkFrequency(getTransmitChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
return calculateUplink( mReceiveIdentifierUpdate, getReceiveChannelNumber() );
if(mReceiveIdentifierUpdate != null)
{
return mReceiveIdentifierUpdate.getUplinkFrequency(getReceiveChannelNumber());
}
return 0;
}
}

View File

@@ -1,3 +1,21 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tdu.lc;
import module.decode.p25.message.IBandIdentifier;
@@ -5,155 +23,162 @@ import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.tsbk.osp.control.SystemService;
import module.decode.p25.reference.LinkControlOpcode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SecondaryControlChannelBroadcast extends TDULinkControlMessage
implements IdentifierReceiver
public class SecondaryControlChannelBroadcast extends TDULinkControlMessage implements IdentifierReceiver
{
private final static Logger mLog =
LoggerFactory.getLogger( SecondaryControlChannelBroadcast.class );
public static final int[] RFSS_ID = {72, 73, 74, 75, 88, 89, 90, 91};
public static final int[] SITE_ID = {92, 93, 94, 95, 96, 97, 98, 99};
public static final int[] IDENTIFIER_A = {112, 113, 114, 115};
public static final int[] CHANNEL_A = {116, 117, 118, 119, 120, 121, 122, 123, 136, 137, 138, 139};
public static final int[] SYSTEM_SERVICE_CLASS_A = {140, 141, 142, 143, 144, 145, 146, 147};
public static final int[] IDENTIFIER_B = {160, 161, 162, 163};
public static final int[] CHANNEL_B = {164, 165, 166, 167, 168, 169, 170, 171, 184, 185, 186, 187};
public static final int[] SYSTEM_SERVICE_CLASS_B = {188, 189, 190, 191, 192, 193, 194, 195};
private IBandIdentifier mIdentifierProviderA;
private IBandIdentifier mIdentifierProviderB;
public SecondaryControlChannelBroadcast(TDULinkControlMessage source)
{
super(source);
}
public static final int[] RFSS_ID = { 72,73,74,75,88,89,90,91 };
public static final int[] SITE_ID = { 92,93,94,95,96,97,98,99 };
public static final int[] IDENTIFIER_A = { 112,113,114,115 };
public static final int[] CHANNEL_A = { 116,117,118,119,120,121,122,
123,136,137,138,139 };
public static final int[] SYSTEM_SERVICE_CLASS_A = { 140,141,142,143,144,
145,146,147 };
public static final int[] IDENTIFIER_B = { 160,161,162,163 };
public static final int[] CHANNEL_B = { 164,165,166,167,168,169,170,
171,184,185,186,187 };
public static final int[] SYSTEM_SERVICE_CLASS_B = { 188,189,190,191,192,
193,194,195 };
private IBandIdentifier mIdentifierProviderA;
private IBandIdentifier mIdentifierProviderB;
public SecondaryControlChannelBroadcast( TDULinkControlMessage source )
{
super( source );
}
@Override
public String getEventType()
{
return LinkControlOpcode.SECONDARY_CONTROL_CHANNEL_BROADCAST.getDescription();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " SITE:" + getRFSubsystemID() + "-" + getSiteID() );
sb.append( " CHAN A:" + getChannelA() );
sb.append( " " + SystemService.toString( getSystemServiceClassA() ) );
sb.append( " CHAN B:" + getChannelB() );
sb.append( " " + SystemService.toString( getSystemServiceClassB() ) );
return sb.toString();
}
public String getRFSubsystemID()
{
return mMessage.getHex( RFSS_ID, 2 );
}
public String getSiteID()
{
return mMessage.getHex( SITE_ID, 2 );
}
public int getIdentifierA()
{
return mMessage.getInt( IDENTIFIER_A );
}
public int getChannelA()
{
return mMessage.getInt( CHANNEL_A );
}
public String getChannelNumberA()
{
return getIdentifierA() + "-" + getChannelA();
}
public int getIdentifierB()
{
return mMessage.getInt( IDENTIFIER_B );
}
public int getChannelB()
{
return mMessage.getInt( CHANNEL_B );
}
public String getChannelNumberB()
{
return getIdentifierB() + "-" + getChannelB();
}
public int getSystemServiceClassA()
{
return mMessage.getInt( SYSTEM_SERVICE_CLASS_A );
}
public int getSystemServiceClassB()
{
return mMessage.getInt( SYSTEM_SERVICE_CLASS_B );
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
@Override
public String getMessage()
{
if( identifier == getIdentifierA() )
{
mIdentifierProviderA = message;
}
if( identifier == getIdentifierB() )
{
mIdentifierProviderB = message;
}
StringBuilder sb = new StringBuilder();
sb.append(getMessageStub());
sb.append(" SITE:" + getRFSubsystemID() + "-" + getSiteID());
sb.append(" CHAN A:" + getChannelA());
sb.append(" " + SystemService.toString(getSystemServiceClassA()));
sb.append(" CHAN B:" + getChannelB());
sb.append(" " + SystemService.toString(getSystemServiceClassB()));
return sb.toString();
}
@Override
public String getRFSubsystemID()
{
return mMessage.getHex(RFSS_ID, 2);
}
public String getSiteID()
{
return mMessage.getHex(SITE_ID, 2);
}
public int getIdentifierA()
{
return mMessage.getInt(IDENTIFIER_A);
}
public int getChannelA()
{
return mMessage.getInt(CHANNEL_A);
}
public String getChannelNumberA()
{
return getIdentifierA() + "-" + getChannelA();
}
public int getIdentifierB()
{
return mMessage.getInt(IDENTIFIER_B);
}
public int getChannelB()
{
return mMessage.getInt(CHANNEL_B);
}
public String getChannelNumberB()
{
return getIdentifierB() + "-" + getChannelB();
}
public int getSystemServiceClassA()
{
return mMessage.getInt(SYSTEM_SERVICE_CLASS_A);
}
public int getSystemServiceClassB()
{
return mMessage.getInt(SYSTEM_SERVICE_CLASS_B);
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if(identifier == getIdentifierA())
{
mIdentifierProviderA = message;
}
if(identifier == getIdentifierB())
{
mIdentifierProviderB = message;
}
}
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 2 ];
identifiers[ 0 ] = getIdentifierA();
identifiers[ 1 ] = getIdentifierB();
return identifiers;
int[] identifiers = new int[2];
identifiers[0] = getIdentifierA();
identifiers[1] = getIdentifierB();
return identifiers;
}
public long getDownlinkFrequencyA()
{
return calculateDownlink( mIdentifierProviderA, getChannelA() );
if(mIdentifierProviderA != null)
{
return mIdentifierProviderA.getDownlinkFrequency(getChannelA());
}
return 0;
}
public long getUplinkFrequencyA()
{
return calculateUplink( mIdentifierProviderA, getChannelA() );
if(mIdentifierProviderA != null)
{
return mIdentifierProviderA.getUplinkFrequency(getChannelA());
}
return 0;
}
public long getDownlinkFrequencyB()
{
return calculateDownlink( mIdentifierProviderB, getChannelB() );
if(mIdentifierProviderB != null)
{
return mIdentifierProviderB.getDownlinkFrequency(getChannelB());
}
return 0;
}
public long getUplinkFrequencyB()
{
return calculateUplink( mIdentifierProviderB, getChannelB() );
if(mIdentifierProviderB != null)
{
return mIdentifierProviderB.getUplinkFrequency(getChannelB());
}
return 0;
}
}

View File

@@ -1,3 +1,21 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tdu.lc;
import module.decode.p25.message.IBandIdentifier;
@@ -5,136 +23,134 @@ import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.tsbk.osp.control.SystemService;
import module.decode.p25.reference.LinkControlOpcode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SecondaryControlChannelBroadcastExplicit
extends TDULinkControlMessage implements IdentifierReceiver
public class SecondaryControlChannelBroadcastExplicit extends TDULinkControlMessage implements IdentifierReceiver
{
private final static Logger mLog =
LoggerFactory.getLogger( SecondaryControlChannelBroadcastExplicit.class );
public static final int[] RFSS_ID = {72, 73, 74, 75, 88, 89, 90, 91};
public static final int[] SITE_ID = {92, 93, 94, 95, 96, 97, 98, 99};
public static final int[] TRANSMIT_IDENTIFIER = {112, 113, 114, 115};
public static final int[] TRANSMIT_CHANNEL = {116, 117, 118, 119, 120, 121, 122, 123, 136, 137, 138, 139};
public static final int[] RECEIVE_IDENTIFIER = {140, 141, 142, 143};
public static final int[] RECEIVE_CHANNEL = {144, 145, 146, 147, 160, 161, 162, 163, 164, 165, 166, 167};
public static final int[] SYSTEM_SERVICE_CLASS = {168, 169, 170, 171, 184, 185, 186, 187};
private IBandIdentifier mTransmitIdentifierProvider;
private IBandIdentifier mReceiveIdentifierProvider;
public SecondaryControlChannelBroadcastExplicit(TDULinkControlMessage source)
{
super(source);
}
public static final int[] RFSS_ID = { 72,73,74,75,88,89,90,91 };
public static final int[] SITE_ID = { 92,93,94,95,96,97,98,99 };
public static final int[] TRANSMIT_IDENTIFIER = { 112,113,114,115 };
public static final int[] TRANSMIT_CHANNEL = { 116,117,118,119,120,121,122,
123,136,137,138,139 };
public static final int[] RECEIVE_IDENTIFIER = { 140,141,142,143 };
public static final int[] RECEIVE_CHANNEL = { 144,145,146,147,160,161,162,
163,164,165,166,167 };
public static final int[] SYSTEM_SERVICE_CLASS = { 168,169,170,171,184,
185,186,187 };
private IBandIdentifier mTransmitIdentifierProvider;
private IBandIdentifier mReceiveIdentifierProvider;
public SecondaryControlChannelBroadcastExplicit( TDULinkControlMessage source )
{
super( source );
}
@Override
public String getEventType()
{
return LinkControlOpcode.SECONDARY_CONTROL_CHANNEL_BROADCAST_EXPLICIT.getDescription();
}
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " SITE:" + getRFSubsystemID() + "-" + getSiteID() );
sb.append( " TRANSMIT:" + getTransmitChannel() );
sb.append( " RECEIVE:" + getReceiveChannel() );
sb.append( " " + SystemService.toString( getSystemServiceClass() ) );
return sb.toString();
}
public String getRFSubsystemID()
{
return mMessage.getHex( RFSS_ID, 2 );
}
public String getSiteID()
{
return mMessage.getHex( SITE_ID, 2 );
}
public int getTransmitIdentifier()
{
return mMessage.getInt( TRANSMIT_IDENTIFIER );
}
public int getTransmitChannelNumber()
{
return mMessage.getInt( TRANSMIT_CHANNEL );
}
public String getTransmitChannel()
{
return getTransmitIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveIdentifier()
{
return mMessage.getInt( RECEIVE_IDENTIFIER );
}
public int getReceiveChannelNumber()
{
return mMessage.getInt( RECEIVE_CHANNEL );
}
public String getReceiveChannel()
{
return getReceiveIdentifier() + "-" + getReceiveChannelNumber();
}
public int getSystemServiceClass()
{
return mMessage.getInt( SYSTEM_SERVICE_CLASS );
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
@Override
public String getMessage()
{
if( identifier == getTransmitIdentifier() )
{
mTransmitIdentifierProvider = message;
}
if( identifier == getReceiveIdentifier() )
{
mReceiveIdentifierProvider = message;
}
StringBuilder sb = new StringBuilder();
sb.append(getMessageStub());
sb.append(" SITE:" + getRFSubsystemID() + "-" + getSiteID());
sb.append(" TRANSMIT:" + getTransmitChannel());
sb.append(" RECEIVE:" + getReceiveChannel());
sb.append(" " + SystemService.toString(getSystemServiceClass()));
return sb.toString();
}
@Override
public String getRFSubsystemID()
{
return mMessage.getHex(RFSS_ID, 2);
}
public String getSiteID()
{
return mMessage.getHex(SITE_ID, 2);
}
public int getTransmitIdentifier()
{
return mMessage.getInt(TRANSMIT_IDENTIFIER);
}
public int getTransmitChannelNumber()
{
return mMessage.getInt(TRANSMIT_CHANNEL);
}
public String getTransmitChannel()
{
return getTransmitIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveIdentifier()
{
return mMessage.getInt(RECEIVE_IDENTIFIER);
}
public int getReceiveChannelNumber()
{
return mMessage.getInt(RECEIVE_CHANNEL);
}
public String getReceiveChannel()
{
return getReceiveIdentifier() + "-" + getReceiveChannelNumber();
}
public int getSystemServiceClass()
{
return mMessage.getInt(SYSTEM_SERVICE_CLASS);
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if(identifier == getTransmitIdentifier())
{
mTransmitIdentifierProvider = message;
}
if(identifier == getReceiveIdentifier())
{
mReceiveIdentifierProvider = message;
}
}
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 2 ];
identifiers[ 0 ] = getTransmitIdentifier();
identifiers[ 1 ] = getReceiveIdentifier();
return identifiers;
int[] identifiers = new int[2];
identifiers[0] = getTransmitIdentifier();
identifiers[1] = getReceiveIdentifier();
return identifiers;
}
public long getDownlinkFrequency()
{
return calculateDownlink( mTransmitIdentifierProvider,
getTransmitChannelNumber() );
if(mTransmitIdentifierProvider != null)
{
return mTransmitIdentifierProvider.getDownlinkFrequency(getTransmitChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
return calculateUplink( mReceiveIdentifierProvider,
getReceiveChannelNumber() );
if(mReceiveIdentifierProvider != null)
{
return mReceiveIdentifierProvider.getUplinkFrequency(getReceiveChannelNumber());
}
return 0;
}
}

View File

@@ -1,26 +1,53 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tsbk;
import alias.AliasList;
import bits.BinaryMessage;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.reference.DataUnitID;
import alias.AliasList;
import bits.BinaryMessage;
public abstract class ChannelGrant extends ServiceMessage
implements IdentifierReceiver
public abstract class ChannelGrant extends ServiceMessage implements IdentifierReceiver
{
public static final int[] PRIORITY = { 85,86,87 };
public static final int[] CHANNEL_IDENTIFIER = { 88,89,90,91 };
public static final int[] CHANNEL_NUMBER = { 92,93,94,95,96,97,98,99,100,
101,102,103 };
public static final int[] PRIORITY = {85, 86, 87};
public static final int[] CHANNEL_IDENTIFIER = {88, 89, 90, 91};
public static final int[] CHANNEL_NUMBER = {92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103};
private IBandIdentifier mIdentifierUpdate;
public ChannelGrant( BinaryMessage message,
DataUnitID duid,
AliasList aliasList )
public ChannelGrant(BinaryMessage message, DataUnitID duid, AliasList aliasList)
{
super( message, duid, aliasList );
super(message, duid, aliasList);
}
/**
* Indicates if this channel grant is for a TDMA channel
*/
public boolean isTDMAChannel()
{
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.isTDMA();
}
return false;
}
/**
@@ -28,47 +55,56 @@ public abstract class ChannelGrant extends ServiceMessage
*/
public int getPriority()
{
return mMessage.getInt( PRIORITY );
return mMessage.getInt(PRIORITY);
}
public int getChannelIdentifier()
{
return mMessage.getInt( CHANNEL_IDENTIFIER );
return mMessage.getInt(CHANNEL_IDENTIFIER);
}
public int getChannelNumber()
{
return mMessage.getInt( CHANNEL_NUMBER );
return mMessage.getInt(CHANNEL_NUMBER);
}
public String getChannel()
{
return getChannelIdentifier() + "-" + getChannelNumber();
return getChannelIdentifier() + "-" + getChannelNumber();
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
mIdentifierUpdate = message;
mIdentifierUpdate = message;
}
@Override
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 1 ];
identifiers[ 0 ] = getChannelIdentifier();
return identifiers;
}
public long getDownlinkFrequency()
{
return calculateDownlink( mIdentifierUpdate, getChannelNumber() );
}
public long getUplinkFrequency()
{
return calculateUplink( mIdentifierUpdate, getChannelNumber() );
int[] identifiers = new int[1];
identifiers[0] = getChannelIdentifier();
return identifiers;
}
public long getDownlinkFrequency()
{
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.getDownlinkFrequency(getChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.getUplinkFrequency(getChannelNumber());
}
return 0;
}
}

View File

@@ -1,120 +1,155 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tsbk;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.reference.DataUnitID;
import alias.AliasList;
import bits.BinaryMessage;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.reference.DataUnitID;
public abstract class GroupChannelGrantExplicit extends ChannelGrant
{
public static final int[] TRANSMIT_IDENTIFIER = { 96,97,98,99 };
public static final int[] TRANSMIT_NUMBER = { 100,101,102,103,
104,105,106,107,108,109,110,111 };
public static final int[] RECEIVE_IDENTIFIER = { 112,113,114,115 };
public static final int[] RECEIVE_NUMBER = { 116,117,118,119,
120,121,122,123,124,125,126,127 };
public static final int[] GROUP_ADDRESS = { 128,129,130,131,132,133,134,135,
136,137,138,139,140,141,142,143 };
public static final int[] TRANSMIT_IDENTIFIER = {96, 97, 98, 99};
public static final int[] TRANSMIT_NUMBER = {100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111};
public static final int[] RECEIVE_IDENTIFIER = {112, 113, 114, 115};
public static final int[] RECEIVE_NUMBER = {116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127};
public static final int[] GROUP_ADDRESS = {128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141,
142, 143};
private IBandIdentifier mTransmitIdentifierUpdate;
private IBandIdentifier mReceiveIdentifierUpdate;
public GroupChannelGrantExplicit( BinaryMessage message,
DataUnitID duid,
AliasList aliasList )
public GroupChannelGrantExplicit(BinaryMessage message, DataUnitID duid, AliasList aliasList)
{
super( message, duid, aliasList );
super(message, duid, aliasList);
}
@Override
public boolean isTDMAChannel()
{
if(mTransmitIdentifierUpdate != null)
{
return mTransmitIdentifierUpdate.isTDMA();
}
return false;
}
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
if( isEmergency() )
sb.append(getMessageStub());
if(isEmergency())
{
sb.append( " EMERGENCY" );
sb.append(" EMERGENCY");
}
sb.append( " XMIT:" );
sb.append( getTransmitChannelIdentifier() + "/" + getTransmitChannelNumber() );
sb.append( " RCV:" );
sb.append( getReceiveChannelIdentifier() + "/" + getReceiveChannelNumber() );
sb.append( " GRP:" );
sb.append( getGroupAddress() );
sb.append(" XMIT:");
sb.append(getTransmitChannelIdentifier() + "/" + getTransmitChannelNumber());
sb.append(" RCV:");
sb.append(getReceiveChannelIdentifier() + "/" + getReceiveChannelNumber());
sb.append(" GRP:");
sb.append(getGroupAddress());
return sb.toString();
}
public int getTransmitChannelIdentifier()
{
return mMessage.getInt( TRANSMIT_IDENTIFIER );
}
public int getTransmitChannelNumber()
{
return mMessage.getInt( TRANSMIT_NUMBER );
}
public String getTransmitChannel()
{
return getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveChannelIdentifier()
{
return mMessage.getInt( RECEIVE_IDENTIFIER );
}
public int getReceiveChannelNumber()
{
return mMessage.getInt( RECEIVE_NUMBER );
}
public String getReceiveChannel()
{
return getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber();
}
public String getGroupAddress()
{
return mMessage.getHex( GROUP_ADDRESS, 4 );
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
{
if( identifier == getTransmitChannelIdentifier() )
{
mTransmitIdentifierUpdate = message;
}
if( identifier == getReceiveChannelIdentifier() )
{
mReceiveIdentifierUpdate = message;
}
return mMessage.getInt(TRANSMIT_IDENTIFIER);
}
@Override
public int getTransmitChannelNumber()
{
return mMessage.getInt(TRANSMIT_NUMBER);
}
public String getTransmitChannel()
{
return getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveChannelIdentifier()
{
return mMessage.getInt(RECEIVE_IDENTIFIER);
}
public int getReceiveChannelNumber()
{
return mMessage.getInt(RECEIVE_NUMBER);
}
public String getReceiveChannel()
{
return getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber();
}
public String getGroupAddress()
{
return mMessage.getHex(GROUP_ADDRESS, 4);
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if(identifier == getTransmitChannelIdentifier())
{
mTransmitIdentifierUpdate = message;
}
if(identifier == getReceiveChannelIdentifier())
{
mReceiveIdentifierUpdate = message;
}
}
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 2 ];
identifiers[ 0 ] = getTransmitChannelIdentifier();
identifiers[ 1 ] = getReceiveChannelIdentifier();
return identifiers;
int[] identifiers = new int[2];
identifiers[0] = getTransmitChannelIdentifier();
identifiers[1] = getReceiveChannelIdentifier();
return identifiers;
}
public long getDownlinkFrequency()
{
return calculateDownlink( mTransmitIdentifierUpdate, getTransmitChannelNumber() );
if(mTransmitIdentifierUpdate != null)
{
return mTransmitIdentifierUpdate.getDownlinkFrequency(getTransmitChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
return calculateUplink( mReceiveIdentifierUpdate, getReceiveChannelNumber() );
if(mReceiveIdentifierUpdate != null)
{
return mReceiveIdentifierUpdate.getUplinkFrequency(getReceiveChannelNumber());
}
return 0;
}
}

View File

@@ -1,106 +1,116 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tsbk;
import alias.AliasList;
import bits.BinaryMessage;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.reference.DataUnitID;
import alias.AliasList;
import bits.BinaryMessage;
public abstract class GroupMultiChannelGrant extends ChannelGrant
implements IdentifierReceiver
public abstract class GroupMultiChannelGrant extends ChannelGrant implements IdentifierReceiver
{
public static final int[] CHANNEL_IDENTIFIER_1 = { 80,81,82,83 };
public static final int[] CHANNEL_NUMBER_1 = { 84,85,86,87,
88,89,90,91,92,93,94,95 };
public static final int[] GROUP_ADDRESS_1 = { 96,97,98,99,100,101,102,103,
104,105,106,107,108,109,110,111 };
public static final int[] CHANNEL_IDENTIFIER_2 = { 112,113,114,115 };
public static final int[] CHANNEL_NUMBER_2 = { 116,117,118,119,120,121,122,
123,124,125,126,127 };
public static final int[] GROUP_ADDRESS_2 = { 128,129,130,131,132,133,134,
135,136,137,138,139,140,141,142,143 };
public static final int[] CHANNEL_IDENTIFIER_1 = {80, 81, 82, 83};
public static final int[] CHANNEL_NUMBER_1 = {84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95};
public static final int[] GROUP_ADDRESS_1 = {96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111};
public static final int[] CHANNEL_IDENTIFIER_2 = {112, 113, 114, 115};
public static final int[] CHANNEL_NUMBER_2 = {116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127};
public static final int[] GROUP_ADDRESS_2 = {128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143};
private IBandIdentifier mIdentifierUpdate1;
private IBandIdentifier mIdentifierUpdate2;
public GroupMultiChannelGrant( BinaryMessage message,
DataUnitID duid,
AliasList aliasList )
public GroupMultiChannelGrant(BinaryMessage message, DataUnitID duid, AliasList aliasList)
{
super( message, duid, aliasList );
super(message, duid, aliasList);
}
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " CHAN1:" );
sb.append( getChannelIdentifier1() + "/" + getChannelNumber1() );
sb.append( " GRP1:" );
sb.append( getGroupAddress1() );
if( hasChannelNumber2() )
sb.append(getMessageStub());
sb.append(" CHAN1:");
sb.append(getChannelIdentifier1() + "/" + getChannelNumber1());
sb.append(" GRP1:");
sb.append(getGroupAddress1());
if(hasChannelNumber2())
{
sb.append( " CHAN2:" );
sb.append( getChannelIdentifier2() + "/" + getChannelNumber2() );
sb.append( " GRP2:" );
sb.append( getGroupAddress2() );
sb.append(" CHAN2:");
sb.append(getChannelIdentifier2() + "/" + getChannelNumber2());
sb.append(" GRP2:");
sb.append(getGroupAddress2());
}
return sb.toString();
}
public int getChannelIdentifier1()
{
return mMessage.getInt( CHANNEL_IDENTIFIER_1 );
return mMessage.getInt(CHANNEL_IDENTIFIER_1);
}
public int getChannelNumber1()
{
return mMessage.getInt( CHANNEL_NUMBER_1 );
return mMessage.getInt(CHANNEL_NUMBER_1);
}
public String getChannel1()
{
return getChannelIdentifier1() + "-" + getChannelNumber1();
return getChannelIdentifier1() + "-" + getChannelNumber1();
}
public String getGroupAddress1()
{
return mMessage.getHex( GROUP_ADDRESS_1, 4 );
return mMessage.getHex(GROUP_ADDRESS_1, 4);
}
public int getChannelIdentifier2()
{
return mMessage.getInt( CHANNEL_IDENTIFIER_2 );
return mMessage.getInt(CHANNEL_IDENTIFIER_2);
}
public int getChannelNumber2()
{
return mMessage.getInt( CHANNEL_NUMBER_2 );
return mMessage.getInt(CHANNEL_NUMBER_2);
}
public String getChannel2()
{
return getChannelIdentifier2() + "-" + getChannelNumber2();
return getChannelIdentifier2() + "-" + getChannelNumber2();
}
public String getGroupAddress2()
{
return mMessage.getHex( GROUP_ADDRESS_2, 4 );
return mMessage.getHex(GROUP_ADDRESS_2, 4);
}
public boolean hasChannelNumber2()
{
return mMessage.getInt( CHANNEL_NUMBER_2 ) !=
mMessage.getInt( CHANNEL_NUMBER_1 );
return mMessage.getInt(CHANNEL_NUMBER_2) !=
mMessage.getInt(CHANNEL_NUMBER_1);
}
@Override
public String getFromID()
{
@@ -112,59 +122,99 @@ public abstract class GroupMultiChannelGrant extends ChannelGrant
{
return getGroupAddress2();
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
{
if( identifier == getChannelIdentifier1() )
{
mIdentifierUpdate1 = message;
}
if( hasChannelNumber2() && identifier == getChannelIdentifier2() )
{
mIdentifierUpdate2 = message;
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if(identifier == getChannelIdentifier1())
{
mIdentifierUpdate1 = message;
}
if(hasChannelNumber2() && identifier == getChannelIdentifier2())
{
mIdentifierUpdate2 = message;
}
}
@Override
@Override
public int[] getIdentifiers()
{
int[] identifiers;
if( hasChannelNumber2() )
{
identifiers = new int[ 2 ];
identifiers[ 0 ] = getChannelIdentifier1();
identifiers[ 1 ] = getChannelIdentifier2();
}
else
{
identifiers = new int[ 1 ];
identifiers[ 0 ] = getChannelIdentifier1();
}
return identifiers;
int[] identifiers;
if(hasChannelNumber2())
{
identifiers = new int[2];
identifiers[0] = getChannelIdentifier1();
identifiers[1] = getChannelIdentifier2();
}
else
{
identifiers = new int[1];
identifiers[0] = getChannelIdentifier1();
}
return identifiers;
}
public long getDownlinkFrequency1()
{
return calculateDownlink( mIdentifierUpdate1, getChannelNumber1() );
if(mIdentifierUpdate1 != null)
{
return mIdentifierUpdate1.getDownlinkFrequency(getChannelNumber1());
}
return 0;
}
public boolean isTDMAChannel1()
{
if(mIdentifierUpdate1 != null)
{
return mIdentifierUpdate1.isTDMA();
}
return false;
}
public long getUplinkFrequency1()
{
return calculateUplink( mIdentifierUpdate1, getChannelNumber1() );
if(mIdentifierUpdate1 != null)
{
return mIdentifierUpdate1.getUplinkFrequency(getChannelNumber1());
}
return 0;
}
public long getDownlinkFrequency2()
{
return calculateDownlink( mIdentifierUpdate2, getChannelNumber2() );
if(mIdentifierUpdate2 != null)
{
return mIdentifierUpdate2.getDownlinkFrequency(getChannelNumber2());
}
return 0;
}
public boolean isTDMAChannel2()
{
if(mIdentifierUpdate2 != null)
{
return mIdentifierUpdate2.isTDMA();
}
return false;
}
public long getUplinkFrequency2()
{
return calculateUplink( mIdentifierUpdate2, getChannelNumber2() );
if(mIdentifierUpdate2 != null)
{
return mIdentifierUpdate2.getUplinkFrequency(getChannelNumber2());
}
return 0;
}
}

View File

@@ -1,55 +1,70 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tsbk;
import module.decode.p25.reference.DataUnitID;
import alias.Alias;
import alias.AliasList;
import bits.BinaryMessage;
import module.decode.p25.reference.DataUnitID;
public abstract class UnitChannelGrant extends ChannelGrant
{
public static final int[] TARGET_ADDRESS = { 96,97,98,99,100,101,102,103,
104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119 };
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 };
public UnitChannelGrant( BinaryMessage message,
DataUnitID duid,
AliasList aliasList )
public static final int[] TARGET_ADDRESS = {96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110,
111, 112, 113, 114, 115, 116, 117, 118, 119};
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};
public UnitChannelGrant(BinaryMessage message, DataUnitID duid, AliasList aliasList)
{
super( message, duid, aliasList );
super(message, duid, aliasList);
}
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
if( isEmergency() )
sb.append(getMessageStub());
if(isEmergency())
{
sb.append( " EMERGENCY" );
sb.append(" EMERGENCY");
}
sb.append( " FROM:" );
sb.append( getSourceAddress() );
sb.append( " TO:" );
sb.append( getTargetAddress() );
sb.append(" FROM:");
sb.append(getSourceAddress());
sb.append(" TO:");
sb.append(getTargetAddress());
return sb.toString();
}
public String getTargetAddress()
{
return mMessage.getHex( TARGET_ADDRESS, 6 );
return mMessage.getHex(TARGET_ADDRESS, 6);
}
public String getSourceAddress()
{
return mMessage.getHex( SOURCE_ADDRESS, 6 );
return mMessage.getHex(SOURCE_ADDRESS, 6);
}
@Override
public String getFromID()
{
@@ -59,11 +74,11 @@ public abstract class UnitChannelGrant extends ChannelGrant
@Override
public Alias getFromIDAlias()
{
if( mAliasList != null )
if(mAliasList != null)
{
return mAliasList.getTalkgroupAlias( getFromID() );
return mAliasList.getTalkgroupAlias(getFromID());
}
return null;
}

View File

@@ -1,34 +1,48 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tsbk.motorola;
import alias.AliasList;
import bits.BinaryMessage;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.reference.DataUnitID;
import alias.AliasList;
import bits.BinaryMessage;
public class ControlChannelBaseStationIdentification extends MotorolaTSBKMessage
implements IdentifierReceiver
public class ControlChannelBaseStationIdentification extends MotorolaTSBKMessage implements IdentifierReceiver
{
public static final int[] CHARACTER_1 = { 80,81,82,83,84,85 };
public static final int[] CHARACTER_2 = { 86,87,88,89,90,91 };
public static final int[] CHARACTER_3 = { 92,93,94,95,96,97 };
public static final int[] CHARACTER_4 = { 98,99,100,101,102,103 };
public static final int[] CHARACTER_5 = { 104,105,106,107,108,109 };
public static final int[] CHARACTER_6 = { 110,111,112,113,114,115 };
public static final int[] CHARACTER_7 = { 116,117,118,119,120,121 };
public static final int[] CHARACTER_8 = { 122,123,124,125,126,127 };
public static final int[] IDENTIFIER = { 128,129,130,131 };
public static final int[] CHANNEL = { 132,133,134,135,136,137,138,139,140,
141,142,143 };
public static final int[] CHARACTER_1 = {80, 81, 82, 83, 84, 85};
public static final int[] CHARACTER_2 = {86, 87, 88, 89, 90, 91};
public static final int[] CHARACTER_3 = {92, 93, 94, 95, 96, 97};
public static final int[] CHARACTER_4 = {98, 99, 100, 101, 102, 103};
public static final int[] CHARACTER_5 = {104, 105, 106, 107, 108, 109};
public static final int[] CHARACTER_6 = {110, 111, 112, 113, 114, 115};
public static final int[] CHARACTER_7 = {116, 117, 118, 119, 120, 121};
public static final int[] CHARACTER_8 = {122, 123, 124, 125, 126, 127};
public static final int[] IDENTIFIER = {128, 129, 130, 131};
public static final int[] CHANNEL = {132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143};
private IBandIdentifier mIdentifierUpdate;
public ControlChannelBaseStationIdentification( BinaryMessage message,
DataUnitID duid,
AliasList aliasList )
public ControlChannelBaseStationIdentification(BinaryMessage message, DataUnitID duid, AliasList aliasList)
{
super( message, duid, aliasList );
super(message, duid, aliasList);
}
@Override
@@ -36,86 +50,96 @@ public class ControlChannelBaseStationIdentification extends MotorolaTSBKMessage
{
return MotorolaOpcode.CONTROL_CHANNEL_ID.getDescription();
}
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " CHAN:" + getIdentifier() + "-" + getChannel() );
sb.append( " CWID:" + getCWID() );
sb.append( " DN:" + getDownlinkFrequency() );
sb.append( " UP:" + getUplinkFrequency() );
sb.append(getMessageStub());
sb.append(" CHAN:" + getIdentifier() + "-" + getChannel());
sb.append(" CWID:" + getCWID());
sb.append(" DN:" + getDownlinkFrequency());
sb.append(" UP:" + getUplinkFrequency());
return sb.toString();
}
public String getCWID()
{
StringBuilder sb = new StringBuilder();
StringBuilder sb = new StringBuilder();
sb.append( getCharacter( CHARACTER_1 ) );
sb.append( getCharacter( CHARACTER_2 ) );
sb.append( getCharacter( CHARACTER_3 ) );
sb.append( getCharacter( CHARACTER_4 ) );
sb.append( getCharacter( CHARACTER_5 ) );
sb.append( getCharacter( CHARACTER_6 ) );
sb.append( getCharacter( CHARACTER_7 ) );
sb.append( getCharacter( CHARACTER_8 ) );
return sb.toString();
sb.append(getCharacter(CHARACTER_1));
sb.append(getCharacter(CHARACTER_2));
sb.append(getCharacter(CHARACTER_3));
sb.append(getCharacter(CHARACTER_4));
sb.append(getCharacter(CHARACTER_5));
sb.append(getCharacter(CHARACTER_6));
sb.append(getCharacter(CHARACTER_7));
sb.append(getCharacter(CHARACTER_8));
return sb.toString();
}
private String getCharacter( int[] field )
private String getCharacter(int[] field)
{
int value = mMessage.getInt( field );
if( value != 0 )
{
return String.valueOf( (char)( value + 43 ) );
}
return null;
int value = mMessage.getInt(field);
if(value != 0)
{
return String.valueOf((char)(value + 43));
}
return null;
}
public int getIdentifier()
{
return mMessage.getInt( IDENTIFIER );
return mMessage.getInt(IDENTIFIER);
}
public int getChannel()
{
return mMessage.getInt( CHANNEL );
return mMessage.getInt(CHANNEL);
}
public long getUplinkFrequency()
{
return calculateUplink( mIdentifierUpdate, getChannel() );
if(mIdentifierUpdate != null)
{
mIdentifierUpdate.getUplinkFrequency(getChannel());
}
return 0;
}
public long getDownlinkFrequency()
{
return calculateDownlink( mIdentifierUpdate, getChannel() );
if(mIdentifierUpdate != null)
{
mIdentifierUpdate.getDownlinkFrequency(getChannel());
}
return 0;
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
mIdentifierUpdate = message;
mIdentifierUpdate = message;
}
@Override
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 1 ];
identifiers[ 0 ] = getIdentifier();
return identifiers;
int[] identifiers = new int[1];
identifiers[0] = getIdentifier();
return identifiers;
}
}

View File

@@ -1,151 +1,187 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tsbk.motorola;
import alias.AliasList;
import bits.BinaryMessage;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.reference.DataUnitID;
import alias.AliasList;
import bits.BinaryMessage;
public class PatchGroupVoiceChannelGrant extends MotorolaTSBKMessage
implements IdentifierReceiver
public class PatchGroupVoiceChannelGrant extends MotorolaTSBKMessage implements IdentifierReceiver
{
/* Service Options */
public static final int EMERGENCY_FLAG = 80;
public static final int ENCRYPTED_CHANNEL_FLAG = 81;
public static final int DUPLEX_MODE = 82;
public static final int SESSION_MODE = 83;
public static final int[] PRIORITY = { 85,86,87 };
public static final int[] IDENTIFIER = { 88,89,90,91 };
public static final int[] CHANNEL = { 92,93,94,95,96,97,98,99,100,101,102,103 };
public static final int[] PATCH_GROUP_ADDRESS = { 104,105,106,107,108,109,
110,111,112,113,114,115,116,117,118,119 };
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 };
public static final int[] PRIORITY = {85, 86, 87};
public static final int[] IDENTIFIER = {88, 89, 90, 91};
public static final int[] CHANNEL = {92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103};
public static final int[] PATCH_GROUP_ADDRESS = {104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
117, 118, 119};
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};
private IBandIdentifier mIdentifierUpdate;
public PatchGroupVoiceChannelGrant( BinaryMessage message, DataUnitID duid,
AliasList aliasList )
public PatchGroupVoiceChannelGrant(BinaryMessage message, DataUnitID duid, AliasList aliasList)
{
super( message, duid, aliasList );
super(message, duid, aliasList);
}
@Override
public boolean isTDMAChannel()
{
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.isTDMA();
}
return false;
}
@Override
public String getEventType()
{
return MotorolaOpcode.PATCH_GROUP_CHANNEL_GRANT.getLabel();
return MotorolaOpcode.PATCH_GROUP_CHANNEL_GRANT.getLabel();
}
@Override
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append(getMessageStub());
if( isEmergency() )
{
sb.append( " EMERGENCY" );
}
sb.append( " PATCH GROUP:" );
sb.append( getPatchGroupAddress() );
sb.append( " FROM:" );
sb.append( getSourceAddress() );
sb.append( " PRI:" );
sb.append( getPriority() );
if(isEmergency())
{
sb.append(" EMERGENCY");
}
sb.append( " CHAN:" );
sb.append( getChannelIdentifier() + "-" + getChannelNumber() );
sb.append( " DN:" + getDownlinkFrequency() );
sb.append( " UP:" + getUplinkFrequency() );
sb.append(" PATCH GROUP:");
sb.append(getPatchGroupAddress());
sb.append(" FROM:");
sb.append(getSourceAddress());
sb.append(" PRI:");
sb.append(getPriority());
sb.append( " SESSION MODE:");
sb.append( getSessionMode().name() );
return sb.toString();
sb.append(" CHAN:");
sb.append(getChannelIdentifier() + "-" + getChannelNumber());
sb.append(" DN:" + getDownlinkFrequency());
sb.append(" UP:" + getUplinkFrequency());
sb.append(" SESSION MODE:");
sb.append(getSessionMode().name());
return sb.toString();
}
public String getPatchGroupAddress()
{
return mMessage.getHex( PATCH_GROUP_ADDRESS, 4 );
return mMessage.getHex(PATCH_GROUP_ADDRESS, 4);
}
public String getSourceAddress()
{
return mMessage.getHex( SOURCE_ADDRESS, 6 );
return mMessage.getHex(SOURCE_ADDRESS, 6);
}
public boolean isEmergency()
{
return mMessage.get( EMERGENCY_FLAG );
return mMessage.get(EMERGENCY_FLAG);
}
public boolean isEncryptedChannel()
{
return mMessage.get( ENCRYPTED_CHANNEL_FLAG );
return mMessage.get(ENCRYPTED_CHANNEL_FLAG);
}
public DuplexMode getDuplexMode()
{
return mMessage.get( DUPLEX_MODE ) ? DuplexMode.FULL : DuplexMode.HALF;
return mMessage.get(DUPLEX_MODE) ? DuplexMode.FULL : DuplexMode.HALF;
}
public SessionMode getSessionMode()
{
return mMessage.get( SESSION_MODE ) ?
SessionMode.CIRCUIT : SessionMode.PACKET;
return mMessage.get(SESSION_MODE) ?
SessionMode.CIRCUIT : SessionMode.PACKET;
}
/**
* 1 = Lowest, 4 = Default, 7 = Highest
*/
public int getPriority()
{
return mMessage.getInt( PRIORITY );
return mMessage.getInt(PRIORITY);
}
public int getChannelIdentifier()
{
return mMessage.getInt( IDENTIFIER );
return mMessage.getInt(IDENTIFIER);
}
public int getChannelNumber()
{
return mMessage.getInt( CHANNEL );
return mMessage.getInt(CHANNEL);
}
public String getChannel()
{
return getChannelIdentifier() + "-" + getChannelNumber();
return getChannelIdentifier() + "-" + getChannelNumber();
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
mIdentifierUpdate = message;
mIdentifierUpdate = message;
}
@Override
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 1 ];
identifiers[ 0 ] = getChannelIdentifier();
return identifiers;
int[] identifiers = new int[1];
identifiers[0] = getChannelIdentifier();
return identifiers;
}
public long getDownlinkFrequency()
{
return calculateDownlink( mIdentifierUpdate, getChannelNumber() );
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.getDownlinkFrequency(getChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
return calculateUplink( mIdentifierUpdate, getChannelNumber() );
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.getUplinkFrequency(getChannelNumber());
}
return 0;
}
}

View File

@@ -1,146 +1,197 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tsbk.motorola;
import alias.AliasList;
import bits.BinaryMessage;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.reference.DataUnitID;
import alias.AliasList;
import bits.BinaryMessage;
public class PatchGroupVoiceChannelGrantUpdate extends MotorolaTSBKMessage
implements IdentifierReceiver
public class PatchGroupVoiceChannelGrantUpdate extends MotorolaTSBKMessage implements IdentifierReceiver
{
public static final int[] IDENTIFIER_1 = { 80,81,82,83 };
public static final int[] CHANNEL_1 = { 84,85,86,87,88,89,90,91,92,93,94,
95 };
public static final int[] PATCH_GROUP_ADDRESS_1 = { 96,97,98,99,100,101,102,
103,104,105,106,107,108,109,110,111 };
public static final int[] IDENTIFIER_2 = { 112,113,114,115 };
public static final int[] CHANNEL_2 = { 116,117,118,119,120,121,122,123,
124,125,126,127 };
public static final int[] PATCH_GROUP_ADDRESS_2 = { 128,129,130,131,132,133,
134,135,136,137,138,139,140,141,142,143 };
public static final int[] IDENTIFIER_1 = {80, 81, 82, 83};
public static final int[] CHANNEL_1 = {84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95};
public static final int[] PATCH_GROUP_ADDRESS_1 = {96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111};
public static final int[] IDENTIFIER_2 = {112, 113, 114, 115};
public static final int[] CHANNEL_2 = {116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127};
public static final int[] PATCH_GROUP_ADDRESS_2 = {128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143};
private IBandIdentifier mIdentifierUpdate1;
private IBandIdentifier mIdentifierUpdate2;
public PatchGroupVoiceChannelGrantUpdate( BinaryMessage message,
DataUnitID duid, AliasList aliasList )
public PatchGroupVoiceChannelGrantUpdate(BinaryMessage message, DataUnitID duid, AliasList aliasList)
{
super( message, duid, aliasList );
super(message, duid, aliasList);
}
@Override
@Override
public String getEventType()
{
return MotorolaOpcode.PATCH_GROUP_CHANNEL_GRANT_UPDATE.getLabel();
return MotorolaOpcode.PATCH_GROUP_CHANNEL_GRANT_UPDATE.getLabel();
}
@Override
@Override
public String getMessage()
{
StringBuilder sb = new StringBuilder();
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append(getMessageStub());
sb.append( " PATCH GRP1:" );
sb.append( getPatchGroupAddress1() );
sb.append( " GRP2:" );
sb.append( getPatchGroupAddress2() );
sb.append( " CHAN 1:" );
sb.append( getChannel1() );
sb.append( " DN:" + getDownlinkFrequency1() );
sb.append( " CHAN 2:" );
sb.append( getChannel2() );
sb.append( " DN:" + getDownlinkFrequency2() );
return sb.toString();
sb.append(" PATCH GRP1:");
sb.append(getPatchGroupAddress1());
sb.append(" GRP2:");
sb.append(getPatchGroupAddress2());
sb.append(" CHAN 1:");
sb.append(getChannel1());
sb.append(" DN:" + getDownlinkFrequency1());
sb.append(" CHAN 2:");
sb.append(getChannel2());
sb.append(" DN:" + getDownlinkFrequency2());
return sb.toString();
}
public String getPatchGroupAddress1()
{
return mMessage.getHex( PATCH_GROUP_ADDRESS_1, 4 );
return mMessage.getHex(PATCH_GROUP_ADDRESS_1, 4);
}
public String getPatchGroupAddress2()
{
return mMessage.getHex( PATCH_GROUP_ADDRESS_2, 4 );
return mMessage.getHex(PATCH_GROUP_ADDRESS_2, 4);
}
public int getChannelIdentifier1()
{
return mMessage.getInt( IDENTIFIER_1 );
return mMessage.getInt(IDENTIFIER_1);
}
public int getChannelNumber1()
{
return mMessage.getInt( CHANNEL_1 );
return mMessage.getInt(CHANNEL_1);
}
public String getChannel1()
{
return getChannelIdentifier1() + "-" + getChannelNumber1();
return getChannelIdentifier1() + "-" + getChannelNumber1();
}
public int getChannelIdentifier2()
{
return mMessage.getInt( IDENTIFIER_2 );
return mMessage.getInt(IDENTIFIER_2);
}
public int getChannelNumber2()
{
return mMessage.getInt( CHANNEL_2 );
return mMessage.getInt(CHANNEL_2);
}
public String getChannel2()
{
return getChannelIdentifier2() + "-" + getChannelNumber2();
return getChannelIdentifier2() + "-" + getChannelNumber2();
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if( identifier == getChannelIdentifier1() )
{
mIdentifierUpdate1 = message;
}
if( identifier == getChannelIdentifier2() )
{
mIdentifierUpdate2 = message;
}
if(identifier == getChannelIdentifier1())
{
mIdentifierUpdate1 = message;
}
if(identifier == getChannelIdentifier2())
{
mIdentifierUpdate2 = message;
}
}
@Override
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 2 ];
identifiers[ 0 ] = getChannelIdentifier1();
identifiers[ 1 ] = getChannelIdentifier2();
return identifiers;
int[] identifiers = new int[2];
identifiers[0] = getChannelIdentifier1();
identifiers[1] = getChannelIdentifier2();
return identifiers;
}
public long getDownlinkFrequency1()
{
return calculateDownlink( mIdentifierUpdate1, getChannelNumber1() );
if(mIdentifierUpdate1 != null)
{
return mIdentifierUpdate1.getDownlinkFrequency(getChannelNumber1());
}
return 0;
}
public boolean isTDMAChannel1()
{
if(mIdentifierUpdate1 != null)
{
return mIdentifierUpdate1.isTDMA();
}
return false;
}
public long getUplinkFrequency1()
{
return calculateUplink( mIdentifierUpdate1, getChannelNumber1() );
if(mIdentifierUpdate1 != null)
{
return mIdentifierUpdate1.getUplinkFrequency(getChannelNumber1());
}
return 0;
}
public long getDownlinkFrequency2()
{
return calculateDownlink( mIdentifierUpdate2, getChannelNumber2() );
if(mIdentifierUpdate2 != null)
{
return mIdentifierUpdate2.getDownlinkFrequency(getChannelNumber2());
}
return 0;
}
public boolean isTDMAChannel2()
{
if(mIdentifierUpdate2 != null)
{
return mIdentifierUpdate2.isTDMA();
}
return false;
}
public long getUplinkFrequency2()
{
return calculateUplink( mIdentifierUpdate2, getChannelNumber2() );
if(mIdentifierUpdate2 != null)
{
return mIdentifierUpdate2.getUplinkFrequency(getChannelNumber2());
}
return 0;
}
}

View File

@@ -1,40 +1,51 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tsbk.osp.control;
import alias.AliasList;
import bits.BinaryMessage;
import module.decode.p25.message.IAdjacentSite;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.tsbk.TSBKMessage;
import module.decode.p25.reference.DataUnitID;
import module.decode.p25.reference.Opcode;
import alias.AliasList;
import bits.BinaryMessage;
public class AdjacentStatusBroadcast extends TSBKMessage
implements IdentifierReceiver, IAdjacentSite
public class AdjacentStatusBroadcast extends TSBKMessage implements IdentifierReceiver, IAdjacentSite
{
public static final int[] LOCATION_REGISTRATION_AREA = { 80,81,82,83,84,85,
86,87 };
public static final int[] LOCATION_REGISTRATION_AREA = {80, 81, 82, 83, 84, 85, 86, 87};
public static final int CONVENTIONAL_CHANNEL_FLAG = 88;
public static final int SITE_FAILURE_CONDITION_FLAG = 89;
public static final int VALID_FLAG = 90;
public static final int ACTIVE_NETWORK_CONNECTION_FLAG = 91;
public static final int[] SYSTEM_ID = { 92,93,94,95,96,97,98,99,100,101,
102,103 };
public static final int[] RFSS_ID = { 104,105,106,107,108,109,110,111 };
public static final int[] SITE_ID = { 112,113,114,115,116,117,118,119 };
public static final int[] IDENTIFIER = { 120,121,122,123 };
public static final int[] CHANNEL = { 124,125,126,127,128,129,130,131,132,
133,134,135 };
public static final int[] SYSTEM_SERVICE_CLASS = { 136,137,138,139,140,141,
142,143 };
public static final int[] SYSTEM_ID = {92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103};
public static final int[] RFSS_ID = {104, 105, 106, 107, 108, 109, 110, 111};
public static final int[] SITE_ID = {112, 113, 114, 115, 116, 117, 118, 119};
public static final int[] IDENTIFIER = {120, 121, 122, 123};
public static final int[] CHANNEL = {124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135};
public static final int[] SYSTEM_SERVICE_CLASS = {136, 137, 138, 139, 140, 141, 142, 143};
private IBandIdentifier mIdentifierUpdate;
public AdjacentStatusBroadcast( BinaryMessage message,
DataUnitID duid,
AliasList aliasList )
public AdjacentStatusBroadcast(BinaryMessage message, DataUnitID duid, AliasList aliasList)
{
super( message, duid, aliasList );
super(message, duid, aliasList);
}
@Override
@@ -42,154 +53,164 @@ public class AdjacentStatusBroadcast extends TSBKMessage
{
return Opcode.ADJACENT_STATUS_BROADCAST.getDescription();
}
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " LRA:" + getLRA() );
sb.append( " SYS:" + getSystemID() );
sb.append(getMessageStub());
sb.append( " SITE:" + getRFSS() + "-" + getSiteID() );
sb.append( " CHAN:" + getIdentifier() + "-" + getChannel() );
sb.append(" LRA:" + getLRA());
sb.append( " DN:" + getDownlinkFrequency() );
sb.append(" SYS:" + getSystemID());
sb.append( " UP:" + getUplinkFrequency() );
if( isConventionalChannel() )
sb.append(" SITE:" + getRFSS() + "-" + getSiteID());
sb.append(" CHAN:" + getIdentifier() + "-" + getChannel());
sb.append(" DN:" + getDownlinkFrequency());
sb.append(" UP:" + getUplinkFrequency());
if(isConventionalChannel())
{
sb.append( " CONVENTIONAL" );
sb.append(" CONVENTIONAL");
}
if( isSiteFailureCondition() )
if(isSiteFailureCondition())
{
sb.append( " FAILURE-CONDITION" );
sb.append(" FAILURE-CONDITION");
}
if( isValidSiteInformation() )
if(isValidSiteInformation())
{
sb.append( " VALID-INFO" );
sb.append(" VALID-INFO");
}
if( hasActiveNetworkConnection() )
if(hasActiveNetworkConnection())
{
sb.append( " ACTIVE-NETWORK-CONN" );
sb.append(" ACTIVE-NETWORK-CONN");
}
sb.append( getSystemServiceClass() );
sb.append(getSystemServiceClass());
return sb.toString();
}
@Override
public String getDownlinkChannel()
{
return getIdentifier() + "-" + getChannel();
}
@Override
public String getUplinkChannel()
{
return getIdentifier() + "-" + getChannel();
}
public String getLRA()
public String getDownlinkChannel()
{
return mMessage.getHex( LOCATION_REGISTRATION_AREA, 2 );
return getIdentifier() + "-" + getChannel();
}
@Override
public String getUplinkChannel()
{
return getIdentifier() + "-" + getChannel();
}
public String getLRA()
{
return mMessage.getHex(LOCATION_REGISTRATION_AREA, 2);
}
public boolean isConventionalChannel()
{
return mMessage.get( CONVENTIONAL_CHANNEL_FLAG );
return mMessage.get(CONVENTIONAL_CHANNEL_FLAG);
}
public boolean isSiteFailureCondition()
{
return mMessage.get( SITE_FAILURE_CONDITION_FLAG );
return mMessage.get(SITE_FAILURE_CONDITION_FLAG);
}
public boolean isValidSiteInformation()
{
return mMessage.get( VALID_FLAG );
return mMessage.get(VALID_FLAG);
}
public boolean hasActiveNetworkConnection()
{
return mMessage.get( ACTIVE_NETWORK_CONNECTION_FLAG );
return mMessage.get(ACTIVE_NETWORK_CONNECTION_FLAG);
}
public String getUniqueID()
{
StringBuilder sb = new StringBuilder();
sb.append( getSystemID() );
sb.append( ":" );
sb.append( getRFSS() );
sb.append( ":" );
sb.append( getSiteID() );
return sb.toString();
StringBuilder sb = new StringBuilder();
sb.append(getSystemID());
sb.append(":");
sb.append(getRFSS());
sb.append(":");
sb.append(getSiteID());
return sb.toString();
}
public String getSystemID()
{
return mMessage.getHex( SYSTEM_ID, 3 );
return mMessage.getHex(SYSTEM_ID, 3);
}
public String getRFSS()
{
return mMessage.getHex( RFSS_ID, 2 );
return mMessage.getHex(RFSS_ID, 2);
}
public String getSiteID()
{
return mMessage.getHex( SITE_ID, 2 );
return mMessage.getHex(SITE_ID, 2);
}
public int getChannel()
{
return mMessage.getInt( CHANNEL );
return mMessage.getInt(CHANNEL);
}
public int getIdentifier()
{
return mMessage.getInt( IDENTIFIER );
return mMessage.getInt(IDENTIFIER);
}
public String getSystemServiceClass()
{
return SystemService.toString( mMessage.getInt( SYSTEM_SERVICE_CLASS ) );
return SystemService.toString(mMessage.getInt(SYSTEM_SERVICE_CLASS));
}
public long getDownlinkFrequency()
{
return calculateDownlink( mIdentifierUpdate, getChannel() );
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.getDownlinkFrequency(getChannel());
}
return 0;
}
public long getUplinkFrequency()
{
return calculateUplink( mIdentifierUpdate, getChannel() );
}
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.getUplinkFrequency(getChannel());
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
{
/* we're only expecting 1 identifier, so use whatever is received */
mIdentifierUpdate = message;
return 0;
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
/* we're only expecting 1 identifier, so use whatever is received */
mIdentifierUpdate = message;
}
public int[] getIdentifiers()
{
int[] idens = new int[1];
idens[0] = getIdentifier();
return idens;
}
public int[] getIdentifiers()
{
int[] idens = new int[ 1 ];
idens[ 0 ] = getIdentifier();
return idens;
}
}

View File

@@ -1,3 +1,21 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tsbk.osp.control;
import module.decode.p25.message.IBandIdentifier;
@@ -6,8 +24,7 @@ import module.decode.p25.reference.DataUnitID;
import alias.AliasList;
import bits.BinaryMessage;
public abstract class IdentifierUpdate extends TSBKMessage
implements IBandIdentifier
public abstract class IdentifierUpdate extends TSBKMessage implements IBandIdentifier
{
public static final int[] IDENTIFIER = { 80,81,82,83 };
@@ -45,4 +62,22 @@ public abstract class IdentifierUpdate extends TSBKMessage
@Override
public abstract long getTransmitOffset();
@Override
public long getDownlinkFrequency(int channelNumber)
{
return getBaseFrequency() + ( channelNumber * getChannelSpacing() );
}
@Override
public long getUplinkFrequency(int channelNumber)
{
return getDownlinkFrequency(channelNumber) + getTransmitOffset();
}
@Override
public boolean isTDMA()
{
return false;
}
}

View File

@@ -31,17 +31,21 @@ public class IdentifierUpdateNonVUHF extends IdentifierUpdate
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append(toString());
sb.append( " IDEN:" + getIdentifier() );
return sb.toString();
}
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append( " ID:" + getIdentifier() );
sb.append( " BASE:" + getBaseFrequency() );
sb.append( " BW:" + getBandwidth() );
sb.append( " BANDWIDTH:" + getBandwidth() );
sb.append( " SPACING:" + getChannelSpacing() );
sb.append( " OFFSET:" + getTransmitOffset() );
return sb.toString();
}

View File

@@ -30,18 +30,26 @@ public class IdentifierUpdateTDMA extends IdentifierUpdate
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append(toString());
sb.append( " IDEN:" + getIdentifier() );
sb.append( " BASE:" + getBaseFrequency() );
sb.append( " BW:" + getBandwidth() );
sb.append( " SPACING:" + getChannelSpacing() );
sb.append( " OFFSET:" + getTransmitOffset() );
sb.append( " TYPE:" + getChannelType().toString() );
return sb.toString();
}
public ChannelType getChannelType()
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append( " ID:" + getIdentifier() );
sb.append( " BASE:" + getBaseFrequency() );
sb.append( " BW:" + getBandwidth() );
sb.append( " SPACING:" + getChannelSpacing() );
sb.append( " OFFSET:" + getTransmitOffset() );
sb.append( " TYPE:" + getChannelType().toString() );
return sb.toString();
}
public ChannelType getChannelType()
{
return ChannelType.fromValue( mMessage.getInt( CHANNEL_TYPE) );
}
@@ -72,7 +80,26 @@ public class IdentifierUpdateTDMA extends IdentifierUpdate
return -offset;
}
}
@Override
public long getDownlinkFrequency(int channelNumber)
{
if(isTDMA())
{
return getBaseFrequency() + ( (channelNumber / getChannelType().getSlotsPerCarrier()) * getChannelSpacing() );
}
else
{
return super.getDownlinkFrequency(channelNumber);
}
}
@Override
public boolean isTDMA()
{
return getChannelType().getAccessType() == AccessType.TDMA;
}
public enum ChannelType
{
TYPE_0( AccessType.FDMA, 12500, 1, Vocoder.HALF_RATE ),
@@ -109,7 +136,7 @@ public class IdentifierUpdateTDMA extends IdentifierUpdate
}
sb.append( mAccessType.name() );
sb.append( " BW:" + mBandwidth );
sb.append( " BANDWIDTH:" + mBandwidth );
sb.append( " SLOT/CARRIER:" + mSlotsPerCarrier );
sb.append( " VOCODER:" + mVocoder.name() );

View File

@@ -32,17 +32,21 @@ public class IdentifierUpdateVUHF extends IdentifierUpdate
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append(toString());
sb.append( " IDEN:" + getIdentifier() );
return sb.toString();
}
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append( " ID:" + getIdentifier() );
sb.append( " BASE:" + getBaseFrequency() );
sb.append( " BW:" + getBandwidth() );
sb.append( " BANDWIDTH:" + getBandwidth() );
sb.append( " SPACING:" + getChannelSpacing() );
sb.append( " OFFSET:" + getTransmitOffset() );
return sb.toString();
}

View File

@@ -1,35 +1,46 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tsbk.osp.control;
import alias.AliasList;
import bits.BinaryMessage;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.tsbk.TSBKMessage;
import module.decode.p25.reference.DataUnitID;
import module.decode.p25.reference.Opcode;
import module.decode.p25.reference.P25NetworkCallsign;
import alias.AliasList;
import bits.BinaryMessage;
public class NetworkStatusBroadcast extends TSBKMessage implements IdentifierReceiver
{
public static final int[] LOCATION_REGISTRATION_AREA = { 80,81,82,83,84,85,
86,87 };
public static final int[] WACN = { 88,89,90,91,92,93,94,95,96,97,98,99,100,
101,102,103,104,105,106,107 };
public static final int[] SYSTEM_ID = { 108,109,110,111,112,113,114,115,116,
117,118,119 };
public static final int[] IDENTIFIER = { 120,121,122,123 };
public static final int[] CHANNEL = { 124,125,126,127,128,129,130,131,132,
133,134,135 };
public static final int[] SYSTEM_SERVICE_CLASS = { 136,137,138,139,140,141,
142,143 };
public static final int[] LOCATION_REGISTRATION_AREA = {80, 81, 82, 83, 84, 85, 86, 87};
public static final int[] WACN = {88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107};
public static final int[] SYSTEM_ID = {108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119};
public static final int[] IDENTIFIER = {120, 121, 122, 123};
public static final int[] CHANNEL = {124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135};
public static final int[] SYSTEM_SERVICE_CLASS = {136, 137, 138, 139, 140, 141, 142, 143};
private IBandIdentifier mIdentifierUpdate;
public NetworkStatusBroadcast( BinaryMessage message,
DataUnitID duid,
AliasList aliasList )
public NetworkStatusBroadcast(BinaryMessage message, DataUnitID duid, AliasList aliasList)
{
super( message, duid, aliasList );
super(message, duid, aliasList);
}
@Override
@@ -37,90 +48,100 @@ public class NetworkStatusBroadcast extends TSBKMessage implements IdentifierRec
{
return Opcode.NETWORK_STATUS_BROADCAST.getDescription();
}
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " LRA:" + getLocationRegistrationArea() );
sb.append( " WACN:" + getWACN() );
sb.append( " SYS:" + getSystemID() );
sb.append( " CTRL CHAN:" + getIdentifier() + "-" + getChannel() );
sb.append( " DN:" + getDownlinkFrequency() );
sb.append( " UP:" + getUplinkFrequency() );
sb.append( " SYS SVC CLASS:" +
SystemService.toString( getSystemServiceClass() ) );
sb.append(getMessageStub());
sb.append(" LRA:" + getLocationRegistrationArea());
sb.append(" WACN:" + getWACN());
sb.append(" SYS:" + getSystemID());
sb.append(" CTRL CHAN:" + getIdentifier() + "-" + getChannel());
sb.append(" DN:" + getDownlinkFrequency());
sb.append(" UP:" + getUplinkFrequency());
sb.append(" SYS SVC CLASS:" +
SystemService.toString(getSystemServiceClass()));
return sb.toString();
}
public String getLocationRegistrationArea()
{
return mMessage.getHex( LOCATION_REGISTRATION_AREA, 2 );
return mMessage.getHex(LOCATION_REGISTRATION_AREA, 2);
}
public String getWACN()
{
return mMessage.getHex( WACN, 5 );
}
public String getSystemID()
{
return mMessage.getHex( SYSTEM_ID, 3 );
return mMessage.getHex(WACN, 5);
}
public String getSystemID()
{
return mMessage.getHex(SYSTEM_ID, 3);
}
public String getNetworkCallsign()
{
return P25NetworkCallsign.getCallsign(mMessage.getInt(WACN),
mMessage.getInt(SYSTEM_ID));
}
public String getNetworkCallsign()
{
return P25NetworkCallsign.getCallsign( mMessage.getInt( WACN ),
mMessage.getInt( SYSTEM_ID ) );
}
public int getIdentifier()
{
return mMessage.getInt( IDENTIFIER );
return mMessage.getInt(IDENTIFIER);
}
public int getChannel()
{
return mMessage.getInt( CHANNEL );
return mMessage.getInt(CHANNEL);
}
public int getSystemServiceClass()
{
return mMessage.getInt( SYSTEM_SERVICE_CLASS );
return mMessage.getInt(SYSTEM_SERVICE_CLASS);
}
public long getDownlinkFrequency()
{
return calculateDownlink( mIdentifierUpdate, getChannel() );
}
public long getUplinkFrequency()
{
return calculateUplink( mIdentifierUpdate, getChannel() );
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.getDownlinkFrequency(getChannel());
}
return 0;
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
public long getUplinkFrequency()
{
/* we're only expecting 1 identifier, so use whatever is received */
mIdentifierUpdate = message;
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.getUplinkFrequency(getChannel());
}
return 0;
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
/* we're only expecting 1 identifier, so use whatever is received */
mIdentifierUpdate = message;
}
public int[] getIdentifiers()
{
int[] idens = new int[1];
idens[0] = getIdentifier();
return idens;
}
public int[] getIdentifiers()
{
int[] idens = new int[ 1 ];
idens[ 0 ] = getIdentifier();
return idens;
}
}

View File

@@ -1,35 +1,47 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tsbk.osp.control;
import alias.AliasList;
import bits.BinaryMessage;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.tsbk.TSBKMessage;
import module.decode.p25.reference.DataUnitID;
import module.decode.p25.reference.Opcode;
import alias.AliasList;
import bits.BinaryMessage;
public class RFSSStatusBroadcast extends TSBKMessage implements IdentifierReceiver
{
public static final int[] LOCATION_REGISTRATION_AREA = { 80,81,82,83,84,85,
86,87 };
public static final int[] LOCATION_REGISTRATION_AREA = {80, 81, 82, 83, 84, 85, 86, 87};
public static final int ACTIVE_NETWORK_CONNECTION_FLAG = 91;
public static final int[] SYSTEM_ID = { 92,93,94,95,96,97,98,99,100,101,
102,103 };
public static final int[] RFSS_ID = { 104,105,106,107,108,109,110,111 };
public static final int[] SITE_ID = { 112,113,114,115,116,117,118,119 };
public static final int[] IDENTIFIER = { 120,121,122,123 };
public static final int[] CHANNEL = { 124,125,126,127,128,129,130,131,132,
133,134,135 };
public static final int[] SYSTEM_SERVICE_CLASS = { 136,137,138,139,140,141,
142,143 };
public static final int[] SYSTEM_ID = {92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103};
public static final int[] RFSS_ID = {104, 105, 106, 107, 108, 109, 110, 111};
public static final int[] SITE_ID = {112, 113, 114, 115, 116, 117, 118, 119};
public static final int[] IDENTIFIER = {120, 121, 122, 123};
public static final int[] CHANNEL = {124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135};
public static final int[] SYSTEM_SERVICE_CLASS = {136, 137, 138, 139, 140, 141, 142, 143};
private IBandIdentifier mIdentifierUpdate;
public RFSSStatusBroadcast( BinaryMessage message,
DataUnitID duid,
AliasList aliasList )
public RFSSStatusBroadcast(BinaryMessage message, DataUnitID duid, AliasList aliasList)
{
super( message, duid, aliasList );
super(message, duid, aliasList);
}
@Override
@@ -37,100 +49,110 @@ public class RFSSStatusBroadcast extends TSBKMessage implements IdentifierReceiv
{
return Opcode.RFSS_STATUS_BROADCAST.getDescription();
}
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " LRA:" + getLocationRegistrationArea() );
sb.append( " SYSID:" + getSystemID() );
sb.append(getMessageStub());
sb.append( " RFSS:" + getRFSubsystemID() );
sb.append( " SITE:" + getSiteID() );
sb.append( " CHAN:" + getIdentifier() + "-" + getChannel() );
sb.append( " DN:" + getDownlinkFrequency() );
sb.append( " UP:" + getUplinkFrequency() );
sb.append(" LRA:" + getLocationRegistrationArea());
if( hasActiveNetworkConnection() )
sb.append(" SYSID:" + getSystemID());
sb.append(" RFSS:" + getRFSubsystemID());
sb.append(" SITE:" + getSiteID());
sb.append(" CHAN:" + getIdentifier() + "-" + getChannel());
sb.append(" DN:" + getDownlinkFrequency());
sb.append(" UP:" + getUplinkFrequency());
if(hasActiveNetworkConnection())
{
sb.append( " ACTIVE-NETWORK-CONN" );
sb.append(" ACTIVE-NETWORK-CONN");
}
sb.append( SystemService.toString( getSystemServiceClass() ) );
sb.append(SystemService.toString(getSystemServiceClass()));
return sb.toString();
}
public String getLocationRegistrationArea()
{
return mMessage.getHex( LOCATION_REGISTRATION_AREA, 2 );
return mMessage.getHex(LOCATION_REGISTRATION_AREA, 2);
}
public boolean hasActiveNetworkConnection()
{
return mMessage.get( ACTIVE_NETWORK_CONNECTION_FLAG );
return mMessage.get(ACTIVE_NETWORK_CONNECTION_FLAG);
}
public String getSystemID()
{
return mMessage.getHex( SYSTEM_ID, 3 );
return mMessage.getHex(SYSTEM_ID, 3);
}
public String getRFSubsystemID()
{
return mMessage.getHex( RFSS_ID, 2 );
return mMessage.getHex(RFSS_ID, 2);
}
public String getSiteID()
{
return mMessage.getHex( SITE_ID, 2 );
return mMessage.getHex(SITE_ID, 2);
}
public int getIdentifier()
{
return mMessage.getInt( IDENTIFIER );
}
public int getChannel()
{
return mMessage.getInt( CHANNEL );
}
public int getSystemServiceClass()
{
return mMessage.getInt( SYSTEM_SERVICE_CLASS );
}
public long getDownlinkFrequency()
{
return calculateDownlink( mIdentifierUpdate, getChannel() );
}
public long getUplinkFrequency()
{
return calculateUplink( mIdentifierUpdate, getChannel() );
return mMessage.getInt(IDENTIFIER);
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
public int getChannel()
{
/* we're only expecting 1 identifier, so use whatever is received */
mIdentifierUpdate = message;
return mMessage.getInt(CHANNEL);
}
public int getSystemServiceClass()
{
return mMessage.getInt(SYSTEM_SERVICE_CLASS);
}
public long getDownlinkFrequency()
{
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.getDownlinkFrequency(getChannel());
}
return 0;
}
public long getUplinkFrequency()
{
if(mIdentifierUpdate != null)
{
return mIdentifierUpdate.getUplinkFrequency(getChannel());
}
return 0;
}
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
/* we're only expecting 1 identifier, so use whatever is received */
mIdentifierUpdate = message;
}
public int[] getIdentifiers()
{
int[] idens = new int[1];
idens[0] = getIdentifier();
return idens;
}
public int[] getIdentifiers()
{
int[] idens = new int[ 1 ];
idens[ 0 ] = getIdentifier();
return idens;
}
}

View File

@@ -1,44 +1,50 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tsbk.osp.control;
import alias.AliasList;
import bits.BinaryMessage;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.message.tsbk.TSBKMessage;
import module.decode.p25.reference.DataUnitID;
import module.decode.p25.reference.Opcode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import alias.AliasList;
import bits.BinaryMessage;
public class SecondaryControlChannelBroadcast extends TSBKMessage
implements IdentifierReceiver, Comparable<SecondaryControlChannelBroadcast>
public class SecondaryControlChannelBroadcast extends TSBKMessage implements IdentifierReceiver, Comparable<SecondaryControlChannelBroadcast>
{
private final static Logger mLog =
LoggerFactory.getLogger( SecondaryControlChannelBroadcast.class );
public static final int[] RFSS_ID = {80, 81, 82, 83, 84, 85, 86, 87};
public static final int[] SITE_ID = {88, 89, 90, 91, 92, 93, 94, 95};
public static final int[] IDENTIFIER_1 = {96, 97, 98, 99};
public static final int[] CHANNEL_1 = {100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111};
public static final int[] SYSTEM_SERVICE_CLASS_1 = {112, 113, 114, 115, 116, 117, 118, 119};
public static final int[] IDENTIFIER_2 = {120, 121, 122, 123};
public static final int[] CHANNEL_2 = {124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135};
public static final int[] SYSTEM_SERVICE_CLASS_2 = {136, 137, 138, 139, 140, 141, 142, 143};
public static final int[] RFSS_ID = { 80,81,82,83,84,85,86,87 };
public static final int[] SITE_ID = { 88,89,90,91,92,93,94,95 };
public static final int[] IDENTIFIER_1 = { 96,97,98,99 };
public static final int[] CHANNEL_1 = { 100,101,102,103,104,105,106,107,108,
109,110,111 };
public static final int[] SYSTEM_SERVICE_CLASS_1 = { 112,113,114,115,116,
117,118,119 };
public static final int[] IDENTIFIER_2 = { 120,121,122,123 };
public static final int[] CHANNEL_2 = { 124,125,126,127,128,129,130,131,132,
133,134,135 };
public static final int[] SYSTEM_SERVICE_CLASS_2 = { 136,137,138,139,140,
141,142,143 };
private IBandIdentifier mIdentifierUpdate1;
private IBandIdentifier mIdentifierUpdate2;
public SecondaryControlChannelBroadcast( BinaryMessage message,
DataUnitID duid,
AliasList aliasList )
public SecondaryControlChannelBroadcast(BinaryMessage message,
DataUnitID duid,
AliasList aliasList)
{
super( message, duid, aliasList );
super(message, duid, aliasList);
}
@Override
@@ -46,162 +52,215 @@ public class SecondaryControlChannelBroadcast extends TSBKMessage
{
return Opcode.SECONDARY_CONTROL_CHANNEL_BROADCAST.getDescription();
}
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
sb.append( " SITE:" + getRFSS() + "-" + getSiteID() );
sb.append( " CHAN1:" + getIdentifier1() + "-" + getChannel1() );
sb.append( " DN1:" + getDownlinkFrequency1() );
sb.append( " UP1:" + getUplinkFrequency1() );
sb.append( " SVC1:" +
SystemService.toString( getSystemServiceClass1() ) );
if( hasChannel2() )
sb.append(getMessageStub());
sb.append(" SITE:" + getRFSS() + "-" + getSiteID());
sb.append(" CHAN1:" + getIdentifier1() + "-" + getChannel1());
sb.append(" DN1:" + getDownlinkFrequency1());
sb.append(" UP1:" + getUplinkFrequency1());
sb.append(" SVC1:" + SystemService.toString(getSystemServiceClass1()));
if(hasChannel2())
{
sb.append( " CHAN2:" + getIdentifier2() + "-" + getChannel2() );
sb.append( " DN2:" + getDownlinkFrequency2() );
sb.append( " UP2:" + getUplinkFrequency2() );
sb.append( " SVC2:" +
SystemService.toString( getSystemServiceClass2() ) );
sb.append(" CHAN2:" + getIdentifier2() + "-" + getChannel2());
sb.append(" DN2:" + getDownlinkFrequency2());
sb.append(" UP2:" + getUplinkFrequency2());
sb.append(" SVC2:" + SystemService.toString(getSystemServiceClass2()));
}
return sb.toString();
}
public String getRFSS()
{
return mMessage.getHex( RFSS_ID, 2 );
return mMessage.getHex(RFSS_ID, 2);
}
public String getSiteID()
{
return mMessage.getHex( SITE_ID, 2 );
return mMessage.getHex(SITE_ID, 2);
}
public int getIdentifier1()
{
return mMessage.getInt( IDENTIFIER_1 );
return mMessage.getInt(IDENTIFIER_1);
}
public int getChannel1()
{
return mMessage.getInt( CHANNEL_1 );
return mMessage.getInt(CHANNEL_1);
}
public int getSystemServiceClass1()
{
return mMessage.getInt( SYSTEM_SERVICE_CLASS_1 );
return mMessage.getInt(SYSTEM_SERVICE_CLASS_1);
}
public int getIdentifier2()
{
return mMessage.getInt( IDENTIFIER_2 );
return mMessage.getInt(IDENTIFIER_2);
}
public int getChannel2()
{
return mMessage.getInt( CHANNEL_2 );
return mMessage.getInt(CHANNEL_2);
}
public int getSystemServiceClass2()
{
return mMessage.getInt( SYSTEM_SERVICE_CLASS_2 );
return mMessage.getInt(SYSTEM_SERVICE_CLASS_2);
}
public boolean hasChannel2()
{
return getSystemServiceClass2() != 0;
return getSystemServiceClass2() != 0;
}
public long getDownlinkFrequency1()
{
return calculateDownlink( mIdentifierUpdate1, getChannel1() );
if(mIdentifierUpdate1 != null)
{
return mIdentifierUpdate1.getDownlinkFrequency(getChannel1());
}
return 0;
}
public long getUplinkFrequency1()
{
return calculateUplink( mIdentifierUpdate1, getChannel1() );
if(mIdentifierUpdate1 != null)
{
return mIdentifierUpdate1.getUplinkFrequency(getChannel1());
}
return 0;
}
public long getDownlinkFrequency2()
{
return calculateDownlink( mIdentifierUpdate2, getChannel2() );
if(mIdentifierUpdate2 != null)
{
return mIdentifierUpdate2.getDownlinkFrequency(getChannel2());
}
return 0;
}
public long getUplinkFrequency2()
{
return calculateUplink( mIdentifierUpdate2, getChannel2() );
if(mIdentifierUpdate2 != null)
{
return mIdentifierUpdate2.getUplinkFrequency(getChannel2());
}
return 0;
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if( identifier == getIdentifier1() )
{
mIdentifierUpdate1 = message;
}
if( identifier == getIdentifier2() )
{
mIdentifierUpdate2 = message;
}
}
public int[] getIdentifiers()
{
int[] idens;
if( hasChannel2() )
{
idens = new int[ 2 ];
idens[ 0 ] = getIdentifier1();
idens[ 1 ] = getIdentifier2();
}
else
{
idens = new int[ 1 ];
idens[ 0 ] = getIdentifier1();
}
return idens;
}
if(identifier == getIdentifier1())
{
mIdentifierUpdate1 = message;
}
@Override
public int compareTo( SecondaryControlChannelBroadcast other )
if(identifier == getIdentifier2())
{
mIdentifierUpdate2 = message;
}
}
public int[] getIdentifiers()
{
if( other.getSiteID().contentEquals( getSiteID() ) &&
other.getIdentifier1() == getIdentifier1() &&
other.getChannel1() == getChannel1() &&
other.getChannel2() == getChannel2() &&
other.getIdentifier2() == getIdentifier2() &&
other.getDownlinkFrequency1() == getDownlinkFrequency1() &&
other.getUplinkFrequency1() == getUplinkFrequency1() &&
other.getDownlinkFrequency2() == getDownlinkFrequency2() &&
other.getUplinkFrequency2() == getUplinkFrequency2() )
{
return 0;
}
else if( other.getIdentifier1() < getIdentifier1() )
{
return -1;
}
else
{
return 1;
}
int[] idens;
if(hasChannel2())
{
idens = new int[2];
idens[0] = getIdentifier1();
idens[1] = getIdentifier2();
}
else
{
idens = new int[1];
idens[0] = getIdentifier1();
}
return idens;
}
@Override
public int compareTo(SecondaryControlChannelBroadcast other)
{
if(other.getRFSS().contentEquals(getRFSS()) &&
other.getSiteID().contentEquals(getSiteID()) &&
other.getIdentifier1() == getIdentifier1() &&
other.getChannel1() == getChannel1())
{
return 0;
}
else if(other.getIdentifier1() < getIdentifier1())
{
return -1;
}
else
{
return 1;
}
}
@Override
public boolean equals(Object o)
{
if(this == o)
{
return true;
}
if(!(o instanceof SecondaryControlChannelBroadcast))
{
return false;
}
SecondaryControlChannelBroadcast that = (SecondaryControlChannelBroadcast)o;
if(getRFSS() != that.getRFSS())
{
return false;
}
if(getSiteID() != that.getSiteID())
{
return false;
}
if(getIdentifier1() != that.getIdentifier1())
{
return false;
}
return getChannel1() == that.getChannel1();
}
@Override
public int hashCode()
{
int result = getRFSS() != null ? getRFSS().hashCode() : 0;
result = 31 * result + getSiteID() != null ? getSiteID().hashCode() : 0;
result = 31 * result + getIdentifier1();
result = 31 * result + getChannel1();
return result;
}
}

View File

@@ -1,19 +1,35 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tsbk.osp.data;
import alias.AliasList;
import bits.BinaryMessage;
import module.decode.p25.message.tsbk.GroupChannelGrant;
import module.decode.p25.reference.DataUnitID;
import module.decode.p25.reference.Opcode;
import alias.AliasList;
import bits.BinaryMessage;
public class GroupDataChannelGrant extends GroupChannelGrant
{
public GroupDataChannelGrant( BinaryMessage message,
DataUnitID duid,
AliasList aliasList )
public GroupDataChannelGrant(BinaryMessage message, DataUnitID duid, AliasList aliasList)
{
super( message, duid, aliasList );
super(message, duid, aliasList);
}
@Override

View File

@@ -1,158 +1,178 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tsbk.osp.data;
import alias.AliasList;
import bits.BinaryMessage;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.reference.DataUnitID;
import alias.AliasList;
import bits.BinaryMessage;
public class SNDCPDataChannelAnnouncementExplicit extends SNDCPData
implements IdentifierReceiver
public class SNDCPDataChannelAnnouncementExplicit extends SNDCPData implements IdentifierReceiver
{
public static final int AUTONOMOUS_ACCESS_AVAILABLE_INDICATOR = 88;
public static final int REQUESTED_ACCESS_AVAILABLE_INDICATOR = 89;
public static final int[] TRANSMIT_IDENTIFIER = { 96,97,98,99 };
public static final int[] TRANSMIT_NUMBER = { 100,101,102,103,104,105,106,
107,108,109,110,111 };
public static final int[] RECEIVE_IDENTIFIER = { 112,113,114,115 };
public static final int[] RECEIVE_NUMBER = { 116,117,118,119,120,121,122,
123,124,125,126,127 };
public static final int[] DATA_ACCESS_CONTROL = { 128,129,130,131,132,133,
134,135,136,137,138,139,140,141,142,143 };
public static final int AUTONOMOUS_ACCESS_AVAILABLE_INDICATOR = 88;
public static final int REQUESTED_ACCESS_AVAILABLE_INDICATOR = 89;
public static final int[] TRANSMIT_IDENTIFIER = {96, 97, 98, 99};
public static final int[] TRANSMIT_NUMBER = {100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111};
public static final int[] RECEIVE_IDENTIFIER = {112, 113, 114, 115};
public static final int[] RECEIVE_NUMBER = {116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127};
public static final int[] DATA_ACCESS_CONTROL = {128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143};
private IBandIdentifier mIdentifierUpdateTransmit;
private IBandIdentifier mIdentifierUpdateReceive;
public SNDCPDataChannelAnnouncementExplicit( BinaryMessage message,
DataUnitID duid,
AliasList aliasList )
public SNDCPDataChannelAnnouncementExplicit(BinaryMessage message, DataUnitID duid, AliasList aliasList)
{
super( message, duid, aliasList );
super(message, duid, aliasList);
}
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
if( isEmergency() )
sb.append(getMessageStub());
if(isEmergency())
{
sb.append( " EMERGENCY" );
sb.append(" EMERGENCY");
}
if( isAutonomousAccessAvailable() )
if(isAutonomousAccessAvailable())
{
sb.append( " AUTONOMOUS ACCESS" );
sb.append(" AUTONOMOUS ACCESS");
}
if( isRequestedAccessAvailable() )
if(isRequestedAccessAvailable())
{
sb.append( " DOWNLINK:" );
sb.append( getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber() );
sb.append( " " + getUplinkFrequency() );
sb.append( " UPLINK:" );
sb.append( getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber() );
sb.append( " " + getDownlinkFrequency() );
sb.append( " DATA ACCESS CONTROL:" );
sb.append(" DOWNLINK:");
sb.append(getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber());
sb.append(" " + getUplinkFrequency());
sb.append(" UPLINK:");
sb.append(getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber());
sb.append(" " + getDownlinkFrequency());
sb.append(" DATA ACCESS CONTROL:");
}
else
{
sb.append( " ACCESS DENIED TO DATA ACCESS CONTROL:" );
sb.append(" ACCESS DENIED TO DATA ACCESS CONTROL:");
}
sb.append( getDataAccessControl() );
sb.append(getDataAccessControl());
return sb.toString();
}
public boolean isAutonomousAccessAvailable()
{
return mMessage.get( AUTONOMOUS_ACCESS_AVAILABLE_INDICATOR );
return mMessage.get(AUTONOMOUS_ACCESS_AVAILABLE_INDICATOR);
}
public boolean isRequestedAccessAvailable()
{
return mMessage.get( REQUESTED_ACCESS_AVAILABLE_INDICATOR );
return mMessage.get(REQUESTED_ACCESS_AVAILABLE_INDICATOR);
}
public int getTransmitChannelIdentifier()
{
return mMessage.getInt( TRANSMIT_IDENTIFIER );
return mMessage.getInt(TRANSMIT_IDENTIFIER);
}
public int getTransmitChannelNumber()
{
return mMessage.getInt( TRANSMIT_NUMBER );
return mMessage.getInt(TRANSMIT_NUMBER);
}
public String getTransmitChannel()
{
return getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber();
return getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveChannelIdentifier()
{
return mMessage.getInt( RECEIVE_IDENTIFIER );
return mMessage.getInt(RECEIVE_IDENTIFIER);
}
public int getReceiveChannelNumber()
{
return mMessage.getInt( RECEIVE_NUMBER );
return mMessage.getInt(RECEIVE_NUMBER);
}
public String getReceiveChannel()
{
return getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber();
return getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber();
}
public String getDataAccessControl()
{
return mMessage.getHex( DATA_ACCESS_CONTROL, 4 );
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
{
if( identifier == getTransmitChannelIdentifier() )
{
mIdentifierUpdateTransmit = message;
}
else if( identifier == getReceiveChannelIdentifier() )
{
mIdentifierUpdateReceive = message;
}
else
{
throw new IllegalArgumentException( "unexpected channel band "
+ "identifier [" + identifier + "]" );
}
return mMessage.getHex(DATA_ACCESS_CONTROL, 4);
}
@Override
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if(identifier == getTransmitChannelIdentifier())
{
mIdentifierUpdateTransmit = message;
}
else if(identifier == getReceiveChannelIdentifier())
{
mIdentifierUpdateReceive = message;
}
else
{
throw new IllegalArgumentException("unexpected channel band "
+ "identifier [" + identifier + "]");
}
}
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 2 ];
identifiers[ 0 ] = getTransmitChannelIdentifier();
identifiers[ 1 ] = getReceiveChannelIdentifier();
int[] identifiers = new int[2];
return identifiers;
identifiers[0] = getTransmitChannelIdentifier();
identifiers[1] = getReceiveChannelIdentifier();
return identifiers;
}
public long getDownlinkFrequency()
{
return calculateDownlink( mIdentifierUpdateTransmit, getReceiveChannelNumber() );
if(mIdentifierUpdateTransmit != null)
{
return mIdentifierUpdateTransmit.getDownlinkFrequency(getTransmitChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
return calculateUplink( mIdentifierUpdateReceive, getTransmitChannelNumber() );
if(mIdentifierUpdateReceive != null)
{
mIdentifierUpdateReceive.getUplinkFrequency(getReceiveChannelNumber());
}
return 0;
}
}

View File

@@ -1,131 +1,164 @@
/*******************************************************************************
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package module.decode.p25.message.tsbk.osp.data;
import alias.AliasList;
import bits.BinaryMessage;
import module.decode.p25.message.IBandIdentifier;
import module.decode.p25.message.IdentifierReceiver;
import module.decode.p25.reference.DataUnitID;
import alias.AliasList;
import bits.BinaryMessage;
public class SNDCPDataChannelGrant extends SNDCPData implements IdentifierReceiver
{
public static final int[] TRANSMIT_IDENTIFIER = { 88,89,90,91 };
public static final int[] TRANSMIT_NUMBER = { 92,93,94,95,96,97,98,99,100,
101,102,103 };
public static final int[] RECEIVE_IDENTIFIER = { 104,105,106,107 };
public static final int[] RECEIVE_NUMBER = { 108,109,110,111,112,113,114,
115,116,117,118,119 };
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 };
public static final int[] TRANSMIT_IDENTIFIER = {88, 89, 90, 91};
public static final int[] TRANSMIT_NUMBER = {92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103};
public static final int[] RECEIVE_IDENTIFIER = {104, 105, 106, 107};
public static final int[] RECEIVE_NUMBER = {108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119};
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};
private IBandIdentifier mIdentifierUpdateTransmit;
private IBandIdentifier mIdentifierUpdateReceive;
public SNDCPDataChannelGrant( BinaryMessage message,
DataUnitID duid,
AliasList aliasList )
public SNDCPDataChannelGrant(BinaryMessage message, DataUnitID duid, AliasList aliasList)
{
super( message, duid, aliasList );
super(message, duid, aliasList);
}
public boolean isTDMAChannel()
{
if(mIdentifierUpdateTransmit != null)
{
return mIdentifierUpdateTransmit.isTDMA();
}
return false;
}
public String getMessage()
{
StringBuilder sb = new StringBuilder();
sb.append( getMessageStub() );
if( isEmergency() )
{
sb.append( " EMERGENCY" );
}
sb.append( " UPLINK:" );
sb.append( getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber() );
sb.append( " " + getUplinkFrequency() );
sb.append( " DOWNLINK:" );
sb.append( getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber() );
sb.append( " " + getDownlinkFrequency() );
sb.append( " TGT:" );
sb.append( getTargetAddress() );
sb.append(getMessageStub());
if(isEmergency())
{
sb.append(" EMERGENCY");
}
sb.append(" UPLINK:");
sb.append(getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber());
sb.append(" " + getUplinkFrequency());
sb.append(" DOWNLINK:");
sb.append(getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber());
sb.append(" " + getDownlinkFrequency());
sb.append(" TGT:");
sb.append(getTargetAddress());
return sb.toString();
}
public int getTransmitChannelIdentifier()
{
return mMessage.getInt( TRANSMIT_IDENTIFIER );
return mMessage.getInt(TRANSMIT_IDENTIFIER);
}
public int getTransmitChannelNumber()
{
return mMessage.getInt( TRANSMIT_NUMBER );
return mMessage.getInt(TRANSMIT_NUMBER);
}
public String getTransmitChannel()
{
return getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber();
return getTransmitChannelIdentifier() + "-" + getTransmitChannelNumber();
}
public int getReceiveChannelIdentifier()
{
return mMessage.getInt( RECEIVE_IDENTIFIER );
return mMessage.getInt(RECEIVE_IDENTIFIER);
}
public int getReceiveChannelNumber()
{
return mMessage.getInt( RECEIVE_NUMBER );
return mMessage.getInt(RECEIVE_NUMBER);
}
public String getReceiveChannel()
{
return getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber();
return getReceiveChannelIdentifier() + "-" + getReceiveChannelNumber();
}
public String getTargetAddress()
{
return mMessage.getHex( TARGET_ADDRESS, 6 );
return mMessage.getHex(TARGET_ADDRESS, 6);
}
@Override
public void setIdentifierMessage( int identifier, IBandIdentifier message )
@Override
public void setIdentifierMessage(int identifier, IBandIdentifier message)
{
if( identifier == getTransmitChannelIdentifier() )
{
mIdentifierUpdateTransmit = message;
}
else if( identifier == getReceiveChannelIdentifier() )
{
mIdentifierUpdateReceive = message;
}
else
{
throw new IllegalArgumentException( "unexpected channel band "
+ "identifier [" + identifier + "]" );
}
if(identifier == getTransmitChannelIdentifier())
{
mIdentifierUpdateTransmit = message;
}
else if(identifier == getReceiveChannelIdentifier())
{
mIdentifierUpdateReceive = message;
}
else
{
throw new IllegalArgumentException("unexpected channel band "
+ "identifier [" + identifier + "]");
}
}
@Override
@Override
public int[] getIdentifiers()
{
int[] identifiers = new int[ 2 ];
identifiers[ 0 ] = getTransmitChannelIdentifier();
identifiers[ 1 ] = getReceiveChannelIdentifier();
int[] identifiers = new int[2];
return identifiers;
identifiers[0] = getTransmitChannelIdentifier();
identifiers[1] = getReceiveChannelIdentifier();
return identifiers;
}
public long getDownlinkFrequency()
{
return calculateDownlink( mIdentifierUpdateTransmit, getTransmitChannelNumber() );
if(mIdentifierUpdateTransmit != null)
{
return mIdentifierUpdateTransmit.getDownlinkFrequency(getTransmitChannelNumber());
}
return 0;
}
public long getUplinkFrequency()
{
return calculateUplink( mIdentifierUpdateReceive, getReceiveChannelNumber() );
if(mIdentifierUpdateReceive != null)
{
return mIdentifierUpdateReceive.getUplinkFrequency(getReceiveChannelNumber());
}
return 0;
}
}

View File

@@ -62,6 +62,13 @@ public class FMDemodulatorModule extends Module implements IComplexBufferListene
mIQFilter.setListener(mDemodulator);
}
public FMDemodulatorModule(float[] filter)
{
mIQFilter = new ComplexFIRFilter_CB_CB(filter, 1.0f);
mDemodulator = new FMDemodulator_CB(1.0f);
mIQFilter.setListener(mDemodulator);
}
@Override
public Listener<ComplexBuffer> getComplexBufferListener()
{

View File

@@ -89,6 +89,7 @@ public class PlaylistManager implements ChannelEventListener
@Override
public void receive(AliasEvent t)
{
//Save the playlist for all alias events
schedulePlaylistSave();
}
});
@@ -98,6 +99,7 @@ public class PlaylistManager implements ChannelEventListener
@Override
public void receive(ChannelMapEvent t)
{
//Save the playlist for all channel map events
schedulePlaylistSave();
}
});
@@ -107,7 +109,23 @@ public class PlaylistManager implements ChannelEventListener
@Override
public void receive(BroadcastEvent broadcastEvent)
{
schedulePlaylistSave();
switch(broadcastEvent.getEvent())
{
case CONFIGURATION_ADD:
case CONFIGURATION_CHANGE:
case CONFIGURATION_DELETE:
schedulePlaylistSave();
break;
case BROADCASTER_ADD:
case BROADCASTER_QUEUE_CHANGE:
case BROADCASTER_STATE_CHANGE:
case BROADCASTER_STREAMED_COUNT_CHANGE:
case BROADCASTER_AGED_OFF_COUNT_CHANGE:
case BROADCASTER_DELETE:
default:
//Do nothing
break;
}
}
});
}

View File

@@ -25,87 +25,169 @@ import properties.SystemProperties;
import record.wave.ComplexBufferWaveRecorder;
import record.wave.RealBufferWaveRecorder;
import sample.Listener;
import sample.OverflowableTransferQueue;
import sample.real.IOverflowListener;
import util.ThreadPool;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
public class RecorderManager implements Listener<AudioPacket>
{
private static final Logger mLog = LoggerFactory.getLogger(RecorderManager.class);
public static final int AUDIO_SAMPLE_RATE = 8000;
public static final long IDLE_RECORDER_REMOVAL_THRESHOLD = 6000; //6 seconds
private Map<String,RealBufferWaveRecorder> mRecorders = new HashMap<>();
private OverflowableTransferQueue<AudioPacket> mAudioPacketQueue = new OverflowableTransferQueue<>(1000, 100);
private ScheduledFuture<?> mBufferProcessorFuture;
private boolean mCanStartNewRecorders = true;
/**
* Manages all audio recording for all processing channels. Reconstructs audio streams and distributes channel
* audio to each of the recorders, starting and stopping the recorders as needed.
* Audio recording manager. Monitors stream of audio packets produced by decoding channels and automatically starts
* audio recorders when the channel's metadata designates a call as recordable. Routes call audio to each recorder
* based on audio packet metadata. Recorders are shutdown when the channel sends an end-call audio packet
* indicating that the call is complete. A separate recording monitor periodically checks for idled recorders to
* be stopped for cases when the channel fails to send an end-call audio packet.
*/
public RecorderManager()
{
mAudioPacketQueue.setOverflowListener(new IOverflowListener()
{
@Override
public void sourceOverflow(boolean overflow)
{
if(overflow)
{
mLog.warn("overflow - audio packets will be dropped until recording catches up");
}
else
{
mLog.info("audio recorder packet processing has returned to normal");
}
}
});
mBufferProcessorFuture = ThreadPool.SCHEDULED.scheduleAtFixedRate(new BufferProcessor(), 0,
1, TimeUnit.SECONDS);
}
/**
* Prepares this class for shutdown
*/
public void dispose()
{
if(mBufferProcessorFuture != null)
{
mBufferProcessorFuture.cancel(true);
}
}
/**
* Primary ingest point for audio packets from all decoding channels
* @param audioPacket to process
*/
@Override
public void receive(AudioPacket audioPacket)
{
if(audioPacket.hasMetadata() &&
audioPacket.getMetadata().isRecordable())
if(audioPacket.hasMetadata() && audioPacket.getMetadata().isRecordable())
{
String identifier = audioPacket.getMetadata().getUniqueIdentifier();
mAudioPacketQueue.offer(audioPacket);
}
}
if(mRecorders.containsKey(identifier))
/**
* Process any queued audio buffers and dispatch them to the audio recorders
*/
private void processBuffers()
{
List<AudioPacket> audioPackets = new ArrayList<>();
mAudioPacketQueue.drainTo(audioPackets, 50);
while(!audioPackets.isEmpty())
{
for(AudioPacket audioPacket: audioPackets)
{
RealBufferWaveRecorder recorder = mRecorders.get(identifier);
String identifier = audioPacket.getMetadata().getUniqueIdentifier();
if(audioPacket.getType() == AudioPacket.Type.AUDIO)
if(mRecorders.containsKey(identifier))
{
recorder.receive(audioPacket.getAudioBuffer());
}
else if(audioPacket.getType() == AudioPacket.Type.END)
{
RealBufferWaveRecorder finished = mRecorders.remove(identifier);
finished.stop();
}
}
else if(audioPacket.getType() == AudioPacket.Type.AUDIO)
{
if(mCanStartNewRecorders)
{
String filePrefix = getFilePrefix(audioPacket);
RealBufferWaveRecorder recorder = mRecorders.get(identifier);
RealBufferWaveRecorder recorder = null;
try
if(audioPacket.getType() == AudioPacket.Type.AUDIO)
{
recorder = new RealBufferWaveRecorder(AUDIO_SAMPLE_RATE, filePrefix);
recorder.start(ThreadPool.SCHEDULED);
recorder.receive(audioPacket.getAudioBuffer());
mRecorders.put(identifier, recorder);
}
catch(Exception ioe)
else if(audioPacket.getType() == AudioPacket.Type.END)
{
mCanStartNewRecorders = false;
RealBufferWaveRecorder finished = mRecorders.remove(identifier);
finished.stop();
}
}
else if(audioPacket.getType() == AudioPacket.Type.AUDIO)
{
if(mCanStartNewRecorders)
{
String filePrefix = getFilePrefix(audioPacket);
mLog.error("Error attempting to start new audio wave recorder. All (future) audio recording " +
"is disabled", ioe);
RealBufferWaveRecorder recorder = null;
if(recorder != null)
try
{
recorder.stop();
recorder = new RealBufferWaveRecorder(AUDIO_SAMPLE_RATE, filePrefix);
recorder.start(ThreadPool.SCHEDULED);
recorder.receive(audioPacket.getAudioBuffer());
mRecorders.put(identifier, recorder);
}
catch(Exception ioe)
{
mCanStartNewRecorders = false;
mLog.error("Error attempting to start new audio wave recorder. All (future) audio recording " +
"is disabled", ioe);
if(recorder != null)
{
recorder.stop();
}
}
}
}
}
audioPackets.clear();
mAudioPacketQueue.drainTo(audioPackets, 50);
}
}
/**
* Removes recorders that have not received any new audio buffers in the last 6 seconds.
*/
private void removeIdleRecorders()
{
Iterator<Map.Entry<String,RealBufferWaveRecorder>> it = mRecorders.entrySet().iterator();
while(it.hasNext())
{
Map.Entry<String,RealBufferWaveRecorder> entry = it.next();
if(entry.getValue().getLastBufferReceived() + IDLE_RECORDER_REMOVAL_THRESHOLD < System.currentTimeMillis())
{
mLog.info("Removing idle recorder [" + entry.getKey() + "]");
it.remove();
entry.getValue().stop();
}
}
}
@@ -150,4 +232,18 @@ public class RecorderManager implements Listener<AudioPacket>
return new ComplexBufferWaveRecorder(AUDIO_SAMPLE_RATE, sb.toString());
}
/**
* Processes queued audio packets and distributes to each of the audio recorders. Removes any idle recorders
* that have not been updated according to an idle threshold period
*/
public class BufferProcessor implements Runnable
{
@Override
public void run()
{
processBuffers();
removeIdleRecorders();
}
}
}

View File

@@ -18,6 +18,7 @@
******************************************************************************/
package record.wave;
import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sample.ConversionUtils;
@@ -58,7 +59,7 @@ public class MonoWaveReader implements AutoCloseable
*/
public MonoWaveReader(Path path, boolean realTime) throws IOException
{
assert( path != null );
Validate.isTrue(path != null);
mPath = path;
mRealTime = realTime;

View File

@@ -1,22 +1,33 @@
/*******************************************************************************
* SDR Trunk
* Copyright (C) 2014,2015 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package record.wave;
import module.Module;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sample.ConversionUtils;
import sample.Listener;
import sample.real.IFilteredRealBufferListener;
import sample.real.RealBuffer;
import util.TimeStamp;
import javax.sound.sampled.AudioFormat;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -26,206 +37,175 @@ import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.sound.sampled.AudioFormat;
import module.Module;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sample.ConversionUtils;
import sample.Listener;
import sample.real.IFilteredRealBufferListener;
import sample.real.RealBuffer;
import util.TimeStamp;
/**
* WAVE audio recorder module for recording real sample buffers to a wave file
*/
public class RealBufferWaveRecorder extends Module
implements IFilteredRealBufferListener, Listener<RealBuffer>
public class RealBufferWaveRecorder extends Module
implements IFilteredRealBufferListener, Listener<RealBuffer>
{
private final static Logger mLog =
LoggerFactory.getLogger( RealBufferWaveRecorder.class );
private final static Logger mLog = LoggerFactory.getLogger(RealBufferWaveRecorder.class);
private WaveWriter mWriter;
private String mFilePrefix;
private Path mFile;
private AudioFormat mAudioFormat;
private BufferProcessor mBufferProcessor;
private ScheduledFuture<?> mProcessorHandle;
private LinkedBlockingQueue<RealBuffer> mBuffers =
new LinkedBlockingQueue<>( 500 );
private long mLastBufferReceived;
private AtomicBoolean mRunning = new AtomicBoolean();
public RealBufferWaveRecorder( int sampleRate, String filePrefix )
{
mAudioFormat = new AudioFormat( sampleRate, //SampleRate
16, //Sample Size
1, //Channels
true, //Signed
false ); //Little Endian
private AudioFormat mAudioFormat;
mFilePrefix = filePrefix;
}
private BufferProcessor mBufferProcessor;
private ScheduledFuture<?> mProcessorHandle;
private LinkedBlockingQueue<RealBuffer> mBuffers = new LinkedBlockingQueue<>(500);
private long mLastBufferReceived;
/**
* Timestamp of when the latest buffer was received by this recorder
*/
public long getLastBufferReceived()
{
return mLastBufferReceived;
}
private AtomicBoolean mRunning = new AtomicBoolean();
public Path getFile()
{
return mFile;
}
public void start( ScheduledExecutorService executor )
{
if( mRunning.compareAndSet( false, true ) )
{
if( mBufferProcessor == null )
{
mBufferProcessor = new BufferProcessor();
}
public RealBufferWaveRecorder(int sampleRate, String filePrefix)
{
mAudioFormat = new AudioFormat(sampleRate, //SampleRate
16, //Sample Size
1, //Channels
true, //Signed
false); //Little Endian
try
{
StringBuilder sb = new StringBuilder();
sb.append( mFilePrefix );
sb.append( "_" );
sb.append( TimeStamp.getLongTimeStamp( "_" ) );
sb.append( ".wav" );
mFile = Paths.get( sb.toString() );
mFilePrefix = filePrefix;
}
mWriter = new WaveWriter( mAudioFormat, mFile );
/**
* Indicates if the recorder is currently running.
*/
public boolean isRunning()
{
return mRunning.get();
}
/**
* Timestamp of when the latest buffer was received by this recorder
*/
public long getLastBufferReceived()
{
return mLastBufferReceived;
}
public Path getFile()
{
return mFile;
}
public void start(ScheduledExecutorService executor)
{
if(mRunning.compareAndSet(false, true))
{
if(mBufferProcessor == null)
{
mBufferProcessor = new BufferProcessor();
}
try
{
StringBuilder sb = new StringBuilder();
sb.append(mFilePrefix);
sb.append("_");
sb.append(TimeStamp.getLongTimeStamp("_"));
sb.append(".wav");
mFile = Paths.get(sb.toString());
mWriter = new WaveWriter(mAudioFormat, mFile);
/* Schedule the processor to run every 500 milliseconds */
mProcessorHandle = executor.scheduleAtFixedRate(
mBufferProcessor, 0, 500, TimeUnit.MILLISECONDS );
}
catch( IOException io )
{
mLog.error( "Error starting real buffer recorder", io );
}
}
}
public void stop()
{
/* Signal the buffer processor to end with a poison pill */
receive( new PoisonPill() );
mRunning.set( false );
}
@Override
public void receive( RealBuffer buffer )
{
if( mRunning.get() )
{
boolean success = mBuffers.offer( buffer );
if( !success )
{
mLog.error( "recorder buffer overflow - purging [" +
mFile.toFile().getAbsolutePath() + "]" );
mBuffers.clear();
}
mLastBufferReceived = System.currentTimeMillis();
}
}
@Override
public Listener<RealBuffer> getFilteredRealBufferListener()
{
return this;
}
@Override
public void dispose()
{
stop();
}
@Override
public void reset()
{
}
public class BufferProcessor implements Runnable
{
public void run()
{
try
{
RealBuffer buffer = mBuffers.poll();
while( buffer != null )
{
if( buffer instanceof PoisonPill )
{
buffer = null;
mBuffers.clear();
if( mWriter != null )
{
try
{
mWriter.close();
}
catch( IOException io )
{
mLog.error( "Error stopping complex wave recorder [" +
getFile() + "]", io );
}
}
if( mProcessorHandle != null )
{
mProcessorHandle.cancel( true );
}
mProcessorHandle = null;
mWriter = null;
mFile = null;
}
else
{
mWriter.write( ConversionUtils.convertToSigned16BitSamples( buffer ) );
buffer = mBuffers.poll();
}
}
mProcessorHandle = executor.scheduleAtFixedRate(mBufferProcessor, 0, 500, TimeUnit.MILLISECONDS);
}
catch ( IOException ioe )
{
/* Stop this module if/when we get an IO exception */
mBuffers.clear();
stop();
mLog.error( "IOException while trying to write to the wave "
+ "writer", ioe );
}
}
catch(IOException io)
{
mLog.error("Error starting real buffer recorder", io);
}
}
}
public void stop()
{
if(mRunning.compareAndSet(true, false))
{
try
{
write();
if(mWriter != null)
{
mWriter.close();
mWriter = null;
}
}
catch(IOException ioe)
{
mLog.error("Error writing final audio buffers to recording during shutdown", ioe);
}
}
}
@Override
public void receive(RealBuffer buffer)
{
if(mRunning.get())
{
boolean success = mBuffers.offer(buffer);
if(!success)
{
mLog.error("recorder buffer overflow - purging [" + mFile.toFile().getAbsolutePath() + "]");
mBuffers.clear();
}
mLastBufferReceived = System.currentTimeMillis();
}
}
@Override
public Listener<RealBuffer> getFilteredRealBufferListener()
{
return this;
}
@Override
public void dispose()
{
stop();
}
@Override
public void reset()
{
}
/**
* Writes all audio currently in the queue to the file
* @throws IOException if there are any errors writing the audio
*/
private void write() throws IOException
{
RealBuffer buffer = mBuffers.poll();
while(buffer != null)
{
mWriter.write(ConversionUtils.convertToSigned16BitSamples(buffer));
buffer = mBuffers.poll();
}
}
public class BufferProcessor implements Runnable
{
public void run()
{
try
{
write();
}
catch(IOException ioe)
{
/* Stop this module if/when we get an IO exception */
mBuffers.clear();
stop();
mLog.error("IO Exception while trying to write to the wave writer", ioe);
}
}
}
/**
* This is used as a sentinel value to signal the buffer processor to end
*/
public class PoisonPill extends RealBuffer
{
public PoisonPill()
{
super( new float[ 1 ] );
}
}
}

View File

@@ -1,22 +1,25 @@
/*******************************************************************************
* SDR Trunk
* Copyright (C) 2014 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
* sdrtrunk
* Copyright (C) 2014-2017 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
******************************************************************************/
package record.wave;
import org.apache.commons.lang3.Validate;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
@@ -32,10 +35,7 @@ import javax.sound.sampled.AudioFormat;
public class WaveWriter implements AutoCloseable
{
// private final static Logger mLog = LoggerFactory.getLogger( WaveWriter.class );
private static final Pattern FILENAME_PATTERN =
Pattern.compile( "(.*_)(\\d+)(\\.wav)" );
private static final Pattern FILENAME_PATTERN = Pattern.compile( "(.*_)(\\d+)(\\.wav)" );
public static final long MAX_WAVE_SIZE = 2l * (long)Integer.MAX_VALUE;
private AudioFormat mAudioFormat;
@@ -56,11 +56,10 @@ public class WaveWriter implements AutoCloseable
* @param maxSize - maximum file size ( range: 1 - 4,294,967,294 bytes )
* @throws IOException - if there are any IO issues
*/
public WaveWriter( AudioFormat format, Path file, long maxSize )
throws IOException
public WaveWriter( AudioFormat format, Path file, long maxSize ) throws IOException
{
assert( format != null );
assert( file != null );
Validate.isTrue(format != null);
Validate.isTrue( file != null );
mAudioFormat = format;
mFile = file;
@@ -100,15 +99,11 @@ public class WaveWriter implements AutoCloseable
while( Files.exists( mFile ) )
{
mFile = Paths.get( mFile.toFile().getAbsolutePath()
.replace( ".wav", "_" + version + ".wav" ) );
mFile = Paths.get( mFile.toFile().getAbsolutePath().replace( ".wav", "_" + version + ".wav" ) );
version++;
}
Files.createFile( mFile );
mFileChannel = (FileChannel.open( mFile, StandardOpenOption.WRITE ) );
mFileChannel = (FileChannel.open( mFile, StandardOpenOption.WRITE, StandardOpenOption.CREATE_NEW ) );
ByteBuffer header = WaveUtils.getWaveHeader( mAudioFormat );
@@ -127,9 +122,18 @@ public class WaveWriter implements AutoCloseable
{
mFileChannel.force( true );
mFileChannel.close();
mFileChannel = null;
}
/**
@Override
protected void finalize() throws IOException
{
mFileChannel.force( true );
mFileChannel.close();
mFileChannel = null;
}
/**
* Writes the buffer contents to the file. Assumes that the buffer is full
* and the first byte of data is at position 0.
*/

View File

@@ -20,6 +20,7 @@ package sample.adapter;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import org.apache.commons.lang3.Validate;
import source.mixer.MixerChannel;
/**
@@ -34,7 +35,7 @@ public class ChannelShortAdapter implements ISampleAdapter
public ChannelShortAdapter( MixerChannel channel )
{
/* Only use with LEFT/RIGHT channels */
assert( channel != MixerChannel.MONO );
Validate.isTrue(channel != MixerChannel.MONO);
mMixerChannel = channel;
}

Some files were not shown because too many files have changed in this diff Show More