From 3861559f87c6191c8a9a7d74cbb6852c47a282b8 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Wed, 26 Jun 2024 12:17:54 -0400 Subject: [PATCH] add support to send SNDCP disabled annoucement messages properly; --- src/common/p25/lc/tsbk/OSP_SNDCP_CH_ANN.cpp | 20 ++++++++++++++++---- src/common/p25/lc/tsbk/OSP_SNDCP_CH_ANN.h | 6 +++++- src/host/p25/packet/ControlSignaling.cpp | 12 +++++++++--- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/common/p25/lc/tsbk/OSP_SNDCP_CH_ANN.cpp b/src/common/p25/lc/tsbk/OSP_SNDCP_CH_ANN.cpp index afa77096..8115f462 100644 --- a/src/common/p25/lc/tsbk/OSP_SNDCP_CH_ANN.cpp +++ b/src/common/p25/lc/tsbk/OSP_SNDCP_CH_ANN.cpp @@ -28,6 +28,7 @@ using namespace p25::lc::tsbk; /// Initializes a new instance of the OSP_SNDCP_CH_ANN class. /// OSP_SNDCP_CH_ANN::OSP_SNDCP_CH_ANN() : TSBK(), + m_implicitChannel(false), m_sndcpAutoAccess(true), m_sndcpDAC(1U) { @@ -76,10 +77,21 @@ void OSP_SNDCP_CH_ANN::encode(uint8_t* data, bool rawTSBK, bool noTrellis) tsbkValue = (tsbkValue << 8) + (m_sndcpAutoAccess ? 0x80U : 0x00U) + // Autonomous Access (m_sndcpAutoAccess ? 0x40U : 0x00U); // Requested Access - tsbkValue = (tsbkValue << 4) + m_siteData.channelId(); // Channel (T) ID - tsbkValue = (tsbkValue << 12) + m_siteData.channelNo(); // Channel (T) Number - tsbkValue = (tsbkValue << 4) + m_siteData.channelId(); // Channel (R) ID - tsbkValue = (tsbkValue << 12) + (rxChNo & 0xFFFU); // Channel (R) Number + + if (m_implicitChannel) { + tsbkValue = (tsbkValue << 16) + 0xFFFFU; + } else { + tsbkValue = (tsbkValue << 4) + m_siteData.channelId(); // Channel (T) ID + tsbkValue = (tsbkValue << 12) + m_siteData.channelNo(); // Channel (T) Number + } + + if (m_implicitChannel) { + tsbkValue = (tsbkValue << 16) + 0xFFFFU; + } else { + tsbkValue = (tsbkValue << 4) + m_siteData.channelId(); // Channel (R) ID + tsbkValue = (tsbkValue << 12) + (rxChNo & 0xFFFU); // Channel (R) Number + } + tsbkValue = (tsbkValue << 16) + m_sndcpDAC; // Data Access Control std::unique_ptr tsbk = TSBK::fromValue(tsbkValue); diff --git a/src/common/p25/lc/tsbk/OSP_SNDCP_CH_ANN.h b/src/common/p25/lc/tsbk/OSP_SNDCP_CH_ANN.h index fde10624..5a757ba3 100644 --- a/src/common/p25/lc/tsbk/OSP_SNDCP_CH_ANN.h +++ b/src/common/p25/lc/tsbk/OSP_SNDCP_CH_ANN.h @@ -7,7 +7,7 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #if !defined(__P25_LC_TSBK__OSP_SNDCP_CH_ANN_H__) @@ -40,6 +40,10 @@ namespace p25 /// Returns a string that represents the current TSBK. std::string toString(bool isp = false) override; + public: + /// Flag indicating explicit channel frequncies should not be transmitted. + __PROPERTY(bool, implicitChannel, ImplicitChannel); + private: bool m_sndcpAutoAccess; uint16_t m_sndcpDAC; diff --git a/src/host/p25/packet/ControlSignaling.cpp b/src/host/p25/packet/ControlSignaling.cpp index 24044453..73657d3d 100644 --- a/src/host/p25/packet/ControlSignaling.cpp +++ b/src/host/p25/packet/ControlSignaling.cpp @@ -2051,11 +2051,17 @@ void ControlSignaling::queueRF_TSBK_Ctrl(uint8_t lco) } break; case TSBKO::OSP_SNDCP_CH_ANN: + { // transmit SNDCP announcement - tsbk = std::make_unique(); - tsbk->siteIdenEntry(m_p25->m_idenEntry); + std::unique_ptr osp = std::make_unique(); + osp->siteIdenEntry(m_p25->m_idenEntry); + if (!m_p25->m_sndcpSupport) { + osp->setImplicitChannel(true); + } + tsbk = std::move(osp); DEBUG_LOG_TSBK(tsbk->toString()); - break; + } + break; case TSBKO::OSP_SYNC_BCAST: { // transmit sync broadcast