mirror of
https://github.com/g4klx/DMRGateway
synced 2026-02-05 13:55:42 +08:00
Handle TA and Embedded GPS data correctly.
This commit is contained in:
@@ -171,22 +171,22 @@ m_dmr2Passalls()
|
|||||||
|
|
||||||
CDMRGateway::~CDMRGateway()
|
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;
|
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;
|
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;
|
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;
|
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;
|
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 *it;
|
||||||
|
|
||||||
delete m_rpt1Rewrite;
|
delete m_rpt1Rewrite;
|
||||||
@@ -610,7 +610,7 @@ int CDMRGateway::run()
|
|||||||
|
|
||||||
if (m_dmrNetwork1 != NULL) {
|
if (m_dmrNetwork1 != NULL) {
|
||||||
// Rewrite the slot and/or TG or neither
|
// 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);
|
bool ret = (*it)->process(data, trace);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
rewritten = true;
|
rewritten = true;
|
||||||
@@ -630,7 +630,7 @@ int CDMRGateway::run()
|
|||||||
if (!rewritten) {
|
if (!rewritten) {
|
||||||
if (m_dmrNetwork2 != NULL) {
|
if (m_dmrNetwork2 != NULL) {
|
||||||
// Rewrite the slot and/or TG or neither
|
// 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);
|
bool ret = (*it)->process(data, trace);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
rewritten = true;
|
rewritten = true;
|
||||||
@@ -650,7 +650,7 @@ int CDMRGateway::run()
|
|||||||
|
|
||||||
if (!rewritten) {
|
if (!rewritten) {
|
||||||
if (m_dmrNetwork1 != NULL) {
|
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);
|
bool ret = (*it)->process(data, trace);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
rewritten = true;
|
rewritten = true;
|
||||||
@@ -670,7 +670,7 @@ int CDMRGateway::run()
|
|||||||
|
|
||||||
if (!rewritten) {
|
if (!rewritten) {
|
||||||
if (m_dmrNetwork2 != NULL) {
|
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);
|
bool ret = (*it)->process(data, trace);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
rewritten = true;
|
rewritten = true;
|
||||||
@@ -752,7 +752,7 @@ int CDMRGateway::run()
|
|||||||
|
|
||||||
// Rewrite the slot and/or TG or neither
|
// Rewrite the slot and/or TG or neither
|
||||||
bool rewritten = false;
|
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);
|
bool ret = (*it)->process(data, trace);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
rewritten = true;
|
rewritten = true;
|
||||||
@@ -797,7 +797,7 @@ int CDMRGateway::run()
|
|||||||
|
|
||||||
// Rewrite the slot and/or TG or neither
|
// Rewrite the slot and/or TG or neither
|
||||||
bool rewritten = false;
|
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);
|
bool ret = (*it)->process(data, trace);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
rewritten = true;
|
rewritten = true;
|
||||||
|
|||||||
12
DMRGateway.h
12
DMRGateway.h
@@ -68,12 +68,12 @@ private:
|
|||||||
bool m_xlx2Connected;
|
bool m_xlx2Connected;
|
||||||
CRewriteTG* m_rpt2Rewrite;
|
CRewriteTG* m_rpt2Rewrite;
|
||||||
CRewriteTG* m_xlx2Rewrite;
|
CRewriteTG* m_xlx2Rewrite;
|
||||||
std::vector<IRewrite*> m_dmr1NetRewrites;
|
std::vector<CRewrite*> m_dmr1NetRewrites;
|
||||||
std::vector<IRewrite*> m_dmr1RFRewrites;
|
std::vector<CRewrite*> m_dmr1RFRewrites;
|
||||||
std::vector<IRewrite*> m_dmr2NetRewrites;
|
std::vector<CRewrite*> m_dmr2NetRewrites;
|
||||||
std::vector<IRewrite*> m_dmr2RFRewrites;
|
std::vector<CRewrite*> m_dmr2RFRewrites;
|
||||||
std::vector<IRewrite*> m_dmr1Passalls;
|
std::vector<CRewrite*> m_dmr1Passalls;
|
||||||
std::vector<IRewrite*> m_dmr2Passalls;
|
std::vector<CRewrite*> m_dmr2Passalls;
|
||||||
|
|
||||||
bool createMMDVM();
|
bool createMMDVM();
|
||||||
bool createDMRNetwork1();
|
bool createDMRNetwork1();
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
CPassAllPC::CPassAllPC(const std::string& name, unsigned int slot) :
|
CPassAllPC::CPassAllPC(const std::string& name, unsigned int slot) :
|
||||||
|
CRewrite(),
|
||||||
m_name(name),
|
m_name(name),
|
||||||
m_slot(slot)
|
m_slot(slot)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
class CPassAllPC : public IRewrite {
|
class CPassAllPC : public CRewrite {
|
||||||
public:
|
public:
|
||||||
CPassAllPC(const std::string& name, unsigned int slot);
|
CPassAllPC(const std::string& name, unsigned int slot);
|
||||||
virtual ~CPassAllPC();
|
virtual ~CPassAllPC();
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
CPassAllTG::CPassAllTG(const std::string& name, unsigned int slot) :
|
CPassAllTG::CPassAllTG(const std::string& name, unsigned int slot) :
|
||||||
|
CRewrite(),
|
||||||
m_name(name),
|
m_name(name),
|
||||||
m_slot(slot)
|
m_slot(slot)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
class CPassAllTG : public IRewrite {
|
class CPassAllTG : public CRewrite {
|
||||||
public:
|
public:
|
||||||
CPassAllTG(const std::string& name, unsigned int slot);
|
CPassAllTG(const std::string& name, unsigned int slot);
|
||||||
virtual ~CPassAllTG();
|
virtual ~CPassAllTG();
|
||||||
|
|||||||
191
Rewrite.cpp
191
Rewrite.cpp
@@ -16,8 +16,197 @@
|
|||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "DMRDataHeader.h"
|
||||||
|
#include "DMRFullLC.h"
|
||||||
|
#include "DMRCSBK.h"
|
||||||
#include "Rewrite.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);
|
||||||
}
|
}
|
||||||
|
|||||||
26
Rewrite.h
26
Rewrite.h
@@ -19,16 +19,36 @@
|
|||||||
#if !defined(REWRITE_H)
|
#if !defined(REWRITE_H)
|
||||||
#define REWRITE_H
|
#define REWRITE_H
|
||||||
|
|
||||||
|
#include "DMREmbeddedData.h"
|
||||||
#include "DMRData.h"
|
#include "DMRData.h"
|
||||||
|
#include "DMRLC.h"
|
||||||
|
|
||||||
class IRewrite {
|
class CRewrite {
|
||||||
public:
|
public:
|
||||||
virtual ~IRewrite() = 0;
|
CRewrite();
|
||||||
|
virtual ~CRewrite();
|
||||||
|
|
||||||
virtual bool process(CDMRData& data, bool trace) = 0;
|
virtual bool process(CDMRData& data, bool trace) = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void processMessage(CDMRData& data);
|
||||||
|
|
||||||
private:
|
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
|
#endif
|
||||||
|
|||||||
105
RewritePC.cpp
105
RewritePC.cpp
@@ -19,24 +19,20 @@
|
|||||||
#include "RewritePC.h"
|
#include "RewritePC.h"
|
||||||
|
|
||||||
#include "DMRDefines.h"
|
#include "DMRDefines.h"
|
||||||
#include "DMRFullLC.h"
|
|
||||||
#include "Log.h"
|
#include "Log.h"
|
||||||
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
CRewritePC::CRewritePC(const std::string& name, unsigned int fromSlot, unsigned int fromId, unsigned int toSlot, unsigned int toId, unsigned int range) :
|
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_name(name),
|
||||||
m_fromSlot(fromSlot),
|
m_fromSlot(fromSlot),
|
||||||
m_fromIdStart(fromId),
|
m_fromIdStart(fromId),
|
||||||
m_fromIdEnd(fromId + range - 1U),
|
m_fromIdEnd(fromId + range - 1U),
|
||||||
m_toSlot(toSlot),
|
m_toSlot(toSlot),
|
||||||
m_toIdStart(toId),
|
m_toIdStart(toId),
|
||||||
m_toIdEnd(toId + range - 1U),
|
m_toIdEnd(toId + range - 1U)
|
||||||
m_lc(FLCO_USER_USER, 0U, 0U),
|
|
||||||
m_embeddedLC(),
|
|
||||||
m_dataHeader(),
|
|
||||||
m_csbk()
|
|
||||||
{
|
{
|
||||||
assert(fromSlot == 1U || fromSlot == 2U);
|
assert(fromSlot == 1U || fromSlot == 2U);
|
||||||
assert(toSlot == 1U || toSlot == 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 (flco != FLCO_USER_USER || slotNo != m_fromSlot || dstId < m_fromIdStart || dstId > m_fromIdEnd) {
|
||||||
if (trace)
|
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);
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,35 +60,9 @@ bool CRewritePC::process(CDMRData& data, bool trace)
|
|||||||
|
|
||||||
if (m_fromIdStart != m_toIdStart) {
|
if (m_fromIdStart != m_toIdStart) {
|
||||||
unsigned int newDstId = dstId + m_toIdStart - m_fromIdStart;
|
unsigned int newDstId = dstId + m_toIdStart - m_fromIdStart;
|
||||||
|
|
||||||
data.setDstId(newDstId);
|
data.setDstId(newDstId);
|
||||||
|
|
||||||
unsigned char dataType = data.getDataType();
|
processMessage(data);
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (trace) {
|
if (trace) {
|
||||||
@@ -101,71 +72,3 @@ bool CRewritePC::process(CDMRData& data, bool trace)
|
|||||||
|
|
||||||
return true;
|
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);
|
|
||||||
}
|
|
||||||
|
|||||||
15
RewritePC.h
15
RewritePC.h
@@ -19,16 +19,12 @@
|
|||||||
#if !defined(REWRITEPC_H)
|
#if !defined(REWRITEPC_H)
|
||||||
#define REWRITEPC_H
|
#define REWRITEPC_H
|
||||||
|
|
||||||
#include "DMREmbeddedData.h"
|
|
||||||
#include "DMRDataHeader.h"
|
|
||||||
#include "DMRCSBK.h"
|
|
||||||
#include "Rewrite.h"
|
#include "Rewrite.h"
|
||||||
#include "DMRData.h"
|
#include "DMRData.h"
|
||||||
#include "DMRLC.h"
|
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
class CRewritePC : public IRewrite {
|
class CRewritePC : public CRewrite {
|
||||||
public:
|
public:
|
||||||
CRewritePC(const std::string& name, unsigned int fromSlot, unsigned int fromId, unsigned int toSlot, unsigned int toId, unsigned int range);
|
CRewritePC(const std::string& name, unsigned int fromSlot, unsigned int fromId, unsigned int toSlot, unsigned int toId, unsigned int range);
|
||||||
virtual ~CRewritePC();
|
virtual ~CRewritePC();
|
||||||
@@ -43,15 +39,6 @@ private:
|
|||||||
unsigned int m_toSlot;
|
unsigned int m_toSlot;
|
||||||
unsigned int m_toIdStart;
|
unsigned int m_toIdStart;
|
||||||
unsigned int m_toIdEnd;
|
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);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
106
RewriteSrc.cpp
106
RewriteSrc.cpp
@@ -19,28 +19,22 @@
|
|||||||
#include "RewriteSrc.h"
|
#include "RewriteSrc.h"
|
||||||
|
|
||||||
#include "DMRDefines.h"
|
#include "DMRDefines.h"
|
||||||
#include "DMRFullLC.h"
|
|
||||||
#include "Log.h"
|
#include "Log.h"
|
||||||
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
CRewriteSrc::CRewriteSrc(const std::string& name, unsigned int fromSlot, unsigned int fromId, unsigned int toSlot, unsigned int toTG, unsigned int range) :
|
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_name(name),
|
||||||
m_fromSlot(fromSlot),
|
m_fromSlot(fromSlot),
|
||||||
m_fromIdStart(fromId),
|
m_fromIdStart(fromId),
|
||||||
m_fromIdEnd(fromId + range - 1U),
|
m_fromIdEnd(fromId + range - 1U),
|
||||||
m_toSlot(toSlot),
|
m_toSlot(toSlot),
|
||||||
m_toTG(toTG),
|
m_toTG(toTG)
|
||||||
m_lc(FLCO_GROUP, 0U, toTG),
|
|
||||||
m_embeddedLC(),
|
|
||||||
m_dataHeader(),
|
|
||||||
m_csbk()
|
|
||||||
{
|
{
|
||||||
assert(fromSlot == 1U || fromSlot == 2U);
|
assert(fromSlot == 1U || fromSlot == 2U);
|
||||||
assert(toSlot == 1U || toSlot == 2U);
|
assert(toSlot == 1U || toSlot == 2U);
|
||||||
|
|
||||||
m_embeddedLC.setLC(m_lc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CRewriteSrc::~CRewriteSrc()
|
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 (flco != FLCO_USER_USER || slotNo != m_fromSlot || srcId < m_fromIdStart || srcId > m_fromIdEnd) {
|
||||||
if (trace)
|
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);
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,32 +60,7 @@ bool CRewriteSrc::process(CDMRData& data, bool trace)
|
|||||||
data.setDstId(m_toTG);
|
data.setDstId(m_toTG);
|
||||||
data.setFLCO(FLCO_GROUP);
|
data.setFLCO(FLCO_GROUP);
|
||||||
|
|
||||||
unsigned char dataType = data.getDataType();
|
processMessage(data);
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (trace) {
|
if (trace) {
|
||||||
LogDebug("Rule Trace,\tRewriteSrc from %s Slot=%u Src=%u-%u: matched", m_name.c_str(), m_fromSlot, m_fromIdStart, m_fromIdEnd);
|
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;
|
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);
|
|
||||||
}
|
|
||||||
|
|||||||
15
RewriteSrc.h
15
RewriteSrc.h
@@ -19,16 +19,12 @@
|
|||||||
#if !defined(REWRITESRC_H)
|
#if !defined(REWRITESRC_H)
|
||||||
#define REWRITESRC_H
|
#define REWRITESRC_H
|
||||||
|
|
||||||
#include "DMREmbeddedData.h"
|
|
||||||
#include "DMRDataHeader.h"
|
|
||||||
#include "DMRCSBK.h"
|
|
||||||
#include "Rewrite.h"
|
#include "Rewrite.h"
|
||||||
#include "DMRData.h"
|
#include "DMRData.h"
|
||||||
#include "DMRLC.h"
|
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
class CRewriteSrc : public IRewrite {
|
class CRewriteSrc : public CRewrite {
|
||||||
public:
|
public:
|
||||||
CRewriteSrc(const std::string& name, unsigned int fromSlot, unsigned int fromId, unsigned int toSlot, unsigned int toTG, unsigned int range);
|
CRewriteSrc(const std::string& name, unsigned int fromSlot, unsigned int fromId, unsigned int toSlot, unsigned int toTG, unsigned int range);
|
||||||
virtual ~CRewriteSrc();
|
virtual ~CRewriteSrc();
|
||||||
@@ -42,15 +38,6 @@ private:
|
|||||||
unsigned int m_fromIdEnd;
|
unsigned int m_fromIdEnd;
|
||||||
unsigned int m_toSlot;
|
unsigned int m_toSlot;
|
||||||
unsigned int m_toTG;
|
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);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
106
RewriteTG.cpp
106
RewriteTG.cpp
@@ -19,24 +19,20 @@
|
|||||||
#include "RewriteTG.h"
|
#include "RewriteTG.h"
|
||||||
|
|
||||||
#include "DMRDefines.h"
|
#include "DMRDefines.h"
|
||||||
#include "DMRFullLC.h"
|
|
||||||
#include "Log.h"
|
#include "Log.h"
|
||||||
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
CRewriteTG::CRewriteTG(const std::string& name, unsigned int fromSlot, unsigned int fromTG, unsigned int toSlot, unsigned int toTG, unsigned int range) :
|
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_name(name),
|
||||||
m_fromSlot(fromSlot),
|
m_fromSlot(fromSlot),
|
||||||
m_fromTGStart(fromTG),
|
m_fromTGStart(fromTG),
|
||||||
m_fromTGEnd(fromTG + range - 1U),
|
m_fromTGEnd(fromTG + range - 1U),
|
||||||
m_toSlot(toSlot),
|
m_toSlot(toSlot),
|
||||||
m_toTGStart(toTG),
|
m_toTGStart(toTG),
|
||||||
m_toTGEnd(toTG + range - 1U),
|
m_toTGEnd(toTG + range - 1U)
|
||||||
m_lc(FLCO_GROUP, 0U, toTG),
|
|
||||||
m_embeddedLC(),
|
|
||||||
m_dataHeader(),
|
|
||||||
m_csbk()
|
|
||||||
{
|
{
|
||||||
assert(fromSlot == 1U || fromSlot == 2U);
|
assert(fromSlot == 1U || fromSlot == 2U);
|
||||||
assert(toSlot == 1U || toSlot == 2U);
|
assert(toSlot == 1U || toSlot == 2U);
|
||||||
@@ -59,6 +55,7 @@ bool CRewriteTG::process(CDMRData& data, bool trace)
|
|||||||
else
|
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);
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,35 +64,9 @@ bool CRewriteTG::process(CDMRData& data, bool trace)
|
|||||||
|
|
||||||
if (m_fromTGStart != m_toTGStart) {
|
if (m_fromTGStart != m_toTGStart) {
|
||||||
unsigned int newTG = dstId + m_toTGStart - m_fromTGStart;
|
unsigned int newTG = dstId + m_toTGStart - m_fromTGStart;
|
||||||
|
|
||||||
data.setDstId(newTG);
|
data.setDstId(newTG);
|
||||||
|
|
||||||
unsigned char dataType = data.getDataType();
|
processMessage(data);
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (trace) {
|
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);
|
LogDebug("Rule Trace,\tRewriteTG from %s Slot=%u Dst=TG%u: matched", m_name.c_str(), m_fromSlot, m_fromTGStart);
|
||||||
else
|
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);
|
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)
|
if (m_toTGStart == m_toTGEnd)
|
||||||
LogDebug("Rule Trace,\tRewriteTG to %s Slot=%u Dst=TG%u", m_name.c_str(), m_toSlot, m_toTGStart);
|
LogDebug("Rule Trace,\tRewriteTG to %s Slot=%u Dst=TG%u", m_name.c_str(), m_toSlot, m_toTGStart);
|
||||||
else
|
else
|
||||||
@@ -111,71 +83,3 @@ bool CRewriteTG::process(CDMRData& data, bool trace)
|
|||||||
|
|
||||||
return true;
|
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);
|
|
||||||
}
|
|
||||||
|
|||||||
15
RewriteTG.h
15
RewriteTG.h
@@ -19,16 +19,12 @@
|
|||||||
#if !defined(REWRITETG_H)
|
#if !defined(REWRITETG_H)
|
||||||
#define REWRITETG_H
|
#define REWRITETG_H
|
||||||
|
|
||||||
#include "DMREmbeddedData.h"
|
|
||||||
#include "DMRDataHeader.h"
|
|
||||||
#include "DMRCSBK.h"
|
|
||||||
#include "Rewrite.h"
|
#include "Rewrite.h"
|
||||||
#include "DMRData.h"
|
#include "DMRData.h"
|
||||||
#include "DMRLC.h"
|
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
class CRewriteTG : public IRewrite {
|
class CRewriteTG : public CRewrite {
|
||||||
public:
|
public:
|
||||||
CRewriteTG(const std::string& name, unsigned int fromSlot, unsigned int fromTG, unsigned int toSlot, unsigned int toTG, unsigned int range);
|
CRewriteTG(const std::string& name, unsigned int fromSlot, unsigned int fromTG, unsigned int toSlot, unsigned int toTG, unsigned int range);
|
||||||
virtual ~CRewriteTG();
|
virtual ~CRewriteTG();
|
||||||
@@ -43,15 +39,6 @@ private:
|
|||||||
unsigned int m_toSlot;
|
unsigned int m_toSlot;
|
||||||
unsigned int m_toTGStart;
|
unsigned int m_toTGStart;
|
||||||
unsigned int m_toTGEnd;
|
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);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
104
RewriteType.cpp
104
RewriteType.cpp
@@ -19,22 +19,18 @@
|
|||||||
#include "RewriteType.h"
|
#include "RewriteType.h"
|
||||||
|
|
||||||
#include "DMRDefines.h"
|
#include "DMRDefines.h"
|
||||||
#include "DMRFullLC.h"
|
|
||||||
#include "Log.h"
|
#include "Log.h"
|
||||||
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
CRewriteType::CRewriteType(const std::string& name, unsigned int fromSlot, unsigned int fromTG, unsigned int toSlot, unsigned int toId) :
|
CRewriteType::CRewriteType(const std::string& name, unsigned int fromSlot, unsigned int fromTG, unsigned int toSlot, unsigned int toId) :
|
||||||
|
CRewrite(),
|
||||||
m_name(name),
|
m_name(name),
|
||||||
m_fromSlot(fromSlot),
|
m_fromSlot(fromSlot),
|
||||||
m_fromTG(fromTG),
|
m_fromTG(fromTG),
|
||||||
m_toSlot(toSlot),
|
m_toSlot(toSlot),
|
||||||
m_toId(toId),
|
m_toId(toId)
|
||||||
m_lc(FLCO_USER_USER, 0U, toId),
|
|
||||||
m_embeddedLC(),
|
|
||||||
m_dataHeader(),
|
|
||||||
m_csbk()
|
|
||||||
{
|
{
|
||||||
assert(fromSlot == 1U || fromSlot == 2U);
|
assert(fromSlot == 1U || fromSlot == 2U);
|
||||||
assert(toSlot == 1U || toSlot == 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 (flco != FLCO_GROUP || slotNo != m_fromSlot || dstId != m_fromTG) {
|
||||||
if (trace)
|
if (trace)
|
||||||
LogDebug("Rule Trace,\tRewriteType %s Slot=%u Dst=TG%u: not matched", m_name.c_str(), m_fromSlot, m_fromTG);
|
LogDebug("Rule Trace,\tRewriteType %s Slot=%u Dst=TG%u: not matched", m_name.c_str(), m_fromSlot, m_fromTG);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,103 +59,10 @@ bool CRewriteType::process(CDMRData& data, bool trace)
|
|||||||
data.setDstId(m_toId);
|
data.setDstId(m_toId);
|
||||||
data.setFLCO(FLCO_USER_USER);
|
data.setFLCO(FLCO_USER_USER);
|
||||||
|
|
||||||
unsigned char dataType = data.getDataType();
|
processMessage(data);
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (trace)
|
if (trace)
|
||||||
LogDebug("Rule Trace,\tRewriteType %s Slot=%u Dst=TG%u: matched", m_name.c_str(), m_fromSlot, m_fromTG);
|
LogDebug("Rule Trace,\tRewriteType %s Slot=%u Dst=TG%u: matched", m_name.c_str(), m_fromSlot, m_fromTG);
|
||||||
|
|
||||||
return true;
|
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);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -19,16 +19,12 @@
|
|||||||
#if !defined(REWRITETYPE_H)
|
#if !defined(REWRITETYPE_H)
|
||||||
#define REWRITETYPE_H
|
#define REWRITETYPE_H
|
||||||
|
|
||||||
#include "DMREmbeddedData.h"
|
|
||||||
#include "DMRDataHeader.h"
|
|
||||||
#include "DMRCSBK.h"
|
|
||||||
#include "Rewrite.h"
|
#include "Rewrite.h"
|
||||||
#include "DMRData.h"
|
#include "DMRData.h"
|
||||||
#include "DMRLC.h"
|
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
class CRewriteType : public IRewrite {
|
class CRewriteType : public CRewrite {
|
||||||
public:
|
public:
|
||||||
CRewriteType(const std::string& name, unsigned int fromSlot, unsigned int fromTG, unsigned int toSlot, unsigned int toId);
|
CRewriteType(const std::string& name, unsigned int fromSlot, unsigned int fromTG, unsigned int toSlot, unsigned int toId);
|
||||||
virtual ~CRewriteType();
|
virtual ~CRewriteType();
|
||||||
@@ -41,15 +37,6 @@ private:
|
|||||||
unsigned int m_fromTG;
|
unsigned int m_fromTG;
|
||||||
unsigned int m_toSlot;
|
unsigned int m_toSlot;
|
||||||
unsigned int m_toId;
|
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);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user