From 9cc9d2dd810734d2b0e7efe10d10de9af9b430bf Mon Sep 17 00:00:00 2001 From: Dave Behnke <916775+dbehnke@users.noreply.github.com> Date: Fri, 26 Dec 2025 12:09:35 -0500 Subject: [PATCH] Implement NNG event system, fix deadlock, and add NNGDebug config --- reflector/Configure.cpp | 3 +++ reflector/JsonKeys.h | 4 ++-- reflector/M17Protocol.cpp | 18 ++++++++++++++++++ reflector/NNGPublisher.cpp | 4 +++- reflector/Reflector.cpp | 1 + reflector/YSFProtocol.cpp | 4 ++-- 6 files changed, 29 insertions(+), 5 deletions(-) diff --git a/reflector/Configure.cpp b/reflector/Configure.cpp index 0f2d144..f1a0d59 100644 --- a/reflector/Configure.cpp +++ b/reflector/Configure.cpp @@ -127,6 +127,7 @@ CConfigure::CConfigure() data[g_Keys.dashboard.nngaddr] = "tcp://127.0.0.1:5555"; data[g_Keys.dashboard.interval] = 10U; data[g_Keys.dashboard.enable] = false; + data[g_Keys.dashboard.debug] = false; data[g_Keys.ysf.ysfreflectordb.id] = 0U; } @@ -510,6 +511,8 @@ bool CConfigure::ReadData(const std::string &path) data[g_Keys.dashboard.nngaddr] = value; else if (0 == key.compare("Interval")) data[g_Keys.dashboard.interval] = getUnsigned(value, "Dashboard Interval", 1, 3600, 10); + else if (0 == key.compare("NNGDebug")) + data[g_Keys.dashboard.debug] = IS_TRUE(value[0]); else badParam(key); break; diff --git a/reflector/JsonKeys.h b/reflector/JsonKeys.h index 09f2ac1..1eac949 100644 --- a/reflector/JsonKeys.h +++ b/reflector/JsonKeys.h @@ -72,6 +72,6 @@ struct SJsonKeys { struct FILES { const std::string pid, xml, json, white, black, interlink, terminal; } files { "pidFilePath", "xmlFilePath", "jsonFilePath", "whitelistFilePath", "blacklistFilePath", "interlinkFilePath", "g3TerminalFilePath" }; - struct DASHBOARD { const std::string enable, nngaddr, interval; } - dashboard { "DashboardEnable", "DashboardNNGAddr", "DashboardInterval" }; + struct DASHBOARD { const std::string enable, nngaddr, interval, debug; } + dashboard { "DashboardEnable", "DashboardNNGAddr", "DashboardInterval", "NNGDebug" }; }; diff --git a/reflector/M17Protocol.cpp b/reflector/M17Protocol.cpp index 204909e..3ecce1f 100644 --- a/reflector/M17Protocol.cpp +++ b/reflector/M17Protocol.cpp @@ -23,6 +23,12 @@ #include "M17Packet.h" #include "Global.h" +//////////////////////////////////////////////////////////////////////////////////////// +// constructor +CM17Protocol::CM17Protocol() : CSEProtocol() +{ +} + //////////////////////////////////////////////////////////////////////////////////////// // operation @@ -413,3 +419,15 @@ void CM17Protocol::EncodeM17Packet(SM17Frame &frame, const CDvHeaderPacket &Head frame.streamid = Header.GetStreamId(); // no host<--->network byte swapping since we never do any math on this value // the CRC will be set in HandleQueue, after lich.dest is set } + +bool CM17Protocol::EncodeDvHeaderPacket(const CDvHeaderPacket &packet, CBuffer &buffer) const +{ + packet.EncodeInterlinkPacket(buffer); + return true; +} + +bool CM17Protocol::EncodeDvFramePacket(const CDvFramePacket &packet, CBuffer &buffer) const +{ + packet.EncodeInterlinkPacket(buffer); + return true; +} diff --git a/reflector/NNGPublisher.cpp b/reflector/NNGPublisher.cpp index 5c02ab2..9f87347 100644 --- a/reflector/NNGPublisher.cpp +++ b/reflector/NNGPublisher.cpp @@ -1,4 +1,5 @@ #include "NNGPublisher.h" +#include "Global.h" #include CNNGPublisher::CNNGPublisher() @@ -54,7 +55,8 @@ void CNNGPublisher::Publish(const nlohmann::json &event) return; } std::string msg = event.dump(); - std::cout << "NNG debug: Attempting to publish message of size " << msg.size() << ": " << msg << std::endl; + if (g_Configure.GetBoolean(g_Keys.dashboard.debug)) + std::cout << "NNG debug: Attempting to publish message of size " << msg.size() << ": " << msg << std::endl; int rv = nng_send(m_sock, (void *)msg.c_str(), msg.size(), NNG_FLAG_NONBLOCK); if (rv == 0) { std::cout << "NNG: Published event: " << event["type"] << std::endl; diff --git a/reflector/Reflector.cpp b/reflector/Reflector.cpp index 442fb8b..3ec3413 100644 --- a/reflector/Reflector.cpp +++ b/reflector/Reflector.cpp @@ -278,6 +278,7 @@ void CReflector::CloseStream(std::shared_ptr stream) // dashboard event GetUsers()->Closing(stream->GetUserCallsign(), GetStreamModule(stream), stream->GetOwnerClient()->GetProtocol()); + ReleaseUsers(); std::cout << "Closing stream of module " << GetStreamModule(stream) << std::endl; } diff --git a/reflector/YSFProtocol.cpp b/reflector/YSFProtocol.cpp index ed6e09a..b6dcceb 100644 --- a/reflector/YSFProtocol.cpp +++ b/reflector/YSFProtocol.cpp @@ -478,7 +478,7 @@ bool CYsfProtocol::IsValidDvHeaderPacket(const CIp &Ip, const CYSFFICH &Fich, co sz[YSF_CALLSIGN_LENGTH] = 0; CCallsign rpt1 = CCallsign((const char *)sz); rpt1.SetCSModule(YSF_MODULE_ID); - CCallsign rpt2 = m_ReflectorCallsign; + CCallsign rpt2 = g_Reflector.GetCallsign(); // as YSF protocol does not provide a module-tranlatable // destid, set module to none and rely on OnDvHeaderPacketIn() // to later fill it with proper value @@ -531,7 +531,7 @@ bool CYsfProtocol::IsValidDvFramePacket(const CIp &Ip, const CYSFFICH &Fich, con sz[YSF_CALLSIGN_LENGTH] = 0; CCallsign rpt1 = CCallsign((const char *)sz); rpt1.SetCSModule(YSF_MODULE_ID); - CCallsign rpt2 = m_ReflectorCallsign; + CCallsign rpt2 = g_Reflector.GetCallsign(); rpt2.SetCSModule(' '); header = std::unique_ptr(new CDvHeaderPacket(csMY, CCallsign("CQCQCQ"), rpt1, rpt2, uiStreamId, Fich.getFN()));