From c299d812e90253c29d77edf3420df3b80a54258f Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Wed, 15 Jul 2026 09:17:00 -0400 Subject: [PATCH] add support for call start/end WebSocket events; --- src/sysview/SysViewMain.cpp | 39 +++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/sysview/SysViewMain.cpp b/src/sysview/SysViewMain.cpp index 949372b6..aa2913ee 100644 --- a/src/sysview/SysViewMain.cpp +++ b/src/sysview/SysViewMain.cpp @@ -180,6 +180,37 @@ std::string resolveTGID(uint32_t id) return std::string("UNK"); } +/* Helper to emit a call start or end event. */ + +void emitCallStartEndEvent(uint32_t srcId, uint32_t dstId, uint8_t slotNo, uint32_t streamId, const std::string& mode, + bool callEnd = false) +{ + if (g_netDataEvent == nullptr) + return; + + json::object event; + std::string type = "call_start"; + if (callEnd) { + type = "call_end"; + } + event["type"].set(type); + + event["mode"].set(mode); + + event["slot"].set(slotNo); + + std::string resolvedSrc = resolveRID(srcId); + std::string resolvedDst = resolveTGID(dstId); + event["srcId"].set(srcId); + event["srcStr"].set(resolvedSrc); + event["dstId"].set(dstId); + event["dstStr"].set(resolvedDst); + + event["streamId"].set(streamId); + + g_netDataEvent(event); +} + /* Initializes peer network connectivity. */ bool createPeerNetwork() @@ -402,6 +433,7 @@ void* threadNetworkPump(void* arg) LogInfoEx(LOG_NET, "DMR, Call End, srcId = %u (%s), dstId = %u (%s), duration = %u", srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str(), duration / 1000); + emitCallStartEndEvent(srcId, dstId, slotNo, status.streamId, "dmr", true); } } @@ -424,6 +456,7 @@ void* threadNetworkPump(void* arg) LogInfoEx(LOG_NET, "DMR, Call Start, srcId = %u (%s), dstId = %u (%s)", srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); + emitCallStartEndEvent(srcId, dstId, slotNo, status.streamId, "dmr"); } } @@ -544,6 +577,7 @@ void* threadNetworkPump(void* arg) LogInfoEx(LOG_NET, "P25, Call End, srcId = %u (%s), dstId = %u (%s), sysId = $%03X, netId = $%05X, duration = %u", srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str(), sysId, netId, duration / 1000); + emitCallStartEndEvent(srcId, dstId, 0U, status.streamId, "p25", true); } } @@ -565,6 +599,7 @@ void* threadNetworkPump(void* arg) LogInfoEx(LOG_NET, "P25, Call Start, srcId = %u (%s), dstId = %u (%s), sysId = $%03X, netId = $%05X", srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str(), sysId, netId); + emitCallStartEndEvent(srcId, dstId, 0U, status.streamId, "p25"); } } } @@ -982,6 +1017,7 @@ void* threadNetworkPump(void* arg) LogInfoEx(LOG_NET, "NXDN, Call End, srcId = %u (%s), dstId = %u (%s), duration = %u", srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str(), duration / 1000); + emitCallStartEndEvent(srcId, dstId, 0U, status.streamId, "nxdn", true); } } @@ -1003,6 +1039,7 @@ void* threadNetworkPump(void* arg) LogInfoEx(LOG_NET, "NXDN, Call Start, srcId = %u (%s), dstId = %u (%s)", srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); + emitCallStartEndEvent(srcId, dstId, 0U, status.streamId, "nxdn"); } } } @@ -1035,6 +1072,7 @@ void* threadNetworkPump(void* arg) LogInfoEx(LOG_NET, "Analog, Call End, srcId = %u (%s), dstId = %u (%s), duration = %u", srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str(), duration / 1000); + emitCallStartEndEvent(srcId, dstId, 0U, status.streamId, "analog", true); } } @@ -1056,6 +1094,7 @@ void* threadNetworkPump(void* arg) LogInfoEx(LOG_NET, "Analog, Call Start, srcId = %u (%s), dstId = %u (%s)", srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); + emitCallStartEndEvent(srcId, dstId, 0U, status.streamId, "analog"); } }