Skip to content

Commit fe195c4

Browse files
committed
Rewrite the OVCM handling.
1 parent 33939d8 commit fe195c4

File tree

6 files changed

+51
-68
lines changed

6 files changed

+51
-68
lines changed

DMRCSBK.cpp

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2015,2016,2020,2021 by Jonathan Naylor G4KLX
2+
* Copyright (C) 2015,2016,2020,2021,2022 by Jonathan Naylor G4KLX
33
* Copyright (C) 2019 by Patrick Maier DK5MP
44
*
55
* This program is free software; you can redistribute it and/or modify
@@ -34,7 +34,8 @@ m_bsId(0U),
3434
m_srcId(0U),
3535
m_dstId(0U),
3636
m_dataContent(false),
37-
m_CBF(0U)
37+
m_CBF(0U),
38+
m_OVCM(false)
3839
{
3940
m_data = new unsigned char[12U];
4041
}
@@ -81,6 +82,7 @@ bool CDMRCSBK::put(const unsigned char* bytes)
8182
m_srcId = m_data[7U] << 16 | m_data[8U] << 8 | m_data[9U];
8283
m_dataContent = false;
8384
m_CBF = 0U;
85+
m_OVCM = (m_data[2U] & 0x04U) == 0x04U;
8486
CUtils::dump(1U, "Unit to Unit Service Request CSBK", m_data, 12U);
8587
break;
8688

@@ -90,6 +92,7 @@ bool CDMRCSBK::put(const unsigned char* bytes)
9092
m_srcId = m_data[7U] << 16 | m_data[8U] << 8 | m_data[9U];
9193
m_dataContent = false;
9294
m_CBF = 0U;
95+
m_OVCM = (m_data[2U] & 0x04U) == 0x04U;
9396
CUtils::dump(1U, "Unit to Unit Service Answer Response CSBK", m_data, 12U);
9497
break;
9598

@@ -185,31 +188,21 @@ unsigned char CDMRCSBK::getFID() const
185188

186189
bool CDMRCSBK::getOVCM() const
187190
{
188-
bool bOVCM = false;
189-
// Service options informations are only available in
190-
// "Unit to Unit Voice Service Request CSBK" and
191-
// "Unit to Unit Voice Service Answer Response CSBK"
192-
if ((m_CSBKO == CSBKO_UUVREQ) || (m_CSBKO == CSBKO_UUANSRSP))
193-
bOVCM = (m_data[2U] & 0x04U) == 0x04U;
194-
195-
return bOVCM;
191+
return m_OVCM;
196192
}
197193

198194
void CDMRCSBK::setOVCM(bool ovcm)
199195
{
200-
// Set OVCM only in CSBKs having the service options information
201-
if ((m_CSBKO == CSBKO_UUVREQ) || (m_CSBKO == CSBKO_UUANSRSP)) {
196+
if (m_CSBKO == CSBKO_UUVREQ || m_CSBKO == CSBKO_UUANSRSP) {
197+
m_OVCM = ovcm;
198+
202199
if (ovcm)
203200
m_data[2U] |= 0x04U;
201+
else
202+
m_data[2U] &= 0xFBU;
204203
}
205204
}
206205

207-
void CDMRCSBK::clearOVCM()
208-
{
209-
if (getOVCM())
210-
m_data[2U] ^= 0x04U;
211-
}
212-
213206
bool CDMRCSBK::getGI() const
214207
{
215208
return m_GI;

DMRCSBK.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2015,2016,2020,2021 by Jonathan Naylor G4KLX
2+
* Copyright (C) 2015,2016,2020,2021,2022 by Jonathan Naylor G4KLX
33
*
44
* This program is free software; you can redistribute it and/or modify
55
* it under the terms of the GNU General Public License as published by
@@ -51,7 +51,6 @@ class CDMRCSBK
5151
// Set/Get the OVCM bit in the supported CSBKs
5252
bool getOVCM() const;
5353
void setOVCM(bool ovcm);
54-
void clearOVCM();
5554

5655
// For BS Dwn Act
5756
unsigned int getBSId() const;
@@ -77,6 +76,7 @@ class CDMRCSBK
7776
unsigned int m_dstId;
7877
bool m_dataContent;
7978
unsigned char m_CBF;
79+
bool m_OVCM;
8080
};
8181

8282
#endif

DMRLC.cpp

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2015,2016,2019,2021 by Jonathan Naylor G4KLX
2+
* Copyright (C) 2015,2016,2019,2021,2022 by Jonathan Naylor G4KLX
33
*
44
* This program is free software; you can redistribute it and/or modify
55
* it under the terms of the GNU General Public License as published by
@@ -193,12 +193,8 @@ void CDMRLC::setOVCM(bool ovcm)
193193
{
194194
if (ovcm)
195195
m_options |= 0x04U;
196-
}
197-
198-
void CDMRLC::clearOVCM()
199-
{
200-
if (getOVCM())
201-
m_options ^= 0x04U;
196+
else
197+
m_options &= 0xFBU;
202198
}
203199

204200
unsigned int CDMRLC::getSrcId() const

DMRLC.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2015,2016,2019,2021 by Jonathan Naylor G4KLX
2+
* Copyright (C) 2015,2016,2019,2021,2022 by Jonathan Naylor G4KLX
33
*
44
* This program is free software; you can redistribute it and/or modify
55
* it under the terms of the GNU General Public License as published by
@@ -41,7 +41,6 @@ class CDMRLC
4141

4242
bool getOVCM() const;
4343
void setOVCM(bool ovcm);
44-
void clearOVCM();
4544

4645
unsigned char getFID() const;
4746
void setFID(unsigned char fid);

DMRSlot.cpp

Lines changed: 33 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -235,13 +235,12 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
235235
return false;
236236
}
237237

238-
lc->setOVCM(m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON);
239-
m_rfLC = lc;
238+
if (m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON)
239+
lc->setOVCM(true);
240+
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
241+
lc->setOVCM(false);
240242

241-
if (m_ovcm == DMR_OVCM_FORCE_OFF) {
242-
lc->clearOVCM();
243-
m_rfLC = lc;
244-
}
243+
m_rfLC = lc;
245244

246245
// The standby LC data
247246
m_rfEmbeddedLC.setLC(*m_rfLC);
@@ -446,10 +445,10 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
446445
return false;
447446

448447
// set the OVCM bit for the supported csbk
449-
csbk.setOVCM(m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON);
450-
451-
if (m_ovcm == DMR_OVCM_FORCE_OFF)
452-
csbk.clearOVCM();
448+
if (m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON)
449+
csbk.setOVCM(true);
450+
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
451+
csbk.setOVCM(false);
453452

454453
bool gi = csbk.getGI();
455454
unsigned int srcId = csbk.getSrcId();
@@ -813,13 +812,12 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
813812
return false;
814813
}
815814

816-
lc->setOVCM(m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON);
817-
m_rfLC = lc;
815+
if (m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON)
816+
lc->setOVCM(true);
817+
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
818+
lc->setOVCM(false);
818819

819-
if (m_ovcm == DMR_OVCM_FORCE_OFF) {
820-
lc->clearOVCM();
821-
m_rfLC = lc;
822-
}
820+
m_rfLC = lc;
823821

824822
// The standby LC data
825823
m_rfEmbeddedLC.setLC(*m_rfLC);
@@ -1074,13 +1072,12 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
10741072
dmrData.getSrcId(), dmrData.getFLCO() == FLCO_GROUP ? "TG" : "", dmrData.getDstId(),
10751073
srcId, flco == FLCO_GROUP ? "TG" : "", dstId);
10761074

1077-
lc->setOVCM(m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON);
1078-
m_netLC = lc;
1075+
if (m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON)
1076+
lc->setOVCM(true);
1077+
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
1078+
lc->setOVCM(false);
10791079

1080-
if (m_ovcm == DMR_OVCM_FORCE_OFF) {
1081-
lc->clearOVCM();
1082-
m_netLC = lc;
1083-
}
1080+
m_netLC = lc;
10841081

10851082
// The standby LC data
10861083
m_netEmbeddedLC.setLC(*m_netLC);
@@ -1154,13 +1151,12 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
11541151
unsigned int dstId = lc->getDstId();
11551152
unsigned int srcId = lc->getSrcId();
11561153

1157-
lc->setOVCM(m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON);
1158-
m_netLC = lc;
1154+
if (m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON)
1155+
lc->setOVCM(true);
1156+
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
1157+
lc->setOVCM(false);
11591158

1160-
if (m_ovcm == DMR_OVCM_FORCE_OFF) {
1161-
lc->clearOVCM();
1162-
m_netLC = lc;
1163-
}
1159+
m_netLC = lc;
11641160

11651161
m_lastFrameValid = false;
11661162

@@ -1346,13 +1342,12 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
13461342
unsigned int dstId = lc->getDstId();
13471343
unsigned int srcId = lc->getSrcId();
13481344

1349-
lc->setOVCM(m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON);
1350-
m_netLC = lc;
1345+
if (m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON)
1346+
lc->setOVCM(true);
1347+
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
1348+
lc->setOVCM(false);
13511349

1352-
if (m_ovcm == DMR_OVCM_FORCE_OFF) {
1353-
lc->clearOVCM();
1354-
m_netLC = lc;
1355-
}
1350+
m_netLC = lc;
13561351

13571352
// The standby LC data
13581353
m_netEmbeddedLC.setLC(*m_netLC);
@@ -1623,10 +1618,10 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
16231618
return;
16241619

16251620
// set the OVCM bit for the supported csbk
1626-
csbk.setOVCM(m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON);
1627-
1628-
if (m_ovcm == DMR_OVCM_FORCE_OFF)
1629-
csbk.clearOVCM();
1621+
if (m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON)
1622+
csbk.setOVCM(true);
1623+
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
1624+
csbk.setOVCM(false);
16301625

16311626
bool gi = csbk.getGI();
16321627
unsigned int srcId = csbk.getSrcId();

Version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@
1919
#if !defined(VERSION_H)
2020
#define VERSION_H
2121

22-
const char* VERSION = "20210921";
22+
const char* VERSION = "20220523";
2323

2424
#endif

0 commit comments

Comments
 (0)