diff --git a/YSFGateway/Reflectors.cpp b/YSFGateway/Reflectors.cpp index 90844c3..87b969e 100644 --- a/YSFGateway/Reflectors.cpp +++ b/YSFGateway/Reflectors.cpp @@ -20,9 +20,11 @@ #include "Hosts.h" #include "Log.h" +#include #include #include #include +#include CReflectors::CReflectors(const std::string& hostsFile, unsigned int statusPort) : m_hostsFile(hostsFile), @@ -30,13 +32,15 @@ m_socket(statusPort), m_reflectors(), m_it(), m_current(), -m_timer(1000U, 60U) +m_timer(1000U, 15U) { assert(statusPort > 0U); } CReflectors::~CReflectors() { + for (std::vector::iterator it = m_reflectors.begin(); it != m_reflectors.end(); ++it) + delete *it; } bool CReflectors::load() @@ -82,15 +86,34 @@ CYSFReflector* CReflectors::find(const std::string& id) return NULL; } +static int refComparison(const CYSFReflector* r1, const CYSFReflector* r2) +{ + assert(r1 != NULL); + assert(r2 != NULL); + + std::string name1 = r1->m_name; + std::string name2 = r2->m_name; + + for (unsigned int i = 0U; i < name1.size() && i < name2.size(); i++) { + int c = ::toupper(name1.at(i)) - ::toupper(name2.at(i)); + if (c != 0) + return c; + } + + return int(name1.size()) - int(name2.size()); +} + std::vector& CReflectors::current() { m_current.clear(); for (std::vector::iterator it = m_reflectors.begin(); it != m_reflectors.end(); ++it) { - if ((*it)->m_timer.isRunning()) + if ((*it)->m_seen) m_current.push_back(*it); } + std::sort(m_current.begin(), m_current.end(), ::refComparison); + return m_current; } @@ -121,7 +144,7 @@ void CReflectors::clock(unsigned int ms) std::string desc = std::string((char*)(buffer + 25U), 14U); std::string cnt = std::string((char*)(buffer + 39U), 3U); - LogDebug("Have YSFS reply from %s/%s/%s/%s", id.c_str(), name.c_str(), desc.c_str(), cnt.c_str()); + LogDebug("Have reflector status reply from %s/%s/%s/%s", id.c_str(), name.c_str(), desc.c_str(), cnt.c_str()); for (std::vector::iterator it = m_reflectors.begin(); it != m_reflectors.end(); ++it) { in_addr itAddr = (*it)->m_address; @@ -132,14 +155,10 @@ void CReflectors::clock(unsigned int ms) (*it)->m_name = name; (*it)->m_desc = desc; (*it)->m_count = cnt; - (*it)->m_timer.start(); - LogDebug("Updating %s", id.c_str()); + (*it)->m_seen = true; break; } } } } - - for (std::vector::iterator it = m_reflectors.begin(); it != m_reflectors.end(); ++it) - (*it)->m_timer.clock(ms); } diff --git a/YSFGateway/Reflectors.h b/YSFGateway/Reflectors.h index c4b25b6..386affc 100644 --- a/YSFGateway/Reflectors.h +++ b/YSFGateway/Reflectors.h @@ -34,7 +34,7 @@ public: m_count("000"), m_address(), m_port(0U), - m_timer(1000U, 700U) + m_seen(false) { } @@ -44,7 +44,7 @@ public: std::string m_count; in_addr m_address; unsigned int m_port; - CTimer m_timer; + bool m_seen; }; class CReflectors { diff --git a/YSFGateway/WiresX.cpp b/YSFGateway/WiresX.cpp index ddb12c3..318c118 100644 --- a/YSFGateway/WiresX.cpp +++ b/YSFGateway/WiresX.cpp @@ -50,7 +50,7 @@ m_id(), m_name(), m_txFrequency(0U), m_rxFrequency(0U), -m_timer(1000U, 1U), +m_timer(1000U, 2U), m_seqNo(0U), m_header(NULL), m_source(NULL), @@ -303,9 +303,18 @@ void CWiresX::createReply(const unsigned char* data, unsigned int length) break; case 1U: payload.writeDataFRModeData1(m_csd3, buffer + 35U); - payload.writeDataFRModeData2(data + offset, buffer + 35U); - offset += 20U; - break; + if (bn == 0U) { + payload.writeDataFRModeData2(data + offset, buffer + 35U); + offset += 20U; + } else { + // All subsequent entries start with 0x00U + unsigned char buffer[20U]; + ::memcpy(buffer + 1U, data + offset, 19U); + buffer[0U] = 0x00U; + payload.writeDataFRModeData2(buffer, buffer + 35U); + offset += 19U; + } + break ; default: payload.writeDataFRModeData1(data + offset, buffer + 35U); offset += 20U;