Rewrite the OVCM handling.
This commit is contained in:
parent
33939d8cf5
commit
fe195c4e40
29
DMRCSBK.cpp
29
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
|
* Copyright (C) 2019 by Patrick Maier DK5MP
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -34,7 +34,8 @@ m_bsId(0U),
|
||||||
m_srcId(0U),
|
m_srcId(0U),
|
||||||
m_dstId(0U),
|
m_dstId(0U),
|
||||||
m_dataContent(false),
|
m_dataContent(false),
|
||||||
m_CBF(0U)
|
m_CBF(0U),
|
||||||
|
m_OVCM(false)
|
||||||
{
|
{
|
||||||
m_data = new unsigned char[12U];
|
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_srcId = m_data[7U] << 16 | m_data[8U] << 8 | m_data[9U];
|
||||||
m_dataContent = false;
|
m_dataContent = false;
|
||||||
m_CBF = 0U;
|
m_CBF = 0U;
|
||||||
|
m_OVCM = (m_data[2U] & 0x04U) == 0x04U;
|
||||||
CUtils::dump(1U, "Unit to Unit Service Request CSBK", m_data, 12U);
|
CUtils::dump(1U, "Unit to Unit Service Request CSBK", m_data, 12U);
|
||||||
break;
|
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_srcId = m_data[7U] << 16 | m_data[8U] << 8 | m_data[9U];
|
||||||
m_dataContent = false;
|
m_dataContent = false;
|
||||||
m_CBF = 0U;
|
m_CBF = 0U;
|
||||||
|
m_OVCM = (m_data[2U] & 0x04U) == 0x04U;
|
||||||
CUtils::dump(1U, "Unit to Unit Service Answer Response CSBK", m_data, 12U);
|
CUtils::dump(1U, "Unit to Unit Service Answer Response CSBK", m_data, 12U);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -185,31 +188,21 @@ unsigned char CDMRCSBK::getFID() const
|
||||||
|
|
||||||
bool CDMRCSBK::getOVCM() const
|
bool CDMRCSBK::getOVCM() const
|
||||||
{
|
{
|
||||||
bool bOVCM = false;
|
return m_OVCM;
|
||||||
// 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDMRCSBK::setOVCM(bool 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)
|
if (ovcm)
|
||||||
m_data[2U] |= 0x04U;
|
m_data[2U] |= 0x04U;
|
||||||
|
else
|
||||||
|
m_data[2U] &= 0xFBU;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDMRCSBK::clearOVCM()
|
|
||||||
{
|
|
||||||
if (getOVCM())
|
|
||||||
m_data[2U] ^= 0x04U;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CDMRCSBK::getGI() const
|
bool CDMRCSBK::getGI() const
|
||||||
{
|
{
|
||||||
return m_GI;
|
return m_GI;
|
||||||
|
|
|
@ -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
|
* 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
|
* 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
|
// Set/Get the OVCM bit in the supported CSBKs
|
||||||
bool getOVCM() const;
|
bool getOVCM() const;
|
||||||
void setOVCM(bool ovcm);
|
void setOVCM(bool ovcm);
|
||||||
void clearOVCM();
|
|
||||||
|
|
||||||
// For BS Dwn Act
|
// For BS Dwn Act
|
||||||
unsigned int getBSId() const;
|
unsigned int getBSId() const;
|
||||||
|
@ -77,6 +76,7 @@ private:
|
||||||
unsigned int m_dstId;
|
unsigned int m_dstId;
|
||||||
bool m_dataContent;
|
bool m_dataContent;
|
||||||
unsigned char m_CBF;
|
unsigned char m_CBF;
|
||||||
|
bool m_OVCM;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
10
DMRLC.cpp
10
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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -193,12 +193,8 @@ void CDMRLC::setOVCM(bool ovcm)
|
||||||
{
|
{
|
||||||
if (ovcm)
|
if (ovcm)
|
||||||
m_options |= 0x04U;
|
m_options |= 0x04U;
|
||||||
}
|
else
|
||||||
|
m_options &= 0xFBU;
|
||||||
void CDMRLC::clearOVCM()
|
|
||||||
{
|
|
||||||
if (getOVCM())
|
|
||||||
m_options ^= 0x04U;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int CDMRLC::getSrcId() const
|
unsigned int CDMRLC::getSrcId() const
|
||||||
|
|
3
DMRLC.h
3
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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -41,7 +41,6 @@ public:
|
||||||
|
|
||||||
bool getOVCM() const;
|
bool getOVCM() const;
|
||||||
void setOVCM(bool ovcm);
|
void setOVCM(bool ovcm);
|
||||||
void clearOVCM();
|
|
||||||
|
|
||||||
unsigned char getFID() const;
|
unsigned char getFID() const;
|
||||||
void setFID(unsigned char fid);
|
void setFID(unsigned char fid);
|
||||||
|
|
71
DMRSlot.cpp
71
DMRSlot.cpp
|
@ -235,13 +235,12 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
lc->setOVCM(m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON);
|
if (m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON)
|
||||||
m_rfLC = lc;
|
lc->setOVCM(true);
|
||||||
|
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
|
||||||
|
lc->setOVCM(false);
|
||||||
|
|
||||||
if (m_ovcm == DMR_OVCM_FORCE_OFF) {
|
m_rfLC = lc;
|
||||||
lc->clearOVCM();
|
|
||||||
m_rfLC = lc;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The standby LC data
|
// The standby LC data
|
||||||
m_rfEmbeddedLC.setLC(*m_rfLC);
|
m_rfEmbeddedLC.setLC(*m_rfLC);
|
||||||
|
@ -446,10 +445,10 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// set the OVCM bit for the supported csbk
|
// 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_TX_ON || m_ovcm == DMR_OVCM_ON)
|
||||||
|
csbk.setOVCM(true);
|
||||||
if (m_ovcm == DMR_OVCM_FORCE_OFF)
|
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
|
||||||
csbk.clearOVCM();
|
csbk.setOVCM(false);
|
||||||
|
|
||||||
bool gi = csbk.getGI();
|
bool gi = csbk.getGI();
|
||||||
unsigned int srcId = csbk.getSrcId();
|
unsigned int srcId = csbk.getSrcId();
|
||||||
|
@ -813,13 +812,12 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
lc->setOVCM(m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON);
|
if (m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON)
|
||||||
m_rfLC = lc;
|
lc->setOVCM(true);
|
||||||
|
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
|
||||||
|
lc->setOVCM(false);
|
||||||
|
|
||||||
if (m_ovcm == DMR_OVCM_FORCE_OFF) {
|
m_rfLC = lc;
|
||||||
lc->clearOVCM();
|
|
||||||
m_rfLC = lc;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The standby LC data
|
// The standby LC data
|
||||||
m_rfEmbeddedLC.setLC(*m_rfLC);
|
m_rfEmbeddedLC.setLC(*m_rfLC);
|
||||||
|
@ -1074,13 +1072,12 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
||||||
dmrData.getSrcId(), dmrData.getFLCO() == FLCO_GROUP ? "TG" : "", dmrData.getDstId(),
|
dmrData.getSrcId(), dmrData.getFLCO() == FLCO_GROUP ? "TG" : "", dmrData.getDstId(),
|
||||||
srcId, flco == FLCO_GROUP ? "TG" : "", dstId);
|
srcId, flco == FLCO_GROUP ? "TG" : "", dstId);
|
||||||
|
|
||||||
lc->setOVCM(m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON);
|
if (m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON)
|
||||||
m_netLC = lc;
|
lc->setOVCM(true);
|
||||||
|
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
|
||||||
|
lc->setOVCM(false);
|
||||||
|
|
||||||
if (m_ovcm == DMR_OVCM_FORCE_OFF) {
|
m_netLC = lc;
|
||||||
lc->clearOVCM();
|
|
||||||
m_netLC = lc;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The standby LC data
|
// The standby LC data
|
||||||
m_netEmbeddedLC.setLC(*m_netLC);
|
m_netEmbeddedLC.setLC(*m_netLC);
|
||||||
|
@ -1154,13 +1151,12 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
||||||
unsigned int dstId = lc->getDstId();
|
unsigned int dstId = lc->getDstId();
|
||||||
unsigned int srcId = lc->getSrcId();
|
unsigned int srcId = lc->getSrcId();
|
||||||
|
|
||||||
lc->setOVCM(m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON);
|
if (m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON)
|
||||||
m_netLC = lc;
|
lc->setOVCM(true);
|
||||||
|
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
|
||||||
|
lc->setOVCM(false);
|
||||||
|
|
||||||
if (m_ovcm == DMR_OVCM_FORCE_OFF) {
|
m_netLC = lc;
|
||||||
lc->clearOVCM();
|
|
||||||
m_netLC = lc;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_lastFrameValid = false;
|
m_lastFrameValid = false;
|
||||||
|
|
||||||
|
@ -1346,13 +1342,12 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
||||||
unsigned int dstId = lc->getDstId();
|
unsigned int dstId = lc->getDstId();
|
||||||
unsigned int srcId = lc->getSrcId();
|
unsigned int srcId = lc->getSrcId();
|
||||||
|
|
||||||
lc->setOVCM(m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON);
|
if (m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON)
|
||||||
m_netLC = lc;
|
lc->setOVCM(true);
|
||||||
|
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
|
||||||
|
lc->setOVCM(false);
|
||||||
|
|
||||||
if (m_ovcm == DMR_OVCM_FORCE_OFF) {
|
m_netLC = lc;
|
||||||
lc->clearOVCM();
|
|
||||||
m_netLC = lc;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The standby LC data
|
// The standby LC data
|
||||||
m_netEmbeddedLC.setLC(*m_netLC);
|
m_netEmbeddedLC.setLC(*m_netLC);
|
||||||
|
@ -1623,10 +1618,10 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// set the OVCM bit for the supported csbk
|
// 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_RX_ON || m_ovcm == DMR_OVCM_ON)
|
||||||
|
csbk.setOVCM(true);
|
||||||
if (m_ovcm == DMR_OVCM_FORCE_OFF)
|
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
|
||||||
csbk.clearOVCM();
|
csbk.setOVCM(false);
|
||||||
|
|
||||||
bool gi = csbk.getGI();
|
bool gi = csbk.getGI();
|
||||||
unsigned int srcId = csbk.getSrcId();
|
unsigned int srcId = csbk.getSrcId();
|
||||||
|
|
Loading…
Reference in New Issue