diff --git a/DMRGateway.cpp b/DMRGateway.cpp index e03328c..db7424b 100644 --- a/DMRGateway.cpp +++ b/DMRGateway.cpp @@ -171,22 +171,22 @@ m_dmr2Passalls() CDMRGateway::~CDMRGateway() { - for (std::vector::iterator it = m_dmr1NetRewrites.begin(); it != m_dmr1NetRewrites.end(); ++it) + for (std::vector::iterator it = m_dmr1NetRewrites.begin(); it != m_dmr1NetRewrites.end(); ++it) delete *it; - for (std::vector::iterator it = m_dmr1RFRewrites.begin(); it != m_dmr1RFRewrites.end(); ++it) + for (std::vector::iterator it = m_dmr1RFRewrites.begin(); it != m_dmr1RFRewrites.end(); ++it) delete *it; - for (std::vector::iterator it = m_dmr2NetRewrites.begin(); it != m_dmr2NetRewrites.end(); ++it) + for (std::vector::iterator it = m_dmr2NetRewrites.begin(); it != m_dmr2NetRewrites.end(); ++it) delete *it; - for (std::vector::iterator it = m_dmr2RFRewrites.begin(); it != m_dmr2RFRewrites.end(); ++it) + for (std::vector::iterator it = m_dmr2RFRewrites.begin(); it != m_dmr2RFRewrites.end(); ++it) delete *it; - for (std::vector::iterator it = m_dmr1Passalls.begin(); it != m_dmr1Passalls.end(); ++it) + for (std::vector::iterator it = m_dmr1Passalls.begin(); it != m_dmr1Passalls.end(); ++it) delete *it; - for (std::vector::iterator it = m_dmr2Passalls.begin(); it != m_dmr2Passalls.end(); ++it) + for (std::vector::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::iterator it = m_dmr1RFRewrites.begin(); it != m_dmr1RFRewrites.end(); ++it) { + for (std::vector::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::iterator it = m_dmr2RFRewrites.begin(); it != m_dmr2RFRewrites.end(); ++it) { + for (std::vector::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::iterator it = m_dmr1Passalls.begin(); it != m_dmr1Passalls.end(); ++it) { + for (std::vector::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::iterator it = m_dmr2Passalls.begin(); it != m_dmr2Passalls.end(); ++it) { + for (std::vector::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::iterator it = m_dmr1NetRewrites.begin(); it != m_dmr1NetRewrites.end(); ++it) { + for (std::vector::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::iterator it = m_dmr2NetRewrites.begin(); it != m_dmr2NetRewrites.end(); ++it) { + for (std::vector::iterator it = m_dmr2NetRewrites.begin(); it != m_dmr2NetRewrites.end(); ++it) { bool ret = (*it)->process(data, trace); if (ret) { rewritten = true; diff --git a/DMRGateway.h b/DMRGateway.h index 0220b72..820f211 100644 --- a/DMRGateway.h +++ b/DMRGateway.h @@ -68,12 +68,12 @@ private: bool m_xlx2Connected; CRewriteTG* m_rpt2Rewrite; CRewriteTG* m_xlx2Rewrite; - std::vector m_dmr1NetRewrites; - std::vector m_dmr1RFRewrites; - std::vector m_dmr2NetRewrites; - std::vector m_dmr2RFRewrites; - std::vector m_dmr1Passalls; - std::vector m_dmr2Passalls; + std::vector m_dmr1NetRewrites; + std::vector m_dmr1RFRewrites; + std::vector m_dmr2NetRewrites; + std::vector m_dmr2RFRewrites; + std::vector m_dmr1Passalls; + std::vector m_dmr2Passalls; bool createMMDVM(); bool createDMRNetwork1(); diff --git a/PassAllPC.cpp b/PassAllPC.cpp index b1c35bf..342e988 100644 --- a/PassAllPC.cpp +++ b/PassAllPC.cpp @@ -25,6 +25,7 @@ #include CPassAllPC::CPassAllPC(const std::string& name, unsigned int slot) : +CRewrite(), m_name(name), m_slot(slot) { diff --git a/PassAllPC.h b/PassAllPC.h index 83d7fce..3b589b0 100644 --- a/PassAllPC.h +++ b/PassAllPC.h @@ -24,7 +24,7 @@ #include -class CPassAllPC : public IRewrite { +class CPassAllPC : public CRewrite { public: CPassAllPC(const std::string& name, unsigned int slot); virtual ~CPassAllPC(); diff --git a/PassAllTG.cpp b/PassAllTG.cpp index a46c342..ccfb08e 100644 --- a/PassAllTG.cpp +++ b/PassAllTG.cpp @@ -25,6 +25,7 @@ #include CPassAllTG::CPassAllTG(const std::string& name, unsigned int slot) : +CRewrite(), m_name(name), m_slot(slot) { diff --git a/PassAllTG.h b/PassAllTG.h index 9ddb366..01078bd 100644 --- a/PassAllTG.h +++ b/PassAllTG.h @@ -24,7 +24,7 @@ #include -class CPassAllTG : public IRewrite { +class CPassAllTG : public CRewrite { public: CPassAllTG(const std::string& name, unsigned int slot); virtual ~CPassAllTG(); diff --git a/Rewrite.cpp b/Rewrite.cpp index 5125aeb..a160d5d 100644 --- a/Rewrite.cpp +++ b/Rewrite.cpp @@ -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 + +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); } diff --git a/Rewrite.h b/Rewrite.h index 0292d10..bd04340 100644 --- a/Rewrite.h +++ b/Rewrite.h @@ -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 diff --git a/RewritePC.cpp b/RewritePC.cpp index 778cb7e..9420945 100644 --- a/RewritePC.cpp +++ b/RewritePC.cpp @@ -19,24 +19,20 @@ #include "RewritePC.h" #include "DMRDefines.h" -#include "DMRFullLC.h" #include "Log.h" #include #include 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); -} diff --git a/RewritePC.h b/RewritePC.h index d8dd833..7d42432 100644 --- a/RewritePC.h +++ b/RewritePC.h @@ -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 -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; }; diff --git a/RewriteSrc.cpp b/RewriteSrc.cpp index 7635e48..dcd2152 100644 --- a/RewriteSrc.cpp +++ b/RewriteSrc.cpp @@ -19,28 +19,22 @@ #include "RewriteSrc.h" #include "DMRDefines.h" -#include "DMRFullLC.h" #include "Log.h" #include #include 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); -} diff --git a/RewriteSrc.h b/RewriteSrc.h index 85bd47e..d970f23 100644 --- a/RewriteSrc.h +++ b/RewriteSrc.h @@ -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 -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; }; diff --git a/RewriteTG.cpp b/RewriteTG.cpp index fcb7a91..73d7176 100644 --- a/RewriteTG.cpp +++ b/RewriteTG.cpp @@ -19,24 +19,20 @@ #include "RewriteTG.h" #include "DMRDefines.h" -#include "DMRFullLC.h" #include "Log.h" #include #include 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); -} diff --git a/RewriteTG.h b/RewriteTG.h index a59394d..30c8984 100644 --- a/RewriteTG.h +++ b/RewriteTG.h @@ -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 -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; }; diff --git a/RewriteType.cpp b/RewriteType.cpp index 45e803b..c691fcc 100644 --- a/RewriteType.cpp +++ b/RewriteType.cpp @@ -19,22 +19,18 @@ #include "RewriteType.h" #include "DMRDefines.h" -#include "DMRFullLC.h" #include "Log.h" #include #include 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); -} diff --git a/RewriteType.h b/RewriteType.h index 86fa47c..2cb8834 100644 --- a/RewriteType.h +++ b/RewriteType.h @@ -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 -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; };