mirror of
https://github.com/g4klx/DMRGateway
synced 2025-12-21 21:45:39 +08:00
Allow for excluded TGs.
This commit is contained in:
50
Conf.cpp
50
Conf.cpp
@@ -406,12 +406,16 @@ bool CConf::read()
|
||||
m_dmrNetwork1SrcRewrites.push_back(rewrite);
|
||||
}
|
||||
} else if (::strncmp(key, "TGDynRewrite", 12U) == 0) {
|
||||
std::vector<char*> p7;
|
||||
char* p1 = ::strtok(value, ", ");
|
||||
char* p2 = ::strtok(NULL, ", ");
|
||||
char* p3 = ::strtok(NULL, ", ");
|
||||
char* p4 = ::strtok(NULL, ", ");
|
||||
char* p5 = ::strtok(NULL, ", ");
|
||||
char* p6 = ::strtok(NULL, " \r\n");
|
||||
char* p6 = ::strtok(NULL, ", \r\n");
|
||||
char* p;
|
||||
while ((p = ::strtok(NULL, ", \r\n")) != NULL)
|
||||
p7.push_back(p);
|
||||
if (p1 != NULL && p2 != NULL && p3 != NULL && p4 != NULL && p5 != NULL && p6 != NULL) {
|
||||
CTGDynRewriteStruct rewrite;
|
||||
rewrite.m_slot = ::atoi(p1);
|
||||
@@ -420,6 +424,10 @@ bool CConf::read()
|
||||
rewrite.m_statusPC = ::atoi(p4);
|
||||
rewrite.m_toTG = ::atoi(p5);
|
||||
rewrite.m_range = ::atoi(p6);
|
||||
for (std::vector<char*>::const_iterator it = p7.cbegin(); it != p7.cend(); ++it) {
|
||||
unsigned int tg = ::atoi(*it);
|
||||
rewrite.m_exclTGs.push_back(tg);
|
||||
}
|
||||
m_dmrNetwork1TGDynRewrites.push_back(rewrite);
|
||||
}
|
||||
} else if (::strncmp(key, "IdRewrite", 9U) == 0) {
|
||||
@@ -518,12 +526,16 @@ bool CConf::read()
|
||||
m_dmrNetwork2SrcRewrites.push_back(rewrite);
|
||||
}
|
||||
} else if (::strncmp(key, "TGDynRewrite", 12U) == 0) {
|
||||
std::vector<char*> p7;
|
||||
char* p1 = ::strtok(value, ", ");
|
||||
char* p2 = ::strtok(NULL, ", ");
|
||||
char* p3 = ::strtok(NULL, ", ");
|
||||
char* p4 = ::strtok(NULL, ", ");
|
||||
char* p5 = ::strtok(NULL, ", ");
|
||||
char* p6 = ::strtok(NULL, " \r\n");
|
||||
char* p6 = ::strtok(NULL, ", \r\n");
|
||||
char* p;
|
||||
while ((p = ::strtok(NULL, ", \r\n")) != NULL)
|
||||
p7.push_back(p);
|
||||
if (p1 != NULL && p2 != NULL && p3 != NULL && p4 != NULL && p5 != NULL && p6 != NULL) {
|
||||
CTGDynRewriteStruct rewrite;
|
||||
rewrite.m_slot = ::atoi(p1);
|
||||
@@ -532,6 +544,10 @@ bool CConf::read()
|
||||
rewrite.m_statusPC = ::atoi(p4);
|
||||
rewrite.m_toTG = ::atoi(p5);
|
||||
rewrite.m_range = ::atoi(p6);
|
||||
for (std::vector<char*>::const_iterator it = p7.cbegin(); it != p7.cend(); ++it) {
|
||||
unsigned int tg = ::atoi(*it);
|
||||
rewrite.m_exclTGs.push_back(tg);
|
||||
}
|
||||
m_dmrNetwork2TGDynRewrites.push_back(rewrite);
|
||||
}
|
||||
} else if (::strncmp(key, "IdRewrite", 9U) == 0) {
|
||||
@@ -630,12 +646,16 @@ bool CConf::read()
|
||||
m_dmrNetwork3SrcRewrites.push_back(rewrite);
|
||||
}
|
||||
} else if (::strncmp(key, "TGDynRewrite", 12U) == 0) {
|
||||
std::vector<char*> p7;
|
||||
char* p1 = ::strtok(value, ", ");
|
||||
char* p2 = ::strtok(NULL, ", ");
|
||||
char* p3 = ::strtok(NULL, ", ");
|
||||
char* p4 = ::strtok(NULL, ", ");
|
||||
char* p5 = ::strtok(NULL, ", ");
|
||||
char* p6 = ::strtok(NULL, " \r\n");
|
||||
char* p6 = ::strtok(NULL, ", \r\n");
|
||||
char* p;
|
||||
while ((p = ::strtok(NULL, ", \r\n")) != NULL)
|
||||
p7.push_back(p);
|
||||
if (p1 != NULL && p2 != NULL && p3 != NULL && p4 != NULL && p5 != NULL && p6 != NULL) {
|
||||
CTGDynRewriteStruct rewrite;
|
||||
rewrite.m_slot = ::atoi(p1);
|
||||
@@ -644,6 +664,10 @@ bool CConf::read()
|
||||
rewrite.m_statusPC = ::atoi(p4);
|
||||
rewrite.m_toTG = ::atoi(p5);
|
||||
rewrite.m_range = ::atoi(p6);
|
||||
for (std::vector<char*>::const_iterator it = p7.cbegin(); it != p7.cend(); ++it) {
|
||||
unsigned int tg = ::atoi(*it);
|
||||
rewrite.m_exclTGs.push_back(tg);
|
||||
}
|
||||
m_dmrNetwork3TGDynRewrites.push_back(rewrite);
|
||||
}
|
||||
} else if (::strncmp(key, "IdRewrite", 9U) == 0) {
|
||||
@@ -742,12 +766,16 @@ bool CConf::read()
|
||||
m_dmrNetwork4SrcRewrites.push_back(rewrite);
|
||||
}
|
||||
} else if (::strncmp(key, "TGDynRewrite", 12U) == 0) {
|
||||
std::vector<char*> p7;
|
||||
char* p1 = ::strtok(value, ", ");
|
||||
char* p2 = ::strtok(NULL, ", ");
|
||||
char* p3 = ::strtok(NULL, ", ");
|
||||
char* p4 = ::strtok(NULL, ", ");
|
||||
char* p5 = ::strtok(NULL, ", ");
|
||||
char* p6 = ::strtok(NULL, " \r\n");
|
||||
char* p6 = ::strtok(NULL, ", \r\n");
|
||||
char* p;
|
||||
while ((p = ::strtok(NULL, ", \r\n")) != NULL)
|
||||
p7.push_back(p);
|
||||
if (p1 != NULL && p2 != NULL && p3 != NULL && p4 != NULL && p5 != NULL && p6 != NULL) {
|
||||
CTGDynRewriteStruct rewrite;
|
||||
rewrite.m_slot = ::atoi(p1);
|
||||
@@ -756,6 +784,10 @@ bool CConf::read()
|
||||
rewrite.m_statusPC = ::atoi(p4);
|
||||
rewrite.m_toTG = ::atoi(p5);
|
||||
rewrite.m_range = ::atoi(p6);
|
||||
for (std::vector<char*>::const_iterator it = p7.cbegin(); it != p7.cend(); ++it) {
|
||||
unsigned int tg = ::atoi(*it);
|
||||
rewrite.m_exclTGs.push_back(tg);
|
||||
}
|
||||
m_dmrNetwork4TGDynRewrites.push_back(rewrite);
|
||||
}
|
||||
} else if (::strncmp(key, "IdRewrite", 9U) == 0) {
|
||||
@@ -854,12 +886,16 @@ bool CConf::read()
|
||||
m_dmrNetwork5SrcRewrites.push_back(rewrite);
|
||||
}
|
||||
} else if (::strncmp(key, "TGDynRewrite", 12U) == 0) {
|
||||
std::vector<char*> p7;
|
||||
char* p1 = ::strtok(value, ", ");
|
||||
char* p2 = ::strtok(NULL, ", ");
|
||||
char* p3 = ::strtok(NULL, ", ");
|
||||
char* p4 = ::strtok(NULL, ", ");
|
||||
char* p5 = ::strtok(NULL, ", ");
|
||||
char* p6 = ::strtok(NULL, " \r\n");
|
||||
char* p6 = ::strtok(NULL, ", \r\n");
|
||||
char* p;
|
||||
while ((p = ::strtok(NULL, ", \r\n")) != NULL)
|
||||
p7.push_back(p);
|
||||
if (p1 != NULL && p2 != NULL && p3 != NULL && p4 != NULL && p5 != NULL && p6 != NULL) {
|
||||
CTGDynRewriteStruct rewrite;
|
||||
rewrite.m_slot = ::atoi(p1);
|
||||
@@ -868,6 +904,10 @@ bool CConf::read()
|
||||
rewrite.m_statusPC = ::atoi(p4);
|
||||
rewrite.m_toTG = ::atoi(p5);
|
||||
rewrite.m_range = ::atoi(p6);
|
||||
for (std::vector<char*>::const_iterator it = p7.cbegin(); it != p7.cend(); ++it) {
|
||||
unsigned int tg = ::atoi(*it);
|
||||
rewrite.m_exclTGs.push_back(tg);
|
||||
}
|
||||
m_dmrNetwork5TGDynRewrites.push_back(rewrite);
|
||||
}
|
||||
} else if (::strncmp(key, "IdRewrite", 9U) == 0) {
|
||||
|
||||
1
Conf.h
1
Conf.h
@@ -60,6 +60,7 @@ struct CTGDynRewriteStruct {
|
||||
unsigned int m_statusPC;
|
||||
unsigned int m_toTG;
|
||||
unsigned int m_range;
|
||||
std::vector<unsigned int> m_exclTGs;
|
||||
};
|
||||
|
||||
struct CIdRewriteStruct {
|
||||
|
||||
133
DMRGateway.cpp
133
DMRGateway.cpp
@@ -180,7 +180,8 @@ m_dmr1Passalls(),
|
||||
m_dmr2Passalls(),
|
||||
m_dmr3Passalls(),
|
||||
m_dmr4Passalls(),
|
||||
m_dmr5Passalls()
|
||||
m_dmr5Passalls(),
|
||||
m_dynVoices()
|
||||
{
|
||||
m_status = new DMRGW_STATUS[3U];
|
||||
m_status[1U] = DMRGWS_NONE;
|
||||
@@ -201,10 +202,10 @@ CDMRGateway::~CDMRGateway()
|
||||
delete *it;
|
||||
|
||||
for (std::vector<CRewrite*>::iterator it = m_dmr2NetRewrites.begin(); it != m_dmr2NetRewrites.end(); ++it)
|
||||
delete *it;
|
||||
delete *it;
|
||||
|
||||
for (std::vector<CRewrite*>::iterator it = m_dmr2RFRewrites.begin(); it != m_dmr2RFRewrites.end(); ++it)
|
||||
delete *it;
|
||||
delete *it;
|
||||
|
||||
for (std::vector<CRewrite*>::iterator it = m_dmr2SrcRewrites.begin(); it != m_dmr2SrcRewrites.end(); ++it)
|
||||
delete *it;
|
||||
@@ -251,6 +252,9 @@ CDMRGateway::~CDMRGateway()
|
||||
for (std::vector<CRewrite*>::iterator it = m_dmr5Passalls.begin(); it != m_dmr5Passalls.end(); ++it)
|
||||
delete *it;
|
||||
|
||||
for (std::vector<CDynVoice*>::iterator it = m_dynVoices.begin(); it != m_dynVoices.end(); ++it)
|
||||
delete* it;
|
||||
|
||||
delete m_rptRewrite;
|
||||
delete m_xlxRewrite;
|
||||
|
||||
@@ -377,8 +381,6 @@ int CDMRGateway::run()
|
||||
}
|
||||
|
||||
CXLXVoice* xlxVoice = NULL;
|
||||
CDynVoice* dynVoice = NULL;
|
||||
|
||||
if (m_conf.getVoiceEnabled()) {
|
||||
std::string language = m_conf.getVoiceLanguage();
|
||||
std::string directory = m_conf.getVoiceDirectory();
|
||||
@@ -396,41 +398,34 @@ int CDMRGateway::run()
|
||||
xlxVoice = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
dynVoice = new CDynVoice(directory, language, m_repeater->getId());
|
||||
bool ret = dynVoice->open();
|
||||
if (!ret) {
|
||||
delete dynVoice;
|
||||
dynVoice = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (m_conf.getDMRNetwork1Enabled()) {
|
||||
ret = createDMRNetwork1(dynVoice);
|
||||
ret = createDMRNetwork1();
|
||||
if (!ret)
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (m_conf.getDMRNetwork2Enabled()) {
|
||||
ret = createDMRNetwork2(dynVoice);
|
||||
ret = createDMRNetwork2();
|
||||
if (!ret)
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (m_conf.getDMRNetwork3Enabled()) {
|
||||
ret = createDMRNetwork3(dynVoice);
|
||||
ret = createDMRNetwork3();
|
||||
if (!ret)
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (m_conf.getDMRNetwork4Enabled()) {
|
||||
ret = createDMRNetwork4(dynVoice);
|
||||
ret = createDMRNetwork4();
|
||||
if (!ret)
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (m_conf.getDMRNetwork5Enabled()) {
|
||||
ret = createDMRNetwork5(dynVoice);
|
||||
ret = createDMRNetwork5();
|
||||
if (!ret)
|
||||
return 1;
|
||||
}
|
||||
@@ -1132,8 +1127,8 @@ int CDMRGateway::run()
|
||||
}
|
||||
}
|
||||
|
||||
if (dynVoice != NULL) {
|
||||
ret = dynVoice->read(data);
|
||||
for (std::vector<CDynVoice*>::iterator it = m_dynVoices.begin(); it != m_dynVoices.end(); ++it) {
|
||||
ret = (*it)->read(data);
|
||||
if (ret)
|
||||
m_repeater->write(data);
|
||||
}
|
||||
@@ -1169,8 +1164,8 @@ int CDMRGateway::run()
|
||||
if (xlxVoice != NULL)
|
||||
xlxVoice->clock(ms);
|
||||
|
||||
if (dynVoice != NULL)
|
||||
dynVoice->clock(ms);
|
||||
for (std::vector<CDynVoice*>::iterator it = m_dynVoices.begin(); it != m_dynVoices.end(); ++it)
|
||||
(*it)->clock(ms);
|
||||
|
||||
for (unsigned int i = 1U; i < 3U; i++) {
|
||||
timer[i]->clock(ms);
|
||||
@@ -1185,7 +1180,6 @@ int CDMRGateway::run()
|
||||
}
|
||||
|
||||
delete xlxVoice;
|
||||
delete dynVoice;
|
||||
|
||||
m_repeater->close();
|
||||
delete m_repeater;
|
||||
@@ -1254,7 +1248,7 @@ bool CDMRGateway::createMMDVM()
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CDMRGateway::createDMRNetwork1(CDynVoice* voice)
|
||||
bool CDMRGateway::createDMRNetwork1()
|
||||
{
|
||||
std::string address = m_conf.getDMRNetwork1Address();
|
||||
unsigned int port = m_conf.getDMRNetwork1Port();
|
||||
@@ -1360,8 +1354,23 @@ bool CDMRGateway::createDMRNetwork1(CDynVoice* voice)
|
||||
for (std::vector<CTGDynRewriteStruct>::const_iterator it = dynRewrites.begin(); it != dynRewrites.end(); ++it) {
|
||||
LogInfo(" Dyn Rewrite: %u:TG%u-%u:TG%u <-> %u:TG%u (disc %u:%u) (status %u:%u)", (*it).m_slot, (*it).m_fromTG, (*it).m_slot, (*it).m_fromTG + (*it).m_range - 1U, (*it).m_slot, (*it).m_toTG, (*it).m_slot, (*it).m_discPC, (*it).m_slot, (*it).m_statusPC);
|
||||
|
||||
CDynVoice* voice = NULL;
|
||||
if (m_conf.getVoiceEnabled()) {
|
||||
std::string language = m_conf.getVoiceLanguage();
|
||||
std::string directory = m_conf.getVoiceDirectory();
|
||||
|
||||
voice = new CDynVoice(directory, language, m_repeater->getId(), (*it).m_slot, (*it).m_toTG);
|
||||
bool ret = voice->open();
|
||||
if (!ret) {
|
||||
delete voice;
|
||||
voice = NULL;
|
||||
} else {
|
||||
m_dynVoices.push_back(voice);
|
||||
}
|
||||
}
|
||||
|
||||
CRewriteDynTGNet* netRewriteDynTG = new CRewriteDynTGNet(m_dmr1Name, (*it).m_slot, (*it).m_toTG);
|
||||
CRewriteDynTGRF* rfRewriteDynTG = new CRewriteDynTGRF(m_dmr1Name, (*it).m_slot, (*it).m_fromTG, (*it).m_toTG, (*it).m_discPC, (*it).m_statusPC, (*it).m_range, netRewriteDynTG, voice);
|
||||
CRewriteDynTGRF* rfRewriteDynTG = new CRewriteDynTGRF(m_dmr1Name, (*it).m_slot, (*it).m_fromTG, (*it).m_toTG, (*it).m_discPC, (*it).m_statusPC, (*it).m_range, (*it).m_exclTGs, netRewriteDynTG, voice);
|
||||
|
||||
m_dmr1RFRewrites.push_back(rfRewriteDynTG);
|
||||
m_dmr1NetRewrites.push_back(netRewriteDynTG);
|
||||
@@ -1403,7 +1412,7 @@ bool CDMRGateway::createDMRNetwork1(CDynVoice* voice)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CDMRGateway::createDMRNetwork2(CDynVoice* voice)
|
||||
bool CDMRGateway::createDMRNetwork2()
|
||||
{
|
||||
std::string address = m_conf.getDMRNetwork2Address();
|
||||
unsigned int port = m_conf.getDMRNetwork2Port();
|
||||
@@ -1509,8 +1518,23 @@ bool CDMRGateway::createDMRNetwork2(CDynVoice* voice)
|
||||
for (std::vector<CTGDynRewriteStruct>::const_iterator it = dynRewrites.begin(); it != dynRewrites.end(); ++it) {
|
||||
LogInfo(" Dyn Rewrite: %u:TG%u-%u:TG%u <-> %u:TG%u (disc %u:%u) (status %u:%u)", (*it).m_slot, (*it).m_fromTG, (*it).m_slot, (*it).m_fromTG + (*it).m_range - 1U, (*it).m_slot, (*it).m_toTG, (*it).m_slot, (*it).m_discPC, (*it).m_slot, (*it).m_statusPC);
|
||||
|
||||
CDynVoice* voice = NULL;
|
||||
if (m_conf.getVoiceEnabled()) {
|
||||
std::string language = m_conf.getVoiceLanguage();
|
||||
std::string directory = m_conf.getVoiceDirectory();
|
||||
|
||||
voice = new CDynVoice(directory, language, m_repeater->getId(), (*it).m_slot, (*it).m_toTG);
|
||||
bool ret = voice->open();
|
||||
if (!ret) {
|
||||
delete voice;
|
||||
voice = NULL;
|
||||
} else {
|
||||
m_dynVoices.push_back(voice);
|
||||
}
|
||||
}
|
||||
|
||||
CRewriteDynTGNet* netRewriteDynTG = new CRewriteDynTGNet(m_dmr2Name, (*it).m_slot, (*it).m_toTG);
|
||||
CRewriteDynTGRF* rfRewriteDynTG = new CRewriteDynTGRF(m_dmr2Name, (*it).m_slot, (*it).m_fromTG, (*it).m_toTG, (*it).m_discPC, (*it).m_statusPC, (*it).m_range, netRewriteDynTG, voice);
|
||||
CRewriteDynTGRF* rfRewriteDynTG = new CRewriteDynTGRF(m_dmr2Name, (*it).m_slot, (*it).m_fromTG, (*it).m_toTG, (*it).m_discPC, (*it).m_statusPC, (*it).m_range, (*it).m_exclTGs, netRewriteDynTG, voice);
|
||||
|
||||
m_dmr2RFRewrites.push_back(rfRewriteDynTG);
|
||||
m_dmr2NetRewrites.push_back(netRewriteDynTG);
|
||||
@@ -1552,7 +1576,7 @@ bool CDMRGateway::createDMRNetwork2(CDynVoice* voice)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CDMRGateway::createDMRNetwork3(CDynVoice* voice)
|
||||
bool CDMRGateway::createDMRNetwork3()
|
||||
{
|
||||
std::string address = m_conf.getDMRNetwork3Address();
|
||||
unsigned int port = m_conf.getDMRNetwork3Port();
|
||||
@@ -1658,8 +1682,23 @@ bool CDMRGateway::createDMRNetwork3(CDynVoice* voice)
|
||||
for (std::vector<CTGDynRewriteStruct>::const_iterator it = dynRewrites.begin(); it != dynRewrites.end(); ++it) {
|
||||
LogInfo(" Dyn Rewrite: %u:TG%u-%u:TG%u <-> %u:TG%u (disc %u:%u) (status %u:%u)", (*it).m_slot, (*it).m_fromTG, (*it).m_slot, (*it).m_fromTG + (*it).m_range - 1U, (*it).m_slot, (*it).m_toTG, (*it).m_slot, (*it).m_discPC, (*it).m_slot, (*it).m_statusPC);
|
||||
|
||||
CDynVoice* voice = NULL;
|
||||
if (m_conf.getVoiceEnabled()) {
|
||||
std::string language = m_conf.getVoiceLanguage();
|
||||
std::string directory = m_conf.getVoiceDirectory();
|
||||
|
||||
voice = new CDynVoice(directory, language, m_repeater->getId(), (*it).m_slot, (*it).m_toTG);
|
||||
bool ret = voice->open();
|
||||
if (!ret) {
|
||||
delete voice;
|
||||
voice = NULL;
|
||||
} else {
|
||||
m_dynVoices.push_back(voice);
|
||||
}
|
||||
}
|
||||
|
||||
CRewriteDynTGNet* netRewriteDynTG = new CRewriteDynTGNet(m_dmr3Name, (*it).m_slot, (*it).m_toTG);
|
||||
CRewriteDynTGRF* rfRewriteDynTG = new CRewriteDynTGRF(m_dmr3Name, (*it).m_slot, (*it).m_fromTG, (*it).m_toTG, (*it).m_discPC, (*it).m_statusPC, (*it).m_range, netRewriteDynTG, voice);
|
||||
CRewriteDynTGRF* rfRewriteDynTG = new CRewriteDynTGRF(m_dmr3Name, (*it).m_slot, (*it).m_fromTG, (*it).m_toTG, (*it).m_discPC, (*it).m_statusPC, (*it).m_range, (*it).m_exclTGs, netRewriteDynTG, voice);
|
||||
|
||||
m_dmr3RFRewrites.push_back(rfRewriteDynTG);
|
||||
m_dmr3NetRewrites.push_back(netRewriteDynTG);
|
||||
@@ -1701,7 +1740,7 @@ bool CDMRGateway::createDMRNetwork3(CDynVoice* voice)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CDMRGateway::createDMRNetwork4(CDynVoice* voice)
|
||||
bool CDMRGateway::createDMRNetwork4()
|
||||
{
|
||||
std::string address = m_conf.getDMRNetwork4Address();
|
||||
unsigned int port = m_conf.getDMRNetwork4Port();
|
||||
@@ -1807,8 +1846,23 @@ bool CDMRGateway::createDMRNetwork4(CDynVoice* voice)
|
||||
for (std::vector<CTGDynRewriteStruct>::const_iterator it = dynRewrites.begin(); it != dynRewrites.end(); ++it) {
|
||||
LogInfo(" Dyn Rewrite: %u:TG%u-%u:TG%u <-> %u:TG%u (disc %u:%u) (status %u:%u)", (*it).m_slot, (*it).m_fromTG, (*it).m_slot, (*it).m_fromTG + (*it).m_range - 1U, (*it).m_slot, (*it).m_toTG, (*it).m_slot, (*it).m_discPC, (*it).m_slot, (*it).m_statusPC);
|
||||
|
||||
CDynVoice* voice = NULL;
|
||||
if (m_conf.getVoiceEnabled()) {
|
||||
std::string language = m_conf.getVoiceLanguage();
|
||||
std::string directory = m_conf.getVoiceDirectory();
|
||||
|
||||
voice = new CDynVoice(directory, language, m_repeater->getId(), (*it).m_slot, (*it).m_toTG);
|
||||
bool ret = voice->open();
|
||||
if (!ret) {
|
||||
delete voice;
|
||||
voice = NULL;
|
||||
} else {
|
||||
m_dynVoices.push_back(voice);
|
||||
}
|
||||
}
|
||||
|
||||
CRewriteDynTGNet* netRewriteDynTG = new CRewriteDynTGNet(m_dmr4Name, (*it).m_slot, (*it).m_toTG);
|
||||
CRewriteDynTGRF* rfRewriteDynTG = new CRewriteDynTGRF(m_dmr4Name, (*it).m_slot, (*it).m_fromTG, (*it).m_toTG, (*it).m_discPC, (*it).m_statusPC, (*it).m_range, netRewriteDynTG, voice);
|
||||
CRewriteDynTGRF* rfRewriteDynTG = new CRewriteDynTGRF(m_dmr4Name, (*it).m_slot, (*it).m_fromTG, (*it).m_toTG, (*it).m_discPC, (*it).m_statusPC, (*it).m_range, (*it).m_exclTGs, netRewriteDynTG, voice);
|
||||
|
||||
m_dmr4RFRewrites.push_back(rfRewriteDynTG);
|
||||
m_dmr4NetRewrites.push_back(netRewriteDynTG);
|
||||
@@ -1850,7 +1904,7 @@ bool CDMRGateway::createDMRNetwork4(CDynVoice* voice)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CDMRGateway::createDMRNetwork5(CDynVoice* voice)
|
||||
bool CDMRGateway::createDMRNetwork5()
|
||||
{
|
||||
std::string address = m_conf.getDMRNetwork5Address();
|
||||
unsigned int port = m_conf.getDMRNetwork5Port();
|
||||
@@ -1956,8 +2010,23 @@ bool CDMRGateway::createDMRNetwork5(CDynVoice* voice)
|
||||
for (std::vector<CTGDynRewriteStruct>::const_iterator it = dynRewrites.begin(); it != dynRewrites.end(); ++it) {
|
||||
LogInfo(" Dyn Rewrite: %u:TG%u-%u:TG%u <-> %u:TG%u (disc %u:%u) (status %u:%u)", (*it).m_slot, (*it).m_fromTG, (*it).m_slot, (*it).m_fromTG + (*it).m_range - 1U, (*it).m_slot, (*it).m_toTG, (*it).m_slot, (*it).m_discPC, (*it).m_slot, (*it).m_statusPC);
|
||||
|
||||
CDynVoice* voice = NULL;
|
||||
if (m_conf.getVoiceEnabled()) {
|
||||
std::string language = m_conf.getVoiceLanguage();
|
||||
std::string directory = m_conf.getVoiceDirectory();
|
||||
|
||||
voice = new CDynVoice(directory, language, m_repeater->getId(), (*it).m_slot, (*it).m_toTG);
|
||||
bool ret = voice->open();
|
||||
if (!ret) {
|
||||
delete voice;
|
||||
voice = NULL;
|
||||
} else {
|
||||
m_dynVoices.push_back(voice);
|
||||
}
|
||||
}
|
||||
|
||||
CRewriteDynTGNet* netRewriteDynTG = new CRewriteDynTGNet(m_dmr5Name, (*it).m_slot, (*it).m_toTG);
|
||||
CRewriteDynTGRF* rfRewriteDynTG = new CRewriteDynTGRF(m_dmr5Name, (*it).m_slot, (*it).m_fromTG, (*it).m_toTG, (*it).m_discPC, (*it).m_statusPC, (*it).m_range, netRewriteDynTG, voice);
|
||||
CRewriteDynTGRF* rfRewriteDynTG = new CRewriteDynTGRF(m_dmr5Name, (*it).m_slot, (*it).m_fromTG, (*it).m_toTG, (*it).m_discPC, (*it).m_statusPC, (*it).m_range, (*it).m_exclTGs, netRewriteDynTG, voice);
|
||||
|
||||
m_dmr5RFRewrites.push_back(rfRewriteDynTG);
|
||||
m_dmr5NetRewrites.push_back(netRewriteDynTG);
|
||||
|
||||
11
DMRGateway.h
11
DMRGateway.h
@@ -105,13 +105,14 @@ private:
|
||||
std::vector<CRewrite*> m_dmr3Passalls;
|
||||
std::vector<CRewrite*> m_dmr4Passalls;
|
||||
std::vector<CRewrite*> m_dmr5Passalls;
|
||||
std::vector<CDynVoice*> m_dynVoices;
|
||||
|
||||
bool createMMDVM();
|
||||
bool createDMRNetwork1(CDynVoice* voice);
|
||||
bool createDMRNetwork2(CDynVoice* voice);
|
||||
bool createDMRNetwork3(CDynVoice* voice);
|
||||
bool createDMRNetwork4(CDynVoice* voice);
|
||||
bool createDMRNetwork5(CDynVoice* voice);
|
||||
bool createDMRNetwork1();
|
||||
bool createDMRNetwork2();
|
||||
bool createDMRNetwork3();
|
||||
bool createDMRNetwork4();
|
||||
bool createDMRNetwork5();
|
||||
bool createXLXNetwork();
|
||||
|
||||
bool linkXLX(unsigned int number);
|
||||
|
||||
@@ -70,8 +70,8 @@ TypeRewrite=1,9990,1,9990
|
||||
SrcRewrite=1,9990,1,9990,1
|
||||
# Reflector status returns
|
||||
SrcRewrite=2,4000,2,9,1001
|
||||
# Dynamic rewriting of slot 2 TGs 23500-23599 to TG9 to emulate reflector behaviour
|
||||
TGDynRewrite=2,23500,4000,5000,9,100
|
||||
# Dynamic rewriting of slot 2 TGs 90-999999 to TG9 to emulate reflector behaviour
|
||||
TGDynRewrite=2,90,4000,5000,9,999909,4000,5000,9900
|
||||
# Pass all of the other private traffic on slot 1 and slot 2
|
||||
PassAllPC=1
|
||||
PassAllPC=2
|
||||
|
||||
21
DynVoice.cpp
21
DynVoice.cpp
@@ -35,11 +35,11 @@ const unsigned char COLOR_CODE = 3U;
|
||||
const unsigned int SILENCE_LENGTH = 9U;
|
||||
const unsigned int AMBE_LENGTH = 9U;
|
||||
|
||||
CDynVoice::CDynVoice(const std::string& directory, const std::string& language, unsigned int id) :
|
||||
CDynVoice::CDynVoice(const std::string& directory, const std::string& language, unsigned int id, unsigned int slot, unsigned int tg) :
|
||||
m_indxFile(),
|
||||
m_ambeFile(),
|
||||
m_id(id),
|
||||
m_slot(0U),
|
||||
m_slot(slot),
|
||||
m_lc(),
|
||||
m_embeddedLC(),
|
||||
m_status(DYNVS_NONE),
|
||||
@@ -60,6 +60,12 @@ m_it()
|
||||
m_indxFile = directory + "/" + language + ".indx";
|
||||
m_ambeFile = directory + "/" + language + ".ambe";
|
||||
#endif
|
||||
|
||||
m_lc.setFLCO(FLCO_GROUP);
|
||||
m_lc.setSrcId(id);
|
||||
m_lc.setDstId(tg);
|
||||
|
||||
m_embeddedLC.setLC(m_lc);
|
||||
}
|
||||
|
||||
CDynVoice::~CDynVoice()
|
||||
@@ -76,17 +82,6 @@ CDynVoice::~CDynVoice()
|
||||
delete[] m_ambe;
|
||||
}
|
||||
|
||||
void CDynVoice::setSlotAndTG(unsigned int slot, unsigned int tg)
|
||||
{
|
||||
m_slot = slot;
|
||||
|
||||
m_lc.setFLCO(FLCO_GROUP);
|
||||
m_lc.setSrcId(m_id);
|
||||
m_lc.setDstId(tg);
|
||||
|
||||
m_embeddedLC.setLC(m_lc);
|
||||
}
|
||||
|
||||
bool CDynVoice::open()
|
||||
{
|
||||
FILE* fpindx = ::fopen(m_indxFile.c_str(), "rt");
|
||||
|
||||
@@ -42,11 +42,9 @@ struct CDynPositions {
|
||||
|
||||
class CDynVoice {
|
||||
public:
|
||||
CDynVoice(const std::string& directory, const std::string& language, unsigned int id);
|
||||
CDynVoice(const std::string& directory, const std::string& language, unsigned int id, unsigned int slot, unsigned int tg);
|
||||
~CDynVoice();
|
||||
|
||||
void setSlotAndTG(unsigned int slot, unsigned int tg);
|
||||
|
||||
bool open();
|
||||
|
||||
void linkedTo(unsigned int number);
|
||||
|
||||
@@ -23,8 +23,9 @@
|
||||
|
||||
#include <cstdio>
|
||||
#include <cassert>
|
||||
#include <algorithm>
|
||||
|
||||
CRewriteDynTGRF::CRewriteDynTGRF(const std::string& name, unsigned int slot, unsigned int fromTG, unsigned int toTG, unsigned int discPC, unsigned int statusPC, unsigned int range, CRewriteDynTGNet* rewriteNet, CDynVoice* voice) :
|
||||
CRewriteDynTGRF::CRewriteDynTGRF(const std::string& name, unsigned int slot, unsigned int fromTG, unsigned int toTG, unsigned int discPC, unsigned int statusPC, unsigned int range, const std::vector<unsigned int>& exclTGs, CRewriteDynTGNet* rewriteNet, CDynVoice* voice) :
|
||||
CRewrite(),
|
||||
m_name(name),
|
||||
m_slot(slot),
|
||||
@@ -33,15 +34,13 @@ m_fromTGEnd(fromTG + range - 1U),
|
||||
m_toTG(toTG),
|
||||
m_discPC(discPC),
|
||||
m_statusPC(statusPC),
|
||||
m_exclTGs(exclTGs),
|
||||
m_rewriteNet(rewriteNet),
|
||||
m_voice(voice),
|
||||
m_currentTG(0U)
|
||||
{
|
||||
assert(slot == 1U || slot == 2U);
|
||||
assert(rewriteNet != NULL);
|
||||
|
||||
if (voice != NULL)
|
||||
voice->setSlotAndTG(slot, toTG);
|
||||
}
|
||||
|
||||
CRewriteDynTGRF::~CRewriteDynTGRF()
|
||||
@@ -66,6 +65,13 @@ PROCESS_RESULT CRewriteDynTGRF::process(CDMRData& data, bool trace)
|
||||
return RESULT_MATCHED;
|
||||
}
|
||||
|
||||
if (flco == FLCO_GROUP && std::find(m_exclTGs.cbegin(), m_exclTGs.cend(), dstId) != m_exclTGs.cend()) {
|
||||
if (trace)
|
||||
LogDebug("Rule Trace,\tRewriteDynTGRF from %s Slot=%u Dst=TG%u: not matched", m_name.c_str(), m_slot, dstId);
|
||||
|
||||
return RESULT_UNMATCHED;
|
||||
}
|
||||
|
||||
if (flco == FLCO_USER_USER && slotNo == m_slot && dstId == m_discPC && m_currentTG != 0U) {
|
||||
if (trace)
|
||||
LogDebug("Rule Trace,\tRewriteDynTGRF from %s Slot=%u Dst=%u: matched", m_name.c_str(), m_slot, m_discPC);
|
||||
|
||||
@@ -26,10 +26,11 @@
|
||||
#include "RewriteDynTGNet.h"
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
class CRewriteDynTGRF : public CRewrite {
|
||||
public:
|
||||
CRewriteDynTGRF(const std::string& name, unsigned int slot, unsigned int fromTG, unsigned int toTG, unsigned int discPC, unsigned int statusPC, unsigned int range, CRewriteDynTGNet* rewriteNet, CDynVoice* voice);
|
||||
CRewriteDynTGRF(const std::string& name, unsigned int slot, unsigned int fromTG, unsigned int toTG, unsigned int discPC, unsigned int statusPC, unsigned int range, const std::vector<unsigned int>& exclTGs, CRewriteDynTGNet* rewriteNet, CDynVoice* voice);
|
||||
virtual ~CRewriteDynTGRF();
|
||||
|
||||
virtual PROCESS_RESULT process(CDMRData& data, bool trace);
|
||||
@@ -42,6 +43,7 @@ private:
|
||||
unsigned int m_toTG;
|
||||
unsigned int m_discPC;
|
||||
unsigned int m_statusPC;
|
||||
std::vector<unsigned int> m_exclTGs;
|
||||
CRewriteDynTGNet* m_rewriteNet;
|
||||
CDynVoice* m_voice;
|
||||
unsigned int m_currentTG;
|
||||
|
||||
Reference in New Issue
Block a user