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);