From c7f1d20c3db4f9ecc18c4bc00e4a61a76a33a936 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Mon, 1 Aug 2022 21:23:33 -0400 Subject: [PATCH] experimental support to repeat a TSBK_ISP_EMERG_ALRM_REQ locally; --- config.example.yml | 1 + p25/Control.cpp | 1 + p25/lc/TSBK.cpp | 2 +- p25/packet/Trunk.cpp | 33 +++++++++++++++++++++++++++++++++ p25/packet/Trunk.h | 3 +++ 5 files changed, 39 insertions(+), 1 deletion(-) diff --git a/config.example.yml b/config.example.yml index c7cba6ff..312b83a1 100644 --- a/config.example.yml +++ b/config.example.yml @@ -70,6 +70,7 @@ protocols: noStatusAck: false noMessageAck: true unitToUnitAvailCheck: true + localEmergAlarm: false sndcpGrant: false silenceThreshold: 124 disableNetworkHDU: false diff --git a/p25/Control.cpp b/p25/Control.cpp index fb8547a1..af321b2d 100644 --- a/p25/Control.cpp +++ b/p25/Control.cpp @@ -236,6 +236,7 @@ void Control::setOptions(yaml::Node& conf, const std::string cwCallsign, const s m_trunk->m_noMessageAck = p25Protocol["noMessageAck"].as(true); m_trunk->m_unitToUnitAvailCheck = p25Protocol["unitToUnitAvailCheck"].as(true); + m_trunk->m_localEmergAlarm = p25Protocol["localEmergAlarm"].as(false); m_trunk->m_sndcpChGrant = p25Protocol["sndcpGrant"].as(false); yaml::Node control = p25Protocol["control"]; diff --git a/p25/lc/TSBK.cpp b/p25/lc/TSBK.cpp index 77234865..4e1f6f49 100644 --- a/p25/lc/TSBK.cpp +++ b/p25/lc/TSBK.cpp @@ -692,7 +692,7 @@ void TSBK::encode(uint8_t* data, bool rawTSBK, bool noTrellis) tsbkValue = (tsbkValue << 16) + m_dstId; // Talkgroup Address tsbkValue = (tsbkValue << 32) + 0; break; - case TSBK_OSP_DENY_RSP: + case TSBK_OSP_DENY_RSP: // TSBK_ISP_EMERG_ALRM_REQ case TSBK_OSP_QUE_RSP: { if (m_response == 0U) { diff --git a/p25/packet/Trunk.cpp b/p25/packet/Trunk.cpp index 2ce0d6d7..27cbb7e5 100644 --- a/p25/packet/Trunk.cpp +++ b/p25/packet/Trunk.cpp @@ -430,6 +430,9 @@ bool Trunk::process(uint8_t* data, uint32_t len, bool preDecoded) ::ActivityLog("P25", true, "emergency alarm request request from %u", srcId); writeRF_TSDU_ACK_FNE(srcId, TSBK_ISP_EMERG_ALRM_REQ, false, true); + if (m_localEmergAlarm) { + writeRF_TSDU_Emerg_Alrm(srcId, dstId); + } } break; case TSBK_IOSP_GRP_AFF: @@ -1231,6 +1234,35 @@ void Trunk::writeRF_TSDU_U_Reg_Cmd(uint32_t dstId) writeRF_TSDU_SBF(true); } +/// +/// Helper to write a emergency alarm packet. +/// +/// +/// +void Trunk::writeRF_TSDU_Emerg_Alrm(uint32_t srcId, uint32_t dstId) +{ + uint8_t lco = m_rfTSBK.getLCO(); + uint32_t _srcId = m_rfTSBK.getSrcId(); + + m_rfTSBK.setLCO(TSBK_ISP_EMERG_ALRM_REQ); + m_rfTSBK.setSrcId(P25_WUID_FNE); + m_rfTSBK.setService(0U); + m_rfTSBK.setResponse(0U); + + m_rfTSBK.setSrcId(srcId); + m_rfTSBK.setDstId(dstId); + + if (m_verbose) { + LogMessage(LOG_RF, P25_TSDU_STR ", TSBK_ISP_EMERG_ALRM_REQ (Emergency Alarm Request), srcId = %u, dstId = %u", + srcId, dstId); + } + + writeRF_TSDU_SBF(true); + + m_rfTSBK.setLCO(lco); + m_rfTSBK.setSrcId(_srcId); +} + /// /// Helper to write a Motorola patch packet. /// @@ -1335,6 +1367,7 @@ Trunk::Trunk(Control* p25, network::BaseNetwork* network, bool dumpTSBKData, boo m_adjSiteUpdateTimer(1000U), m_adjSiteUpdateInterval(ADJ_SITE_TIMER_TIMEOUT), m_ctrlTSDUMBF(true), + m_localEmergAlarm(false), m_sndcpChGrant(false), m_dumpTSBK(dumpTSBKData), m_verbose(verbose), diff --git a/p25/packet/Trunk.h b/p25/packet/Trunk.h index d699c654..aac1870a 100644 --- a/p25/packet/Trunk.h +++ b/p25/packet/Trunk.h @@ -106,6 +106,8 @@ namespace p25 void writeRF_TSDU_Grp_Aff_Q(uint32_t dstId); /// Helper to write a unit registration command packet. void writeRF_TSDU_U_Reg_Cmd(uint32_t dstId); + /// Helper to write a emergency alarm packet. + void writeRF_TSDU_Emerg_Alrm(uint32_t srcId, uint32_t dstId); /// Helper to write a Motorola patch packet. void writeRF_TSDU_Mot_Patch(uint32_t group1, uint32_t group2, uint32_t group3); @@ -169,6 +171,7 @@ namespace p25 bool m_ctrlTSDUMBF; + bool m_localEmergAlarm; bool m_sndcpChGrant; bool m_dumpTSBK;