diff --git a/src/sysview/AffListWnd.h b/src/sysview/AffListWnd.h index b860b82e..08c9b6c3 100644 --- a/src/sysview/AffListWnd.h +++ b/src/sysview/AffListWnd.h @@ -122,15 +122,19 @@ public: std::ostringstream peerOss; peerOss << std::setw(9) << std::setfill('0') << peerId; + std::string srcAlias = resolveRID(srcId); + // pad TGs properly std::ostringstream tgidOss; tgidOss << std::setw(5) << std::setfill('0') << dstId; + std::string dstAlias = resolveTGID(dstId); + // build list view entry - const std::array columns = { + const std::array columns = { peerOss.str(), - std::to_string(srcId), - tgidOss.str() + std::to_string(srcId), srcAlias, + tgidOss.str(), dstAlias }; const finalcut::FStringList line(columns.cbegin(), columns.cend()); @@ -187,21 +191,23 @@ private: // configure list view columns m_listView.addColumn("Peer ID", 10); m_listView.addColumn("RID", 10); + m_listView.addColumn("RID Alias", 15); m_listView.addColumn("TGID", 9); + m_listView.addColumn("TGID Alias", 15); // set right alignment for TGID m_listView.setColumnAlignment(1, finalcut::Align::Right); m_listView.setColumnAlignment(2, finalcut::Align::Right); - m_listView.setColumnAlignment(3, finalcut::Align::Right); + m_listView.setColumnAlignment(4, finalcut::Align::Right); // set type of sorting m_listView.setColumnSortType(1, finalcut::SortType::Name); m_listView.setColumnSortType(2, finalcut::SortType::Name); - m_listView.setColumnSortType(3, finalcut::SortType::Name); + m_listView.setColumnSortType(4, finalcut::SortType::Name); // sort by TGID m_listView.setColumnSort(1, finalcut::SortOrder::Ascending); - m_listView.setColumnSort(3, finalcut::SortOrder::Ascending); + m_listView.setColumnSort(4, finalcut::SortOrder::Ascending); setFocusWidget(&m_listView); redraw(); diff --git a/src/sysview/Defines.h b/src/sysview/Defines.h index cb32edcd..2aaff965 100644 --- a/src/sysview/Defines.h +++ b/src/sysview/Defines.h @@ -30,4 +30,7 @@ #undef __EXE_NAME__ #define __EXE_NAME__ "sysview" +#undef __NETVER__ +#define __NETVER__ "SYSVIEW_R" VERSION_MAJOR VERSION_REV VERSION_MINOR + #endif // __DEFINES_H__ diff --git a/src/sysview/SysViewApplication.h b/src/sysview/SysViewApplication.h index 83dc20fe..5c9f0cac 100644 --- a/src/sysview/SysViewApplication.h +++ b/src/sysview/SysViewApplication.h @@ -371,14 +371,15 @@ protected: // is this the end of the call stream? if (dataSync && (dataType == DMRDEF::DataType::TERMINATOR_WITH_LC)) { if (srcId == 0U && dstId == 0U) { - LogWarning(LOG_NET, "DMR, invalid TERMINATOR, srcId = %u, dstId = %u", srcId, dstId); + LogWarning(LOG_NET, "DMR, invalid TERMINATOR, srcId = %u (%s), dstId = %u (%s)", + srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); } RxStatus status; auto it = std::find_if(m_dmrStatus.begin(), m_dmrStatus.end(), [&](StatusMapPair x) { return (x.second.dstId == dstId && x.second.slotNo == slotNo); }); if (it == m_dmrStatus.end()) { - LogError(LOG_NET, "DMR, tried to end call for non-existent call in progress?, srcId = %u, dstId = %u", - srcId, dstId); + LogError(LOG_NET, "DMR, tried to end call for non-existent call in progress?, srcId = %u (%s), dstId = %u (%s)", + srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); } else { status = it->second; @@ -389,15 +390,16 @@ protected: if (std::find_if(m_dmrStatus.begin(), m_dmrStatus.end(), [&](StatusMapPair x) { return (x.second.dstId == dstId && x.second.slotNo == slotNo); }) != m_dmrStatus.end()) { m_dmrStatus.erase(dstId); - LogMessage(LOG_NET, "DMR, Call End, srcId = %u, dstId = %u, duration = %u", - srcId, dstId, duration / 1000); + LogMessage(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); } } // is this a new call stream? if (dataSync && (dataType == DMRDEF::DataType::VOICE_LC_HEADER)) { if (srcId == 0U && dstId == 0U) { - LogWarning(LOG_NET, "DMR, invalid call, srcId = %u, dstId = %u", srcId, dstId); + LogWarning(LOG_NET, "DMR, invalid call, srcId = %u (%s), dstId = %u (%s)", + srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); } auto it = std::find_if(m_dmrStatus.begin(), m_dmrStatus.end(), [&](StatusMapPair x) { return (x.second.dstId == dstId && x.second.slotNo == slotNo); }); @@ -410,7 +412,8 @@ protected: status.slotNo = slotNo; m_dmrStatus[dstId] = status; // this *could* be an issue if a dstId appears on both slots somehow... - LogMessage(LOG_NET, "DMR, Call Start, srcId = %u, dstId = %u", srcId, dstId); + LogMessage(LOG_NET, "DMR, Call Start, srcId = %u (%s), dstId = %u (%s)", + srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); } } @@ -432,7 +435,8 @@ protected: } break; default: - LogMessage(LOG_NET, "DMR Slot %u, DT_CSBK, %s, srcId = %u, dstId = %u", dmrData.getSlotNo(), csbk->toString().c_str(), srcId, dstId); + LogMessage(LOG_NET, "DMR Slot %u, DT_CSBK, %s, srcId = %u (%s), dstId = %u (%s)", dmrData.getSlotNo(), csbk->toString().c_str(), + srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); break; } } @@ -483,7 +487,8 @@ protected: // is this the end of the call stream? if ((duid == P25DEF::DUID::TDU) || (duid == P25DEF::DUID::TDULC)) { if (srcId == 0U && dstId == 0U) { - LogWarning(LOG_NET, "P25, invalid TDU, srcId = %u, dstId = %u", srcId, dstId); + LogWarning(LOG_NET, "P25, invalid TDU, srcId = %u (%s), dstId = %u (%s)", + srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); } RxStatus status = m_p25Status[dstId]; @@ -492,15 +497,16 @@ protected: if (std::find_if(m_p25Status.begin(), m_p25Status.end(), [&](StatusMapPair x) { return x.second.dstId == dstId; }) != m_p25Status.end()) { m_p25Status.erase(dstId); - LogMessage(LOG_NET, "P25, Call End, srcId = %u, dstId = %u, duration = %u", - srcId, dstId, duration / 1000); + LogMessage(LOG_NET, "P25, Call End, srcId = %u (%s), dstId = %u (%s), duration = %u", + srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str(), duration / 1000); } } // is this a new call stream? if ((duid != P25DEF::DUID::TDU) && (duid != P25DEF::DUID::TDULC)) { if (srcId == 0U && dstId == 0U) { - LogWarning(LOG_NET, "P25, invalid call, srcId = %u, dstId = %u", srcId, dstId); + LogWarning(LOG_NET, "P25, invalid call, srcId = %u (%s), dstId = %u (%s)", + srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); } auto it = std::find_if(m_p25Status.begin(), m_p25Status.end(), [&](StatusMapPair x) { return x.second.dstId == dstId; }); @@ -512,7 +518,8 @@ protected: status.dstId = dstId; m_p25Status[dstId] = status; - LogMessage(LOG_NET, "P25, Call Start, srcId = %u, dstId = %u", srcId, dstId); + LogMessage(LOG_NET, "P25, Call Start, srcId = %u (%s), dstId = %u (%s)", + srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); } } } @@ -521,7 +528,8 @@ protected: case P25DEF::DUID::TDU: case P25DEF::DUID::TDULC: if (duid == P25DEF::DUID::TDU) { - LogMessage(LOG_NET, P25_TDU_STR ", srcId = %u, dstId = %u", srcId, dstId); + LogMessage(LOG_NET, P25_TDU_STR ", srcId = %u (%s), dstId = %u (%s)", + srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); } else { std::unique_ptr tdulc = lc::tdulc::TDULCFactory::createTDULC(data.get()); @@ -529,7 +537,8 @@ protected: LogWarning(LOG_NET, P25_TDULC_STR ", undecodable TDULC"); } else { - LogMessage(LOG_NET, P25_TDULC_STR ", srcId = %u, dstId = %u", srcId, dstId); + LogMessage(LOG_NET, P25_TDULC_STR ", srcId = %u (%s), dstId = %u (%s)", + srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); } } break; @@ -544,49 +553,55 @@ protected: case P25DEF::TSBKO::IOSP_GRP_VCH: case P25DEF::TSBKO::IOSP_UU_VCH: { - LogMessage(LOG_NET, P25_TSDU_STR ", %s, emerg = %u, encrypt = %u, prio = %u, chNo = %u, srcId = %u, dstId = %u", - tsbk->toString(true).c_str(), tsbk->getEmergency(), tsbk->getEncrypted(), tsbk->getPriority(), tsbk->getGrpVchNo(), srcId, dstId); + LogMessage(LOG_NET, P25_TSDU_STR ", %s, emerg = %u, encrypt = %u, prio = %u, chNo = %u, srcId = %u (%s), dstId = %u (%s)", + tsbk->toString(true).c_str(), tsbk->getEmergency(), tsbk->getEncrypted(), tsbk->getPriority(), tsbk->getGrpVchNo(), + srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); } break; case P25DEF::TSBKO::IOSP_UU_ANS: { lc::tsbk::IOSP_UU_ANS* iosp = static_cast(tsbk.get()); if (iosp->getResponse() > 0U) { - LogMessage(LOG_NET, P25_TSDU_STR ", %s, response = $%02X, srcId = %u, dstId = %u", - tsbk->toString(true).c_str(), iosp->getResponse(), srcId, dstId); + LogMessage(LOG_NET, P25_TSDU_STR ", %s, response = $%02X, srcId = %u (%s), dstId = %u (%s)", + tsbk->toString(true).c_str(), iosp->getResponse(), + srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); } } break; case P25DEF::TSBKO::IOSP_STS_UPDT: { lc::tsbk::IOSP_STS_UPDT* iosp = static_cast(tsbk.get()); - LogMessage(LOG_NET, P25_TSDU_STR ", %s, status = $%02X, srcId = %u", - tsbk->toString(true).c_str(), iosp->getStatus(), srcId); + LogMessage(LOG_NET, P25_TSDU_STR ", %s, status = $%02X, srcId = %u (%s)", + tsbk->toString(true).c_str(), iosp->getStatus(), srcId, resolveRID(srcId).c_str()); } break; case P25DEF::TSBKO::IOSP_MSG_UPDT: { lc::tsbk::IOSP_MSG_UPDT* iosp = static_cast(tsbk.get()); - LogMessage(LOG_NET, P25_TSDU_STR ", %s, message = $%02X, srcId = %u, dstId = %u", - tsbk->toString(true).c_str(), iosp->getMessage(), srcId, dstId); + LogMessage(LOG_NET, P25_TSDU_STR ", %s, message = $%02X, srcId = %u (%s), dstId = %u (%s)", + tsbk->toString(true).c_str(), iosp->getMessage(), + srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); } break; case P25DEF::TSBKO::IOSP_RAD_MON: { lc::tsbk::IOSP_RAD_MON* iosp = static_cast(tsbk.get()); - LogMessage(LOG_NET, P25_TSDU_STR ", %s, srcId = %u, dstId = %u", tsbk->toString(true).c_str(), srcId, dstId); + LogMessage(LOG_NET, P25_TSDU_STR ", %s, srcId = %u (%s), dstId = %u (%s)", tsbk->toString(true).c_str(), + srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); } break; case P25DEF::TSBKO::IOSP_CALL_ALRT: { - LogMessage(LOG_NET, P25_TSDU_STR ", %s, srcId = %u, dstId = %u", tsbk->toString(true).c_str(), srcId, dstId); + LogMessage(LOG_NET, P25_TSDU_STR ", %s, srcId = %u (%s), dstId = %u (%s)", tsbk->toString(true).c_str(), + srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); } break; case P25DEF::TSBKO::IOSP_ACK_RSP: { lc::tsbk::IOSP_ACK_RSP* iosp = static_cast(tsbk.get()); - LogMessage(LOG_NET, P25_TSDU_STR ", %s, AIV = %u, serviceType = $%02X, srcId = %u, dstId = %u", - tsbk->toString(true).c_str(), iosp->getAIV(), iosp->getService(), dstId, srcId); + LogMessage(LOG_NET, P25_TSDU_STR ", %s, AIV = %u, serviceType = $%02X, srcId = %u (%s), dstId = %u (%s)", + tsbk->toString(true).c_str(), iosp->getAIV(), iosp->getService(), + srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); } break; case P25DEF::TSBKO::IOSP_EXT_FNCT: @@ -601,31 +616,34 @@ protected: // non-emergency mode is a TSBKO::OSP_DENY_RSP if (!tsbk->getEmergency()) { lc::tsbk::OSP_DENY_RSP* osp = static_cast(tsbk.get()); - LogMessage(LOG_NET, P25_TSDU_STR ", %s, AIV = %u, reason = $%02X, srcId = %u, dstId = %u", - osp->toString().c_str(), osp->getAIV(), osp->getResponse(), osp->getSrcId(), osp->getDstId()); + LogMessage(LOG_NET, P25_TSDU_STR ", %s, AIV = %u, reason = $%02X, srcId = %u (%s), dstId = %u (%s)", + osp->toString().c_str(), osp->getAIV(), osp->getResponse(), + osp->getSrcId(), resolveRID(osp->getSrcId()).c_str(), osp->getDstId(), resolveTGID(osp->getDstId()).c_str()); } else { - LogMessage(LOG_NET, P25_TSDU_STR ", %s, srcId = %u, dstId = %u", tsbk->toString().c_str(), srcId, dstId); + LogMessage(LOG_NET, P25_TSDU_STR ", %s, srcId = %u (%s), dstId = %u (%s)", tsbk->toString().c_str(), + srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); } } break; case P25DEF::TSBKO::IOSP_GRP_AFF: { lc::tsbk::IOSP_GRP_AFF* iosp = static_cast(tsbk.get()); - LogMessage(LOG_NET, P25_TSDU_STR ", %s, sysId = $%03X, srcId = %u, dstId = %u", tsbk->toString().c_str(), - iosp->getSysId(), srcId, dstId); + LogMessage(LOG_NET, P25_TSDU_STR ", %s, sysId = $%03X, srcId = %u (%s), dstId = %u (%s)", tsbk->toString().c_str(), + iosp->getSysId(), srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); } break; case P25DEF::TSBKO::OSP_U_DEREG_ACK: { lc::tsbk::OSP_U_DEREG_ACK* iosp = static_cast(tsbk.get()); - LogMessage(LOG_NET, P25_TSDU_STR ", %s, srcId = %u", - tsbk->toString(true).c_str(), srcId); + LogMessage(LOG_NET, P25_TSDU_STR ", %s, srcId = %u (%s)", + tsbk->toString(true).c_str(), srcId, resolveRID(srcId).c_str()); } break; case P25DEF::TSBKO::OSP_LOC_REG_RSP: { lc::tsbk::OSP_LOC_REG_RSP* osp = static_cast(tsbk.get()); - LogMessage(LOG_NET, P25_TSDU_STR ", %s, srcId = %u, dstId = %u", osp->toString().c_str(), srcId, dstId); + LogMessage(LOG_NET, P25_TSDU_STR ", %s, srcId = %u (%s), dstId = %u (%s)", osp->toString().c_str(), + srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); } break; case P25DEF::TSBKO::OSP_ADJ_STS_BCAST: @@ -636,7 +654,8 @@ protected: } break; default: - LogMessage(LOG_NET, P25_TSDU_STR ", %s, srcId = %u, dstId = %u", tsbk->toString().c_str(), srcId, dstId); + LogMessage(LOG_NET, P25_TSDU_STR ", %s, srcId = %u (%s), dstId = %u (%s)", tsbk->toString().c_str(), + srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); break; } } @@ -672,7 +691,8 @@ protected: // is this the end of the call stream? if (messageType == NXDDEF::MessageType::RTCH_TX_REL || messageType == NXDDEF::MessageType::RTCH_TX_REL_EX) { if (srcId == 0U && dstId == 0U) { - LogWarning(LOG_NET, "NXDN, invalid TX_REL, srcId = %u, dstId = %u", srcId, dstId); + LogWarning(LOG_NET, "NXDN, invalid TX_REL, srcId = %u (%s), dstId = %u (%s)", + srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); } RxStatus status = m_nxdnStatus[dstId]; @@ -681,15 +701,16 @@ protected: if (std::find_if(m_nxdnStatus.begin(), m_nxdnStatus.end(), [&](StatusMapPair x) { return x.second.dstId == dstId; }) != m_nxdnStatus.end()) { m_nxdnStatus.erase(dstId); - LogMessage(LOG_NET, "NXDN, Call End, srcId = %u, dstId = %u, duration = %u", - srcId, dstId, duration / 1000); + LogMessage(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); } } // is this a new call stream? if ((messageType != NXDDEF::MessageType::RTCH_TX_REL && messageType != NXDDEF::MessageType::RTCH_TX_REL_EX)) { if (srcId == 0U && dstId == 0U) { - LogWarning(LOG_NET, "NXDN, invalid call, srcId = %u, dstId = %u", srcId, dstId); + LogWarning(LOG_NET, "NXDN, invalid call, srcId = %u (%s), dstId = %u (%s)", + srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); } auto it = std::find_if(m_nxdnStatus.begin(), m_nxdnStatus.end(), [&](StatusMapPair x) { return x.second.dstId == dstId; }); @@ -701,7 +722,8 @@ protected: status.dstId = dstId; m_nxdnStatus[dstId] = status; - LogMessage(LOG_NET, "NXDN, Call Start, srcId = %u, dstId = %u", srcId, dstId); + LogMessage(LOG_NET, "NXDN, Call Start, srcId = %u (%s), dstId = %u (%s)", + srcId, resolveRID(srcId).c_str(), dstId, resolveTGID(dstId).c_str()); } } } diff --git a/src/sysview/SysViewMain.cpp b/src/sysview/SysViewMain.cpp index c6f4c533..0c6b330d 100644 --- a/src/sysview/SysViewMain.cpp +++ b/src/sysview/SysViewMain.cpp @@ -66,6 +66,56 @@ void fatal(const char* msg, ...) exit(EXIT_FAILURE); } +/** + * @brief Helper to resolve a TGID to a textual name. + * @param id Talkgroup ID. + * @return std::string Textual name for TGID. + */ +std::string resolveRID(uint32_t id) +{ + switch (id) { + case DMRDEF::WUID_REGI: + return std::string("DMR REG SVCS"); + case DMRDEF::WUID_STUNI: + return std::string("DMR MS STUN"); + case DMRDEF::WUID_AUTHI: + return std::string("DMR AUTH SVCS"); + case DMRDEF::WUID_KILLI: + return std::string("DMR MS KILL"); + case DMRDEF::WUID_ALLL: + return std::string("ALL CALL SW"); + + case P25DEF::WUID_REG: + return std::string("REG SVCS"); + case P25DEF::WUID_FNE: + return std::string("SYS/FNE"); + case P25DEF::WUID_ALL: + return std::string("ALL CALL"); + } + + auto entry = g_ridLookup->find(id); + if (!entry.radioDefault()) { + return entry.radioAlias(); + } + + return std::string("UNK"); +} + +/** + * @brief Helper to resolve a TGID to a textual name. + * @param id Talkgroup ID. + * @return std::string Textual name for TGID. + */ +std::string resolveTGID(uint32_t id) +{ + auto entry = g_tidLookup->find(id); + if (!entry.isInvalid()) { + return entry.name(); + } + + return std::string("UNK"); +} + /** * @brief Initializes peer network connectivity. * @returns bool @@ -255,8 +305,8 @@ int main(int argc, char** argv) g_ridLookup->read(); // try to load talkgroup IDs table - std::string tidLookupFile = g_conf["talkgroup_id"]["file"].as(); - uint32_t tidReloadTime = g_conf["talkgroup_id"]["time"].as(0U); + std::string tidLookupFile = g_conf["talkgroup_rules"]["file"].as(); + uint32_t tidReloadTime = g_conf["talkgroup_rules"]["time"].as(0U); LogInfo("Talkgroup Rule Lookups"); LogInfo(" File: %s", tidLookupFile.length() > 0U ? tidLookupFile.c_str() : "None"); diff --git a/src/sysview/SysViewMain.h b/src/sysview/SysViewMain.h index 888f4add..58223981 100644 --- a/src/sysview/SysViewMain.h +++ b/src/sysview/SysViewMain.h @@ -33,6 +33,9 @@ #undef __EXE_NAME__ #define __EXE_NAME__ "sysview" +#undef __NETVER__ +#define __NETVER__ "SYSVIEW_R" VERSION_MAJOR VERSION_REV VERSION_MINOR + // --------------------------------------------------------------------------- // Externs // --------------------------------------------------------------------------- @@ -66,6 +69,20 @@ extern lookups::IdenTableLookup* g_idenTable; */ extern HOST_SW_API void fatal(const char* msg, ...); +/** + * @brief Helper to resolve a TGID to a textual name. + * @param id Talkgroup ID. + * @return std::string Textual name for TGID. + */ +extern HOST_SW_API std::string resolveRID(uint32_t id); + +/** + * @brief Helper to resolve a TGID to a textual name. + * @param id Talkgroup ID. + * @return std::string Textual name for TGID. + */ +extern HOST_SW_API std::string resolveTGID(uint32_t id); + /** * @brief Initializes peer network connectivity. * @returns bool