Add extern dynamic TG control via UDP.

This commit is contained in:
Jonathan Naylor
2020-04-13 14:15:21 +01:00
parent 55af548e6d
commit 42afea8527
8 changed files with 129 additions and 6 deletions

View File

@@ -24,8 +24,6 @@
#include "RewritePC.h"
#include "RewriteSrcId.h"
#include "RewriteDstId.h"
#include "RewriteDynTGNet.h"
#include "RewriteDynTGRF.h"
#include "PassAllPC.h"
#include "PassAllTG.h"
#include "DMRFullLC.h"
@@ -181,7 +179,9 @@ m_dmr2Passalls(),
m_dmr3Passalls(),
m_dmr4Passalls(),
m_dmr5Passalls(),
m_dynVoices()
m_dynVoices(),
m_dynRF(),
m_socket(NULL)
{
m_status = new DMRGW_STATUS[3U];
m_status[1U] = DMRGWS_NONE;
@@ -430,6 +430,12 @@ int CDMRGateway::run()
return 1;
}
if (m_conf.getDynamicTGControlEnabled()) {
bool ret = createDynamicTGControl();
if (!ret)
return 1;
}
unsigned int rfTimeout = m_conf.getRFTimeout();
unsigned int netTimeout = m_conf.getNetTimeout();
@@ -1133,6 +1139,9 @@ int CDMRGateway::run()
m_repeater->write(data);
}
if (m_socket != NULL)
processDynamicTGControl();
unsigned int ms = stopWatch.elapsed();
stopWatch.start();
@@ -1214,6 +1223,11 @@ int CDMRGateway::run()
delete m_xlxNetwork;
}
if (m_socket != NULL) {
m_socket->close();
delete m_socket;
}
delete timer[1U];
delete timer[2U];
@@ -1377,6 +1391,7 @@ bool CDMRGateway::createDMRNetwork1()
m_dmr1RFRewrites.push_back(rfRewriteDynTG);
m_dmr1NetRewrites.push_back(netRewriteDynTG);
m_dynRF.push_back(rfRewriteDynTG);
}
std::vector<CIdRewriteStruct> idRewrites = m_conf.getDMRNetwork1IdRewrites();
@@ -1544,6 +1559,7 @@ bool CDMRGateway::createDMRNetwork2()
m_dmr2RFRewrites.push_back(rfRewriteDynTG);
m_dmr2NetRewrites.push_back(netRewriteDynTG);
m_dynRF.push_back(rfRewriteDynTG);
}
std::vector<CIdRewriteStruct> idRewrites = m_conf.getDMRNetwork2IdRewrites();
@@ -1711,6 +1727,7 @@ bool CDMRGateway::createDMRNetwork3()
m_dmr3RFRewrites.push_back(rfRewriteDynTG);
m_dmr3NetRewrites.push_back(netRewriteDynTG);
m_dynRF.push_back(rfRewriteDynTG);
}
std::vector<CIdRewriteStruct> idRewrites = m_conf.getDMRNetwork3IdRewrites();
@@ -1878,6 +1895,7 @@ bool CDMRGateway::createDMRNetwork4()
m_dmr4RFRewrites.push_back(rfRewriteDynTG);
m_dmr4NetRewrites.push_back(netRewriteDynTG);
m_dynRF.push_back(rfRewriteDynTG);
}
std::vector<CIdRewriteStruct> idRewrites = m_conf.getDMRNetwork4IdRewrites();
@@ -2045,6 +2063,7 @@ bool CDMRGateway::createDMRNetwork5()
m_dmr5RFRewrites.push_back(rfRewriteDynTG);
m_dmr5NetRewrites.push_back(netRewriteDynTG);
m_dynRF.push_back(rfRewriteDynTG);
}
std::vector<CIdRewriteStruct> idRewrites = m_conf.getDMRNetwork5IdRewrites();
@@ -2153,6 +2172,22 @@ bool CDMRGateway::createXLXNetwork()
return true;
}
bool CDMRGateway::createDynamicTGControl()
{
unsigned int port = m_conf.getDynamicTGControlPort();
m_socket = new CUDPSocket(port);
bool ret = m_socket->open();
if (!ret) {
delete m_socket;
m_socket = NULL;
return false;
}
return true;
}
bool CDMRGateway::linkXLX(unsigned int number)
{
CReflector* reflector = m_xlxReflectors->find(number);
@@ -2395,3 +2430,34 @@ void CDMRGateway::processHomePosition()
if (m_dmrNetwork5 != NULL)
m_dmrNetwork5->writeHomePosition(buffer, length);
}
void CDMRGateway::processDynamicTGControl()
{
unsigned char buffer[100U];
in_addr address;
unsigned int port;
int len = m_socket->read(buffer, 100U, address, port);
if (len <= 0)
return;
buffer[len] = '\0';
if (::memcmp(buffer + 0U, "DynTG", 5U) == 0) {
char* pSlot = ::strtok((char*)(buffer + 5U), ", \r\n");
char* pTG = ::strtok(NULL, ", \r\n");
if (pSlot == NULL || pTG == NULL) {
LogWarning("Malformed dynamic TG control message");
return;
}
unsigned int slot = (unsigned int)::atoi(pSlot);
unsigned int tg = (unsigned int)::atoi(pTG);
for (std::vector<CRewriteDynTGRF*>::iterator it = m_dynRF.begin(); it != m_dynRF.end(); ++it)
(*it)->tgChange(slot, tg);
} else {
LogWarning("Unknown dynamic TG control message: %s", buffer);
}
}