#1304 P25 Phase 1/2 decoder enhancements. (#1898)

* P25 Phase 2 now supports control channel decoding and decoder was enhanced to improve decodes.
* Radio reference site editor updated for phase 2 sites to allow user to select FDMA or TDMA control.
* Decode events are now minimized and de-duplicated.
* Fully parsing all phase 1/2 messages from the latest ICD.
* Vendor specific messaging recoveries (Moto & Harris).
* Patch group management enhancements with stale patch detection.
* Tuner editor now fully resets the min/max frequency values
* Default traffic channel count increased to 20 (from 3).
* ISSI roaming radio and talkgroup values now displayed and aliasable as fully qualified values (e.g. 1234(123.456.7890)
* Moto emergency alarm activation messaging support
* Expanded list of P25 encryption algorithms
* Message (bits) viewer enhanced for P25 phase 1 and phase 2
* IPV4 addresses and UDP ports no longer classified as user values - won't display in event views.
* New framework for describing message binary fields that should reduce overall memory footprint and enhance code readability

Co-authored-by: Dennis Sheirer <dsheirer@github.com>
This commit is contained in:
Denny Sheirer
2024-04-26 13:55:17 -04:00
committed by GitHub
parent f5938fa8e2
commit 7e709d9d6f
430 changed files with 30098 additions and 13300 deletions

View File

@@ -1,23 +1,20 @@
/*
* *****************************************************************************
* Copyright (C) 2014-2024 Dennis Sheirer
*
* * ******************************************************************************
* * Copyright (C) 2014-2019 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/>
* * *****************************************************************************
* 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 io.github.dsheirer.identifier.radio;
@@ -25,29 +22,74 @@ package io.github.dsheirer.identifier.radio;
import io.github.dsheirer.identifier.Role;
/**
* Fully qualified radio identifier
* Fully qualified radio identifier. This is used for roaming radios or any time there is a need to fully qualify a
* radio.
*/
public abstract class FullyQualifiedRadioIdentifier extends RadioIdentifier
{
private int mWacn;
private int mSystem;
private int mRadio;
/**
* Constructs an instance
* @param wacn
* @param system
* @param id
* @param localAddress radio identifier, aka alias. This can be the same as the radio ID when the fully qualified radio
* is not being aliased on a local radio system.
* @param wacn of the home network for the radio.
* @param system of the home network for the radio.
* @param id of the radio within the home network.
*/
public FullyQualifiedRadioIdentifier(int wacn, int system, int id, Role role)
public FullyQualifiedRadioIdentifier(int localAddress, int wacn, int system, int id, Role role)
{
super(id, role);
super(localAddress > 0 ? localAddress : id, role);
mWacn = wacn;
mSystem = system;
mRadio = id;
}
public int getWacn()
{
return mWacn;
}
public int getSystem()
{
return mSystem;
}
public int getRadio()
{
return mRadio;
}
/**
* Fully qualified radio identity.
* @return radio identity
*/
public String getFullyQualifiedRadioAddress()
{
return mWacn + "." + mSystem + "." + mRadio;
}
/**
* Indicates if the radio identify is aliased with a persona value that is different from the radio ID.
* @return true if aliased.
*/
public boolean isAliased()
{
return getValue() != mRadio;
}
@Override
public String toString()
{
return mWacn + "." + mSystem + "." + super.toString();
if(isAliased())
{
return super.toString() + "(" + getFullyQualifiedRadioAddress() + ")";
}
else
{
return getFullyQualifiedRadioAddress();
}
}
}