conform to P25 standards for composite control channel when VoC mode is enabled, and transmit LC_RFSS_STS_BCAST every 3 superframes;

pull/1/head
Bryan Biedenkapp 5 years ago
parent 6640485dad
commit 9a4078b6a4

@ -216,6 +216,9 @@ void TrunkPacket::setServiceClass(bool control, bool voiceOnControl)
m_rfTDULC.setServiceClass(serviceClass);
m_netTDULC.setServiceClass(serviceClass);
m_p25->m_voice->m_rfLC.setServiceClass(serviceClass);
m_p25->m_voice->m_netLC.setServiceClass(serviceClass);
}
/// <summary>

@ -46,6 +46,12 @@ using namespace p25;
#include <cstring>
#include <ctime>
// ---------------------------------------------------------------------------
// Constants
// ---------------------------------------------------------------------------
const uint32_t VOC_LDU1_COUNT = 3U;
// ---------------------------------------------------------------------------
// Public Class Members
// ---------------------------------------------------------------------------
@ -62,6 +68,7 @@ void VoicePacket::resetRF()
m_rfErrs = 0U;
m_rfBits = 1U;
m_rfUndecodableLC = 0U;
m_vocLDU1Count = 0U;
}
/// <summary>
@ -73,6 +80,7 @@ void VoicePacket::resetNet()
m_netLastLDU1.reset();
m_netFrames = 0U;
m_netLost = 0U;
m_vocLDU1Count = 0U;
}
/// <summary>
@ -373,6 +381,7 @@ bool VoicePacket::process(uint8_t* data, uint32_t len)
m_rfErrs = 0U;
m_rfBits = 1U;
m_rfUndecodableLC = 0U;
m_vocLDU1Count = 0U;
m_p25->m_rfTimeout.start();
m_lastDUID = P25_DUID_HDU;
@ -436,6 +445,16 @@ bool VoicePacket::process(uint8_t* data, uint32_t len)
m_p25->m_trunk->touchDstIdGrant(m_rfLC.getDstId());
}
// single-channel trunking or voice on control support?
if (m_p25->m_control && m_p25->m_voiceOnControl) {
// per TIA-102.AABD-B transmit RFSS_STS_BCAST every 3 superframes (e.g. every 3 LDU1s)
m_vocLDU1Count++;
if (m_vocLDU1Count > VOC_LDU1_COUNT) {
m_vocLDU1Count = 0U;
m_rfLC.setLCO(LC_RFSS_STS_BCAST);
}
}
// Generate Sync
Sync::addP25Sync(data + 2U);
@ -865,6 +884,7 @@ VoicePacket::VoicePacket(Control* p25, network::BaseNetwork* network, bool debug
m_lastRejectId(0U),
m_lastPatchGroup(0U),
m_silenceThreshold(124U),
m_vocLDU1Count(0U),
m_verbose(verbose),
m_debug(debug)
{
@ -1201,6 +1221,7 @@ void VoicePacket::writeNet_LDU1(const lc::LC& control, const data::LowSpeedData&
m_p25->m_netTimeout.start();
m_netFrames = 0U;
m_netLost = 0U;
m_vocLDU1Count = 0U;
if (!m_p25->m_disableNetworkHDU) {
uint8_t buffer[P25_HDU_FRAME_LENGTH_BYTES + 2U];
@ -1237,6 +1258,16 @@ void VoicePacket::writeNet_LDU1(const lc::LC& control, const data::LowSpeedData&
}
}
// single-channel trunking or voice on control support?
if (m_p25->m_control && m_p25->m_voiceOnControl) {
// per TIA-102.AABD-B transmit RFSS_STS_BCAST every 3 superframes (e.g. every 3 LDU1s)
m_vocLDU1Count++;
if (m_vocLDU1Count > VOC_LDU1_COUNT) {
m_vocLDU1Count = 0U;
m_netLC.setLCO(LC_RFSS_STS_BCAST);
}
}
insertMissingAudio(m_netLDU1);
uint8_t buffer[P25_LDU_FRAME_LENGTH_BYTES + 2U];

@ -103,6 +103,8 @@ namespace p25
uint32_t m_silenceThreshold;
uint8_t m_vocLDU1Count;
bool m_verbose;
bool m_debug;

@ -57,6 +57,7 @@ LC::LC() :
m_mfId(P25_MFG_STANDARD),
m_srcId(0U),
m_dstId(0U),
m_serviceClass(P25_SVC_CLS_VOICE | P25_SVC_CLS_DATA),
m_emergency(false),
m_encrypted(false),
m_priority(4U),
@ -97,6 +98,8 @@ LC& LC::operator=(const LC& data)
m_srcId = data.m_srcId;
m_dstId = data.m_dstId;
m_serviceClass = data.m_serviceClass;
m_grpVchNo = data.m_grpVchNo;
m_emergency = data.m_emergency;
@ -633,6 +636,16 @@ 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_RFSS_STS_BCAST:
rs[0U] |= 0x40U; // Implicit Operation
rsValue = m_siteData.lra(); // Location Registration Area
rsValue = (rsValue << 12) + m_siteData.sysId(); // System ID
rsValue = (rsValue << 8) + m_siteData.rfssId(); // RF Sub-System ID
rsValue = (rsValue << 8) + m_siteData.siteId(); // Site ID
rsValue = (rsValue << 4) + m_siteData.channelId(); // Channel ID
rsValue = (rsValue << 12) + m_siteData.channelNo(); // Channel Number
rsValue = (rsValue << 8) + m_serviceClass; // System Service Class
break;
default:
LogError(LOG_P25, "unknown LC value, mfId = $%02X, lco = $%02X", m_mfId, m_lco);
break;

@ -107,6 +107,9 @@ namespace p25
/// <summary>Destination ID.</summary>
__PROPERTY(uint32_t, dstId, DstId);
/// <summary>Service class.</summary>
__PROPERTY(uint8_t, serviceClass, ServiceClass);
/// <summary>Voice channel number.</summary>
__PROPERTY(uint32_t, grpVchNo, GrpVchNo);

Loading…
Cancel
Save

Powered by TurnKey Linux.