fix missing stream ID for call events; add call duration on call end event;

pull/121/merge
Bryan Biedenkapp 6 days ago
parent c299d812e9
commit 0db63a6534

@ -85,10 +85,10 @@ class RxStatus {
public: public:
::system_clock::hrc::hrc_t callStartTime; ::system_clock::hrc::hrc_t callStartTime;
::system_clock::hrc::hrc_t lastPacket; ::system_clock::hrc::hrc_t lastPacket;
uint32_t srcId; uint32_t srcId = 0U;
uint32_t dstId; uint32_t dstId = 0U;
uint8_t slotNo; uint8_t slotNo = 0U;
uint32_t streamId; uint32_t streamId = 0U;
}; };
typedef std::pair<const uint32_t, RxStatus> StatusMapPair; typedef std::pair<const uint32_t, RxStatus> StatusMapPair;
std::unordered_map<uint32_t, RxStatus> g_dmrStatus; std::unordered_map<uint32_t, RxStatus> g_dmrStatus;
@ -183,7 +183,7 @@ std::string resolveTGID(uint32_t id)
/* Helper to emit a call start or end event. */ /* 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, void emitCallStartEndEvent(uint32_t srcId, uint32_t dstId, uint8_t slotNo, uint32_t streamId, const std::string& mode,
bool callEnd = false) bool callEnd = false, uint64_t duration = 0U)
{ {
if (g_netDataEvent == nullptr) if (g_netDataEvent == nullptr)
return; return;
@ -208,6 +208,10 @@ void emitCallStartEndEvent(uint32_t srcId, uint32_t dstId, uint8_t slotNo, uint3
event["streamId"].set<uint32_t>(streamId); event["streamId"].set<uint32_t>(streamId);
if (callEnd) {
event["duration"].set<uint64_t>(duration);
}
g_netDataEvent(event); g_netDataEvent(event);
} }
@ -380,6 +384,8 @@ void* threadNetworkPump(void* arg)
uint32_t slotNo = (dmrBuffer[15U] & 0x80U) == 0x80U ? 2U : 1U; uint32_t slotNo = (dmrBuffer[15U] & 0x80U) == 0x80U ? 2U : 1U;
uint32_t streamId = g_network->getRxDMRStreamId(slotNo);
DMRDEF::DataType::E dataType = (DMRDEF::DataType::E)(dmrBuffer[15U] & 0x0FU); DMRDEF::DataType::E dataType = (DMRDEF::DataType::E)(dmrBuffer[15U] & 0x0FU);
data::NetData dmrData; data::NetData dmrData;
@ -433,7 +439,7 @@ void* threadNetworkPump(void* arg)
LogInfoEx(LOG_NET, "DMR, Call End, srcId = %u (%s), dstId = %u (%s), duration = %u", 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); srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str(), duration / 1000);
emitCallStartEndEvent(srcId, dstId, slotNo, status.streamId, "dmr", true); emitCallStartEndEvent(srcId, dstId, slotNo, status.streamId, "dmr", true, duration / 1000);
} }
} }
@ -452,6 +458,7 @@ void* threadNetworkPump(void* arg)
status.srcId = srcId; status.srcId = srcId;
status.dstId = dstId; status.dstId = dstId;
status.slotNo = slotNo; status.slotNo = slotNo;
status.streamId = streamId;
g_dmrStatus[dstId] = status; // this *could* be an issue if a dstId appears on both slots somehow... g_dmrStatus[dstId] = status; // this *could* be an issue if a dstId appears on both slots somehow...
LogInfoEx(LOG_NET, "DMR, Call Start, srcId = %u (%s), dstId = %u (%s)", LogInfoEx(LOG_NET, "DMR, Call Start, srcId = %u (%s), dstId = %u (%s)",
@ -528,6 +535,8 @@ void* threadNetworkPump(void* arg)
if (netReadRet) { if (netReadRet) {
using namespace p25; using namespace p25;
uint32_t streamId = g_network->getRxP25StreamId();
uint8_t duid = p25Buffer[22U]; uint8_t duid = p25Buffer[22U];
uint8_t MFId = p25Buffer[15U]; uint8_t MFId = p25Buffer[15U];
@ -577,7 +586,7 @@ void* threadNetworkPump(void* arg)
LogInfoEx(LOG_NET, "P25, Call End, srcId = %u (%s), dstId = %u (%s), sysId = $%03X, netId = $%05X, duration = %u", 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); srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str(), sysId, netId, duration / 1000);
emitCallStartEndEvent(srcId, dstId, 0U, status.streamId, "p25", true); emitCallStartEndEvent(srcId, dstId, 0U, status.streamId, "p25", true, duration / 1000);
} }
} }
@ -595,6 +604,7 @@ void* threadNetworkPump(void* arg)
status.callStartTime = pktTime; status.callStartTime = pktTime;
status.srcId = srcId; status.srcId = srcId;
status.dstId = dstId; status.dstId = dstId;
status.streamId = streamId;
g_p25Status[dstId] = status; g_p25Status[dstId] = status;
LogInfoEx(LOG_NET, "P25, Call Start, srcId = %u (%s), dstId = %u (%s), sysId = $%03X, netId = $%05X", LogInfoEx(LOG_NET, "P25, Call Start, srcId = %u (%s), dstId = %u (%s), sysId = $%03X, netId = $%05X",
@ -984,6 +994,8 @@ void* threadNetworkPump(void* arg)
if (netReadRet) { if (netReadRet) {
using namespace nxdn; using namespace nxdn;
uint32_t streamId = g_network->getRxNXDNStreamId();
uint8_t messageType = nxdnBuffer[4U]; uint8_t messageType = nxdnBuffer[4U];
uint32_t srcId = GET_UINT24(nxdnBuffer, 5U); uint32_t srcId = GET_UINT24(nxdnBuffer, 5U);
@ -1017,7 +1029,7 @@ void* threadNetworkPump(void* arg)
LogInfoEx(LOG_NET, "NXDN, Call End, srcId = %u (%s), dstId = %u (%s), duration = %u", 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); srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str(), duration / 1000);
emitCallStartEndEvent(srcId, dstId, 0U, status.streamId, "nxdn", true); emitCallStartEndEvent(srcId, dstId, 0U, status.streamId, "nxdn", true, duration / 1000);
} }
} }
@ -1035,6 +1047,7 @@ void* threadNetworkPump(void* arg)
status.callStartTime = pktTime; status.callStartTime = pktTime;
status.srcId = srcId; status.srcId = srcId;
status.dstId = dstId; status.dstId = dstId;
status.streamId = streamId;
g_nxdnStatus[dstId] = status; g_nxdnStatus[dstId] = status;
LogInfoEx(LOG_NET, "NXDN, Call Start, srcId = %u (%s), dstId = %u (%s)", LogInfoEx(LOG_NET, "NXDN, Call Start, srcId = %u (%s), dstId = %u (%s)",
@ -1052,6 +1065,8 @@ void* threadNetworkPump(void* arg)
if (netReadRet) { if (netReadRet) {
using namespace analog; using namespace analog;
uint32_t streamId = g_network->getRxAnalogStreamId();
uint32_t srcId = GET_UINT24(analogBuffer, 5U); uint32_t srcId = GET_UINT24(analogBuffer, 5U);
uint32_t dstId = GET_UINT24(analogBuffer, 8U); uint32_t dstId = GET_UINT24(analogBuffer, 8U);
@ -1072,7 +1087,7 @@ void* threadNetworkPump(void* arg)
LogInfoEx(LOG_NET, "Analog, Call End, srcId = %u (%s), dstId = %u (%s), duration = %u", 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); srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str(), duration / 1000);
emitCallStartEndEvent(srcId, dstId, 0U, status.streamId, "analog", true); emitCallStartEndEvent(srcId, dstId, 0U, status.streamId, "analog", true, duration / 1000);
} }
} }
@ -1090,6 +1105,7 @@ void* threadNetworkPump(void* arg)
status.callStartTime = pktTime; status.callStartTime = pktTime;
status.srcId = srcId; status.srcId = srcId;
status.dstId = dstId; status.dstId = dstId;
status.streamId = streamId;
g_analogStatus[dstId] = status; g_analogStatus[dstId] = status;
LogInfoEx(LOG_NET, "Analog, Call Start, srcId = %u (%s), dstId = %u (%s)", LogInfoEx(LOG_NET, "Analog, Call Start, srcId = %u (%s), dstId = %u (%s)",

@ -57,6 +57,34 @@ PeerNetwork::PeerNetwork(const std::string& address, uint16_t port, uint16_t loc
m_promiscuousPeer = true; m_promiscuousPeer = true;
} }
/* Gets the current DMR stream ID. */
uint32_t PeerNetwork::getRxDMRStreamId(uint32_t slotNo) const
{
assert(slotNo == 1U || slotNo == 2U);
if (slotNo == 1U) {
return m_rxDMRStreamId[0U];
}
else {
return m_rxDMRStreamId[1U];
}
}
/* Gets the current P25 Phase 2 stream ID. */
uint32_t PeerNetwork::getRxP25P2StreamId(uint32_t slotNo) const
{
assert(slotNo == 1U || slotNo == 2U);
if (slotNo == 1U) {
return m_rxP25P2StreamId[0U];
}
else {
return m_rxP25P2StreamId[1U];
}
}
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// Protected Class Members // Protected Class Members
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------

@ -4,7 +4,7 @@
* GPLv2 Open Source. Use is subject to license terms. * GPLv2 Open Source. Use is subject to license terms.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* Copyright (C) 2024-2025 Bryan Biedenkapp, N2PLL * Copyright (C) 2024-2026 Bryan Biedenkapp, N2PLL
* *
*/ */
/** /**
@ -70,6 +70,34 @@ namespace network
*/ */
void unlockPeerStatus() { s_peerStatusMutex.unlock(); } void unlockPeerStatus() { s_peerStatusMutex.unlock(); }
/**
* @brief Gets the current DMR stream ID.
* @param slotNo DMR slot to get stream ID for.
* @return uint32_t Stream ID for the given DMR slot.
*/
uint32_t getRxDMRStreamId(uint32_t slotNo) const;
/**
* @brief Gets the current P25 stream ID.
* @return uint32_t Stream ID.
*/
uint32_t getRxP25StreamId() const { return m_rxP25StreamId; }
/**
* @brief Gets the current P25 Phase 2 stream ID.
* @param slotNo P25 Phase 2 slot to get stream ID for.
* @return uint32_t Stream ID for the given P25 Phase 2 slot.
*/
uint32_t getRxP25P2StreamId(uint32_t slotNo) const;
/**
* @brief Gets the current NXDN stream ID.
* @return uint32_t Stream ID.
*/
uint32_t getRxNXDNStreamId() const { return m_rxNXDNStreamId; }
/**
* @brief Gets the current analog stream ID.
* @return uint32_t Stream ID.
*/
uint32_t getRxAnalogStreamId() const { return m_rxAnalogStreamId; }
/** /**
* @brief Map of peer status. * @brief Map of peer status.
*/ */

Loading…
Cancel
Save

Powered by TurnKey Linux.