From 9a691eb1903d2dd74d704d621572b0fce568bf8b Mon Sep 17 00:00:00 2001 From: Geoffrey Merck Date: Sun, 20 Feb 2022 09:02:23 +0100 Subject: [PATCH] #20 start simplifying things --- DGWTimeServer/TimeServerThread.cpp | 132 ++++++++++------------------- DGWTimeServer/TimeServerThread.h | 6 +- 2 files changed, 49 insertions(+), 89 deletions(-) diff --git a/DGWTimeServer/TimeServerThread.cpp b/DGWTimeServer/TimeServerThread.cpp index cfcfc47..575f220 100644 --- a/DGWTimeServer/TimeServerThread.cpp +++ b/DGWTimeServer/TimeServerThread.cpp @@ -24,6 +24,8 @@ #include #include #include +#include +#include #include "TimeServerThread.h" #include "DStarDefines.h" @@ -39,10 +41,7 @@ const unsigned int SILENCE_LENGTH = 10U; CTimeServerThread::CTimeServerThread() : CThread("Time Server"), m_callsign(), -m_callsignA(), -m_callsignB(), -m_callsignC(), -m_callsignD(), +m_repeaters(), m_callsignG(), m_address(), m_addressStr(), @@ -80,7 +79,7 @@ CTimeServerThread::~CTimeServerThread() void * CTimeServerThread::Entry() { // 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()) + while (!m_killed && m_address.s_addr == INADDR_NONE && m_repeaters.size() == 0U) Sleep(500UL); // 1/2 sec if (m_killed) @@ -143,19 +142,19 @@ bool CTimeServerThread::setGateway(const std::string& callsign, const std::strin m_callsignG.push_back('G'); if (!rpt1.empty()) { - m_callsignA = m_callsign + rpt1; + m_repeaters.push_back(m_callsign + rpt1); } if (!rpt2.empty()) { - m_callsignB = m_callsign + rpt2; + m_repeaters.push_back(m_callsign + rpt2); } if (!rpt3.empty()) { - m_callsignC = m_callsign + rpt3; + m_repeaters.push_back(m_callsign + rpt3); } if (!rpt4.empty()) { - m_callsignD = m_callsign + rpt4; + m_repeaters.push_back(m_callsign + rpt4); } m_callsign.push_back(' '); @@ -1182,11 +1181,6 @@ void CTimeServerThread::end() bool CTimeServerThread::send(const std::vector &words, unsigned int hour, unsigned int min) { - unsigned int idA = CHeaderData::createId(); - unsigned int idB = CHeaderData::createId(); - unsigned int idC = CHeaderData::createId(); - unsigned int idD = CHeaderData::createId(); - CHeaderData header; header.setMyCall1(m_callsign); header.setRptCall1(m_callsignG); @@ -1321,43 +1315,47 @@ bool CTimeServerThread::send(const std::vector &words, unsigned int return false; } - CUDPReaderWriter * socketA = nullptr; - CUDPReaderWriter * socketB = nullptr; - CUDPReaderWriter * socketC = nullptr; - CUDPReaderWriter * socketD = nullptr; - - if (!m_callsignA.empty()) { - socketA = new CUDPReaderWriter("", 0U); - socketA->open(); - header.setRptCall2(m_callsignA); - header.setId(idA); - sendHeader(*socketA, header); + bool res = true; + for(auto rpt : m_repeaters) { + res = sendToRepeater(header, rpt) && res; } - if (!m_callsignB.empty()) { - socketB = new CUDPReaderWriter("", 0U); - socketB->open(); - header.setRptCall2(m_callsignB); - header.setId(idB); - sendHeader(*socketB, header); - } + // std::vector *> tasks; - if (!m_callsignC.empty()) { - socketC = new CUDPReaderWriter("", 0U); - socketC->open(); - header.setRptCall2(m_callsignC); - header.setId(idC); - sendHeader(*socketC, header); - } + // for(auto rpt : m_repeaters) { + // std::packaged_task * task = new std::packaged_task([header, rpt, this] { return sendToRepeater(header, rpt);} ); + // std::thread t(std::move(*task)); + // } + + // bool res = true; + // for(auto task : tasks) { + // auto future = task->get_future(); + // future.wait(); + // res = future.get() && res; + // delete task; + // } - if (!m_callsignD.empty()) { - socketD = new CUDPReaderWriter("", 0U); - socketD->open(); - header.setRptCall2(m_callsignD); - header.setId(idD); - sendHeader(*socketD, header); + for(unsigned int i = 0U; i < MAX_FRAMES; i++) { + delete m_data[i]; + m_data[i] = nullptr; } + return res; +} + +bool CTimeServerThread::sendToRepeater(const CHeaderData& h, const std::string& rptCall2) +{ + CUDPReaderWriter socket("", 0U); + if(!socket.open()) + return false; + + auto id = CHeaderData::createId(); + CHeaderData header(h); + header.setId(id); + header.setRptCall2(rptCall2); + + sendHeader(socket, header); + bool loop = true; unsigned int out = 0U; auto start = std::chrono::high_resolution_clock::now(); @@ -1367,31 +1365,10 @@ bool CTimeServerThread::send(const std::vector &words, unsigned int needed /= DSTAR_FRAME_TIME_MS; while (out < needed) { - CAMBEData* data = m_data[out]; - m_data[out] = NULL; + CAMBEData data(*(m_data[out])); out++; - - if (!m_callsignA.empty()) { - data->setId(idA); - sendData(*socketA, *data); - } - - if (!m_callsignB.empty()) { - data->setId(idB); - sendData(*socketB, *data); - } - - if (!m_callsignC.empty()) { - data->setId(idC); - sendData(*socketC, *data); - } - - if (!m_callsignD.empty()) { - data->setId(idD); - sendData(*socketD, *data); - } - - delete data; + data.setId(id); + sendData(socket, data); if (m_in == out) { loop = false; @@ -1402,22 +1379,7 @@ bool CTimeServerThread::send(const std::vector &words, unsigned int 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; - } + socket.close(); return true; } diff --git a/DGWTimeServer/TimeServerThread.h b/DGWTimeServer/TimeServerThread.h index a1dffd8..ef501fc 100644 --- a/DGWTimeServer/TimeServerThread.h +++ b/DGWTimeServer/TimeServerThread.h @@ -73,10 +73,7 @@ public: private: std::string m_callsign; - std::string m_callsignA; - std::string m_callsignB; - std::string m_callsignC; - std::string m_callsignD; + std::vector m_repeaters; std::string m_callsignG; in_addr m_address; std::string m_addressStr; @@ -111,6 +108,7 @@ private: bool send(const std::vector& words, unsigned int hour, unsigned int min); bool sendHeader(CUDPReaderWriter& socket, const CHeaderData& header); bool sendData(CUDPReaderWriter& socket, const CAMBEData& data); + bool sendToRepeater(const CHeaderData& header, const std::string& rptCall2); bool loadAMBE(); bool readAMBE(const std::string& dir, const std::string& name);