From 3cce6e0b68d06ae26f431b26bc351ffd758e32f8 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Tue, 25 Jul 2023 13:38:19 -0400 Subject: [PATCH] implement support for TIA-102.AABF-D LC_EXPLICIT_SOURCE_ID; --- src/p25/lc/LC.cpp | 19 +++++++++++++++++++ src/p25/lc/LC.h | 8 ++++++++ 2 files changed, 27 insertions(+) diff --git a/src/p25/lc/LC.cpp b/src/p25/lc/LC.cpp index 57e5fe64..851fd6b6 100644 --- a/src/p25/lc/LC.cpp +++ b/src/p25/lc/LC.cpp @@ -66,6 +66,9 @@ LC::LC() : m_srcId(0U), m_dstId(0U), m_grpVchNo(0U), + m_explicitId(false), + m_netId(P25_WACN_STD_DEFAULT), + m_sysId(P25_SID_STD_DEFAULT), m_emergency(false), m_encrypted(false), m_priority(4U), @@ -512,6 +515,11 @@ void LC::copy(const LC& data) m_grpVchNo = data.m_grpVchNo; + m_explicitId = data.m_explicitId; + + m_netId = data.m_netId; + m_sysId = data.m_sysId; + m_emergency = data.m_emergency; m_encrypted = data.m_encrypted; m_priority = data.m_priority; @@ -601,6 +609,7 @@ bool LC::decodeLC(const uint8_t* rs) m_encrypted = (rs[2U] & 0x40U) == 0x40U; // Encryption Flag } m_priority = (rs[2U] & 0x07U); // Priority + m_explicitId = (rs[3U] & 0x01U) == 0x01U; // Explicit Source ID Flag m_dstId = (uint32_t)((rsValue >> 24) & 0xFFFFU); // Talkgroup Address m_srcId = (uint32_t)(rsValue & 0xFFFFFFU); // Source Radio Address break; @@ -626,6 +635,11 @@ bool LC::decodeLC(const uint8_t* rs) m_srcId = (uint32_t)(rsValue & 0xFFFFFFU); // Source/Target Address } break; + case LC_EXPLICIT_SOURCE_ID: + m_netId = (uint32_t)((rsValue >> 36) & 0xFFFFFU); // Network ID + m_sysId = (uint32_t)((rsValue >> 24) & 0xFFFU); // System ID + m_srcId = (uint32_t)(rsValue & 0xFFFFFFU); // Source Radio Address + break; default: LogError(LOG_P25, "LC::decodeLC(), unknown LC value, mfId = $%02X, lco = $%02X", m_mfId, m_lco); return false; @@ -686,6 +700,11 @@ void LC::encodeLC(uint8_t* rs) rsValue = (rsValue << 16) + m_callTimer; // Call Timer rsValue = (rsValue << 24) + m_srcId; // Source/Target Radio Address break; + case LC_EXPLICIT_SOURCE_ID: + rsValue = m_netId; // Network ID + rsValue = (rsValue << 12) + (m_sysId & 0xFFFU); // System ID + rsValue = (rsValue << 24) + m_srcId; // Source Radio Address + break; case LC_RFSS_STS_BCAST: rs[0U] |= 0x40U; // Implicit Operation rsValue = m_siteData.lra(); // Location Registration Area diff --git a/src/p25/lc/LC.h b/src/p25/lc/LC.h index da02be0f..38e08ed8 100644 --- a/src/p25/lc/LC.h +++ b/src/p25/lc/LC.h @@ -111,6 +111,14 @@ namespace p25 /// Voice channel number. __PROPERTY(uint32_t, grpVchNo, GrpVchNo); + /// Flag indicating explicit addressing. + __PROPERTY(bool, explicitId, ExplicitId); + + /// Network ID. + __PROPERTY(uint32_t, netId, NetId); + /// System ID. + __PROPERTY(uint32_t, sysId, SysId); + /** Service Options */ /// Flag indicating the emergency bits are set. __PROPERTY(bool, emergency, Emergency);