#20 one socket per repetaer (fixes time not sent on multi band repeaters)

pull/32/head
Geoffrey Merck 4 years ago
parent 263d5e83bf
commit a009e094ab

@ -38,15 +38,14 @@ const unsigned int SILENCE_LENGTH = 10U;
CTimeServerThread::CTimeServerThread() : CTimeServerThread::CTimeServerThread() :
CThread("Time Server"), CThread("Time Server"),
m_socket("", 0U),
m_callsign(), m_callsign(),
m_callsignA(), m_callsignA(),
m_callsignB(), m_callsignB(),
m_callsignC(), m_callsignC(),
m_callsignD(), m_callsignD(),
m_callsignE(),
m_callsignG(), m_callsignG(),
m_address(), m_address(),
m_addressStr(),
m_language(LANG_ENGLISH_UK_1), m_language(LANG_ENGLISH_UK_1),
m_format(FORMAT_VOICE_TIME), m_format(FORMAT_VOICE_TIME),
m_interval(INTERVAL_15MINS), m_interval(INTERVAL_15MINS),
@ -81,7 +80,7 @@ CTimeServerThread::~CTimeServerThread()
void * CTimeServerThread::Entry() void * CTimeServerThread::Entry()
{ {
// Wait here until we have the essentials to run // Wait here until we have the essentials to run
while (!m_killed && m_address.s_addr == INADDR_NONE && m_callsignA.empty() && m_callsignB.empty() && m_callsignC.empty() && m_callsignD.empty() && m_callsignE.empty()) while (!m_killed && m_address.s_addr == INADDR_NONE && m_callsignA.empty() && m_callsignB.empty() && m_callsignC.empty() && m_callsignD.empty())
Sleep(500UL); // 1/2 sec Sleep(500UL); // 1/2 sec
if (m_killed) if (m_killed)
@ -127,8 +126,6 @@ void * CTimeServerThread::Entry()
CLog::logInfo(("Stopping the Time Server thread")); CLog::logInfo(("Stopping the Time Server thread"));
m_socket.close();
return nullptr; return nullptr;
} }
@ -163,13 +160,10 @@ bool CTimeServerThread::setGateway(const std::string& callsign, const std::strin
m_callsign.push_back(' '); m_callsign.push_back(' ');
m_addressStr.assign(address);
m_address = CUDPReaderWriter::lookup(address); m_address = CUDPReaderWriter::lookup(address);
m_dataPath.assign(dataPath); m_dataPath.assign(dataPath);
bool ret = m_socket.open();
if (!ret)
return false;
return true; return true;
} }
@ -1192,7 +1186,6 @@ bool CTimeServerThread::send(const std::vector<std::string> &words, unsigned int
unsigned int idB = CHeaderData::createId(); unsigned int idB = CHeaderData::createId();
unsigned int idC = CHeaderData::createId(); unsigned int idC = CHeaderData::createId();
unsigned int idD = CHeaderData::createId(); unsigned int idD = CHeaderData::createId();
unsigned int idE = CHeaderData::createId();
CHeaderData header; CHeaderData header;
header.setMyCall1(m_callsign); header.setMyCall1(m_callsign);
@ -1328,41 +1321,48 @@ bool CTimeServerThread::send(const std::vector<std::string> &words, unsigned int
return false; return false;
} }
CUDPReaderWriter * socketA = nullptr;
CUDPReaderWriter * socketB = nullptr;
CUDPReaderWriter * socketC = nullptr;
CUDPReaderWriter * socketD = nullptr;
if (!m_callsignA.empty()) { if (!m_callsignA.empty()) {
socketA = new CUDPReaderWriter("", 0U);
socketA->open();
header.setRptCall2(m_callsignA); header.setRptCall2(m_callsignA);
header.setId(idA); header.setId(idA);
sendHeader(header); sendHeader(*socketA, header);
} }
if (!m_callsignB.empty()) { if (!m_callsignB.empty()) {
socketB = new CUDPReaderWriter("", 0U);
socketB->open();
header.setRptCall2(m_callsignB); header.setRptCall2(m_callsignB);
header.setId(idB); header.setId(idB);
sendHeader(header); sendHeader(*socketB, header);
} }
if (!m_callsignC.empty()) { if (!m_callsignC.empty()) {
socketC = new CUDPReaderWriter("", 0U);
socketC->open();
header.setRptCall2(m_callsignC); header.setRptCall2(m_callsignC);
header.setId(idC); header.setId(idC);
sendHeader(header); sendHeader(*socketC, header);
} }
if (!m_callsignD.empty()) { if (!m_callsignD.empty()) {
socketD = new CUDPReaderWriter("", 0U);
socketD->open();
header.setRptCall2(m_callsignD); header.setRptCall2(m_callsignD);
header.setId(idD); header.setId(idD);
sendHeader(header); sendHeader(*socketD, header);
}
if (!m_callsignE.empty()) {
header.setRptCall2(m_callsignE);
header.setId(idE);
sendHeader(header);
} }
bool loop = true;
unsigned int out = 0U; unsigned int out = 0U;
auto start = std::chrono::high_resolution_clock::now(); auto start = std::chrono::high_resolution_clock::now();
for (;;) { for (;loop;) {
unsigned int needed = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - start).count(); unsigned int needed = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - start).count();
needed /= DSTAR_FRAME_TIME_MS; needed /= DSTAR_FRAME_TIME_MS;
@ -1373,40 +1373,56 @@ bool CTimeServerThread::send(const std::vector<std::string> &words, unsigned int
if (!m_callsignA.empty()) { if (!m_callsignA.empty()) {
data->setId(idA); data->setId(idA);
sendData(*data); sendData(*socketA, *data);
} }
if (!m_callsignB.empty()) { if (!m_callsignB.empty()) {
data->setId(idB); data->setId(idB);
sendData(*data); sendData(*socketB, *data);
} }
if (!m_callsignC.empty()) { if (!m_callsignC.empty()) {
data->setId(idC); data->setId(idC);
sendData(*data); sendData(*socketC, *data);
} }
if (!m_callsignD.empty()) { if (!m_callsignD.empty()) {
data->setId(idD); data->setId(idD);
sendData(*data); sendData(*socketD, *data);
}
if (!m_callsignE.empty()) {
data->setId(idE);
sendData(*data);
} }
delete data; delete data;
if (m_in == out) if (m_in == out) {
return true; loop = false;
break;
}
} }
Sleep(10UL); Sleep(10UL);
} }
if(socketA != nullptr) {
socketA->close();
delete socketA;
}
if(socketB != nullptr) {
socketB->close();
delete socketB;
}
if(socketC != nullptr) {
socketC->close();
delete socketC;
}
if(socketD != nullptr) {
socketD->close();
delete socketD;
}
return true;
} }
bool CTimeServerThread::sendHeader(const CHeaderData &header) bool CTimeServerThread::sendHeader(CUDPReaderWriter& socket, const CHeaderData &header)
{ {
unsigned char buffer[60U]; unsigned char buffer[60U];
unsigned int length = header.getG2Data(buffer, 60U, true); unsigned int length = header.getG2Data(buffer, 60U, true);
@ -1416,7 +1432,7 @@ bool CTimeServerThread::sendHeader(const CHeaderData &header)
return true; return true;
#else #else
for (unsigned int i = 0U; i < 5U; i++) { for (unsigned int i = 0U; i < 5U; i++) {
bool res = m_socket.write(buffer, length, header.getYourAddress(), header.getYourPort()); bool res = socket.write(buffer, length, header.getYourAddress(), header.getYourPort());
if (!res) if (!res)
return false; return false;
} }
@ -1425,7 +1441,7 @@ bool CTimeServerThread::sendHeader(const CHeaderData &header)
#endif #endif
} }
bool CTimeServerThread::sendData(const CAMBEData& data) bool CTimeServerThread::sendData(CUDPReaderWriter& socket, const CAMBEData& data)
{ {
unsigned char buffer[40U]; unsigned char buffer[40U];
unsigned int length = data.getG2Data(buffer, 40U); unsigned int length = data.getG2Data(buffer, 40U);
@ -1434,6 +1450,6 @@ bool CTimeServerThread::sendData(const CAMBEData& data)
CUtils::dump(("Sending Data"), buffer, length); CUtils::dump(("Sending Data"), buffer, length);
return true; return true;
#else #else
return m_socket.write(buffer, length, data.getYourAddress(), data.getYourPort()); return socket.write(buffer, length, data.getYourAddress(), data.getYourPort());
#endif #endif
} }

@ -72,15 +72,14 @@ public:
void kill(); void kill();
private: private:
CUDPReaderWriter m_socket;
std::string m_callsign; std::string m_callsign;
std::string m_callsignA; std::string m_callsignA;
std::string m_callsignB; std::string m_callsignB;
std::string m_callsignC; std::string m_callsignC;
std::string m_callsignD; std::string m_callsignD;
std::string m_callsignE;
std::string m_callsignG; std::string m_callsignG;
in_addr m_address; in_addr m_address;
std::string m_addressStr;
LANGUAGE m_language; LANGUAGE m_language;
FORMAT m_format; FORMAT m_format;
INTERVAL m_interval; INTERVAL m_interval;
@ -110,8 +109,8 @@ private:
std::vector<std::string> sendTimePtPT(unsigned int hour, unsigned int min); std::vector<std::string> sendTimePtPT(unsigned int hour, unsigned int min);
bool send(const std::vector<std::string>& words, unsigned int hour, unsigned int min); bool send(const std::vector<std::string>& words, unsigned int hour, unsigned int min);
bool sendHeader(const CHeaderData& header); bool sendHeader(CUDPReaderWriter& socket, const CHeaderData& header);
bool sendData(const CAMBEData& data); bool sendData(CUDPReaderWriter& socket, const CAMBEData& data);
bool loadAMBE(); bool loadAMBE();
bool readAMBE(const std::string& dir, const std::string& name); bool readAMBE(const std::string& dir, const std::string& name);

Loading…
Cancel
Save

Powered by TurnKey Linux.