Add RAD_MON

Forgot to add the Net side of things

Fix sTyLe

Doh

Remove

Push new opcodes so I can make a LLA branch in git

because some idiot forgot to do that before adding stuff

Fix error Made by getting rid of opcodes and adding CR by recommendation
pull/16/head
Darjeeling 3 years ago committed by Rosesam
parent 485625cb5b
commit 8dc480660e

@ -305,10 +305,12 @@ namespace p25
const uint8_t TSBK_ISP_U_DEREG_REQ = 0x2BU; // U DE REG REQ - Unit De-Registration Request const uint8_t TSBK_ISP_U_DEREG_REQ = 0x2BU; // U DE REG REQ - Unit De-Registration Request
const uint8_t TSBK_ISP_LOC_REG_REQ = 0x2DU; // LOC REG REQ - Location Registration Request const uint8_t TSBK_ISP_LOC_REG_REQ = 0x2DU; // LOC REG REQ - Location Registration Request
const uint8_t TSBK_ISP_STS_Q_REQ = 0x1CU; // STS_Q_REQ - Status Query Request const uint8_t TSBK_ISP_STS_Q_REQ = 0x1CU; // STS_Q_REQ - Status Query Request
const uint8_t TSBK_ISP_AUTH_Q = 0x2EU; // AUTH_Q - Authentication Query const uint8_t TSBK_ISP_RAD_MON_REQ = 0x1DU; // RAD_MON_REQ - Radio Unit Monitor Request
const uint8_t TSBK_ISP_AUTH_RSP = 0x2FU; // AUTH_RSP - Authentication Response const uint8_t TSBK_ISP_RAD_MON_ENH_REQ = 0x1EU; // RAD_MON_ENH_REQ - Radio Unit Monitor Enhanced Request
const uint8_t TSBK_ISP_AUTH_FNE_RST = 0x3AU; // AUTH_FNE_RST - Authentication FNE Result
const uint8_t TSBK_ISP_AUTH_RESP = 0x38U; // AUTH_RESP - Authentication Response
const uint8_t TSBK_ISP_AUTH_RESP_M = 0x39U; // AUTH_RESP_M - Authentication Response Mutual
const uint8_t TSBK_ISP_AUTH_SU_DMD = 0x3BU; // AUTH_SU_DMD - Authentication SU Demand
// TSBK Outbound Signalling Packet (OSP) Opcode(s) // TSBK Outbound Signalling Packet (OSP) Opcode(s)
const uint8_t TSBK_OSP_GRP_VCH_GRANT_UPD = 0x02U; // GRP VCH GRANT UPD - Group Voice Channel Grant Update const uint8_t TSBK_OSP_GRP_VCH_GRANT_UPD = 0x02U; // GRP VCH GRANT UPD - Group Voice Channel Grant Update
@ -331,7 +333,11 @@ namespace p25
const uint8_t TSBK_OSP_ADJ_STS_BCAST = 0x3CU; // ADJ STS BCAST - Adjacent Site Status Broadcast const uint8_t TSBK_OSP_ADJ_STS_BCAST = 0x3CU; // ADJ STS BCAST - Adjacent Site Status Broadcast
const uint8_t TSBK_OSP_IDEN_UP = 0x3DU; // IDEN UP - Channel Identifier Update const uint8_t TSBK_OSP_IDEN_UP = 0x3DU; // IDEN UP - Channel Identifier Update
const uint8_t TSBK_OSP_STS_Q = 0x1AU; // STS_Q - Status Query const uint8_t TSBK_OSP_STS_Q = 0x1AU; // STS_Q - Status Query
const uint8_t TSBK_OSP_AUTH_CMD = 0x2EU; // AUTH_CMD - Authentication Command const uint8_t TSBK_OSP_AUTH_DMD = 0x31U; // AUTH_DMD - Authentication Demand
const uint8_t TSBK_OSP_AUTH_FNE_RESP = 0x32U; // AUTH_FNE_RESP - Authentication FNE Response
const uint8_t TSBK_OSP_RAD_MON_CMD = 0x1DU; // RAD_MON_CMD - Radio Monitor Command
const uint8_t TSBK_OSP_RAD_MON_ENH_CMD = 0x1EU; // RAD_MON_ENH_CMD - Radio Unit Monitor Enhanced Command
// TSBK Motorola Outbound Signalling Packet (OSP) Opcode(s) // TSBK Motorola Outbound Signalling Packet (OSP) Opcode(s)
const uint8_t TSBK_OSP_MOT_GRG_ADD = 0x00U; // MOT GRG ADD - Motorola / Group Regroup Add (Patch Supergroup) const uint8_t TSBK_OSP_MOT_GRG_ADD = 0x00U; // MOT GRG ADD - Motorola / Group Regroup Add (Patch Supergroup)

@ -8,6 +8,7 @@
*/ */
/* /*
* Copyright (C) 2017-2022 by Bryan Biedenkapp N2PLL * Copyright (C) 2017-2022 by Bryan Biedenkapp N2PLL
* Copyright (C) 2022 by Rosesam N5UWU
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -535,6 +536,11 @@ bool TSBK::decode(const uint8_t* data, bool rawTSBK)
m_adjChannelNo = (uint32_t)((tsbkValue >> 8) & 0xFFFU); // Site Channel Number m_adjChannelNo = (uint32_t)((tsbkValue >> 8) & 0xFFFU); // Site Channel Number
m_adjServiceClass = (uint8_t)(tsbkValue & 0xFFU); // Site Service Class m_adjServiceClass = (uint8_t)(tsbkValue & 0xFFU); // Site Service Class
break; break;
case TSBK_ISP_RAD_MON_REQ:
m_txMult = (uint8_t)((tsbkValue >> 48) & 0x3U); // TX Multiplier
m_dstId = (uint32_t)((tsbkValue >> 24) & 0xFFFFFFU); // Target Radio Address
m_srcId = (uint32_t)(tsbkValue & 0xFFFFFFU); // Source Radio Address
break;
default: default:
LogError(LOG_P25, "TSBK::decode(), unknown TSBK LCO value, mfId = $%02X, lco = $%02X", m_mfId, m_lco); LogError(LOG_P25, "TSBK::decode(), unknown TSBK LCO value, mfId = $%02X, lco = $%02X", m_mfId, m_lco);
break; break;
@ -945,6 +951,12 @@ void TSBK::encode(uint8_t* data, bool rawTSBK, bool noTrellis)
#endif #endif
} }
break; break;
case TSBK_OSP_RAD_MON_CMD:
{
tsbkValue = (tsbkValue << 48) + (m_txMult & 0x3U); // TX Multiplier
tsbkValue = (tsbkValue << 24) + (m_srcId & 0xFFFFFFU); // Source Radio Address
tsbkValue = tsbkValue + (m_dstId & 0xFFFFFFU); // Target Radio Address
}break;
default: default:
if (m_mfId == P25_MFG_STANDARD) { if (m_mfId == P25_MFG_STANDARD) {
LogError(LOG_P25, "TSBK::encode(), unknown TSBK LCO value, mfId = $%02X, lco = $%02X", m_mfId, m_lco); LogError(LOG_P25, "TSBK::encode(), unknown TSBK LCO value, mfId = $%02X, lco = $%02X", m_mfId, m_lco);

@ -207,6 +207,10 @@ namespace p25
/// <summary>Local Site Identity Entry.</summary> /// <summary>Local Site Identity Entry.</summary>
__PROPERTY_PLAIN(::lookups::IdenTable, siteIdenEntry, siteIdenEntry); __PROPERTY_PLAIN(::lookups::IdenTable, siteIdenEntry, siteIdenEntry);
/** Radio Unit Monitor */
/// <summary>Radio Unit Monitor.</summary>
__PROPERTY(uint8_t, txMult, TxMult);
private: private:
/// <summary>Initializes a new instance of the TSBK class.</summary> /// <summary>Initializes a new instance of the TSBK class.</summary>
TSBK(); TSBK();

@ -8,6 +8,7 @@
*/ */
/* /*
* Copyright (C) 2017-2022 by Bryan Biedenkapp N2PLL * Copyright (C) 2017-2022 by Bryan Biedenkapp N2PLL
* Copyright (C) 2022 by Rosesam N5UWU
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -213,6 +214,7 @@ bool Trunk::process(uint8_t* data, uint32_t len, bool preDecoded)
uint32_t srcId = m_rfTSBK.getSrcId(); uint32_t srcId = m_rfTSBK.getSrcId();
uint32_t dstId = m_rfTSBK.getDstId(); uint32_t dstId = m_rfTSBK.getDstId();
uint8_t txMult = m_rfTSBK.getTxMult();
// handle standard P25 reference opcodes // handle standard P25 reference opcodes
switch (m_rfTSBK.getLCO()) { switch (m_rfTSBK.getLCO()) {
@ -504,6 +506,21 @@ bool Trunk::process(uint8_t* data, uint32_t len, bool preDecoded)
writeRF_TSDU_Loc_Reg_Rsp(srcId, dstId); writeRF_TSDU_Loc_Reg_Rsp(srcId, dstId);
break; break;
case TSBK_ISP_RAD_MON_REQ:
// validate the source RID
VALID_SRCID("TSBK_ISP_RAD_MON_REQ (Radio Monitor)" , TSBK_ISP_RAD_MON_REQ , srcId);
// validate the target RID
VALID_DSTID("TSBK_ISP_RAD_MON_REQ (Radio monitor)" , TSBK_ISP_RAD_MON_REQ , dstId);
if ( m_verbose ) {
LogMessage(LOG_RF , P25_TSDU_STR ", TSBK_ISP_RAD_MON_REQ (Radio Monitor), srcId = %u, dstId = %u" , srcId , dstId);
}
::ActivityLog("P25" , true , "radio monitor request from %u to %u" , srcId , dstId);
writeRF_TSDU_Radio_Mon(srcId , dstId, txMult);
break;
default: default:
LogError(LOG_RF, P25_TSDU_STR ", unhandled LCO, mfId = $%02X, lco = $%02X", m_rfTSBK.getMFId(), m_rfTSBK.getLCO()); LogError(LOG_RF, P25_TSDU_STR ", unhandled LCO, mfId = $%02X, lco = $%02X", m_rfTSBK.getMFId(), m_rfTSBK.getLCO());
break; break;
@ -606,6 +623,7 @@ bool Trunk::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, data::L
uint32_t srcId = m_netTSBK.getSrcId(); uint32_t srcId = m_netTSBK.getSrcId();
uint32_t dstId = m_netTSBK.getDstId(); uint32_t dstId = m_netTSBK.getDstId();
uint8_t txMult = m_rfTSBK.getTxMult();
// handle internal DVM TSDUs // handle internal DVM TSDUs
if (m_netTSBK.getMFId() == P25_MFG_DVM) { if (m_netTSBK.getMFId() == P25_MFG_DVM) {
@ -780,6 +798,21 @@ bool Trunk::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, data::L
m_netTSBK.getAIV(), m_netTSBK.getResponse(), m_netTSBK.getSrcId(), m_netTSBK.getDstId()); m_netTSBK.getAIV(), m_netTSBK.getResponse(), m_netTSBK.getSrcId(), m_netTSBK.getDstId());
} }
break; break;
case TSBK_ISP_RAD_MON_REQ:
// validate the source RID
VALID_SRCID("TSBK_ISP_RAD_MON_REQ (Radio Monitor)" , TSBK_ISP_RAD_MON_REQ , srcId);
// validate the target RID
VALID_DSTID("TSBK_ISP_RAD_MON_REQ (Radio monitor)" , TSBK_ISP_RAD_MON_REQ , dstId);
if ( m_verbose ) {
LogMessage(LOG_RF , P25_TSDU_STR ", TSBK_ISP_RAD_MON_REQ (Radio Monitor), srcId = %u, dstId = %u" , srcId , dstId);
}
::ActivityLog("P25" , true , "radio monitor request from %u to %u" , srcId , dstId);
writeRF_TSDU_Radio_Mon(srcId , dstId , txMult);
break;
default: default:
LogError(LOG_NET, P25_TSDU_STR ", unhandled LCO, mfId = $%02X, lco = $%02X", m_netTSBK.getMFId(), m_netTSBK.getLCO()); LogError(LOG_NET, P25_TSDU_STR ", unhandled LCO, mfId = $%02X, lco = $%02X", m_netTSBK.getMFId(), m_netTSBK.getLCO());
return false; return false;
@ -959,6 +992,27 @@ void Trunk::writeRF_TSDU_Call_Alrt(uint32_t srcId, uint32_t dstId)
writeRF_TSDU_SBF(false); writeRF_TSDU_SBF(false);
} }
/// <summary>
/// Helper to write a radio monitor packet.
/// </summary>
/// <param name="srcId"></param>
/// <param name="dstId"></param>
/// <param name="txmult"></param>
void Trunk::writeRF_TSDU_Radio_Mon(uint32_t srcId, uint32_t dstId, uint8_t txmult)
{
if (m_verbose) {
LogMessage(LOG_RF , P25_TSDU_STR ", TSBK_OSP_RAD_MON_CMD (Radio monitor), srcId = %u, dstId = %u, txmult = %u" , srcId, dstId, txmult);
}
::ActivityLog("P25" , true , "call alert request from %u to %u" , srcId , dstId);
m_rfTSBK.setLCO(TSBK_OSP_RAD_MON_CMD);
m_rfTSBK.setSrcId(srcId);
m_rfTSBK.setDstId(dstId);
m_rfTSBK.setTxMult(txmult);
writeRF_TSDU_SBF(false);
}
/// <summary> /// <summary>
/// Helper to write a extended function packet. /// Helper to write a extended function packet.
/// </summary> /// </summary>

@ -85,6 +85,8 @@ namespace p25
void setMFId(uint8_t val) { m_rfTSBK.setMFId(val); } void setMFId(uint8_t val) { m_rfTSBK.setMFId(val); }
/// <summary>Helper to write a call alert packet.</summary> /// <summary>Helper to write a call alert packet.</summary>
void writeRF_TSDU_Call_Alrt(uint32_t srcId, uint32_t dstId); void writeRF_TSDU_Call_Alrt(uint32_t srcId, uint32_t dstId);
/// <summary>Helper to write a call alert packet.</summary>
void writeRF_TSDU_Radio_Mon(uint32_t srcId, uint32_t dstId, uint8_t txmult);
/// <summary>Helper to write a extended function packet.</summary> /// <summary>Helper to write a extended function packet.</summary>
void writeRF_TSDU_Ext_Func(uint32_t func, uint32_t arg, uint32_t dstId); void writeRF_TSDU_Ext_Func(uint32_t func, uint32_t arg, uint32_t dstId);
/// <summary>Helper to write a group affiliation query packet.</summary> /// <summary>Helper to write a group affiliation query packet.</summary>

Loading…
Cancel
Save

Powered by TurnKey Linux.