Implement closing event and fix hearing module in all protocols

pull/20/head
Dave Behnke 1 month ago
parent d02ebe31b0
commit 0f96f32848

@ -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.

@ -0,0 +1 @@
Subproject commit fbf88f1e7f347f78a501b906fe814aa9c11bcd9f

@ -208,7 +208,7 @@ void CDcsProtocol::OnDvHeaderPacketIn(std::unique_ptr<CDvHeaderPacket> &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();
}
}

@ -351,7 +351,7 @@ void CDextraProtocol::OnDvHeaderPacketIn(std::unique_ptr<CDvHeaderPacket> &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();
}
}

@ -335,7 +335,7 @@ void CDmrmmdvmProtocol::OnDvHeaderPacketIn(std::unique_ptr<CDvHeaderPacket> &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();
}
}

@ -213,7 +213,7 @@ void CDplusProtocol::OnDvHeaderPacketIn(std::unique_ptr<CDvHeaderPacket> &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

@ -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

@ -209,7 +209,9 @@ void CM17Protocol::OnDvHeaderPacketIn(std::unique_ptr<CDvHeaderPacket> &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();
}
}

@ -235,7 +235,7 @@ void CNXDNProtocol::OnDvHeaderPacketIn(std::unique_ptr<CDvHeaderPacket> &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();
}
}

@ -219,7 +219,7 @@ void CP25Protocol::OnDvHeaderPacketIn(std::unique_ptr<CDvHeaderPacket> &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();
}
}

@ -276,6 +276,9 @@ void CReflector::CloseStream(std::shared_ptr<CPacketStream> 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;
}

@ -411,7 +411,9 @@ void CURFProtocol::OnDvHeaderPacketIn(std::unique_ptr<CDvHeaderPacket> &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();
}
}

@ -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);
}

@ -22,6 +22,7 @@
#include <mutex>
#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

@ -293,7 +293,7 @@ void CYsfProtocol::OnDvHeaderPacketIn(std::unique_ptr<CDvHeaderPacket> &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();
}
}

Loading…
Cancel
Save

Powered by TurnKey Linux.