mirror of
https://github.com/g4klx/DMRGateway
synced 2025-12-22 05:57:04 +08:00
Fix LCSS bug and improve swap usage.
This commit is contained in:
86
Rewrite.cpp
86
Rewrite.cpp
@@ -20,6 +20,7 @@
|
|||||||
#include "DMRFullLC.h"
|
#include "DMRFullLC.h"
|
||||||
#include "DMRCSBK.h"
|
#include "DMRCSBK.h"
|
||||||
#include "Rewrite.h"
|
#include "Rewrite.h"
|
||||||
|
#include "DMREMB.h"
|
||||||
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
|
||||||
@@ -28,7 +29,8 @@ m_lc(),
|
|||||||
m_embeddedLC(),
|
m_embeddedLC(),
|
||||||
m_data(NULL),
|
m_data(NULL),
|
||||||
m_writeNum(0U),
|
m_writeNum(0U),
|
||||||
m_readNum(0U)
|
m_readNum(0U),
|
||||||
|
m_lastN(0U)
|
||||||
{
|
{
|
||||||
m_data = new CDMREmbeddedData[2U];
|
m_data = new CDMREmbeddedData[2U];
|
||||||
}
|
}
|
||||||
@@ -48,6 +50,10 @@ void CRewrite::processMessage(CDMRData& data)
|
|||||||
processHeader(data, dataType);
|
processHeader(data, dataType);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case DT_VOICE_SYNC:
|
||||||
|
processVoiceSync(data);
|
||||||
|
break;
|
||||||
|
|
||||||
case DT_VOICE:
|
case DT_VOICE:
|
||||||
processVoice(data);
|
processVoice(data);
|
||||||
break;
|
break;
|
||||||
@@ -63,13 +69,10 @@ void CRewrite::processMessage(CDMRData& data)
|
|||||||
case DT_RATE_12_DATA:
|
case DT_RATE_12_DATA:
|
||||||
case DT_RATE_34_DATA:
|
case DT_RATE_34_DATA:
|
||||||
case DT_RATE_1_DATA:
|
case DT_RATE_1_DATA:
|
||||||
// Nothing to do
|
processData(data);
|
||||||
break;
|
|
||||||
|
|
||||||
case DT_VOICE_SYNC:
|
|
||||||
swap();
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case DT_VOICE_PI_HEADER:
|
||||||
default:
|
default:
|
||||||
// Not sure what to do
|
// Not sure what to do
|
||||||
break;
|
break;
|
||||||
@@ -91,33 +94,29 @@ void CRewrite::setLC(FLCO flco, unsigned int srcId, unsigned int dstId)
|
|||||||
m_writeNum = 0U;
|
m_writeNum = 0U;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char CRewrite::processEmbeddedData(unsigned char* data, unsigned char n)
|
void CRewrite::processEmbeddedData(unsigned char* data, unsigned char n)
|
||||||
{
|
{
|
||||||
unsigned char lcss = 0U;
|
CDMREMB emb;
|
||||||
|
emb.putData(data);
|
||||||
|
|
||||||
switch (n) {
|
unsigned char lcss = emb.getLCSS();
|
||||||
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);
|
m_data[m_writeNum].addData(data, lcss);
|
||||||
|
|
||||||
if (m_readNum == 0U && m_writeNum == 0U)
|
if (m_readNum == 0U && m_writeNum == 0U) {
|
||||||
return m_embeddedLC.getData(data, n);
|
lcss = m_embeddedLC.getData(data, n);
|
||||||
|
emb.setLCSS(lcss);
|
||||||
|
emb.getData(data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
CDMRLC* lc = m_data[m_readNum].getLC();
|
CDMRLC* lc = m_data[m_readNum].getLC();
|
||||||
if (lc == NULL)
|
if (lc == NULL) {
|
||||||
return m_embeddedLC.getData(data, n);
|
lcss = m_embeddedLC.getData(data, n);
|
||||||
|
emb.setLCSS(lcss);
|
||||||
|
emb.getData(data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
FLCO flco = lc->getFLCO();
|
FLCO flco = lc->getFLCO();
|
||||||
|
|
||||||
@@ -125,13 +124,20 @@ unsigned char CRewrite::processEmbeddedData(unsigned char* data, unsigned char n
|
|||||||
|
|
||||||
// Replace any identity embedded data with the new one
|
// Replace any identity embedded data with the new one
|
||||||
if (flco == FLCO_GROUP || flco == FLCO_USER_USER)
|
if (flco == FLCO_GROUP || flco == FLCO_USER_USER)
|
||||||
return m_embeddedLC.getData(data, n);
|
lcss = m_embeddedLC.getData(data, n);
|
||||||
else
|
else
|
||||||
return m_data[m_readNum].getData(data, n);
|
lcss = m_data[m_readNum].getData(data, n);
|
||||||
|
|
||||||
|
emb.setLCSS(lcss);
|
||||||
|
emb.getData(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CRewrite::swap()
|
void CRewrite::swap()
|
||||||
{
|
{
|
||||||
|
// If we get a voice sync straight after a voice header (or another voice sync)
|
||||||
|
if (m_lastN == 0U)
|
||||||
|
return;
|
||||||
|
|
||||||
if (m_readNum == 0U && m_writeNum == 0U) {
|
if (m_readNum == 0U && m_writeNum == 0U) {
|
||||||
m_writeNum = 1U;
|
m_writeNum = 1U;
|
||||||
return;
|
return;
|
||||||
@@ -159,18 +165,35 @@ void CRewrite::processHeader(CDMRData& data, unsigned char dataType)
|
|||||||
fullLC.encode(m_lc, buffer, dataType);
|
fullLC.encode(m_lc, buffer, dataType);
|
||||||
|
|
||||||
data.setData(buffer);
|
data.setData(buffer);
|
||||||
|
|
||||||
|
m_lastN = 0U;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CRewrite::processVoiceSync(CDMRData& data)
|
||||||
|
{
|
||||||
|
swap();
|
||||||
|
|
||||||
|
m_lastN = 0U;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CRewrite::processVoice(CDMRData& data)
|
void CRewrite::processVoice(CDMRData& data)
|
||||||
{
|
{
|
||||||
setLC(data.getFLCO(), data.getSrcId(), data.getDstId());
|
setLC(data.getFLCO(), data.getSrcId(), data.getDstId());
|
||||||
|
|
||||||
|
unsigned char n = data.getN();
|
||||||
|
|
||||||
|
// In case we missed a voice sync packet
|
||||||
|
if (n < m_lastN)
|
||||||
|
swap();
|
||||||
|
|
||||||
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
|
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
|
||||||
data.getData(buffer);
|
data.getData(buffer);
|
||||||
|
|
||||||
processEmbeddedData(buffer, data.getN());
|
processEmbeddedData(buffer, n);
|
||||||
|
|
||||||
data.setData(buffer);
|
data.setData(buffer);
|
||||||
|
|
||||||
|
m_lastN = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CRewrite::processDataHeader(CDMRData& data)
|
void CRewrite::processDataHeader(CDMRData& data)
|
||||||
@@ -192,6 +215,11 @@ void CRewrite::processDataHeader(CDMRData& data)
|
|||||||
data.setData(buffer);
|
data.setData(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CRewrite::processData(CDMRData& data)
|
||||||
|
{
|
||||||
|
// Nothing to do
|
||||||
|
}
|
||||||
|
|
||||||
void CRewrite::processCSBK(CDMRData& data)
|
void CRewrite::processCSBK(CDMRData& data)
|
||||||
{
|
{
|
||||||
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
|
unsigned char buffer[DMR_FRAME_LENGTH_BYTES];
|
||||||
|
|||||||
@@ -39,16 +39,19 @@ private:
|
|||||||
CDMREmbeddedData* m_data;
|
CDMREmbeddedData* m_data;
|
||||||
unsigned int m_writeNum;
|
unsigned int m_writeNum;
|
||||||
unsigned int m_readNum;
|
unsigned int m_readNum;
|
||||||
|
unsigned char m_lastN;
|
||||||
|
|
||||||
void processHeader(CDMRData& data, unsigned char dataType);
|
void processHeader(CDMRData& data, unsigned char dataType);
|
||||||
|
void processVoiceSync(CDMRData& data);
|
||||||
void processVoice(CDMRData& data);
|
void processVoice(CDMRData& data);
|
||||||
void processDataHeader(CDMRData& data);
|
void processDataHeader(CDMRData& data);
|
||||||
|
void processData(CDMRData& data);
|
||||||
void processCSBK(CDMRData& data);
|
void processCSBK(CDMRData& data);
|
||||||
void swap();
|
void swap();
|
||||||
|
|
||||||
void setLC(FLCO flco, unsigned int srcId, unsigned int dstId);
|
void setLC(FLCO flco, unsigned int srcId, unsigned int dstId);
|
||||||
|
|
||||||
unsigned char processEmbeddedData(unsigned char* data, unsigned char n);
|
void processEmbeddedData(unsigned char* data, unsigned char n);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user