Handle TA and Embedded GPS data correctly.

This commit is contained in:
Jonathan Naylor
2017-08-02 19:30:39 +01:00
parent b949533318
commit 8a3f2ca64d
16 changed files with 281 additions and 509 deletions

View File

@@ -171,22 +171,22 @@ m_dmr2Passalls()
CDMRGateway::~CDMRGateway()
{
for (std::vector<IRewrite*>::iterator it = m_dmr1NetRewrites.begin(); it != m_dmr1NetRewrites.end(); ++it)
for (std::vector<CRewrite*>::iterator it = m_dmr1NetRewrites.begin(); it != m_dmr1NetRewrites.end(); ++it)
delete *it;
for (std::vector<IRewrite*>::iterator it = m_dmr1RFRewrites.begin(); it != m_dmr1RFRewrites.end(); ++it)
for (std::vector<CRewrite*>::iterator it = m_dmr1RFRewrites.begin(); it != m_dmr1RFRewrites.end(); ++it)
delete *it;
for (std::vector<IRewrite*>::iterator it = m_dmr2NetRewrites.begin(); it != m_dmr2NetRewrites.end(); ++it)
for (std::vector<CRewrite*>::iterator it = m_dmr2NetRewrites.begin(); it != m_dmr2NetRewrites.end(); ++it)
delete *it;
for (std::vector<IRewrite*>::iterator it = m_dmr2RFRewrites.begin(); it != m_dmr2RFRewrites.end(); ++it)
for (std::vector<CRewrite*>::iterator it = m_dmr2RFRewrites.begin(); it != m_dmr2RFRewrites.end(); ++it)
delete *it;
for (std::vector<IRewrite*>::iterator it = m_dmr1Passalls.begin(); it != m_dmr1Passalls.end(); ++it)
for (std::vector<CRewrite*>::iterator it = m_dmr1Passalls.begin(); it != m_dmr1Passalls.end(); ++it)
delete *it;
for (std::vector<IRewrite*>::iterator it = m_dmr2Passalls.begin(); it != m_dmr2Passalls.end(); ++it)
for (std::vector<CRewrite*>::iterator it = m_dmr2Passalls.begin(); it != m_dmr2Passalls.end(); ++it)
delete *it;
delete m_rpt1Rewrite;
@@ -610,7 +610,7 @@ int CDMRGateway::run()
if (m_dmrNetwork1 != NULL) {
// Rewrite the slot and/or TG or neither
for (std::vector<IRewrite*>::iterator it = m_dmr1RFRewrites.begin(); it != m_dmr1RFRewrites.end(); ++it) {
for (std::vector<CRewrite*>::iterator it = m_dmr1RFRewrites.begin(); it != m_dmr1RFRewrites.end(); ++it) {
bool ret = (*it)->process(data, trace);
if (ret) {
rewritten = true;
@@ -630,7 +630,7 @@ int CDMRGateway::run()
if (!rewritten) {
if (m_dmrNetwork2 != NULL) {
// Rewrite the slot and/or TG or neither
for (std::vector<IRewrite*>::iterator it = m_dmr2RFRewrites.begin(); it != m_dmr2RFRewrites.end(); ++it) {
for (std::vector<CRewrite*>::iterator it = m_dmr2RFRewrites.begin(); it != m_dmr2RFRewrites.end(); ++it) {
bool ret = (*it)->process(data, trace);
if (ret) {
rewritten = true;
@@ -650,7 +650,7 @@ int CDMRGateway::run()
if (!rewritten) {
if (m_dmrNetwork1 != NULL) {
for (std::vector<IRewrite*>::iterator it = m_dmr1Passalls.begin(); it != m_dmr1Passalls.end(); ++it) {
for (std::vector<CRewrite*>::iterator it = m_dmr1Passalls.begin(); it != m_dmr1Passalls.end(); ++it) {
bool ret = (*it)->process(data, trace);
if (ret) {
rewritten = true;
@@ -670,7 +670,7 @@ int CDMRGateway::run()
if (!rewritten) {
if (m_dmrNetwork2 != NULL) {
for (std::vector<IRewrite*>::iterator it = m_dmr2Passalls.begin(); it != m_dmr2Passalls.end(); ++it) {
for (std::vector<CRewrite*>::iterator it = m_dmr2Passalls.begin(); it != m_dmr2Passalls.end(); ++it) {
bool ret = (*it)->process(data, trace);
if (ret) {
rewritten = true;
@@ -752,7 +752,7 @@ int CDMRGateway::run()
// Rewrite the slot and/or TG or neither
bool rewritten = false;
for (std::vector<IRewrite*>::iterator it = m_dmr1NetRewrites.begin(); it != m_dmr1NetRewrites.end(); ++it) {
for (std::vector<CRewrite*>::iterator it = m_dmr1NetRewrites.begin(); it != m_dmr1NetRewrites.end(); ++it) {
bool ret = (*it)->process(data, trace);
if (ret) {
rewritten = true;
@@ -797,7 +797,7 @@ int CDMRGateway::run()
// Rewrite the slot and/or TG or neither
bool rewritten = false;
for (std::vector<IRewrite*>::iterator it = m_dmr2NetRewrites.begin(); it != m_dmr2NetRewrites.end(); ++it) {
for (std::vector<CRewrite*>::iterator it = m_dmr2NetRewrites.begin(); it != m_dmr2NetRewrites.end(); ++it) {
bool ret = (*it)->process(data, trace);
if (ret) {
rewritten = true;

View File

@@ -68,12 +68,12 @@ private:
bool m_xlx2Connected;
CRewriteTG* m_rpt2Rewrite;
CRewriteTG* m_xlx2Rewrite;
std::vector<IRewrite*> m_dmr1NetRewrites;
std::vector<IRewrite*> m_dmr1RFRewrites;
std::vector<IRewrite*> m_dmr2NetRewrites;
std::vector<IRewrite*> m_dmr2RFRewrites;
std::vector<IRewrite*> m_dmr1Passalls;
std::vector<IRewrite*> m_dmr2Passalls;
std::vector<CRewrite*> m_dmr1NetRewrites;
std::vector<CRewrite*> m_dmr1RFRewrites;
std::vector<CRewrite*> m_dmr2NetRewrites;
std::vector<CRewrite*> m_dmr2RFRewrites;
std::vector<CRewrite*> m_dmr1Passalls;
std::vector<CRewrite*> m_dmr2Passalls;
bool createMMDVM();
bool createDMRNetwork1();

View File

@@ -25,6 +25,7 @@
#include <cassert>
CPassAllPC::CPassAllPC(const std::string& name, unsigned int slot) :
CRewrite(),
m_name(name),
m_slot(slot)
{

View File

@@ -24,7 +24,7 @@
#include <string>
class CPassAllPC : public IRewrite {
class CPassAllPC : public CRewrite {
public:
CPassAllPC(const std::string& name, unsigned int slot);
virtual ~CPassAllPC();

View File

@@ -25,6 +25,7 @@
#include <cassert>
CPassAllTG::CPassAllTG(const std::string& name, unsigned int slot) :
CRewrite(),
m_name(name),
m_slot(slot)
{

View File

@@ -24,7 +24,7 @@
#include <string>
class CPassAllTG : public IRewrite {
class CPassAllTG : public CRewrite {
public:
CPassAllTG(const std::string& name, unsigned int slot);
virtual ~CPassAllTG();

View File

@@ -16,8 +16,197 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "DMRDataHeader.h"
#include "DMRFullLC.h"
#include "DMRCSBK.h"
#include "Rewrite.h"
IRewrite::~IRewrite()
#include <cstdio>
CRewrite::CRewrite() :
m_lc(),
m_embeddedLC(),
m_data(NULL),
m_writeNum(0U),
m_readNum(0U)
{
m_data = new CDMREmbeddedData[2U];
}
CRewrite::~CRewrite()
{
delete[] m_data;
}
void CRewrite::processMessage(CDMRData& data)
{
unsigned char dataType = data.getDataType();
switch (dataType) {
case DT_VOICE_LC_HEADER:
case DT_TERMINATOR_WITH_LC:
processHeader(data, dataType);
break;
case DT_VOICE:
processVoice(data);
break;
case DT_CSBK:
processCSBK(data);
break;
case DT_DATA_HEADER:
processDataHeader(data);
break;
case DT_RATE_12_DATA:
case DT_RATE_34_DATA:
case DT_RATE_1_DATA:
// Nothing to do
break;
case DT_VOICE_SYNC:
swap();
break;
default:
// Not sure what to do
break;
}
}
void CRewrite::setLC(FLCO flco, unsigned int srcId, unsigned int dstId)
{
if (flco == m_lc.getFLCO() && srcId == m_lc.getSrcId() && dstId == m_lc.getDstId())
return;
m_lc.setFLCO(flco);
m_lc.setSrcId(srcId);
m_lc.setDstId(dstId);
m_embeddedLC.setLC(m_lc);
m_readNum = 0U;
m_writeNum = 0U;
}
unsigned char CRewrite::processEmbeddedData(unsigned char* data, unsigned char n)
{
unsigned char lcss = 0U;
switch (n) {
case 1U:
lcss = 1U;
break;
case 4U:
lcss = 2U;
break;
case 2U:
case 3U:
lcss = 3U;
break;
default:
break;
}
m_data[m_writeNum].addData(data, lcss);
if (m_readNum == 0U && m_writeNum == 0U)
return m_embeddedLC.getData(data, n);
CDMRLC* lc = m_data[m_readNum].getLC();
if (lc == NULL)
return m_embeddedLC.getData(data, n);
FLCO flco = lc->getFLCO();
delete lc;
// Replace any identity embedded data with the new one
if (flco == FLCO_GROUP || flco == FLCO_USER_USER)
return m_embeddedLC.getData(data, n);
else
return m_data[m_readNum].getData(data, n);
}
void CRewrite::swap()
{
if (m_readNum == 0U && m_writeNum == 0U) {
m_writeNum = 1U;
return;
}
if (m_readNum == 0U)
m_readNum = 1U;
else
m_readNum = 0U;
if (m_writeNum == 0U)
m_writeNum = 1U;
else
m_writeNum = 0U;
}
void CRewrite::processHeader(CDMRData& data, unsigned char dataType)
{
setLC(data.getFLCO(), data.getSrcId(), data.getDstId());
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
data.getData(buffer);
CDMRFullLC fullLC;
fullLC.encode(m_lc, buffer, dataType);
data.setData(buffer);
}
void CRewrite::processVoice(CDMRData& data)
{
setLC(data.getFLCO(), data.getSrcId(), data.getDstId());
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
data.getData(buffer);
processEmbeddedData(buffer, data.getN());
data.setData(buffer);
}
void CRewrite::processDataHeader(CDMRData& data)
{
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
data.getData(buffer);
CDMRDataHeader dataHeader;
bool ret = dataHeader.put(buffer);
if (!ret)
return;
dataHeader.setGI(data.getFLCO() == FLCO_GROUP);
dataHeader.setSrcId(data.getSrcId());
dataHeader.setDstId(data.getDstId());
dataHeader.get(buffer);
data.setData(buffer);
}
void CRewrite::processCSBK(CDMRData& data)
{
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
data.getData(buffer);
CDMRCSBK csbk;
bool ret = csbk.put(buffer);
if (!ret)
return;
csbk.setGI(data.getFLCO() == FLCO_GROUP);
csbk.setSrcId(data.getSrcId());
csbk.setDstId(data.getDstId());
csbk.get(buffer);
data.setData(buffer);
}

View File

@@ -19,16 +19,36 @@
#if !defined(REWRITE_H)
#define REWRITE_H
#include "DMREmbeddedData.h"
#include "DMRData.h"
#include "DMRLC.h"
class IRewrite {
class CRewrite {
public:
virtual ~IRewrite() = 0;
CRewrite();
virtual ~CRewrite();
virtual bool process(CDMRData& data, bool trace) = 0;
protected:
void processMessage(CDMRData& data);
private:
CDMRLC m_lc;
CDMREmbeddedData m_embeddedLC;
CDMREmbeddedData* m_data;
unsigned int m_writeNum;
unsigned int m_readNum;
void processHeader(CDMRData& data, unsigned char dataType);
void processVoice(CDMRData& data);
void processDataHeader(CDMRData& data);
void processCSBK(CDMRData& data);
void swap();
void setLC(FLCO flco, unsigned int srcId, unsigned int dstId);
unsigned char processEmbeddedData(unsigned char* data, unsigned char n);
};
#endif

View File

@@ -19,24 +19,20 @@
#include "RewritePC.h"
#include "DMRDefines.h"
#include "DMRFullLC.h"
#include "Log.h"
#include <cstdio>
#include <cassert>
CRewritePC::CRewritePC(const std::string& name, unsigned int fromSlot, unsigned int fromId, unsigned int toSlot, unsigned int toId, unsigned int range) :
CRewrite(),
m_name(name),
m_fromSlot(fromSlot),
m_fromIdStart(fromId),
m_fromIdEnd(fromId + range - 1U),
m_toSlot(toSlot),
m_toIdStart(toId),
m_toIdEnd(toId + range - 1U),
m_lc(FLCO_USER_USER, 0U, 0U),
m_embeddedLC(),
m_dataHeader(),
m_csbk()
m_toIdEnd(toId + range - 1U)
{
assert(fromSlot == 1U || fromSlot == 2U);
assert(toSlot == 1U || toSlot == 2U);
@@ -55,6 +51,7 @@ bool CRewritePC::process(CDMRData& data, bool trace)
if (flco != FLCO_USER_USER || slotNo != m_fromSlot || dstId < m_fromIdStart || dstId > m_fromIdEnd) {
if (trace)
LogDebug("Rule Trace,\tRewritePC from %s Slot=%u Dst=%u-%u: not matched", m_name.c_str(), m_fromSlot, m_fromIdStart, m_fromIdEnd);
return false;
}
@@ -63,35 +60,9 @@ bool CRewritePC::process(CDMRData& data, bool trace)
if (m_fromIdStart != m_toIdStart) {
unsigned int newDstId = dstId + m_toIdStart - m_fromIdStart;
data.setDstId(newDstId);
unsigned char dataType = data.getDataType();
switch (dataType) {
case DT_VOICE_LC_HEADER:
case DT_TERMINATOR_WITH_LC:
processHeader(data, newDstId, dataType);
break;
case DT_VOICE:
processVoice(data, newDstId);
break;
case DT_CSBK:
processCSBK(data, newDstId);
break;
case DT_DATA_HEADER:
processDataHeader(data, newDstId);
break;
case DT_RATE_12_DATA:
case DT_RATE_34_DATA:
case DT_RATE_1_DATA:
case DT_VOICE_SYNC:
// Nothing to do
break;
default:
// Not sure what to do
break;
}
processMessage(data);
}
if (trace) {
@@ -101,71 +72,3 @@ bool CRewritePC::process(CDMRData& data, bool trace)
return true;
}
void CRewritePC::processHeader(CDMRData& data, unsigned int dstId, unsigned char dataType)
{
unsigned int srcId = data.getSrcId();
if (srcId != m_lc.getSrcId() || dstId != m_lc.getDstId()) {
m_lc.setSrcId(srcId);
m_lc.setDstId(dstId);
m_embeddedLC.setLC(m_lc);
}
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
data.getData(buffer);
CDMRFullLC fullLC;
fullLC.encode(m_lc, buffer, dataType);
data.setData(buffer);
}
void CRewritePC::processVoice(CDMRData& data, unsigned int dstId)
{
unsigned int srcId = data.getSrcId();
if (srcId != m_lc.getSrcId() || dstId != m_lc.getDstId()) {
m_lc.setSrcId(srcId);
m_lc.setDstId(dstId);
m_embeddedLC.setLC(m_lc);
}
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
data.getData(buffer);
unsigned char n = data.getN();
m_embeddedLC.getData(buffer, n);
data.setData(buffer);
}
void CRewritePC::processDataHeader(CDMRData& data, unsigned int dstId)
{
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
data.getData(buffer);
bool ret = m_dataHeader.put(buffer);
if (!ret)
return;
m_dataHeader.setDstId(dstId);
m_dataHeader.get(buffer);
data.setData(buffer);
}
void CRewritePC::processCSBK(CDMRData& data, unsigned int dstId)
{
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
data.getData(buffer);
bool ret = m_csbk.put(buffer);
if (!ret)
return;
m_csbk.setDstId(dstId);
m_csbk.get(buffer);
data.setData(buffer);
}

View File

@@ -19,16 +19,12 @@
#if !defined(REWRITEPC_H)
#define REWRITEPC_H
#include "DMREmbeddedData.h"
#include "DMRDataHeader.h"
#include "DMRCSBK.h"
#include "Rewrite.h"
#include "DMRData.h"
#include "DMRLC.h"
#include <string>
class CRewritePC : public IRewrite {
class CRewritePC : public CRewrite {
public:
CRewritePC(const std::string& name, unsigned int fromSlot, unsigned int fromId, unsigned int toSlot, unsigned int toId, unsigned int range);
virtual ~CRewritePC();
@@ -36,22 +32,13 @@ public:
virtual bool process(CDMRData& data, bool trace);
private:
std::string m_name;
unsigned int m_fromSlot;
unsigned int m_fromIdStart;
unsigned int m_fromIdEnd;
unsigned int m_toSlot;
unsigned int m_toIdStart;
unsigned int m_toIdEnd;
CDMRLC m_lc;
CDMREmbeddedData m_embeddedLC;
CDMRDataHeader m_dataHeader;
CDMRCSBK m_csbk;
void processHeader(CDMRData& data, unsigned int dstId, unsigned char dataType);
void processVoice(CDMRData& data, unsigned int dstId);
void processDataHeader(CDMRData& data, unsigned int dstId);
void processCSBK(CDMRData& data, unsigned int dstId);
std::string m_name;
unsigned int m_fromSlot;
unsigned int m_fromIdStart;
unsigned int m_fromIdEnd;
unsigned int m_toSlot;
unsigned int m_toIdStart;
unsigned int m_toIdEnd;
};

View File

@@ -19,28 +19,22 @@
#include "RewriteSrc.h"
#include "DMRDefines.h"
#include "DMRFullLC.h"
#include "Log.h"
#include <cstdio>
#include <cassert>
CRewriteSrc::CRewriteSrc(const std::string& name, unsigned int fromSlot, unsigned int fromId, unsigned int toSlot, unsigned int toTG, unsigned int range) :
CRewrite(),
m_name(name),
m_fromSlot(fromSlot),
m_fromIdStart(fromId),
m_fromIdEnd(fromId + range - 1U),
m_toSlot(toSlot),
m_toTG(toTG),
m_lc(FLCO_GROUP, 0U, toTG),
m_embeddedLC(),
m_dataHeader(),
m_csbk()
m_toTG(toTG)
{
assert(fromSlot == 1U || fromSlot == 2U);
assert(toSlot == 1U || toSlot == 2U);
m_embeddedLC.setLC(m_lc);
}
CRewriteSrc::~CRewriteSrc()
@@ -56,6 +50,7 @@ bool CRewriteSrc::process(CDMRData& data, bool trace)
if (flco != FLCO_USER_USER || slotNo != m_fromSlot || srcId < m_fromIdStart || srcId > m_fromIdEnd) {
if (trace)
LogDebug("Rule Trace,\tRewriteSrc from %s Slot=%u Src=%u-%u: not matched", m_name.c_str(), m_fromSlot, m_fromIdStart, m_fromIdEnd);
return false;
}
@@ -65,32 +60,7 @@ bool CRewriteSrc::process(CDMRData& data, bool trace)
data.setDstId(m_toTG);
data.setFLCO(FLCO_GROUP);
unsigned char dataType = data.getDataType();
switch (dataType) {
case DT_VOICE_LC_HEADER:
case DT_TERMINATOR_WITH_LC:
processHeader(data, dataType);
break;
case DT_VOICE:
processVoice(data);
break;
case DT_CSBK:
processCSBK(data);
break;
case DT_DATA_HEADER:
processDataHeader(data);
break;
case DT_RATE_12_DATA:
case DT_RATE_34_DATA:
case DT_RATE_1_DATA:
case DT_VOICE_SYNC:
// Nothing to do
break;
default:
// Not sure what to do
break;
}
processMessage(data);
if (trace) {
LogDebug("Rule Trace,\tRewriteSrc from %s Slot=%u Src=%u-%u: matched", m_name.c_str(), m_fromSlot, m_fromIdStart, m_fromIdEnd);
@@ -99,71 +69,3 @@ bool CRewriteSrc::process(CDMRData& data, bool trace)
return true;
}
void CRewriteSrc::processHeader(CDMRData& data, unsigned char dataType)
{
unsigned int srcId = data.getSrcId();
if (srcId != m_lc.getSrcId()) {
m_lc.setSrcId(srcId);
m_embeddedLC.setLC(m_lc);
}
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
data.getData(buffer);
CDMRFullLC fullLC;
fullLC.encode(m_lc, buffer, dataType);
data.setData(buffer);
}
void CRewriteSrc::processVoice(CDMRData& data)
{
unsigned int srcId = data.getSrcId();
if (srcId != m_lc.getSrcId()) {
m_lc.setSrcId(srcId);
m_embeddedLC.setLC(m_lc);
}
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
data.getData(buffer);
unsigned char n = data.getN();
m_embeddedLC.getData(buffer, n);
data.setData(buffer);
}
void CRewriteSrc::processDataHeader(CDMRData& data)
{
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
data.getData(buffer);
bool ret = m_dataHeader.put(buffer);
if (!ret)
return;
m_dataHeader.setGI(true);
m_dataHeader.setDstId(m_toTG);
m_dataHeader.get(buffer);
data.setData(buffer);
}
void CRewriteSrc::processCSBK(CDMRData& data)
{
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
data.getData(buffer);
bool ret = m_csbk.put(buffer);
if (!ret)
return;
m_csbk.setGI(true);
m_csbk.setDstId(m_toTG);
m_csbk.get(buffer);
data.setData(buffer);
}

View File

@@ -19,16 +19,12 @@
#if !defined(REWRITESRC_H)
#define REWRITESRC_H
#include "DMREmbeddedData.h"
#include "DMRDataHeader.h"
#include "DMRCSBK.h"
#include "Rewrite.h"
#include "DMRData.h"
#include "DMRLC.h"
#include <string>
class CRewriteSrc : public IRewrite {
class CRewriteSrc : public CRewrite {
public:
CRewriteSrc(const std::string& name, unsigned int fromSlot, unsigned int fromId, unsigned int toSlot, unsigned int toTG, unsigned int range);
virtual ~CRewriteSrc();
@@ -36,21 +32,12 @@ public:
virtual bool process(CDMRData& data, bool trace);
private:
std::string m_name;
unsigned int m_fromSlot;
unsigned int m_fromIdStart;
unsigned int m_fromIdEnd;
unsigned int m_toSlot;
unsigned int m_toTG;
CDMRLC m_lc;
CDMREmbeddedData m_embeddedLC;
CDMRDataHeader m_dataHeader;
CDMRCSBK m_csbk;
void processHeader(CDMRData& data, unsigned char dataType);
void processVoice(CDMRData& data);
void processDataHeader(CDMRData& data);
void processCSBK(CDMRData& data);
std::string m_name;
unsigned int m_fromSlot;
unsigned int m_fromIdStart;
unsigned int m_fromIdEnd;
unsigned int m_toSlot;
unsigned int m_toTG;
};

View File

@@ -19,24 +19,20 @@
#include "RewriteTG.h"
#include "DMRDefines.h"
#include "DMRFullLC.h"
#include "Log.h"
#include <cstdio>
#include <cassert>
CRewriteTG::CRewriteTG(const std::string& name, unsigned int fromSlot, unsigned int fromTG, unsigned int toSlot, unsigned int toTG, unsigned int range) :
CRewrite(),
m_name(name),
m_fromSlot(fromSlot),
m_fromTGStart(fromTG),
m_fromTGEnd(fromTG + range - 1U),
m_toSlot(toSlot),
m_toTGStart(toTG),
m_toTGEnd(toTG + range - 1U),
m_lc(FLCO_GROUP, 0U, toTG),
m_embeddedLC(),
m_dataHeader(),
m_csbk()
m_toTGEnd(toTG + range - 1U)
{
assert(fromSlot == 1U || fromSlot == 2U);
assert(toSlot == 1U || toSlot == 2U);
@@ -59,6 +55,7 @@ bool CRewriteTG::process(CDMRData& data, bool trace)
else
LogDebug("Rule Trace,\tRewriteTG from %s Slot=%u Dst=TG%u-TG%u: not matched", m_name.c_str(), m_fromSlot, m_fromTGStart, m_fromTGEnd);
}
return false;
}
@@ -67,35 +64,9 @@ bool CRewriteTG::process(CDMRData& data, bool trace)
if (m_fromTGStart != m_toTGStart) {
unsigned int newTG = dstId + m_toTGStart - m_fromTGStart;
data.setDstId(newTG);
unsigned char dataType = data.getDataType();
switch (dataType) {
case DT_VOICE_LC_HEADER:
case DT_TERMINATOR_WITH_LC:
processHeader(data, newTG, dataType);
break;
case DT_VOICE:
processVoice(data, newTG);
break;
case DT_CSBK:
processCSBK(data, newTG);
break;
case DT_DATA_HEADER:
processDataHeader(data, newTG);
break;
case DT_RATE_12_DATA:
case DT_RATE_34_DATA:
case DT_RATE_1_DATA:
case DT_VOICE_SYNC:
// Nothing to do
break;
default:
// Not sure what to do
break;
}
processMessage(data);
}
if (trace) {
@@ -103,6 +74,7 @@ bool CRewriteTG::process(CDMRData& data, bool trace)
LogDebug("Rule Trace,\tRewriteTG from %s Slot=%u Dst=TG%u: matched", m_name.c_str(), m_fromSlot, m_fromTGStart);
else
LogDebug("Rule Trace,\tRewriteTG from %s Slot=%u Dst=TG%u-TG%u: matched", m_name.c_str(), m_fromSlot, m_fromTGStart, m_fromTGEnd);
if (m_toTGStart == m_toTGEnd)
LogDebug("Rule Trace,\tRewriteTG to %s Slot=%u Dst=TG%u", m_name.c_str(), m_toSlot, m_toTGStart);
else
@@ -111,71 +83,3 @@ bool CRewriteTG::process(CDMRData& data, bool trace)
return true;
}
void CRewriteTG::processHeader(CDMRData& data, unsigned int tg, unsigned char dataType)
{
unsigned int srcId = data.getSrcId();
if (srcId != m_lc.getSrcId() || tg != m_lc.getDstId()) {
m_lc.setSrcId(srcId);
m_lc.setDstId(tg);
m_embeddedLC.setLC(m_lc);
}
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
data.getData(buffer);
CDMRFullLC fullLC;
fullLC.encode(m_lc, buffer, dataType);
data.setData(buffer);
}
void CRewriteTG::processVoice(CDMRData& data, unsigned int tg)
{
unsigned int srcId = data.getSrcId();
if (srcId != m_lc.getSrcId() || tg != m_lc.getDstId()) {
m_lc.setSrcId(srcId);
m_lc.setDstId(tg);
m_embeddedLC.setLC(m_lc);
}
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
data.getData(buffer);
unsigned char n = data.getN();
m_embeddedLC.getData(buffer, n);
data.setData(buffer);
}
void CRewriteTG::processDataHeader(CDMRData& data, unsigned int tg)
{
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
data.getData(buffer);
bool ret = m_dataHeader.put(buffer);
if (!ret)
return;
m_dataHeader.setDstId(tg);
m_dataHeader.get(buffer);
data.setData(buffer);
}
void CRewriteTG::processCSBK(CDMRData& data, unsigned int tg)
{
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
data.getData(buffer);
bool ret = m_csbk.put(buffer);
if (!ret)
return;
m_csbk.setDstId(tg);
m_csbk.get(buffer);
data.setData(buffer);
}

View File

@@ -19,16 +19,12 @@
#if !defined(REWRITETG_H)
#define REWRITETG_H
#include "DMREmbeddedData.h"
#include "DMRDataHeader.h"
#include "DMRCSBK.h"
#include "Rewrite.h"
#include "DMRData.h"
#include "DMRLC.h"
#include <string>
class CRewriteTG : public IRewrite {
class CRewriteTG : public CRewrite {
public:
CRewriteTG(const std::string& name, unsigned int fromSlot, unsigned int fromTG, unsigned int toSlot, unsigned int toTG, unsigned int range);
virtual ~CRewriteTG();
@@ -36,22 +32,13 @@ public:
virtual bool process(CDMRData& data, bool trace);
private:
std::string m_name;
unsigned int m_fromSlot;
unsigned int m_fromTGStart;
unsigned int m_fromTGEnd;
unsigned int m_toSlot;
unsigned int m_toTGStart;
unsigned int m_toTGEnd;
CDMRLC m_lc;
CDMREmbeddedData m_embeddedLC;
CDMRDataHeader m_dataHeader;
CDMRCSBK m_csbk;
void processHeader(CDMRData& data, unsigned int tg, unsigned char dataType);
void processVoice(CDMRData& data, unsigned int tg);
void processDataHeader(CDMRData& data, unsigned int tg);
void processCSBK(CDMRData& data, unsigned int tg);
std::string m_name;
unsigned int m_fromSlot;
unsigned int m_fromTGStart;
unsigned int m_fromTGEnd;
unsigned int m_toSlot;
unsigned int m_toTGStart;
unsigned int m_toTGEnd;
};

View File

@@ -19,22 +19,18 @@
#include "RewriteType.h"
#include "DMRDefines.h"
#include "DMRFullLC.h"
#include "Log.h"
#include <cstdio>
#include <cassert>
CRewriteType::CRewriteType(const std::string& name, unsigned int fromSlot, unsigned int fromTG, unsigned int toSlot, unsigned int toId) :
CRewrite(),
m_name(name),
m_fromSlot(fromSlot),
m_fromTG(fromTG),
m_toSlot(toSlot),
m_toId(toId),
m_lc(FLCO_USER_USER, 0U, toId),
m_embeddedLC(),
m_dataHeader(),
m_csbk()
m_toId(toId)
{
assert(fromSlot == 1U || fromSlot == 2U);
assert(toSlot == 1U || toSlot == 2U);
@@ -53,6 +49,7 @@ bool CRewriteType::process(CDMRData& data, bool trace)
if (flco != FLCO_GROUP || slotNo != m_fromSlot || dstId != m_fromTG) {
if (trace)
LogDebug("Rule Trace,\tRewriteType %s Slot=%u Dst=TG%u: not matched", m_name.c_str(), m_fromSlot, m_fromTG);
return false;
}
@@ -62,103 +59,10 @@ bool CRewriteType::process(CDMRData& data, bool trace)
data.setDstId(m_toId);
data.setFLCO(FLCO_USER_USER);
unsigned char dataType = data.getDataType();
switch (dataType) {
case DT_VOICE_LC_HEADER:
case DT_TERMINATOR_WITH_LC:
processHeader(data, dataType);
break;
case DT_VOICE:
processVoice(data);
break;
case DT_CSBK:
processCSBK(data);
break;
case DT_DATA_HEADER:
processDataHeader(data);
break;
case DT_RATE_12_DATA:
case DT_RATE_34_DATA:
case DT_RATE_1_DATA:
case DT_VOICE_SYNC:
// Nothing to do
break;
default:
// Not sure what to do
break;
}
processMessage(data);
if (trace)
LogDebug("Rule Trace,\tRewriteType %s Slot=%u Dst=TG%u: matched", m_name.c_str(), m_fromSlot, m_fromTG);
return true;
}
void CRewriteType::processHeader(CDMRData& data, unsigned char dataType)
{
unsigned int srcId = data.getSrcId();
if (srcId != m_lc.getSrcId()) {
m_lc.setSrcId(srcId);
m_embeddedLC.setLC(m_lc);
}
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
data.getData(buffer);
CDMRFullLC fullLC;
fullLC.encode(m_lc, buffer, dataType);
data.setData(buffer);
}
void CRewriteType::processVoice(CDMRData& data)
{
unsigned int srcId = data.getSrcId();
if (srcId != m_lc.getSrcId()) {
m_lc.setSrcId(srcId);
m_embeddedLC.setLC(m_lc);
}
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
data.getData(buffer);
unsigned char n = data.getN();
m_embeddedLC.getData(buffer, n);
data.setData(buffer);
}
void CRewriteType::processDataHeader(CDMRData& data)
{
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
data.getData(buffer);
bool ret = m_dataHeader.put(buffer);
if (!ret)
return;
m_dataHeader.setGI(false);
m_dataHeader.setDstId(m_toId);
m_dataHeader.get(buffer);
data.setData(buffer);
}
void CRewriteType::processCSBK(CDMRData& data)
{
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
data.getData(buffer);
bool ret = m_csbk.put(buffer);
if (!ret)
return;
m_csbk.setGI(false);
m_csbk.setDstId(m_toId);
m_csbk.get(buffer);
data.setData(buffer);
}

View File

@@ -19,16 +19,12 @@
#if !defined(REWRITETYPE_H)
#define REWRITETYPE_H
#include "DMREmbeddedData.h"
#include "DMRDataHeader.h"
#include "DMRCSBK.h"
#include "Rewrite.h"
#include "DMRData.h"
#include "DMRLC.h"
#include <string>
class CRewriteType : public IRewrite {
class CRewriteType : public CRewrite {
public:
CRewriteType(const std::string& name, unsigned int fromSlot, unsigned int fromTG, unsigned int toSlot, unsigned int toId);
virtual ~CRewriteType();
@@ -36,20 +32,11 @@ public:
virtual bool process(CDMRData& data, bool trace);
private:
std::string m_name;
unsigned int m_fromSlot;
unsigned int m_fromTG;
unsigned int m_toSlot;
unsigned int m_toId;
CDMRLC m_lc;
CDMREmbeddedData m_embeddedLC;
CDMRDataHeader m_dataHeader;
CDMRCSBK m_csbk;
void processHeader(CDMRData& data, unsigned char dataType);
void processVoice(CDMRData& data);
void processDataHeader(CDMRData& data);
void processCSBK(CDMRData& data);
std::string m_name;
unsigned int m_fromSlot;
unsigned int m_fromTG;
unsigned int m_toSlot;
unsigned int m_toId;
};