From c6f5a21a27c920daf86ef11f90b5121b42cce4b3 Mon Sep 17 00:00:00 2001 From: Randy Hall Date: Sun, 7 Mar 2021 07:27:34 -0800 Subject: [PATCH 1/2] Proposed fix for #683 Adding 2 byte offset to the data pointer passed to CDMRTA::add() in the "RF" section of CDMRSlot.cpp::writeModem(). Fixes the bug that incorrectly decodes talker alias coming in over RF. --- DMRSlot.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/DMRSlot.cpp b/DMRSlot.cpp index c21f4ca..f374b48 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -656,7 +656,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) if (!(m_rfTalkerId & TALKER_ID_HEADER)) { if (m_rfTalkerId == TALKER_ID_NONE) m_rfTalkerAlias.reset(); - m_rfTalkerAlias.add(0, data, 7U); + m_rfTalkerAlias.add(0, data + 2U, 7U); m_display->writeDMRTA(m_slotNo, (unsigned char*)m_rfTalkerAlias.get(), "R"); if (m_dumpTAData) { @@ -675,7 +675,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) if (!(m_rfTalkerId & TALKER_ID_BLOCK1)) { if (m_rfTalkerId == TALKER_ID_NONE) m_rfTalkerAlias.reset(); - m_rfTalkerAlias.add(1, data, 7U); + m_rfTalkerAlias.add(1, data + 2U, 7U); m_display->writeDMRTA(m_slotNo, (unsigned char*)m_rfTalkerAlias.get(), "R"); if (m_dumpTAData) { @@ -694,7 +694,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) if (!(m_rfTalkerId & TALKER_ID_BLOCK2)) { if (m_rfTalkerId == TALKER_ID_NONE) m_rfTalkerAlias.reset(); - m_rfTalkerAlias.add(2, data, 7U); + m_rfTalkerAlias.add(2, data + 2U, 7U); m_display->writeDMRTA(m_slotNo, (unsigned char*)m_rfTalkerAlias.get(), "R"); if (m_dumpTAData) { @@ -713,7 +713,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) if (!(m_rfTalkerId & TALKER_ID_BLOCK3)) { if (m_rfTalkerId == TALKER_ID_NONE) m_rfTalkerAlias.reset(); - m_rfTalkerAlias.add(3, data, 7U); + m_rfTalkerAlias.add(3, data + 2U, 7U); m_display->writeDMRTA(m_slotNo, (unsigned char*)m_rfTalkerAlias.get(), "R"); if (m_dumpTAData) { From 5d8d1a3fb93e5b4499277de3533c7dfa995701db Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Sun, 7 Mar 2021 17:42:55 +0000 Subject: [PATCH 2/2] Add mode 4 (force off) for the DMR OVCM flag. --- Conf.cpp | 5 ++++- DMRCSBK.cpp | 8 +++++++- DMRCSBK.h | 3 ++- DMRLC.cpp | 8 +++++++- DMRLC.h | 3 ++- DMRSlot.cpp | 33 ++++++++++++++++++++++++++++++++- Defines.h | 5 +++-- MMDVM.ini | 2 +- MMDVMHost.cpp | 3 ++- Version.h | 2 +- 10 files changed, 61 insertions(+), 11 deletions(-) diff --git a/Conf.cpp b/Conf.cpp index bc2d6a5..f9c1300 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2020 by Jonathan Naylor G4KLX + * Copyright (C) 2015-2021 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 @@ -668,6 +668,9 @@ bool CConf::read() case 3: m_dmrOVCM = DMR_OVCM_ON; break; + case 4: + m_dmrOVCM = DMR_OVCM_FORCE_OFF; + break; default: m_dmrOVCM = DMR_OVCM_OFF; break; diff --git a/DMRCSBK.cpp b/DMRCSBK.cpp index 5d69043..9e42b46 100644 --- a/DMRCSBK.cpp +++ b/DMRCSBK.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2020 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2020,2021 by Jonathan Naylor G4KLX * Copyright (C) 2019 by Patrick Maier DK5MP * * This program is free software; you can redistribute it and/or modify @@ -189,6 +189,12 @@ void CDMRCSBK::setOVCM(bool ovcm) } } +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 7faf7b9..dac7a53 100644 --- a/DMRCSBK.h +++ b/DMRCSBK.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2020 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2020,2021 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 @@ -50,6 +50,7 @@ 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; diff --git a/DMRLC.cpp b/DMRLC.cpp index f7ac536..be669ac 100644 --- a/DMRLC.cpp +++ b/DMRLC.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2019 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2019,2021 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 @@ -195,6 +195,12 @@ void CDMRLC::setOVCM(bool ovcm) m_options |= 0x04U; } +void CDMRLC::clearOVCM() +{ + if (getOVCM()) + m_options ^= 0x04U; +} + unsigned int CDMRLC::getSrcId() const { return m_srcId; diff --git a/DMRLC.h b/DMRLC.h index 3a39450..a52d2f8 100644 --- a/DMRLC.h +++ b/DMRLC.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2019 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2019,2021 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,6 +41,7 @@ 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 f374b48..1f405ca 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2020 Jonathan Naylor, G4KLX + * Copyright (C) 2015-2021 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 @@ -236,6 +236,11 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) lc->setOVCM(m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON); m_rfLC = lc; + if (m_ovcm == DMR_OVCM_FORCE_OFF) { + lc->clearOVCM(); + m_rfLC = lc; + } + // The standby LC data m_rfEmbeddedLC.setLC(*m_rfLC); m_rfEmbeddedData[0U].setLC(*m_rfLC); @@ -439,6 +444,9 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) // 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(); + bool gi = csbk.getGI(); unsigned int srcId = csbk.getSrcId(); unsigned int dstId = csbk.getDstId(); @@ -797,6 +805,11 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) lc->setOVCM(m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON); m_rfLC = lc; + if (m_ovcm == DMR_OVCM_FORCE_OFF) { + lc->clearOVCM(); + m_rfLC = lc; + } + // The standby LC data m_rfEmbeddedLC.setLC(*m_rfLC); m_rfEmbeddedData[0U].setLC(*m_rfLC); @@ -1053,6 +1066,11 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) lc->setOVCM(m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON); m_netLC = lc; + if (m_ovcm == DMR_OVCM_FORCE_OFF) { + lc->clearOVCM(); + m_netLC = lc; + } + // The standby LC data m_netEmbeddedLC.setLC(*m_netLC); m_netEmbeddedData[0U].setLC(*m_netLC); @@ -1128,6 +1146,11 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) lc->setOVCM(m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON); m_netLC = lc; + if (m_ovcm == DMR_OVCM_FORCE_OFF) { + lc->clearOVCM(); + m_netLC = lc; + } + m_lastFrameValid = false; m_netTimeoutTimer.start(); @@ -1315,6 +1338,11 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) lc->setOVCM(m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON); m_netLC = lc; + if (m_ovcm == DMR_OVCM_FORCE_OFF) { + lc->clearOVCM(); + m_netLC = lc; + } + // The standby LC data m_netEmbeddedLC.setLC(*m_netLC); m_netEmbeddedData[0U].setLC(*m_netLC); @@ -1586,6 +1614,9 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) // 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(); + bool gi = csbk.getGI(); unsigned int srcId = csbk.getSrcId(); unsigned int dstId = csbk.getDstId(); diff --git a/Defines.h b/Defines.h index ebd75eb..f254758 100644 --- a/Defines.h +++ b/Defines.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2017,2018 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2017,2018,2021 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 @@ -81,7 +81,8 @@ enum DMR_OVCM_TYPES { DMR_OVCM_OFF, DMR_OVCM_RX_ON, DMR_OVCM_TX_ON, - DMR_OVCM_ON + DMR_OVCM_ON, + DMR_OVCM_FORCE_OFF }; #endif diff --git a/MMDVM.ini b/MMDVM.ini index 2b3dcd1..f8e5473 100644 --- a/MMDVM.ini +++ b/MMDVM.ini @@ -112,7 +112,7 @@ DumpTAData=1 CallHang=3 TXHang=4 # ModeHang=10 -# OVCM Values, 0=off, 1=rx_on, 2=tx_on, 3=both_on +# OVCM Values, 0=off, 1=rx_on, 2=tx_on, 3=both_on, 4=force off # OVCM=0 [System Fusion] diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 4c52c6a..2d76284 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -507,7 +507,8 @@ int CMMDVMHost::run() LogInfo(" OVCM: on(tx only)"); else if (ovcm == DMR_OVCM_ON) LogInfo(" OVCM: on"); - + else if (ovcm == DMR_OVCM_FORCE_OFF) + LogInfo(" OVCM: off (forced)"); switch (dmrBeacons) { case DMR_BEACONS_NETWORK: { diff --git a/Version.h b/Version.h index 6c41a8d..a8d7c01 100644 --- a/Version.h +++ b/Version.h @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20210101"; +const char* VERSION = "20210307"; #endif