diff --git a/DMRCSBK.cpp b/DMRCSBK.cpp index 79f7ec5..2404ec2 100644 --- a/DMRCSBK.cpp +++ b/DMRCSBK.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2020,2021 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2020,2021,2022 by Jonathan Naylor G4KLX * Copyright (C) 2019 by Patrick Maier DK5MP * * This program is free software; you can redistribute it and/or modify @@ -34,7 +34,8 @@ m_bsId(0U), m_srcId(0U), m_dstId(0U), m_dataContent(false), -m_CBF(0U) +m_CBF(0U), +m_OVCM(false) { m_data = new unsigned char[12U]; } @@ -81,6 +82,7 @@ bool CDMRCSBK::put(const unsigned char* bytes) m_srcId = m_data[7U] << 16 | m_data[8U] << 8 | m_data[9U]; m_dataContent = false; m_CBF = 0U; + m_OVCM = (m_data[2U] & 0x04U) == 0x04U; CUtils::dump(1U, "Unit to Unit Service Request CSBK", m_data, 12U); break; @@ -90,6 +92,7 @@ bool CDMRCSBK::put(const unsigned char* bytes) m_srcId = m_data[7U] << 16 | m_data[8U] << 8 | m_data[9U]; m_dataContent = false; m_CBF = 0U; + m_OVCM = (m_data[2U] & 0x04U) == 0x04U; CUtils::dump(1U, "Unit to Unit Service Answer Response CSBK", m_data, 12U); break; @@ -185,31 +188,21 @@ unsigned char CDMRCSBK::getFID() const bool CDMRCSBK::getOVCM() const { - bool bOVCM = false; - // Service options informations are only available in - // "Unit to Unit Voice Service Request CSBK" and - // "Unit to Unit Voice Service Answer Response CSBK" - if ((m_CSBKO == CSBKO_UUVREQ) || (m_CSBKO == CSBKO_UUANSRSP)) - bOVCM = (m_data[2U] & 0x04U) == 0x04U; - - return bOVCM; + return m_OVCM; } void CDMRCSBK::setOVCM(bool ovcm) { - // Set OVCM only in CSBKs having the service options information - if ((m_CSBKO == CSBKO_UUVREQ) || (m_CSBKO == CSBKO_UUANSRSP)) { + if (m_CSBKO == CSBKO_UUVREQ || m_CSBKO == CSBKO_UUANSRSP) { + m_OVCM = ovcm; + if (ovcm) m_data[2U] |= 0x04U; + else + m_data[2U] &= 0xFBU; } } -void CDMRCSBK::clearOVCM() -{ - if (getOVCM()) - m_data[2U] ^= 0x04U; -} - bool CDMRCSBK::getGI() const { return m_GI; diff --git a/DMRCSBK.h b/DMRCSBK.h index 564945d..87e3a62 100644 --- a/DMRCSBK.h +++ b/DMRCSBK.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2020,2021 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2020,2021,2022 by Jonathan Naylor G4KLX * * 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 @@ -51,7 +51,6 @@ public: // Set/Get the OVCM bit in the supported CSBKs bool getOVCM() const; void setOVCM(bool ovcm); - void clearOVCM(); // For BS Dwn Act unsigned int getBSId() const; @@ -77,6 +76,7 @@ private: unsigned int m_dstId; bool m_dataContent; unsigned char m_CBF; + bool m_OVCM; }; #endif diff --git a/DMRLC.cpp b/DMRLC.cpp index be669ac..6433647 100644 --- a/DMRLC.cpp +++ b/DMRLC.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2019,2021 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2019,2021,2022 by Jonathan Naylor G4KLX * * 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 @@ -193,12 +193,8 @@ void CDMRLC::setOVCM(bool ovcm) { if (ovcm) m_options |= 0x04U; -} - -void CDMRLC::clearOVCM() -{ - if (getOVCM()) - m_options ^= 0x04U; + else + m_options &= 0xFBU; } unsigned int CDMRLC::getSrcId() const diff --git a/DMRLC.h b/DMRLC.h index a52d2f8..22e133e 100644 --- a/DMRLC.h +++ b/DMRLC.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2019,2021 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2019,2021,2022 by Jonathan Naylor G4KLX * * 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 @@ -41,7 +41,6 @@ public: bool getOVCM() const; void setOVCM(bool ovcm); - void clearOVCM(); unsigned char getFID() const; void setFID(unsigned char fid); diff --git a/DMRSlot.cpp b/DMRSlot.cpp index c4e94e8..577ebc7 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -235,13 +235,12 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) return false; } - lc->setOVCM(m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON); - m_rfLC = lc; + if (m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON) + lc->setOVCM(true); + else if (m_ovcm == DMR_OVCM_FORCE_OFF) + lc->setOVCM(false); - if (m_ovcm == DMR_OVCM_FORCE_OFF) { - lc->clearOVCM(); - m_rfLC = lc; - } + m_rfLC = lc; // The standby LC data m_rfEmbeddedLC.setLC(*m_rfLC); @@ -446,10 +445,10 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) return false; // set the OVCM bit for the supported csbk - csbk.setOVCM(m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON); - - if (m_ovcm == DMR_OVCM_FORCE_OFF) - csbk.clearOVCM(); + if (m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON) + csbk.setOVCM(true); + else if (m_ovcm == DMR_OVCM_FORCE_OFF) + csbk.setOVCM(false); bool gi = csbk.getGI(); unsigned int srcId = csbk.getSrcId(); @@ -813,13 +812,12 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) return false; } - lc->setOVCM(m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON); - m_rfLC = lc; + if (m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON) + lc->setOVCM(true); + else if (m_ovcm == DMR_OVCM_FORCE_OFF) + lc->setOVCM(false); - if (m_ovcm == DMR_OVCM_FORCE_OFF) { - lc->clearOVCM(); - m_rfLC = lc; - } + m_rfLC = lc; // The standby LC data m_rfEmbeddedLC.setLC(*m_rfLC); @@ -1074,13 +1072,12 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) dmrData.getSrcId(), dmrData.getFLCO() == FLCO_GROUP ? "TG" : "", dmrData.getDstId(), srcId, flco == FLCO_GROUP ? "TG" : "", dstId); - lc->setOVCM(m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON); - m_netLC = lc; + if (m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON) + lc->setOVCM(true); + else if (m_ovcm == DMR_OVCM_FORCE_OFF) + lc->setOVCM(false); - if (m_ovcm == DMR_OVCM_FORCE_OFF) { - lc->clearOVCM(); - m_netLC = lc; - } + m_netLC = lc; // The standby LC data m_netEmbeddedLC.setLC(*m_netLC); @@ -1154,13 +1151,12 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) unsigned int dstId = lc->getDstId(); unsigned int srcId = lc->getSrcId(); - lc->setOVCM(m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON); - m_netLC = lc; + if (m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON) + lc->setOVCM(true); + else if (m_ovcm == DMR_OVCM_FORCE_OFF) + lc->setOVCM(false); - if (m_ovcm == DMR_OVCM_FORCE_OFF) { - lc->clearOVCM(); - m_netLC = lc; - } + m_netLC = lc; m_lastFrameValid = false; @@ -1346,13 +1342,12 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) unsigned int dstId = lc->getDstId(); unsigned int srcId = lc->getSrcId(); - lc->setOVCM(m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON); - m_netLC = lc; + if (m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON) + lc->setOVCM(true); + else if (m_ovcm == DMR_OVCM_FORCE_OFF) + lc->setOVCM(false); - if (m_ovcm == DMR_OVCM_FORCE_OFF) { - lc->clearOVCM(); - m_netLC = lc; - } + m_netLC = lc; // The standby LC data m_netEmbeddedLC.setLC(*m_netLC); @@ -1623,10 +1618,10 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) return; // set the OVCM bit for the supported csbk - csbk.setOVCM(m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON); - - if (m_ovcm == DMR_OVCM_FORCE_OFF) - csbk.clearOVCM(); + if (m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON) + csbk.setOVCM(true); + else if (m_ovcm == DMR_OVCM_FORCE_OFF) + csbk.setOVCM(false); bool gi = csbk.getGI(); unsigned int srcId = csbk.getSrcId(); diff --git a/Version.h b/Version.h index 9ff3456..f5c6244 100644 --- a/Version.h +++ b/Version.h @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20210921"; +const char* VERSION = "20220523"; #endif