From 0f96f32848470b9208c858c0497ede9b5b185558 Mon Sep 17 00:00:00 2001 From: Dave Behnke <916775+dbehnke@users.noreply.github.com> Date: Thu, 25 Dec 2025 23:42:27 -0500 Subject: [PATCH] Implement closing event and fix hearing module in all protocols --- docs/nng.md | 17 ++++++++++++++++- mrefd-temp | 1 + reflector/DCSProtocol.cpp | 2 +- reflector/DExtraProtocol.cpp | 2 +- reflector/DMRMMDVMProtocol.cpp | 2 +- reflector/DPlusProtocol.cpp | 2 +- reflector/GateKeeper.h | 2 +- reflector/M17Protocol.cpp | 4 +++- reflector/NXDNProtocol.cpp | 2 +- reflector/P25Protocol.cpp | 2 +- reflector/Reflector.cpp | 3 +++ reflector/URFProtocol.cpp | 4 +++- reflector/Users.cpp | 11 +++++++++++ reflector/Users.h | 2 ++ reflector/YSFProtocol.cpp | 2 +- 15 files changed, 47 insertions(+), 11 deletions(-) create mode 160000 mrefd-temp diff --git a/docs/nng.md b/docs/nng.md index 9c078ac..5503406 100644 --- a/docs/nng.md +++ b/docs/nng.md @@ -29,7 +29,7 @@ graph TD %% Internal Flows CC -- "client_connect / client_disconnect" --> NP - CU -- "hearing (activity)" --> NP + CU -- "hearing / closing" --> NP CR -- "periodic state report" --> NP PS -- "IsActive status" --> CR @@ -123,6 +123,21 @@ Triggered when the reflector "hears" an active transmission. This event is sent } ``` +### 4. Transmission End (`closing`) + +Triggered when a transmission stream is closed (user stops talking). + +**Payload Structure:** + +```json +{ + "type": "closing", + "my": "G4XYZ", + "module": "A", + "protocol": "M17" +} +``` + ## Middle Tier Design Considerations 1. **Late Joining**: The `state` message is broadcast periodically to ensure a middle-tier connecting at any time (or reconnecting) can synchronize its internal state without waiting for new events. diff --git a/mrefd-temp b/mrefd-temp new file mode 160000 index 0000000..fbf88f1 --- /dev/null +++ b/mrefd-temp @@ -0,0 +1 @@ +Subproject commit fbf88f1e7f347f78a501b906fe814aa9c11bcd9f diff --git a/reflector/DCSProtocol.cpp b/reflector/DCSProtocol.cpp index 0ea47f4..3821dac 100644 --- a/reflector/DCSProtocol.cpp +++ b/reflector/DCSProtocol.cpp @@ -208,7 +208,7 @@ void CDcsProtocol::OnDvHeaderPacketIn(std::unique_ptr &Header, g_Reflector.ReleaseClients(); // update last heard - g_Reflector.GetUsers()->Hearing(my, rpt1, rpt2, EProtocol::dcs); + g_Reflector.GetUsers()->Hearing(my, rpt1, rpt2, rpt2, EProtocol::dcs); g_Reflector.ReleaseUsers(); } } diff --git a/reflector/DExtraProtocol.cpp b/reflector/DExtraProtocol.cpp index c698b26..32be8d2 100644 --- a/reflector/DExtraProtocol.cpp +++ b/reflector/DExtraProtocol.cpp @@ -351,7 +351,7 @@ void CDextraProtocol::OnDvHeaderPacketIn(std::unique_ptr &Heade g_Reflector.ReleaseClients(); // update last heard - g_Reflector.GetUsers()->Hearing(my, rpt1, rpt2, EProtocol::dextra); + g_Reflector.GetUsers()->Hearing(my, rpt1, rpt2, rpt2, EProtocol::dextra); g_Reflector.ReleaseUsers(); } } diff --git a/reflector/DMRMMDVMProtocol.cpp b/reflector/DMRMMDVMProtocol.cpp index f2b201e..c36c921 100644 --- a/reflector/DMRMMDVMProtocol.cpp +++ b/reflector/DMRMMDVMProtocol.cpp @@ -335,7 +335,7 @@ void CDmrmmdvmProtocol::OnDvHeaderPacketIn(std::unique_ptr &Hea // update last heard if ( lastheard ) { - g_Reflector.GetUsers()->Hearing(my, rpt1, rpt2, EProtocol::dmrmmdvm); + g_Reflector.GetUsers()->Hearing(my, rpt1, rpt2, rpt2, EProtocol::dmrmmdvm); g_Reflector.ReleaseUsers(); } } diff --git a/reflector/DPlusProtocol.cpp b/reflector/DPlusProtocol.cpp index 24b819d..ce908f4 100644 --- a/reflector/DPlusProtocol.cpp +++ b/reflector/DPlusProtocol.cpp @@ -213,7 +213,7 @@ void CDplusProtocol::OnDvHeaderPacketIn(std::unique_ptr &Header g_Reflector.ReleaseClients(); // update last heard - g_Reflector.GetUsers()->Hearing(my, rpt1, rpt2, EProtocol::dplus); + g_Reflector.GetUsers()->Hearing(my, rpt1, rpt2, rpt2, EProtocol::dplus); g_Reflector.ReleaseUsers(); } else diff --git a/reflector/GateKeeper.h b/reflector/GateKeeper.h index 619dd86..d6baabd 100644 --- a/reflector/GateKeeper.h +++ b/reflector/GateKeeper.h @@ -47,6 +47,7 @@ public: // authorizations bool MayLink(const CCallsign &, const CIp &, const EProtocol, char * = nullptr) const; bool MayTransmit(const CCallsign &, const CIp &, EProtocol = EProtocol::any, char = ' ') const; + const std::string ProtocolName(EProtocol) const; protected: // thread @@ -56,7 +57,6 @@ protected: bool IsNodeListedOk(const std::string &) const; bool IsPeerListedOk(const std::string &, char) const; bool IsPeerListedOk(const std::string &, const CIp &, char *) const; - const std::string ProtocolName(EProtocol) const; protected: // data diff --git a/reflector/M17Protocol.cpp b/reflector/M17Protocol.cpp index be8c634..204909e 100644 --- a/reflector/M17Protocol.cpp +++ b/reflector/M17Protocol.cpp @@ -209,7 +209,9 @@ void CM17Protocol::OnDvHeaderPacketIn(std::unique_ptr &Header, g_Reflector.ReleaseClients(); // update last heard - g_Reflector.GetUsers()->Hearing(my, rpt1, rpt2, EProtocol::m17); + CCallsign reflectorCall = rpt2; + reflectorCall.SetCSModule(Header->GetRpt2Module()); + g_Reflector.GetUsers()->Hearing(my, rpt1, rpt2, reflectorCall, EProtocol::m17); g_Reflector.ReleaseUsers(); } } diff --git a/reflector/NXDNProtocol.cpp b/reflector/NXDNProtocol.cpp index 7c7b832..58638d2 100644 --- a/reflector/NXDNProtocol.cpp +++ b/reflector/NXDNProtocol.cpp @@ -235,7 +235,7 @@ void CNXDNProtocol::OnDvHeaderPacketIn(std::unique_ptr &Header, // update last heard if ( g_Reflector.IsValidModule(rpt2.GetCSModule()) ) { - g_Reflector.GetUsers()->Hearing(my, rpt1, rpt2, EProtocol::nxdn); + g_Reflector.GetUsers()->Hearing(my, rpt1, rpt2, rpt2, EProtocol::nxdn); g_Reflector.ReleaseUsers(); } } diff --git a/reflector/P25Protocol.cpp b/reflector/P25Protocol.cpp index 919fc66..011eec8 100644 --- a/reflector/P25Protocol.cpp +++ b/reflector/P25Protocol.cpp @@ -219,7 +219,7 @@ void CP25Protocol::OnDvHeaderPacketIn(std::unique_ptr &Header, g_Reflector.ReleaseClients(); // update last heard - g_Reflector.GetUsers()->Hearing(my, rpt1, rpt2, EProtocol::p25); + g_Reflector.GetUsers()->Hearing(my, rpt1, rpt2, rpt2, EProtocol::p25); g_Reflector.ReleaseUsers(); } } diff --git a/reflector/Reflector.cpp b/reflector/Reflector.cpp index 5ffec10..442fb8b 100644 --- a/reflector/Reflector.cpp +++ b/reflector/Reflector.cpp @@ -276,6 +276,9 @@ void CReflector::CloseStream(std::shared_ptr stream) // notify //OnStreamClose(stream->GetUserCallsign()); + // dashboard event + GetUsers()->Closing(stream->GetUserCallsign(), GetStreamModule(stream), stream->GetOwnerClient()->GetProtocol()); + std::cout << "Closing stream of module " << GetStreamModule(stream) << std::endl; } diff --git a/reflector/URFProtocol.cpp b/reflector/URFProtocol.cpp index e9d7fcb..cdac493 100644 --- a/reflector/URFProtocol.cpp +++ b/reflector/URFProtocol.cpp @@ -411,7 +411,9 @@ void CURFProtocol::OnDvHeaderPacketIn(std::unique_ptr &Header, // release g_Reflector.ReleaseClients(); // update last heard - g_Reflector.GetUsers()->Hearing(my, rpt1, rpt2, peer, EProtocol::urf); + CCallsign xlx = rpt2; + xlx.SetCSModule(Header->GetRpt2Module()); + g_Reflector.GetUsers()->Hearing(my, rpt1, rpt2, xlx, EProtocol::urf); g_Reflector.ReleaseUsers(); } } diff --git a/reflector/Users.cpp b/reflector/Users.cpp index 1284d7a..80b2faf 100644 --- a/reflector/Users.cpp +++ b/reflector/Users.cpp @@ -76,3 +76,14 @@ void CUsers::Hearing(const CCallsign &my, const CCallsign &rpt1, const CCallsign event["protocol"] = g_GateKeeper.ProtocolName(protocol); g_NNGPublisher.Publish(event); } + +void CUsers::Closing(const CCallsign &my, char module, EProtocol protocol) +{ + // dashboard event + nlohmann::json event; + event["type"] = "closing"; + event["my"] = my.GetCS(); + event["module"] = std::string(1, module); + event["protocol"] = g_GateKeeper.ProtocolName(protocol); + g_NNGPublisher.Publish(event); +} diff --git a/reflector/Users.h b/reflector/Users.h index 0873317..9638ebd 100644 --- a/reflector/Users.h +++ b/reflector/Users.h @@ -22,6 +22,7 @@ #include #include "User.h" +#include "Defines.h" class CUsers { @@ -49,6 +50,7 @@ public: // operation void Hearing(const CCallsign &, const CCallsign &, const CCallsign &, EProtocol protocol = EProtocol::none); void Hearing(const CCallsign &, const CCallsign &, const CCallsign &, const CCallsign &, EProtocol protocol); + void Closing(const CCallsign &, char module, EProtocol protocol); protected: // data diff --git a/reflector/YSFProtocol.cpp b/reflector/YSFProtocol.cpp index ea8e8c4..ed6e09a 100644 --- a/reflector/YSFProtocol.cpp +++ b/reflector/YSFProtocol.cpp @@ -293,7 +293,7 @@ void CYsfProtocol::OnDvHeaderPacketIn(std::unique_ptr &Header, // update last heard if ( g_Reflector.IsValidModule(rpt2.GetCSModule()) ) { - g_Reflector.GetUsers()->Hearing(my, rpt1, rpt2, EProtocol::ysf); + g_Reflector.GetUsers()->Hearing(my, rpt1, rpt2, rpt2, EProtocol::ysf); g_Reflector.ReleaseUsers(); } }