From cb0500b2e73945a1d8810ef0598457b5a809a9d1 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Fri, 21 Jun 2024 20:48:15 -0400 Subject: [PATCH] treewide: refactor constant variables into proper enumerations where appropriate (this applies to DMR, P25 and NXDN, and may introduce gremlins); --- src/common/Defines.h | 4 +- src/common/dmr/DMRDefines.h | 674 ++++++++------ src/common/dmr/DMRUtils.h | 32 +- src/common/dmr/SiteData.h | 22 +- src/common/dmr/SlotType.cpp | 42 +- src/common/dmr/SlotType.h | 4 +- src/common/dmr/Sync.cpp | 1 + src/common/dmr/data/Data.cpp | 8 +- src/common/dmr/data/Data.h | 6 +- src/common/dmr/data/DataHeader.cpp | 43 +- src/common/dmr/data/DataHeader.h | 4 +- src/common/dmr/data/EmbeddedData.cpp | 10 +- src/common/dmr/data/EmbeddedData.h | 4 +- src/common/dmr/lc/CSBK.cpp | 69 +- src/common/dmr/lc/CSBK.h | 5 +- src/common/dmr/lc/FullLC.cpp | 17 +- src/common/dmr/lc/FullLC.h | 7 +- src/common/dmr/lc/LC.cpp | 21 +- src/common/dmr/lc/LC.h | 7 +- src/common/dmr/lc/PrivacyLC.cpp | 11 +- src/common/dmr/lc/ShortLC.cpp | 2 +- src/common/dmr/lc/csbk/CSBKFactory.cpp | 43 +- src/common/dmr/lc/csbk/CSBKFactory.h | 5 +- src/common/dmr/lc/csbk/CSBK_ACK_RSP.cpp | 13 +- src/common/dmr/lc/csbk/CSBK_ALOHA.cpp | 11 +- src/common/dmr/lc/csbk/CSBK_BROADCAST.cpp | 25 +- src/common/dmr/lc/csbk/CSBK_BSDWNACT.cpp | 11 +- src/common/dmr/lc/csbk/CSBK_CALL_ALRT.cpp | 11 +- src/common/dmr/lc/csbk/CSBK_EXT_FNCT.cpp | 13 +- src/common/dmr/lc/csbk/CSBK_MAINT.cpp | 11 +- src/common/dmr/lc/csbk/CSBK_NACK_RSP.cpp | 11 +- src/common/dmr/lc/csbk/CSBK_PD_GRANT.cpp | 11 +- src/common/dmr/lc/csbk/CSBK_PRECCSBK.cpp | 11 +- src/common/dmr/lc/csbk/CSBK_PV_GRANT.cpp | 11 +- src/common/dmr/lc/csbk/CSBK_P_CLEAR.cpp | 11 +- src/common/dmr/lc/csbk/CSBK_P_GRANT.cpp | 11 +- src/common/dmr/lc/csbk/CSBK_RAND.cpp | 37 +- src/common/dmr/lc/csbk/CSBK_RAW.cpp | 9 +- src/common/dmr/lc/csbk/CSBK_TD_GRANT.cpp | 11 +- src/common/dmr/lc/csbk/CSBK_TV_GRANT.cpp | 11 +- src/common/dmr/lc/csbk/CSBK_UU_ANS_RSP.cpp | 11 +- src/common/dmr/lc/csbk/CSBK_UU_V_REQ.cpp | 11 +- src/common/lookups/RadioIdLookup.cpp | 4 +- src/common/network/BaseNetwork.cpp | 144 +-- src/common/network/BaseNetwork.h | 8 +- src/common/nxdn/NXDNDefines.h | 597 ++++++++----- src/common/nxdn/NXDNUtils.cpp | 3 +- src/common/nxdn/SiteData.h | 6 +- src/common/nxdn/Sync.cpp | 2 + src/common/nxdn/channel/CAC.cpp | 13 +- src/common/nxdn/channel/CAC.h | 5 +- src/common/nxdn/channel/FACCH1.cpp | 1 + src/common/nxdn/channel/LICH.cpp | 27 +- src/common/nxdn/channel/LICH.h | 9 +- src/common/nxdn/channel/SACCH.cpp | 13 +- src/common/nxdn/channel/SACCH.h | 5 +- src/common/nxdn/channel/UDCH.cpp | 3 +- src/common/nxdn/lc/PacketInformation.cpp | 25 +- src/common/nxdn/lc/RCCH.cpp | 27 +- src/common/nxdn/lc/RTCH.cpp | 105 +-- .../nxdn/lc/rcch/MESSAGE_TYPE_DCALL_HDR.cpp | 11 +- .../nxdn/lc/rcch/MESSAGE_TYPE_DST_ID_INFO.cpp | 15 +- .../nxdn/lc/rcch/MESSAGE_TYPE_GRP_REG.cpp | 13 +- src/common/nxdn/lc/rcch/MESSAGE_TYPE_IDLE.cpp | 11 +- src/common/nxdn/lc/rcch/MESSAGE_TYPE_REG.cpp | 13 +- .../nxdn/lc/rcch/MESSAGE_TYPE_REG_C.cpp | 13 +- .../nxdn/lc/rcch/MESSAGE_TYPE_REG_COMM.cpp | 11 +- .../nxdn/lc/rcch/MESSAGE_TYPE_SITE_INFO.cpp | 15 +- .../nxdn/lc/rcch/MESSAGE_TYPE_SRV_INFO.cpp | 13 +- .../nxdn/lc/rcch/MESSAGE_TYPE_VCALL_ASSGN.cpp | 11 +- .../nxdn/lc/rcch/MESSAGE_TYPE_VCALL_CONN.cpp | 13 +- src/common/nxdn/lc/rcch/RCCHFactory.cpp | 21 +- src/common/p25/NID.cpp | 261 +++--- src/common/p25/NID.h | 7 +- src/common/p25/P25Defines.h | 842 ++++++++++-------- src/common/p25/P25Utils.cpp | 1 + src/common/p25/P25Utils.h | 10 + src/common/p25/SiteData.h | 16 +- src/common/p25/Sync.cpp | 2 + src/common/p25/data/DataBlock.cpp | 39 +- src/common/p25/data/DataHeader.cpp | 53 +- src/common/p25/data/LowSpeedData.cpp | 2 +- src/common/p25/dfsi/DFSIDefines.h | 170 ++-- src/common/p25/dfsi/LC.cpp | 250 +++--- src/common/p25/lc/AMBT.cpp | 11 +- src/common/p25/lc/LC.cpp | 86 +- src/common/p25/lc/TDULC.cpp | 9 +- src/common/p25/lc/TSBK.cpp | 31 +- src/common/p25/lc/tdulc/LC_ADJ_STS_BCAST.cpp | 15 +- src/common/p25/lc/tdulc/LC_CALL_TERM.cpp | 11 +- src/common/p25/lc/tdulc/LC_CONV_FALLBACK.cpp | 9 +- src/common/p25/lc/tdulc/LC_FAILSOFT.cpp | 11 +- src/common/p25/lc/tdulc/LC_GROUP.cpp | 9 +- src/common/p25/lc/tdulc/LC_GROUP_UPDT.cpp | 9 +- src/common/p25/lc/tdulc/LC_IDEN_UP.cpp | 11 +- src/common/p25/lc/tdulc/LC_NET_STS_BCAST.cpp | 9 +- src/common/p25/lc/tdulc/LC_PRIVATE.cpp | 9 +- src/common/p25/lc/tdulc/LC_RFSS_STS_BCAST.cpp | 9 +- src/common/p25/lc/tdulc/LC_SYS_SRV_BCAST.cpp | 11 +- .../p25/lc/tdulc/LC_TEL_INT_VCH_USER.cpp | 9 +- src/common/p25/lc/tdulc/TDULCFactory.cpp | 13 +- src/common/p25/lc/tsbk/IOSP_ACK_RSP.cpp | 13 +- src/common/p25/lc/tsbk/IOSP_CALL_ALRT.cpp | 13 +- src/common/p25/lc/tsbk/IOSP_EXT_FNCT.cpp | 15 +- src/common/p25/lc/tsbk/IOSP_GRP_AFF.cpp | 15 +- src/common/p25/lc/tsbk/IOSP_GRP_VCH.cpp | 13 +- src/common/p25/lc/tsbk/IOSP_MSG_UPDT.cpp | 13 +- src/common/p25/lc/tsbk/IOSP_RAD_MON.cpp | 13 +- src/common/p25/lc/tsbk/IOSP_STS_UPDT.cpp | 13 +- src/common/p25/lc/tsbk/IOSP_UU_ANS.cpp | 13 +- src/common/p25/lc/tsbk/IOSP_UU_VCH.cpp | 13 +- src/common/p25/lc/tsbk/IOSP_U_REG.cpp | 13 +- src/common/p25/lc/tsbk/ISP_AUTH_FNE_RST.cpp | 11 +- src/common/p25/lc/tsbk/ISP_AUTH_RESP.cpp | 21 +- src/common/p25/lc/tsbk/ISP_AUTH_SU_DMD.cpp | 11 +- src/common/p25/lc/tsbk/ISP_CAN_SRV_REQ.cpp | 11 +- src/common/p25/lc/tsbk/ISP_EMERG_ALRM_REQ.cpp | 11 +- src/common/p25/lc/tsbk/ISP_GRP_AFF_Q_RSP.cpp | 13 +- src/common/p25/lc/tsbk/ISP_LOC_REG_REQ.cpp | 11 +- src/common/p25/lc/tsbk/ISP_SNDCP_CH_REQ.cpp | 11 +- src/common/p25/lc/tsbk/ISP_U_DEREG_REQ.cpp | 11 +- src/common/p25/lc/tsbk/OSP_ADJ_STS_BCAST.cpp | 15 +- src/common/p25/lc/tsbk/OSP_AUTH_FNE_RESP.cpp | 23 +- src/common/p25/lc/tsbk/OSP_DENY_RSP.cpp | 13 +- .../p25/lc/tsbk/OSP_DVM_LC_CALL_TERM.cpp | 12 +- src/common/p25/lc/tsbk/OSP_GRP_AFF_Q.cpp | 11 +- .../p25/lc/tsbk/OSP_GRP_VCH_GRANT_UPD.cpp | 11 +- src/common/p25/lc/tsbk/OSP_IDEN_UP.cpp | 15 +- src/common/p25/lc/tsbk/OSP_IDEN_UP_VU.cpp | 15 +- src/common/p25/lc/tsbk/OSP_LOC_REG_RSP.cpp | 11 +- src/common/p25/lc/tsbk/OSP_MOT_CC_BSI.cpp | 16 +- src/common/p25/lc/tsbk/OSP_MOT_GRG_ADD.cpp | 15 +- src/common/p25/lc/tsbk/OSP_MOT_GRG_DEL.cpp | 15 +- .../p25/lc/tsbk/OSP_MOT_GRG_VCH_GRANT.cpp | 15 +- .../p25/lc/tsbk/OSP_MOT_GRG_VCH_UPD.cpp | 13 +- src/common/p25/lc/tsbk/OSP_MOT_PSH_CCH.cpp | 14 +- src/common/p25/lc/tsbk/OSP_NET_STS_BCAST.cpp | 11 +- src/common/p25/lc/tsbk/OSP_QUE_RSP.cpp | 13 +- src/common/p25/lc/tsbk/OSP_RFSS_STS_BCAST.cpp | 11 +- src/common/p25/lc/tsbk/OSP_SCCB.cpp | 15 +- src/common/p25/lc/tsbk/OSP_SCCB_EXP.cpp | 13 +- src/common/p25/lc/tsbk/OSP_SNDCP_CH_ANN.cpp | 11 +- src/common/p25/lc/tsbk/OSP_SNDCP_CH_GNT.cpp | 11 +- src/common/p25/lc/tsbk/OSP_SYNC_BCAST.cpp | 13 +- src/common/p25/lc/tsbk/OSP_SYS_SRV_BCAST.cpp | 13 +- src/common/p25/lc/tsbk/OSP_TIME_DATE_ANN.cpp | 15 +- src/common/p25/lc/tsbk/OSP_TSBK_RAW.cpp | 9 +- .../p25/lc/tsbk/OSP_UU_VCH_GRANT_UPD.cpp | 11 +- src/common/p25/lc/tsbk/OSP_U_DEREG_ACK.cpp | 11 +- src/common/p25/lc/tsbk/OSP_U_REG_CMD.cpp | 11 +- src/common/p25/lc/tsbk/TSBKFactory.cpp | 169 ++-- src/common/p25/lc/tsbk/TSBKFactory.h | 2 + .../p25/lc/tsbk/mbt/MBT_IOSP_ACK_RSP.cpp | 13 +- .../p25/lc/tsbk/mbt/MBT_IOSP_CALL_ALRT.cpp | 13 +- .../p25/lc/tsbk/mbt/MBT_IOSP_EXT_FNCT.cpp | 15 +- .../p25/lc/tsbk/mbt/MBT_IOSP_GRP_AFF.cpp | 13 +- .../p25/lc/tsbk/mbt/MBT_IOSP_MSG_UPDT.cpp | 13 +- .../p25/lc/tsbk/mbt/MBT_IOSP_STS_UPDT.cpp | 13 +- .../p25/lc/tsbk/mbt/MBT_ISP_AUTH_RESP_M.cpp | 33 +- .../p25/lc/tsbk/mbt/MBT_ISP_AUTH_SU_DMD.cpp | 11 +- .../p25/lc/tsbk/mbt/MBT_ISP_CAN_SRV_REQ.cpp | 11 +- .../p25/lc/tsbk/mbt/MBT_ISP_GRP_AFF_Q_RSP.cpp | 9 +- .../p25/lc/tsbk/mbt/MBT_OSP_ADJ_STS_BCAST.cpp | 15 +- .../p25/lc/tsbk/mbt/MBT_OSP_AUTH_DMD.cpp | 35 +- .../p25/lc/tsbk/mbt/MBT_OSP_NET_STS_BCAST.cpp | 11 +- .../lc/tsbk/mbt/MBT_OSP_RFSS_STS_BCAST.cpp | 11 +- src/dfsi/frames/BlockHeader.cpp | 6 +- src/dfsi/frames/BlockHeader.h | 2 +- src/dfsi/frames/FrameDefines.h | 167 ++-- src/dfsi/frames/FullRateVoice.cpp | 17 +- src/dfsi/frames/FullRateVoice.h | 3 +- src/dfsi/frames/MotFullRateVoice.cpp | 36 +- src/dfsi/frames/MotFullRateVoice.h | 6 +- src/dfsi/frames/MotStartOfStream.cpp | 27 +- src/dfsi/frames/MotStartOfStream.h | 6 +- src/dfsi/frames/MotStartVoiceFrame.cpp | 17 +- src/dfsi/frames/MotStartVoiceFrame.h | 4 +- src/dfsi/frames/MotVoiceHeader1.cpp | 19 +- src/dfsi/frames/MotVoiceHeader1.h | 4 +- src/dfsi/frames/MotVoiceHeader2.cpp | 9 +- src/dfsi/frames/MotVoiceHeader2.h | 2 +- src/dfsi/frames/fsc/FSCACK.cpp | 14 +- src/dfsi/frames/fsc/FSCACK.h | 4 +- src/dfsi/frames/fsc/FSCConnect.cpp | 2 +- src/dfsi/frames/fsc/FSCDisconnect.cpp | 2 +- src/dfsi/frames/fsc/FSCHeartbeat.cpp | 2 +- src/dfsi/frames/fsc/FSCMessage.cpp | 6 +- src/dfsi/frames/fsc/FSCMessage.h | 2 +- src/dfsi/network/CallData.cpp | 13 +- src/dfsi/network/DfsiPeerNetwork.cpp | 125 +-- src/dfsi/network/DfsiPeerNetwork.h | 5 +- src/dfsi/network/SerialService.cpp | 331 +++---- src/dfsi/network/SerialService.h | 2 +- src/fne/network/RESTAPI.cpp | 18 +- src/fne/network/callhandler/TagDMRData.cpp | 57 +- src/fne/network/callhandler/TagDMRData.h | 2 +- src/fne/network/callhandler/TagNXDNData.cpp | 27 +- src/fne/network/callhandler/TagP25Data.cpp | 81 +- src/fne/network/callhandler/TagP25Data.h | 4 +- src/host/Host.Config.cpp | 14 +- src/host/Host.DMR.cpp | 10 +- src/host/Host.NXDN.cpp | 6 +- src/host/Host.P25.cpp | 6 +- src/host/dmr/Control.cpp | 39 +- src/host/dmr/Slot.cpp | 111 +-- src/host/dmr/Slot.h | 10 +- src/host/dmr/lc/csbk/CSBK_DVM_GIT_HASH.cpp | 13 +- src/host/dmr/packet/ControlSignaling.cpp | 345 +++---- src/host/dmr/packet/Data.cpp | 77 +- src/host/dmr/packet/Voice.cpp | 205 ++--- src/host/modem/Modem.cpp | 22 +- src/host/network/RESTAPI.cpp | 35 +- src/host/nxdn/Control.cpp | 53 +- src/host/nxdn/packet/ControlSignaling.cpp | 93 +- src/host/nxdn/packet/ControlSignaling.h | 6 +- src/host/nxdn/packet/Data.cpp | 27 +- src/host/nxdn/packet/Data.h | 6 +- src/host/nxdn/packet/Voice.cpp | 131 +-- src/host/nxdn/packet/Voice.h | 6 +- src/host/p25/Control.cpp | 132 +-- src/host/p25/lc/tsbk/OSP_DVM_GIT_HASH.cpp | 14 +- src/host/p25/packet/ControlSignaling.cpp | 449 +++++----- src/host/p25/packet/ControlSignaling.h | 2 +- src/host/p25/packet/Data.cpp | 115 +-- src/host/p25/packet/Voice.cpp | 328 +++---- src/host/p25/packet/Voice.h | 10 +- src/host/setup/HostSetup.cpp | 47 +- src/host/setup/SetupApplication.h | 15 +- src/host/setup/SiteParamSetWnd.h | 4 +- 229 files changed, 4700 insertions(+), 4054 deletions(-) diff --git a/src/common/Defines.h b/src/common/Defines.h index be132fe8..36bd0dae 100644 --- a/src/common/Defines.h +++ b/src/common/Defines.h @@ -90,10 +90,10 @@ typedef unsigned long long ulong64_t; #define VERSION_MAJOR "04" #define VERSION_MINOR "01" -#define VERSION_REV "A" +#define VERSION_REV "B" #define __NETVER__ "DVM_R" VERSION_MAJOR VERSION_REV VERSION_MINOR -#define __VER__ VERSION_MAJOR "." VERSION_MINOR " (R" VERSION_MAJOR VERSION_REV VERSION_MINOR " " __GIT_VER__ ")" +#define __VER__ VERSION_MAJOR "." VERSION_MINOR VERSION_REV " (R" VERSION_MAJOR VERSION_REV VERSION_MINOR " " __GIT_VER__ ")" #define __BUILD__ __DATE__ " " __TIME__ diff --git a/src/common/dmr/DMRDefines.h b/src/common/dmr/DMRDefines.h index 887a6625..681ba0fc 100644 --- a/src/common/dmr/DMRDefines.h +++ b/src/common/dmr/DMRDefines.h @@ -17,300 +17,408 @@ #include "common/Defines.h" +// Shorthand macro to dmr::defines -- keeps source code that doesn't use "using" concise +#define DMRDEF dmr::defines namespace dmr { - // --------------------------------------------------------------------------- - // Constants - // --------------------------------------------------------------------------- + namespace defines + { + // --------------------------------------------------------------------------- + // Constants + // --------------------------------------------------------------------------- - const uint32_t DMR_FRAME_LENGTH_BITS = 264U; - const uint32_t DMR_FRAME_LENGTH_BYTES = 33U; + const uint32_t DMR_FRAME_LENGTH_BITS = 264U; + const uint32_t DMR_FRAME_LENGTH_BYTES = 33U; - const uint32_t DMR_SYNC_LENGTH_BITS = 48U; - const uint32_t DMR_SYNC_LENGTH_BYTES = 6U; + const uint32_t DMR_SYNC_LENGTH_BITS = 48U; + const uint32_t DMR_SYNC_LENGTH_BYTES = 6U; - const uint32_t DMR_EMB_LENGTH_BITS = 8U; - const uint32_t DMR_EMB_LENGTH_BYTES = 1U; + const uint32_t DMR_EMB_LENGTH_BITS = 8U; + const uint32_t DMR_EMB_LENGTH_BYTES = 1U; - const uint32_t DMR_SLOT_TYPE_LENGTH_BITS = 8U; - const uint32_t DMR_SLOT_TYPE_LENGTH_BYTES = 1U; + const uint32_t DMR_SLOT_TYPE_LENGTH_BITS = 8U; + const uint32_t DMR_SLOT_TYPE_LENGTH_BYTES = 1U; - const uint32_t DMR_EMBEDDED_SIGNALLING_LENGTH_BITS = 32U; - const uint32_t DMR_EMBEDDED_SIGNALLING_LENGTH_BYTES = 4U; + const uint32_t DMR_EMBEDDED_SIGNALLING_LENGTH_BITS = 32U; + const uint32_t DMR_EMBEDDED_SIGNALLING_LENGTH_BYTES = 4U; - const uint32_t DMR_AMBE_LENGTH_BITS = 108U * 2U; - const uint32_t DMR_AMBE_LENGTH_BYTES = 27U; + const uint32_t DMR_AMBE_LENGTH_BITS = 108U * 2U; + const uint32_t DMR_AMBE_LENGTH_BYTES = 27U; - const uint32_t DMR_LC_HEADER_LENGTH_BYTES = 12U; - const uint32_t DMR_CSBK_LENGTH_BYTES = 12U; + const uint32_t DMR_LC_HEADER_LENGTH_BYTES = 12U; + const uint32_t DMR_CSBK_LENGTH_BYTES = 12U; - const uint8_t BS_SOURCED_AUDIO_SYNC[] = { 0x07U, 0x55U, 0xFDU, 0x7DU, 0xF7U, 0x5FU, 0x70U }; - const uint8_t BS_SOURCED_DATA_SYNC[] = { 0x0DU, 0xFFU, 0x57U, 0xD7U, 0x5DU, 0xF5U, 0xD0U }; + const uint8_t BS_SOURCED_AUDIO_SYNC[] = { 0x07U, 0x55U, 0xFDU, 0x7DU, 0xF7U, 0x5FU, 0x70U }; + const uint8_t BS_SOURCED_DATA_SYNC[] = { 0x0DU, 0xFFU, 0x57U, 0xD7U, 0x5DU, 0xF5U, 0xD0U }; - const uint8_t MS_SOURCED_AUDIO_SYNC[] = { 0x07U, 0xF7U, 0xD5U, 0xDDU, 0x57U, 0xDFU, 0xD0U }; - const uint8_t MS_SOURCED_DATA_SYNC[] = { 0x0DU, 0x5DU, 0x7FU, 0x77U, 0xFDU, 0x75U, 0x70U }; - - const uint8_t DIRECT_SLOT1_AUDIO_SYNC[] = { 0x05U, 0xD5U, 0x77U, 0xF7U, 0x75U, 0x7FU, 0xF0U }; - const uint8_t DIRECT_SLOT1_DATA_SYNC[] = { 0x0FU, 0x7FU, 0xDDU, 0x5DU, 0xDFU, 0xD5U, 0x50U }; - - const uint8_t DIRECT_SLOT2_AUDIO_SYNC[] = { 0x07U, 0xDFU, 0xFDU, 0x5FU, 0x55U, 0xD5U, 0xF0U }; - const uint8_t DIRECT_SLOT2_DATA_SYNC[] = { 0x0DU, 0x75U, 0x57U, 0xF5U, 0xFFU, 0x7FU, 0x50U }; - - const uint8_t DMR_MS_DATA_SYNC_BYTES[] = { 0x0DU, 0x5DU, 0x7FU, 0x77U, 0xFDU, 0x75U, 0x70U }; - const uint8_t DMR_MS_VOICE_SYNC_BYTES[] = { 0x07U, 0xF7U, 0xD5U, 0xDDU, 0x57U, 0xDFU, 0xD0U }; - - const uint8_t SYNC_MASK[] = { 0x0FU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xF0U }; - - // The PR FILL and Data Sync pattern. - const uint8_t DMR_IDLE_DATA[] = { 0x01U, 0x00U, - 0x53U, 0xC2U, 0x5EU, 0xABU, 0xA8U, 0x67U, 0x1DU, 0xC7U, 0x38U, 0x3BU, 0xD9U, - 0x36U, 0x00U, 0x0DU, 0xFFU, 0x57U, 0xD7U, 0x5DU, 0xF5U, 0xD0U, 0x03U, 0xF6U, - 0xE4U, 0x65U, 0x17U, 0x1BU, 0x48U, 0xCAU, 0x6DU, 0x4FU, 0xC6U, 0x10U, 0xB4U }; - - // A silence frame only - const uint8_t DMR_SILENCE_DATA[] = { 0x01U, 0x00U, - 0xB9U, 0xE8U, 0x81U, 0x52U, 0x61U, 0x73U, 0x00U, 0x2AU, 0x6BU, 0xB9U, 0xE8U, - 0x81U, 0x52U, 0x60U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x01U, 0x73U, 0x00U, - 0x2AU, 0x6BU, 0xB9U, 0xE8U, 0x81U, 0x52U, 0x61U, 0x73U, 0x00U, 0x2AU, 0x6BU }; - - const uint8_t DMR_NULL_AMBE[] = { 0xB1U, 0xA8U, 0x22U, 0x25U, 0x6BU, 0xD1U, 0x6CU, 0xCFU, 0x67U }; - - const uint8_t PAYLOAD_LEFT_MASK[] = { 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xF0U }; - const uint8_t PAYLOAD_RIGHT_MASK[] = { 0x0FU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU }; - - const uint8_t VOICE_LC_HEADER_CRC_MASK[] = { 0x96U, 0x96U, 0x96U }; - const uint8_t TERMINATOR_WITH_LC_CRC_MASK[] = { 0x99U, 0x99U, 0x99U }; - const uint8_t PI_HEADER_CRC_MASK[] = { 0x69U, 0x69U }; - const uint8_t DATA_HEADER_CRC_MASK[] = { 0xCCU, 0xCCU }; - const uint8_t CSBK_CRC_MASK[] = { 0xA5U, 0xA5U }; - const uint8_t CSBK_MBC_CRC_MASK[] = { 0xAAU, 0xAAU }; - - const uint16_t TSCC_MAX_CSC_CNT = 511U; - - const uint32_t DMR_SLOT_TIME = 60U; - const uint32_t AMBE_PER_SLOT = 3U; - - const uint8_t DT_MASK = 0x0FU; - - const uint8_t DMR_IDLE_RX = 0x80U; - const uint8_t DMR_SYNC_DATA = 0x40U; - const uint8_t DMR_SYNC_VOICE = 0x20U; - - const uint8_t DMR_SLOT1 = 0x00U; - const uint8_t DMR_SLOT2 = 0x80U; - - const uint32_t DMR_MAX_PDU_COUNT = 32U; - const uint32_t DMR_MAX_PDU_LENGTH = 512U; - - const uint32_t DMR_MI_LENGTH_BYTES = 4U; // This was guessed based on OTA data captures -- the message indicator seems to be the same length as a source/destination address - - const uint8_t DMR_ALOHA_VER_151 = 0x00U; - const uint8_t DMR_CHNULL = 0x00U; - - const uint16_t DMR_LOGICAL_CH_ABSOLUTE = 0xFFFU; - - const uint8_t DEFAULT_NRAND_WAIT = 8U; - const uint32_t DEFAULT_SILENCE_THRESHOLD = 21U; - const uint32_t DEFAULT_FRAME_LOSS_THRESHOLD = 2U; - const uint32_t MAX_DMR_VOICE_ERRORS = 141U; - - const uint32_t DMR_WUID_SUPLI = 0xFFFEC4U; - const uint32_t DMR_WUID_SDMI = 0xFFFEC5U; - const uint32_t DMR_WUID_REGI = 0xFFFEC6U; - const uint32_t DMR_WUID_STUNI = 0xFFFECCU; - const uint32_t DMR_WUID_AUTHI = 0xFFFECDU; - const uint32_t DMR_WUID_KILLI = 0xFFFECFU; - const uint32_t DMR_WUID_TATTSI = 0xFFFED7U; - const uint32_t DMR_WUID_ALL = 0xFFFFFFU; - - // PDU Data Formats - const uint8_t DPF_UDT = 0x00U; - const uint8_t DPF_RESPONSE = 0x01U; - const uint8_t DPF_UNCONFIRMED_DATA = 0x02U; - const uint8_t DPF_CONFIRMED_DATA = 0x03U; - const uint8_t DPF_DEFINED_SHORT = 0x0DU; - const uint8_t DPF_DEFINED_RAW = 0x0EU; - const uint8_t DPF_PROPRIETARY = 0x0FU; - - // PDU ACK Class - const uint8_t PDU_ACK_CLASS_ACK = 0x00U; - const uint8_t PDU_ACK_CLASS_NACK = 0x01U; - const uint8_t PDU_ACK_CLASS_ACK_RETRY = 0x02U; - - // PDU ACK Type(s) - const uint8_t PDU_ACK_TYPE_ACK = 0x01U; - - const uint8_t PDU_ACK_TYPE_NACK_ILLEGAL = 0x00U; // Illegal Format - const uint8_t PDU_ACK_TYPE_NACK_PACKET_CRC = 0x01U; // Packet CRC - const uint8_t PDU_ACK_TYPE_NACK_MEMORY_FULL = 0x02U; // Memory Full - const uint8_t PDU_ACK_TYPE_NACK_UNDELIVERABLE = 0x04U;// Undeliverable - - // Feature IDs - const uint8_t FID_ETSI = 0x00U; // ETSI Standard Feature Set - const uint8_t FID_DMRA = 0x10U; // - const uint8_t FID_OCS_DVM = 0x9CU; // FID used for internal signalling; Omaha Communication Systems, LLC ($9C) - - // LC Service Options - const uint8_t LC_SVC_OPT_EMERGENCY = 0x80U; - const uint8_t LC_SVC_OPT_PRIVACY = 0x40U; - const uint8_t LC_SVC_OPT_BCAST = 0x08U; - const uint8_t LC_SVC_OPT_OVCM = 0x04U; - - // Call Priorities - const uint8_t CALL_PRIORITY_NONE = 0x00U; - const uint8_t CALL_PRIORITY_1 = 0x01U; - const uint8_t CALL_PRIORITY_2 = 0x02U; - const uint8_t CALL_PRIORITY_3 = 0x03U; - - // FID_DMRA Extended Function Opcodes - const uint32_t DMR_EXT_FNCT_CHECK = 0x0000U; // Radio Check - const uint32_t DMR_EXT_FNCT_UNINHIBIT = 0x007EU; // Radio Uninhibit - const uint32_t DMR_EXT_FNCT_INHIBIT = 0x007FU; // Radio Inhibit - const uint32_t DMR_EXT_FNCT_CHECK_ACK = 0x0080U; // Radio Check Ack - const uint32_t DMR_EXT_FNCT_UNINHIBIT_ACK = 0x00FEU; // Radio Uninhibit Ack - const uint32_t DMR_EXT_FNCT_INHIBIT_ACK = 0x00FFU; // Radio Inhibit Ack - - // Data Type(s) - const uint8_t DT_VOICE_PI_HEADER = 0x00U; -#define DMR_DT_VOICE_PI_HEADER "DMR_DT_VOICE_PI_HEADER (Voice Header with Privacy Indicator)" - const uint8_t DT_VOICE_LC_HEADER = 0x01U; -#define DMR_DT_VOICE_LC_HEADER "DMR_DT_VOICE_LC_HEADER (Voice Header with Link Control)" - const uint8_t DT_TERMINATOR_WITH_LC = 0x02U; -#define DMR_DT_TERMINATOR_WITH_LC "DMR_DT_TERMINATOR_WITH_LC (Terminator with Link Control)" - const uint8_t DT_CSBK = 0x03U; - const uint8_t DT_MBC_HEADER = 0x04U; - const uint8_t DT_MBC_DATA = 0x05U; - const uint8_t DT_DATA_HEADER = 0x06U; -#define DMR_DT_DATA_HEADER "DMR_DT_DATA_HEADER (Data Header)" - const uint8_t DT_RATE_12_DATA = 0x07U; -#define DMR_DT_RATE_12_DATA "DMR_DT_RATE_12_DATA (1/2-rate Data)" - const uint8_t DT_RATE_34_DATA = 0x08U; -#define DMR_DT_RATE_34_DATA "DMR_DT_RATE_34_DATA (3/4-rate Data)" - const uint8_t DT_IDLE = 0x09U; - const uint8_t DT_RATE_1_DATA = 0x0AU; -#define DMR_DT_RATE_1_DATA "DMR_DT_RATE_1_DATA (1-rate Data)" - - /* - ** Internal Data Type(s) - */ - const uint8_t DT_VOICE_SYNC = 0xF0U; -#define DMR_DT_VOICE_SYNC "DMR_DT_VOICE_SYNC (Voice Data with Sync)" - const uint8_t DT_VOICE = 0xF1U; -#define DMR_DT_VOICE "DMR_DT_VOICE (Voice Data)" - - // Site Models - const uint8_t SITE_MODEL_TINY = 0x00U; - const uint8_t SITE_MODEL_SMALL = 0x01U; - const uint8_t SITE_MODEL_LARGE = 0x02U; - const uint8_t SITE_MODEL_HUGE = 0x03U; - - // Target Address - const uint8_t TGT_ADRS_SYSCODE = 0x00U; - const uint8_t TGT_ADRS_TGID = 0x01U; - - // Short-Link Control Opcode(s) - const uint8_t SLCO_NULL = 0x00U; - const uint8_t SLCO_ACT = 0x01U; - const uint8_t SLCO_TSCC = 0x02U; - const uint8_t SLCO_PAYLOAD = 0x03U; - - // Reason Code(s) - const uint8_t TS_ACK_RSN_MSG = 0x60U; // TS - Message Accepted - const uint8_t TS_ACK_RSN_REG = 0x62U; // TS - Registration Accepted - const uint8_t TS_ACK_RSN_AUTH_RESP = 0x64U; // TS - Authentication Challenge Response - const uint8_t TS_ACK_RSN_REG_SUB_ATTACH = 0x65U; // TS - Registration Response with subscription - const uint8_t MS_ACK_RSN_MSG = 0x44U; // MS - Message Accepted - const uint8_t MS_ACK_RSN_AUTH_RESP = 0x48U; // MS - Authentication Challenge Response - - const uint8_t TS_DENY_RSN_SYS_UNSUPPORTED_SVC = 0x20U; - const uint8_t TS_DENY_RSN_PERM_USER_REFUSED = 0x21U; - const uint8_t TS_DENY_RSN_TEMP_USER_REFUSED = 0x22U; - const uint8_t TS_DENY_RSN_TRSN_SYS_REFUSED = 0x23U; - const uint8_t TS_DENY_RSN_TGT_NOT_REG = 0x24U; - const uint8_t TS_DENY_RSN_TGT_UNAVAILABLE = 0x25U; - const uint8_t TS_DENY_RSN_SYS_BUSY = 0x27U; - const uint8_t TS_DENY_RSN_SYS_NOT_READY = 0x28U; - const uint8_t TS_DENY_RSN_CALL_CNCL_REFUSED = 0x29U; - const uint8_t TS_DENY_RSN_REG_REFUSED = 0x2AU; - const uint8_t TS_DENY_RSN_REG_DENIED = 0x2BU; - const uint8_t TS_DENY_RSN_MS_NOT_REG = 0x2DU; - const uint8_t TS_DENY_RSN_TGT_BUSY = 0x2EU; - const uint8_t TS_DENY_RSN_TGT_GROUP_NOT_VALID = 0x2FU; - - const uint8_t TS_QUEUED_RSN_NO_RESOURCE = 0xA0U; - const uint8_t TS_QUEUED_RSN_SYS_BUSY = 0xA1U; - - const uint8_t TS_WAIT_RSN = 0xE0U; - - const uint8_t MS_DENY_RSN_UNSUPPORTED_SVC = 0x00U; - - // Random Access Service Kind - const uint8_t SVC_KIND_IND_VOICE_CALL = 0x00U; // Individual Voice Call - const uint8_t SVC_KIND_GRP_VOICE_CALL = 0x01U; // Group Voice Call - const uint8_t SVC_KIND_IND_DATA_CALL = 0x02U; // Individual Data Call - const uint8_t SVC_KIND_GRP_DATA_CALL = 0x03U; // Group Data Call - const uint8_t SVC_KIND_IND_UDT_DATA_CALL = 0x04U; // Individual UDT Short Data Call - const uint8_t SVC_KIND_GRP_UDT_DATA_CALL = 0x05U; // Group UDT Short Data Call - const uint8_t SVC_KIND_UDT_SHORT_POLL = 0x06U; // UDT Short Data Polling Service - const uint8_t SVC_KIND_STATUS_TRANSPORT = 0x07U; // Status Transport Service - const uint8_t SVC_KIND_CALL_DIVERSION = 0x08U; // Call Diversion Service - const uint8_t SVC_KIND_CALL_ANSWER = 0x09U; // Call Answer Service - const uint8_t SVC_KIND_SUPPLEMENTARY_SVC = 0x0DU; // Supplementary Service - const uint8_t SVC_KIND_REG_SVC = 0x0EU; // Registration Service - const uint8_t SVC_KIND_CANCEL_CALL = 0x0FU; // Cancel Call Service - - // Broadcast Announcement Type(s) - const uint8_t BCAST_ANNC_ANN_WD_TSCC = 0x00U; // Announce-WD TSCC Channel - const uint8_t BCAST_ANNC_CALL_TIMER_PARMS = 0x01U; // Specify Call Timer Parameters - const uint8_t BCAST_ANNC_VOTE_NOW = 0x02U; // Vote Now Advice - const uint8_t BCAST_ANNC_LOCAL_TIME = 0x03U; // Broadcast Local Time - const uint8_t BCAST_ANNC_MASS_REG = 0x04U; // Mass Registration - const uint8_t BCAST_ANNC_CHAN_FREQ = 0x05U; // Logical Channel/Frequency - const uint8_t BCAST_ANNC_ADJ_SITE = 0x06U; // Adjacent Site Information - const uint8_t BCAST_ANNC_SITE_PARMS = 0x07U; // General Site Parameters - - // Full-Link Control Opcode(s) - const uint8_t FLCO_GROUP = 0x00U; // GRP VCH USER - Group Voice Channel User - const uint8_t FLCO_PRIVATE = 0x03U; // UU VCH USER - Unit-to-Unit Voice Channel User - const uint8_t FLCO_TALKER_ALIAS_HEADER = 0x04U; // - const uint8_t FLCO_TALKER_ALIAS_BLOCK1 = 0x05U; // - const uint8_t FLCO_TALKER_ALIAS_BLOCK2 = 0x06U; // - const uint8_t FLCO_TALKER_ALIAS_BLOCK3 = 0x07U; // - const uint8_t FLCO_GPS_INFO = 0x08U; // - - // Control Signalling Block Opcode(s) - const uint8_t CSBKO_NONE = 0x00U; // - const uint8_t CSBKO_UU_V_REQ = 0x04U; // UU VCH REQ - Unit-to-Unit Voice Channel Request - const uint8_t CSBKO_UU_ANS_RSP = 0x05U; // UU ANS RSP - Unit-to-Unit Answer Response - const uint8_t CSBKO_CTCSBK = 0x07U; // CT CSBK - Channel Timing CSBK - const uint8_t CSBKO_ALOHA = 0x19U; // ALOHA - Aloha PDU for Random Access - const uint8_t CSBKO_AHOY = 0x1CU; // AHOY - Enquiry from TSCC - const uint8_t CSBKO_RAND = 0x1FU; // (ETSI) RAND - Random Access / (DMRA) CALL ALRT - Call Alert - const uint8_t CSBKO_ACK_RSP = 0x20U; // ACK RSP - Acknowledge Response - const uint8_t CSBKO_EXT_FNCT = 0x24U; // (DMRA) EXT FNCT - Extended Function - const uint8_t CSBKO_NACK_RSP = 0x26U; // NACK RSP - Negative Acknowledgement Response - const uint8_t CSBKO_BROADCAST = 0x28U; // BCAST - Announcement PDU - const uint8_t CSBKO_MAINT = 0x2AU; // MAINT - Call Maintainence PDU - const uint8_t CSBKO_P_CLEAR = 0x2EU; // P_CLEAR - Payload Channel Clear - const uint8_t CSBKO_PV_GRANT = 0x30U; // PV_GRANT - Private Voice Channel Grant - const uint8_t CSBKO_TV_GRANT = 0x31U; // TV_GRANT - Talkgroup Voice Channel Grant - const uint8_t CSBKO_BTV_GRANT = 0x32U; // BTV_GRANT - Broadcast Talkgroup Voice Channel Grant - const uint8_t CSBKO_PD_GRANT = 0x33U; // PD_GRANT - Private Data Channel Grant - const uint8_t CSBKO_TD_GRANT = 0x34U; // TD_GRANT - Talkgroup Data Channel Grant - const uint8_t CSBKO_BSDWNACT = 0x38U; // BS DWN ACT - BS Outbound Activation - const uint8_t CSBKO_PRECCSBK = 0x3DU; // PRE CSBK - Preamble CSBK - - const uint8_t CSBKO_DVM_GIT_HASH = 0x3FU; // - - const uint8_t TALKER_ID_NONE = 0x00U; - const uint8_t TALKER_ID_HEADER = 0x01U; - const uint8_t TALKER_ID_BLOCK1 = 0x02U; - const uint8_t TALKER_ID_BLOCK2 = 0x04U; - const uint8_t TALKER_ID_BLOCK3 = 0x08U; - - const uint32_t NO_HEADERS_SIMPLEX = 8U; - const uint32_t NO_HEADERS_DUPLEX = 3U; - const uint32_t NO_PREAMBLE_CSBK = 15U; + const uint8_t MS_SOURCED_AUDIO_SYNC[] = { 0x07U, 0xF7U, 0xD5U, 0xDDU, 0x57U, 0xDFU, 0xD0U }; + const uint8_t MS_SOURCED_DATA_SYNC[] = { 0x0DU, 0x5DU, 0x7FU, 0x77U, 0xFDU, 0x75U, 0x70U }; + + const uint8_t DIRECT_SLOT1_AUDIO_SYNC[] = { 0x05U, 0xD5U, 0x77U, 0xF7U, 0x75U, 0x7FU, 0xF0U }; + const uint8_t DIRECT_SLOT1_DATA_SYNC[] = { 0x0FU, 0x7FU, 0xDDU, 0x5DU, 0xDFU, 0xD5U, 0x50U }; + + const uint8_t DIRECT_SLOT2_AUDIO_SYNC[] = { 0x07U, 0xDFU, 0xFDU, 0x5FU, 0x55U, 0xD5U, 0xF0U }; + const uint8_t DIRECT_SLOT2_DATA_SYNC[] = { 0x0DU, 0x75U, 0x57U, 0xF5U, 0xFFU, 0x7FU, 0x50U }; + + const uint8_t MS_DATA_SYNC_BYTES[] = { 0x0DU, 0x5DU, 0x7FU, 0x77U, 0xFDU, 0x75U, 0x70U }; + const uint8_t MS_VOICE_SYNC_BYTES[] = { 0x07U, 0xF7U, 0xD5U, 0xDDU, 0x57U, 0xDFU, 0xD0U }; + + const uint8_t SYNC_MASK[] = { 0x0FU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xF0U }; + + // The PR FILL and Data Sync pattern. + const uint8_t IDLE_DATA[] = { 0x01U, 0x00U, + 0x53U, 0xC2U, 0x5EU, 0xABU, 0xA8U, 0x67U, 0x1DU, 0xC7U, 0x38U, 0x3BU, 0xD9U, + 0x36U, 0x00U, 0x0DU, 0xFFU, 0x57U, 0xD7U, 0x5DU, 0xF5U, 0xD0U, 0x03U, 0xF6U, + 0xE4U, 0x65U, 0x17U, 0x1BU, 0x48U, 0xCAU, 0x6DU, 0x4FU, 0xC6U, 0x10U, 0xB4U }; + + // A silence frame only + const uint8_t SILENCE_DATA[] = { 0x01U, 0x00U, + 0xB9U, 0xE8U, 0x81U, 0x52U, 0x61U, 0x73U, 0x00U, 0x2AU, 0x6BU, 0xB9U, 0xE8U, + 0x81U, 0x52U, 0x60U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x01U, 0x73U, 0x00U, + 0x2AU, 0x6BU, 0xB9U, 0xE8U, 0x81U, 0x52U, 0x61U, 0x73U, 0x00U, 0x2AU, 0x6BU }; + + const uint8_t NULL_AMBE[] = { 0xB1U, 0xA8U, 0x22U, 0x25U, 0x6BU, 0xD1U, 0x6CU, 0xCFU, 0x67U }; + + const uint8_t PAYLOAD_LEFT_MASK[] = { 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xF0U }; + const uint8_t PAYLOAD_RIGHT_MASK[] = { 0x0FU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU }; + + const uint8_t VOICE_LC_HEADER_CRC_MASK[] = { 0x96U, 0x96U, 0x96U }; + const uint8_t TERMINATOR_WITH_LC_CRC_MASK[] = { 0x99U, 0x99U, 0x99U }; + const uint8_t PI_HEADER_CRC_MASK[] = { 0x69U, 0x69U }; + const uint8_t DATA_HEADER_CRC_MASK[] = { 0xCCU, 0xCCU }; + const uint8_t CSBK_CRC_MASK[] = { 0xA5U, 0xA5U }; + const uint8_t CSBK_MBC_CRC_MASK[] = { 0xAAU, 0xAAU }; + + const uint8_t DT_MASK = 0x0FU; + + const uint8_t IDLE_RX = 0x80U; + const uint8_t SYNC_DATA = 0x40U; + const uint8_t SYNC_VOICE = 0x20U; + + const uint8_t SLOT1 = 0x00U; + const uint8_t SLOT2 = 0x80U; + + const uint32_t MAX_PDU_COUNT = 32U; + const uint32_t MAX_PDU_LENGTH = 512U; + + const uint32_t MI_LENGTH_BYTES = 4U; // This was guessed based on OTA data captures -- the message indicator seems to be the same length as a source/destination address + + /** Thresholds */ + const uint16_t TSCC_MAX_CSC_CNT = 511U; + + const uint32_t DMR_SLOT_TIME = 60U; + const uint32_t AMBE_PER_SLOT = 3U; + + const uint8_t DEFAULT_NRAND_WAIT = 8U; + const uint32_t DEFAULT_SILENCE_THRESHOLD = 21U; + const uint32_t DEFAULT_FRAME_LOSS_THRESHOLD = 2U; + const uint32_t MAX_DMR_VOICE_ERRORS = 141U; + + /** Default Values */ + const uint8_t DMR_ALOHA_VER_151 = 0x00U; + const uint8_t DMR_CHNULL = 0x00U; + + const uint16_t DMR_LOGICAL_CH_ABSOLUTE = 0xFFFU; + + const uint32_t WUID_SUPLI = 0xFFFEC4U; // Supplementary Data Service Working Unit ID + const uint32_t WUID_SDMI = 0xFFFEC5U; // UDT Short Data Service Working Unit ID + const uint32_t WUID_REGI = 0xFFFEC6U; // Registration Working Unit ID + const uint32_t WUID_STUNI = 0xFFFECCU; // MS Stun/Revive Identifier + const uint32_t WUID_AUTHI = 0xFFFECDU; // Authentication Working Unit ID + const uint32_t WUID_KILLI = 0xFFFECFU; // MS Kill Identifier + const uint32_t WUID_TATTSI = 0xFFFED7U; // Talkgroup Subscription/Attachement Service Working Unit ID + const uint32_t WUID_ALLL = 0xFFFFFDU; // All-call Site-wide Working Unit ID + const uint32_t WUID_ALLZ = 0xFFFFFEU; // All-call System-wide Working Unit ID + const uint32_t WUID_ALL = 0xFFFFFFU; // All-call Network-wide Working Unit ID + + const uint32_t NO_HEADERS_SIMPLEX = 8U; + const uint32_t NO_HEADERS_DUPLEX = 3U; + const uint32_t NO_PREAMBLE_CSBK = 15U; + + /// + /// Data Packet Format + /// + namespace DPF { + // Data Packet Format Enumeration + enum E : uint8_t { + UDT = 0x00U, // Unified Data Transport Header + RESPONSE = 0x01U, // Response Data Header + UNCONFIRMED_DATA = 0x02U, // Unconfirmed Data Header + CONFIRMED_DATA = 0x03U, // Confirmed Data Header + DEFINED_SHORT = 0x0DU, // Defined Short Data Header + DEFINED_RAW = 0x0EU, // Defined Raw Data Header + PROPRIETARY = 0x0FU, // Proprietary + }; + }; + + /// + /// Data Response Class + /// + namespace PDUResponseClass { + enum : uint8_t { + ACK = 0x00U, // Acknowledge + NACK = 0x01U, // Negative Acknowledge + ACK_RETRY = 0x02U // Acknowlege Retry + }; + }; + + /// + /// Data Response Type + /// + namespace PDUResponseType { + enum : uint8_t { + ACK = 0x01U, // Acknowledge + + NACK_ILLEGAL = 0x00U, // Illegal Format + NACK_PACKET_CRC = 0x01U, // Packet CRC + NACK_MEMORY_FULL = 0x02U, // Memory Full + NACK_UNDELIVERABLE = 0x04U // Undeliverable + }; + }; + + /** Feature IDs */ + const uint8_t FID_ETSI = 0x00U; // ETSI Standard Feature Set + const uint8_t FID_DMRA = 0x10U; // Motorola + const uint8_t FID_DVM_OCS = 0x9CU; // DVM; Omaha Communication Systems, LLC ($9C) + + /** LC Service Options */ + const uint8_t LC_SVC_OPT_EMERGENCY = 0x80U; + const uint8_t LC_SVC_OPT_PRIVACY = 0x40U; + const uint8_t LC_SVC_OPT_BCAST = 0x08U; + const uint8_t LC_SVC_OPT_OVCM = 0x04U; + + /** Call Priorities */ + const uint8_t CALL_PRIORITY_NONE = 0x00U; + const uint8_t CALL_PRIORITY_1 = 0x01U; + const uint8_t CALL_PRIORITY_2 = 0x02U; + const uint8_t CALL_PRIORITY_3 = 0x03U; + + /// + /// Short-Link Control Opcode(s) + /// + namespace SLCO { + // Short-Link Control Opcode Enumeration + enum E : uint8_t { + NONE = 0x00U, // NULL + ACT = 0x01U, // + TSCC = 0x02U, // TSCC + PAYLOAD = 0x03U // Payload + }; + } + + /// + /// Full-Link Control Opcode(s) + /// + namespace FLCO { + // Full-Link Control Opcode Enumeration + enum E : uint8_t { + GROUP = 0x00U, // GRP VCH USER - Group Voice Channel User + PRIVATE = 0x03U, // UU VCH USER - Unit-to-Unit Voice Channel User + + TALKER_ALIAS_HEADER = 0x04U, // + TALKER_ALIAS_BLOCK1 = 0x05U, // + TALKER_ALIAS_BLOCK2 = 0x06U, // + TALKER_ALIAS_BLOCK3 = 0x07U, // + + GPS_INFO = 0x08U, // + }; + } + + /// + /// FID_DMRA Extended Functions. + /// + namespace ExtendedFunctions { + enum : uint16_t { + CHECK = 0x0000U, // Radio Check + UNINHIBIT = 0x007EU, // Radio Uninhibit + INHIBIT = 0x007FU, // Radio Inhibit + CHECK_ACK = 0x0080U, // Radio Check Ack + UNINHIBIT_ACK = 0x00FEU, // Radio Uninhibit Ack + INHIBIT_ACK = 0x00FFU // Radio Inhibit Ack + }; + }; + + /// + /// Data Type(s) + /// + namespace DataType { + // Data Type Enumeration + enum E : uint8_t { + VOICE_PI_HEADER = 0x00U, // Voice with Privacy Indicator Header + VOICE_LC_HEADER = 0x01U, // Voice with Link Control Header + + TERMINATOR_WITH_LC = 0x02U, // Terminator with Link Control + + CSBK = 0x03U, // CSBK + + MBC_HEADER = 0x04U, // Multi-Block Control Header + MBC_DATA = 0x05U, // Multi-Block Control Data + + DATA_HEADER = 0x06U, // Data Header + RATE_12_DATA = 0x07U, // 1/2 Rate Data + RATE_34_DATA = 0x08U, // 3/4 Rate Data + + IDLE = 0x09U, // Idle + + RATE_1_DATA = 0x0AU, // Rate 1 Data + + /* + ** Internal Data Type(s) + */ + + VOICE_SYNC = 0xF0U, // Internal - Voice Sync + VOICE = 0xF1U // Internal - Voice + }; + } + + #define DMR_DT_VOICE_PI_HEADER "DMR, VOICE_PI_HEADER (Voice Header with Privacy Indicator)" + #define DMR_DT_VOICE_LC_HEADER "DMR, VOICE_LC_HEADER (Voice Header with Link Control)" + #define DMR_DT_TERMINATOR_WITH_LC "DMR, TERMINATOR_WITH_LC (Terminator with Link Control)" + #define DMR_DT_DATA_HEADER "DMR, DATA_HEADER (Data Header)" + #define DMR_DT_RATE_12_DATA "DMR, RATE_12_DATA (1/2-rate Data)" + #define DMR_DT_RATE_34_DATA "DMR, RATE_34_DATA (3/4-rate Data)" + #define DMR_DT_RATE_1_DATA "DMR, RATE_1_DATA (1-rate Data)" + + #define DMR_DT_VOICE_SYNC "DMR, VOICE_SYNC (Voice Data with Sync)" + #define DMR_DT_VOICE "DMR, VOICE (Voice Data)" + + /// + /// Site Models + /// + namespace SiteModel { + // Site Model Enumeration + enum E : uint8_t { + TINY = 0x00U, // Tiny + SMALL = 0x01U, // Small + LARGE = 0x02U, // Large + HUGE = 0x03U // Huge + }; + } + + // Target Address + const uint8_t TGT_ADRS_SYSCODE = 0x00U; + const uint8_t TGT_ADRS_TGID = 0x01U; + + /// + /// Talker ID + /// + namespace TalkerID { + enum : uint8_t { + NONE = 0x00U, // No Talker ID + + HEADER = 0x01U, // Talker ID Header + + BLOCK1 = 0x02U, // Talker ID Block 1 + BLOCK2 = 0x04U, // Talker ID Block 2 + BLOCK3 = 0x08U // Talker ID Block 3 + }; + } + + /// + /// Reason Code(s) + /// + namespace ReasonCode { + enum : uint8_t { + TS_ACK_RSN_MSG = 0x60U, // TS - Message Accepted + TS_ACK_RSN_REG = 0x62U, // TS - Registration Accepted + TS_ACK_RSN_AUTH_RESP = 0x64U, // TS - Authentication Challenge Response + TS_ACK_RSN_REG_SUB_ATTACH = 0x65U, // TS - Registration Response with subscription + MS_ACK_RSN_MSG = 0x44U, // MS - Message Accepted + MS_ACK_RSN_AUTH_RESP = 0x48U, // MS - Authentication Challenge Response + + TS_DENY_RSN_SYS_UNSUPPORTED_SVC = 0x20U,// System Unsupported Service + TS_DENY_RSN_PERM_USER_REFUSED = 0x21U, // User Permenantly Refused + TS_DENY_RSN_TEMP_USER_REFUSED = 0x22U, // User Temporarily Refused + TS_DENY_RSN_TRSN_SYS_REFUSED = 0x23U, // System Refused + TS_DENY_RSN_TGT_NOT_REG = 0x24U, // Target Not Registered + TS_DENY_RSN_TGT_UNAVAILABLE = 0x25U, // Target Unavailable + TS_DENY_RSN_SYS_BUSY = 0x27U, // System Busy + TS_DENY_RSN_SYS_NOT_READY = 0x28U, // System Not Ready + TS_DENY_RSN_CALL_CNCL_REFUSED = 0x29U, // Call Cancel Refused + TS_DENY_RSN_REG_REFUSED = 0x2AU, // Registration Refused + TS_DENY_RSN_REG_DENIED = 0x2BU, // Registration Denied + TS_DENY_RSN_MS_NOT_REG = 0x2DU, // MS Not Registered + TS_DENY_RSN_TGT_BUSY = 0x2EU, // Target Busy + TS_DENY_RSN_TGT_GROUP_NOT_VALID = 0x2FU,// Group Not Valid + + TS_QUEUED_RSN_NO_RESOURCE = 0xA0U, // No Resources Available + TS_QUEUED_RSN_SYS_BUSY = 0xA1U, // System Busy + + TS_WAIT_RSN = 0xE0U, // Wait + + MS_DENY_RSN_UNSUPPORTED_SVC = 0x00U, // Service Unsupported + }; + } + + /// + /// Random Access Service Kind + /// + namespace ServiceKind { + enum : uint8_t { + IND_VOICE_CALL = 0x00U, // Individual Voice Call + GRP_VOICE_CALL = 0x01U, // Group Voice Call + IND_DATA_CALL = 0x02U, // Individual Data Call + GRP_DATA_CALL = 0x03U, // Group Data Call + IND_UDT_DATA_CALL = 0x04U, // Individual UDT Short Data Call + GRP_UDT_DATA_CALL = 0x05U, // Group UDT Short Data Call + UDT_SHORT_POLL = 0x06U, // UDT Short Data Polling Service + STATUS_TRANSPORT = 0x07U, // Status Transport Service + CALL_DIVERSION = 0x08U, // Call Diversion Service + CALL_ANSWER = 0x09U, // Call Answer Service + SUPPLEMENTARY_SVC = 0x0DU, // Supplementary Service + REG_SVC = 0x0EU, // Registration Service + CANCEL_CALL = 0x0FU // Cancel Call Service + }; + } + + /// + /// Broadcast Announcement Type(s) + /// + namespace BroadcastAnncType { + enum : uint8_t { + ANN_WD_TSCC = 0x00U, // Announce-Withdraw TSCC Channel + CALL_TIMER_PARMS = 0x01U, // Specify Call Timer Parameters + VOTE_NOW = 0x02U, // Vote Now Advice + LOCAL_TIME = 0x03U, // Broadcast Local Time + MASS_REG = 0x04U, // Mass Registration + CHAN_FREQ = 0x05U, // Logical Channel/Frequency + ADJ_SITE = 0x06U, // Adjacent Site Information + SITE_PARMS = 0x07U // General Site Parameters + }; + } + + /// + /// Control Signalling Block Opcode(s) + /// + namespace CSBKO { + enum : uint8_t { + // CSBK ISP/OSP Shared Opcode(s) + NONE = 0x00U, // + UU_V_REQ = 0x04U, // UU VCH REQ - Unit-to-Unit Voice Channel Request + UU_ANS_RSP = 0x05U, // UU ANS RSP - Unit-to-Unit Answer Response + CTCSBK = 0x07U, // CT CSBK - Channel Timing CSBK + ALOHA = 0x19U, // ALOHA - Aloha PDU for Random Access + AHOY = 0x1CU, // AHOY - Enquiry from TSCC + RAND = 0x1FU, // (ETSI) RAND - Random Access / (DMRA) CALL ALRT - Call Alert + ACK_RSP = 0x20U, // ACK RSP - Acknowledge Response + EXT_FNCT = 0x24U, // (DMRA) EXT FNCT - Extended Function + NACK_RSP = 0x26U, // NACK RSP - Negative Acknowledgement Response + BROADCAST = 0x28U, // BCAST - Announcement PDU + MAINT = 0x2AU, // MAINT - Call Maintainence PDU + P_CLEAR = 0x2EU, // P_CLEAR - Payload Channel Clear + PV_GRANT = 0x30U, // PV_GRANT - Private Voice Channel Grant + TV_GRANT = 0x31U, // TV_GRANT - Talkgroup Voice Channel Grant + BTV_GRANT = 0x32U, // BTV_GRANT - Broadcast Talkgroup Voice Channel Grant + PD_GRANT = 0x33U, // PD_GRANT - Private Data Channel Grant + TD_GRANT = 0x34U, // TD_GRANT - Talkgroup Data Channel Grant + BSDWNACT = 0x38U, // BS DWN ACT - BS Outbound Activation + PRECCSBK = 0x3DU, // PRE CSBK - Preamble CSBK + + // CSBK DVM Outbound Signalling Packet (OSP) Opcode(s) + DVM_GIT_HASH = 0x3FU // + }; + } + } // namespace defines } // namespace dmr #endif // __DMR_DEFINES_H__ diff --git a/src/common/dmr/DMRUtils.h b/src/common/dmr/DMRUtils.h index a92717b1..5bd65194 100644 --- a/src/common/dmr/DMRUtils.h +++ b/src/common/dmr/DMRUtils.h @@ -7,7 +7,7 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2021 Bryan Biedenkapp, N2PLL +* Copyright (C) 2021,2024 Bryan Biedenkapp, N2PLL * */ #if !defined(__DMR_UTILS_H__) @@ -26,6 +26,8 @@ namespace dmr class HOST_SW_API DMRUtils { public: /// Helper to test and clamp a DMR color code. + /// Color Code + /// Clamped color code. static uint32_t colorCode(uint32_t colorCode) { if (colorCode < 0U) { // clamp to 0 @@ -39,36 +41,40 @@ namespace dmr } /// Helper to test and clamp a DMR site ID. - static uint32_t siteId(uint32_t id, uint8_t siteModel) + /// Site ID + /// Site Model + /// Clamped site ID. + static uint32_t siteId(uint32_t id, defines::SiteModel::E siteModel) { + using namespace dmr::defines; if (id > 0U) { id--; } switch (siteModel) { - case SITE_MODEL_TINY: + case SiteModel::TINY: { if (id > 0x07U) { // clamp to $7 id = 0x07U; } } break; - case SITE_MODEL_SMALL: + case SiteModel::SMALL: { if (id > 0x1FU) { // clamp to $1F id = 0x1FU; } } break; - case SITE_MODEL_LARGE: + case SiteModel::LARGE: { if (id > 0x7FU) { // clamp to $7F id = 0x7FU; } } break; - case SITE_MODEL_HUGE: + case SiteModel::HUGE: { if (id > 0x3FFU) { // clamp to $3FF id = 0x3FFU; @@ -81,31 +87,35 @@ namespace dmr } /// Helper to test and clamp a DMR network ID. - static uint32_t netId(uint32_t id, uint8_t siteModel) + /// Network ID + /// Site Model + /// Clamped network ID. + static uint32_t netId(uint32_t id, defines::SiteModel::E siteModel) { + using namespace dmr::defines; switch (siteModel) { - case SITE_MODEL_TINY: + case SiteModel::TINY: { if (id > 0x1FFU) { // clamp to $1FF id = 0x1FFU; } } break; - case SITE_MODEL_SMALL: + case SiteModel::SMALL: { if (id > 0x7FU) { // clamp to $7F id = 0x7FU; } } break; - case SITE_MODEL_LARGE: + case SiteModel::LARGE: { if (id > 0x1FU) { // clamp to $1F id = 0x1FU; } } break; - case SITE_MODEL_HUGE: + case SiteModel::HUGE: { if (id > 0x03U) { // clamp to $3 id = 0x03U; diff --git a/src/common/dmr/SiteData.h b/src/common/dmr/SiteData.h index 3003df0e..89b29f06 100644 --- a/src/common/dmr/SiteData.h +++ b/src/common/dmr/SiteData.h @@ -7,7 +7,7 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2021 Bryan Biedenkapp, N2PLL +* Copyright (C) 2021,2024 Bryan Biedenkapp, N2PLL * */ #if !defined(__DMR_SITE_DATA_H__) @@ -28,7 +28,7 @@ namespace dmr public: /// Initializes a new instance of the SiteData class. SiteData() : - m_siteModel(SITE_MODEL_SMALL), + m_siteModel(defines::SiteModel::SMALL), m_netId(1U), m_siteId(1U), m_parId(3U), @@ -43,7 +43,7 @@ namespace dmr /// DMR Site ID. /// DMR partition ID. /// - SiteData(uint8_t siteModel, uint16_t netId, uint16_t siteId, uint8_t parId, bool requireReq) : + SiteData(defines::SiteModel::E siteModel, uint16_t netId, uint16_t siteId, uint8_t parId, bool requireReq) : m_siteModel(siteModel), m_netId(netId), m_siteId(siteId), @@ -51,9 +51,10 @@ namespace dmr m_requireReg(requireReq), m_netActive(false) { + using namespace dmr::defines; // siteModel clamping - if (siteModel > SITE_MODEL_HUGE) - siteModel = SITE_MODEL_SMALL; + if (siteModel > SiteModel::HUGE) + siteModel = SiteModel::SMALL; // netId clamping m_netId = DMRUtils::netId(netId, siteModel); @@ -80,29 +81,30 @@ namespace dmr /// const uint32_t systemIdentity(bool msb = false) { + using namespace dmr::defines; uint32_t value = m_siteModel; switch (m_siteModel) { - case SITE_MODEL_TINY: + case SiteModel::TINY: { value = (value << 9) + (m_netId & 0x1FFU); value = (value << 3) + (m_siteId & 0x07U); } break; - case SITE_MODEL_SMALL: + case SiteModel::SMALL: { value = (value << 7) + (m_netId & 0x7FU); value = (value << 5) + (m_siteId & 0x1FU); } break; - case SITE_MODEL_LARGE: + case SiteModel::LARGE: { value = (value << 5) + (m_netId & 0x1FU); value = (value << 7) + (m_siteId & 0x7FU); } break; - case SITE_MODEL_HUGE: + case SiteModel::HUGE: { value = (value << 2) + (m_netId & 0x03U); value = (value << 10) + (m_siteId & 0x3FFU); @@ -138,7 +140,7 @@ namespace dmr public: /// DMR site model type. - __READONLY_PROPERTY_PLAIN(uint8_t, siteModel); + __READONLY_PROPERTY_PLAIN(defines::SiteModel::E, siteModel); /// DMR site network ID. __READONLY_PROPERTY_PLAIN(uint16_t, netId); /// DMR site ID. diff --git a/src/common/dmr/SlotType.cpp b/src/common/dmr/SlotType.cpp index c27a394c..5bc190db 100644 --- a/src/common/dmr/SlotType.cpp +++ b/src/common/dmr/SlotType.cpp @@ -9,12 +9,14 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2015,2016 Jonathan Naylor, G4KLX +* Copyright (C) 2024 Bryan Biedenkapp, N2PLL * */ #include "common/dmr/SlotType.h" #include "common/edac/Golay2087.h" using namespace dmr; +using namespace dmr::defines; #include @@ -27,7 +29,7 @@ using namespace dmr; /// SlotType::SlotType() : m_colorCode(0U), - m_dataType(0U) + m_dataType(DataType::IDLE) { /* stub */ } @@ -45,20 +47,20 @@ void SlotType::decode(const uint8_t* data) { assert(data != nullptr); - uint8_t DMRSlotType[3U]; - DMRSlotType[0U] = (data[12U] << 2) & 0xFCU; - DMRSlotType[0U] |= (data[13U] >> 6) & 0x03U; + uint8_t slotType[3U]; + slotType[0U] = (data[12U] << 2) & 0xFCU; + slotType[0U] |= (data[13U] >> 6) & 0x03U; - DMRSlotType[1U] = (data[13U] << 2) & 0xC0U; - DMRSlotType[1U] |= (data[19U] << 2) & 0x3CU; - DMRSlotType[1U] |= (data[20U] >> 6) & 0x03U; + slotType[1U] = (data[13U] << 2) & 0xC0U; + slotType[1U] |= (data[19U] << 2) & 0x3CU; + slotType[1U] |= (data[20U] >> 6) & 0x03U; - DMRSlotType[2U] = (data[20U] << 2) & 0xF0U; + slotType[2U] = (data[20U] << 2) & 0xF0U; - uint8_t code = edac::Golay2087::decode(DMRSlotType); + uint8_t code = edac::Golay2087::decode(slotType); m_colorCode = (code >> 4) & 0x0FU; - m_dataType = (code >> 0) & 0x0FU; + m_dataType = (DataType::E)((code >> 0) & 0x0FU); } /// @@ -69,16 +71,16 @@ void SlotType::encode(uint8_t* data) const { assert(data != nullptr); - uint8_t DMRSlotType[3U]; - DMRSlotType[0U] = (m_colorCode << 4) & 0xF0U; - DMRSlotType[0U] |= (m_dataType << 0) & 0x0FU; - DMRSlotType[1U] = 0x00U; - DMRSlotType[2U] = 0x00U; + uint8_t slotType[3U]; + slotType[0U] = (m_colorCode << 4) & 0xF0U; + slotType[0U] |= (m_dataType << 0) & 0x0FU; + slotType[1U] = 0x00U; + slotType[2U] = 0x00U; - edac::Golay2087::encode(DMRSlotType); + edac::Golay2087::encode(slotType); - data[12U] = (data[12U] & 0xC0U) | ((DMRSlotType[0U] >> 2) & 0x3FU); - data[13U] = (data[13U] & 0x0FU) | ((DMRSlotType[0U] << 6) & 0xC0U) | ((DMRSlotType[1U] >> 2) & 0x30U); - data[19U] = (data[19U] & 0xF0U) | ((DMRSlotType[1U] >> 2) & 0x0FU); - data[20U] = (data[20U] & 0x03U) | ((DMRSlotType[1U] << 6) & 0xC0U) | ((DMRSlotType[2U] >> 2) & 0x3CU); + data[12U] = (data[12U] & 0xC0U) | ((slotType[0U] >> 2) & 0x3FU); + data[13U] = (data[13U] & 0x0FU) | ((slotType[0U] << 6) & 0xC0U) | ((slotType[1U] >> 2) & 0x30U); + data[19U] = (data[19U] & 0xF0U) | ((slotType[1U] >> 2) & 0x0FU); + data[20U] = (data[20U] & 0x03U) | ((slotType[1U] << 6) & 0xC0U) | ((slotType[2U] >> 2) & 0x3CU); } diff --git a/src/common/dmr/SlotType.h b/src/common/dmr/SlotType.h index aa81b133..8d8aced8 100644 --- a/src/common/dmr/SlotType.h +++ b/src/common/dmr/SlotType.h @@ -9,12 +9,14 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2015,2016 Jonathan Naylor, G4KLX +* Copyright (C) 2024 Bryan Biedenkapp, N2PLL * */ #if !defined(__DMR_SLOT_TYPE_H__) #define __DMR_SLOT_TYPE_H__ #include "common/Defines.h" +#include "common/dmr/DMRDefines.h" namespace dmr { @@ -40,7 +42,7 @@ namespace dmr __PROPERTY(uint8_t, colorCode, ColorCode); /// Slot data type. - __PROPERTY(uint8_t, dataType, DataType); + __PROPERTY(defines::DataType::E, dataType, DataType); }; } // namespace dmr diff --git a/src/common/dmr/Sync.cpp b/src/common/dmr/Sync.cpp index 5a73997a..b453233c 100644 --- a/src/common/dmr/Sync.cpp +++ b/src/common/dmr/Sync.cpp @@ -16,6 +16,7 @@ #include "dmr/Sync.h" using namespace dmr; +using namespace dmr::defines; #include diff --git a/src/common/dmr/data/Data.cpp b/src/common/dmr/data/Data.cpp index cb2b4b61..917ab5d0 100644 --- a/src/common/dmr/data/Data.cpp +++ b/src/common/dmr/data/Data.cpp @@ -9,14 +9,16 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2015,2016 Jonathan Naylor, G4KLX +* Copyright (C) 2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "dmr/DMRDefines.h" #include "dmr/data/Data.h" -using namespace dmr::data; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::data; #include #include @@ -52,10 +54,10 @@ Data::Data() : m_slotNo(1U), m_srcId(0U), m_dstId(0U), - m_flco(FLCO_GROUP), + m_flco(FLCO::GROUP), m_n(0U), m_seqNo(0U), - m_dataType(0U), + m_dataType(DataType::IDLE), m_ber(0U), m_rssi(0U), m_data(nullptr) diff --git a/src/common/dmr/data/Data.h b/src/common/dmr/data/Data.h index 0294f127..c98a7d98 100644 --- a/src/common/dmr/data/Data.h +++ b/src/common/dmr/data/Data.h @@ -9,12 +9,14 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2015,2016 Jonathan Naylor, G4KLX +* Copyright (C) 2024 Bryan Biedenkapp, N2PLL * */ #if !defined(__DMR_DATA__DATA_H__) #define __DMR_DATA__DATA_H__ #include "common/Defines.h" +#include "common/dmr/DMRDefines.h" namespace dmr { @@ -52,7 +54,7 @@ namespace dmr __PROPERTY(uint32_t, dstId, DstId); /// Sets the full-link control opcode. - __PROPERTY(uint8_t, flco, FLCO); + __PROPERTY(defines::FLCO::E, flco, FLCO); /// __PROPERTY(uint8_t, n, N); @@ -61,7 +63,7 @@ namespace dmr __PROPERTY(uint8_t, seqNo, SeqNo); /// Embedded data type. - __PROPERTY(uint8_t, dataType, DataType); + __PROPERTY(defines::DataType::E, dataType, DataType); /// Bit Error Rate. __PROPERTY(uint8_t, ber, BER); diff --git a/src/common/dmr/data/DataHeader.cpp b/src/common/dmr/data/DataHeader.cpp index 654a80be..dfb2036f 100644 --- a/src/common/dmr/data/DataHeader.cpp +++ b/src/common/dmr/data/DataHeader.cpp @@ -10,7 +10,7 @@ * * Copyright (C) 2012 Ian Wraith * Copyright (C) 2015,2016,2017 Jonathan Naylor, G4KLX -* Copyright (C) 2021,2023 Bryan Biedenkapp, N2PLL +* Copyright (C) 2021,2023,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -20,8 +20,9 @@ #include "edac/CRC.h" #include "Utils.h" -using namespace dmr::data; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::data; #include #include @@ -41,7 +42,7 @@ const uint8_t UDTF_NMEA = 0x05U; /// DataHeader::DataHeader() : m_GI(false), - m_DPF(DPF_UDT), + m_DPF(DPF::UDT), m_sap(0U), m_fsn(0U), m_Ns(0U), @@ -52,8 +53,8 @@ DataHeader::DataHeader() : m_srcId(0U), m_dstId(0U), m_blocks(0U), - m_rspClass(PDU_ACK_CLASS_NACK), - m_rspType(PDU_ACK_TYPE_NACK_ILLEGAL), + m_rspClass(PDUResponseClass::NACK), + m_rspType(PDUResponseType::NACK_ILLEGAL), m_rspStatus(0U), m_srcPort(0U), m_dstPort(0U), @@ -141,15 +142,15 @@ bool DataHeader::decode(const uint8_t* data) m_GI = (m_data[0U] & 0x80U) == 0x80U; // Group/Individual Flag m_A = (m_data[0U] & 0x40U) == 0x40U; - m_DPF = m_data[0U] & 0x0FU; // Data Packet Format - if (m_DPF == DPF_PROPRIETARY) + m_DPF = (DPF::E)(m_data[0U] & 0x0FU); // Data Packet Format + if (m_DPF == DPF::PROPRIETARY) return true; m_dstId = m_data[2U] << 16 | m_data[3U] << 8 | m_data[4U]; // Destination ID m_srcId = m_data[5U] << 16 | m_data[6U] << 8 | m_data[7U]; // Source ID switch (m_DPF) { - case DPF_UDT: + case DPF::UDT: #if DEBUG_DMR_PDU_DATA Utils::dump(1U, "DMR, DataHeader::decode(), Unified Data Transport Header", m_data, DMR_LC_HEADER_LENGTH_BYTES); #endif @@ -162,7 +163,7 @@ bool DataHeader::decode(const uint8_t* data) m_UDTO = m_data[9U] & 0x3FU; // UDT Opcode break; - case DPF_UNCONFIRMED_DATA: + case DPF::UNCONFIRMED_DATA: #if DEBUG_DMR_PDU_DATA Utils::dump(1U, "DMR, DataHeader::decode(), Unconfirmed Data Header", m_data, DMR_LC_HEADER_LENGTH_BYTES); #endif @@ -173,7 +174,7 @@ bool DataHeader::decode(const uint8_t* data) m_fsn = m_data[9U] & 0x0FU; // Fragment Sequence Number break; - case DPF_CONFIRMED_DATA: + case DPF::CONFIRMED_DATA: #if DEBUG_DMR_PDU_DATA Utils::dump(1U, "DMR, DataHeader::decode(), Confirmed Data Header", m_data, DMR_LC_HEADER_LENGTH_BYTES); #endif @@ -186,7 +187,7 @@ bool DataHeader::decode(const uint8_t* data) m_fsn = m_data[9U] & 0x0FU; // Fragement Sequence Number break; - case DPF_RESPONSE: + case DPF::RESPONSE: #if DEBUG_DMR_PDU_DATA Utils::dump(1U, "DMR, DataHeader::decode(), Response Data Header", m_data, DMR_LC_HEADER_LENGTH_BYTES); #endif @@ -197,7 +198,7 @@ bool DataHeader::decode(const uint8_t* data) m_rspStatus = m_data[9U] & 0x07U; // Response Status break; - case DPF_DEFINED_SHORT: + case DPF::DEFINED_SHORT: #if DEBUG_DMR_PDU_DATA Utils::dump(1U, "DMR, DataHeader::decode(), Defined Short Data Header", m_data, DMR_LC_HEADER_LENGTH_BYTES); #endif @@ -209,7 +210,7 @@ bool DataHeader::decode(const uint8_t* data) m_padCount = m_data[9U]; // Bit Padding break; - case DPF_DEFINED_RAW: + case DPF::DEFINED_RAW: #if DEBUG_DMR_PDU_DATA Utils::dump(1U, "DMR, DataHeader::decode(), Raw Data Header", m_data, DMR_LC_HEADER_LENGTH_BYTES); #endif @@ -238,7 +239,7 @@ void DataHeader::encode(uint8_t* data) const assert(data != nullptr); // perform no processing other then regenerating FEC - if (m_DPF == DPF_PROPRIETARY) { + if (m_DPF == DPF::PROPRIETARY) { m_data[10U] = m_data[11U] = 0x00U; // compute CRC-CCITT 16 @@ -272,7 +273,7 @@ void DataHeader::encode(uint8_t* data) const m_data[7U] = (m_srcId >> 0) & 0xFFU; switch (m_DPF) { - case DPF_UDT: + case DPF::UDT: m_data[1U] = ((m_sap & 0x0FU) << 4) + // Service Access Point (m_dataFormat & 0x0FU); // UDT Format m_data[8U] = ((m_padCount & 0x1FU) << 3) + // Pad Nibble @@ -285,7 +286,7 @@ void DataHeader::encode(uint8_t* data) const #endif break; - case DPF_UNCONFIRMED_DATA: + case DPF::UNCONFIRMED_DATA: m_data[0U] = m_data[0U] + (m_padCount & 0x10U); // Octet Pad Count MSB m_data[1U] = ((m_sap & 0x0FU) << 4) + // Service Access Point (m_padCount & 0x0FU); // Octet Pad Count LSB @@ -297,7 +298,7 @@ void DataHeader::encode(uint8_t* data) const #endif break; - case DPF_CONFIRMED_DATA: + case DPF::CONFIRMED_DATA: m_data[0U] = m_data[0U] + (m_padCount & 0x10U); // Octet Pad Count MSB m_data[1U] = ((m_sap & 0x0FU) << 4) + // Service Access Point (m_padCount & 0x0FU); // Octet Pad Count LSB @@ -311,7 +312,7 @@ void DataHeader::encode(uint8_t* data) const #endif break; - case DPF_RESPONSE: + case DPF::RESPONSE: m_data[1U] = ((m_sap & 0x0FU) << 4); // Service Access Point m_data[8U] = m_blocks & 0x7FU; // Blocks To Follow m_data[9U] = ((m_rspClass & 0x03U) << 6) + // Response Class @@ -322,7 +323,7 @@ void DataHeader::encode(uint8_t* data) const #endif break; - case DPF_DEFINED_SHORT: + case DPF::DEFINED_SHORT: m_data[0U] = m_data[0U] + (m_blocks & 0x30U); // Blocks To Follow MSB m_data[1U] = ((m_sap & 0x0FU) << 4) + // Service Access Point (m_blocks & 0x0FU); // Blocks To Follow LSB @@ -335,7 +336,7 @@ void DataHeader::encode(uint8_t* data) const #endif break; - case DPF_DEFINED_RAW: + case DPF::DEFINED_RAW: m_data[0U] = m_data[0U] + (m_blocks & 0x30U); // Blocks To Follow MSB m_data[1U] = ((m_sap & 0x0FU) << 4) + // Service Access Point (m_blocks & 0x0FU); // Blocks To Follow LSB @@ -353,7 +354,7 @@ void DataHeader::encode(uint8_t* data) const break; } - if (m_DPF == DPF_UDT) { + if (m_DPF == DPF::UDT) { m_data[9U] &= 0xFEU; edac::CRC::addCCITT162(m_data, DMR_LC_HEADER_LENGTH_BYTES); diff --git a/src/common/dmr/data/DataHeader.h b/src/common/dmr/data/DataHeader.h index ae53dbe6..c68087f6 100644 --- a/src/common/dmr/data/DataHeader.h +++ b/src/common/dmr/data/DataHeader.h @@ -45,8 +45,8 @@ namespace dmr /// Flag indicating whether the CSBK is group or individual. __PROPERTY(bool, GI, GI); - /// - __PROPERTY(uint8_t, DPF, DPF); + /// Data packet format. + __PROPERTY(defines::DPF::E, DPF, DPF); /// Service access point. __PROPERTY(uint8_t, sap, SAP); diff --git a/src/common/dmr/data/EmbeddedData.cpp b/src/common/dmr/data/EmbeddedData.cpp index 458343df..ed5fbfb7 100644 --- a/src/common/dmr/data/EmbeddedData.cpp +++ b/src/common/dmr/data/EmbeddedData.cpp @@ -9,6 +9,7 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2015,2016,2017 Jonathan Naylor, G4KLX +* Copyright (C) 2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -18,8 +19,9 @@ #include "edac/CRC.h" #include "Utils.h" -using namespace dmr::data; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::data; #include #include @@ -34,7 +36,7 @@ using namespace dmr; /// EmbeddedData::EmbeddedData() : m_valid(false), - m_FLCO(FLCO_GROUP), + m_FLCO(FLCO::GROUP), m_state(LCS_NONE), m_data(nullptr), m_raw(nullptr) @@ -195,7 +197,7 @@ std::unique_ptr EmbeddedData::getLC() const if (!m_valid) return nullptr; - if (m_FLCO != FLCO_GROUP && m_FLCO != FLCO_PRIVATE) + if (m_FLCO != FLCO::GROUP && m_FLCO != FLCO::PRIVATE) return nullptr; return std::make_unique(m_data); @@ -303,7 +305,7 @@ void EmbeddedData::decodeEmbeddedData() // extract the FLCO uint8_t flco; Utils::bitsToByteBE(m_data + 0U, flco); - m_FLCO = flco & 0x3FU; + m_FLCO = (FLCO::E)(flco & 0x3FU); } /// diff --git a/src/common/dmr/data/EmbeddedData.h b/src/common/dmr/data/EmbeddedData.h index 057d346f..af4d83a9 100644 --- a/src/common/dmr/data/EmbeddedData.h +++ b/src/common/dmr/data/EmbeddedData.h @@ -9,12 +9,14 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2015,2016,2017 Jonathan Naylor, G4KLX +* Copyright (C) 2024 Bryan Biedenkap, N2PLL * */ #if !defined(__DMR_DATA__EMBEDDED_DATA_H__) #define __DMR_DATA__EMBEDDED_DATA_H__ #include "common/Defines.h" +#include "common/dmr/DMRDefines.h" #include "common/dmr/lc/LC.h" namespace dmr @@ -64,7 +66,7 @@ namespace dmr /// Flag indicating whether or not the embedded data is valid. __READONLY_PROPERTY_PLAIN(bool, valid); /// Full-link control opcode. - __READONLY_PROPERTY(uint8_t, FLCO, FLCO); + __READONLY_PROPERTY(defines::FLCO::E, FLCO, FLCO); private: LC_STATE m_state; diff --git a/src/common/dmr/lc/CSBK.cpp b/src/common/dmr/lc/CSBK.cpp index 67655709..74fa2f8e 100644 --- a/src/common/dmr/lc/CSBK.cpp +++ b/src/common/dmr/lc/CSBK.cpp @@ -9,7 +9,7 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2015,2016 Jonathan Naylor, G4KLX -* Copyright (C) 2019-2023 Bryan Biedenkapp, N2PLL +* Copyright (C) 2019-2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -19,8 +19,9 @@ #include "Log.h" #include "Utils.h" -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; #include @@ -52,14 +53,14 @@ CSBK::CSBK() : m_colorCode(0U), m_lastBlock(true), m_Cdef(false), - m_CSBKO(CSBKO_NONE), + m_CSBKO(CSBKO::NONE), m_FID(0x00U), m_GI(false), m_srcId(0U), m_dstId(0U), m_dataContent(false), m_CBF(0U), - m_dataType(DT_CSBK), + m_dataType(DataType::CSBK), m_emergency(false), m_privacy(false), m_supplementData(false), @@ -93,7 +94,7 @@ CSBK::~CSBK() /// std::string CSBK::toString() { - return std::string("CSBKO_UNKWN (Unknown CSBK)"); + return std::string("CSBKO, UNKNOWN (Unknown CSBK)"); } /// @@ -123,57 +124,69 @@ bool CSBK::regenerate(uint8_t* data, uint8_t dataType) // validate the CRC-CCITT 16 switch (dataType) { - case DT_CSBK: + case DataType::CSBK: csbk[10U] ^= CSBK_CRC_MASK[0U]; csbk[11U] ^= CSBK_CRC_MASK[1U]; break; - case DT_MBC_HEADER: + case DataType::MBC_HEADER: csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; break; + default: + LogError(LOG_DMR, "CSBK::regenerate(), unhandled dataType = $%02X", dataType); + break; } bool valid = edac::CRC::checkCCITT162(csbk, DMR_CSBK_LENGTH_BYTES); if (!valid) { - LogError(LOG_DMR, "CSBK::decode(), failed CRC CCITT-162 check"); + LogError(LOG_DMR, "CSBK::regenerate(), failed CRC CCITT-162 check"); return false; } // restore the checksum switch (dataType) { - case DT_CSBK: + case DataType::CSBK: csbk[10U] ^= CSBK_CRC_MASK[0U]; csbk[11U] ^= CSBK_CRC_MASK[1U]; break; - case DT_MBC_HEADER: + case DataType::MBC_HEADER: csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; break; + default: + LogError(LOG_DMR, "CSBK::regenerate(), unhandled dataType = $%02X", dataType); + break; } // calculate checksum switch (dataType) { - case DT_CSBK: + case DataType::CSBK: csbk[10U] ^= CSBK_CRC_MASK[0U]; csbk[11U] ^= CSBK_CRC_MASK[1U]; break; - case DT_MBC_HEADER: + case DataType::MBC_HEADER: csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; break; + default: + LogError(LOG_DMR, "CSBK::regenerate(), unhandled dataType = $%02X", dataType); + break; } edac::CRC::addCCITT162(csbk, 12U); switch (dataType) { - case DT_CSBK: + case DataType::CSBK: csbk[10U] ^= CSBK_CRC_MASK[0U]; csbk[11U] ^= CSBK_CRC_MASK[1U]; break; - case DT_MBC_HEADER: + case DataType::MBC_HEADER: csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; break; + default: + LogError(LOG_DMR, "CSBK::regenerate(), unhandled dataType = $%02X", dataType); + break; } // encode BPTC (196,96) FEC @@ -251,14 +264,17 @@ bool CSBK::decode(const uint8_t* data, uint8_t* payload) // validate the CRC-CCITT 16 switch (m_dataType) { - case DT_CSBK: + case DataType::CSBK: csbk[10U] ^= CSBK_CRC_MASK[0U]; csbk[11U] ^= CSBK_CRC_MASK[1U]; break; - case DT_MBC_HEADER: + case DataType::MBC_HEADER: csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; break; + default: + LogError(LOG_DMR, "CSBK::decode(), unhandled dataType = $%02X", m_dataType); + break; } bool valid = edac::CRC::checkCCITT162(csbk, DMR_CSBK_LENGTH_BYTES); @@ -269,14 +285,17 @@ bool CSBK::decode(const uint8_t* data, uint8_t* payload) // restore the checksum switch (m_dataType) { - case DT_CSBK: + case DataType::CSBK: csbk[10U] ^= CSBK_CRC_MASK[0U]; csbk[11U] ^= CSBK_CRC_MASK[1U]; break; - case DT_MBC_HEADER: + case DataType::MBC_HEADER: csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; break; + default: + LogError(LOG_DMR, "CSBK::decode(), unhandled dataType = $%02X", m_dataType); + break; } if (m_verbose) { @@ -321,27 +340,33 @@ void CSBK::encode(uint8_t* data, const uint8_t* payload) } switch (m_dataType) { - case DT_CSBK: + case DataType::CSBK: csbk[10U] ^= CSBK_CRC_MASK[0U]; csbk[11U] ^= CSBK_CRC_MASK[1U]; break; - case DT_MBC_HEADER: + case DataType::MBC_HEADER: csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; break; + default: + LogError(LOG_DMR, "CSBK::encoded(), unhandled dataType = $%02X", m_dataType); + break; } edac::CRC::addCCITT162(csbk, 12U); switch (m_dataType) { - case DT_CSBK: + case DataType::CSBK: csbk[10U] ^= CSBK_CRC_MASK[0U]; csbk[11U] ^= CSBK_CRC_MASK[1U]; break; - case DT_MBC_HEADER: + case DataType::MBC_HEADER: csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; break; + default: + LogError(LOG_DMR, "CSBK::encode(), unhandled dataType = $%02X", m_dataType); + break; } if (m_verbose) { diff --git a/src/common/dmr/lc/CSBK.h b/src/common/dmr/lc/CSBK.h index 6169b177..d9195bfd 100644 --- a/src/common/dmr/lc/CSBK.h +++ b/src/common/dmr/lc/CSBK.h @@ -9,13 +9,14 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2015,2016 Jonathan Naylor, G4KLX -* Copyright (C) 2019-2023 Bryan Biedenkapp, N2PLL +* Copyright (C) 2019-2024 Bryan Biedenkapp, N2PLL * */ #if !defined(__DMR_LC__CSBK_H__) #define __DMR_LC__CSBK_H__ #include "common/Defines.h" +#include "common/dmr/DMRDefines.h" #include "common/dmr/SiteData.h" #include "common/lookups/IdenTableLookup.h" #include "common/Utils.h" @@ -95,7 +96,7 @@ namespace dmr __PROTECTED_PROPERTY(uint8_t, CBF, CBF); /// Data type for this CSBK. - __PROTECTED_PROPERTY(uint8_t, dataType, DataType); + __PROTECTED_PROPERTY(defines::DataType::E, dataType, DataType); /** Common Service Options */ /// Flag indicating the emergency bits are set. diff --git a/src/common/dmr/lc/FullLC.cpp b/src/common/dmr/lc/FullLC.cpp index 82639661..1c7f1bb5 100644 --- a/src/common/dmr/lc/FullLC.cpp +++ b/src/common/dmr/lc/FullLC.cpp @@ -10,7 +10,7 @@ * * Copyright (C) 2012 Ian Wraith * Copyright (C) 2015,2016 Jonathan Naylor, G4KLX -* Copyright (C) 2021 Bryan Biedenkapp, N2PLL +* Copyright (C) 2021,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -20,8 +20,9 @@ #include "edac/CRC.h" #include "Log.h" -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; #include #include @@ -50,7 +51,7 @@ FullLC::~FullLC() = default; /// /// /// -std::unique_ptr FullLC::decode(const uint8_t* data, uint8_t type) +std::unique_ptr FullLC::decode(const uint8_t* data, DataType::E type) { assert(data != nullptr); @@ -59,13 +60,13 @@ std::unique_ptr FullLC::decode(const uint8_t* data, uint8_t type) m_bptc.decode(data, lcData); switch (type) { - case DT_VOICE_LC_HEADER: + case DataType::VOICE_LC_HEADER: lcData[9U] ^= VOICE_LC_HEADER_CRC_MASK[0U]; lcData[10U] ^= VOICE_LC_HEADER_CRC_MASK[1U]; lcData[11U] ^= VOICE_LC_HEADER_CRC_MASK[2U]; break; - case DT_TERMINATOR_WITH_LC: + case DataType::TERMINATOR_WITH_LC: lcData[9U] ^= TERMINATOR_WITH_LC_CRC_MASK[0U]; lcData[10U] ^= TERMINATOR_WITH_LC_CRC_MASK[1U]; lcData[11U] ^= TERMINATOR_WITH_LC_CRC_MASK[2U]; @@ -89,7 +90,7 @@ std::unique_ptr FullLC::decode(const uint8_t* data, uint8_t type) /// /// /// -void FullLC::encode(const LC& lc, uint8_t* data, uint8_t type) +void FullLC::encode(const LC& lc, uint8_t* data, DataType::E type) { assert(data != nullptr); @@ -101,13 +102,13 @@ void FullLC::encode(const LC& lc, uint8_t* data, uint8_t type) edac::RS129::encode(lcData, 9U, parity); switch (type) { - case DT_VOICE_LC_HEADER: + case DataType::VOICE_LC_HEADER: lcData[9U] = parity[2U] ^ VOICE_LC_HEADER_CRC_MASK[0U]; lcData[10U] = parity[1U] ^ VOICE_LC_HEADER_CRC_MASK[1U]; lcData[11U] = parity[0U] ^ VOICE_LC_HEADER_CRC_MASK[2U]; break; - case DT_TERMINATOR_WITH_LC: + case DataType::TERMINATOR_WITH_LC: lcData[9U] = parity[2U] ^ TERMINATOR_WITH_LC_CRC_MASK[0U]; lcData[10U] = parity[1U] ^ TERMINATOR_WITH_LC_CRC_MASK[1U]; lcData[11U] = parity[0U] ^ TERMINATOR_WITH_LC_CRC_MASK[2U]; diff --git a/src/common/dmr/lc/FullLC.h b/src/common/dmr/lc/FullLC.h index 8aa07c96..a7c6c8c1 100644 --- a/src/common/dmr/lc/FullLC.h +++ b/src/common/dmr/lc/FullLC.h @@ -9,13 +9,14 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2015,2016 Jonathan Naylor, G4KLX -* Copyright (C) 2021 Bryan Biedenkapp, N2PLL +* Copyright (C) 2021,2024 Bryan Biedenkapp, N2PLL * */ #if !defined(__DMR_LC__FULL_LC_H__) #define __DMR_LC__FULL_LC_H__ #include "common/Defines.h" +#include "common/dmr/DMRDefines.h" #include "common/dmr/lc/LC.h" #include "common/dmr/lc/PrivacyLC.h" #include "common/edac/BPTC19696.h" @@ -37,9 +38,9 @@ namespace dmr ~FullLC(); /// Decode DMR full-link control data. - std::unique_ptr decode(const uint8_t* data, uint8_t type); + std::unique_ptr decode(const uint8_t* data, defines::DataType::E type); /// Encode DMR full-link control data. - void encode(const LC& lc, uint8_t* data, uint8_t type); + void encode(const LC& lc, uint8_t* data, defines::DataType::E type); /// Decode DMR privacy control data. std::unique_ptr decodePI(const uint8_t* data); diff --git a/src/common/dmr/lc/LC.cpp b/src/common/dmr/lc/LC.cpp index c4903ced..abc0f57d 100644 --- a/src/common/dmr/lc/LC.cpp +++ b/src/common/dmr/lc/LC.cpp @@ -9,7 +9,7 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2015,2016 Jonathan Naylor, G4KLX -* Copyright (C) 2020-2021 Bryan Biedenkapp, N2PLL +* Copyright (C) 2020-2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -17,8 +17,9 @@ #include "dmr/lc/LC.h" #include "Utils.h" -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; #include @@ -32,7 +33,7 @@ using namespace dmr; /// Full-link Control Opcode. /// Source ID. /// Destination ID. -LC::LC(uint8_t flco, uint32_t srcId, uint32_t dstId) : +LC::LC(FLCO::E flco, uint32_t srcId, uint32_t dstId) : m_PF(false), m_FLCO(flco), m_FID(FID_ETSI), @@ -47,13 +48,14 @@ LC::LC(uint8_t flco, uint32_t srcId, uint32_t dstId) : { /* stub */ } + /// /// Initializes a new instance of the LC class. /// /// LC::LC(const uint8_t* data) : m_PF(false), - m_FLCO(FLCO_GROUP), + m_FLCO(FLCO::GROUP), m_FID(FID_ETSI), m_srcId(0U), m_dstId(0U), @@ -69,7 +71,7 @@ LC::LC(const uint8_t* data) : m_PF = (data[0U] & 0x80U) == 0x80U; m_R = (data[0U] & 0x40U) == 0x40U; - m_FLCO = data[0U] & 0x3FU; + m_FLCO = (FLCO::E)(data[0U] & 0x3FU); m_FID = data[1U]; @@ -82,13 +84,14 @@ LC::LC(const uint8_t* data) : m_dstId = data[3U] << 16 | data[4U] << 8 | data[5U]; // Destination Address m_srcId = data[6U] << 16 | data[7U] << 8 | data[8U]; // Source Address } + /// /// Initializes a new instance of the LC class. /// /// LC::LC(const bool* bits) : m_PF(false), - m_FLCO(FLCO_GROUP), + m_FLCO(FLCO::GROUP), m_FID(FID_ETSI), m_srcId(0U), m_dstId(0U), @@ -106,7 +109,7 @@ LC::LC(const bool* bits) : uint8_t temp1, temp2, temp3; Utils::bitsToByteBE(bits + 0U, temp1); - m_FLCO = temp1 & 0x3FU; + m_FLCO = (FLCO::E)(temp1 & 0x3FU); Utils::bitsToByteBE(bits + 8U, temp2); m_FID = temp2; @@ -137,7 +140,7 @@ LC::LC(const bool* bits) : /// LC::LC() : m_PF(false), - m_FLCO(FLCO_GROUP), + m_FLCO(FLCO::GROUP), m_FID(FID_ETSI), m_srcId(0U), m_dstId(0U), @@ -164,7 +167,7 @@ void LC::getData(uint8_t* data) const { assert(data != nullptr); - data[0U] = (uint8_t)m_FLCO; + data[0U] = m_FLCO; if (m_PF) data[0U] |= 0x80U; diff --git a/src/common/dmr/lc/LC.h b/src/common/dmr/lc/LC.h index 4b21b221..1ce3c19e 100644 --- a/src/common/dmr/lc/LC.h +++ b/src/common/dmr/lc/LC.h @@ -9,13 +9,14 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2015,2016 Jonathan Naylor, G4KLX -* Copyright (C) 2020-2021 Bryan Biedenkapp, N2PLL +* Copyright (C) 2020-2024 Bryan Biedenkapp, N2PLL * */ #if !defined(__DMR_LC__LC_H__) #define __DMR_LC__LC_H__ #include "common/Defines.h" +#include "common/dmr/DMRDefines.h" namespace dmr { @@ -29,7 +30,7 @@ namespace dmr class HOST_SW_API LC { public: /// Initializes a new instance of the LC class. - LC(uint8_t flco, uint32_t srcId, uint32_t dstId); + LC(defines::FLCO::E flco, uint32_t srcId, uint32_t dstId); /// Initializes a new instance of the LC class. LC(const uint8_t* data); /// Initializes a new instance of the LC class. @@ -49,7 +50,7 @@ namespace dmr __PROPERTY(bool, PF, PF); /// Full-link control opcode. - __PROPERTY(uint8_t, FLCO, FLCO); + __PROPERTY(defines::FLCO::E, FLCO, FLCO); /// Feature ID. __PROPERTY(uint8_t, FID, FID); diff --git a/src/common/dmr/lc/PrivacyLC.cpp b/src/common/dmr/lc/PrivacyLC.cpp index 91c9f14f..beb0a723 100644 --- a/src/common/dmr/lc/PrivacyLC.cpp +++ b/src/common/dmr/lc/PrivacyLC.cpp @@ -7,7 +7,7 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2021 Bryan Biedenkapp, N2PLL +* Copyright (C) 2021,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -15,8 +15,9 @@ #include "dmr/lc/PrivacyLC.h" #include "Utils.h" -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; #include @@ -38,7 +39,7 @@ PrivacyLC::PrivacyLC(const uint8_t* data) : { assert(data != nullptr); - m_mi = new uint8_t[DMR_MI_LENGTH_BYTES]; + m_mi = new uint8_t[MI_LENGTH_BYTES]; m_group = (data[0U] & 0x20U) == 0x20U; m_algId = data[0U] & 7; // Algorithm ID @@ -67,7 +68,7 @@ PrivacyLC::PrivacyLC(const bool* bits) : { assert(bits != nullptr); - m_mi = new uint8_t[DMR_MI_LENGTH_BYTES]; + m_mi = new uint8_t[MI_LENGTH_BYTES]; uint8_t temp1, temp2, temp3; Utils::bitsToByteBE(bits + 0U, temp1); @@ -110,7 +111,7 @@ PrivacyLC::PrivacyLC() : m_kId(0U), m_mi(nullptr) { - m_mi = new uint8_t[DMR_MI_LENGTH_BYTES]; + m_mi = new uint8_t[MI_LENGTH_BYTES]; } /// diff --git a/src/common/dmr/lc/ShortLC.cpp b/src/common/dmr/lc/ShortLC.cpp index 60b83a10..9d460ca5 100644 --- a/src/common/dmr/lc/ShortLC.cpp +++ b/src/common/dmr/lc/ShortLC.cpp @@ -16,8 +16,8 @@ #include "edac/Hamming.h" #include "Utils.h" -using namespace dmr::lc; using namespace dmr; +using namespace dmr::lc; #include diff --git a/src/common/dmr/lc/csbk/CSBKFactory.cpp b/src/common/dmr/lc/csbk/CSBKFactory.cpp index 62d2ac22..e6af2653 100644 --- a/src/common/dmr/lc/csbk/CSBKFactory.cpp +++ b/src/common/dmr/lc/csbk/CSBKFactory.cpp @@ -17,9 +17,10 @@ #include "Log.h" #include "Utils.h" -using namespace dmr::lc::csbk; -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; +using namespace dmr::lc::csbk; #include @@ -43,7 +44,7 @@ CSBKFactory::~CSBKFactory() = default; /// /// /// True, if CSBK was decoded, otherwise false. -std::unique_ptr CSBKFactory::createCSBK(const uint8_t* data, uint8_t dataType) +std::unique_ptr CSBKFactory::createCSBK(const uint8_t* data, DataType::E dataType) { assert(data != nullptr); @@ -55,47 +56,53 @@ std::unique_ptr CSBKFactory::createCSBK(const uint8_t* data, uint8_t dataT // validate the CRC-CCITT 16 switch (dataType) { - case DT_CSBK: + case DataType::CSBK: csbk[10U] ^= CSBK_CRC_MASK[0U]; csbk[11U] ^= CSBK_CRC_MASK[1U]; break; - case DT_MBC_HEADER: + case DataType::MBC_HEADER: csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; break; + default: + LogError(LOG_DMR, "CSBKFactory::createCSBK(), unhandled dataType = $%02X", dataType); + break; } bool valid = edac::CRC::checkCCITT162(csbk, DMR_CSBK_LENGTH_BYTES); if (!valid) { - LogError(LOG_DMR, "CSBK::decode(), failed CRC CCITT-162 check"); + LogError(LOG_DMR, "CSBKFactory::createCSBK(), failed CRC CCITT-162 check"); return nullptr; } // restore the checksum switch (dataType) { - case DT_CSBK: + case DataType::CSBK: csbk[10U] ^= CSBK_CRC_MASK[0U]; csbk[11U] ^= CSBK_CRC_MASK[1U]; break; - case DT_MBC_HEADER: + case DataType::MBC_HEADER: csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; break; + default: + LogError(LOG_DMR, "CSBKFactory::createCSBK(), unhandled dataType = $%02X", dataType); + break; } uint8_t CSBKO = csbk[0U] & 0x3FU; // CSBKO uint8_t FID = csbk[1U]; // Feature ID switch (CSBKO) { - case CSBKO_BSDWNACT: + case CSBKO::BSDWNACT: return decode(new CSBK_BSDWNACT(), data); - case CSBKO_UU_V_REQ: + case CSBKO::UU_V_REQ: return decode(new CSBK_UU_V_REQ(), data); - case CSBKO_UU_ANS_RSP: + case CSBKO::UU_ANS_RSP: return decode(new CSBK_UU_ANS_RSP(), data); - case CSBKO_PRECCSBK: + case CSBKO::PRECCSBK: return decode(new CSBK_PRECCSBK(), data); - case CSBKO_RAND: // CSBKO_CALL_ALRT when FID == FID_DMRA + case CSBKO::RAND: // CSBKO::CALL_ALRT when FID == FID_DMRA switch (FID) { case FID_DMRA: @@ -104,17 +111,17 @@ std::unique_ptr CSBKFactory::createCSBK(const uint8_t* data, uint8_t dataT default: return decode(new CSBK_RAND(), data); } - case CSBKO_EXT_FNCT: + case CSBKO::EXT_FNCT: return decode(new CSBK_EXT_FNCT(), data); - case CSBKO_NACK_RSP: + case CSBKO::NACK_RSP: return decode(new CSBK_NACK_RSP(), data); /** Tier 3 */ - case CSBKO_ACK_RSP: + case CSBKO::ACK_RSP: return decode(new CSBK_ACK_RSP(), data); - case CSBKO_BROADCAST: + case CSBKO::BROADCAST: return decode(new CSBK_BROADCAST(), data); - case CSBKO_MAINT: + case CSBKO::MAINT: return decode(new CSBK_MAINT(), data); default: diff --git a/src/common/dmr/lc/csbk/CSBKFactory.h b/src/common/dmr/lc/csbk/CSBKFactory.h index 6de441f2..56e389d1 100644 --- a/src/common/dmr/lc/csbk/CSBKFactory.h +++ b/src/common/dmr/lc/csbk/CSBKFactory.h @@ -7,7 +7,7 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #if !defined(__DMR_LC__CSBK_FACTORY_H__) @@ -15,6 +15,7 @@ #include "common/Defines.h" +#include "common/dmr/DMRDefines.h" #include "common/dmr/lc/CSBK.h" #include "common/dmr/lc/csbk/CSBK_ACK_RSP.h" #include "common/dmr/lc/csbk/CSBK_ALOHA.h" @@ -55,7 +56,7 @@ namespace dmr ~CSBKFactory(); /// Create an instance of a CSBK. - static std::unique_ptr createCSBK(const uint8_t* data, uint8_t dataType); + static std::unique_ptr createCSBK(const uint8_t* data, defines::DataType::E dataType); private: /// diff --git a/src/common/dmr/lc/csbk/CSBK_ACK_RSP.cpp b/src/common/dmr/lc/csbk/CSBK_ACK_RSP.cpp index ed484fed..cca73e90 100644 --- a/src/common/dmr/lc/csbk/CSBK_ACK_RSP.cpp +++ b/src/common/dmr/lc/csbk/CSBK_ACK_RSP.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "dmr/lc/csbk/CSBK_ACK_RSP.h" -using namespace dmr::lc::csbk; -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; +using namespace dmr::lc::csbk; #include @@ -28,7 +29,7 @@ using namespace dmr; /// CSBK_ACK_RSP::CSBK_ACK_RSP() : CSBK() { - m_CSBKO = CSBKO_ACK_RSP; + m_CSBKO = CSBKO::ACK_RSP; } /// @@ -67,7 +68,7 @@ void CSBK_ACK_RSP::encode(uint8_t* data) ulong64_t csbkValue = 0U; - if (m_reason == TS_ACK_RSN_REG) { + if (m_reason == ReasonCode::TS_ACK_RSN_REG) { csbkValue = 0U; } else { csbkValue = (m_GI ? 0x40U : 0x00U) + // Source Type @@ -88,5 +89,5 @@ void CSBK_ACK_RSP::encode(uint8_t* data) /// std::string CSBK_ACK_RSP::toString() { - return std::string("CSBKO_ACK_RSP (Acknowledge Response)"); + return std::string("CSBKO, ACK_RSP (Acknowledge Response)"); } diff --git a/src/common/dmr/lc/csbk/CSBK_ALOHA.cpp b/src/common/dmr/lc/csbk/CSBK_ALOHA.cpp index b1849002..4e872cd3 100644 --- a/src/common/dmr/lc/csbk/CSBK_ALOHA.cpp +++ b/src/common/dmr/lc/csbk/CSBK_ALOHA.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "dmr/lc/csbk/CSBK_ALOHA.h" -using namespace dmr::lc::csbk; -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; +using namespace dmr::lc::csbk; #include @@ -32,7 +33,7 @@ CSBK_ALOHA::CSBK_ALOHA() : CSBK(), m_backoffNo(1U), m_nRandWait(DEFAULT_NRAND_WAIT) { - m_CSBKO = CSBKO_ALOHA; + m_CSBKO = CSBKO::ALOHA; } /// @@ -82,7 +83,7 @@ void CSBK_ALOHA::encode(uint8_t* data) /// std::string CSBK_ALOHA::toString() { - return std::string("CSBKO_ALOHA (Aloha PDU)"); + return std::string("CSBKO, ALOHA (Aloha PDU)"); } // --------------------------------------------------------------------------- diff --git a/src/common/dmr/lc/csbk/CSBK_BROADCAST.cpp b/src/common/dmr/lc/csbk/CSBK_BROADCAST.cpp index 63ff59bf..18482ca5 100644 --- a/src/common/dmr/lc/csbk/CSBK_BROADCAST.cpp +++ b/src/common/dmr/lc/csbk/CSBK_BROADCAST.cpp @@ -13,9 +13,10 @@ #include "Defines.h" #include "dmr/lc/csbk/CSBK_BROADCAST.h" -using namespace dmr::lc::csbk; -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; +using namespace dmr::lc::csbk; #include @@ -27,7 +28,7 @@ using namespace dmr; /// Initializes a new instance of the CSBK_BROADCAST class. /// CSBK_BROADCAST::CSBK_BROADCAST() : CSBK(), - m_anncType(BCAST_ANNC_SITE_PARMS), + m_anncType(BroadcastAnncType::SITE_PARMS), m_hibernating(false), m_annWdCh1(false), m_annWdCh2(false), @@ -35,7 +36,7 @@ CSBK_BROADCAST::CSBK_BROADCAST() : CSBK(), m_systemId(0U), m_backoffNo(1U) { - m_CSBKO = CSBKO_BROADCAST; + m_CSBKO = CSBKO::BROADCAST; } /// @@ -60,7 +61,7 @@ bool CSBK_BROADCAST::decode(const uint8_t* data) switch (m_anncType) { - case BCAST_ANNC_ANN_WD_TSCC: + case BroadcastAnncType::ANN_WD_TSCC: // Broadcast Params 1 m_colorCode = (uint8_t)((csbkValue >> 51) & 0x0FU); // Color Code 1 m_annWdCh1 = ((csbkValue >> 44) & 0x04U) == 0x04U; // Announce/Withdraw Channel 1 @@ -95,7 +96,7 @@ void CSBK_BROADCAST::encode(uint8_t* data) switch (m_anncType) { - case BCAST_ANNC_ANN_WD_TSCC: + case BroadcastAnncType::ANN_WD_TSCC: // Broadcast Params 1 csbkValue = (csbkValue << 4) + 0U; // Reserved csbkValue = (csbkValue << 4) + (m_colorCode & 0x0FU); // Color Code 1 @@ -111,7 +112,7 @@ void CSBK_BROADCAST::encode(uint8_t* data) csbkValue = (csbkValue << 12) + (m_logicalCh1 & 0xFFFU); // Logical Channel 1 csbkValue = (csbkValue << 12) + (m_logicalCh2 & 0xFFFU); // Logical Channel 2 break; - case BCAST_ANNC_CHAN_FREQ: + case BroadcastAnncType::CHAN_FREQ: { uint32_t calcSpace = (uint32_t)(m_siteIdenEntry.chSpaceKhz() / 0.125); float calcTxOffset = m_siteIdenEntry.txOffsetMhz() * 1000000; @@ -148,7 +149,7 @@ void CSBK_BROADCAST::encode(uint8_t* data) csbkValue = (csbkValue << 13) + (rxFreqKhz & 0x3FFFU); // Receive Freq Khz } break; - case BCAST_ANNC_SITE_PARMS: + case BroadcastAnncType::SITE_PARMS: // Broadcast Params 1 csbkValue = (csbkValue << 14) + m_siteData.systemIdentity(true); // Site Identity (Broadcast Params 1) @@ -174,10 +175,10 @@ void CSBK_BROADCAST::encode(uint8_t* data) std::string CSBK_BROADCAST::toString() { switch (m_anncType) { - case BCAST_ANNC_ANN_WD_TSCC: return std::string("CSBKO_BROADCAST (Announcement PDU), BCAST_ANNC_ANN_WD_TSCC (Announce-WD TSCC Channel)"); - case BCAST_ANNC_CHAN_FREQ: return std::string("CSBKO_BROADCAST (Announcement PDU), BCAST_ANNC_CHAN_FREQ (Logical Channel/Frequency)"); - case BCAST_ANNC_SITE_PARMS: return std::string("CSBKO_BROADCAST (Announcement PDU), BCAST_ANNC_SITE_PARMS (General Site Parameters)"); - default: return std::string("CSBKO_BROADCAST (Announcement PDU)"); + case BroadcastAnncType::ANN_WD_TSCC: return std::string("CSBKO, BROADCAST (Announcement PDU), BroadcastAnncType::ANN_WD_TSCC (Announce-WD TSCC Channel)"); + case BroadcastAnncType::CHAN_FREQ: return std::string("CSBKO, BROADCAST (Announcement PDU), BroadcastAnncType::CHAN_FREQ (Logical Channel/Frequency)"); + case BroadcastAnncType::SITE_PARMS: return std::string("CSBKO, BROADCAST (Announcement PDU), BroadcastAnncType::SITE_PARMS (General Site Parameters)"); + default: return std::string("CSBKO, BROADCAST (Announcement PDU)"); } } diff --git a/src/common/dmr/lc/csbk/CSBK_BSDWNACT.cpp b/src/common/dmr/lc/csbk/CSBK_BSDWNACT.cpp index 9a2d2789..88a18058 100644 --- a/src/common/dmr/lc/csbk/CSBK_BSDWNACT.cpp +++ b/src/common/dmr/lc/csbk/CSBK_BSDWNACT.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "dmr/lc/csbk/CSBK_BSDWNACT.h" -using namespace dmr::lc::csbk; -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; +using namespace dmr::lc::csbk; #include @@ -29,7 +30,7 @@ using namespace dmr; CSBK_BSDWNACT::CSBK_BSDWNACT() : CSBK(), m_bsId(0U) { - m_CSBKO = CSBKO_BSDWNACT; + m_CSBKO = CSBKO::BSDWNACT; } /// @@ -73,7 +74,7 @@ void CSBK_BSDWNACT::encode(uint8_t* data) /// std::string CSBK_BSDWNACT::toString() { - return std::string("CSBKO_BSDWNACT (BS Outbound Activation)"); + return std::string("CSBKO, BSDWNACT (BS Outbound Activation)"); } // --------------------------------------------------------------------------- diff --git a/src/common/dmr/lc/csbk/CSBK_CALL_ALRT.cpp b/src/common/dmr/lc/csbk/CSBK_CALL_ALRT.cpp index cc054f20..1c9ec91d 100644 --- a/src/common/dmr/lc/csbk/CSBK_CALL_ALRT.cpp +++ b/src/common/dmr/lc/csbk/CSBK_CALL_ALRT.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "dmr/lc/csbk/CSBK_CALL_ALRT.h" -using namespace dmr::lc::csbk; -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; +using namespace dmr::lc::csbk; #include @@ -28,7 +29,7 @@ using namespace dmr; /// CSBK_CALL_ALRT::CSBK_CALL_ALRT() : CSBK() { - m_CSBKO = CSBKO_RAND; + m_CSBKO = CSBKO::RAND; m_FID = FID_DMRA; } @@ -81,5 +82,5 @@ void CSBK_CALL_ALRT::encode(uint8_t* data) /// std::string CSBK_CALL_ALRT::toString() { - return std::string("CSBKO_RAND (Call Alert)"); + return std::string("CSBKO, RAND (Call Alert)"); } diff --git a/src/common/dmr/lc/csbk/CSBK_EXT_FNCT.cpp b/src/common/dmr/lc/csbk/CSBK_EXT_FNCT.cpp index dd29efef..293fa79d 100644 --- a/src/common/dmr/lc/csbk/CSBK_EXT_FNCT.cpp +++ b/src/common/dmr/lc/csbk/CSBK_EXT_FNCT.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "dmr/lc/csbk/CSBK_EXT_FNCT.h" -using namespace dmr::lc::csbk; -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; +using namespace dmr::lc::csbk; #include @@ -27,9 +28,9 @@ using namespace dmr; /// Initializes a new instance of the CSBK_EXT_FNCT class. /// CSBK_EXT_FNCT::CSBK_EXT_FNCT() : CSBK(), - m_extendedFunction(DMR_EXT_FNCT_CHECK) + m_extendedFunction(ExtendedFunctions::CHECK) { - m_CSBKO = CSBKO_EXT_FNCT; + m_CSBKO = CSBKO::EXT_FNCT; m_FID = FID_DMRA; } @@ -86,7 +87,7 @@ void CSBK_EXT_FNCT::encode(uint8_t* data) /// std::string CSBK_EXT_FNCT::toString() { - return std::string("CSBKO_EXT_FNCT (Extended Function)"); + return std::string("CSBKO, EXT_FNCT (Extended Function)"); } // --------------------------------------------------------------------------- diff --git a/src/common/dmr/lc/csbk/CSBK_MAINT.cpp b/src/common/dmr/lc/csbk/CSBK_MAINT.cpp index f1da92b5..a0612ad8 100644 --- a/src/common/dmr/lc/csbk/CSBK_MAINT.cpp +++ b/src/common/dmr/lc/csbk/CSBK_MAINT.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2023 Bryan Biedenkapp, N2PLL +* Copyright (C) 2023,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "dmr/lc/csbk/CSBK_MAINT.h" -using namespace dmr::lc::csbk; -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; +using namespace dmr::lc::csbk; #include @@ -29,7 +30,7 @@ using namespace dmr; CSBK_MAINT::CSBK_MAINT() : CSBK(), m_maintKind(0U) { - m_CSBKO = CSBKO_MAINT; + m_CSBKO = CSBKO::MAINT; } /// @@ -81,7 +82,7 @@ void CSBK_MAINT::encode(uint8_t* data) /// std::string CSBK_MAINT::toString() { - return std::string("CSBKO_MAINT (Call Maintainence)"); + return std::string("CSBKO, MAINT (Call Maintainence)"); } // --------------------------------------------------------------------------- diff --git a/src/common/dmr/lc/csbk/CSBK_NACK_RSP.cpp b/src/common/dmr/lc/csbk/CSBK_NACK_RSP.cpp index ea973c39..87c8febf 100644 --- a/src/common/dmr/lc/csbk/CSBK_NACK_RSP.cpp +++ b/src/common/dmr/lc/csbk/CSBK_NACK_RSP.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "dmr/lc/csbk/CSBK_NACK_RSP.h" -using namespace dmr::lc::csbk; -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; +using namespace dmr::lc::csbk; #include @@ -29,7 +30,7 @@ using namespace dmr; CSBK_NACK_RSP::CSBK_NACK_RSP() : CSBK(), m_serviceKind(0U) { - m_CSBKO = CSBKO_NACK_RSP; + m_CSBKO = CSBKO::NACK_RSP; } /// @@ -86,7 +87,7 @@ void CSBK_NACK_RSP::encode(uint8_t* data) /// std::string CSBK_NACK_RSP::toString() { - return std::string("CSBKO_NACK_RSP (Negative Acknowledgement Response)"); + return std::string("CSBKO, NACK_RSP (Negative Acknowledgement Response)"); } // --------------------------------------------------------------------------- diff --git a/src/common/dmr/lc/csbk/CSBK_PD_GRANT.cpp b/src/common/dmr/lc/csbk/CSBK_PD_GRANT.cpp index e40e3a63..34ea91a3 100644 --- a/src/common/dmr/lc/csbk/CSBK_PD_GRANT.cpp +++ b/src/common/dmr/lc/csbk/CSBK_PD_GRANT.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "dmr/lc/csbk/CSBK_PD_GRANT.h" -using namespace dmr::lc::csbk; -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; +using namespace dmr::lc::csbk; #include @@ -28,7 +29,7 @@ using namespace dmr; /// CSBK_PD_GRANT::CSBK_PD_GRANT() : CSBK() { - m_CSBKO = CSBKO_PD_GRANT; + m_CSBKO = CSBKO::PD_GRANT; } /// @@ -73,5 +74,5 @@ void CSBK_PD_GRANT::encode(uint8_t* data) /// std::string CSBK_PD_GRANT::toString() { - return std::string("CSBKO_PD_GRANT (Private Data Channel Grant)"); + return std::string("CSBKO, PD_GRANT (Private Data Channel Grant)"); } diff --git a/src/common/dmr/lc/csbk/CSBK_PRECCSBK.cpp b/src/common/dmr/lc/csbk/CSBK_PRECCSBK.cpp index 26dd6327..678865a5 100644 --- a/src/common/dmr/lc/csbk/CSBK_PRECCSBK.cpp +++ b/src/common/dmr/lc/csbk/CSBK_PRECCSBK.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "dmr/lc/csbk/CSBK_PRECCSBK.h" -using namespace dmr::lc::csbk; -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; +using namespace dmr::lc::csbk; #include @@ -28,7 +29,7 @@ using namespace dmr; /// CSBK_PRECCSBK::CSBK_PRECCSBK() : CSBK() { - m_CSBKO = CSBKO_PRECCSBK; + m_CSBKO = CSBKO::PRECCSBK; } /// @@ -75,5 +76,5 @@ void CSBK_PRECCSBK::encode(uint8_t* data) /// std::string CSBK_PRECCSBK::toString() { - return std::string("CSBKO_PRECCSBK (Preamble CSBK)"); + return std::string("CSBKO, PRECCSBK (Preamble CSBK)"); } diff --git a/src/common/dmr/lc/csbk/CSBK_PV_GRANT.cpp b/src/common/dmr/lc/csbk/CSBK_PV_GRANT.cpp index 8587e56f..7f65794b 100644 --- a/src/common/dmr/lc/csbk/CSBK_PV_GRANT.cpp +++ b/src/common/dmr/lc/csbk/CSBK_PV_GRANT.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "dmr/lc/csbk/CSBK_PV_GRANT.h" -using namespace dmr::lc::csbk; -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; +using namespace dmr::lc::csbk; #include @@ -28,7 +29,7 @@ using namespace dmr; /// CSBK_PV_GRANT::CSBK_PV_GRANT() : CSBK() { - m_CSBKO = CSBKO_PV_GRANT; + m_CSBKO = CSBKO::PV_GRANT; } /// @@ -73,5 +74,5 @@ void CSBK_PV_GRANT::encode(uint8_t* data) /// std::string CSBK_PV_GRANT::toString() { - return std::string("CSBKO_PV_GRANT (Private Voice Channel Grant)"); + return std::string("CSBKO, PV_GRANT (Private Voice Channel Grant)"); } diff --git a/src/common/dmr/lc/csbk/CSBK_P_CLEAR.cpp b/src/common/dmr/lc/csbk/CSBK_P_CLEAR.cpp index 90bfcbf2..349953f1 100644 --- a/src/common/dmr/lc/csbk/CSBK_P_CLEAR.cpp +++ b/src/common/dmr/lc/csbk/CSBK_P_CLEAR.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2023 Bryan Biedenkapp, N2PLL +* Copyright (C) 2023,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "dmr/lc/csbk/CSBK_P_CLEAR.h" -using namespace dmr::lc::csbk; -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; +using namespace dmr::lc::csbk; #include @@ -28,7 +29,7 @@ using namespace dmr; /// CSBK_P_CLEAR::CSBK_P_CLEAR() : CSBK() { - m_CSBKO = CSBKO_P_CLEAR; + m_CSBKO = CSBKO::P_CLEAR; } /// @@ -72,5 +73,5 @@ void CSBK_P_CLEAR::encode(uint8_t* data) /// std::string CSBK_P_CLEAR::toString() { - return std::string("CSBKO_P_CLEAR (Payload Channel Clear)"); + return std::string("CSBKO, P_CLEAR (Payload Channel Clear)"); } diff --git a/src/common/dmr/lc/csbk/CSBK_P_GRANT.cpp b/src/common/dmr/lc/csbk/CSBK_P_GRANT.cpp index 8b7aab8e..cf63773a 100644 --- a/src/common/dmr/lc/csbk/CSBK_P_GRANT.cpp +++ b/src/common/dmr/lc/csbk/CSBK_P_GRANT.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2023 Bryan Biedenkapp, N2PLL +* Copyright (C) 2023,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "dmr/lc/csbk/CSBK_P_GRANT.h" -using namespace dmr::lc::csbk; -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; +using namespace dmr::lc::csbk; #include @@ -28,7 +29,7 @@ using namespace dmr; /// CSBK_P_GRANT::CSBK_P_GRANT() : CSBK() { - m_CSBKO = CSBKO_TV_GRANT; + m_CSBKO = CSBKO::TV_GRANT; } /// @@ -73,5 +74,5 @@ void CSBK_P_GRANT::encode(uint8_t* data) /// std::string CSBK_P_GRANT::toString() { - return std::string("CSBK_P_GRANT (Payload Grant)"); + return std::string("CSBKO, P_GRANT (Payload Grant)"); } diff --git a/src/common/dmr/lc/csbk/CSBK_RAND.cpp b/src/common/dmr/lc/csbk/CSBK_RAND.cpp index 8f4be67d..483dcb8f 100644 --- a/src/common/dmr/lc/csbk/CSBK_RAND.cpp +++ b/src/common/dmr/lc/csbk/CSBK_RAND.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "dmr/lc/csbk/CSBK_RAND.h" -using namespace dmr::lc::csbk; -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; +using namespace dmr::lc::csbk; #include @@ -31,7 +32,7 @@ CSBK_RAND::CSBK_RAND() : CSBK(), m_serviceExtra(0U), m_serviceKind(0U) { - m_CSBKO = CSBKO_RAND; + m_CSBKO = CSBKO::RAND; } /// @@ -90,20 +91,20 @@ void CSBK_RAND::encode(uint8_t* data) std::string CSBK_RAND::toString() { switch (m_serviceKind) { - case SVC_KIND_IND_VOICE_CALL: return std::string("CSBKO_RAND (Random Access), SVC_KIND_IND_VOICE_CALL (Individual Voice Call)"); - case SVC_KIND_GRP_VOICE_CALL: return std::string("CSBKO_RAND (Random Access), SVC_KIND_GRP_VOICE_CALL (Group Voice Call)"); - case SVC_KIND_IND_DATA_CALL: return std::string("CSBKO_RAND (Random Access), SVC_KIND_IND_DATA_CALL (Individual Data Call)"); - case SVC_KIND_GRP_DATA_CALL: return std::string("CSBKO_RAND (Random Access), SVC_KIND_GRP_DATA_CALL (Group Data Call)"); - case SVC_KIND_IND_UDT_DATA_CALL: return std::string("CSBKO_RAND (Random Access), SVC_KIND_IND_UDT_DATA_CALL (Individual UDT Short Data Call)"); - case SVC_KIND_GRP_UDT_DATA_CALL: return std::string("CSBKO_RAND (Random Access), SVC_KIND_GRP_UDT_DATA_CALL (Group UDT Short Data Call)"); - case SVC_KIND_UDT_SHORT_POLL: return std::string("CSBKO_RAND (Random Access), SVC_KIND_UDT_SHORT_POLL (UDT Short Data Polling Service)"); - case SVC_KIND_STATUS_TRANSPORT: return std::string("CSBKO_RAND (Random Access), SVC_KIND_STATUS_TRANSPORT (Status Transport Service)"); - case SVC_KIND_CALL_DIVERSION: return std::string("CSBKO_RAND (Random Access), SVC_KIND_CALL_DIVERSION (Call Diversion Service)"); - case SVC_KIND_CALL_ANSWER: return std::string("CSBKO_RAND (Random Access), SVC_KIND_CALL_ANSWER (Call Answer Service)"); - case SVC_KIND_SUPPLEMENTARY_SVC: return std::string("CSBKO_RAND (Random Access), SVC_KIND_SUPPLEMENTARY_SVC (Supplementary Service)"); - case SVC_KIND_REG_SVC: return std::string("CSBKO_RAND (Random Access), SVC_KIND_REG_SVC (Registration Service)"); - case SVC_KIND_CANCEL_CALL: return std::string("CSBKO_RAND (Random Access), SVC_KIND_CANCEL_CALL (Cancel Call Service)"); - default: return std::string("CSBKO_RAND (Random Access)"); + case ServiceKind::IND_VOICE_CALL: return std::string("CSBKO, RAND (Random Access), IND_VOICE_CALL (Individual Voice Call)"); + case ServiceKind::GRP_VOICE_CALL: return std::string("CSBKO, RAND (Random Access), GRP_VOICE_CALL (Group Voice Call)"); + case ServiceKind::IND_DATA_CALL: return std::string("CSBKO, RAND (Random Access), IND_DATA_CALL (Individual Data Call)"); + case ServiceKind::GRP_DATA_CALL: return std::string("CSBKO, RAND (Random Access), GRP_DATA_CALL (Group Data Call)"); + case ServiceKind::IND_UDT_DATA_CALL: return std::string("CSBKO, RAND (Random Access), IND_UDT_DATA_CALL (Individual UDT Short Data Call)"); + case ServiceKind::GRP_UDT_DATA_CALL: return std::string("CSBKO, RAND (Random Access), GRP_UDT_DATA_CALL (Group UDT Short Data Call)"); + case ServiceKind::UDT_SHORT_POLL: return std::string("CSBKO, RAND (Random Access), UDT_SHORT_POLL (UDT Short Data Polling Service)"); + case ServiceKind::STATUS_TRANSPORT: return std::string("CSBKO, RAND (Random Access), STATUS_TRANSPORT (Status Transport Service)"); + case ServiceKind::CALL_DIVERSION: return std::string("CSBKO, RAND (Random Access), CALL_DIVERSION (Call Diversion Service)"); + case ServiceKind::CALL_ANSWER: return std::string("CSBKO, RAND (Random Access), CALL_ANSWER (Call Answer Service)"); + case ServiceKind::SUPPLEMENTARY_SVC: return std::string("CSBKO, RAND (Random Access), SUPPLEMENTARY_SVC (Supplementary Service)"); + case ServiceKind::REG_SVC: return std::string("CSBKO, RAND (Random Access), REG_SVC (Registration Service)"); + case ServiceKind::CANCEL_CALL: return std::string("CSBKO, RAND (Random Access), CANCEL_CALL (Cancel Call Service)"); + default: return std::string("CSBKO, RAND (Random Access)"); } } diff --git a/src/common/dmr/lc/csbk/CSBK_RAW.cpp b/src/common/dmr/lc/csbk/CSBK_RAW.cpp index 61cd039f..06ce2551 100644 --- a/src/common/dmr/lc/csbk/CSBK_RAW.cpp +++ b/src/common/dmr/lc/csbk/CSBK_RAW.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "dmr/lc/csbk/CSBK_RAW.h" -using namespace dmr::lc::csbk; -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; +using namespace dmr::lc::csbk; #include @@ -29,7 +30,7 @@ using namespace dmr; CSBK_RAW::CSBK_RAW() : CSBK(), m_csbk(nullptr) { - m_CSBKO = CSBKO_RAND; + m_CSBKO = CSBKO::RAND; } /// diff --git a/src/common/dmr/lc/csbk/CSBK_TD_GRANT.cpp b/src/common/dmr/lc/csbk/CSBK_TD_GRANT.cpp index 4c6e1d51..f3624eb5 100644 --- a/src/common/dmr/lc/csbk/CSBK_TD_GRANT.cpp +++ b/src/common/dmr/lc/csbk/CSBK_TD_GRANT.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "dmr/lc/csbk/CSBK_TD_GRANT.h" -using namespace dmr::lc::csbk; -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; +using namespace dmr::lc::csbk; #include @@ -28,7 +29,7 @@ using namespace dmr; /// CSBK_TD_GRANT::CSBK_TD_GRANT() : CSBK() { - m_CSBKO = CSBKO_TD_GRANT; + m_CSBKO = CSBKO::TD_GRANT; } /// @@ -73,5 +74,5 @@ void CSBK_TD_GRANT::encode(uint8_t* data) /// std::string CSBK_TD_GRANT::toString() { - return std::string("CSBKO_TD_GRANT (Talkgroup Data Channel Grant)"); + return std::string("CSBKO, TD_GRANT (Talkgroup Data Channel Grant)"); } diff --git a/src/common/dmr/lc/csbk/CSBK_TV_GRANT.cpp b/src/common/dmr/lc/csbk/CSBK_TV_GRANT.cpp index 6f39daa5..7aa35c4f 100644 --- a/src/common/dmr/lc/csbk/CSBK_TV_GRANT.cpp +++ b/src/common/dmr/lc/csbk/CSBK_TV_GRANT.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "dmr/lc/csbk/CSBK_TV_GRANT.h" -using namespace dmr::lc::csbk; -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; +using namespace dmr::lc::csbk; #include @@ -29,7 +30,7 @@ using namespace dmr; CSBK_TV_GRANT::CSBK_TV_GRANT() : CSBK(), m_lateEntry(false) { - m_CSBKO = CSBKO_TV_GRANT; + m_CSBKO = CSBKO::TV_GRANT; } /// @@ -74,7 +75,7 @@ void CSBK_TV_GRANT::encode(uint8_t* data) /// std::string CSBK_TV_GRANT::toString() { - return std::string("CSBKO_TV_GRANT (Talkgroup Voice Channel Grant)"); + return std::string("CSBKO, TV_GRANT (Talkgroup Voice Channel Grant)"); } // --------------------------------------------------------------------------- diff --git a/src/common/dmr/lc/csbk/CSBK_UU_ANS_RSP.cpp b/src/common/dmr/lc/csbk/CSBK_UU_ANS_RSP.cpp index d41d629c..69a56fe3 100644 --- a/src/common/dmr/lc/csbk/CSBK_UU_ANS_RSP.cpp +++ b/src/common/dmr/lc/csbk/CSBK_UU_ANS_RSP.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "dmr/lc/csbk/CSBK_UU_ANS_RSP.h" -using namespace dmr::lc::csbk; -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; +using namespace dmr::lc::csbk; #include @@ -28,7 +29,7 @@ using namespace dmr; /// CSBK_UU_ANS_RSP::CSBK_UU_ANS_RSP() : CSBK() { - m_CSBKO = CSBKO_UU_ANS_RSP; + m_CSBKO = CSBKO::UU_ANS_RSP; } /// @@ -72,5 +73,5 @@ void CSBK_UU_ANS_RSP::encode(uint8_t* data) /// std::string CSBK_UU_ANS_RSP::toString() { - return std::string("CSBKO_UU_ANS_RSP (Unit-to-Unit Answer Response)"); + return std::string("CSBKO, UU_ANS_RSP (Unit-to-Unit Answer Response)"); } diff --git a/src/common/dmr/lc/csbk/CSBK_UU_V_REQ.cpp b/src/common/dmr/lc/csbk/CSBK_UU_V_REQ.cpp index deef8932..6900253f 100644 --- a/src/common/dmr/lc/csbk/CSBK_UU_V_REQ.cpp +++ b/src/common/dmr/lc/csbk/CSBK_UU_V_REQ.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "dmr/lc/csbk/CSBK_UU_V_REQ.h" -using namespace dmr::lc::csbk; -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; +using namespace dmr::lc::csbk; #include @@ -28,7 +29,7 @@ using namespace dmr; /// CSBK_UU_V_REQ::CSBK_UU_V_REQ() : CSBK() { - m_CSBKO = CSBKO_UU_V_REQ; + m_CSBKO = CSBKO::UU_V_REQ; } /// @@ -72,5 +73,5 @@ void CSBK_UU_V_REQ::encode(uint8_t* data) /// std::string CSBK_UU_V_REQ::toString() { - return std::string("CSBKO_UU_V_REQ (Unit-to-Unit Voice Channel Request)"); + return std::string("CSBKO, UU_V_REQ (Unit-to-Unit Voice Channel Request)"); } diff --git a/src/common/lookups/RadioIdLookup.cpp b/src/common/lookups/RadioIdLookup.cpp index aee6961b..61ebb1d0 100644 --- a/src/common/lookups/RadioIdLookup.cpp +++ b/src/common/lookups/RadioIdLookup.cpp @@ -74,7 +74,7 @@ void RadioIdLookup::toggleEntry(uint32_t id, bool enabled) /// Alias for the radio ID void RadioIdLookup::addEntry(uint32_t id, bool enabled, const std::string& alias) { - if ((id == p25::P25_WUID_ALL) || (id == p25::P25_WUID_FNE)) { + if ((id == p25::defines::WUID_ALL) || (id == p25::defines::WUID_FNE)) { return; } @@ -121,7 +121,7 @@ RadioId RadioIdLookup::find(uint32_t id) { RadioId entry; - if ((id == p25::P25_WUID_ALL) || (id == p25::P25_WUID_FNE)) { + if ((id == p25::defines::WUID_ALL) || (id == p25::defines::WUID_FNE)) { return RadioId(true, false); } diff --git a/src/common/network/BaseNetwork.cpp b/src/common/network/BaseNetwork.cpp index 2aa8b9a6..aa7f9d69 100644 --- a/src/common/network/BaseNetwork.cpp +++ b/src/common/network/BaseNetwork.cpp @@ -14,6 +14,7 @@ */ #include "Defines.h" #include "common/dmr/DMRDefines.h" +#include "common/p25/P25Defines.h" #include "common/nxdn/NXDNDefines.h" #include "common/p25/dfsi/DFSIDefines.h" #include "common/p25/dfsi/LC.h" @@ -434,6 +435,7 @@ UInt8Array BaseNetwork::readDMR(bool& ret, uint32_t& frameLength) /// bool BaseNetwork::writeDMR(const dmr::data::Data& data, bool noSequence) { + using namespace dmr::defines; if (m_status != NET_STAT_RUNNING && m_status != NET_STAT_MST_RUNNING) return false; @@ -445,17 +447,17 @@ bool BaseNetwork::writeDMR(const dmr::data::Data& data, bool noSequence) if (slotNo == 2U && !m_slot2) return false; - uint8_t dataType = data.getDataType(); + DataType::E dataType = data.getDataType(); uint32_t slotIndex = slotNo - 1U; bool resetSeq = false; - if (dataType == dmr::DT_VOICE_LC_HEADER) { + if (dataType == DataType::VOICE_LC_HEADER) { resetSeq = true; m_dmrStreamId[slotIndex] = createStreamId(); } - if (dataType == dmr::DT_CSBK || dataType == dmr::DT_DATA_HEADER) { + if (dataType == DataType::CSBK || dataType == DataType::DATA_HEADER) { resetSeq = true; m_dmrStreamId[slotIndex] = createStreamId(); } @@ -467,7 +469,7 @@ bool BaseNetwork::writeDMR(const dmr::data::Data& data, bool noSequence) } uint16_t seq = pktSeq(resetSeq); - if (dataType == dmr::DT_TERMINATOR_WITH_LC) { + if (dataType == DataType::TERMINATOR_WITH_LC) { seq = RTP_END_OF_CALL_SEQ; } @@ -531,7 +533,7 @@ UInt8Array BaseNetwork::readP25(bool& ret, uint32_t& frameLength) /// /// /// -bool BaseNetwork::writeP25LDU1(const p25::lc::LC& control, const p25::data::LowSpeedData& lsd, const uint8_t* data, uint8_t frameType) +bool BaseNetwork::writeP25LDU1(const p25::lc::LC& control, const p25::data::LowSpeedData& lsd, const uint8_t* data, p25::defines::FrameType::E frameType) { if (m_status != NET_STAT_RUNNING && m_status != NET_STAT_MST_RUNNING) return false; @@ -724,6 +726,7 @@ UInt8Array BaseNetwork::readNXDN(bool& ret, uint32_t& frameLength) /// bool BaseNetwork::writeNXDN(const nxdn::lc::RTCH& lc, const uint8_t* data, const uint32_t len, bool noSequence) { + using namespace nxdn::defines; if (m_status != NET_STAT_RUNNING && m_status != NET_STAT_MST_RUNNING) return false; @@ -740,8 +743,8 @@ bool BaseNetwork::writeNXDN(const nxdn::lc::RTCH& lc, const uint8_t* data, const } uint16_t seq = pktSeq(resetSeq); - if (lc.getMessageType() == nxdn::RTCH_MESSAGE_TYPE_TX_REL || - lc.getMessageType() == nxdn::RTCH_MESSAGE_TYPE_TX_REL_EX) { + if (lc.getMessageType() == MessageType::RTCH_TX_REL || + lc.getMessageType() == MessageType::RTCH_TX_REL_EX) { seq = RTP_END_OF_CALL_SEQ; } @@ -797,6 +800,7 @@ uint16_t BaseNetwork::pktSeq(bool reset) /// UInt8Array BaseNetwork::createDMR_Message(uint32_t& length, const uint32_t streamId, const dmr::data::Data& data) { + using namespace dmr::defines; uint8_t* buffer = new uint8_t[DMR_PACKET_LENGTH + PACKET_PAD]; ::memset(buffer, 0x00U, DMR_PACKET_LENGTH + PACKET_PAD); @@ -821,14 +825,14 @@ UInt8Array BaseNetwork::createDMR_Message(uint32_t& length, const uint32_t strea buffer[15U] = slotNo == 1U ? 0x00U : 0x80U; // Slot Number - uint8_t flco = data.getFLCO(); - buffer[15U] |= flco == dmr::FLCO_GROUP ? 0x00U : 0x40U; // Group + FLCO::E flco = data.getFLCO(); + buffer[15U] |= flco == FLCO::GROUP ? 0x00U : 0x40U; // Group uint8_t dataType = data.getDataType(); - if (dataType == dmr::DT_VOICE_SYNC) { + if (dataType == DataType::VOICE_SYNC) { buffer[15U] |= 0x10U; } - else if (dataType == dmr::DT_VOICE) { + else if (dataType == DataType::VOICE) { buffer[15U] |= data.getN(); } else { @@ -858,9 +862,10 @@ UInt8Array BaseNetwork::createDMR_Message(uint32_t& length, const uint32_t strea /// /// /// -void BaseNetwork::createP25_MessageHdr(uint8_t* buffer, uint8_t duid, const p25::lc::LC& control, const p25::data::LowSpeedData& lsd, - uint8_t frameType) +void BaseNetwork::createP25_MessageHdr(uint8_t* buffer, p25::defines::DUID::E duid, const p25::lc::LC& control, const p25::data::LowSpeedData& lsd, + p25::defines::FrameType::E frameType) { + using namespace p25::defines; assert(buffer != nullptr); // construct P25 message header @@ -889,27 +894,27 @@ void BaseNetwork::createP25_MessageHdr(uint8_t* buffer, uint8_t duid, const p25: buffer[22U] = duid; // DUID - if (frameType != p25::P25_FT_TERMINATOR) { + if (frameType != FrameType::TERMINATOR) { buffer[180U] = frameType; // DVM Frame Type } // is this the first frame of a call? - if (frameType == p25::P25_FT_HDU_VALID) { + if (frameType == FrameType::HDU_VALID) { buffer[181U] = control.getAlgId(); // Algorithm ID uint32_t kid = control.getKId(); __SET_UINT16B(kid, buffer, 182U); // Key ID // copy MI data - uint8_t mi[p25::P25_MI_LENGTH_BYTES]; - ::memset(mi, 0x00U, p25::P25_MI_LENGTH_BYTES); + uint8_t mi[MI_LENGTH_BYTES]; + ::memset(mi, 0x00U, MI_LENGTH_BYTES); control.getMI(mi); if (m_debug) { - Utils::dump(1U, "P25 HDU MI written to network", mi, p25::P25_MI_LENGTH_BYTES); + Utils::dump(1U, "P25 HDU MI written to network", mi, MI_LENGTH_BYTES); } - for (uint8_t i = 0; i < p25::P25_MI_LENGTH_BYTES; i++) { + for (uint8_t i = 0; i < MI_LENGTH_BYTES; i++) { buffer[184U + i] = mi[i]; // Message Indicator } } @@ -925,8 +930,10 @@ void BaseNetwork::createP25_MessageHdr(uint8_t* buffer, uint8_t duid, const p25: /// /// UInt8Array BaseNetwork::createP25_LDU1Message(uint32_t& length, const p25::lc::LC& control, const p25::data::LowSpeedData& lsd, - const uint8_t* data, uint8_t frameType) + const uint8_t* data, p25::defines::FrameType::E frameType) { + using namespace p25::defines; + using namespace p25::dfsi::defines; assert(data != nullptr); p25::dfsi::LC dfsiLC = p25::dfsi::LC(control, lsd); @@ -935,56 +942,56 @@ UInt8Array BaseNetwork::createP25_LDU1Message(uint32_t& length, const p25::lc::L ::memset(buffer, 0x00U, P25_LDU1_PACKET_LENGTH + PACKET_PAD); // construct P25 message header - createP25_MessageHdr(buffer, p25::P25_DUID_LDU1, control, lsd, frameType); + createP25_MessageHdr(buffer, DUID::LDU1, control, lsd, frameType); // pack DFSI data uint32_t count = MSG_HDR_SIZE; - uint8_t imbe[p25::P25_RAW_IMBE_LENGTH_BYTES]; + uint8_t imbe[RAW_IMBE_LENGTH_BYTES]; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE1); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE1); m_audio.decode(data, imbe, 0U); dfsiLC.encodeLDU1(buffer + 24U, imbe); - count += p25::dfsi::P25_DFSI_LDU1_VOICE1_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE1_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE2); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE2); m_audio.decode(data, imbe, 1U); dfsiLC.encodeLDU1(buffer + 46U, imbe); - count += p25::dfsi::P25_DFSI_LDU1_VOICE2_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE2_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE3); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE3); m_audio.decode(data, imbe, 2U); dfsiLC.encodeLDU1(buffer + 60U, imbe); - count += p25::dfsi::P25_DFSI_LDU1_VOICE3_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE3_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE4); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE4); m_audio.decode(data, imbe, 3U); dfsiLC.encodeLDU1(buffer + 77U, imbe); - count += p25::dfsi::P25_DFSI_LDU1_VOICE4_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE4_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE5); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE5); m_audio.decode(data, imbe, 4U); dfsiLC.encodeLDU1(buffer + 94U, imbe); - count += p25::dfsi::P25_DFSI_LDU1_VOICE5_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE5_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE6); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE6); m_audio.decode(data, imbe, 5U); dfsiLC.encodeLDU1(buffer + 111U, imbe); - count += p25::dfsi::P25_DFSI_LDU1_VOICE6_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE6_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE7); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE7); m_audio.decode(data, imbe, 6U); dfsiLC.encodeLDU1(buffer + 128U, imbe); - count += p25::dfsi::P25_DFSI_LDU1_VOICE7_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE7_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE8); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE8); m_audio.decode(data, imbe, 7U); dfsiLC.encodeLDU1(buffer + 145U, imbe); - count += p25::dfsi::P25_DFSI_LDU1_VOICE8_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE8_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE9); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE9); m_audio.decode(data, imbe, 8U); dfsiLC.encodeLDU1(buffer + 162U, imbe); - count += p25::dfsi::P25_DFSI_LDU1_VOICE9_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE9_FRAME_LENGTH_BYTES; buffer[23U] = count; @@ -1006,6 +1013,8 @@ UInt8Array BaseNetwork::createP25_LDU1Message(uint32_t& length, const p25::lc::L UInt8Array BaseNetwork::createP25_LDU2Message(uint32_t& length, const p25::lc::LC& control, const p25::data::LowSpeedData& lsd, const uint8_t* data) { + using namespace p25::defines; + using namespace p25::dfsi::defines; assert(data != nullptr); p25::dfsi::LC dfsiLC = p25::dfsi::LC(control, lsd); @@ -1014,56 +1023,56 @@ UInt8Array BaseNetwork::createP25_LDU2Message(uint32_t& length, const p25::lc::L ::memset(buffer, 0x00U, P25_LDU2_PACKET_LENGTH + PACKET_PAD); // construct P25 message header - createP25_MessageHdr(buffer, p25::P25_DUID_LDU2, control, lsd, p25::P25_FT_DATA_UNIT); + createP25_MessageHdr(buffer, DUID::LDU2, control, lsd, FrameType::DATA_UNIT); // pack DFSI data uint32_t count = MSG_HDR_SIZE; - uint8_t imbe[p25::P25_RAW_IMBE_LENGTH_BYTES]; + uint8_t imbe[RAW_IMBE_LENGTH_BYTES]; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE10); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE10); m_audio.decode(data, imbe, 0U); dfsiLC.encodeLDU2(buffer + 24U, imbe); - count += p25::dfsi::P25_DFSI_LDU2_VOICE10_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE10_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE11); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE11); m_audio.decode(data, imbe, 1U); dfsiLC.encodeLDU2(buffer + 46U, imbe); - count += p25::dfsi::P25_DFSI_LDU2_VOICE11_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE11_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE12); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE12); m_audio.decode(data, imbe, 2U); dfsiLC.encodeLDU2(buffer + 60U, imbe); - count += p25::dfsi::P25_DFSI_LDU2_VOICE12_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE12_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE13); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE13); m_audio.decode(data, imbe, 3U); dfsiLC.encodeLDU2(buffer + 77U, imbe); - count += p25::dfsi::P25_DFSI_LDU2_VOICE13_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE13_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE14); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE14); m_audio.decode(data, imbe, 4U); dfsiLC.encodeLDU2(buffer + 94U, imbe); - count += p25::dfsi::P25_DFSI_LDU2_VOICE14_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE14_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE15); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE15); m_audio.decode(data, imbe, 5U); dfsiLC.encodeLDU2(buffer + 111U, imbe); - count += p25::dfsi::P25_DFSI_LDU2_VOICE15_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE15_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE16); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE16); m_audio.decode(data, imbe, 6U); dfsiLC.encodeLDU2(buffer + 128U, imbe); - count += p25::dfsi::P25_DFSI_LDU2_VOICE16_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE16_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE17); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE17); m_audio.decode(data, imbe, 7U); dfsiLC.encodeLDU2(buffer + 145U, imbe); - count += p25::dfsi::P25_DFSI_LDU2_VOICE17_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE17_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE18); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE18); m_audio.decode(data, imbe, 8U); dfsiLC.encodeLDU2(buffer + 162U, imbe); - count += p25::dfsi::P25_DFSI_LDU2_VOICE18_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE18_FRAME_LENGTH_BYTES; buffer[23U] = count; @@ -1084,11 +1093,12 @@ UInt8Array BaseNetwork::createP25_LDU2Message(uint32_t& length, const p25::lc::L /// UInt8Array BaseNetwork::createP25_TDUMessage(uint32_t& length, const p25::lc::LC& control, const p25::data::LowSpeedData& lsd, const uint8_t controlByte) { + using namespace p25::defines; uint8_t* buffer = new uint8_t[MSG_HDR_SIZE + PACKET_PAD]; ::memset(buffer, 0x00U, MSG_HDR_SIZE + PACKET_PAD); // construct P25 message header - createP25_MessageHdr(buffer, p25::P25_DUID_TDU, control, lsd, p25::P25_FT_TERMINATOR); + createP25_MessageHdr(buffer, DUID::TDU, control, lsd, FrameType::TERMINATOR); buffer[14U] = controlByte; buffer[23U] = MSG_HDR_SIZE; @@ -1109,6 +1119,7 @@ UInt8Array BaseNetwork::createP25_TDUMessage(uint32_t& length, const p25::lc::LC /// UInt8Array BaseNetwork::createP25_TSDUMessage(uint32_t& length, const p25::lc::LC& control, const uint8_t* data) { + using namespace p25::defines; assert(data != nullptr); uint8_t* buffer = new uint8_t[P25_TSDU_PACKET_LENGTH + PACKET_PAD]; @@ -1116,13 +1127,13 @@ UInt8Array BaseNetwork::createP25_TSDUMessage(uint32_t& length, const p25::lc::L // construct P25 message header p25::data::LowSpeedData lsd = p25::data::LowSpeedData(); - createP25_MessageHdr(buffer, p25::P25_DUID_TSDU, control, lsd, p25::P25_FT_TERMINATOR); + createP25_MessageHdr(buffer, DUID::TSDU, control, lsd, FrameType::TERMINATOR); // pack raw P25 TSDU bytes uint32_t count = MSG_HDR_SIZE; - ::memcpy(buffer + 24U, data, p25::P25_TSDU_FRAME_LENGTH_BYTES); - count += p25::P25_TSDU_FRAME_LENGTH_BYTES; + ::memcpy(buffer + 24U, data, P25_TSDU_FRAME_LENGTH_BYTES); + count += P25_TSDU_FRAME_LENGTH_BYTES; buffer[23U] = count; @@ -1145,6 +1156,7 @@ UInt8Array BaseNetwork::createP25_TSDUMessage(uint32_t& length, const p25::lc::L UInt8Array BaseNetwork::createP25_PDUMessage(uint32_t& length, const p25::data::DataHeader& header, const uint8_t currentBlock, const uint8_t* data, const uint32_t len) { + using namespace p25::defines; assert(data != nullptr); uint8_t* buffer = new uint8_t[DATA_PACKET_LENGTH]; @@ -1159,7 +1171,7 @@ UInt8Array BaseNetwork::createP25_PDUMessage(uint32_t& length, const p25::data:: ::memcpy(buffer + 0U, TAG_P25_DATA, 4U); buffer[4U] = header.getSAP(); // Service Access Point - if (header.getFormat() == p25::PDU_FMT_CONFIRMED) { + if (header.getFormat() == PDUFormatType::CONFIRMED) { buffer[4U] |= 0x80U; } @@ -1170,7 +1182,7 @@ UInt8Array BaseNetwork::createP25_PDUMessage(uint32_t& length, const p25::data:: buffer[20U] = header.getBlocksToFollow(); // Blocks To Follow buffer[21U] = currentBlock; // Current Block - buffer[22U] = p25::P25_DUID_PDU; // DUID + buffer[22U] = DUID::PDU; // DUID // pack raw P25 PDU bytes uint32_t count = MSG_HDR_SIZE; diff --git a/src/common/network/BaseNetwork.h b/src/common/network/BaseNetwork.h index 9ca7c9bf..4f1364e7 100644 --- a/src/common/network/BaseNetwork.h +++ b/src/common/network/BaseNetwork.h @@ -196,7 +196,7 @@ namespace network virtual UInt8Array readP25(bool& ret, uint32_t& frameLength); /// Writes P25 LDU1 frame data to the network. virtual bool writeP25LDU1(const p25::lc::LC& control, const p25::data::LowSpeedData& lsd, const uint8_t* data, - uint8_t frameType); + p25::defines::FrameType::E frameType); /// Writes P25 LDU2 frame data to the network. virtual bool writeP25LDU2(const p25::lc::LC& control, const p25::data::LowSpeedData& lsd, const uint8_t* data); /// Writes P25 TDU frame data to the network. @@ -269,12 +269,12 @@ namespace network UInt8Array createDMR_Message(uint32_t& length, const uint32_t streamId, const dmr::data::Data& data); /// Creates an P25 frame message header. - void createP25_MessageHdr(uint8_t* buffer, uint8_t duid, const p25::lc::LC& control, const p25::data::LowSpeedData& lsd, - uint8_t frameType = p25::P25_FT_DATA_UNIT); + void createP25_MessageHdr(uint8_t* buffer, p25::defines::DUID::E duid, const p25::lc::LC& control, const p25::data::LowSpeedData& lsd, + p25::defines::FrameType::E frameType = p25::defines::FrameType::DATA_UNIT); /// Creates an P25 LDU1 frame message. UInt8Array createP25_LDU1Message(uint32_t& length, const p25::lc::LC& control, const p25::data::LowSpeedData& lsd, - const uint8_t* data, uint8_t frameType); + const uint8_t* data, p25::defines::FrameType::E frameType); /// Creates an P25 LDU2 frame message. UInt8Array createP25_LDU2Message(uint32_t& length, const p25::lc::LC& control, const p25::data::LowSpeedData& lsd, const uint8_t* data); diff --git a/src/common/nxdn/NXDNDefines.h b/src/common/nxdn/NXDNDefines.h index f0fc42a9..e77f22c9 100644 --- a/src/common/nxdn/NXDNDefines.h +++ b/src/common/nxdn/NXDNDefines.h @@ -17,250 +17,363 @@ #include "common/Defines.h" +// Shorthand macro to nxdn::defines -- keeps source code that doesn't use "using" concise +#define NXDDEF nxdn::defines namespace nxdn { - // --------------------------------------------------------------------------- - // Constants - // --------------------------------------------------------------------------- - - const uint32_t NXDN_FRAME_LENGTH_BITS = 384U; - const uint32_t NXDN_FRAME_LENGTH_BYTES = NXDN_FRAME_LENGTH_BITS / 8U; - const uint32_t NXDN_FRAME_LENGTH_SYMBOLS = NXDN_FRAME_LENGTH_BITS / 2U; - - const uint32_t NXDN_FSW_LENGTH_BITS = 20U; - const uint32_t NXDN_FSW_LENGTH_SYMBOLS = NXDN_FSW_LENGTH_BITS / 2U; - - const uint8_t NXDN_FSW_BYTES[] = { 0xCDU, 0xF5U, 0x90U }; - const uint8_t NXDN_FSW_BYTES_MASK[] = { 0xFFU, 0xFFU, 0xF0U }; - const uint32_t NXDN_FSW_BYTES_LENGTH = 3U; - - const uint8_t NXDN_PREAMBLE[] = { 0x57U, 0x75U, 0xFDU }; - - const uint32_t NXDN_LICH_LENGTH_BITS = 16U; - const uint32_t NXDN_LICH_LENGTH_BYTES = NXDN_LICH_LENGTH_BITS / 8U; - - const uint32_t NXDN_SACCH_FEC_LENGTH_BITS = 60U; // Puncture and Interleave Length - const uint32_t NXDN_SACCH_FEC_LENGTH_BYTES = (NXDN_SACCH_FEC_LENGTH_BITS / 8U) + 1U; - const uint32_t NXDN_SACCH_FEC_CONV_LENGTH_BITS = 72U; // Convolution Length - const uint32_t NXDN_SACCH_FEC_CONV_LENGTH_BYTES = NXDN_SACCH_FEC_CONV_LENGTH_BITS / 8U; - const uint32_t NXDN_SACCH_CRC_LENGTH_BITS = 36U; // Data + CRC-6 + 4-bit NULL - const uint32_t NXDN_SACCH_CRC_LENGTH_BYTES = (NXDN_SACCH_CRC_LENGTH_BITS / 8U) + 1U; - const uint32_t NXDN_SACCH_LENGTH_BITS = 26U; - - const uint32_t NXDN_FACCH1_FEC_LENGTH_BITS = 144U; // Puncture and Interleave Length - const uint32_t NXDN_FACCH1_FEC_LENGTH_BYTES = NXDN_FACCH1_FEC_LENGTH_BITS / 8U; - const uint32_t NXDN_FACCH1_FEC_CONV_LENGTH_BITS = 192U; // Convolution Length - const uint32_t NXDN_FACCH1_FEC_CONV_LENGTH_BYTES = NXDN_FACCH1_FEC_CONV_LENGTH_BITS / 8U; - const uint32_t NXDN_FACCH1_CRC_LENGTH_BITS = 96U; // Data + CRC-12 + 4-bit NULL - const uint32_t NXDN_FACCH1_CRC_LENGTH_BYTES = NXDN_FACCH1_CRC_LENGTH_BITS / 8U; - const uint32_t NXDN_FACCH1_LENGTH_BITS = 80U; - - const uint32_t NXDN_UDCH_FEC_LENGTH_BITS = 348U; // Puncture and Interleave Length - const uint32_t NXDN_UDCH_FEC_LENGTH_BYTES = (NXDN_UDCH_FEC_LENGTH_BITS / 8U) + 1U; - const uint32_t NXDN_UDCH_FEC_CONV_LENGTH_BITS = 406U; // Convolution Length - const uint32_t NXDN_UDCH_FEC_CONV_LENGTH_BYTES = (NXDN_UDCH_FEC_CONV_LENGTH_BITS / 8U) + 1U; - const uint32_t NXDN_UDCH_CRC_LENGTH_BITS = 203U; // Data + CRC-15 + 4-bit NULL - const uint32_t NXDN_UDCH_CRC_LENGTH_BYTES = (NXDN_UDCH_CRC_LENGTH_BITS / 8U) + 1U; - const uint32_t NXDN_UDCH_LENGTH_BITS = 184U; - - const uint32_t NXDN_CAC_FEC_LENGTH_BITS = 300U; // Puncture and Interleave Length - const uint32_t NXDN_CAC_FEC_LENGTH_BYTES = (NXDN_CAC_FEC_LENGTH_BITS / 8U) + 1U; - const uint32_t NXDN_CAC_FEC_CONV_LENGTH_BITS = 350U; // Convolution Length - const uint32_t NXDN_CAC_FEC_CONV_LENGTH_BYTES = (NXDN_CAC_FEC_CONV_LENGTH_BITS / 8U) + 1U; - const uint32_t NXDN_CAC_CRC_LENGTH_BITS = 175U; // Data + CRC-16 + 4-bit NULL - const uint32_t NXDN_CAC_CRC_LENGTH_BYTES = (NXDN_CAC_CRC_LENGTH_BITS / 8U) + 1U; - const uint32_t NXDN_CAC_LENGTH_BITS = 155U; - const uint32_t NXDN_CAC_E_POST_FIELD_BITS = 24U; - - const uint32_t NXDN_CAC_IN_FEC_LENGTH_BITS = 252U; // Puncture and Interleave Length - const uint32_t NXDN_CAC_IN_FEC_LENGTH_BYTES = (NXDN_CAC_IN_FEC_LENGTH_BITS / 8U) + 1U; - const uint32_t NXDN_CAC_LONG_FEC_CONV_LENGTH_BITS = 312U; // Convolution Length - const uint32_t NXDN_CAC_LONG_FEC_CONV_LENGTH_BYTES = NXDN_CAC_LONG_FEC_CONV_LENGTH_BITS / 8U; - const uint32_t NXDN_CAC_LONG_CRC_LENGTH_BITS = 156U; // Data + CRC-16 + 4-bit NULL - const uint32_t NXDN_CAC_LONG_LENGTH_BITS = 136U; - const uint32_t NXDN_CAC_SHORT_CRC_LENGTH_BITS = 126U; // Data + CRC-16 + 4-bit NULL - const uint32_t NXDN_CAC_SHORT_LENGTH_BITS = 106U; - - const uint32_t NXDN_RTCH_LC_LENGTH_BITS = 176U; - const uint32_t NXDN_RTCH_LC_LENGTH_BYTES = (NXDN_RTCH_LC_LENGTH_BITS / 8U); - - const uint32_t NXDN_RCCH_LC_LENGTH_BITS = 144U; - const uint32_t NXDN_RCCH_LC_LENGTH_BYTES = (NXDN_RCCH_LC_LENGTH_BITS / 8U); - const uint32_t NXDN_RCCH_CAC_LC_LONG_LENGTH_BITS = 128U; - const uint32_t NXDN_RCCH_CAC_LC_SHORT_LENGTH_BITS = 96U; - - const uint32_t NXDN_FSW_LICH_SACCH_LENGTH_BITS = NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS; - const uint32_t NXDN_FSW_LICH_SACCH_LENGTH_BYTES = NXDN_FSW_LICH_SACCH_LENGTH_BITS / 8U; - - const uint8_t NXDN_LICH_RFCT_RCCH = 0U; - const uint8_t NXDN_LICH_RFCT_RTCH = 1U; - const uint8_t NXDN_LICH_RFCT_RDCH = 2U; - const uint8_t NXDN_LICH_RFCT_RTCH_C = 3U; - - const uint8_t NXDN_LICH_CAC_OUTBOUND = 0U; - const uint8_t NXDN_LICH_CAC_INBOUND_LONG = 1U; - const uint8_t NXDN_LICH_CAC_INBOUND_SHORT = 3U; - - const uint8_t NXDN_LICH_USC_SACCH_NS = 0U; - const uint8_t NXDN_LICH_USC_UDCH = 1U; - const uint8_t NXDN_LICH_USC_SACCH_SS = 2U; - const uint8_t NXDN_LICH_USC_SACCH_SS_IDLE = 3U; - - const uint8_t NXDN_LICH_DATA_NORMAL = 0U; - const uint8_t NXDN_LICH_DATA_IDLE = 1U; - const uint8_t NXDN_LICH_DATA_COMMON = 2U; - - const uint8_t NXDN_LICH_STEAL_NONE = 3U; - const uint8_t NXDN_LICH_STEAL_FACCH1_2 = 2U; - const uint8_t NXDN_LICH_STEAL_FACCH1_1 = 1U; - const uint8_t NXDN_LICH_STEAL_FACCH = 0U; - - const uint8_t NXDN_SR_RCCH_SINGLE = 0x00U; - const uint8_t NXDN_SR_RCCH_DUAL = 0x01U; - const uint8_t NXDN_SR_RCCH_HEAD_SINGLE = 0x02U; - const uint8_t NXDN_SR_RCCH_HEAD_DUAL = 0x03U; - - const uint8_t NXDN_SR_SINGLE = 0U; - const uint8_t NXDN_SR_4_4 = 0U; - const uint8_t NXDN_SR_3_4 = 1U; - const uint8_t NXDN_SR_2_4 = 2U; - const uint8_t NXDN_SR_1_4 = 3U; - - const uint8_t SACCH_IDLE[] = { 0x10U, 0x00U, 0x00U }; - - const uint32_t DEFAULT_SILENCE_THRESHOLD = 14U; - const uint32_t DEFAULT_FRAME_LOSS_THRESHOLD = 4U; - const uint32_t MAX_NXDN_VOICE_ERRORS = 144U; - const uint32_t MAX_NXDN_VOICE_ERRORS_STEAL = 94U; - - const uint8_t NXDN_NULL_AMBE[] = { 0xB1U, 0xA8U, 0x22U, 0x25U, 0x6BU, 0xD1U, 0x6CU, 0xCFU, 0x67U }; - - const uint8_t NXDN_CALLSIGN_LENGTH_BYTES = 8U; - - const uint32_t NXDN_MI_LENGTH_BYTES = 8U; - const uint32_t NXDN_PCKT_INFO_LENGTH_BYTES = 3U; - - const uint8_t NXDN_CIPHER_TYPE_NONE = 0x00U; - - const uint8_t DATA_RSP_CLASS_ACK = 0x00U; - const uint8_t DATA_RSP_CLASS_ACK_S = 0x01U; - const uint8_t DATA_RSP_CLASS_NACK = 0x03U; - - const uint8_t NXDN_LOC_CAT_GLOBAL = 0x00U; - const uint8_t NXDN_LOC_CAT_LOCAL = 0x01U; - const uint8_t NXDN_LOC_CAT_REGIONAL = 0x02U; - - const uint8_t NXDN_CAUSE_RSRC_NOT_AVAIL_NETWORK = 0x51U; - const uint8_t NXDN_CAUSE_RSRC_NOT_AVAIL_TEMP = 0x52U; - const uint8_t NXDN_CAUSE_RSRC_NOT_AVAIL_QUEUED = 0x53U; - const uint8_t NXDN_CAUSE_SVC_UNAVAILABLE = 0x06U; - const uint8_t NXDN_CAUSE_PROC_ERROR = 0x70U; - const uint8_t NXDN_CAUSE_PROC_ERROR_UNDEF = 0x71U; - - const uint8_t NXDN_CAUSE_MM_REG_ACCEPTED = 0x01U; - const uint8_t NXDN_CAUSE_MM_LOC_ACPT_GRP_FAIL = 0x04U; - const uint8_t NXDN_CAUSE_MM_LOC_ACPT_GRP_REFUSE = 0x04U; - const uint8_t NXDN_CAUSE_MM_REG_FAILED = 0x06U; - const uint8_t NXDN_CAUSE_MM_REG_REFUSED = 0x08U; - - const uint8_t NXDN_CAUSE_VD_ACCEPTED = 0x10U; - const uint8_t NXDN_CAUSE_VD_GRP_NOT_PERM = 0x11U; - const uint8_t NXDN_CAUSE_VD_REQ_UNIT_NOT_PERM = 0x12U; - const uint8_t NXDN_CAUSE_VD_TGT_UNIT_NOT_PERM = 0x13U; - const uint8_t NXDN_CAUSE_VD_REQ_UNIT_NOT_REG = 0x1CU; - const uint8_t NXDN_CAUSE_VD_QUE_CHN_RESOURCE_NOT_AVAIL = 0x30U; - const uint8_t NXDN_CAUSE_VD_QUE_TGT_UNIT_BUSY = 0x38U; - const uint8_t NXDN_CAUSE_VD_QUE_GRP_BUSY = 0x39U; - - const uint8_t NXDN_CAUSE_SS_ACK_R = 0x01U; - const uint8_t NXDN_CAUSE_SS_ACK_S = 0x02U; - const uint8_t NXDN_CAUSE_SS_NACK = 0x08U; - const uint8_t NXDN_CAUSE_SS_ACCEPTED = 0x10U; - const uint8_t NXDN_CAUSE_SS_GRP_NOT_PERM = 0x11U; - const uint8_t NXDN_CAUSE_SS_REQ_UNIT_NOT_PERM = 0x12U; - const uint8_t NXDN_CAUSE_SS_TGT_UNIT_NOT_PERM = 0x13U; - const uint8_t NXDN_CAUSE_SS_REQ_UNIT_NOT_REG = 0x1CU; - - const uint8_t NXDN_CAUSE_DREQ_USER = 0x10U; - const uint8_t NXDN_CAUSE_DREQ_OTHER = 0x1FU; - - const uint8_t NXDN_CAUSE_DISC_USER = 0x10U; - const uint8_t NXDN_CAUSE_DISC_OTHER = 0x1FU; - - const uint8_t NXDN_SIF1_DATA_CALL_SVC = 0x01U; - const uint8_t NXDN_SIF1_VOICE_CALL_SVC = 0x02U; - const uint8_t NXDN_SIF1_COMPOSITE_CONTROL = 0x04U; - const uint8_t NXDN_SIF1_AUTH_SVC = 0x08U; - const uint8_t NXDN_SIF1_GRP_REG_SVC = 0x10U; - const uint8_t NXDN_SIF1_LOC_REG_SVC = 0x20U; - const uint8_t NXDN_SIF1_MULTI_SYSTEM_SVC = 0x40U; - const uint8_t NXDN_SIF1_MULTI_SITE_SVC = 0x80U; - - const uint8_t NXDN_SIF2_IP_NETWORK = 0x10U; - const uint8_t NXDN_SIF2_PSTN_NETWORK = 0x20U; - const uint8_t NXDN_SIF2_STATUS_CALL_REM_CTRL = 0x40U; - const uint8_t NXDN_SIF2_SHORT_DATA_CALL_SVC = 0x80U; - - const uint8_t NXDN_CH_ACCESS_STEP_SYS_DEFINED = 0x00U; - const uint8_t NXDN_CH_ACCESS_STEP_1DOT25K = 0x02U; - const uint8_t NXDN_CH_ACCESS_STEP_3DOT125K = 0x03U; - - const uint8_t NXDN_CH_ACCESS_BASE_FREQ_100 = 0x01U; - const uint8_t NXDN_CH_ACCESS_BASE_FREQ_330 = 0x02U; - const uint8_t NXDN_CH_ACCESS_BASE_FREQ_400 = 0x03U; - const uint8_t NXDN_CH_ACCESS_BASE_FREQ_750 = 0x04U; - const uint8_t NXDN_CH_ACCESS_BASE_FREQ_SYS_DEFINED = 0x07U; - - // Common Message Types - const uint8_t MESSAGE_TYPE_IDLE = 0x10U; // IDLE - Idle - const uint8_t MESSAGE_TYPE_DISC = 0x11U; // DISC - Disconnect - const uint8_t MESSAGE_TYPE_DST_ID_INFO = 0x17U; // DST_ID_INFO - Digital Station ID - const uint8_t MESSAGE_TYPE_SRV_INFO = 0x19U; // SRV_INFO - Service Information - const uint8_t MESSAGE_TYPE_CCH_INFO = 0x1AU; // CCH_INFO - Control Channel Information - const uint8_t MESSAGE_TYPE_ADJ_SITE_INFO = 0x1BU; // ADJ_SITE_INFO - Adjacent Site Information - - // Traffic Channel Message Types - const uint8_t RTCH_MESSAGE_TYPE_VCALL = 0x01U; // VCALL - Voice Call -#define NXDN_RTCH_MSG_TYPE_VCALL "VCALL (Voice Call)" -#define NXDN_RTCH_MSG_TYPE_VCALL_RESP "VCALL_RESP (Voice Call Response)" - const uint8_t RTCH_MESSAGE_TYPE_VCALL_IV = 0x03U; // VCALL_IV - Voice Call Initialization Vector - const uint8_t RTCH_MESSAGE_TYPE_TX_REL_EX = 0x07U; // TX_REL_EX - Transmission Release Extension - const uint8_t RTCH_MESSAGE_TYPE_TX_REL = 0x08U; // TX_REL - Transmission Release -#define NXDN_RTCH_MSG_TYPE_TX_REL "TX_REL (Transmission Release)" - const uint8_t RTCH_MESSAGE_TYPE_DCALL_HDR = 0x09U; // DCALL - Data Call (Header) -#define NXDN_RTCH_MSG_TYPE_DCALL_HDR "DCALL (Data Call Header)" - const uint8_t RTCH_MESSAGE_TYPE_DCALL_DATA = 0x0BU; // DCALL - Data Call (User Data Format) - const uint8_t RTCH_MESSAGE_TYPE_DCALL_ACK = 0x0CU; // DCALL_ACK - Data Call Acknowledge - const uint8_t RTCH_MESSAGE_TYPE_HEAD_DLY = 0x0FU; // HEAD_DLY - Header Delay - const uint8_t RTCH_MESSAGE_TYPE_SDCALL_REQ_HDR = 0x38U; // SDCALL_REQ - Short Data Call Request (Header) - const uint8_t RTCH_MESSAGE_TYPE_SDCALL_REQ_DATA = 0x39U; // SDCALL_REQ - Short Data Call Request (User Data Format) - const uint8_t RTCH_MESSAGE_TYPE_SDCALL_IV = 0x3AU; // SDCALL_IV - Short Data Call Initialization Vector - const uint8_t RTCH_MESSAGE_TYPE_SDCALL_RESP = 0x3BU; // SDCALL_RESP - Short Data Call Response - - // Control Channel Message Types - const uint8_t RCCH_MESSAGE_TYPE_VCALL_CONN = 0x03U; // VCALL_CONN - Voice Call Connection Request (ISP) / Voice Call Connection Response (OSP) - const uint8_t RCCH_MESSAGE_TYPE_VCALL_ASSGN = 0x04U; // VCALL_ASSGN - Voice Call Assignment - const uint8_t RCCH_MESSAGE_TYPE_DCALL_ASSGN = 0x14U; // DCALL_ASSGN - Data Call Assignment - const uint8_t RCCH_MESSAGE_TYPE_SITE_INFO = 0x18U; // SITE_INFO - Site Information - const uint8_t RCCH_MESSAGE_TYPE_REG = 0x20U; // REG - Registration Request (ISP) / Registration Response (OSP) - const uint8_t RCCH_MESSAGE_TYPE_REG_C = 0x22U; // REG_C - Registration Clear Request (ISP) / Registration Clear Response (OSP) - const uint8_t RCCH_MESSAGE_TYPE_REG_COMM = 0x23U; // REG_COMM - Registration Command - const uint8_t RCCH_MESSAGE_TYPE_GRP_REG = 0x24U; // GRP_REG - Group Registration Request (ISP) / Group Registration Response (OSP) - const uint8_t RCCH_MESSAGE_TYPE_PROP_FORM = 0x3FU; // PROP_FORM - Proprietary Form - - // Call Types - const uint8_t CALL_TYPE_BROADCAST = 0x00U; - const uint8_t CALL_TYPE_CONFERENCE = 0x01U; - const uint8_t CALL_TYPE_UNSPECIFIED = 0x02U; - const uint8_t CALL_TYPE_INDIVIDUAL = 0x04U; - const uint8_t CALL_TYPE_INTERCONNECT = 0x06U; - const uint8_t CALL_TYPE_SPEED_DIAL = 0x07U; - - // Transmission Mode - const uint8_t TRANSMISSION_MODE_4800 = 0x00U; - const uint8_t TRANSMISSION_MODE_9600 = 0x02U; - const uint8_t TRANSMISSION_MODE_9600_EFR = 0x03U; // should never be used on data calls - + namespace defines + { + // --------------------------------------------------------------------------- + // Constants + // --------------------------------------------------------------------------- + + const uint32_t NXDN_FRAME_LENGTH_BITS = 384U; + const uint32_t NXDN_FRAME_LENGTH_BYTES = NXDN_FRAME_LENGTH_BITS / 8U; + const uint32_t NXDN_FRAME_LENGTH_SYMBOLS = NXDN_FRAME_LENGTH_BITS / 2U; + + const uint32_t NXDN_FSW_LENGTH_BITS = 20U; + const uint32_t NXDN_FSW_LENGTH_SYMBOLS = NXDN_FSW_LENGTH_BITS / 2U; + + const uint8_t NXDN_FSW_BYTES[] = { 0xCDU, 0xF5U, 0x90U }; + const uint8_t NXDN_FSW_BYTES_MASK[] = { 0xFFU, 0xFFU, 0xF0U }; + const uint32_t NXDN_FSW_BYTES_LENGTH = 3U; + + const uint8_t NXDN_PREAMBLE[] = { 0x57U, 0x75U, 0xFDU }; + + const uint32_t NXDN_LICH_LENGTH_BITS = 16U; + const uint32_t NXDN_LICH_LENGTH_BYTES = NXDN_LICH_LENGTH_BITS / 8U; + + const uint32_t NXDN_SACCH_FEC_LENGTH_BITS = 60U; // Puncture and Interleave Length + const uint32_t NXDN_SACCH_FEC_LENGTH_BYTES = (NXDN_SACCH_FEC_LENGTH_BITS / 8U) + 1U; + const uint32_t NXDN_SACCH_FEC_CONV_LENGTH_BITS = 72U; // Convolution Length + const uint32_t NXDN_SACCH_FEC_CONV_LENGTH_BYTES = NXDN_SACCH_FEC_CONV_LENGTH_BITS / 8U; + const uint32_t NXDN_SACCH_CRC_LENGTH_BITS = 36U; // Data + CRC-6 + 4-bit NULL + const uint32_t NXDN_SACCH_CRC_LENGTH_BYTES = (NXDN_SACCH_CRC_LENGTH_BITS / 8U) + 1U; + const uint32_t NXDN_SACCH_LENGTH_BITS = 26U; + + const uint32_t NXDN_FACCH1_FEC_LENGTH_BITS = 144U; // Puncture and Interleave Length + const uint32_t NXDN_FACCH1_FEC_LENGTH_BYTES = NXDN_FACCH1_FEC_LENGTH_BITS / 8U; + const uint32_t NXDN_FACCH1_FEC_CONV_LENGTH_BITS = 192U; // Convolution Length + const uint32_t NXDN_FACCH1_FEC_CONV_LENGTH_BYTES = NXDN_FACCH1_FEC_CONV_LENGTH_BITS / 8U; + const uint32_t NXDN_FACCH1_CRC_LENGTH_BITS = 96U; // Data + CRC-12 + 4-bit NULL + const uint32_t NXDN_FACCH1_CRC_LENGTH_BYTES = NXDN_FACCH1_CRC_LENGTH_BITS / 8U; + const uint32_t NXDN_FACCH1_LENGTH_BITS = 80U; + + const uint32_t NXDN_UDCH_FEC_LENGTH_BITS = 348U; // Puncture and Interleave Length + const uint32_t NXDN_UDCH_FEC_LENGTH_BYTES = (NXDN_UDCH_FEC_LENGTH_BITS / 8U) + 1U; + const uint32_t NXDN_UDCH_FEC_CONV_LENGTH_BITS = 406U; // Convolution Length + const uint32_t NXDN_UDCH_FEC_CONV_LENGTH_BYTES = (NXDN_UDCH_FEC_CONV_LENGTH_BITS / 8U) + 1U; + const uint32_t NXDN_UDCH_CRC_LENGTH_BITS = 203U; // Data + CRC-15 + 4-bit NULL + const uint32_t NXDN_UDCH_CRC_LENGTH_BYTES = (NXDN_UDCH_CRC_LENGTH_BITS / 8U) + 1U; + const uint32_t NXDN_UDCH_LENGTH_BITS = 184U; + + const uint32_t NXDN_CAC_FEC_LENGTH_BITS = 300U; // Puncture and Interleave Length + const uint32_t NXDN_CAC_FEC_LENGTH_BYTES = (NXDN_CAC_FEC_LENGTH_BITS / 8U) + 1U; + const uint32_t NXDN_CAC_FEC_CONV_LENGTH_BITS = 350U; // Convolution Length + const uint32_t NXDN_CAC_FEC_CONV_LENGTH_BYTES = (NXDN_CAC_FEC_CONV_LENGTH_BITS / 8U) + 1U; + const uint32_t NXDN_CAC_CRC_LENGTH_BITS = 175U; // Data + CRC-16 + 4-bit NULL + const uint32_t NXDN_CAC_CRC_LENGTH_BYTES = (NXDN_CAC_CRC_LENGTH_BITS / 8U) + 1U; + const uint32_t NXDN_CAC_LENGTH_BITS = 155U; + const uint32_t NXDN_CAC_E_POST_FIELD_BITS = 24U; + + const uint32_t NXDN_CAC_IN_FEC_LENGTH_BITS = 252U; // Puncture and Interleave Length + const uint32_t NXDN_CAC_IN_FEC_LENGTH_BYTES = (NXDN_CAC_IN_FEC_LENGTH_BITS / 8U) + 1U; + const uint32_t NXDN_CAC_LONG_FEC_CONV_LENGTH_BITS = 312U; // Convolution Length + const uint32_t NXDN_CAC_LONG_FEC_CONV_LENGTH_BYTES = NXDN_CAC_LONG_FEC_CONV_LENGTH_BITS / 8U; + const uint32_t NXDN_CAC_LONG_CRC_LENGTH_BITS = 156U; // Data + CRC-16 + 4-bit NULL + const uint32_t NXDN_CAC_LONG_LENGTH_BITS = 136U; + const uint32_t NXDN_CAC_SHORT_CRC_LENGTH_BITS = 126U; // Data + CRC-16 + 4-bit NULL + const uint32_t NXDN_CAC_SHORT_LENGTH_BITS = 106U; + + const uint32_t NXDN_RTCH_LC_LENGTH_BITS = 176U; + const uint32_t NXDN_RTCH_LC_LENGTH_BYTES = (NXDN_RTCH_LC_LENGTH_BITS / 8U); + + const uint32_t NXDN_RCCH_LC_LENGTH_BITS = 144U; + const uint32_t NXDN_RCCH_LC_LENGTH_BYTES = (NXDN_RCCH_LC_LENGTH_BITS / 8U); + const uint32_t NXDN_RCCH_CAC_LC_LONG_LENGTH_BITS = 128U; + const uint32_t NXDN_RCCH_CAC_LC_SHORT_LENGTH_BITS = 96U; + + const uint32_t NXDN_FSW_LICH_SACCH_LENGTH_BITS = NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS; + const uint32_t NXDN_FSW_LICH_SACCH_LENGTH_BYTES = NXDN_FSW_LICH_SACCH_LENGTH_BITS / 8U; + + const uint8_t SACCH_IDLE[] = { 0x10U, 0x00U, 0x00U }; + + const uint8_t NULL_AMBE[] = { 0xB1U, 0xA8U, 0x22U, 0x25U, 0x6BU, 0xD1U, 0x6CU, 0xCFU, 0x67U }; + + const uint8_t CALLSIGN_LENGTH_BYTES = 8U; + + const uint32_t MI_LENGTH_BYTES = 8U; + const uint32_t PCKT_INFO_LENGTH_BYTES = 3U; + + /** Thresholds */ + const uint32_t DEFAULT_SILENCE_THRESHOLD = 14U; + const uint32_t DEFAULT_FRAME_LOSS_THRESHOLD = 4U; + const uint32_t MAX_NXDN_VOICE_ERRORS = 144U; + const uint32_t MAX_NXDN_VOICE_ERRORS_STEAL = 94U; + + /// + /// Link Information Channel - RF Channel Type + /// + namespace RFChannelType { + // RF Channel Type Enumeration + enum E : uint8_t { + RCCH = 0U, // Control Channel + RTCH = 1U, // Traffic Channel + RDCH = 2U, // Data Channel + RTCH_C = 3U // Composite Control/Traffic Channel + }; + } + + /// + /// Link Information Channel - Functional Channel Type + /// + namespace FuncChannelType { + // Functional Channel Type Enumeration + enum E : uint8_t { + // Common Access Channel + CAC_OUTBOUND = 0U, // Common Access Channel - Outbound + CAC_INBOUND_LONG = 1U, // Common Access Channel - Inbound Long + CAC_INBOUND_SHORT = 3U, // Common Access Channel - Inbound Short + + // Slow Associated Control Channel / User Data Channel + USC_SACCH_NS = 0U, // + USC_UDCH = 1U, // + USC_SACCH_SS = 2U, // + USC_SACCH_SS_IDLE = 3U // + }; + } + + /// + /// Link Information Channel - Channel Options + /// + namespace ChOption { + // Channel Option(s) Enumeration + enum E : uint8_t { + DATA_NORMAL = 0U, // + DATA_IDLE = 1U, // + DATA_COMMON = 2U, // + + STEAL_NONE = 3U, // + STEAL_FACCH1_2 = 2U, // + STEAL_FACCH1_1 = 1U, // + STEAL_FACCH = 0U // + }; + } + + /// + /// Common Access Channel - Structure + /// + namespace ChStructure { + // Channel Structure Enumeration + enum E : uint8_t { + SR_RCCH_SINGLE = 0x00U, // + SR_RCCH_DUAL = 0x01U, // + SR_RCCH_HEAD_SINGLE = 0x02U, // + SR_RCCH_HEAD_DUAL = 0x03U, // + + SR_SINGLE = 0U, // + SR_4_4 = 0U, // + SR_3_4 = 1U, // + SR_2_4 = 2U, // + SR_1_4 = 3U // + }; + } + + /** Encryption Algorithms */ + const uint8_t CIPHER_TYPE_NONE = 0x00U; // Unencrypted + + /// + /// Location Category + /// + namespace LocationCategory { + // Location Category Enumeration + enum E : uint8_t { + GLOBAL = 0x00U, // Global + LOCAL = 0x01U, // Local + REGIONAL = 0x02U // Regional + }; + } + + /// + /// Data Response Class + /// + namespace PDUResponseClass { + enum : uint8_t + { + ACK = 0x00U, // Acknowledge + ACK_S = 0x01U, // + NACK = 0x03U // Negative Acknowledge + }; + } + + /// + /// Causes + /// + namespace CauseResponse { + enum : uint8_t { + RSRC_NOT_AVAIL_NETWORK = 0x51U, // Network Resource Not Available + RSRC_NOT_AVAIL_TEMP = 0x52U, // Resource Temporarily Not Available + RSRC_NOT_AVAIL_QUEUED = 0x53U, // Resource Queued Not Available + SVC_UNAVAILABLE = 0x06U, // Service Unavailable + PROC_ERROR = 0x70U, // + PROC_ERROR_UNDEF = 0x71U, // + + MM_REG_ACCEPTED = 0x01U, // Registration Accepted + MM_LOC_ACPT_GRP_FAIL = 0x04U, // Location Accepted / Group Failed + MM_LOC_ACPT_GRP_REFUSE = 0x04U, // Location Accepted / Group Refused + MM_REG_FAILED = 0x06U, // Registration Failed + MM_REG_REFUSED = 0x08U, // Registration Refused + + VD_ACCEPTED = 0x10U, // + VD_GRP_NOT_PERM = 0x11U, // + VD_REQ_UNIT_NOT_PERM = 0x12U, // + VD_TGT_UNIT_NOT_PERM = 0x13U, // + VD_REQ_UNIT_NOT_REG = 0x1CU, // + VD_QUE_CHN_RESOURCE_NOT_AVAIL = 0x30U, // + VD_QUE_TGT_UNIT_BUSY = 0x38U, // + VD_QUE_GRP_BUSY = 0x39U, // + + SS_ACK_R = 0x01U, // + SS_ACK_S = 0x02U, // + SS_NACK = 0x08U, // + SS_ACCEPTED = 0x10U, // + SS_GRP_NOT_PERM = 0x11U, // + SS_REQ_UNIT_NOT_PERM = 0x12U, // + SS_TGT_UNIT_NOT_PERM = 0x13U, // + SS_REQ_UNIT_NOT_REG = 0x1CU, // + + DREQ_USER = 0x10U, // + DREQ_OTHER = 0x1FU, // + + DISC_USER = 0x10U, // + DISC_OTHER = 0x1FU // + }; + } + + /// + /// Site Information 1 (SIF1) + /// + namespace SiteInformation1 { + enum : uint8_t { + DATA_CALL_SVC = 0x01U, // Data Call Service + VOICE_CALL_SVC = 0x02U, // Voice Call Service + COMPOSITE_CONTROL = 0x04U, // Composite Control Channel + AUTH_SVC = 0x08U, // Authentication Service + GRP_REG_SVC = 0x10U, // Group Registration Service + LOC_REG_SVC = 0x20U, // Location Registration Service + MULTI_SYSTEM_SVC = 0x40U, // Multi-System Service + MULTI_SITE_SVC = 0x80U // Multi-Site Service + }; + } + + /// + /// Site Information 2 (SIF2) + /// + namespace SiteInformation2 { + enum : uint8_t { + IP_NETWORK = 0x10U, // IP Networked + PSTN_NETWORK = 0x20U, // PSTN Networked + STATUS_CALL_REM_CTRL = 0x40U, // + SHORT_DATA_CALL_SVC = 0x80U // + }; + } + + /// + /// Channel Access - Step + /// + namespace ChAccessStep { + // Channel Access Step Enumeration + enum E : uint8_t { + SYS_DEFINED = 0x00U, // System Defined + ONEDOT25K = 0x02U, // + THREEDOT125K = 0x03U // + }; + } + + /// + /// Channel Access - Base + /// + namespace ChAccessBase { + // Channel Access Base Enumeration + enum E : uint8_t { + FREQ_100 = 0x01U, // + FREQ_330 = 0x02U, // + FREQ_400 = 0x03U, // + FREQ_750 = 0x04U, // + FREQ_SYS_DEFINED = 0x07U // + }; + } + + /// + /// Call Types + /// + namespace CallType { + enum : uint8_t { + BROADCAST = 0x00U, // Broadcast + CONFERENCE = 0x01U, // Conference + UNSPECIFIED = 0x02U, // Unspecified + INDIVIDUAL = 0x04U, // Individual + INTERCONNECT = 0x06U, // Interconnect + SPEED_DIAL = 0x07U // Speed Dial + }; + } + + /// + /// Transmission Mode + /// + namespace TransmissionMode { + enum : uint8_t { + MODE_4800 = 0x00U, // 4800-baud + MODE_9600 = 0x02U, // 9600-baud + MODE_9600_EFR = 0x03U // 9600-baud; should never be used on data calls + }; + } + + /// + /// Message Types + /// + namespace MessageType { + enum : uint8_t { + // Common Message Types + IDLE = 0x10U, // IDLE - Idle + DISC = 0x11U, // DISC - Disconnect + DST_ID_INFO = 0x17U, // DST_ID_INFO - Digital Station ID + SRV_INFO = 0x19U, // SRV_INFO - Service Information + CCH_INFO = 0x1AU, // CCH_INFO - Control Channel Information + ADJ_SITE_INFO = 0x1BU, // ADJ_SITE_INFO - Adjacent Site Information + + // Traffic Channel Message Types + RTCH_VCALL = 0x01U, // VCALL - Voice Call + RTCH_VCALL_IV = 0x03U, // VCALL_IV - Voice Call Initialization Vector + RTCH_TX_REL_EX = 0x07U, // TX_REL_EX - Transmission Release Extension + RTCH_TX_REL = 0x08U, // TX_REL - Transmission Release + RTCH_DCALL_HDR = 0x09U, // DCALL - Data Call (Header) + RTCH_DCALL_DATA = 0x0BU, // DCALL - Data Call (User Data Format) + RTCH_DCALL_ACK = 0x0CU, // DCALL_ACK - Data Call Acknowledge + RTCH_HEAD_DLY = 0x0FU, // HEAD_DLY - Header Delay + RTCH_SDCALL_REQ_HDR = 0x38U, // SDCALL_REQ - Short Data Call Request (Header) + RTCH_SDCALL_REQ_DATA = 0x39U, // SDCALL_REQ - Short Data Call Request (User Data Format) + RTCH_SDCALL_IV = 0x3AU, // SDCALL_IV - Short Data Call Initialization Vector + RTCH_SDCALL_RESP = 0x3BU, // SDCALL_RESP - Short Data Call Response + + // Control Channel Message Types + RCCH_VCALL_CONN = 0x03U, // VCALL_CONN - Voice Call Connection Request (ISP) / Voice Call Connection Response (OSP) + RCCH_VCALL_ASSGN = 0x04U, // VCALL_ASSGN - Voice Call Assignment + RCCH_DCALL_ASSGN = 0x14U, // DCALL_ASSGN - Data Call Assignment + RCCH_SITE_INFO = 0x18U, // SITE_INFO - Site Information + RCCH_REG = 0x20U, // REG - Registration Request (ISP) / Registration Response (OSP) + RCCH_REG_C = 0x22U, // REG_C - Registration Clear Request (ISP) / Registration Clear Response (OSP) + RCCH_REG_COMM = 0x23U, // REG_COMM - Registration Command + RCCH_GRP_REG = 0x24U, // GRP_REG - Group Registration Request (ISP) / Group Registration Response (OSP) + RCCH_PROP_FORM = 0x3FU // PROP_FORM - Proprietary Form + }; + } + + #define NXDN_RTCH_MSG_TYPE_VCALL "VCALL (Voice Call)" + #define NXDN_RTCH_MSG_TYPE_VCALL_RESP "VCALL_RESP (Voice Call Response)" + #define NXDN_RTCH_MSG_TYPE_TX_REL "TX_REL (Transmission Release)" + #define NXDN_RTCH_MSG_TYPE_DCALL_HDR "DCALL (Data Call Header)" + } // namespace defines } // namespace nxdn // --------------------------------------------------------------------------- diff --git a/src/common/nxdn/NXDNUtils.cpp b/src/common/nxdn/NXDNUtils.cpp index 5d67eee9..5416e569 100644 --- a/src/common/nxdn/NXDNUtils.cpp +++ b/src/common/nxdn/NXDNUtils.cpp @@ -9,7 +9,7 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2020 Jonathan Naylor, G4KLX -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -18,6 +18,7 @@ #include "Utils.h" using namespace nxdn; +using namespace nxdn::defines; #include diff --git a/src/common/nxdn/SiteData.h b/src/common/nxdn/SiteData.h index 1268e4ff..e108a515 100644 --- a/src/common/nxdn/SiteData.h +++ b/src/common/nxdn/SiteData.h @@ -7,7 +7,7 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #if !defined(__NXDN_SITE_DATA_H__) @@ -30,7 +30,7 @@ namespace nxdn m_locId(1U), m_channelId(1U), m_channelNo(1U), - m_serviceClass(NXDN_SIF1_VOICE_CALL_SVC | NXDN_SIF1_DATA_CALL_SVC), + m_serviceClass(defines::SiteInformation1::VOICE_CALL_SVC | defines::SiteInformation1::DATA_CALL_SVC), m_isAdjSite(false), m_callsign("CHANGEME"), m_requireReg(false), @@ -48,7 +48,7 @@ namespace nxdn m_locId(locId), m_channelId(channelId), m_channelNo(channelNo), - m_serviceClass(NXDN_SIF1_VOICE_CALL_SVC | NXDN_SIF1_DATA_CALL_SVC), + m_serviceClass(defines::SiteInformation1::VOICE_CALL_SVC | defines::SiteInformation1::DATA_CALL_SVC), m_isAdjSite(false), m_callsign("CHANGEME"), m_requireReg(requireReq), diff --git a/src/common/nxdn/Sync.cpp b/src/common/nxdn/Sync.cpp index 1fb727a9..f7c8bacf 100644 --- a/src/common/nxdn/Sync.cpp +++ b/src/common/nxdn/Sync.cpp @@ -9,6 +9,7 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2020 Jonathan Naylor, G4KLX +* Copyright (C) 2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -16,6 +17,7 @@ #include "nxdn/Sync.h" using namespace nxdn; +using namespace nxdn::defines; #include diff --git a/src/common/nxdn/channel/CAC.cpp b/src/common/nxdn/channel/CAC.cpp index 5bab533f..c9c45bd3 100644 --- a/src/common/nxdn/channel/CAC.cpp +++ b/src/common/nxdn/channel/CAC.cpp @@ -7,7 +7,7 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "nxdn/channel/CAC.h" @@ -18,6 +18,7 @@ #include "Utils.h" using namespace nxdn; +using namespace nxdn::defines; using namespace nxdn::channel; #include @@ -101,7 +102,7 @@ const uint32_t PUNCTURE_LIST_OUT[] = { /// CAC::CAC() : m_ran(0U), - m_structure(NXDN_SR_RCCH_SINGLE), + m_structure(ChStructure::SR_RCCH_SINGLE), m_idleBusy(true), m_txContinuous(false), m_receive(true), @@ -118,7 +119,7 @@ CAC::CAC() : /// CAC::CAC(const CAC& data) : m_ran(0U), - m_structure(NXDN_SR_RCCH_SINGLE), + m_structure(ChStructure::SR_RCCH_SINGLE), m_idleBusy(true), m_txContinuous(false), m_receive(true), @@ -147,7 +148,7 @@ CAC& CAC::operator=(const CAC& data) ::memcpy(m_data, data.m_data, NXDN_CAC_CRC_LENGTH_BYTES); m_ran = m_data[0U] & 0x3FU; - m_structure = (m_data[0U] >> 6) & 0x03U; + m_structure = (ChStructure::E)((m_data[0U] >> 6) & 0x03U); m_idleBusy = data.m_idleBusy; m_txContinuous = data.m_txContinuous; @@ -217,7 +218,7 @@ bool CAC::decode(const uint8_t* data) ::memset(crc, 0x00U, 2U); m_ran = m_data[0U] & 0x3FU; - m_structure = (m_data[0U] >> 6) & 0x03U; + m_structure = (ChStructure::E)((m_data[0U] >> 6) & 0x03U); uint32_t offset = NXDN_CAC_SHORT_CRC_LENGTH_BITS - 20U; for (uint32_t i = 0U; i < 16U; i++, offset++) { @@ -362,7 +363,7 @@ void CAC::copy(const CAC& data) ::memcpy(m_data, data.m_data, NXDN_CAC_CRC_LENGTH_BYTES); m_ran = m_data[0U] & 0x3FU; - m_structure = (m_data[0U] >> 6) & 0x03U; + m_structure = (ChStructure::E)((m_data[0U] >> 6) & 0x03U); m_idleBusy = data.m_idleBusy; m_txContinuous = data.m_txContinuous; diff --git a/src/common/nxdn/channel/CAC.h b/src/common/nxdn/channel/CAC.h index 19d750e6..f5550f74 100644 --- a/src/common/nxdn/channel/CAC.h +++ b/src/common/nxdn/channel/CAC.h @@ -7,13 +7,14 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #if !defined(__NXDN_CHANNEL__CAC_H__) #define __NXDN_CHANNEL__CAC_H__ #include "common/Defines.h" +#include "common/nxdn/NXDNDefines.h" namespace nxdn { @@ -51,7 +52,7 @@ namespace nxdn /// Radio Access Number __PROPERTY(uint8_t, ran, RAN); /// - __PROPERTY(uint8_t, structure, Structure); + __PROPERTY(defines::ChStructure::E, structure, Structure); /** Collision Control Field */ /// Idle/Busy. diff --git a/src/common/nxdn/channel/FACCH1.cpp b/src/common/nxdn/channel/FACCH1.cpp index 527c1b45..a624c237 100644 --- a/src/common/nxdn/channel/FACCH1.cpp +++ b/src/common/nxdn/channel/FACCH1.cpp @@ -19,6 +19,7 @@ #include "Utils.h" using namespace nxdn; +using namespace nxdn::defines; using namespace nxdn::channel; #include diff --git a/src/common/nxdn/channel/LICH.cpp b/src/common/nxdn/channel/LICH.cpp index 58317a2d..3d5d3250 100644 --- a/src/common/nxdn/channel/LICH.cpp +++ b/src/common/nxdn/channel/LICH.cpp @@ -9,7 +9,7 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2018 Jonathan Naylor, G4KLX -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "nxdn/NXDNDefines.h" @@ -18,6 +18,7 @@ #include "Utils.h" using namespace nxdn; +using namespace nxdn::defines; using namespace nxdn::channel; #include @@ -31,9 +32,9 @@ using namespace nxdn::channel; /// Initializes a new instance of the LICH class. /// LICH::LICH() : - m_rfct(NXDN_LICH_RFCT_RCCH), - m_fct(NXDN_LICH_USC_SACCH_NS), - m_option(0U), + m_rfct(RFChannelType::RCCH), + m_fct(FuncChannelType::USC_SACCH_NS), + m_option(ChOption::DATA_NORMAL), m_outbound(true), m_lich(0U) { @@ -45,9 +46,9 @@ LICH::LICH() : /// /// LICH::LICH(const LICH& data) : - m_rfct(NXDN_LICH_RFCT_RCCH), - m_fct(NXDN_LICH_USC_SACCH_NS), - m_option(0U), + m_rfct(RFChannelType::RCCH), + m_fct(FuncChannelType::USC_SACCH_NS), + m_option(ChOption::DATA_NORMAL), m_outbound(true), m_lich(0U) { @@ -108,9 +109,9 @@ bool LICH::decode(const uint8_t* data) bool newParity = getParity(); bool origParity = (m_lich & 0x01U) == 0x01U; - m_rfct = (m_lich >> 6) & 0x03U; - m_fct = (m_lich >> 4) & 0x03U; - m_option = (m_lich >> 2) & 0x03U; + m_rfct = (RFChannelType::E)((m_lich >> 6) & 0x03U); + m_fct = (FuncChannelType::E)((m_lich >> 4) & 0x03U); + m_option = (ChOption::E)((m_lich >> 2) & 0x03U); m_outbound = ((m_lich >> 1) & 0x01U) == 0x01U; return origParity == newParity; @@ -175,9 +176,9 @@ void LICH::copy(const LICH& data) { m_lich = data.m_lich; - m_rfct = (m_lich >> 6) & 0x03U; - m_fct = (m_lich >> 4) & 0x03U; - m_option = (m_lich >> 2) & 0x03U; + m_rfct = (RFChannelType::E)((m_lich >> 6) & 0x03U); + m_fct = (FuncChannelType::E)((m_lich >> 4) & 0x03U); + m_option = (ChOption::E)((m_lich >> 2) & 0x03U); m_outbound = ((m_lich >> 1) & 0x01U) == 0x01U; } diff --git a/src/common/nxdn/channel/LICH.h b/src/common/nxdn/channel/LICH.h index d5e8a6bb..e7c4b94e 100644 --- a/src/common/nxdn/channel/LICH.h +++ b/src/common/nxdn/channel/LICH.h @@ -9,13 +9,14 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2018 Jonathan Naylor, G4KLX -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #if !defined(__NXDN_CHANNEL__LICH_H__) #define __NXDN_CHANNEL__LICH_H__ #include "common/Defines.h" +#include "common/nxdn/NXDNDefines.h" namespace nxdn { @@ -46,11 +47,11 @@ namespace nxdn public: /** Common Data */ /// RF Channel Type - __PROPERTY(uint8_t, rfct, RFCT); + __PROPERTY(defines::RFChannelType::E, rfct, RFCT); /// Functional Channel Type - __PROPERTY(uint8_t, fct, FCT); + __PROPERTY(defines::FuncChannelType::E, fct, FCT); /// Channel Options - __PROPERTY(uint8_t, option, Option); + __PROPERTY(defines::ChOption::E, option, Option); /// Flag indicating outbound traffic direction __PROPERTY(bool, outbound, Outbound); diff --git a/src/common/nxdn/channel/SACCH.cpp b/src/common/nxdn/channel/SACCH.cpp index d8a38d07..dc7cb4a9 100644 --- a/src/common/nxdn/channel/SACCH.cpp +++ b/src/common/nxdn/channel/SACCH.cpp @@ -9,7 +9,7 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2018 Jonathan Naylor, G4KLX -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "nxdn/channel/SACCH.h" @@ -20,6 +20,7 @@ #include "Utils.h" using namespace nxdn; +using namespace nxdn::defines; using namespace nxdn::channel; #include @@ -48,7 +49,7 @@ const uint32_t PUNCTURE_LIST[] = { 5U, 11U, 17U, 23U, 29U, 35U, 41U, 47U, 53U, 5 /// SACCH::SACCH() : m_ran(0U), - m_structure(NXDN_SR_SINGLE), + m_structure(ChStructure::SR_SINGLE), m_data(nullptr) { m_data = new uint8_t[NXDN_SACCH_CRC_LENGTH_BYTES]; @@ -61,7 +62,7 @@ SACCH::SACCH() : /// SACCH::SACCH(const SACCH& data) : m_ran(0U), - m_structure(NXDN_SR_SINGLE), + m_structure(ChStructure::SR_SINGLE), m_data(nullptr) { copy(data); @@ -86,7 +87,7 @@ SACCH& SACCH::operator=(const SACCH& data) ::memcpy(m_data, data.m_data, NXDN_SACCH_CRC_LENGTH_BYTES); m_ran = m_data[0U] & 0x3FU; - m_structure = (m_data[0U] >> 6) & 0x03U; + m_structure = (ChStructure::E)((m_data[0U] >> 6) & 0x03U); } return *this; @@ -163,7 +164,7 @@ bool SACCH::decode(const uint8_t* data) } m_ran = m_data[0U] & 0x3FU; - m_structure = (m_data[0U] >> 6) & 0x03U; + m_structure = (ChStructure::E)((m_data[0U] >> 6) & 0x03U); return true; } @@ -274,5 +275,5 @@ void SACCH::copy(const SACCH& data) ::memcpy(m_data, data.m_data, NXDN_SACCH_CRC_LENGTH_BYTES); m_ran = m_data[0U] & 0x3FU; - m_structure = (m_data[0U] >> 6) & 0x03U; + m_structure = (ChStructure::E)((m_data[0U] >> 6) & 0x03U); } diff --git a/src/common/nxdn/channel/SACCH.h b/src/common/nxdn/channel/SACCH.h index 4a03d3bf..b8ff95e2 100644 --- a/src/common/nxdn/channel/SACCH.h +++ b/src/common/nxdn/channel/SACCH.h @@ -9,13 +9,14 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2018 Jonathan Naylor, G4KLX -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #if !defined(__NXDN_CHANNEL__SACCH_H__) #define __NXDN_CHANNEL__SACCH_H__ #include "common/Defines.h" +#include "common/nxdn/NXDNDefines.h" namespace nxdn { @@ -53,7 +54,7 @@ namespace nxdn /// Radio Access Number __PROPERTY(uint8_t, ran, RAN); /// - __PROPERTY(uint8_t, structure, Structure); + __PROPERTY(defines::ChStructure::E, structure, Structure); private: uint8_t* m_data; diff --git a/src/common/nxdn/channel/UDCH.cpp b/src/common/nxdn/channel/UDCH.cpp index f114b0d3..d295352d 100644 --- a/src/common/nxdn/channel/UDCH.cpp +++ b/src/common/nxdn/channel/UDCH.cpp @@ -9,7 +9,7 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2018 Jonathan Naylor, G4KLX -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "nxdn/channel/UDCH.h" @@ -20,6 +20,7 @@ #include "Utils.h" using namespace nxdn; +using namespace nxdn::defines; using namespace nxdn::channel; #include diff --git a/src/common/nxdn/lc/PacketInformation.cpp b/src/common/nxdn/lc/PacketInformation.cpp index 06bd06f3..80cd8638 100644 --- a/src/common/nxdn/lc/PacketInformation.cpp +++ b/src/common/nxdn/lc/PacketInformation.cpp @@ -7,7 +7,7 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -15,8 +15,9 @@ #include "nxdn/lc/PacketInformation.h" #include "Log.h" -using namespace nxdn::lc; using namespace nxdn; +using namespace nxdn::defines; +using namespace nxdn::lc; #include #include @@ -36,7 +37,7 @@ PacketInformation::PacketInformation() : m_start(true), m_circular(false), m_fragmentCount(0U), - m_rspClass(DATA_RSP_CLASS_ACK), + m_rspClass(PDUResponseClass::ACK), m_rspType(1U), m_rspErrorBlock(0U) { @@ -60,7 +61,7 @@ bool PacketInformation::decode(const uint8_t messageType, const uint8_t* data) switch (messageType) { - case RTCH_MESSAGE_TYPE_DCALL_HDR: + case MessageType::RTCH_DCALL_HDR: m_delivery = (data[0U] & 0x80U) == 0x80U; // Delivery m_selectiveRetry = (data[0U] & 0x20U) == 0x20U; // Selective Retry m_blockCount = (data[0U] & 0x0FU); // Block Count @@ -71,12 +72,12 @@ bool PacketInformation::decode(const uint8_t messageType, const uint8_t* data) m_fragmentCount = ((data[1U] & 0x01U) << 8) + data[2U]; // Fragment Count break; - case RTCH_MESSAGE_TYPE_DCALL_ACK: + case MessageType::RTCH_DCALL_ACK: m_rspClass = (data[0U] >> 4) & 0x03U; // Response Class m_rspType = (data[0U] >> 1) & 0x07U; // Response Type m_fragmentCount = ((data[0U] & 0x01U) << 8) + data[1U]; // Fragment Count break; - case RTCH_MESSAGE_TYPE_SDCALL_REQ_HDR: + case MessageType::RTCH_SDCALL_REQ_HDR: m_delivery = (data[0U] & 0x80U) == 0x80U; // Delivery m_selectiveRetry = (data[0U] & 0x20U) == 0x20U; // Selective Retry m_blockCount = (data[0U] & 0x0FU); // Block Count @@ -104,9 +105,9 @@ void PacketInformation::encode(const uint8_t messageType, uint8_t* data) switch (messageType) { - case RTCH_MESSAGE_TYPE_DCALL_HDR: + case MessageType::RTCH_DCALL_HDR: { - ::memset(data, 0x00U, NXDN_PCKT_INFO_LENGTH_BYTES); + ::memset(data, 0x00U, PCKT_INFO_LENGTH_BYTES); data[0U] = (m_delivery ? 0x80U : 0x00U) + // Delivery (m_selectiveRetry ? 0x20U : 0x00U) + // Selective Retry @@ -121,7 +122,7 @@ void PacketInformation::encode(const uint8_t messageType, uint8_t* data) data[2U] = m_fragmentCount & 0xFFU; // Fragment Count - bit 0 - 7 } break; - case RTCH_MESSAGE_TYPE_DCALL_ACK: + case MessageType::RTCH_DCALL_ACK: { data[0U] = (m_rspClass & 0x03U << 4) + // Response Class (m_rspType & 0x07U << 1); // Response Type @@ -131,8 +132,8 @@ void PacketInformation::encode(const uint8_t messageType, uint8_t* data) data[1U] = m_fragmentCount & 0xFFU; // Fragment Count - bit 0 - 7 } break; - case RTCH_MESSAGE_TYPE_SDCALL_REQ_HDR: - ::memset(data, 0x00U, NXDN_PCKT_INFO_LENGTH_BYTES); + case MessageType::RTCH_SDCALL_REQ_HDR: + ::memset(data, 0x00U, PCKT_INFO_LENGTH_BYTES); data[0U] = (m_delivery ? 0x80U : 0x00U) + // Delivery (m_selectiveRetry ? 0x20U : 0x00U) + // Selective Retry @@ -163,7 +164,7 @@ void PacketInformation::reset() m_fragmentCount = 0U; - m_rspClass = DATA_RSP_CLASS_ACK; + m_rspClass = PDUResponseClass::ACK; m_rspType = 0U; m_rspErrorBlock = 0U; } diff --git a/src/common/nxdn/lc/RCCH.cpp b/src/common/nxdn/lc/RCCH.cpp index 8995db67..f6a0a271 100644 --- a/src/common/nxdn/lc/RCCH.cpp +++ b/src/common/nxdn/lc/RCCH.cpp @@ -7,7 +7,7 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,204 Bryan Biedenkapp, N2PLL * */ #include "nxdn/NXDNDefines.h" @@ -15,6 +15,7 @@ #include "Utils.h" using namespace nxdn; +using namespace nxdn::defines; using namespace nxdn::lc; #include @@ -26,7 +27,7 @@ using namespace nxdn::lc; bool RCCH::m_verbose = false; -uint8_t *RCCH::m_siteCallsign = nullptr; +uint8_t* RCCH::m_siteCallsign = nullptr; SiteData RCCH::m_siteData = SiteData(); // --------------------------------------------------------------------------- @@ -46,26 +47,26 @@ RCCH::RCCH(const RCCH& data) : RCCH() /// Initializes a new instance of the RCCH class. /// RCCH::RCCH() : - m_messageType(MESSAGE_TYPE_IDLE), + m_messageType(MessageType::IDLE), m_srcId(0U), m_dstId(0U), m_locId(0U), m_regOption(0U), m_version(0U), - m_causeRsp(NXDN_CAUSE_MM_REG_ACCEPTED), + m_causeRsp(CauseResponse::MM_REG_ACCEPTED), m_grpVchNo(0U), - m_callType(CALL_TYPE_UNSPECIFIED), + m_callType(CallType::UNSPECIFIED), m_emergency(false), m_encrypted(false), m_priority(false), m_group(true), m_duplex(false), - m_transmissionMode(TRANSMISSION_MODE_4800), + m_transmissionMode(TransmissionMode::MODE_4800), m_siteIdenEntry() { if (m_siteCallsign == nullptr) { - m_siteCallsign = new uint8_t[NXDN_CALLSIGN_LENGTH_BYTES]; - ::memset(m_siteCallsign, 0x00U, NXDN_CALLSIGN_LENGTH_BYTES); + m_siteCallsign = new uint8_t[CALLSIGN_LENGTH_BYTES]; + ::memset(m_siteCallsign, 0x00U, CALLSIGN_LENGTH_BYTES); } } @@ -94,16 +95,16 @@ std::string RCCH::toString(bool isp) void RCCH::setCallsign(std::string callsign) { if (m_siteCallsign == nullptr) { - m_siteCallsign = new uint8_t[NXDN_CALLSIGN_LENGTH_BYTES]; - ::memset(m_siteCallsign, 0x00U, NXDN_CALLSIGN_LENGTH_BYTES); + m_siteCallsign = new uint8_t[CALLSIGN_LENGTH_BYTES]; + ::memset(m_siteCallsign, 0x00U, CALLSIGN_LENGTH_BYTES); } uint32_t idLength = callsign.length(); if (idLength > 0) { - ::memset(m_siteCallsign, 0x20U, NXDN_CALLSIGN_LENGTH_BYTES); + ::memset(m_siteCallsign, 0x20U, CALLSIGN_LENGTH_BYTES); - if (idLength > NXDN_CALLSIGN_LENGTH_BYTES) - idLength = NXDN_CALLSIGN_LENGTH_BYTES; + if (idLength > CALLSIGN_LENGTH_BYTES) + idLength = CALLSIGN_LENGTH_BYTES; for (uint32_t i = 0; i < idLength; i++) m_siteCallsign[i] = callsign[i]; } diff --git a/src/common/nxdn/lc/RTCH.cpp b/src/common/nxdn/lc/RTCH.cpp index 0eb9afe6..d98b0ea2 100644 --- a/src/common/nxdn/lc/RTCH.cpp +++ b/src/common/nxdn/lc/RTCH.cpp @@ -9,7 +9,7 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2018 Jonathan Naylor, G4KLX -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "nxdn/NXDNDefines.h" @@ -18,6 +18,7 @@ #include "Utils.h" using namespace nxdn; +using namespace nxdn::defines; using namespace nxdn::lc; #include @@ -37,8 +38,8 @@ bool RTCH::m_verbose = false; /// Initializes a new instance of the RTCH class. /// RTCH::RTCH() : - m_messageType(MESSAGE_TYPE_IDLE), - m_callType(CALL_TYPE_UNSPECIFIED), + m_messageType(MessageType::IDLE), + m_callType(CallType::UNSPECIFIED), m_srcId(0U), m_dstId(0U), m_emergency(false), @@ -46,18 +47,18 @@ RTCH::RTCH() : m_priority(false), m_group(true), m_duplex(false), - m_transmissionMode(TRANSMISSION_MODE_4800), + m_transmissionMode(TransmissionMode::MODE_4800), m_packetInfo(), m_rsp(), m_dataFrameNumber(0U), m_dataBlockNumber(0U), m_delayCount(0U), - m_algId(NXDN_CIPHER_TYPE_NONE), + m_algId(CIPHER_TYPE_NONE), m_kId(0U), - m_causeRsp(NXDN_CAUSE_VD_ACCEPTED) + m_causeRsp(CauseResponse::VD_ACCEPTED) { - m_mi = new uint8_t[NXDN_MI_LENGTH_BYTES]; - ::memset(m_mi, 0x00U, NXDN_MI_LENGTH_BYTES); + m_mi = new uint8_t[MI_LENGTH_BYTES]; + ::memset(m_mi, 0x00U, MI_LENGTH_BYTES); } /// @@ -65,8 +66,8 @@ RTCH::RTCH() : /// /// RTCH::RTCH(const RTCH& data) : - m_messageType(MESSAGE_TYPE_IDLE), - m_callType(CALL_TYPE_UNSPECIFIED), + m_messageType(MessageType::IDLE), + m_callType(CallType::UNSPECIFIED), m_srcId(0U), m_dstId(0U), m_emergency(false), @@ -74,15 +75,15 @@ RTCH::RTCH(const RTCH& data) : m_priority(false), m_group(true), m_duplex(false), - m_transmissionMode(TRANSMISSION_MODE_4800), + m_transmissionMode(TransmissionMode::MODE_4800), m_packetInfo(), m_rsp(), m_dataFrameNumber(0U), m_dataBlockNumber(0U), m_delayCount(0U), - m_algId(NXDN_CIPHER_TYPE_NONE), + m_algId(CIPHER_TYPE_NONE), m_kId(0U), - m_causeRsp(NXDN_CAUSE_VD_ACCEPTED) + m_causeRsp(CauseResponse::VD_ACCEPTED) { copy(data); } @@ -163,8 +164,8 @@ void RTCH::encode(uint8_t* data, uint32_t length, uint32_t offset) /// void RTCH::reset() { - m_messageType = MESSAGE_TYPE_IDLE; - m_callType = CALL_TYPE_UNSPECIFIED; + m_messageType = MessageType::IDLE; + m_callType = CallType::UNSPECIFIED; m_srcId = 0U; m_dstId = 0U; @@ -174,7 +175,7 @@ void RTCH::reset() m_priority = false; m_group = true; m_duplex = false; - m_transmissionMode = TRANSMISSION_MODE_4800; + m_transmissionMode = TransmissionMode::MODE_4800; m_packetInfo = PacketInformation(); m_rsp = PacketInformation(); @@ -183,13 +184,13 @@ void RTCH::reset() m_delayCount = 0U; - m_algId = NXDN_CIPHER_TYPE_NONE; + m_algId = CIPHER_TYPE_NONE; m_kId = 0U; - m_causeRsp = NXDN_CAUSE_VD_ACCEPTED; + m_causeRsp = CauseResponse::VD_ACCEPTED; } -/// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- // Private Class Members // --------------------------------------------------------------------------- @@ -206,7 +207,7 @@ bool RTCH::decodeLC(const uint8_t* data) // message type opcodes switch (m_messageType) { - case RTCH_MESSAGE_TYPE_VCALL: + case MessageType::RTCH_VCALL: m_callType = (data[2U] >> 5) & 0x07U; // Call Type m_emergency = (data[1U] & 0x80U) == 0x80U; // Emergency Flag m_priority = (data[1U] & 0x20U) == 0x20U; // Priority Flag @@ -217,22 +218,22 @@ bool RTCH::decodeLC(const uint8_t* data) m_algId = (data[7U] >> 6) & 0x03U; // Cipher Type m_kId = (data[7U] & 0x3FU); // Key ID break; - case RTCH_MESSAGE_TYPE_VCALL_IV: - case RTCH_MESSAGE_TYPE_SDCALL_IV: - if (m_algId != NXDN_CIPHER_TYPE_NONE && m_kId > 0U) { - m_mi = new uint8_t[NXDN_MI_LENGTH_BYTES]; - ::memset(m_mi, 0x00U, NXDN_MI_LENGTH_BYTES); - ::memcpy(m_mi, data + 1U, NXDN_MI_LENGTH_BYTES); // Message Indicator + case MessageType::RTCH_VCALL_IV: + case MessageType::RTCH_SDCALL_IV: + if (m_algId != CIPHER_TYPE_NONE && m_kId > 0U) { + m_mi = new uint8_t[MI_LENGTH_BYTES]; + ::memset(m_mi, 0x00U, MI_LENGTH_BYTES); + ::memcpy(m_mi, data + 1U, MI_LENGTH_BYTES); // Message Indicator } break; - case RTCH_MESSAGE_TYPE_TX_REL: + case MessageType::RTCH_TX_REL: m_callType = (data[2U] >> 5) & 0x07U; // Call Type m_emergency = (data[1U] & 0x80U) == 0x80U; // Emergency Flag m_priority = (data[1U] & 0x20U) == 0x20U; // Priority Flag m_srcId = (uint16_t)((data[3U] << 8) | data[4U]) & 0xFFFFU; // Source Radio Address m_dstId = (uint16_t)((data[5U] << 8) | data[6U]) & 0xFFFFU; // Target Radio Address break; - case RTCH_MESSAGE_TYPE_DCALL_HDR: + case MessageType::RTCH_DCALL_HDR: m_callType = (data[2U] >> 5) & 0x07U; // Call Type m_emergency = (data[1U] & 0x80U) == 0x80U; // Emergency Flag m_priority = (data[1U] & 0x20U) == 0x20U; // Priority Flag @@ -246,17 +247,17 @@ bool RTCH::decodeLC(const uint8_t* data) m_packetInfo = PacketInformation(); m_packetInfo.decode(m_messageType, data + 8U); // Packet Information - if (m_algId != NXDN_CIPHER_TYPE_NONE && m_kId > 0U) { - ::memset(m_mi, 0x00U, NXDN_MI_LENGTH_BYTES); - ::memcpy(m_mi, data + 11U, NXDN_MI_LENGTH_BYTES); // Message Indicator + if (m_algId != CIPHER_TYPE_NONE && m_kId > 0U) { + ::memset(m_mi, 0x00U, MI_LENGTH_BYTES); + ::memcpy(m_mi, data + 11U, MI_LENGTH_BYTES); // Message Indicator } break; - case RTCH_MESSAGE_TYPE_DCALL_DATA: - case RTCH_MESSAGE_TYPE_SDCALL_REQ_DATA: + case MessageType::RTCH_DCALL_DATA: + case MessageType::RTCH_SDCALL_REQ_DATA: m_dataFrameNumber = (data[1U] >> 4) & 0x0FU; // Frame Number m_dataBlockNumber = (data[1U] & 0x0FU); // Block Number break; - case RTCH_MESSAGE_TYPE_DCALL_ACK: + case MessageType::RTCH_DCALL_ACK: m_callType = (data[2U] >> 5) & 0x07U; // Call Type m_emergency = (data[1U] & 0x80U) == 0x80U; // Emergency Flag m_priority = (data[1U] & 0x20U) == 0x20U; // Priority Flag @@ -268,7 +269,7 @@ bool RTCH::decodeLC(const uint8_t* data) m_rsp = PacketInformation(); m_rsp.decode(m_messageType, data + 7U); // Response break; - case RTCH_MESSAGE_TYPE_HEAD_DLY: + case MessageType::RTCH_HEAD_DLY: m_callType = (data[2U] >> 5) & 0x07U; // Call Type m_emergency = (data[1U] & 0x80U) == 0x80U; // Emergency Flag m_priority = (data[1U] & 0x20U) == 0x20U; // Priority Flag @@ -276,9 +277,9 @@ bool RTCH::decodeLC(const uint8_t* data) m_dstId = (uint16_t)((data[5U] << 8) | data[6U]) & 0xFFFFU; // Target Radio Address m_delayCount = (uint16_t)((data[7U] << 8) | data[8U]) & 0xFFFFU; // Delay Count break; - case MESSAGE_TYPE_IDLE: + case MessageType::IDLE: break; - case RTCH_MESSAGE_TYPE_SDCALL_REQ_HDR: + case MessageType::RTCH_SDCALL_REQ_HDR: m_callType = (data[2U] >> 5) & 0x07U; // Call Type m_emergency = (data[1U] & 0x80U) == 0x80U; // Emergency Flag m_priority = (data[1U] & 0x20U) == 0x20U; // Priority Flag @@ -292,7 +293,7 @@ bool RTCH::decodeLC(const uint8_t* data) m_packetInfo = PacketInformation(); m_packetInfo.decode(m_messageType, data + 8U); // Packet Information break; - case RTCH_MESSAGE_TYPE_SDCALL_RESP: + case MessageType::RTCH_SDCALL_RESP: m_callType = (data[2U] >> 5) & 0x07U; // Call Type m_emergency = (data[1U] & 0x80U) == 0x80U; // Emergency Flag m_priority = (data[1U] & 0x20U) == 0x20U; // Priority Flag @@ -322,7 +323,7 @@ void RTCH::encodeLC(uint8_t* data) // message type opcodes switch (m_messageType) { - case RTCH_MESSAGE_TYPE_VCALL: + case MessageType::RTCH_VCALL: data[1U] = (m_emergency ? 0x80U : 0x00U) + // Emergency Flag (m_priority ? 0x20U : 0x00U); // Priority Flag data[2U] = ((m_callType & 0x07U) << 5) + // Call Type @@ -337,12 +338,12 @@ void RTCH::encodeLC(uint8_t* data) data[7U] = ((m_algId & 0x03U) << 6) + // Cipher Type (m_kId & 0x3FU); // Key ID break; - case RTCH_MESSAGE_TYPE_VCALL_IV: - if (m_algId != NXDN_CIPHER_TYPE_NONE && m_kId > 0U) { - ::memcpy(data + 1U, m_mi, NXDN_MI_LENGTH_BYTES); // Message Indicator + case MessageType::RTCH_VCALL_IV: + if (m_algId != CIPHER_TYPE_NONE && m_kId > 0U) { + ::memcpy(data + 1U, m_mi, MI_LENGTH_BYTES); // Message Indicator } break; - case RTCH_MESSAGE_TYPE_TX_REL: + case MessageType::RTCH_TX_REL: data[1U] = (m_emergency ? 0x80U : 0x00U) + // Emergency Flag (m_priority ? 0x20U : 0x00U); // Priority Flag data[2U] = (m_callType & 0x07U) << 5; // Call Type @@ -352,7 +353,7 @@ void RTCH::encodeLC(uint8_t* data) data[5U] = (m_dstId >> 8U) & 0xFFU; // Target Radio Address data[6U] = (m_dstId >> 0U) & 0xFFU; // ... break; - case RTCH_MESSAGE_TYPE_DCALL_HDR: + case MessageType::RTCH_DCALL_HDR: data[1U] = (m_emergency ? 0x80U : 0x00U) + // Emergency Flag (m_priority ? 0x20U : 0x00U); // Priority Flag data[2U] = ((m_callType & 0x07U) << 5) + // Call Type @@ -369,16 +370,16 @@ void RTCH::encodeLC(uint8_t* data) m_packetInfo.encode(m_messageType, data + 8U); // Packet Information - if (m_algId != NXDN_CIPHER_TYPE_NONE && m_kId > 0U) { - ::memcpy(data + 11U, m_mi, NXDN_MI_LENGTH_BYTES); // Message Indicator + if (m_algId != CIPHER_TYPE_NONE && m_kId > 0U) { + ::memcpy(data + 11U, m_mi, MI_LENGTH_BYTES); // Message Indicator } break; - case RTCH_MESSAGE_TYPE_DCALL_DATA: - case RTCH_MESSAGE_TYPE_SDCALL_REQ_DATA: + case MessageType::RTCH_DCALL_DATA: + case MessageType::RTCH_SDCALL_REQ_DATA: data[1U] = (m_dataFrameNumber & 0x0FU << 4) + // Frame Number (m_dataBlockNumber & 0x0FU); // Block Number break; - case RTCH_MESSAGE_TYPE_DCALL_ACK: + case MessageType::RTCH_DCALL_ACK: data[1U] = (m_emergency ? 0x80U : 0x00U) + // Emergency Flag (m_priority ? 0x20U : 0x00U); // Priority Flag data[2U] = ((m_callType & 0x07U) << 5) + // Call Type @@ -392,7 +393,7 @@ void RTCH::encodeLC(uint8_t* data) m_rsp.encode(m_messageType, data + 7U); // Response break; - case RTCH_MESSAGE_TYPE_HEAD_DLY: + case MessageType::RTCH_HEAD_DLY: data[1U] = (m_emergency ? 0x80U : 0x00U) + // Emergency Flag (m_priority ? 0x20U : 0x00U); // Priority Flag data[2U] = (m_callType & 0x07U) << 5; // Call Type @@ -405,9 +406,9 @@ void RTCH::encodeLC(uint8_t* data) data[7U] = (m_delayCount >> 8U) & 0xFFU; // Delay Count data[8U] = (m_delayCount >> 0U) & 0xFFU; // ... break; - case MESSAGE_TYPE_IDLE: + case MessageType::IDLE: break; - case RTCH_MESSAGE_TYPE_SDCALL_REQ_HDR: + case MessageType::RTCH_SDCALL_REQ_HDR: data[1U] = (m_emergency ? 0x80U : 0x00U) + // Emergency Flag (m_priority ? 0x20U : 0x00U); // Priority Flag data[2U] = ((m_callType & 0x07U) << 5) + // Call Type diff --git a/src/common/nxdn/lc/rcch/MESSAGE_TYPE_DCALL_HDR.cpp b/src/common/nxdn/lc/rcch/MESSAGE_TYPE_DCALL_HDR.cpp index 159b17b3..b16c105b 100644 --- a/src/common/nxdn/lc/rcch/MESSAGE_TYPE_DCALL_HDR.cpp +++ b/src/common/nxdn/lc/rcch/MESSAGE_TYPE_DCALL_HDR.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "nxdn/lc/rcch/MESSAGE_TYPE_DCALL_HDR.h" -using namespace nxdn::lc::rcch; -using namespace nxdn::lc; using namespace nxdn; +using namespace nxdn::defines; +using namespace nxdn::lc; +using namespace nxdn::lc::rcch; #include @@ -28,7 +29,7 @@ using namespace nxdn; /// MESSAGE_TYPE_DCALL_HDR::MESSAGE_TYPE_DCALL_HDR() : RCCH() { - m_messageType = RTCH_MESSAGE_TYPE_DCALL_HDR; + m_messageType = MessageType::RTCH_DCALL_HDR; } /// @@ -93,5 +94,5 @@ void MESSAGE_TYPE_DCALL_HDR::encode(uint8_t* data, uint32_t length, uint32_t off /// std::string MESSAGE_TYPE_DCALL_HDR::toString(bool isp) { - return std::string("RTCH_MESSAGE_TYPE_DCALL_HDR (Data Call Header)"); + return std::string("RTCH_DCALL_HDR (Data Call Header)"); } diff --git a/src/common/nxdn/lc/rcch/MESSAGE_TYPE_DST_ID_INFO.cpp b/src/common/nxdn/lc/rcch/MESSAGE_TYPE_DST_ID_INFO.cpp index fe8d45b4..ba530e3a 100644 --- a/src/common/nxdn/lc/rcch/MESSAGE_TYPE_DST_ID_INFO.cpp +++ b/src/common/nxdn/lc/rcch/MESSAGE_TYPE_DST_ID_INFO.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "nxdn/lc/rcch/MESSAGE_TYPE_DST_ID_INFO.h" -using namespace nxdn::lc::rcch; -using namespace nxdn::lc; using namespace nxdn; +using namespace nxdn::defines; +using namespace nxdn::lc; +using namespace nxdn::lc::rcch; #include @@ -28,7 +29,7 @@ using namespace nxdn; /// MESSAGE_TYPE_DST_ID_INFO::MESSAGE_TYPE_DST_ID_INFO() : RCCH() { - m_messageType = nxdn::MESSAGE_TYPE_DST_ID_INFO; + m_messageType = MessageType::DST_ID_INFO; } /// @@ -60,9 +61,9 @@ void MESSAGE_TYPE_DST_ID_INFO::encode(uint8_t* data, uint32_t length, uint32_t o uint8_t rcch[NXDN_RCCH_LC_LENGTH_BYTES + 4U]; ::memset(rcch, 0x00U, NXDN_RCCH_LC_LENGTH_BYTES + 4U); - rcch[1U] = 0xC0U + NXDN_CALLSIGN_LENGTH_BYTES; // Station ID Option - Start / End / Character Count + rcch[1U] = 0xC0U + CALLSIGN_LENGTH_BYTES; // Station ID Option - Start / End / Character Count rcch[2U] = (m_siteCallsign[0]); // Character 0 - for (uint8_t i = 1; i < NXDN_CALLSIGN_LENGTH_BYTES; i++) { + for (uint8_t i = 1; i < CALLSIGN_LENGTH_BYTES; i++) { rcch[i + 2U] = m_siteCallsign[i]; // Character 1 - 7 } @@ -76,5 +77,5 @@ void MESSAGE_TYPE_DST_ID_INFO::encode(uint8_t* data, uint32_t length, uint32_t o /// std::string MESSAGE_TYPE_DST_ID_INFO::toString(bool isp) { - return std::string("MESSAGE_TYPE_DST_ID_INFO (Digital Station ID)"); + return std::string("DST_ID_INFO (Digital Station ID)"); } diff --git a/src/common/nxdn/lc/rcch/MESSAGE_TYPE_GRP_REG.cpp b/src/common/nxdn/lc/rcch/MESSAGE_TYPE_GRP_REG.cpp index 70d74770..bf617eb3 100644 --- a/src/common/nxdn/lc/rcch/MESSAGE_TYPE_GRP_REG.cpp +++ b/src/common/nxdn/lc/rcch/MESSAGE_TYPE_GRP_REG.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "nxdn/lc/rcch/MESSAGE_TYPE_GRP_REG.h" -using namespace nxdn::lc::rcch; -using namespace nxdn::lc; using namespace nxdn; +using namespace nxdn::defines; +using namespace nxdn::lc; +using namespace nxdn::lc::rcch; #include @@ -28,7 +29,7 @@ using namespace nxdn; /// MESSAGE_TYPE_GRP_REG::MESSAGE_TYPE_GRP_REG() : RCCH() { - m_messageType = RCCH_MESSAGE_TYPE_GRP_REG; + m_messageType = MessageType::RCCH_GRP_REG; } /// @@ -82,6 +83,6 @@ void MESSAGE_TYPE_GRP_REG::encode(uint8_t* data, uint32_t length, uint32_t offse /// std::string MESSAGE_TYPE_GRP_REG::toString(bool isp) { - if (isp) return std::string("RCCH_MESSAGE_TYPE_GRP_REG (Group Registration Request)"); - else return std::string("RCCH_MESSAGE_TYPE_GRP_REG (Group Registration Response)"); + return (isp) ? std::string("RCCH_GRP_REG (Group Registration Request)") : + std::string("RCCH_GRP_REG (Group Registration Response)"); } diff --git a/src/common/nxdn/lc/rcch/MESSAGE_TYPE_IDLE.cpp b/src/common/nxdn/lc/rcch/MESSAGE_TYPE_IDLE.cpp index 270f83ed..bbf2d9e4 100644 --- a/src/common/nxdn/lc/rcch/MESSAGE_TYPE_IDLE.cpp +++ b/src/common/nxdn/lc/rcch/MESSAGE_TYPE_IDLE.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "nxdn/lc/rcch/MESSAGE_TYPE_IDLE.h" -using namespace nxdn::lc::rcch; -using namespace nxdn::lc; using namespace nxdn; +using namespace nxdn::defines; +using namespace nxdn::lc; +using namespace nxdn::lc::rcch; #include @@ -28,7 +29,7 @@ using namespace nxdn; /// MESSAGE_TYPE_IDLE::MESSAGE_TYPE_IDLE() : RCCH() { - m_messageType = nxdn::MESSAGE_TYPE_IDLE; + m_messageType = MessageType::IDLE; } /// @@ -70,5 +71,5 @@ void MESSAGE_TYPE_IDLE::encode(uint8_t* data, uint32_t length, uint32_t offset) /// std::string MESSAGE_TYPE_IDLE::toString(bool isp) { - return std::string("MESSAGE_TYPE_IDLE (Idle)"); + return std::string("IDLE (Idle)"); } diff --git a/src/common/nxdn/lc/rcch/MESSAGE_TYPE_REG.cpp b/src/common/nxdn/lc/rcch/MESSAGE_TYPE_REG.cpp index 0109ad5f..516f90c4 100644 --- a/src/common/nxdn/lc/rcch/MESSAGE_TYPE_REG.cpp +++ b/src/common/nxdn/lc/rcch/MESSAGE_TYPE_REG.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "nxdn/lc/rcch/MESSAGE_TYPE_REG.h" -using namespace nxdn::lc::rcch; -using namespace nxdn::lc; using namespace nxdn; +using namespace nxdn::defines; +using namespace nxdn::lc; +using namespace nxdn::lc::rcch; #include @@ -28,7 +29,7 @@ using namespace nxdn; /// MESSAGE_TYPE_REG::MESSAGE_TYPE_REG() : RCCH() { - m_messageType = RCCH_MESSAGE_TYPE_REG; + m_messageType = MessageType::RCCH_REG; } /// @@ -85,6 +86,6 @@ void MESSAGE_TYPE_REG::encode(uint8_t* data, uint32_t length, uint32_t offset) /// std::string MESSAGE_TYPE_REG::toString(bool isp) { - if (isp) return std::string("RCCH_MESSAGE_TYPE_REG (Registration Request)"); - else return std::string("RCCH_MESSAGE_TYPE_REG (Registration Response)"); + return (isp) ? std::string("RCCH_REG (Registration Request)") : + std::string("RCCH_REG (Registration Response)"); } diff --git a/src/common/nxdn/lc/rcch/MESSAGE_TYPE_REG_C.cpp b/src/common/nxdn/lc/rcch/MESSAGE_TYPE_REG_C.cpp index 18281c95..ca3631a7 100644 --- a/src/common/nxdn/lc/rcch/MESSAGE_TYPE_REG_C.cpp +++ b/src/common/nxdn/lc/rcch/MESSAGE_TYPE_REG_C.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "nxdn/lc/rcch/MESSAGE_TYPE_REG_C.h" -using namespace nxdn::lc::rcch; -using namespace nxdn::lc; using namespace nxdn; +using namespace nxdn::defines; +using namespace nxdn::lc; +using namespace nxdn::lc::rcch; #include @@ -28,7 +29,7 @@ using namespace nxdn; /// MESSAGE_TYPE_REG_C::MESSAGE_TYPE_REG_C() : RCCH() { - m_messageType = RCCH_MESSAGE_TYPE_REG_C; + m_messageType = MessageType::RCCH_REG_C; } /// @@ -80,6 +81,6 @@ void MESSAGE_TYPE_REG_C::encode(uint8_t* data, uint32_t length, uint32_t offset) /// std::string MESSAGE_TYPE_REG_C::toString(bool isp) { - if (isp) return std::string("RCCH_MESSAGE_TYPE_REG_C (Registration Clear Request)"); - else return std::string("RCCH_MESSAGE_TYPE_REG_C (Registration Clear Response)"); + return (isp) ? std::string("RCCH_REG_C (Registration Clear Request)") : + std::string("RCCH_REG_C (Registration Clear Response)"); } diff --git a/src/common/nxdn/lc/rcch/MESSAGE_TYPE_REG_COMM.cpp b/src/common/nxdn/lc/rcch/MESSAGE_TYPE_REG_COMM.cpp index 8f7ceec1..ea6d8af1 100644 --- a/src/common/nxdn/lc/rcch/MESSAGE_TYPE_REG_COMM.cpp +++ b/src/common/nxdn/lc/rcch/MESSAGE_TYPE_REG_COMM.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "nxdn/lc/rcch/MESSAGE_TYPE_REG_COMM.h" -using namespace nxdn::lc::rcch; -using namespace nxdn::lc; using namespace nxdn; +using namespace nxdn::defines; +using namespace nxdn::lc; +using namespace nxdn::lc::rcch; #include @@ -28,7 +29,7 @@ using namespace nxdn; /// MESSAGE_TYPE_REG_COMM::MESSAGE_TYPE_REG_COMM() : RCCH() { - m_messageType = RCCH_MESSAGE_TYPE_REG_COMM; + m_messageType = MessageType::RCCH_REG_COMM; } /// @@ -75,5 +76,5 @@ void MESSAGE_TYPE_REG_COMM::encode(uint8_t* data, uint32_t length, uint32_t offs /// std::string MESSAGE_TYPE_REG_COMM::toString(bool isp) { - return std::string("RCCH_MESSAGE_TYPE_REG_COMM (Registration Command)"); + return std::string("RCCH_REG_COMM (Registration Command)"); } diff --git a/src/common/nxdn/lc/rcch/MESSAGE_TYPE_SITE_INFO.cpp b/src/common/nxdn/lc/rcch/MESSAGE_TYPE_SITE_INFO.cpp index 8b29bbae..882d8b0f 100644 --- a/src/common/nxdn/lc/rcch/MESSAGE_TYPE_SITE_INFO.cpp +++ b/src/common/nxdn/lc/rcch/MESSAGE_TYPE_SITE_INFO.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "nxdn/lc/rcch/MESSAGE_TYPE_SITE_INFO.h" -using namespace nxdn::lc::rcch; -using namespace nxdn::lc; using namespace nxdn; +using namespace nxdn::defines; +using namespace nxdn::lc; +using namespace nxdn::lc::rcch; #include @@ -33,7 +34,7 @@ MESSAGE_TYPE_SITE_INFO::MESSAGE_TYPE_SITE_INFO() : RCCH(), m_ccchMultiCnt(2U), m_rcchIterateCnt(2U) { - m_messageType = RCCH_MESSAGE_TYPE_SITE_INFO; + m_messageType = MessageType::RCCH_SITE_INFO; } /// @@ -76,7 +77,7 @@ void MESSAGE_TYPE_SITE_INFO::encode(uint8_t* data, uint32_t length, uint32_t off ((m_rcchIterateCnt & 0x0FU) << 0); // ... - Number of Iteration rcch[6U] = m_siteData.serviceClass(); // Service Information - rcch[7U] = (m_siteData.netActive() ? NXDN_SIF2_IP_NETWORK : 0x00U); // ... + rcch[7U] = (m_siteData.netActive() ? SiteInformation2::IP_NETWORK : 0x00U); // ... // bryanb: this is currently fixed -- maybe dynamic in the future rcch[8U] = 0U; // Restriction Information - No access restriction / No cycle restriction @@ -84,7 +85,7 @@ void MESSAGE_TYPE_SITE_INFO::encode(uint8_t* data, uint32_t length, uint32_t off rcch[10U] = (!m_siteData.netActive() ? 0x01U : 0x00U); // ... - No group ratio restriction / No delay time extension / ISO // bryanb: this is currently fixed -- maybe dynamic in the future - rcch[11U] = NXDN_CH_ACCESS_BASE_FREQ_SYS_DEFINED << 2; // Channel Access Information - Channel Version / Sys Defined Step / Sys Defined Base Freq + rcch[11U] = ChAccessBase::FREQ_SYS_DEFINED << 2; // Channel Access Information - Channel Version / Sys Defined Step / Sys Defined Base Freq rcch[14U] = 1U; // Version @@ -102,7 +103,7 @@ void MESSAGE_TYPE_SITE_INFO::encode(uint8_t* data, uint32_t length, uint32_t off /// std::string MESSAGE_TYPE_SITE_INFO::toString(bool isp) { - return std::string("RCCH_MESSAGE_TYPE_SITE_INFO (Site Information)"); + return std::string("RCCH_SITE_INFO (Site Information)"); } // --------------------------------------------------------------------------- diff --git a/src/common/nxdn/lc/rcch/MESSAGE_TYPE_SRV_INFO.cpp b/src/common/nxdn/lc/rcch/MESSAGE_TYPE_SRV_INFO.cpp index c9e912f4..461df229 100644 --- a/src/common/nxdn/lc/rcch/MESSAGE_TYPE_SRV_INFO.cpp +++ b/src/common/nxdn/lc/rcch/MESSAGE_TYPE_SRV_INFO.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "nxdn/lc/rcch/MESSAGE_TYPE_SRV_INFO.h" -using namespace nxdn::lc::rcch; -using namespace nxdn::lc; using namespace nxdn; +using namespace nxdn::defines; +using namespace nxdn::lc; +using namespace nxdn::lc::rcch; #include @@ -28,7 +29,7 @@ using namespace nxdn; /// MESSAGE_TYPE_SRV_INFO::MESSAGE_TYPE_SRV_INFO() : RCCH() { - m_messageType = nxdn::MESSAGE_TYPE_SRV_INFO; + m_messageType = MessageType::SRV_INFO; } /// @@ -64,7 +65,7 @@ void MESSAGE_TYPE_SRV_INFO::encode(uint8_t* data, uint32_t length, uint32_t offs rcch[2U] = (m_siteData.locId() >> 8) & 0xFFU; // ... rcch[3U] = (m_siteData.locId() >> 0) & 0xFFU; // ... rcch[4U] = m_siteData.serviceClass(); // Service Information - rcch[5U] = (m_siteData.netActive() ? NXDN_SIF2_IP_NETWORK : 0x00U); // ... + rcch[5U] = (m_siteData.netActive() ? SiteInformation2::IP_NETWORK : 0x00U); // ... // bryanb: this is currently fixed -- maybe dynamic in the future rcch[8U] = 0U; // Restriction Information - No access restriction / No cycle restriction @@ -81,5 +82,5 @@ void MESSAGE_TYPE_SRV_INFO::encode(uint8_t* data, uint32_t length, uint32_t offs /// std::string MESSAGE_TYPE_SRV_INFO::toString(bool isp) { - return std::string("MESSAGE_TYPE_SRV_INFO (Service Information)"); + return std::string("SRV_INFO (Service Information)"); } diff --git a/src/common/nxdn/lc/rcch/MESSAGE_TYPE_VCALL_ASSGN.cpp b/src/common/nxdn/lc/rcch/MESSAGE_TYPE_VCALL_ASSGN.cpp index 8cbc4956..f2b78edd 100644 --- a/src/common/nxdn/lc/rcch/MESSAGE_TYPE_VCALL_ASSGN.cpp +++ b/src/common/nxdn/lc/rcch/MESSAGE_TYPE_VCALL_ASSGN.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "nxdn/lc/rcch/MESSAGE_TYPE_VCALL_ASSGN.h" -using namespace nxdn::lc::rcch; -using namespace nxdn::lc; using namespace nxdn; +using namespace nxdn::defines; +using namespace nxdn::lc; +using namespace nxdn::lc::rcch; #include @@ -28,7 +29,7 @@ using namespace nxdn; /// MESSAGE_TYPE_VCALL_ASSGN::MESSAGE_TYPE_VCALL_ASSGN() : RCCH() { - m_messageType = RCCH_MESSAGE_TYPE_VCALL_ASSGN; + m_messageType = MessageType::RCCH_VCALL_ASSGN; } /// @@ -87,5 +88,5 @@ void MESSAGE_TYPE_VCALL_ASSGN::encode(uint8_t* data, uint32_t length, uint32_t o /// std::string MESSAGE_TYPE_VCALL_ASSGN::toString(bool isp) { - return std::string("RCCH_MESSAGE_TYPE_VCALL_ASSGN (Voice Call Assignment)"); + return std::string("RCCH_VCALL_ASSGN (Voice Call Assignment)"); } diff --git a/src/common/nxdn/lc/rcch/MESSAGE_TYPE_VCALL_CONN.cpp b/src/common/nxdn/lc/rcch/MESSAGE_TYPE_VCALL_CONN.cpp index b211cff9..7672eae9 100644 --- a/src/common/nxdn/lc/rcch/MESSAGE_TYPE_VCALL_CONN.cpp +++ b/src/common/nxdn/lc/rcch/MESSAGE_TYPE_VCALL_CONN.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "nxdn/lc/rcch/MESSAGE_TYPE_VCALL_CONN.h" -using namespace nxdn::lc::rcch; -using namespace nxdn::lc; using namespace nxdn; +using namespace nxdn::defines; +using namespace nxdn::lc; +using namespace nxdn::lc::rcch; #include @@ -28,7 +29,7 @@ using namespace nxdn; /// MESSAGE_TYPE_VCALL_CONN::MESSAGE_TYPE_VCALL_CONN() : RCCH() { - m_messageType = RCCH_MESSAGE_TYPE_VCALL_CONN; + m_messageType = MessageType::RCCH_VCALL_CONN; } /// @@ -93,6 +94,6 @@ void MESSAGE_TYPE_VCALL_CONN::encode(uint8_t* data, uint32_t length, uint32_t of /// std::string MESSAGE_TYPE_VCALL_CONN::toString(bool isp) { - if (isp) return std::string("RCCH_MESSAGE_TYPE_VCALL_CONN (Voice Call Connection Request)"); - else return std::string("RCCH_MESSAGE_TYPE_VCALL_CONN (Voice Call Connection Response)"); + return (isp) ? std::string("RCCH_VCALL_CONN (Voice Call Connection Request)") : + std::string("RCCH_VCALL_CONN (Voice Call Connection Response)"); } diff --git a/src/common/nxdn/lc/rcch/RCCHFactory.cpp b/src/common/nxdn/lc/rcch/RCCHFactory.cpp index 769434bf..8b62828c 100644 --- a/src/common/nxdn/lc/rcch/RCCHFactory.cpp +++ b/src/common/nxdn/lc/rcch/RCCHFactory.cpp @@ -7,7 +7,7 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -15,9 +15,10 @@ #include "Log.h" #include "Utils.h" -using namespace nxdn::lc::rcch; -using namespace nxdn::lc; using namespace nxdn; +using namespace nxdn::defines; +using namespace nxdn::lc; +using namespace nxdn::lc::rcch; #include @@ -58,18 +59,18 @@ std::unique_ptr RCCHFactory::createRCCH(const uint8_t* data, uint32_t leng // message type opcodes switch (messageType) { - case RTCH_MESSAGE_TYPE_VCALL: - case RCCH_MESSAGE_TYPE_VCALL_CONN: + case MessageType::RTCH_VCALL: + case MessageType::RCCH_VCALL_CONN: return decode(new MESSAGE_TYPE_VCALL_CONN(), data, length, offset); - case RTCH_MESSAGE_TYPE_DCALL_HDR: + case MessageType::RTCH_DCALL_HDR: return decode(new MESSAGE_TYPE_DCALL_HDR(), data, length, offset); - case nxdn::MESSAGE_TYPE_IDLE: + case MessageType::IDLE: return decode(new MESSAGE_TYPE_IDLE(), data, length, offset); - case RCCH_MESSAGE_TYPE_REG: + case MessageType::RCCH_REG: return decode(new MESSAGE_TYPE_REG(), data, length, offset); - case RCCH_MESSAGE_TYPE_REG_C: + case MessageType::RCCH_REG_C: return decode(new MESSAGE_TYPE_REG_C(), data, length, offset); - case RCCH_MESSAGE_TYPE_GRP_REG: + case MessageType::RCCH_GRP_REG: return decode(new MESSAGE_TYPE_GRP_REG(), data, length, offset); default: LogError(LOG_NXDN, "RCCH::decodeRCCH(), unknown RCCH value, messageType = $%02X", messageType); diff --git a/src/common/p25/NID.cpp b/src/common/p25/NID.cpp index f6cf1f32..b3259acc 100644 --- a/src/common/p25/NID.cpp +++ b/src/common/p25/NID.cpp @@ -9,7 +9,7 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2016 Jonathan Naylor, G4KLX -* Copyright (C) 2017,2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2017,2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -20,6 +20,7 @@ #include "edac/BCH.h" using namespace p25; +using namespace p25::defines; #include @@ -38,7 +39,7 @@ const uint32_t MAX_NID_ERRS = 7U;//5U; /// /// P25 Network Access Code. NID::NID(uint32_t nac) : - m_duid(0U), + m_duid(DUID::HDU), m_nac(nac), m_rxTx(nullptr), m_tx(nullptr), @@ -78,51 +79,51 @@ bool NID::decode(const uint8_t* data) P25Utils::decode(data, nid, 48U, 114U); // handle digital "squelch" NAC - if ((m_nac == P25_NAC_DIGITAL_SQ) || (m_nac == P25_NAC_REUSE_RX_NAC)) { + if ((m_nac == NAC_DIGITAL_SQ) || (m_nac == NAC_REUSE_RX_NAC)) { uint32_t nac = ((nid[0U] << 4) + (nid[1U] >> 4)) & 0xFFFU; cleanupArrays(); createRxTxNID(nac); // bryanb: I hate this and it'll be slow } - uint32_t errs = P25Utils::compare(nid, m_rxTx[P25_DUID_LDU1], P25_NID_LENGTH_BYTES); + uint32_t errs = P25Utils::compare(nid, m_rxTx[DUID::LDU1], P25_NID_LENGTH_BYTES); if (errs < MAX_NID_ERRS) { - m_duid = P25_DUID_LDU1; + m_duid = DUID::LDU1; return true; } - errs = P25Utils::compare(nid, m_rxTx[P25_DUID_LDU2], P25_NID_LENGTH_BYTES); + errs = P25Utils::compare(nid, m_rxTx[DUID::LDU2], P25_NID_LENGTH_BYTES); if (errs < MAX_NID_ERRS) { - m_duid = P25_DUID_LDU2; + m_duid = DUID::LDU2; return true; } - errs = P25Utils::compare(nid, m_rxTx[P25_DUID_PDU], P25_NID_LENGTH_BYTES); + errs = P25Utils::compare(nid, m_rxTx[DUID::PDU], P25_NID_LENGTH_BYTES); if (errs < MAX_NID_ERRS) { - m_duid = P25_DUID_PDU; + m_duid = DUID::PDU; return true; } - errs = P25Utils::compare(nid, m_rxTx[P25_DUID_TSDU], P25_NID_LENGTH_BYTES); + errs = P25Utils::compare(nid, m_rxTx[DUID::TSDU], P25_NID_LENGTH_BYTES); if (errs < MAX_NID_ERRS) { - m_duid = P25_DUID_TSDU; + m_duid = DUID::TSDU; return true; } - errs = P25Utils::compare(nid, m_rxTx[P25_DUID_HDU], P25_NID_LENGTH_BYTES); + errs = P25Utils::compare(nid, m_rxTx[DUID::HDU], P25_NID_LENGTH_BYTES); if (errs < MAX_NID_ERRS) { - m_duid = P25_DUID_HDU; + m_duid = DUID::HDU; return true; } - errs = P25Utils::compare(nid, m_rxTx[P25_DUID_TDULC], P25_NID_LENGTH_BYTES); + errs = P25Utils::compare(nid, m_rxTx[DUID::TDULC], P25_NID_LENGTH_BYTES); if (errs < MAX_NID_ERRS) { - m_duid = P25_DUID_TDULC; + m_duid = DUID::TDULC; return true; } - errs = P25Utils::compare(nid, m_rxTx[P25_DUID_TDU], P25_NID_LENGTH_BYTES); + errs = P25Utils::compare(nid, m_rxTx[DUID::TDU], P25_NID_LENGTH_BYTES); if (errs < MAX_NID_ERRS) { - m_duid = P25_DUID_TDU; + m_duid = DUID::TDU; return true; } @@ -134,19 +135,19 @@ bool NID::decode(const uint8_t* data) /// /// /// -void NID::encode(uint8_t* data, uint8_t duid) +void NID::encode(uint8_t* data, defines::DUID::E duid) { assert(data != nullptr); if (m_splitNac) { switch (duid) { - case P25_DUID_HDU: - case P25_DUID_TDU: - case P25_DUID_LDU1: - case P25_DUID_PDU: - case P25_DUID_TSDU: - case P25_DUID_LDU2: - case P25_DUID_TDULC: + case DUID::HDU: + case DUID::TDU: + case DUID::LDU1: + case DUID::PDU: + case DUID::TSDU: + case DUID::LDU2: + case DUID::TDULC: P25Utils::encode(m_tx[duid], data, 48U, 114U); break; default: @@ -155,19 +156,19 @@ void NID::encode(uint8_t* data, uint8_t duid) } else { // handle digital "squelch" NAC - if (m_nac == P25_NAC_DIGITAL_SQ) { + if (m_nac == NAC_DIGITAL_SQ) { cleanupArrays(); - createRxTxNID(P25_DEFAULT_NAC); + createRxTxNID(DEFAULT_NAC); } switch (duid) { - case P25_DUID_HDU: - case P25_DUID_TDU: - case P25_DUID_LDU1: - case P25_DUID_PDU: - case P25_DUID_TSDU: - case P25_DUID_LDU2: - case P25_DUID_TDULC: + case DUID::HDU: + case DUID::TDU: + case DUID::LDU1: + case DUID::PDU: + case DUID::TSDU: + case DUID::LDU2: + case DUID::TDULC: P25Utils::encode(m_rxTx[duid], data, 48U, 114U); break; default: @@ -219,54 +220,54 @@ void NID::createRxTxNID(uint32_t nac) { edac::BCH bch; - m_rxTx[P25_DUID_HDU] = new uint8_t[P25_NID_LENGTH_BYTES]; - m_rxTx[P25_DUID_HDU][0U] = (nac >> 4) & 0xFFU; - m_rxTx[P25_DUID_HDU][1U] = (nac << 4) & 0xF0U; - m_rxTx[P25_DUID_HDU][1U] |= P25_DUID_HDU; - bch.encode(m_rxTx[P25_DUID_HDU]); - m_rxTx[P25_DUID_HDU][7U] &= 0xFEU; // Clear the parity bit - - m_rxTx[P25_DUID_TDU] = new uint8_t[P25_NID_LENGTH_BYTES]; - m_rxTx[P25_DUID_TDU][0U] = (nac >> 4) & 0xFFU; - m_rxTx[P25_DUID_TDU][1U] = (nac << 4) & 0xF0U; - m_rxTx[P25_DUID_TDU][1U] |= P25_DUID_TDU; - bch.encode(m_rxTx[P25_DUID_TDU]); - m_rxTx[P25_DUID_TDU][7U] &= 0xFEU; // Clear the parity bit - - m_rxTx[P25_DUID_LDU1] = new uint8_t[P25_NID_LENGTH_BYTES]; - m_rxTx[P25_DUID_LDU1][0U] = (nac >> 4) & 0xFFU; - m_rxTx[P25_DUID_LDU1][1U] = (nac << 4) & 0xF0U; - m_rxTx[P25_DUID_LDU1][1U] |= P25_DUID_LDU1; - bch.encode(m_rxTx[P25_DUID_LDU1]); - m_rxTx[P25_DUID_LDU1][7U] |= 0x01U; // Set the parity bit - - m_rxTx[P25_DUID_PDU] = new uint8_t[P25_NID_LENGTH_BYTES]; - m_rxTx[P25_DUID_PDU][0U] = (nac >> 4) & 0xFFU; - m_rxTx[P25_DUID_PDU][1U] = (nac << 4) & 0xF0U; - m_rxTx[P25_DUID_PDU][1U] |= P25_DUID_PDU; - bch.encode(m_rxTx[P25_DUID_PDU]); - m_rxTx[P25_DUID_PDU][7U] &= 0xFEU; // Clear the parity bit - - m_rxTx[P25_DUID_TSDU] = new uint8_t[P25_NID_LENGTH_BYTES]; - m_rxTx[P25_DUID_TSDU][0U] = (nac >> 4) & 0xFFU; - m_rxTx[P25_DUID_TSDU][1U] = (nac << 4) & 0xF0U; - m_rxTx[P25_DUID_TSDU][1U] |= P25_DUID_TSDU; - bch.encode(m_rxTx[P25_DUID_TSDU]); - m_rxTx[P25_DUID_TSDU][7U] &= 0xFEU; // Clear the parity bit - - m_rxTx[P25_DUID_LDU2] = new uint8_t[P25_NID_LENGTH_BYTES]; - m_rxTx[P25_DUID_LDU2][0U] = (nac >> 4) & 0xFFU; - m_rxTx[P25_DUID_LDU2][1U] = (nac << 4) & 0xF0U; - m_rxTx[P25_DUID_LDU2][1U] |= P25_DUID_LDU2; - bch.encode(m_rxTx[P25_DUID_LDU2]); - m_rxTx[P25_DUID_LDU2][7U] |= 0x01U; // Set the parity bit - - m_rxTx[P25_DUID_TDULC] = new uint8_t[P25_NID_LENGTH_BYTES]; - m_rxTx[P25_DUID_TDULC][0U] = (nac >> 4) & 0xFFU; - m_rxTx[P25_DUID_TDULC][1U] = (nac << 4) & 0xF0U; - m_rxTx[P25_DUID_TDULC][1U] |= P25_DUID_TDULC; - bch.encode(m_rxTx[P25_DUID_TDULC]); - m_rxTx[P25_DUID_TDULC][7U] &= 0xFEU; // Clear the parity bit + m_rxTx[DUID::HDU] = new uint8_t[P25_NID_LENGTH_BYTES]; + m_rxTx[DUID::HDU][0U] = (nac >> 4) & 0xFFU; + m_rxTx[DUID::HDU][1U] = (nac << 4) & 0xF0U; + m_rxTx[DUID::HDU][1U] |= DUID::HDU; + bch.encode(m_rxTx[DUID::HDU]); + m_rxTx[DUID::HDU][7U] &= 0xFEU; // Clear the parity bit + + m_rxTx[DUID::TDU] = new uint8_t[P25_NID_LENGTH_BYTES]; + m_rxTx[DUID::TDU][0U] = (nac >> 4) & 0xFFU; + m_rxTx[DUID::TDU][1U] = (nac << 4) & 0xF0U; + m_rxTx[DUID::TDU][1U] |= DUID::TDU; + bch.encode(m_rxTx[DUID::TDU]); + m_rxTx[DUID::TDU][7U] &= 0xFEU; // Clear the parity bit + + m_rxTx[DUID::LDU1] = new uint8_t[P25_NID_LENGTH_BYTES]; + m_rxTx[DUID::LDU1][0U] = (nac >> 4) & 0xFFU; + m_rxTx[DUID::LDU1][1U] = (nac << 4) & 0xF0U; + m_rxTx[DUID::LDU1][1U] |= DUID::LDU1; + bch.encode(m_rxTx[DUID::LDU1]); + m_rxTx[DUID::LDU1][7U] |= 0x01U; // Set the parity bit + + m_rxTx[DUID::PDU] = new uint8_t[P25_NID_LENGTH_BYTES]; + m_rxTx[DUID::PDU][0U] = (nac >> 4) & 0xFFU; + m_rxTx[DUID::PDU][1U] = (nac << 4) & 0xF0U; + m_rxTx[DUID::PDU][1U] |= DUID::PDU; + bch.encode(m_rxTx[DUID::PDU]); + m_rxTx[DUID::PDU][7U] &= 0xFEU; // Clear the parity bit + + m_rxTx[DUID::TSDU] = new uint8_t[P25_NID_LENGTH_BYTES]; + m_rxTx[DUID::TSDU][0U] = (nac >> 4) & 0xFFU; + m_rxTx[DUID::TSDU][1U] = (nac << 4) & 0xF0U; + m_rxTx[DUID::TSDU][1U] |= DUID::TSDU; + bch.encode(m_rxTx[DUID::TSDU]); + m_rxTx[DUID::TSDU][7U] &= 0xFEU; // Clear the parity bit + + m_rxTx[DUID::LDU2] = new uint8_t[P25_NID_LENGTH_BYTES]; + m_rxTx[DUID::LDU2][0U] = (nac >> 4) & 0xFFU; + m_rxTx[DUID::LDU2][1U] = (nac << 4) & 0xF0U; + m_rxTx[DUID::LDU2][1U] |= DUID::LDU2; + bch.encode(m_rxTx[DUID::LDU2]); + m_rxTx[DUID::LDU2][7U] |= 0x01U; // Set the parity bit + + m_rxTx[DUID::TDULC] = new uint8_t[P25_NID_LENGTH_BYTES]; + m_rxTx[DUID::TDULC][0U] = (nac >> 4) & 0xFFU; + m_rxTx[DUID::TDULC][1U] = (nac << 4) & 0xF0U; + m_rxTx[DUID::TDULC][1U] |= DUID::TDULC; + bch.encode(m_rxTx[DUID::TDULC]); + m_rxTx[DUID::TDULC][7U] &= 0xFEU; // Clear the parity bit } /// @@ -277,52 +278,52 @@ void NID::createTxNID(uint32_t nac) { edac::BCH bch; - m_tx[P25_DUID_HDU] = new uint8_t[P25_NID_LENGTH_BYTES]; - m_tx[P25_DUID_HDU][0U] = (nac >> 4) & 0xFFU; - m_tx[P25_DUID_HDU][1U] = (nac << 4) & 0xF0U; - m_tx[P25_DUID_HDU][1U] |= P25_DUID_HDU; - bch.encode(m_tx[P25_DUID_HDU]); - m_tx[P25_DUID_HDU][7U] &= 0xFEU; // Clear the parity bit - - m_tx[P25_DUID_TDU] = new uint8_t[P25_NID_LENGTH_BYTES]; - m_tx[P25_DUID_TDU][0U] = (nac >> 4) & 0xFFU; - m_tx[P25_DUID_TDU][1U] = (nac << 4) & 0xF0U; - m_tx[P25_DUID_TDU][1U] |= P25_DUID_TDU; - bch.encode(m_tx[P25_DUID_TDU]); - m_tx[P25_DUID_TDU][7U] &= 0xFEU; // Clear the parity bit - - m_tx[P25_DUID_LDU1] = new uint8_t[P25_NID_LENGTH_BYTES]; - m_tx[P25_DUID_LDU1][0U] = (nac >> 4) & 0xFFU; - m_tx[P25_DUID_LDU1][1U] = (nac << 4) & 0xF0U; - m_tx[P25_DUID_LDU1][1U] |= P25_DUID_LDU1; - bch.encode(m_tx[P25_DUID_LDU1]); - m_tx[P25_DUID_LDU1][7U] |= 0x01U; // Set the parity bit - - m_tx[P25_DUID_PDU] = new uint8_t[P25_NID_LENGTH_BYTES]; - m_tx[P25_DUID_PDU][0U] = (nac >> 4) & 0xFFU; - m_tx[P25_DUID_PDU][1U] = (nac << 4) & 0xF0U; - m_tx[P25_DUID_PDU][1U] |= P25_DUID_PDU; - bch.encode(m_tx[P25_DUID_PDU]); - m_tx[P25_DUID_PDU][7U] &= 0xFEU; // Clear the parity bit - - m_tx[P25_DUID_TSDU] = new uint8_t[P25_NID_LENGTH_BYTES]; - m_tx[P25_DUID_TSDU][0U] = (nac >> 4) & 0xFFU; - m_tx[P25_DUID_TSDU][1U] = (nac << 4) & 0xF0U; - m_tx[P25_DUID_TSDU][1U] |= P25_DUID_TSDU; - bch.encode(m_tx[P25_DUID_TSDU]); - m_tx[P25_DUID_TSDU][7U] &= 0xFEU; // Clear the parity bit - - m_tx[P25_DUID_LDU2] = new uint8_t[P25_NID_LENGTH_BYTES]; - m_tx[P25_DUID_LDU2][0U] = (nac >> 4) & 0xFFU; - m_tx[P25_DUID_LDU2][1U] = (nac << 4) & 0xF0U; - m_tx[P25_DUID_LDU2][1U] |= P25_DUID_LDU2; - bch.encode(m_tx[P25_DUID_LDU2]); - m_tx[P25_DUID_LDU2][7U] |= 0x01U; // Set the parity bit - - m_tx[P25_DUID_TDULC] = new uint8_t[P25_NID_LENGTH_BYTES]; - m_tx[P25_DUID_TDULC][0U] = (nac >> 4) & 0xFFU; - m_tx[P25_DUID_TDULC][1U] = (nac << 4) & 0xF0U; - m_tx[P25_DUID_TDULC][1U] |= P25_DUID_TDULC; - bch.encode(m_tx[P25_DUID_TDULC]); - m_tx[P25_DUID_TDULC][7U] &= 0xFEU; // Clear the parity bit + m_tx[DUID::HDU] = new uint8_t[P25_NID_LENGTH_BYTES]; + m_tx[DUID::HDU][0U] = (nac >> 4) & 0xFFU; + m_tx[DUID::HDU][1U] = (nac << 4) & 0xF0U; + m_tx[DUID::HDU][1U] |= DUID::HDU; + bch.encode(m_tx[DUID::HDU]); + m_tx[DUID::HDU][7U] &= 0xFEU; // Clear the parity bit + + m_tx[DUID::TDU] = new uint8_t[P25_NID_LENGTH_BYTES]; + m_tx[DUID::TDU][0U] = (nac >> 4) & 0xFFU; + m_tx[DUID::TDU][1U] = (nac << 4) & 0xF0U; + m_tx[DUID::TDU][1U] |= DUID::TDU; + bch.encode(m_tx[DUID::TDU]); + m_tx[DUID::TDU][7U] &= 0xFEU; // Clear the parity bit + + m_tx[DUID::LDU1] = new uint8_t[P25_NID_LENGTH_BYTES]; + m_tx[DUID::LDU1][0U] = (nac >> 4) & 0xFFU; + m_tx[DUID::LDU1][1U] = (nac << 4) & 0xF0U; + m_tx[DUID::LDU1][1U] |= DUID::LDU1; + bch.encode(m_tx[DUID::LDU1]); + m_tx[DUID::LDU1][7U] |= 0x01U; // Set the parity bit + + m_tx[DUID::PDU] = new uint8_t[P25_NID_LENGTH_BYTES]; + m_tx[DUID::PDU][0U] = (nac >> 4) & 0xFFU; + m_tx[DUID::PDU][1U] = (nac << 4) & 0xF0U; + m_tx[DUID::PDU][1U] |= DUID::PDU; + bch.encode(m_tx[DUID::PDU]); + m_tx[DUID::PDU][7U] &= 0xFEU; // Clear the parity bit + + m_tx[DUID::TSDU] = new uint8_t[P25_NID_LENGTH_BYTES]; + m_tx[DUID::TSDU][0U] = (nac >> 4) & 0xFFU; + m_tx[DUID::TSDU][1U] = (nac << 4) & 0xF0U; + m_tx[DUID::TSDU][1U] |= DUID::TSDU; + bch.encode(m_tx[DUID::TSDU]); + m_tx[DUID::TSDU][7U] &= 0xFEU; // Clear the parity bit + + m_tx[DUID::LDU2] = new uint8_t[P25_NID_LENGTH_BYTES]; + m_tx[DUID::LDU2][0U] = (nac >> 4) & 0xFFU; + m_tx[DUID::LDU2][1U] = (nac << 4) & 0xF0U; + m_tx[DUID::LDU2][1U] |= DUID::LDU2; + bch.encode(m_tx[DUID::LDU2]); + m_tx[DUID::LDU2][7U] |= 0x01U; // Set the parity bit + + m_tx[DUID::TDULC] = new uint8_t[P25_NID_LENGTH_BYTES]; + m_tx[DUID::TDULC][0U] = (nac >> 4) & 0xFFU; + m_tx[DUID::TDULC][1U] = (nac << 4) & 0xF0U; + m_tx[DUID::TDULC][1U] |= DUID::TDULC; + bch.encode(m_tx[DUID::TDULC]); + m_tx[DUID::TDULC][7U] &= 0xFEU; // Clear the parity bit } diff --git a/src/common/p25/NID.h b/src/common/p25/NID.h index 0bfcdc24..ce070e0e 100644 --- a/src/common/p25/NID.h +++ b/src/common/p25/NID.h @@ -9,13 +9,14 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2016 Jonathan Naylor, G4KLX -* Copyright (C) 2017,2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2017,2022,2024 Bryan Biedenkapp, N2PLL * */ #if !defined(__P25_NID_H__) #define __P25_NID_H__ #include "common/Defines.h" +#include "common/p25/P25Defines.h" namespace p25 { @@ -34,14 +35,14 @@ namespace p25 /// Decodes P25 network identifier data. bool decode(const uint8_t* data); /// Encodes P25 network identifier data. - void encode(uint8_t* data, uint8_t duid); + void encode(uint8_t* data, defines::DUID::E duid); /// Helper to configure a separate Tx NAC. void setTxNAC(uint32_t nac); public: /// Data unit ID. - __READONLY_PROPERTY(uint8_t, duid, DUID); + __READONLY_PROPERTY(defines::DUID::E, duid, DUID); private: uint32_t m_nac; diff --git a/src/common/p25/P25Defines.h b/src/common/p25/P25Defines.h index 1cb9d332..7b085dfa 100644 --- a/src/common/p25/P25Defines.h +++ b/src/common/p25/P25Defines.h @@ -9,7 +9,7 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2016 Jonathan Naylor, G4KLX -* Copyright (C) 2017-2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2017-2024 Bryan Biedenkapp, N2PLL * */ #if !defined(__P25_DEFINES_H__) @@ -17,371 +17,497 @@ #include "common/Defines.h" +// Shorthand macro to p25::defines -- keeps source code that doesn't use "using" concise +#define P25DEF p25::defines namespace p25 { - // --------------------------------------------------------------------------- - // Constants - // --------------------------------------------------------------------------- + namespace defines + { + // --------------------------------------------------------------------------- + // Constants + // --------------------------------------------------------------------------- - const uint32_t P25_HDU_FRAME_LENGTH_BYTES = 99U; - const uint32_t P25_HDU_FRAME_LENGTH_BITS = P25_HDU_FRAME_LENGTH_BYTES * 8U; + const uint32_t P25_HDU_FRAME_LENGTH_BYTES = 99U; + const uint32_t P25_HDU_FRAME_LENGTH_BITS = P25_HDU_FRAME_LENGTH_BYTES * 8U; - const uint32_t P25_TDU_FRAME_LENGTH_BYTES = 18U; - const uint32_t P25_TDU_FRAME_LENGTH_BITS = P25_TDU_FRAME_LENGTH_BYTES * 8U; + const uint32_t P25_TDU_FRAME_LENGTH_BYTES = 18U; + const uint32_t P25_TDU_FRAME_LENGTH_BITS = P25_TDU_FRAME_LENGTH_BYTES * 8U; - const uint32_t P25_LDU_FRAME_LENGTH_BYTES = 216U; - const uint32_t P25_LDU_FRAME_LENGTH_BITS = P25_LDU_FRAME_LENGTH_BYTES * 8U; + const uint32_t P25_LDU_FRAME_LENGTH_BYTES = 216U; + const uint32_t P25_LDU_FRAME_LENGTH_BITS = P25_LDU_FRAME_LENGTH_BYTES * 8U; - const uint32_t P25_TSDU_FRAME_LENGTH_BYTES = 45U; - const uint32_t P25_TSDU_FRAME_LENGTH_BITS = P25_TSDU_FRAME_LENGTH_BYTES * 8U; + const uint32_t P25_TSDU_FRAME_LENGTH_BYTES = 45U; + const uint32_t P25_TSDU_FRAME_LENGTH_BITS = P25_TSDU_FRAME_LENGTH_BYTES * 8U; - const uint32_t P25_TSDU_DOUBLE_FRAME_LENGTH_BYTES = 72U; - const uint32_t P25_TSDU_DOUBLE_FRAME_LENGTH_BITS = P25_TSDU_DOUBLE_FRAME_LENGTH_BYTES * 8U; + const uint32_t P25_TSDU_DOUBLE_FRAME_LENGTH_BYTES = 72U; + const uint32_t P25_TSDU_DOUBLE_FRAME_LENGTH_BITS = P25_TSDU_DOUBLE_FRAME_LENGTH_BYTES * 8U; - const uint32_t P25_TSDU_TRIPLE_FRAME_LENGTH_BYTES = 90U; - const uint32_t P25_TSDU_TRIPLE_FRAME_LENGTH_BITS = P25_TSDU_TRIPLE_FRAME_LENGTH_BYTES * 8U; - - const uint32_t P25_PDU_FRAME_LENGTH_BYTES = 512U; - const uint32_t P25_PDU_FRAME_LENGTH_BITS = P25_PDU_FRAME_LENGTH_BYTES * 8U; - - const uint32_t P25_TDULC_FRAME_LENGTH_BYTES = 54U; - const uint32_t P25_TDULC_FRAME_LENGTH_BITS = P25_TDULC_FRAME_LENGTH_BYTES * 8U; - - const uint32_t P25_NID_LENGTH_BYTES = 8U; - const uint32_t P25_NID_LENGTH_BITS = P25_NID_LENGTH_BYTES * 8U; - - const uint8_t P25_SYNC_BYTES[] = { 0x55U, 0x75U, 0xF5U, 0xFFU, 0x77U, 0xFFU }; - const uint32_t P25_SYNC_LENGTH_BYTES = 6U; - const uint32_t P25_SYNC_LENGTH_BITS = P25_SYNC_LENGTH_BYTES * 8U; - const uint8_t P25_START_SYNC = 0x5FU; - - const uint32_t P25_PREAMBLE_LENGTH_BYTES = P25_SYNC_LENGTH_BYTES + P25_NID_LENGTH_BYTES; - const uint32_t P25_PREAMBLE_LENGTH_BITS = P25_SYNC_LENGTH_BITS + P25_NID_LENGTH_BITS; - - const uint32_t P25_LDU_FRAME_TIME = 180U; - - const uint32_t P25_HDU_LENGTH_BYTES = 81U; - const uint32_t P25_LDU_LC_FEC_LENGTH_BYTES = 18U; - - const uint32_t P25_TDULC_FEC_LENGTH_BYTES = 36U; - const uint32_t P25_TDULC_LENGTH_BYTES = 18U; - const uint32_t P25_TDULC_PAYLOAD_LENGTH_BYTES = 8U; - - const uint32_t P25_TSBK_FEC_LENGTH_BYTES = 25U; - const uint32_t P25_TSBK_FEC_LENGTH_BITS = P25_TSBK_FEC_LENGTH_BYTES * 8U - 4U; // Trellis is actually 196 bits - const uint32_t P25_TSBK_LENGTH_BYTES = 12U; - - const uint32_t P25_MAX_PDU_BLOCKS = 42U; - - const uint32_t P25_PDU_HEADER_LENGTH_BYTES = 12U; - const uint32_t P25_PDU_CONFIRMED_LENGTH_BYTES = 18U; - const uint32_t P25_PDU_CONFIRMED_DATA_LENGTH_BYTES = 16U; - const uint32_t P25_PDU_UNCONFIRMED_LENGTH_BYTES = 12U; - - const uint32_t P25_PDU_FEC_LENGTH_BYTES = 25U; - const uint32_t P25_PDU_FEC_LENGTH_BITS = P25_PDU_FEC_LENGTH_BYTES * 8U - 4U; // Trellis is actually 196 bits - - const uint32_t P25_MI_LENGTH_BYTES = 9U; - const uint32_t P25_RAW_IMBE_LENGTH_BYTES = 11U; - - const uint32_t P25_SS0_START = 70U; - const uint32_t P25_SS1_START = 71U; - const uint32_t P25_SS_INCREMENT = 72U; - - const uint8_t P25_NULL_IMBE[] = { 0x04U, 0x0CU, 0xFDU, 0x7BU, 0xFBU, 0x7DU, 0xF2U, 0x7BU, 0x3DU, 0x9EU, 0x45U }; - const uint8_t P25_ENCRYPTED_NULL_IMBE[] = { 0xFCU, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U }; - - const uint8_t P25_MFG_STANDARD = 0x00U; - const uint8_t P25_MFG_STANDARD_ALT = 0x01U; - - const uint8_t P25_MFG_MOT = 0x90U; - const uint8_t P25_MFG_DVM_OCS = 0x9CU; // P25 MFId used for internal signalling; Omaha Communication Systems, LLC ($9C) - - const uint8_t P25_MOT_CALLSIGN_LENGTH_BYTES = 8U; - - const uint8_t P25_AUTH_RES_LENGTH_BYTES = 4U; - const uint8_t P25_AUTH_RAND_SEED_LENGTH_BYTES = 10U; - const uint8_t P25_AUTH_RAND_CHLNG_LENGTH_BYTES = 5U; - const uint8_t P25_AUTH_KEY_LENGTH_BYTES = 16U; - - const uint8_t P25_ALGO_UNENCRYPT = 0x80U; - - const uint8_t P25_IDEN_UP_VU_BW_625K = 0x04U; - const uint8_t P25_IDEN_UP_VU_BW_125K = 0x05U; - - const uint8_t P25_SVC_CLS_INVALID = 0x00U; - const uint8_t P25_SVC_CLS_COMPOSITE = 0x01U; - const uint8_t P25_SVC_CLS_VOICE = 0x10U; - const uint8_t P25_SVC_CLS_DATA = 0x20U; - const uint8_t P25_SVC_CLS_REG = 0x40U; - const uint8_t P25_SVC_CLS_AUTH = 0x80U; - - const uint32_t P25_SYS_SRV_NET_ACTIVE = 0x0200000U; - const uint32_t P25_SYS_SRV_GROUP_VOICE = 0x0080000U; - const uint32_t P25_SYS_SRV_IND_VOICE = 0x0040000U; - const uint32_t P25_SYS_SRV_PSTN_UNIT_VOICE = 0x0020000U; - const uint32_t P25_SYS_SRV_UNIT_PSTN_VOICE = 0x0010000U; - const uint32_t P25_SYS_SRV_GROUP_DATA = 0x0004000U; - const uint32_t P25_SYS_SRV_IND_DATA = 0x0002000U; - const uint32_t P25_SYS_SRV_UNIT_REG = 0x0000800U; - const uint32_t P25_SYS_SRV_GROUP_AFF = 0x0000400U; - const uint32_t P25_SYS_SRV_GROUP_AFF_Q = 0x0000200U; - const uint32_t P25_SYS_SRV_USER_STS = 0x0000040U; - const uint32_t P25_SYS_SRV_USER_MSG = 0x0000020U; - const uint32_t P25_SYS_SRV_UNIT_STS = 0x0000010U; - const uint32_t P25_SYS_SRV_USER_STS_Q = 0x0000008U; - const uint32_t P25_SYS_SRV_UNIT_STS_Q = 0x0000004U; - const uint32_t P25_SYS_SRV_CALL_ALRT = 0x0000002U; - const uint32_t P25_SYS_SRV_EMERGENCY = 0x0000001U; - - const uint32_t P25_SYS_SRV_DEFAULT = P25_SYS_SRV_EMERGENCY | P25_SYS_SRV_CALL_ALRT | P25_SYS_SRV_USER_MSG | - P25_SYS_SRV_UNIT_STS_Q | P25_SYS_SRV_USER_STS_Q | P25_SYS_SRV_UNIT_STS | P25_SYS_SRV_USER_STS | - P25_SYS_SRV_IND_DATA | P25_SYS_SRV_IND_VOICE | P25_SYS_SRV_GROUP_DATA | P25_SYS_SRV_GROUP_VOICE; - const uint32_t P25_SYS_SRV_TRUNK = P25_SYS_SRV_DEFAULT | P25_SYS_SRV_GROUP_AFF | P25_SYS_SRV_UNIT_REG | P25_SYS_SRV_GROUP_AFF_Q; - - const uint8_t P25_CFVA_CONV = 0x08U; - const uint8_t P25_CFVA_FAILURE = 0x04U; - const uint8_t P25_CFVA_VALID = 0x02U; - const uint8_t P25_CFVA_NETWORK = 0x01U; - - const uint8_t P25_RSP_ACCEPT = 0x00U; - const uint8_t P25_RSP_FAIL = 0x01U; - const uint8_t P25_RSP_DENY = 0x02U; - const uint8_t P25_RSP_REFUSED = 0x03U; - - const uint8_t P25_ANS_RSP_PROCEED = 0x20U; - const uint8_t P25_ANS_RSP_DENY = 0x21U; - const uint8_t P25_ANS_RSP_WAIT = 0x22U; - - const uint8_t P25_CAN_SRV_NONE = 0x00U; - const uint8_t P25_CAN_SRV_TERM_QUE = 0x10U; - const uint8_t P25_CAN_SRV_TERM_RSRC_ASSIGN = 0x20U; - - const uint32_t P25_DENY_RSN_REQ_UNIT_NOT_VALID = 0x10U; - const uint32_t P25_DENY_RSN_REQ_UNIT_NOT_AUTH = 0x11U; - - const uint32_t P25_DENY_RSN_TGT_UNIT_NOT_VALID = 0x20U; - const uint32_t P25_DENY_RSN_TGT_UNIT_NOT_AUTH = 0x21U; - const uint32_t P25_DENY_RSN_SU_FAILED_AUTH = 0x22U; - const uint32_t P25_DENY_RSN_TGT_UNIT_REFUSED = 0x2FU; - - const uint32_t P25_DENY_RSN_TGT_GROUP_NOT_VALID = 0x30U; - const uint32_t P25_DENY_RSN_TGT_GROUP_NOT_AUTH = 0x31U; - - const uint32_t P25_DENY_RSN_NO_NET_RSRC_AVAIL = 0x53U; - const uint32_t P25_DENY_RSN_NO_RF_RSRC_AVAIL = 0x54U; - const uint32_t P25_DENY_RSN_SVC_IN_USE = 0x55U; - - const uint32_t P25_DENY_RSN_SITE_ACCESS_DENIAL = 0x60U; - - const uint32_t P25_DENY_RSN_PTT_COLLIDE = 0x67U; - const uint32_t P25_DENY_RSN_PTT_BONK = 0x77U; - - const uint32_t P25_DENY_RSN_SYS_UNSUPPORTED_SVC = 0xFFU; - - const uint32_t P25_QUE_RSN_REQ_ACTIVE_SERVICE = 0x10U; - const uint32_t P25_QUE_RSN_TGT_ACTIVE_SERVICE = 0x20U; - - const uint32_t P25_QUE_RSN_TGT_UNIT_QUEUED = 0x2FU; - - const uint32_t P25_QUE_RSN_CHN_RESOURCE_NOT_AVAIL = 0x40U; - - const uint32_t P25_EXT_FNCT_CHECK = 0x0000U; // Radio Check - const uint32_t P25_EXT_FNCT_UNINHIBIT = 0x007EU; // Radio Uninhibit - const uint32_t P25_EXT_FNCT_INHIBIT = 0x007FU; // Radio Inhibit - const uint32_t P25_EXT_FNCT_CHECK_ACK = 0x0080U; // Radio Check Ack - const uint32_t P25_EXT_FNCT_UNINHIBIT_ACK = 0x00FEU; // Radio Uninhibit Ack - const uint32_t P25_EXT_FNCT_INHIBIT_ACK = 0x00FFU; // Radio Inhibit Ack - - const uint32_t P25_WACN_STD_DEFAULT = 0xBB800U; - - const uint32_t P25_SID_STD_DEFAULT = 0x001U; - - const uint32_t P25_NAC_DIGITAL_SQ = 0xF7EU; - const uint32_t P25_NAC_REUSE_RX_NAC = 0xF7FU; - const uint32_t P25_DEFAULT_NAC = 0x293U; - - const uint32_t P25_WUID_FNE = 0xFFFFFCU; - const uint32_t P25_WUID_REG = 0xFFFFFEU; - const uint32_t P25_WUID_ALL = 0xFFFFFFU; - - const uint32_t P25_TGID_ALL = 0xFFFFU; - - const uint32_t DEFAULT_SILENCE_THRESHOLD = 124U; - const uint32_t DEFAULT_FRAME_LOSS_THRESHOLD = 6U; - const uint32_t MAX_P25_VOICE_ERRORS = 1233U; - - const uint8_t P25_FT_HDU_VALID = 0x01U; - const uint8_t P25_FT_HDU_LATE_ENTRY = 0x02U; - const uint8_t P25_FT_TERMINATOR = 0x03U; - const uint8_t P25_FT_DATA_UNIT = 0x00U; - - // PDU Format Type(s) - const uint8_t PDU_FMT_RSP = 0x03U; - const uint8_t PDU_FMT_UNCONFIRMED = 0x15U; - const uint8_t PDU_FMT_CONFIRMED = 0x16U; - const uint8_t PDU_FMT_AMBT = 0x17U; - - // PDU SAP - const uint8_t PDU_SAP_USER_DATA = 0x00U; - const uint8_t PDU_SAP_ENC_USER_DATA = 0x01U; - - const uint8_t PDU_SAP_PACKET_DATA = 0x04U; - - const uint8_t PDU_SAP_ARP = 0x05U; - - const uint8_t PDU_SAP_SNDCP_CTRL_DATA = 0x06U; - - const uint8_t PDU_SAP_EXT_ADDR = 0x1FU; - - const uint8_t PDU_SAP_REG = 0x20U; - - const uint8_t PDU_SAP_UNENC_KMM = 0x28U; - const uint8_t PDU_SAP_ENC_KMM = 0x29U; - - const uint8_t PDU_SAP_TRUNK_CTRL = 0x3DU; - - // PDU ACK Class - const uint8_t PDU_ACK_CLASS_ACK = 0x00U; - const uint8_t PDU_ACK_CLASS_NACK = 0x01U; - const uint8_t PDU_ACK_CLASS_ACK_RETRY = 0x02U; - - // PDU ACK Type(s) - const uint8_t PDU_ACK_TYPE_RETRY = 0x00U; - - const uint8_t PDU_ACK_TYPE_ACK = 0x01U; - - const uint8_t PDU_ACK_TYPE_NACK_ILLEGAL = 0x00U; // Illegal Format - const uint8_t PDU_ACK_TYPE_NACK_PACKET_CRC = 0x01U; // Packet CRC - const uint8_t PDU_ACK_TYPE_NACK_MEMORY_FULL = 0x02U; // Memory Full - const uint8_t PDU_ACK_TYPE_NACK_SEQ = 0x03U; // Out of logical sequence FSN - const uint8_t PDU_ACK_TYPE_NACK_UNDELIVERABLE = 0x04U;// Undeliverable - const uint8_t PDU_ACK_TYPE_NACK_OUT_OF_SEQ = 0x05U; // Out of sequence, N(S) != V(R) or V(R) + 1 - const uint8_t PDU_ACK_TYPE_NACK_INVL_USER = 0x06U; // Invalid User disallowed by the system - - // PDU Registration Type(s) - const uint8_t PDU_REG_TYPE_REQ_CNCT = 0x00U; - const uint8_t PDU_REG_TYPE_REQ_DISCNCT = 0x01U; - const uint8_t PDU_REG_TYPE_RSP_ACCPT = 0x04U; - const uint8_t PDU_REG_TYPE_RSP_DENY = 0x05U; - - // PDU SNDCP Type(s) - const uint8_t PDU_TYPE_SNDCP_ACT_TDS_CTX_ACCPT = 0x00U; - const uint8_t PDU_TYPE_SNDCP_DEACT_TDS_CTX_ACCPT = 0x01U; - const uint8_t PDU_TYPE_SNDCP_DEACT_TDS_CTX_REQ = 0x02U; - const uint8_t PDU_TYPE_SNDCP_ACT_TDS_CTX_REJECT = 0x03U; - const uint8_t PDU_TYPE_SNDCP_RF_UNCONFIRMED = 0x04U; - const uint8_t PDU_TYPE_SNDCP_RF_CONFIRMED = 0x05U; - - const uint8_t LC_SVC_OPT_EMERGENCY = 0x80U; - const uint8_t LC_SVC_OPT_ENCRYPTION = 0x40U; - - // LDUx/TDULC Link Control Opcode(s) - const uint8_t LC_GROUP = 0x00U; // GRP VCH USER - Group Voice Channel User - const uint8_t LC_GROUP_UPDT = 0x02U; // GRP VCH UPDT - Group Voice Channel Update - const uint8_t LC_PRIVATE = 0x03U; // UU VCH USER - Unit-to-Unit Voice Channel User - const uint8_t LC_UU_ANS_REQ = 0x05U; // UU ANS REQ - Unit to Unit Answer Request - const uint8_t LC_TEL_INT_VCH_USER = 0x06U; // TEL INT VCH USER - Telephone Interconnect Voice Channel User / MOT GPS DATA - Motorola In-Band GPS Data - const uint8_t LC_TEL_INT_ANS_RQST = 0x07U; // TEL INT ANS RQST - Telephone Interconnect Answer Request - const uint8_t LC_EXPLICIT_SOURCE_ID = 0x09U; // EXPLICIT SOURCE ID - Explicit Source ID - const uint8_t LC_CALL_TERM = 0x0FU; // CALL TERM - Call Termination or Cancellation - const uint8_t LC_IDEN_UP = 0x18U; // IDEN UP - Channel Identifier Update - const uint8_t LC_SYS_SRV_BCAST = 0x20U; // SYS SRV BCAST - System Service Broadcast - const uint8_t LC_ADJ_STS_BCAST = 0x22U; // ADJ STS BCAST - Adjacent Site Status Broadcast - const uint8_t LC_RFSS_STS_BCAST = 0x23U; // RFSS STS BCAST - RFSS Status Broadcast - const uint8_t LC_NET_STS_BCAST = 0x24U; // NET STS BCAST - Network Status Broadcast - const uint8_t LC_CONV_FALLBACK = 0x2AU; // CONV FALLBACK - Conventional Fallback - - // LDUx/TDULC Motorola Link Control Opcode(s) - const uint8_t LC_FAILSOFT = 0x02U; // FAILSOFT - Failsoft - - // TSBK ISP/OSP Shared Opcode(s) - const uint8_t TSBK_IOSP_GRP_VCH = 0x00U; // GRP VCH REQ - Group Voice Channel Request (ISP), GRP VCH GRANT - Group Voice Channel Grant (OSP) - const uint8_t TSBK_IOSP_UU_VCH = 0x04U; // UU VCH REQ - Unit-to-Unit Voice Channel Request (ISP), UU VCH GRANT - Unit-to-Unit Voice Channel Grant (OSP) - const uint8_t TSBK_IOSP_UU_ANS = 0x05U; // UU ANS RSP - Unit-to-Unit Answer Response (ISP), UU ANS REQ - Unit-to-Unit Answer Request (OSP) - const uint8_t TSBK_IOSP_TELE_INT_DIAL = 0x08U; // TELE INT DIAL REQ - Telephone Interconnect Request - Explicit (ISP), TELE INT DIAL GRANT - Telephone Interconnect Grant (OSP) - const uint8_t TSBK_IOSP_TELE_INT_ANS = 0x0AU; // TELE INT ANS RSP - Telephone Interconnect Answer Response (ISP), TELE INT ANS REQ - Telephone Interconnect Answer Request (OSP) - const uint8_t TSBK_IOSP_STS_UPDT = 0x18U; // STS UPDT REQ - Status Update Request (ISP), STS UPDT - Status Update (OSP) - const uint8_t TSBK_IOSP_STS_Q = 0x1AU; // STS Q REQ - Status Query Request (ISP), STS Q - Status Query (OSP) - const uint8_t TSBK_IOSP_MSG_UPDT = 0x1CU; // MSG UPDT REQ - Message Update Request (ISP), MSG UPDT - Message Update (OSP) - const uint8_t TSBK_IOSP_RAD_MON = 0x1DU; // RAD MON REQ - Radio Unit Monitor Request (ISP), RAD MON CMD - Radio Monitor Command (OSP) - const uint8_t TSBK_IOSP_RAD_MON_ENH = 0x1EU; // RAD MON ENH REQ - Radio Unit Monitor Enhanced Request (ISP), RAD MON ENH CMD - Radio Unit Monitor Enhanced Command (OSP) - const uint8_t TSBK_IOSP_CALL_ALRT = 0x1FU; // CALL ALRT REQ - Call Alert Request (ISP), CALL ALRT - Call Alert (OSP) - const uint8_t TSBK_IOSP_ACK_RSP = 0x20U; // ACK RSP U - Acknowledge Response - Unit (ISP), ACK RSP FNE - Acknowledge Response - FNE (OSP) - const uint8_t TSBK_IOSP_EXT_FNCT = 0x24U; // EXT FNCT RSP - Extended Function Response (ISP), EXT FNCT CMD - Extended Function Command (OSP) - const uint8_t TSBK_IOSP_GRP_AFF = 0x28U; // GRP AFF REQ - Group Affiliation Request (ISP), GRP AFF RSP - Group Affiliation Response (OSP) - const uint8_t TSBK_IOSP_U_REG = 0x2CU; // U REG REQ - Unit Registration Request (ISP), U REG RSP - Unit Registration Response (OSP) - - // TSBK Inbound Signalling Packet (ISP) Opcode(s) - const uint8_t TSBK_ISP_TELE_INT_PSTN_REQ = 0x09U; // TELE INT PSTN REQ - Telephone Interconnect Request - Implicit - const uint8_t TSBK_ISP_SNDCP_CH_REQ = 0x12U; // SNDCP CH REQ - SNDCP Data Channel Request - const uint8_t TSBK_ISP_STS_Q_RSP = 0x19U; // STS Q RSP - Status Query Response - const uint8_t TSBK_ISP_STS_Q_REQ = 0x1CU; // STS Q REQ - Status Query Request - const uint8_t TSBK_ISP_CAN_SRV_REQ = 0x23U; // CAN SRV REQ - Cancel Service Request - const uint8_t TSBK_ISP_EMERG_ALRM_REQ = 0x27U; // EMERG ALRM REQ - Emergency Alarm Request - const uint8_t TSBK_ISP_GRP_AFF_Q_RSP = 0x29U; // GRP AFF Q RSP - Group Affiliation Query Response - 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_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_FNE_RST = 0x3AU; // AUTH FNE RST - Authentication FNE Result - const uint8_t TSBK_ISP_AUTH_SU_DMD = 0x3BU; // AUTH SU DMD - Authentication SU Demand - - // 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_UU_VCH_GRANT_UPD = 0x06U; // UU VCH GRANT UPD - Unit-to-Unit Voice Channel Grant Update - const uint8_t TSBK_OSP_SNDCP_CH_GNT = 0x14U; // SNDCP CH GNT - SNDCP Data Channel Grant - const uint8_t TSBK_OSP_SNDCP_CH_ANN = 0x16U; // SNDCP CH ANN - SNDCP Data Channel Announcement - const uint8_t TSBK_OSP_STS_Q = 0x1AU; // STS Q - Status Query - const uint8_t TSBK_OSP_DENY_RSP = 0x27U; // DENY RSP - Deny Response - const uint8_t TSBK_OSP_SCCB_EXP = 0x29U; // SCCB - Secondary Control Channel Broadcast - Explicit - const uint8_t TSBK_OSP_GRP_AFF_Q = 0x2AU; // GRP AFF Q - Group Affiliation Query - const uint8_t TSBK_OSP_LOC_REG_RSP = 0x2BU; // LOC REG RSP - Location Registration Response - const uint8_t TSBK_OSP_U_REG_CMD = 0x2DU; // U REG CMD - Unit Registration Command - const uint8_t TSBK_OSP_U_DEREG_ACK = 0x2FU; // U DE REG ACK - Unit De-Registration Acknowledge - const uint8_t TSBK_OSP_SYNC_BCAST = 0x30U; // SYNC BCAST - Synchronization Broadcast - 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_QUE_RSP = 0x33U; // QUE RSP - Queued Response - const uint8_t TSBK_OSP_IDEN_UP_VU = 0x34U; // IDEN UP VU - Channel Identifier Update for VHF/UHF Bands - const uint8_t TSBK_OSP_TIME_DATE_ANN = 0x35U; // TIME DATE ANN - Time and Date Announcement - const uint8_t TSBK_OSP_SYS_SRV_BCAST = 0x38U; // SYS SRV BCAST - System Service Broadcast - const uint8_t TSBK_OSP_SCCB = 0x39U; // SCCB - Secondary Control Channel Broadcast - const uint8_t TSBK_OSP_RFSS_STS_BCAST = 0x3AU; // RFSS STS BCAST - RFSS Status Broadcast - const uint8_t TSBK_OSP_NET_STS_BCAST = 0x3BU; // NET STS BCAST - Network 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 - - // 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_DEL = 0x01U; // MOT GRG DEL - Motorola / Group Regroup Delete (Unpatch Supergroup) - const uint8_t TSBK_OSP_MOT_GRG_VCH_GRANT = 0x02U; // MOT GRG GROUP VCH GRANT / Group Regroup Voice Channel Grant - const uint8_t TSBK_OSP_MOT_GRG_VCH_UPD = 0x03U; // MOT GRG GROUP VCH GRANT UPD / Group Regroup Voice Channel Grant Update - const uint8_t TSBK_OSP_MOT_CC_BSI = 0x0BU; // MOT CC BSI - Motorola / Control Channel Base Station Identifier - const uint8_t TSBK_OSP_MOT_PSH_CCH = 0x0EU; // MOT PSH CCH - Motorola / Planned Control Channel Shutdown - - // TSBK DVM Outbound Signalling Packet (OSP) Opcode(s) - const uint8_t TSBK_OSP_DVM_GIT_HASH = 0x3FU; // - - // Data Unit ID(s) - const uint8_t P25_DUID_HDU = 0x00U; // Header Data Unit -#define P25_HDU_STR "P25_DUID_HDU (Header Data Unit)" - const uint8_t P25_DUID_TDU = 0x03U; // Simple Terminator Data Unit -#define P25_TDU_STR "P25_DUID_TDU (Simple Terminator Data Unit)" - const uint8_t P25_DUID_LDU1 = 0x05U; // Logical Link Data Unit 1 -#define P25_LDU1_STR "P25_DUID_LDU1 (Logical Link Data Unit 1)" - const uint8_t P25_DUID_VSELP1 = 0x06U; // Motorola VSELP 1 -#define P25_VSELP1_STR "P25_DUID_VSELP1 (VSELP Data Unit 1)" - const uint8_t P25_DUID_TSDU = 0x07U; // Trunking System Data Unit -#define P25_TSDU_STR "P25_DUID_TSDU (Trunking System Data Unit)" - const uint8_t P25_DUID_VSELP2 = 0x09U; // Motorola VSELP 2 -#define P25_VSELP2_STR "P25_DUID_VSELP2 (VSELP Data Unit 2)" - const uint8_t P25_DUID_LDU2 = 0x0AU; // Logical Link Data Unit 2 -#define P25_LDU2_STR "P25_DUID_LDU2 (Logical Link Data Unit 2)" - const uint8_t P25_DUID_PDU = 0x0CU; // Packet Data Unit -#define P25_PDU_STR "P25_DUID_PDU (Packet Data Unit)" - const uint8_t P25_DUID_TDULC = 0x0FU; // Terminator Data Unit with Link Control -#define P25_TDULC_STR "P25_DUID_TDULC (Terminator Data Unit with Link Control)" + const uint32_t P25_TSDU_TRIPLE_FRAME_LENGTH_BYTES = 90U; + const uint32_t P25_TSDU_TRIPLE_FRAME_LENGTH_BITS = P25_TSDU_TRIPLE_FRAME_LENGTH_BYTES * 8U; + + const uint32_t P25_PDU_FRAME_LENGTH_BYTES = 512U; + const uint32_t P25_PDU_FRAME_LENGTH_BITS = P25_PDU_FRAME_LENGTH_BYTES * 8U; + + const uint32_t P25_TDULC_FRAME_LENGTH_BYTES = 54U; + const uint32_t P25_TDULC_FRAME_LENGTH_BITS = P25_TDULC_FRAME_LENGTH_BYTES * 8U; + + const uint32_t P25_NID_LENGTH_BYTES = 8U; + const uint32_t P25_NID_LENGTH_BITS = P25_NID_LENGTH_BYTES * 8U; + + const uint8_t P25_SYNC_BYTES[] = { 0x55U, 0x75U, 0xF5U, 0xFFU, 0x77U, 0xFFU }; + const uint32_t P25_SYNC_LENGTH_BYTES = 6U; + const uint32_t P25_SYNC_LENGTH_BITS = P25_SYNC_LENGTH_BYTES * 8U; + const uint8_t P25_START_SYNC = 0x5FU; + + const uint32_t P25_PREAMBLE_LENGTH_BYTES = P25_SYNC_LENGTH_BYTES + P25_NID_LENGTH_BYTES; + const uint32_t P25_PREAMBLE_LENGTH_BITS = P25_SYNC_LENGTH_BITS + P25_NID_LENGTH_BITS; + + const uint32_t P25_LDU_FRAME_TIME = 180U; + + const uint32_t P25_HDU_LENGTH_BYTES = 81U; + const uint32_t P25_LDU_LC_FEC_LENGTH_BYTES = 18U; + + const uint32_t P25_TDULC_FEC_LENGTH_BYTES = 36U; + const uint32_t P25_TDULC_LENGTH_BYTES = 18U; + const uint32_t P25_TDULC_PAYLOAD_LENGTH_BYTES = 8U; + + const uint32_t P25_TSBK_FEC_LENGTH_BYTES = 25U; + const uint32_t P25_TSBK_FEC_LENGTH_BITS = P25_TSBK_FEC_LENGTH_BYTES * 8U - 4U; // Trellis is actually 196 bits + const uint32_t P25_TSBK_LENGTH_BYTES = 12U; + + const uint32_t P25_MAX_PDU_BLOCKS = 42U; + + const uint32_t P25_PDU_HEADER_LENGTH_BYTES = 12U; + const uint32_t P25_PDU_CONFIRMED_LENGTH_BYTES = 18U; + const uint32_t P25_PDU_CONFIRMED_DATA_LENGTH_BYTES = 16U; + const uint32_t P25_PDU_UNCONFIRMED_LENGTH_BYTES = 12U; + + const uint32_t P25_PDU_FEC_LENGTH_BYTES = 25U; + const uint32_t P25_PDU_FEC_LENGTH_BITS = P25_PDU_FEC_LENGTH_BYTES * 8U - 4U; // Trellis is actually 196 bits + + const uint32_t MI_LENGTH_BYTES = 9U; + const uint32_t RAW_IMBE_LENGTH_BYTES = 11U; + + const uint32_t P25_SS0_START = 70U; + const uint32_t P25_SS1_START = 71U; + const uint32_t P25_SS_INCREMENT = 72U; + + const uint8_t NULL_IMBE[] = { 0x04U, 0x0CU, 0xFDU, 0x7BU, 0xFBU, 0x7DU, 0xF2U, 0x7BU, 0x3DU, 0x9EU, 0x45U }; + const uint8_t ENCRYPTED_NULL_IMBE[] = { 0xFCU, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U }; + + const uint8_t MOT_CALLSIGN_LENGTH_BYTES = 8U; + + const uint8_t AUTH_RES_LENGTH_BYTES = 4U; + const uint8_t AUTH_RAND_SEED_LENGTH_BYTES = 10U; + const uint8_t AUTH_RAND_CHLNG_LENGTH_BYTES = 5U; + const uint8_t AUTH_KEY_LENGTH_BYTES = 16U; + + /** Thresholds */ + const uint32_t DEFAULT_SILENCE_THRESHOLD = 124U; + const uint32_t DEFAULT_FRAME_LOSS_THRESHOLD = 6U; + const uint32_t MAX_P25_VOICE_ERRORS = 1233U; + + /** Manufacturer IDs */ + const uint8_t MFG_STANDARD = 0x00U; // Standard MFId + const uint8_t MFG_STANDARD_ALT = 0x01U; // Alternate Standard MFId + + const uint8_t MFG_MOT = 0x90U; // Motorola + const uint8_t MFG_DVM_OCS = 0x9CU; // DVM; Omaha Communication Systems, LLC ($9C) + + /** Encryption Algorithms */ + const uint8_t ALGO_UNENCRYPT = 0x80U; // Unencrypted + + /** IDEN Table Bandwidth Sizes */ + const uint8_t IDEN_UP_VU_BW_625K = 0x04U; + const uint8_t IDEN_UP_VU_BW_125K = 0x05U; + + /// + /// Station Service Classes + /// + namespace ServiceClass { + enum : uint8_t { + INVALID = 0x00U, // Invalid Service Class + COMPOSITE = 0x01U, // Composite Control Channel + VOICE = 0x10U, // Voice + DATA = 0x20U, // Data + REG = 0x40U, // Registration + AUTH = 0x80U // Authentication + }; + } + + /// + /// System Service Types + /// + namespace SystemService { + enum : uint32_t { + NET_ACTIVE = 0x0200000U, // Network Active + GROUP_VOICE = 0x0080000U, // Group Voice + IND_VOICE = 0x0040000U, // Individual Voice + PSTN_UNIT_VOICE = 0x0020000U, // PSTN Unit Voice + UNIT_PSTN_VOICE = 0x0010000U, // Unit PSTN Voice + GROUP_DATA = 0x0004000U, // Group Data + IND_DATA = 0x0002000U, // Individual Data + UNIT_REG = 0x0000800U, // Unit Registration + GROUP_AFF = 0x0000400U, // Group Affiliation + GROUP_AFF_Q = 0x0000200U, // Group Affiliation Query + USER_STS = 0x0000040U, // User Status + USER_MSG = 0x0000020U, // User Message + UNIT_STS = 0x0000010U, // Unit Status + USER_STS_Q = 0x0000008U, // User Status Query + UNIT_STS_Q = 0x0000004U, // Unit Status Query + CALL_ALRT = 0x0000002U, // Call Alert + EMERGENCY = 0x0000001U // Emergency + }; + } + + const uint32_t SYS_SRV_DEFAULT = SystemService::EMERGENCY | SystemService::CALL_ALRT | SystemService::USER_MSG | + SystemService::UNIT_STS_Q | SystemService::USER_STS_Q | SystemService::UNIT_STS | SystemService::USER_STS | + SystemService::IND_DATA | SystemService::IND_VOICE | SystemService::GROUP_DATA | SystemService::GROUP_VOICE; + const uint32_t SYS_SRV_TRUNK = SYS_SRV_DEFAULT | SystemService::GROUP_AFF | SystemService::UNIT_REG | SystemService::GROUP_AFF_Q; + + /// + /// + /// + namespace CFVA { + enum : uint8_t { + CONV = 0x08U, // Conventional + FAILURE = 0x04U, // Failure + VALID = 0x02U, // Valid + NETWORK = 0x01U // Networked + }; + } + + /// + /// Response Codes + /// + namespace ResponseCode { + enum : uint8_t { + // General Codes + ACCEPT = 0x00U, // Accept + FAIL = 0x01U, // Fail + DENY = 0x02U, // Deny + REFUSED = 0x03U, // Refused + + // Answer Codes + ANS_PROCEED = 0x20U, // Proceed + ANS_DENY = 0x21U, // Deny + ANS_WAIT = 0x22U // Wait + }; + } + + /// + /// Cancel Service Codes + /// + namespace CancelService { + enum : uint8_t { + NONE = 0x00U, // None + TERM_QUE = 0x10U, // Terminate Queued + TERM_RSRC_ASSIGN = 0x20U // Terminate Resource Assigned + }; + } + + /// + /// Reason Codes + /// + namespace ReasonCode { + enum : uint8_t { + // Denial Codes + DENY_REQ_UNIT_NOT_VALID = 0x10U, // Requesting Unit Not Valid + DENY_REQ_UNIT_NOT_AUTH = 0x11U, // Requesting Unit Not Authenticated + + DENY_TGT_UNIT_NOT_VALID = 0x20U, // Target Unit Not Vaild + DENY_TGT_UNIT_NOT_AUTH = 0x21U, // Target Unit Not Authenticated + DENY_SU_FAILED_AUTH = 0x22U, // Subscriber Failed Authentication + DENY_TGT_UNIT_REFUSED = 0x2FU, // Target Unit Refused + + DENY_TGT_GROUP_NOT_VALID = 0x30U, // Target Group Not Valid + DENY_TGT_GROUP_NOT_AUTH = 0x31U, // Target Group Not Authenticated + + DENY_NO_NET_RSRC_AVAIL = 0x53U, // No Network Resources Available + DENY_NO_RF_RSRC_AVAIL = 0x54U, // No RF Resources Available + DENY_SVC_IN_USE = 0x55U, // Service In Use + + DENY_SITE_ACCESS_DENIAL = 0x60U, // Site Access Denial + + DENY_PTT_COLLIDE = 0x67U, // Push-to-Talk Collision + DENY_PTT_BONK = 0x77U, // Push-to-Talk Denial/Bonk + + DENY_SYS_UNSUPPORTED_SVC = 0xFFU, // Service Unsupported + + // Queue Codes + QUE_REQ_ACTIVE_SERVICE = 0x10U, // Requested Service Active + QUE_TGT_ACTIVE_SERVICE = 0x20U, // Target Service Active + + QUE_TGT_UNIT_QUEUED = 0x2FU, // Target Unit Queued + + QUE_CHN_RESOURCE_NOT_AVAIL = 0x40U // Channel Resource Not Available + }; + } + + /// + /// Extended Functions + /// + namespace ExtendedFunctions { + enum : uint16_t { + CHECK = 0x0000U, // Radio Check + UNINHIBIT = 0x007EU, // Radio Uninhibit + INHIBIT = 0x007FU, // Radio Inhibit + CHECK_ACK = 0x0080U, // Radio Check Ack + UNINHIBIT_ACK = 0x00FEU, // Radio Uninhibit Ack + INHIBIT_ACK = 0x00FFU // Radio Inhibit Ack + }; + } + + /** Default Values */ + const uint32_t NAC_DIGITAL_SQ = 0xF7EU; // Digital Squelch NAC + const uint32_t NAC_REUSE_RX_NAC = 0xF7FU; // Reuse RX NAC + const uint32_t DEFAULT_NAC = 0x293U; // Default NAC + + const uint32_t WACN_STD_DEFAULT = 0xBB800U; // Default WACN + const uint32_t SID_STD_DEFAULT = 0x001U; // Default System ID + + const uint32_t WUID_FNE = 0xFFFFFCU; // FNE Working Unit ID + const uint32_t WUID_REG = 0xFFFFFEU; // Registration Working Unit ID + const uint32_t WUID_ALL = 0xFFFFFFU; // All-call Working Unit ID + + const uint32_t TGID_ALL = 0xFFFFU; // All-call Talkgroup ID + + /// + /// DVM Network Frame Types + /// + namespace FrameType { + // DVM Network Frame Types Enumeration + enum E : uint8_t { + HDU_VALID = 0x01U, // HDU Valid + HDU_LATE_ENTRY = 0x02U, // HDU Late Entry + TERMINATOR = 0x03U, // TDU/TDULC Terminator + DATA_UNIT = 0x00U // Standard Data Unit + }; + } + /// + /// Data Format Type + /// + namespace PDUFormatType { + enum : uint8_t { + RSP = 0x03U, // Response + UNCONFIRMED = 0x15U, // Unconfirmed PDU + CONFIRMED = 0x16U, // Confirmed PDU + AMBT = 0x17U // Alternate Multi Block Trunking + }; + } + + /// + /// Service Access Point + /// + namespace PDUSAP { + enum : uint8_t { + USER_DATA = 0x00U, // User Data + ENC_USER_DATA = 0x01U, // Encrypted User Data + + PACKET_DATA = 0x04U, // Packet Data + + ARP = 0x05U, // ARP + + SNDCP_CTRL_DATA = 0x06U, // SNDCP Control Data + + EXT_ADDR = 0x1FU, // Extended Addressing + + REG = 0x20U, // Registration + + UNENC_KMM = 0x28U, // Unencrypted KMM + ENC_KMM = 0x29U, // Encrypted KMM + + TRUNK_CTRL = 0x3DU // Trunking Control + }; + } + + /// + /// Acknowledgement Class + /// + namespace PDUAckClass { + enum : uint8_t { + ACK = 0x00U, // Acknowledge + NACK = 0x01U, // Negative Acknowledge + ACK_RETRY = 0x02U // Acknowledge Retry + }; + } + + /// + /// Acknowledgement Type + /// + namespace PDUAckType { + enum : uint8_t { + RETRY = 0x00U, // Retry + + ACK = 0x01U, // Acknowledge + + NACK_ILLEGAL = 0x00U, // Illegal Format + NACK_PACKET_CRC = 0x01U, // Packet CRC + NACK_MEMORY_FULL = 0x02U, // Memory Full + NACK_SEQ = 0x03U, // Out of logical sequence FSN + NACK_UNDELIVERABLE = 0x04U, // Undeliverable + NACK_OUT_OF_SEQ = 0x05U, // Out of sequence, N(S) != V(R) or V(R) + 1 + NACK_INVL_USER = 0x06U // Invalid User disallowed by the system + }; + } + + /// + /// Registration Type + /// + namespace PDURegType { + enum : uint8_t { + CNCT = 0x00U, // Connect + DISCNCT = 0x01U, // Disconnect + ACCPT = 0x04U, // Accept + DENY = 0x05U // Deny + }; + } + + /// + /// SNDCP Type + /// + namespace PDUSNDCPType { + enum : uint8_t { + ACT_TDS_CTX_ACCPT = 0x00U, // Activate Context Accept + DEACT_TDS_CTX_ACCPT = 0x01U, // Deactivate Context Accept + DEACT_TDS_CTX_REQ = 0x02U, // Deactivate Context Request + ACT_TDS_CTX_REJECT = 0x03U, // Activate Context Reject + RF_UNCONFIRMED = 0x04U, // RF Unconfirmed + RF_CONFIRMED = 0x05U // RF Confirmed + }; + } + + const uint8_t LC_SVC_OPT_EMERGENCY = 0x80U; + const uint8_t LC_SVC_OPT_ENCRYPTION = 0x40U; + + /// + /// LDUx/TDULC Link Control Opcode(s) + /// + namespace LCO { + enum : uint8_t { + GROUP = 0x00U, // GRP VCH USER - Group Voice Channel User + GROUP_UPDT = 0x02U, // GRP VCH UPDT - Group Voice Channel Update + PRIVATE = 0x03U, // UU VCH USER - Unit-to-Unit Voice Channel User + UU_ANS_REQ = 0x05U, // UU ANS REQ - Unit to Unit Answer Request + TEL_INT_VCH_USER = 0x06U, // TEL INT VCH USER - Telephone Interconnect Voice Channel User / MOT GPS DATA - Motorola In-Band GPS Data + TEL_INT_ANS_RQST = 0x07U, // TEL INT ANS RQST - Telephone Interconnect Answer Request + EXPLICIT_SOURCE_ID = 0x09U, // EXPLICIT SOURCE ID - Explicit Source ID + CALL_TERM = 0x0FU, // CALL TERM - Call Termination or Cancellation + IDEN_UP = 0x18U, // IDEN UP - Channel Identifier Update + SYS_SRV_BCAST = 0x20U, // SYS SRV BCAST - System Service Broadcast + ADJ_STS_BCAST = 0x22U, // ADJ STS BCAST - Adjacent Site Status Broadcast + RFSS_STS_BCAST = 0x23U, // RFSS STS BCAST - RFSS Status Broadcast + NET_STS_BCAST = 0x24U, // NET STS BCAST - Network Status Broadcast + CONV_FALLBACK = 0x2AU, // CONV FALLBACK - Conventional Fallback + + // LDUx/TDULC Motorola Link Control Opcode(s) + FAILSOFT = 0x02U // FAILSOFT - Failsoft + }; + } + + /// + /// TSBK Control Opcode(s) + /// + namespace TSBKO { + enum : uint8_t { + // TSBK ISP/OSP Shared Opcode(s) + IOSP_GRP_VCH = 0x00U, // GRP VCH REQ - Group Voice Channel Request (ISP), GRP VCH GRANT - Group Voice Channel Grant (OSP) + IOSP_UU_VCH = 0x04U, // UU VCH REQ - Unit-to-Unit Voice Channel Request (ISP), UU VCH GRANT - Unit-to-Unit Voice Channel Grant (OSP) + IOSP_UU_ANS = 0x05U, // UU ANS RSP - Unit-to-Unit Answer Response (ISP), UU ANS REQ - Unit-to-Unit Answer Request (OSP) + IOSP_TELE_INT_DIAL = 0x08U, // TELE INT DIAL REQ - Telephone Interconnect Request - Explicit (ISP), TELE INT DIAL GRANT - Telephone Interconnect Grant (OSP) + IOSP_TELE_INT_ANS = 0x0AU, // TELE INT ANS RSP - Telephone Interconnect Answer Response (ISP), TELE INT ANS REQ - Telephone Interconnect Answer Request (OSP) + IOSP_STS_UPDT = 0x18U, // STS UPDT REQ - Status Update Request (ISP), STS UPDT - Status Update (OSP) + IOSP_STS_Q = 0x1AU, // STS Q REQ - Status Query Request (ISP), STS Q - Status Query (OSP) + IOSP_MSG_UPDT = 0x1CU, // MSG UPDT REQ - Message Update Request (ISP), MSG UPDT - Message Update (OSP) + IOSP_RAD_MON = 0x1DU, // RAD MON REQ - Radio Unit Monitor Request (ISP), RAD MON CMD - Radio Monitor Command (OSP) + IOSP_RAD_MON_ENH = 0x1EU, // RAD MON ENH REQ - Radio Unit Monitor Enhanced Request (ISP), RAD MON ENH CMD - Radio Unit Monitor Enhanced Command (OSP) + IOSP_CALL_ALRT = 0x1FU, // CALL ALRT REQ - Call Alert Request (ISP), CALL ALRT - Call Alert (OSP) + IOSP_ACK_RSP = 0x20U, // ACK RSP U - Acknowledge Response - Unit (ISP), ACK RSP FNE - Acknowledge Response - FNE (OSP) + IOSP_EXT_FNCT = 0x24U, // EXT FNCT RSP - Extended Function Response (ISP), EXT FNCT CMD - Extended Function Command (OSP) + IOSP_GRP_AFF = 0x28U, // GRP AFF REQ - Group Affiliation Request (ISP), GRP AFF RSP - Group Affiliation Response (OSP) + IOSP_U_REG = 0x2CU, // U REG REQ - Unit Registration Request (ISP), U REG RSP - Unit Registration Response (OSP) + + // TSBK Inbound Signalling Packet (ISP) Opcode(s) + ISP_TELE_INT_PSTN_REQ = 0x09U, // TELE INT PSTN REQ - Telephone Interconnect Request - Implicit + ISP_SNDCP_CH_REQ = 0x12U, // SNDCP CH REQ - SNDCP Data Channel Request + ISP_STS_Q_RSP = 0x19U, // STS Q RSP - Status Query Response + ISP_STS_Q_REQ = 0x1CU, // STS Q REQ - Status Query Request + ISP_CAN_SRV_REQ = 0x23U, // CAN SRV REQ - Cancel Service Request + ISP_EMERG_ALRM_REQ = 0x27U, // EMERG ALRM REQ - Emergency Alarm Request + ISP_GRP_AFF_Q_RSP = 0x29U, // GRP AFF Q RSP - Group Affiliation Query Response + ISP_U_DEREG_REQ = 0x2BU, // U DE REG REQ - Unit De-Registration Request + ISP_LOC_REG_REQ = 0x2DU, // LOC REG REQ - Location Registration Request + ISP_AUTH_RESP = 0x38U, // AUTH RESP - Authentication Response + ISP_AUTH_RESP_M = 0x39U, // AUTH RESP M - Authentication Response Mutual + ISP_AUTH_FNE_RST = 0x3AU, // AUTH FNE RST - Authentication FNE Result + ISP_AUTH_SU_DMD = 0x3BU, // AUTH SU DMD - Authentication SU Demand + + // TSBK Outbound Signalling Packet (OSP) Opcode(s) + OSP_GRP_VCH_GRANT_UPD = 0x02U, // GRP VCH GRANT UPD - Group Voice Channel Grant Update + OSP_UU_VCH_GRANT_UPD = 0x06U, // UU VCH GRANT UPD - Unit-to-Unit Voice Channel Grant Update + OSP_SNDCP_CH_GNT = 0x14U, // SNDCP CH GNT - SNDCP Data Channel Grant + OSP_SNDCP_CH_ANN = 0x16U, // SNDCP CH ANN - SNDCP Data Channel Announcement + OSP_STS_Q = 0x1AU, // STS Q - Status Query + OSP_DENY_RSP = 0x27U, // DENY RSP - Deny Response + OSP_SCCB_EXP = 0x29U, // SCCB - Secondary Control Channel Broadcast - Explicit + OSP_GRP_AFF_Q = 0x2AU, // GRP AFF Q - Group Affiliation Query + OSP_LOC_REG_RSP = 0x2BU, // LOC REG RSP - Location Registration Response + OSP_U_REG_CMD = 0x2DU, // U REG CMD - Unit Registration Command + OSP_U_DEREG_ACK = 0x2FU, // U DE REG ACK - Unit De-Registration Acknowledge + OSP_SYNC_BCAST = 0x30U, // SYNC BCAST - Synchronization Broadcast + OSP_AUTH_DMD = 0x31U, // AUTH DMD - Authentication Demand + OSP_AUTH_FNE_RESP = 0x32U, // AUTH FNE RESP - Authentication FNE Response + OSP_QUE_RSP = 0x33U, // QUE RSP - Queued Response + OSP_IDEN_UP_VU = 0x34U, // IDEN UP VU - Channel Identifier Update for VHF/UHF Bands + OSP_TIME_DATE_ANN = 0x35U, // TIME DATE ANN - Time and Date Announcement + OSP_SYS_SRV_BCAST = 0x38U, // SYS SRV BCAST - System Service Broadcast + OSP_SCCB = 0x39U, // SCCB - Secondary Control Channel Broadcast + OSP_RFSS_STS_BCAST = 0x3AU, // RFSS STS BCAST - RFSS Status Broadcast + OSP_NET_STS_BCAST = 0x3BU, // NET STS BCAST - Network Status Broadcast + OSP_ADJ_STS_BCAST = 0x3CU, // ADJ STS BCAST - Adjacent Site Status Broadcast + OSP_IDEN_UP = 0x3DU, // IDEN UP - Channel Identifier Update + + // TSBK Motorola Outbound Signalling Packet (OSP) Opcode(s) + OSP_MOT_GRG_ADD = 0x00U, // MOT GRG ADD - Motorola / Group Regroup Add (Patch Supergroup) + OSP_MOT_GRG_DEL = 0x01U, // MOT GRG DEL - Motorola / Group Regroup Delete (Unpatch Supergroup) + OSP_MOT_GRG_VCH_GRANT = 0x02U, // MOT GRG GROUP VCH GRANT / Group Regroup Voice Channel Grant + OSP_MOT_GRG_VCH_UPD = 0x03U, // MOT GRG GROUP VCH GRANT UPD / Group Regroup Voice Channel Grant Update + OSP_MOT_CC_BSI = 0x0BU, // MOT CC BSI - Motorola / Control Channel Base Station Identifier + OSP_MOT_PSH_CCH = 0x0EU, // MOT PSH CCH - Motorola / Planned Control Channel Shutdown + + // TSBK DVM Outbound Signalling Packet (OSP) Opcode(s) + OSP_DVM_GIT_HASH = 0x3FU, // + }; + } + + /// + /// Data Unit ID(s) + /// + namespace DUID { + // Data Unit ID Enumeration + enum E : uint8_t { + HDU = 0x00U, // Header Data Unit + TDU = 0x03U, // Simple Terminator Data Unit + LDU1 = 0x05U, // Logical Link Data Unit 1 + VSELP1 = 0x06U, // Motorola VSELP 1 + TSDU = 0x07U, // Trunking System Data Unit + VSELP2 = 0x09U, // Motorola VSELP 2 + LDU2 = 0x0AU, // Logical Link Data Unit 2 + PDU = 0x0CU, // Packet Data Unit + TDULC = 0x0FU // Terminator Data Unit with Link Control + }; + } + + #define P25_HDU_STR "P25, HDU (Header Data Unit)" + #define P25_TDU_STR "P25, TDU (Simple Terminator Data Unit)" + #define P25_LDU1_STR "P25, LDU1 (Logical Link Data Unit 1)" + #define P25_VSELP1_STR "P25, VSELP1 (VSELP Data Unit 1)" + #define P25_TSDU_STR "P25, TSDU (Trunking System Data Unit)" + #define P25_VSELP2_STR "P25, VSELP2 (VSELP Data Unit 2)" + #define P25_LDU2_STR "P25, LDU2 (Logical Link Data Unit 2)" + #define P25_PDU_STR "P25, PDU (Packet Data Unit)" + #define P25_TDULC_STR "P25, TDULC (Terminator Data Unit with Link Control)" + } // namespace defines } // namespace p25 #endif // __P25_DEFINES_H__ diff --git a/src/common/p25/P25Utils.cpp b/src/common/p25/P25Utils.cpp index 8c42f626..36c69b7a 100644 --- a/src/common/p25/P25Utils.cpp +++ b/src/common/p25/P25Utils.cpp @@ -17,6 +17,7 @@ #include "Utils.h" using namespace p25; +using namespace p25::defines; #include diff --git a/src/common/p25/P25Utils.h b/src/common/p25/P25Utils.h index 11a906cb..cc7128d5 100644 --- a/src/common/p25/P25Utils.h +++ b/src/common/p25/P25Utils.h @@ -28,6 +28,8 @@ namespace p25 class HOST_SW_API P25Utils { public: /// Helper to test and clamp a P25 NAC. + /// Network Access Code + /// Clamped network access code. static uint32_t nac(uint32_t nac) { if (nac < 0U) { // clamp to $000 @@ -41,6 +43,8 @@ namespace p25 } /// Helper to test and clamp a P25 site ID. + /// Site ID + /// Clamped site ID. static uint8_t siteId(uint8_t id) { if (id == 0U) { // clamp to 1 @@ -54,6 +58,8 @@ namespace p25 } /// Helper to test and clamp a P25 network ID. + /// Network ID + /// Clamped network ID. static uint32_t netId(uint32_t id) { if (id == 0U) { // clamp to 1 @@ -67,6 +73,8 @@ namespace p25 } /// Helper to test and clamp a P25 system ID. + /// System ID + /// Clamped system ID. static uint32_t sysId(uint32_t id) { if (id == 0U) { // clamp to 1 @@ -80,6 +88,8 @@ namespace p25 } /// Helper to test and clamp a P25 RFSS ID. + /// RFSS ID + /// Clamped RFSS ID. static uint8_t rfssId(uint8_t id) { if (id == 0U) { // clamp to 1 diff --git a/src/common/p25/SiteData.h b/src/common/p25/SiteData.h index 3a9b9974..32424467 100644 --- a/src/common/p25/SiteData.h +++ b/src/common/p25/SiteData.h @@ -7,7 +7,7 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2018 Bryan Biedenkapp, N2PLL +* Copyright (C) 2018,2024 Bryan Biedenkapp, N2PLL * */ #if !defined(__P25_SITE_DATA_H__) @@ -31,13 +31,13 @@ namespace p25 /// Initializes a new instance of the SiteData class. SiteData() : m_lra(0U), - m_netId(P25_WACN_STD_DEFAULT), - m_sysId(P25_SID_STD_DEFAULT), + m_netId(defines::WACN_STD_DEFAULT), + m_sysId(defines::SID_STD_DEFAULT), m_rfssId(1U), m_siteId(1U), m_channelId(1U), m_channelNo(1U), - m_serviceClass(P25_SVC_CLS_VOICE | P25_SVC_CLS_DATA), + m_serviceClass(defines::ServiceClass::VOICE | defines::ServiceClass::DATA), m_isAdjSite(false), m_callsign("CHANGEME"), m_chCnt(0U), @@ -58,13 +58,13 @@ namespace p25 /// Local time offset. SiteData(uint32_t netId, uint32_t sysId, uint8_t rfssId, uint8_t siteId, uint8_t lra, uint8_t channelId, uint32_t channelNo, uint8_t serviceClass, int8_t lto) : m_lra(0U), - m_netId(P25_WACN_STD_DEFAULT), - m_sysId(P25_SID_STD_DEFAULT), + m_netId(defines::WACN_STD_DEFAULT), + m_sysId(defines::SID_STD_DEFAULT), m_rfssId(1U), m_siteId(1U), m_channelId(1U), m_channelNo(1U), - m_serviceClass(P25_SVC_CLS_VOICE | P25_SVC_CLS_DATA), + m_serviceClass(defines::ServiceClass::VOICE | defines::ServiceClass::DATA), m_isAdjSite(false), m_callsign("CHANGEME"), m_chCnt(0U), @@ -110,7 +110,7 @@ namespace p25 std::random_device rd; std::mt19937 mt(rd()); - std::uniform_int_distribution dist(0x01, P25_WACN_STD_DEFAULT); + std::uniform_int_distribution dist(0x01, defines::WACN_STD_DEFAULT); m_netId = dist(mt); // netId clamping diff --git a/src/common/p25/Sync.cpp b/src/common/p25/Sync.cpp index 5bbbed64..459a08e6 100644 --- a/src/common/p25/Sync.cpp +++ b/src/common/p25/Sync.cpp @@ -9,6 +9,7 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2015,2016 Jonathan Naylor, G4KLX +* Copyright (C) 2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -16,6 +17,7 @@ #include "p25/Sync.h" using namespace p25; +using namespace p25::defines; #include #include diff --git a/src/common/p25/data/DataBlock.cpp b/src/common/p25/data/DataBlock.cpp index 7da5d75e..a1339857 100644 --- a/src/common/p25/data/DataBlock.cpp +++ b/src/common/p25/data/DataBlock.cpp @@ -7,7 +7,7 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2018,2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2018,2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -17,8 +17,9 @@ #include "Log.h" #include "Utils.h" -using namespace p25::data; using namespace p25; +using namespace p25::defines; +using namespace p25::data; #include #include @@ -36,7 +37,7 @@ DataBlock::DataBlock() : m_llId(0U), m_sap(0U), m_trellis(), - m_fmt(PDU_FMT_CONFIRMED), + m_fmt(PDUFormatType::CONFIRMED), m_headerSap(0U), m_data(nullptr) { @@ -73,7 +74,7 @@ bool DataBlock::decode(const uint8_t* data, const DataHeader& header) m_lastBlock = false; m_llId = 0U; - if (m_fmt == PDU_FMT_CONFIRMED) { + if (m_fmt == PDUFormatType::CONFIRMED) { // decode 3/4 rate Trellis try { bool valid = m_trellis.decode34(data, buffer); @@ -92,7 +93,7 @@ bool DataBlock::decode(const uint8_t* data, const DataHeader& header) ::memset(m_data, 0x00U, P25_PDU_CONFIRMED_DATA_LENGTH_BYTES); // if this is extended addressing and the first block decode the SAP and LLId - if (m_headerSap == PDU_SAP_EXT_ADDR && m_serialNo == 0U) { + if (m_headerSap == PDUSAP::EXT_ADDR && m_serialNo == 0U) { m_sap = buffer[5U] & 0x3FU; // Service Access Point m_llId = (buffer[2U] << 16) + (buffer[3U] << 8) + buffer[4U]; // Logical Link ID @@ -118,11 +119,11 @@ bool DataBlock::decode(const uint8_t* data, const DataHeader& header) // compute CRC-9 for the packet uint16_t calculated = edac::CRC::createCRC9(crcBuffer, 135U); if ((crc ^ calculated) != 0) { - LogWarning(LOG_P25, "P25_DUID_PDU, fmt = $%02X, invalid crc = $%04X != $%04X (computed)", m_fmt, crc, calculated); + LogWarning(LOG_P25, "PDU, fmt = $%02X, invalid crc = $%04X != $%04X (computed)", m_fmt, crc, calculated); } #if DEBUG_P25_PDU_DATA - LogDebug(LOG_P25, "P25_DUID_PDU, fmt = $%02X, crc = $%04X, calculated = $%04X", m_fmt, crc, calculated); + LogDebug(LOG_P25, "PDU, fmt = $%02X, crc = $%04X, calculated = $%04X", m_fmt, crc, calculated); Utils::dump(1U, "P25, DataBlock::decode(), Confirmed PDU Block Data", m_data, P25_PDU_CONFIRMED_DATA_LENGTH_BYTES); #endif } @@ -131,7 +132,7 @@ bool DataBlock::decode(const uint8_t* data, const DataHeader& header) return false; } } - else if ((m_fmt == PDU_FMT_UNCONFIRMED) || (m_fmt == PDU_FMT_RSP) || (m_fmt == PDU_FMT_AMBT)) { + else if ((m_fmt == PDUFormatType::UNCONFIRMED) || (m_fmt == PDUFormatType::RSP) || (m_fmt == PDUFormatType::AMBT)) { // decode 1/2 rate Trellis try { bool valid = m_trellis.decode12(data, buffer); @@ -154,7 +155,7 @@ bool DataBlock::decode(const uint8_t* data, const DataHeader& header) } } else { - LogError(LOG_P25, "unknown FMT value in P25_DUID_PDU, fmt = $%02X", m_fmt); + LogError(LOG_P25, "unknown FMT value in PDU, fmt = $%02X", m_fmt); } return true; @@ -169,14 +170,14 @@ void DataBlock::encode(uint8_t* data) assert(data != nullptr); assert(m_data != nullptr); - if (m_fmt == PDU_FMT_CONFIRMED) { + if (m_fmt == PDUFormatType::CONFIRMED) { uint8_t buffer[P25_PDU_CONFIRMED_LENGTH_BYTES]; ::memset(buffer, 0x00U, P25_PDU_CONFIRMED_LENGTH_BYTES); buffer[0U] = ((m_serialNo << 1) & 0xFEU); // Confirmed Data Serial No. // if this is extended addressing and the first block decode the SAP and LLId - if (m_headerSap == PDU_SAP_EXT_ADDR && m_serialNo == 0U) { + if (m_headerSap == PDUSAP::EXT_ADDR && m_serialNo == 0U) { buffer[5U] = m_sap & 0x3FU; // Service Access Point buffer[2U] = (m_llId >> 16) & 0xFFU; // Logical Link ID @@ -212,7 +213,7 @@ void DataBlock::encode(uint8_t* data) m_trellis.encode34(buffer, data); } - else if (m_fmt == PDU_FMT_UNCONFIRMED || m_fmt == PDU_FMT_RSP || m_fmt == PDU_FMT_AMBT) { + else if (m_fmt == PDUFormatType::UNCONFIRMED || m_fmt == PDUFormatType::RSP || m_fmt == PDUFormatType::AMBT) { uint8_t buffer[P25_PDU_UNCONFIRMED_LENGTH_BYTES]; ::memset(buffer, 0x00U, P25_PDU_UNCONFIRMED_LENGTH_BYTES); @@ -225,7 +226,7 @@ void DataBlock::encode(uint8_t* data) m_trellis.encode12(buffer, data); } else { - LogError(LOG_P25, "unknown FMT value in P25_DUID_PDU, fmt = $%02X", m_fmt); + LogError(LOG_P25, "unknown FMT value in PDU, fmt = $%02X", m_fmt); return; } } @@ -266,14 +267,14 @@ void DataBlock::setData(const uint8_t* buffer) assert(buffer != nullptr); assert(m_data != nullptr); - if (m_fmt == PDU_FMT_CONFIRMED) { + if (m_fmt == PDUFormatType::CONFIRMED) { ::memcpy(m_data, buffer, P25_PDU_CONFIRMED_DATA_LENGTH_BYTES); } - else if (m_fmt == PDU_FMT_UNCONFIRMED || m_fmt == PDU_FMT_RSP || m_fmt == PDU_FMT_AMBT) { + else if (m_fmt == PDUFormatType::UNCONFIRMED || m_fmt == PDUFormatType::RSP || m_fmt == PDUFormatType::AMBT) { ::memcpy(m_data, buffer, P25_PDU_UNCONFIRMED_LENGTH_BYTES); } else { - LogError(LOG_P25, "unknown FMT value in P25_DUID_PDU, fmt = $%02X", m_fmt); + LogError(LOG_P25, "unknown FMT value in PDU, fmt = $%02X", m_fmt); } } @@ -286,16 +287,16 @@ uint32_t DataBlock::getData(uint8_t* buffer) const assert(buffer != nullptr); assert(m_data != nullptr); - if (m_fmt == PDU_FMT_CONFIRMED) { + if (m_fmt == PDUFormatType::CONFIRMED) { ::memcpy(buffer, m_data, P25_PDU_CONFIRMED_DATA_LENGTH_BYTES); return P25_PDU_CONFIRMED_DATA_LENGTH_BYTES; } - else if (m_fmt == PDU_FMT_UNCONFIRMED || m_fmt == PDU_FMT_RSP || m_fmt == PDU_FMT_AMBT) { + else if (m_fmt == PDUFormatType::UNCONFIRMED || m_fmt == PDUFormatType::RSP || m_fmt == PDUFormatType::AMBT) { ::memcpy(buffer, m_data, P25_PDU_UNCONFIRMED_LENGTH_BYTES); return P25_PDU_UNCONFIRMED_LENGTH_BYTES; } else { - LogError(LOG_P25, "unknown FMT value in P25_DUID_PDU, fmt = $%02X", m_fmt); + LogError(LOG_P25, "unknown FMT value in PDU, fmt = $%02X", m_fmt); return 0U; } } diff --git a/src/common/p25/data/DataHeader.cpp b/src/common/p25/data/DataHeader.cpp index d7515ff8..955e9963 100644 --- a/src/common/p25/data/DataHeader.cpp +++ b/src/common/p25/data/DataHeader.cpp @@ -7,7 +7,7 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2018,2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2018,2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -17,8 +17,9 @@ #include "Log.h" #include "Utils.h" -using namespace p25::data; using namespace p25; +using namespace p25::defines; +using namespace p25::data; #include #include @@ -43,9 +44,9 @@ bool DataHeader::m_warnCRC = false; DataHeader::DataHeader() : m_ackNeeded(false), m_outbound(false), - m_fmt(PDU_FMT_CONFIRMED), + m_fmt(PDUFormatType::CONFIRMED), m_sap(0U), - m_mfId(P25_MFG_STANDARD), + m_mfId(MFG_STANDARD), m_llId(0U), m_blocksToFollow(0U), m_padLength(0U), @@ -56,8 +57,8 @@ DataHeader::DataHeader() : m_lastFragment(true), m_headerOffset(0U), m_srcLlId(0U), - m_rspClass(PDU_ACK_CLASS_NACK), - m_rspType(PDU_ACK_TYPE_NACK_ILLEGAL), + m_rspClass(PDUAckClass::NACK), + m_rspType(PDUAckType::NACK_ILLEGAL), m_rspStatus(0U), m_ambtOpcode(0U), m_ambtField8(0U), @@ -136,12 +137,12 @@ bool DataHeader::decode(const uint8_t* data, bool noTrellis) m_blocksToFollow = m_data[6U] & 0x7FU; // Block Frames to Follow m_padLength = m_data[7U] & 0x1FU; // Pad Byte Count - if (m_fmt == PDU_FMT_RSP || m_fmt == PDU_FMT_AMBT) { + if (m_fmt == PDUFormatType::RSP || m_fmt == PDUFormatType::AMBT) { m_padLength = 0U; } switch (m_fmt) { - case PDU_FMT_CONFIRMED: + case PDUFormatType::CONFIRMED: m_S = (m_data[8U] & 0x80U) == 0x80U; // Re-synchronize Flag m_Ns = (m_data[8U] >> 4) & 0x07U; // Packet Sequence No. @@ -150,9 +151,9 @@ bool DataHeader::decode(const uint8_t* data, bool noTrellis) m_headerOffset = m_data[9U] & 0x3FU; // Data Header Offset break; - case PDU_FMT_RSP: + case PDUFormatType::RSP: m_ackNeeded = false; - m_sap = PDU_SAP_USER_DATA; + m_sap = PDUSAP::USER_DATA; m_rspClass = (m_data[1U] >> 6) & 0x03U; // Response Class m_rspType = (m_data[1U] >> 3) & 0x07U; // Response Type m_rspStatus = m_data[1U] & 0x07U; // Response Status @@ -160,12 +161,12 @@ bool DataHeader::decode(const uint8_t* data, bool noTrellis) m_srcLlId = (m_data[7U] << 16) + (m_data[8U] << 8) + m_data[9U]; // Source Logical Link ID } break; - case PDU_FMT_AMBT: + case PDUFormatType::AMBT: m_ambtOpcode = m_data[7U] & 0x3FU; // AMBT Opcode m_ambtField8 = m_data[8U]; // AMBT Field 8 m_ambtField9 = m_data[9U]; // AMBT Field 9 // fall-thru - case PDU_FMT_UNCONFIRMED: + case PDUFormatType::UNCONFIRMED: default: m_ackNeeded = false; m_S = false; @@ -190,12 +191,12 @@ void DataHeader::encode(uint8_t* data, bool noTrellis) uint8_t header[P25_PDU_HEADER_LENGTH_BYTES]; ::memset(header, 0x00U, P25_PDU_HEADER_LENGTH_BYTES); - if (m_fmt == PDU_FMT_UNCONFIRMED || m_fmt == PDU_FMT_RSP) { + if (m_fmt == PDUFormatType::UNCONFIRMED || m_fmt == PDUFormatType::RSP) { m_ackNeeded = false; } - if (m_fmt == PDU_FMT_CONFIRMED && !m_ackNeeded) { - LogWarning(LOG_P25, "DataHeader::encode(), invalid values for PDU_FMT_CONFIRMED, ackNeeded = %u", m_ackNeeded); + if (m_fmt == PDUFormatType::CONFIRMED && !m_ackNeeded) { + LogWarning(LOG_P25, "DataHeader::encode(), invalid values for confirmed PDU, ackNeeded = %u", m_ackNeeded); m_ackNeeded = true; // force set this to true } @@ -216,7 +217,7 @@ void DataHeader::encode(uint8_t* data, bool noTrellis) (m_blocksToFollow & 0x7FU); // Blocks Frames to Follow switch (m_fmt) { - case PDU_FMT_CONFIRMED: + case PDUFormatType::CONFIRMED: header[7U] = (m_padLength & 0x1FU); // Pad Byte Count header[8U] = (m_S ? 0x80U : 0x00U) + // Re-synchronize Flag ((m_Ns & 0x07U) << 4) + // Packet Sequence No. @@ -225,7 +226,7 @@ void DataHeader::encode(uint8_t* data, bool noTrellis) header[9U] = m_headerOffset & 0x3FU; // Data Header Offset break; - case PDU_FMT_RSP: + case PDUFormatType::RSP: header[1U] = ((m_rspClass & 0x03U) << 6) + // Response Class ((m_rspType & 0x07U) << 3) + // Response Type ((m_rspStatus & 0x07U)); // Response Status @@ -235,12 +236,12 @@ void DataHeader::encode(uint8_t* data, bool noTrellis) header[9U] = (m_srcLlId >> 0) & 0xFFU; } break; - case PDU_FMT_AMBT: + case PDUFormatType::AMBT: header[7U] = (m_ambtOpcode & 0x3FU); // AMBT Opcode header[8U] = m_ambtField8; // AMBT Field 8 header[9U] = m_ambtField9; // AMBT Field 9 break; - case PDU_FMT_UNCONFIRMED: + case PDUFormatType::UNCONFIRMED: default: header[7U] = (m_padLength & 0x1FU); // Pad Byte Count header[8U] = 0x00U; @@ -271,10 +272,10 @@ void DataHeader::reset() m_ackNeeded = false; m_outbound = false; - m_fmt = PDU_FMT_CONFIRMED; + m_fmt = PDUFormatType::CONFIRMED; - m_sap = PDU_SAP_USER_DATA; - m_mfId = P25_MFG_STANDARD; + m_sap = PDUSAP::USER_DATA; + m_mfId = MFG_STANDARD; m_llId = 0U; m_F = true; @@ -290,8 +291,8 @@ void DataHeader::reset() m_headerOffset = 0U; m_srcLlId = 0U; - m_rspClass = PDU_ACK_CLASS_NACK; - m_rspType = PDU_ACK_TYPE_NACK_ILLEGAL; + m_rspClass = PDUAckClass::NACK; + m_rspType = PDUAckType::NACK_ILLEGAL; m_rspStatus = 0U; m_ambtOpcode = 0U; @@ -307,7 +308,7 @@ void DataHeader::reset() /// uint32_t DataHeader::getPacketLength() const { - if (m_fmt == PDU_FMT_CONFIRMED) { + if (m_fmt == PDUFormatType::CONFIRMED) { return P25_PDU_CONFIRMED_DATA_LENGTH_BYTES * m_blocksToFollow - 4 - m_padLength; } else { @@ -336,7 +337,7 @@ uint32_t DataHeader::getData(uint8_t* buffer) const uint32_t DataHeader::calculatePadLength(uint8_t fmt, uint32_t packetLength) { uint32_t len = packetLength + 4; - if (fmt == PDU_FMT_CONFIRMED) { + if (fmt == PDUFormatType::CONFIRMED) { return P25_PDU_CONFIRMED_DATA_LENGTH_BYTES - (len % P25_PDU_CONFIRMED_DATA_LENGTH_BYTES); } else { diff --git a/src/common/p25/data/LowSpeedData.cpp b/src/common/p25/data/LowSpeedData.cpp index ff5a4b2d..0a97d2ae 100644 --- a/src/common/p25/data/LowSpeedData.cpp +++ b/src/common/p25/data/LowSpeedData.cpp @@ -16,8 +16,8 @@ #include "p25/data/LowSpeedData.h" #include "p25/P25Utils.h" -using namespace p25::data; using namespace p25; +using namespace p25::data; #include diff --git a/src/common/p25/dfsi/DFSIDefines.h b/src/common/p25/dfsi/DFSIDefines.h index cfdfd784..8d41de2a 100644 --- a/src/common/p25/dfsi/DFSIDefines.h +++ b/src/common/p25/dfsi/DFSIDefines.h @@ -10,93 +10,105 @@ * Copyright (C) 2022-2024 Bryan Biedenkapp, N2PLL * */ -#if !defined(__P25_DFSI_DEFINES_H__) -#define __P25_DFSI_DEFINES_H__ +#if !defined(__DFSI_DEFINES_H__) +#define __DFSI_DEFINES_H__ #include "common/Defines.h" // Frame Type String(s) -#define P25_DFSI_SS_STR "P25_DFSI_START_STOP (Start/Stop)" -#define P25_DFSI_VHDR1_STR "P25_DFSI_VHDR1 (Voice Header 1)" -#define P25_DFSI_VHDR2_STR "P25_DFSI_VHDR2 (Voice Header 2)" -#define P25_DFSI_LDU1_STR "P25_DFSI_LDU1 (Logical Link Data Unit 1)" -#define P25_DFSI_LDU2_STR "P25_DFSI_LDU2 (Logical Link Data Unit 2)" -#define P25_DFSI_TSBK_STR "P25_DFSI_TSBK (Trunking System Block)" - +#define P25_DFSI_SS_STR "P25, DFSI_START_STOP (Start/Stop)" +#define P25_DFSI_VHDR1_STR "P25, DFSI_VHDR1 (Voice Header 1)" +#define P25_DFSI_VHDR2_STR "P25, DFSI_VHDR2 (Voice Header 2)" +#define P25_DFSI_LDU1_STR "P25, DFSI_LDU1 (Logical Link Data Unit 1)" +#define P25_DFSI_LDU2_STR "P25, DFSI_LDU2 (Logical Link Data Unit 2)" +#define P25_DFSI_TSBK_STR "P25, DFSI_TSBK (Trunking System Block)" + +// Shorthand macro to p25::dfsi::defines -- keeps source code that doesn't use "using" concise +#define P25DFSIDEF p25::dfsi::defines namespace p25 { namespace dfsi { - // --------------------------------------------------------------------------- - // Constants - // --------------------------------------------------------------------------- - - const uint8_t P25_DFSI_STATUS_NO_ERROR = 0x00; // - const uint8_t P25_DFSI_STATUS_ERASE = 0x02; // - - const uint8_t P25_DFSI_RT_ENABLED = 0x02; // - const uint8_t P25_DFSI_RT_DISABLED = 0x04; // - - const uint8_t P25_DFSI_START_FLAG = 0x0C; // - const uint8_t P25_DFSI_STOP_FLAG = 0x25; // - - const uint8_t P25_DFSI_TYPE_DATA_PAYLOAD = 0x06; // - const uint8_t P25_DFSI_TYPE_VOICE = 0x0B; // - - const uint8_t P25_DFSI_DEF_ICW_SOURCE = 0x00; // Infrastructure Source - Default Source - const uint8_t P25_DFSI_DEF_SOURCE = 0x00; // - - const uint8_t P25_DFSI_MOT_START_STOP = 0x00; // Motorola Start/Stop Frame - - const uint32_t P25_DFSI_VHDR_RAW_LEN = 36U; - const uint32_t P25_DFSI_VHDR_LEN = 27U; - - const uint32_t P25_DFSI_LDU1_VOICE1_FRAME_LENGTH_BYTES = 22U; - const uint32_t P25_DFSI_LDU1_VOICE2_FRAME_LENGTH_BYTES = 14U; - const uint32_t P25_DFSI_LDU1_VOICE3_FRAME_LENGTH_BYTES = 17U; - const uint32_t P25_DFSI_LDU1_VOICE4_FRAME_LENGTH_BYTES = 17U; - const uint32_t P25_DFSI_LDU1_VOICE5_FRAME_LENGTH_BYTES = 17U; - const uint32_t P25_DFSI_LDU1_VOICE6_FRAME_LENGTH_BYTES = 17U; - const uint32_t P25_DFSI_LDU1_VOICE7_FRAME_LENGTH_BYTES = 17U; - const uint32_t P25_DFSI_LDU1_VOICE8_FRAME_LENGTH_BYTES = 17U; - const uint32_t P25_DFSI_LDU1_VOICE9_FRAME_LENGTH_BYTES = 16U; - - const uint32_t P25_DFSI_LDU2_VOICE10_FRAME_LENGTH_BYTES = 22U; - const uint32_t P25_DFSI_LDU2_VOICE11_FRAME_LENGTH_BYTES = 14U; - const uint32_t P25_DFSI_LDU2_VOICE12_FRAME_LENGTH_BYTES = 17U; - const uint32_t P25_DFSI_LDU2_VOICE13_FRAME_LENGTH_BYTES = 17U; - const uint32_t P25_DFSI_LDU2_VOICE14_FRAME_LENGTH_BYTES = 17U; - const uint32_t P25_DFSI_LDU2_VOICE15_FRAME_LENGTH_BYTES = 17U; - const uint32_t P25_DFSI_LDU2_VOICE16_FRAME_LENGTH_BYTES = 17U; - const uint32_t P25_DFSI_LDU2_VOICE17_FRAME_LENGTH_BYTES = 17U; - const uint32_t P25_DFSI_LDU2_VOICE18_FRAME_LENGTH_BYTES = 16U; - - // Frame Type(s) - const uint8_t P25_DFSI_MOT_VHDR_1 = 0x60; // Motorola Voice Header 1 - const uint8_t P25_DFSI_MOT_VHDR_2 = 0x61; // Motorola Voice Header 2 - - const uint8_t P25_DFSI_LDU1_VOICE1 = 0x62U; // IMBE LDU1 - Voice 1 - const uint8_t P25_DFSI_LDU1_VOICE2 = 0x63U; // IMBE LDU1 - Voice 2 - const uint8_t P25_DFSI_LDU1_VOICE3 = 0x64U; // IMBE LDU1 - Voice 3 + Link Control - const uint8_t P25_DFSI_LDU1_VOICE4 = 0x65U; // IMBE LDU1 - Voice 4 + Link Control - const uint8_t P25_DFSI_LDU1_VOICE5 = 0x66U; // IMBE LDU1 - Voice 5 + Link Control - const uint8_t P25_DFSI_LDU1_VOICE6 = 0x67U; // IMBE LDU1 - Voice 6 + Link Control - const uint8_t P25_DFSI_LDU1_VOICE7 = 0x68U; // IMBE LDU1 - Voice 7 + Link Control - const uint8_t P25_DFSI_LDU1_VOICE8 = 0x69U; // IMBE LDU1 - Voice 8 + Link Control - const uint8_t P25_DFSI_LDU1_VOICE9 = 0x6AU; // IMBE LDU1 - Voice 9 + Low Speed Data - - const uint8_t P25_DFSI_LDU2_VOICE10 = 0x6BU; // IMBE LDU2 - Voice 10 - const uint8_t P25_DFSI_LDU2_VOICE11 = 0x6CU; // IMBE LDU2 - Voice 11 - const uint8_t P25_DFSI_LDU2_VOICE12 = 0x6DU; // IMBE LDU2 - Voice 12 + Encryption Sync - const uint8_t P25_DFSI_LDU2_VOICE13 = 0x6EU; // IMBE LDU2 - Voice 13 + Encryption Sync - const uint8_t P25_DFSI_LDU2_VOICE14 = 0x6FU; // IMBE LDU2 - Voice 14 + Encryption Sync - const uint8_t P25_DFSI_LDU2_VOICE15 = 0x70U; // IMBE LDU2 - Voice 15 + Encryption Sync - const uint8_t P25_DFSI_LDU2_VOICE16 = 0x71U; // IMBE LDU2 - Voice 16 + Encryption Sync - const uint8_t P25_DFSI_LDU2_VOICE17 = 0x72U; // IMBE LDU2 - Voice 17 + Encryption Sync - const uint8_t P25_DFSI_LDU2_VOICE18 = 0x73U; // IMBE LDU2 - Voice 18 + Low Speed Data - - const uint8_t P25_DFSI_TSBK = 0xA1U; // TSBK + namespace defines + { + // --------------------------------------------------------------------------- + // Constants + // --------------------------------------------------------------------------- + + const uint8_t DFSI_STATUS_NO_ERROR = 0x00U; // + const uint8_t DFSI_STATUS_ERASE = 0x02U; // + + const uint8_t DFSI_RT_ENABLED = 0x02U; // + const uint8_t DFSI_RT_DISABLED = 0x04U; // + + const uint8_t DFSI_START_FLAG = 0x0CU; // + const uint8_t DFSI_STOP_FLAG = 0x25U; // + + const uint8_t DFSI_TYPE_DATA_PAYLOAD = 0x06U; // + const uint8_t DFSI_TYPE_VOICE = 0x0BU; // + + const uint8_t DFSI_DEF_ICW_SOURCE = 0x00U; // Infrastructure Source - Default Source + const uint8_t DFSI_DEF_SOURCE = 0x00U; // + + const uint32_t DFSI_VHDR_RAW_LEN = 36U; + const uint32_t DFSI_VHDR_LEN = 27U; + + const uint32_t DFSI_LDU1_VOICE1_FRAME_LENGTH_BYTES = 22U; + const uint32_t DFSI_LDU1_VOICE2_FRAME_LENGTH_BYTES = 14U; + const uint32_t DFSI_LDU1_VOICE3_FRAME_LENGTH_BYTES = 17U; + const uint32_t DFSI_LDU1_VOICE4_FRAME_LENGTH_BYTES = 17U; + const uint32_t DFSI_LDU1_VOICE5_FRAME_LENGTH_BYTES = 17U; + const uint32_t DFSI_LDU1_VOICE6_FRAME_LENGTH_BYTES = 17U; + const uint32_t DFSI_LDU1_VOICE7_FRAME_LENGTH_BYTES = 17U; + const uint32_t DFSI_LDU1_VOICE8_FRAME_LENGTH_BYTES = 17U; + const uint32_t DFSI_LDU1_VOICE9_FRAME_LENGTH_BYTES = 16U; + + const uint32_t DFSI_LDU2_VOICE10_FRAME_LENGTH_BYTES = 22U; + const uint32_t DFSI_LDU2_VOICE11_FRAME_LENGTH_BYTES = 14U; + const uint32_t DFSI_LDU2_VOICE12_FRAME_LENGTH_BYTES = 17U; + const uint32_t DFSI_LDU2_VOICE13_FRAME_LENGTH_BYTES = 17U; + const uint32_t DFSI_LDU2_VOICE14_FRAME_LENGTH_BYTES = 17U; + const uint32_t DFSI_LDU2_VOICE15_FRAME_LENGTH_BYTES = 17U; + const uint32_t DFSI_LDU2_VOICE16_FRAME_LENGTH_BYTES = 17U; + const uint32_t DFSI_LDU2_VOICE17_FRAME_LENGTH_BYTES = 17U; + const uint32_t DFSI_LDU2_VOICE18_FRAME_LENGTH_BYTES = 16U; + + /// + /// Frame Type + /// + namespace DFSIFrameType { + // DFSI Frame Type + enum E : uint8_t { + MOT_START_STOP = 0x00U, // Motorola Start/Stop + + MOT_VHDR_1 = 0x60U, // Motorola Voice Header 1 + MOT_VHDR_2 = 0x61U, // Motorola Voice Header 2 + + LDU1_VOICE1 = 0x62U, // IMBE LDU1 - Voice 1 + LDU1_VOICE2 = 0x63U, // IMBE LDU1 - Voice 2 + LDU1_VOICE3 = 0x64U, // IMBE LDU1 - Voice 3 + Link Control + LDU1_VOICE4 = 0x65U, // IMBE LDU1 - Voice 4 + Link Control + LDU1_VOICE5 = 0x66U, // IMBE LDU1 - Voice 5 + Link Control + LDU1_VOICE6 = 0x67U, // IMBE LDU1 - Voice 6 + Link Control + LDU1_VOICE7 = 0x68U, // IMBE LDU1 - Voice 7 + Link Control + LDU1_VOICE8 = 0x69U, // IMBE LDU1 - Voice 8 + Link Control + LDU1_VOICE9 = 0x6AU, // IMBE LDU1 - Voice 9 + Low Speed Data + + LDU2_VOICE10 = 0x6BU, // IMBE LDU2 - Voice 10 + LDU2_VOICE11 = 0x6CU, // IMBE LDU2 - Voice 11 + LDU2_VOICE12 = 0x6DU, // IMBE LDU2 - Voice 12 + Encryption Sync + LDU2_VOICE13 = 0x6EU, // IMBE LDU2 - Voice 13 + Encryption Sync + LDU2_VOICE14 = 0x6FU, // IMBE LDU2 - Voice 14 + Encryption Sync + LDU2_VOICE15 = 0x70U, // IMBE LDU2 - Voice 15 + Encryption Sync + LDU2_VOICE16 = 0x71U, // IMBE LDU2 - Voice 16 + Encryption Sync + LDU2_VOICE17 = 0x72U, // IMBE LDU2 - Voice 17 + Encryption Sync + LDU2_VOICE18 = 0x73U, // IMBE LDU2 - Voice 18 + Low Speed Data + + TSBK = 0xA1U // TSBK + }; + } + } // namespace defines } // namespace dfsi } // namespace p25 -#endif // __P25_DFSI_DEFINES_H__ +#endif // __DFSI_DEFINES_H__ diff --git a/src/common/p25/dfsi/LC.cpp b/src/common/p25/dfsi/LC.cpp index bef01cb8..77688e91 100644 --- a/src/common/p25/dfsi/LC.cpp +++ b/src/common/p25/dfsi/LC.cpp @@ -7,7 +7,7 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -17,8 +17,10 @@ #include "Log.h" #include "Utils.h" -using namespace p25::dfsi; using namespace p25; +using namespace p25::defines; +using namespace p25::dfsi; +using namespace p25::dfsi::defines; #include #include @@ -37,8 +39,8 @@ LC::LC() : m_rs(), m_mi(nullptr) { - m_mi = new uint8_t[P25_MI_LENGTH_BYTES]; - ::memset(m_mi, 0x00U, P25_MI_LENGTH_BYTES); + m_mi = new uint8_t[MI_LENGTH_BYTES]; + ::memset(m_mi, 0x00U, MI_LENGTH_BYTES); m_control = new lc::LC(); m_lsd = new data::LowSpeedData(); @@ -118,7 +120,7 @@ bool LC::decodeLDU1(const uint8_t* data, uint8_t* imbe) // different frame types mean different things switch (m_frameType) { - case P25_DFSI_LDU1_VOICE1: + case DFSIFrameType::LDU1_VOICE1: { if (m_control != nullptr) { delete m_control; @@ -130,15 +132,15 @@ bool LC::decodeLDU1(const uint8_t* data, uint8_t* imbe) } m_rssi = data[6U]; // RSSI - ::memcpy(imbe, data + 10U, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(imbe, data + 10U, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU1_VOICE2: + case DFSIFrameType::LDU1_VOICE2: { - ::memcpy(imbe, data + 1U, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(imbe, data + 1U, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU1_VOICE3: + case DFSIFrameType::LDU1_VOICE3: { m_control->setLCO(data[1U]); // LCO m_control->setMFId(data[2U]); // MFId @@ -146,48 +148,48 @@ bool LC::decodeLDU1(const uint8_t* data, uint8_t* imbe) m_control->setEmergency((serviceOptions & 0x80U) == 0x80U); m_control->setEncrypted((serviceOptions & 0x40U) == 0x40U); m_control->setPriority((serviceOptions & 0x07U)); - ::memcpy(imbe, data + 5U, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(imbe, data + 5U, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU1_VOICE4: + case DFSIFrameType::LDU1_VOICE4: { uint32_t dstId = (data[1U] << 16) | (data[2U] << 8) | (data[3U] << 0); m_control->setDstId(dstId); // Talkgroup Address - ::memcpy(imbe, data + 5U, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(imbe, data + 5U, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU1_VOICE5: + case DFSIFrameType::LDU1_VOICE5: { uint32_t srcId = (data[1U] << 16) | (data[2U] << 8) | (data[3U] << 0); m_control->setSrcId(srcId); // Source Address - ::memcpy(imbe, data + 5U, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(imbe, data + 5U, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU1_VOICE6: + case DFSIFrameType::LDU1_VOICE6: { - ::memcpy(imbe, data + 5U, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(imbe, data + 5U, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU1_VOICE7: + case DFSIFrameType::LDU1_VOICE7: { - ::memcpy(imbe, data + 5U, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(imbe, data + 5U, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU1_VOICE8: + case DFSIFrameType::LDU1_VOICE8: { - ::memcpy(imbe, data + 5U, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(imbe, data + 5U, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU1_VOICE9: + case DFSIFrameType::LDU1_VOICE9: { m_lsd->setLSD1(data[1U]); // LSD MSB m_lsd->setLSD2(data[2U]); // LSD LSB - ::memcpy(imbe, data + 4U, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(imbe, data + 4U, RAW_IMBE_LENGTH_BYTES); // IMBE } break; default: { - LogError(LOG_P25, "LC::decodeLDU1(), invalid frametype, frameType = $%02X", m_frameType); + LogError(LOG_P25, "LC::decodeLDU1(), invalid frame type, frameType = $%02X", m_frameType); return false; } break; @@ -213,39 +215,39 @@ void LC::encodeLDU1(uint8_t* data, const uint8_t* imbe) (m_control->getPriority() & 0x07U); // determine the LDU1 DFSI frame length, its variable - uint32_t frameLength = P25_DFSI_LDU1_VOICE1_FRAME_LENGTH_BYTES; + uint32_t frameLength = DFSI_LDU1_VOICE1_FRAME_LENGTH_BYTES; switch (m_frameType) { - case P25_DFSI_LDU1_VOICE1: - frameLength = P25_DFSI_LDU1_VOICE1_FRAME_LENGTH_BYTES; + case DFSIFrameType::LDU1_VOICE1: + frameLength = DFSI_LDU1_VOICE1_FRAME_LENGTH_BYTES; break; - case P25_DFSI_LDU1_VOICE2: - frameLength = P25_DFSI_LDU1_VOICE2_FRAME_LENGTH_BYTES; + case DFSIFrameType::LDU1_VOICE2: + frameLength = DFSI_LDU1_VOICE2_FRAME_LENGTH_BYTES; break; - case P25_DFSI_LDU1_VOICE3: - frameLength = P25_DFSI_LDU1_VOICE3_FRAME_LENGTH_BYTES; + case DFSIFrameType::LDU1_VOICE3: + frameLength = DFSI_LDU1_VOICE3_FRAME_LENGTH_BYTES; break; - case P25_DFSI_LDU1_VOICE4: - frameLength = P25_DFSI_LDU1_VOICE4_FRAME_LENGTH_BYTES; + case DFSIFrameType::LDU1_VOICE4: + frameLength = DFSI_LDU1_VOICE4_FRAME_LENGTH_BYTES; break; - case P25_DFSI_LDU1_VOICE5: - frameLength = P25_DFSI_LDU1_VOICE5_FRAME_LENGTH_BYTES; + case DFSIFrameType::LDU1_VOICE5: + frameLength = DFSI_LDU1_VOICE5_FRAME_LENGTH_BYTES; break; - case P25_DFSI_LDU1_VOICE6: - frameLength = P25_DFSI_LDU1_VOICE6_FRAME_LENGTH_BYTES; + case DFSIFrameType::LDU1_VOICE6: + frameLength = DFSI_LDU1_VOICE6_FRAME_LENGTH_BYTES; break; - case P25_DFSI_LDU1_VOICE7: - frameLength = P25_DFSI_LDU1_VOICE7_FRAME_LENGTH_BYTES; + case DFSIFrameType::LDU1_VOICE7: + frameLength = DFSI_LDU1_VOICE7_FRAME_LENGTH_BYTES; break; - case P25_DFSI_LDU1_VOICE8: - frameLength = P25_DFSI_LDU1_VOICE8_FRAME_LENGTH_BYTES; + case DFSIFrameType::LDU1_VOICE8: + frameLength = DFSI_LDU1_VOICE8_FRAME_LENGTH_BYTES; break; - case P25_DFSI_LDU1_VOICE9: - frameLength = P25_DFSI_LDU1_VOICE9_FRAME_LENGTH_BYTES; + case DFSIFrameType::LDU1_VOICE9: + frameLength = DFSI_LDU1_VOICE9_FRAME_LENGTH_BYTES; break; default: { - LogError(LOG_P25, "LC::encodeLDU1(), invalid frametype, frameType = $%02X", m_frameType); + LogError(LOG_P25, "LC::encodeLDU1(), invalid frame type, frameType = $%02X", m_frameType); return; } break; @@ -276,72 +278,72 @@ void LC::encodeLDU1(uint8_t* data, const uint8_t* imbe) // different frame types mean different things switch (m_frameType) { - case P25_DFSI_LDU1_VOICE2: + case DFSIFrameType::LDU1_VOICE2: { - ::memcpy(dfsiFrame + 1U, imbe, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(dfsiFrame + 1U, imbe, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU1_VOICE3: + case DFSIFrameType::LDU1_VOICE3: { dfsiFrame[1U] = rs[0U]; // LCO dfsiFrame[2U] = rs[1U]; // MFId dfsiFrame[3U] = rs[2U]; // Service Options - ::memcpy(dfsiFrame + 5U, imbe, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(dfsiFrame + 5U, imbe, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU1_VOICE4: + case DFSIFrameType::LDU1_VOICE4: { dfsiFrame[1U] = rs[3U]; // Target Address dfsiFrame[2U] = rs[4U]; dfsiFrame[3U] = rs[5U]; - ::memcpy(dfsiFrame + 5U, imbe, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(dfsiFrame + 5U, imbe, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU1_VOICE5: + case DFSIFrameType::LDU1_VOICE5: { dfsiFrame[1U] = rs[6U]; // Source Address dfsiFrame[2U] = rs[7U]; dfsiFrame[3U] = rs[8U]; - ::memcpy(dfsiFrame + 5U, imbe, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(dfsiFrame + 5U, imbe, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU1_VOICE6: + case DFSIFrameType::LDU1_VOICE6: { dfsiFrame[1U] = rs[9U]; // RS (24,12,13) dfsiFrame[2U] = rs[10U]; // RS (24,12,13) dfsiFrame[3U] = rs[11U]; // RS (24,12,13) - ::memcpy(dfsiFrame + 5U, imbe, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(dfsiFrame + 5U, imbe, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU1_VOICE7: + case DFSIFrameType::LDU1_VOICE7: { dfsiFrame[1U] = rs[12U]; // RS (24,12,13) dfsiFrame[2U] = rs[13U]; // RS (24,12,13) dfsiFrame[3U] = rs[14U]; // RS (24,12,13) - ::memcpy(dfsiFrame + 5U, imbe, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(dfsiFrame + 5U, imbe, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU1_VOICE8: + case DFSIFrameType::LDU1_VOICE8: { dfsiFrame[1U] = rs[15U]; // RS (24,12,13) dfsiFrame[2U] = rs[16U]; // RS (24,12,13) dfsiFrame[3U] = rs[17U]; // RS (24,12,13) - ::memcpy(dfsiFrame + 5U, imbe, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(dfsiFrame + 5U, imbe, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU1_VOICE9: + case DFSIFrameType::LDU1_VOICE9: { dfsiFrame[1U] = m_lsd->getLSD1(); // LSD MSB dfsiFrame[2U] = m_lsd->getLSD2(); // LSD LSB - ::memcpy(dfsiFrame + 4U, imbe, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(dfsiFrame + 4U, imbe, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU1_VOICE1: + case DFSIFrameType::LDU1_VOICE1: default: { dfsiFrame[6U] = m_rssi; // RSSI - ::memcpy(dfsiFrame + 10U, imbe, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(dfsiFrame + 10U, imbe, RAW_IMBE_LENGTH_BYTES); // IMBE } break; } @@ -371,76 +373,76 @@ bool LC::decodeLDU2(const uint8_t* data, uint8_t* imbe) // different frame types mean different things switch (m_frameType) { - case P25_DFSI_LDU2_VOICE10: + case DFSIFrameType::LDU2_VOICE10: { - ::memset(m_mi, 0x00U, P25_MI_LENGTH_BYTES); + ::memset(m_mi, 0x00U, MI_LENGTH_BYTES); if (m_lsd != nullptr) { delete m_lsd; } m_lsd = new data::LowSpeedData(); m_rssi = data[6U]; // RSSI - ::memcpy(imbe, data + 10U, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(imbe, data + 10U, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU2_VOICE11: + case DFSIFrameType::LDU2_VOICE11: { - ::memcpy(imbe, data + 1U, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(imbe, data + 1U, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU2_VOICE12: + case DFSIFrameType::LDU2_VOICE12: { m_mi[0U] = data[1U]; // Message Indicator m_mi[1U] = data[2U]; m_mi[2U] = data[3U]; - ::memcpy(imbe, data + 5U, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(imbe, data + 5U, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU2_VOICE13: + case DFSIFrameType::LDU2_VOICE13: { m_mi[3U] = data[1U]; // Message Indicator m_mi[4U] = data[2U]; m_mi[5U] = data[3U]; - ::memcpy(imbe, data + 5U, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(imbe, data + 5U, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU2_VOICE14: + case DFSIFrameType::LDU2_VOICE14: { m_mi[6U] = data[1U]; // Message Indicator m_mi[7U] = data[2U]; m_mi[8U] = data[3U]; m_control->setMI(m_mi); - ::memcpy(imbe, data + 5U, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(imbe, data + 5U, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU2_VOICE15: + case DFSIFrameType::LDU2_VOICE15: { m_control->setAlgId(data[1U]); // Algorithm ID uint32_t kid = (data[2U] << 8) | (data[3U] << 0); // Key ID m_control->setKId(kid); - ::memcpy(imbe, data + 5U, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(imbe, data + 5U, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU2_VOICE16: + case DFSIFrameType::LDU2_VOICE16: { - ::memcpy(imbe, data + 5U, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(imbe, data + 5U, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU2_VOICE17: + case DFSIFrameType::LDU2_VOICE17: { - ::memcpy(imbe, data + 5U, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(imbe, data + 5U, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU2_VOICE18: + case DFSIFrameType::LDU2_VOICE18: { m_lsd->setLSD1(data[1U]); // LSD MSB m_lsd->setLSD2(data[2U]); // LSD LSB - ::memcpy(imbe, data + 4U, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(imbe, data + 4U, RAW_IMBE_LENGTH_BYTES); // IMBE } break; default: { - LogError(LOG_P25, "LC::decodeLDU2(), invalid frametype, frameType = $%02X", m_frameType); + LogError(LOG_P25, "LC::decodeLDU2(), invalid frame type, frameType = $%02X", m_frameType); return false; } break; @@ -461,44 +463,44 @@ void LC::encodeLDU2(uint8_t* data, const uint8_t* imbe) assert(m_control != nullptr); // generate MI data - uint8_t mi[P25_MI_LENGTH_BYTES]; - ::memset(mi, 0x00U, P25_MI_LENGTH_BYTES); + uint8_t mi[MI_LENGTH_BYTES]; + ::memset(mi, 0x00U, MI_LENGTH_BYTES); m_control->getMI(mi); // determine the LDU2 DFSI frame length, its variable - uint32_t frameLength = P25_DFSI_LDU2_VOICE10_FRAME_LENGTH_BYTES; + uint32_t frameLength = DFSI_LDU2_VOICE10_FRAME_LENGTH_BYTES; switch (m_frameType) { - case P25_DFSI_LDU2_VOICE10: - frameLength = P25_DFSI_LDU2_VOICE10_FRAME_LENGTH_BYTES; + case DFSIFrameType::LDU2_VOICE10: + frameLength = DFSI_LDU2_VOICE10_FRAME_LENGTH_BYTES; break; - case P25_DFSI_LDU2_VOICE11: - frameLength = P25_DFSI_LDU2_VOICE11_FRAME_LENGTH_BYTES; + case DFSIFrameType::LDU2_VOICE11: + frameLength = DFSI_LDU2_VOICE11_FRAME_LENGTH_BYTES; break; - case P25_DFSI_LDU2_VOICE12: - frameLength = P25_DFSI_LDU2_VOICE12_FRAME_LENGTH_BYTES; + case DFSIFrameType::LDU2_VOICE12: + frameLength = DFSI_LDU2_VOICE12_FRAME_LENGTH_BYTES; break; - case P25_DFSI_LDU2_VOICE13: - frameLength = P25_DFSI_LDU2_VOICE13_FRAME_LENGTH_BYTES; + case DFSIFrameType::LDU2_VOICE13: + frameLength = DFSI_LDU2_VOICE13_FRAME_LENGTH_BYTES; break; - case P25_DFSI_LDU2_VOICE14: - frameLength = P25_DFSI_LDU2_VOICE14_FRAME_LENGTH_BYTES; + case DFSIFrameType::LDU2_VOICE14: + frameLength = DFSI_LDU2_VOICE14_FRAME_LENGTH_BYTES; break; - case P25_DFSI_LDU2_VOICE15: - frameLength = P25_DFSI_LDU2_VOICE15_FRAME_LENGTH_BYTES; + case DFSIFrameType::LDU2_VOICE15: + frameLength = DFSI_LDU2_VOICE15_FRAME_LENGTH_BYTES; break; - case P25_DFSI_LDU2_VOICE16: - frameLength = P25_DFSI_LDU2_VOICE16_FRAME_LENGTH_BYTES; + case DFSIFrameType::LDU2_VOICE16: + frameLength = DFSI_LDU2_VOICE16_FRAME_LENGTH_BYTES; break; - case P25_DFSI_LDU2_VOICE17: - frameLength = P25_DFSI_LDU2_VOICE17_FRAME_LENGTH_BYTES; + case DFSIFrameType::LDU2_VOICE17: + frameLength = DFSI_LDU2_VOICE17_FRAME_LENGTH_BYTES; break; - case P25_DFSI_LDU2_VOICE18: - frameLength = P25_DFSI_LDU2_VOICE18_FRAME_LENGTH_BYTES; + case DFSIFrameType::LDU2_VOICE18: + frameLength = DFSI_LDU2_VOICE18_FRAME_LENGTH_BYTES; break; default: { - LogError(LOG_P25, "LC::encodeLDU2(), invalid frametype, frameType = $%02X", m_frameType); + LogError(LOG_P25, "LC::encodeLDU2(), invalid frame type, frameType = $%02X", m_frameType); return; } break; @@ -507,7 +509,7 @@ void LC::encodeLDU2(uint8_t* data, const uint8_t* imbe) uint8_t rs[P25_LDU_LC_FEC_LENGTH_BYTES]; ::memset(rs, 0x00U, P25_LDU_LC_FEC_LENGTH_BYTES); - for (uint32_t i = 0; i < P25_MI_LENGTH_BYTES; i++) + for (uint32_t i = 0; i < MI_LENGTH_BYTES; i++) rs[i] = mi[i]; // Message Indicator rs[9U] = m_control->getAlgId(); // Algorithm ID @@ -524,72 +526,72 @@ void LC::encodeLDU2(uint8_t* data, const uint8_t* imbe) // different frame types mean different things switch (m_frameType) { - case P25_DFSI_LDU2_VOICE11: + case DFSIFrameType::LDU2_VOICE11: { - ::memcpy(dfsiFrame + 1U, imbe, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(dfsiFrame + 1U, imbe, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU2_VOICE12: + case DFSIFrameType::LDU2_VOICE12: { dfsiFrame[1U] = rs[0U]; // Message Indicator dfsiFrame[2U] = rs[1U]; dfsiFrame[3U] = rs[2U]; - ::memcpy(dfsiFrame + 5U, imbe, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(dfsiFrame + 5U, imbe, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU2_VOICE13: + case DFSIFrameType::LDU2_VOICE13: { dfsiFrame[1U] = rs[3U]; // Message Indicator dfsiFrame[2U] = rs[4U]; dfsiFrame[3U] = rs[5U]; - ::memcpy(dfsiFrame + 5U, imbe, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(dfsiFrame + 5U, imbe, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU2_VOICE14: + case DFSIFrameType::LDU2_VOICE14: { dfsiFrame[1U] = rs[6U]; // Message Indicator dfsiFrame[2U] = rs[7U]; dfsiFrame[3U] = rs[8U]; - ::memcpy(dfsiFrame + 5U, imbe, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(dfsiFrame + 5U, imbe, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU2_VOICE15: + case DFSIFrameType::LDU2_VOICE15: { dfsiFrame[1U] = rs[9U]; // Algorithm ID dfsiFrame[2U] = rs[10U]; // Key ID dfsiFrame[3U] = rs[11U]; - ::memcpy(dfsiFrame + 5U, imbe, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(dfsiFrame + 5U, imbe, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU2_VOICE16: + case DFSIFrameType::LDU2_VOICE16: { dfsiFrame[1U] = rs[12U]; // RS (24,16,9) dfsiFrame[2U] = rs[13U]; // RS (24,16,9) dfsiFrame[3U] = rs[14U]; // RS (24,16,9) - ::memcpy(dfsiFrame + 5U, imbe, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(dfsiFrame + 5U, imbe, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU2_VOICE17: + case DFSIFrameType::LDU2_VOICE17: { dfsiFrame[1U] = rs[15U]; // RS (24,16,9) dfsiFrame[2U] = rs[16U]; // RS (24,16,9) dfsiFrame[3U] = rs[17U]; // RS (24,16,9) - ::memcpy(dfsiFrame + 5U, imbe, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(dfsiFrame + 5U, imbe, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU2_VOICE18: + case DFSIFrameType::LDU2_VOICE18: { dfsiFrame[1U] = m_lsd->getLSD1(); // LSD MSB dfsiFrame[2U] = m_lsd->getLSD2(); // LSD LSB - ::memcpy(dfsiFrame + 4U, imbe, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(dfsiFrame + 4U, imbe, RAW_IMBE_LENGTH_BYTES); // IMBE } break; - case P25_DFSI_LDU2_VOICE10: + case DFSIFrameType::LDU2_VOICE10: default: { dfsiFrame[6U] = m_rssi; // RSSI - ::memcpy(dfsiFrame + 10U, imbe, P25_RAW_IMBE_LENGTH_BYTES); // IMBE + ::memcpy(dfsiFrame + 10U, imbe, RAW_IMBE_LENGTH_BYTES); // IMBE } break; } @@ -621,8 +623,8 @@ void LC::copy(const LC& data) delete[] m_mi; - uint8_t* mi = new uint8_t[P25_MI_LENGTH_BYTES]; - ::memcpy(mi, data.m_mi, P25_MI_LENGTH_BYTES); + uint8_t* mi = new uint8_t[MI_LENGTH_BYTES]; + ::memcpy(mi, data.m_mi, MI_LENGTH_BYTES); m_mi = mi; } diff --git a/src/common/p25/lc/AMBT.cpp b/src/common/p25/lc/AMBT.cpp index cdf37ec3..88150f83 100644 --- a/src/common/p25/lc/AMBT.cpp +++ b/src/common/p25/lc/AMBT.cpp @@ -7,7 +7,7 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -17,8 +17,9 @@ #include "Log.h" #include "Utils.h" -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; #include @@ -101,7 +102,7 @@ bool AMBT::decode(const data::DataHeader& dataHeader, const data::DataBlock* blo assert(blocks != nullptr); assert(pduUserData != nullptr); - if (dataHeader.getFormat() != PDU_FMT_AMBT) { + if (dataHeader.getFormat() != PDUFormatType::AMBT) { LogError(LOG_P25, "AMBT::decode(), PDU is not a AMBT PDU"); return false; } @@ -150,11 +151,11 @@ void AMBT::encode(data::DataHeader& dataHeader, uint8_t* pduUserData) { assert(pduUserData != nullptr); - dataHeader.setFormat(PDU_FMT_AMBT); + dataHeader.setFormat(PDUFormatType::AMBT); dataHeader.setMFId(m_mfId); // Mfg Id. dataHeader.setAckNeeded(false); dataHeader.setOutbound(true); - dataHeader.setSAP(PDU_SAP_TRUNK_CTRL); + dataHeader.setSAP(PDUSAP::TRUNK_CTRL); dataHeader.setLLId(m_srcId); dataHeader.setFullMessage(true); diff --git a/src/common/p25/lc/LC.cpp b/src/common/p25/lc/LC.cpp index 701e7695..3ee52ed9 100644 --- a/src/common/p25/lc/LC.cpp +++ b/src/common/p25/lc/LC.cpp @@ -9,7 +9,7 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2016,2017 Jonathan Naylor, G4KLX -* Copyright (C) 2017-2023 Bryan Biedenkapp, N2PLL +* Copyright (C) 2017-2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -21,8 +21,9 @@ #include "Log.h" #include "Utils.h" -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; #include #include @@ -41,24 +42,23 @@ SiteData LC::m_siteData = SiteData(); /// /// Initializes a new instance of the LC class. /// -/// LC::LC() : m_protect(false), - m_lco(LC_GROUP), - m_mfId(P25_MFG_STANDARD), + m_lco(LCO::GROUP), + m_mfId(MFG_STANDARD), m_srcId(0U), m_dstId(0U), m_grpVchNo(0U), m_grpVchNoB(0U), m_dstIdB(0U), m_explicitId(false), - m_netId(P25_WACN_STD_DEFAULT), - m_sysId(P25_SID_STD_DEFAULT), + m_netId(WACN_STD_DEFAULT), + m_sysId(SID_STD_DEFAULT), m_emergency(false), m_encrypted(false), m_priority(4U), m_group(true), - m_algId(P25_ALGO_UNENCRYPT), + m_algId(ALGO_UNENCRYPT), m_kId(0U), m_rs(), m_encryptOverride(false), @@ -67,8 +67,8 @@ LC::LC() : m_rsValue(0U), m_mi(nullptr) { - m_mi = new uint8_t[P25_MI_LENGTH_BYTES]; - ::memset(m_mi, 0x00U, P25_MI_LENGTH_BYTES); + m_mi = new uint8_t[MI_LENGTH_BYTES]; + ::memset(m_mi, 0x00U, MI_LENGTH_BYTES); } /// @@ -145,10 +145,10 @@ bool LC::decodeHDU(const uint8_t* data) m_mfId = rs[9U]; // Mfg Id. m_algId = rs[10U]; // Algorithm ID - if (m_algId != P25_ALGO_UNENCRYPT) { - m_mi = new uint8_t[P25_MI_LENGTH_BYTES]; - ::memset(m_mi, 0x00U, P25_MI_LENGTH_BYTES); - ::memcpy(m_mi, rs, P25_MI_LENGTH_BYTES); // Message Indicator + if (m_algId != ALGO_UNENCRYPT) { + m_mi = new uint8_t[MI_LENGTH_BYTES]; + ::memset(m_mi, 0x00U, MI_LENGTH_BYTES); + ::memcpy(m_mi, rs, MI_LENGTH_BYTES); // Message Indicator m_kId = (rs[11U] << 8) + rs[12U]; // Key ID if (!m_encrypted) { @@ -157,8 +157,8 @@ bool LC::decodeHDU(const uint8_t* data) } } else { - m_mi = new uint8_t[P25_MI_LENGTH_BYTES]; - ::memset(m_mi, 0x00U, P25_MI_LENGTH_BYTES); + m_mi = new uint8_t[MI_LENGTH_BYTES]; + ::memset(m_mi, 0x00U, MI_LENGTH_BYTES); m_kId = 0x0000U; if (m_encrypted) { @@ -191,7 +191,7 @@ void LC::encodeHDU(uint8_t* data) uint8_t rs[P25_HDU_LENGTH_BYTES]; ::memset(rs, 0x00U, P25_HDU_LENGTH_BYTES); - for (uint32_t i = 0; i < P25_MI_LENGTH_BYTES; i++) + for (uint32_t i = 0; i < MI_LENGTH_BYTES; i++) rs[i] = m_mi[i]; // Message Indicator rs[9U] = m_mfId; // Mfg Id. @@ -383,10 +383,10 @@ bool LC::decodeLDU2(const uint8_t* data) #endif m_algId = rs[9U]; // Algorithm ID - if (m_algId != P25_ALGO_UNENCRYPT) { - m_mi = new uint8_t[P25_MI_LENGTH_BYTES]; - ::memset(m_mi, 0x00U, P25_MI_LENGTH_BYTES); - ::memcpy(m_mi, rs, P25_MI_LENGTH_BYTES); // Message Indicator + if (m_algId != ALGO_UNENCRYPT) { + m_mi = new uint8_t[MI_LENGTH_BYTES]; + ::memset(m_mi, 0x00U, MI_LENGTH_BYTES); + ::memcpy(m_mi, rs, MI_LENGTH_BYTES); // Message Indicator m_kId = (rs[10U] << 8) + rs[11U]; // Key ID if (!m_encrypted) { @@ -395,8 +395,8 @@ bool LC::decodeLDU2(const uint8_t* data) } } else { - m_mi = new uint8_t[P25_MI_LENGTH_BYTES]; - ::memset(m_mi, 0x00U, P25_MI_LENGTH_BYTES); + m_mi = new uint8_t[MI_LENGTH_BYTES]; + ::memset(m_mi, 0x00U, MI_LENGTH_BYTES); m_kId = 0x0000U; if (m_encrypted) { @@ -420,7 +420,7 @@ void LC::encodeLDU2(uint8_t* data) uint8_t rs[P25_LDU_LC_FEC_LENGTH_BYTES]; ::memset(rs, 0x00U, P25_LDU_LC_FEC_LENGTH_BYTES); - for (uint32_t i = 0; i < P25_MI_LENGTH_BYTES; i++) + for (uint32_t i = 0; i < MI_LENGTH_BYTES; i++) rs[i] = m_mi[i]; // Message Indicator rs[9U] = m_algId; // Algorithm ID @@ -470,7 +470,7 @@ void LC::setMI(const uint8_t* mi) { assert(mi != nullptr); - ::memcpy(m_mi, mi, P25_MI_LENGTH_BYTES); + ::memcpy(m_mi, mi, MI_LENGTH_BYTES); } /// Gets the encryption message indicator. @@ -479,7 +479,7 @@ void LC::getMI(uint8_t* mi) const { assert(mi != nullptr); - ::memcpy(mi, m_mi, P25_MI_LENGTH_BYTES); + ::memcpy(mi, m_mi, MI_LENGTH_BYTES); } // --------------------------------------------------------------------------- @@ -519,11 +519,11 @@ void LC::copy(const LC& data) m_rsValue = data.m_rsValue; m_algId = data.m_algId; - if (m_algId != P25_ALGO_UNENCRYPT) { + if (m_algId != ALGO_UNENCRYPT) { delete[] m_mi; - m_mi = new uint8_t[P25_MI_LENGTH_BYTES]; - ::memcpy(m_mi, data.m_mi, P25_MI_LENGTH_BYTES); + m_mi = new uint8_t[MI_LENGTH_BYTES]; + ::memcpy(m_mi, data.m_mi, MI_LENGTH_BYTES); m_kId = data.m_kId; if (!m_encrypted) { @@ -534,8 +534,8 @@ void LC::copy(const LC& data) else { delete[] m_mi; - m_mi = new uint8_t[P25_MI_LENGTH_BYTES]; - ::memset(m_mi, 0x00U, P25_MI_LENGTH_BYTES); + m_mi = new uint8_t[MI_LENGTH_BYTES]; + ::memset(m_mi, 0x00U, MI_LENGTH_BYTES); m_kId = 0x0000U; if (m_encrypted) { @@ -572,14 +572,14 @@ bool LC::decodeLC(const uint8_t* rs) m_mfId = rs[1U]; // Mfg Id. // non-standard P25 vendor opcodes (these are just detected for passthru) - if ((m_mfId != P25_MFG_STANDARD) && (m_mfId != P25_MFG_STANDARD_ALT)) { + if ((m_mfId != MFG_STANDARD) && (m_mfId != MFG_STANDARD_ALT)) { m_rsValue = rsValue; return true; } // standard P25 reference opcodes switch (m_lco) { - case LC_GROUP: + case LCO::GROUP: m_mfId = rs[1U]; // Mfg Id. m_group = true; m_emergency = (rs[2U] & 0x80U) == 0x80U; // Emergency Flag @@ -591,7 +591,7 @@ bool LC::decodeLC(const uint8_t* rs) m_dstId = (uint32_t)((rsValue >> 24) & 0xFFFFU); // Talkgroup Address m_srcId = (uint32_t)(rsValue & 0xFFFFFFU); // Source Radio Address break; - case LC_PRIVATE: + case LCO::PRIVATE: m_mfId = rs[1U]; // Mfg Id. m_group = false; m_emergency = (rs[2U] & 0x80U) == 0x80U; // Emergency Flag @@ -602,7 +602,7 @@ bool LC::decodeLC(const uint8_t* rs) m_dstId = (uint32_t)((rsValue >> 24) & 0xFFFFFFU); // Target Radio Address m_srcId = (uint32_t)(rsValue & 0xFFFFFFU); // Source Radio Address break; - case LC_TEL_INT_VCH_USER: + case LCO::TEL_INT_VCH_USER: m_emergency = (rs[2U] & 0x80U) == 0x80U; // Emergency Flag if (!m_encryptOverride) { m_encrypted = (rs[2U] & 0x40U) == 0x40U; // Encryption Flag @@ -613,7 +613,7 @@ bool LC::decodeLC(const uint8_t* rs) m_srcId = (uint32_t)(rsValue & 0xFFFFFFU); // Source/Target Address } break; - case LC_EXPLICIT_SOURCE_ID: + case LCO::EXPLICIT_SOURCE_ID: m_netId = (uint32_t)((rsValue >> 36) & 0xFFFFFU); // Network ID m_sysId = (uint32_t)((rsValue >> 24) & 0xFFFU); // System ID m_srcId = (uint32_t)(rsValue & 0xFFFFFFU); // Source Radio Address @@ -642,7 +642,7 @@ void LC::encodeLC(uint8_t* rs) // standard P25 reference opcodes switch (m_lco) { - case LC_GROUP: + case LCO::GROUP: rsValue = m_mfId; rsValue = (rsValue << 8) + (m_emergency ? 0x80U : 0x00U) + // Emergency Flag @@ -651,7 +651,7 @@ void LC::encodeLC(uint8_t* rs) rsValue = (rsValue << 24) + m_dstId; // Talkgroup Address rsValue = (rsValue << 24) + m_srcId; // Source Radio Address break; - case LC_GROUP_UPDT: + case LCO::GROUP_UPDT: rs[0U] |= 0x40U; // Implicit Operation rsValue = m_siteData.channelId(); // Group A - Channel ID rsValue = (rsValue << 12) + m_grpVchNo; // Group A - Channel Number @@ -660,7 +660,7 @@ void LC::encodeLC(uint8_t* rs) rsValue = (rsValue << 12) + m_grpVchNoB; // Group B - Channel Number rsValue = (rsValue << 16) + m_dstIdB; // Group B - Talkgroup Address break; - case LC_PRIVATE: + case LCO::PRIVATE: rsValue = m_mfId; rsValue = (rsValue << 8) + (m_emergency ? 0x80U : 0x00U) + // Emergency Flag @@ -669,7 +669,7 @@ void LC::encodeLC(uint8_t* rs) rsValue = (rsValue << 24) + m_dstId; // Target Radio Address rsValue = (rsValue << 24) + m_srcId; // Source Radio Address break; - case LC_TEL_INT_VCH_USER: + case LCO::TEL_INT_VCH_USER: rs[0U] |= 0x40U; // Implicit Operation rsValue = (rsValue << 8) + (m_emergency ? 0x80U : 0x00U) + // Emergency Flag @@ -678,12 +678,12 @@ void LC::encodeLC(uint8_t* rs) rsValue = (rsValue << 16) + m_callTimer; // Call Timer rsValue = (rsValue << 24) + m_srcId; // Source/Target Radio Address break; - case LC_EXPLICIT_SOURCE_ID: + case LCO::EXPLICIT_SOURCE_ID: rsValue = m_netId; // Network ID rsValue = (rsValue << 12) + (m_sysId & 0xFFFU); // System ID rsValue = (rsValue << 24) + m_srcId; // Source Radio Address break; - case LC_RFSS_STS_BCAST: + case LCO::RFSS_STS_BCAST: rs[0U] |= 0x40U; // Implicit Operation rsValue = m_siteData.lra(); // Location Registration Area rsValue = (rsValue << 12) + m_siteData.sysId(); // System ID @@ -699,7 +699,7 @@ void LC::encodeLC(uint8_t* rs) } // non-standard P25 vendor opcodes (these are just detected for passthru) - if ((m_mfId != P25_MFG_STANDARD) && (m_mfId != P25_MFG_STANDARD_ALT)) { + if ((m_mfId != MFG_STANDARD) && (m_mfId != MFG_STANDARD_ALT)) { rsValue = 0U; rsValue = m_rsValue; } diff --git a/src/common/p25/lc/TDULC.cpp b/src/common/p25/lc/TDULC.cpp index 353fd7b9..4c4c6142 100644 --- a/src/common/p25/lc/TDULC.cpp +++ b/src/common/p25/lc/TDULC.cpp @@ -7,7 +7,7 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2017-2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2017-2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -18,8 +18,9 @@ #include "Log.h" #include "Utils.h" -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; #include #include @@ -74,8 +75,8 @@ TDULC::TDULC(LC* lc) : TDULC() /// TDULC::TDULC() : m_protect(false), - m_lco(LC_GROUP), - m_mfId(P25_MFG_STANDARD), + m_lco(LCO::GROUP), + m_mfId(MFG_STANDARD), m_srcId(0U), m_dstId(0U), m_grpVchNo(0U), diff --git a/src/common/p25/lc/TSBK.cpp b/src/common/p25/lc/TSBK.cpp index bf89b3cd..e6700c10 100644 --- a/src/common/p25/lc/TSBK.cpp +++ b/src/common/p25/lc/TSBK.cpp @@ -7,7 +7,7 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2017-2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2017-2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -18,8 +18,9 @@ #include "Log.h" #include "Utils.h" -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; #include @@ -76,17 +77,17 @@ TSBK::TSBK(LC* lc) : TSBK() /// This should never be used. TSBK::TSBK() : m_protect(false), - m_lco(LC_GROUP), - m_mfId(P25_MFG_STANDARD), + m_lco(TSBKO::IOSP_GRP_VCH), + m_mfId(MFG_STANDARD), m_srcId(0U), m_dstId(0U), m_lastBlock(false), m_aivFlag(true), m_extendedAddrFlag(false), m_service(0U), - m_response(P25_RSP_ACCEPT), - m_netId(P25_WACN_STD_DEFAULT), - m_sysId(P25_SID_STD_DEFAULT), + m_response(ResponseCode::ACCEPT), + m_netId(WACN_STD_DEFAULT), + m_sysId(SID_STD_DEFAULT), m_grpVchId(0U), m_grpVchNo(0U), m_emergency(false), @@ -99,8 +100,8 @@ TSBK::TSBK() : m_raw(nullptr) { if (m_siteCallsign == nullptr) { - m_siteCallsign = new uint8_t[P25_MOT_CALLSIGN_LENGTH_BYTES]; - ::memset(m_siteCallsign, 0x00U, P25_MOT_CALLSIGN_LENGTH_BYTES); + m_siteCallsign = new uint8_t[MOT_CALLSIGN_LENGTH_BYTES]; + ::memset(m_siteCallsign, 0x00U, MOT_CALLSIGN_LENGTH_BYTES); } #if FORCE_TSBK_CRC_WARN @@ -124,7 +125,7 @@ TSBK::~TSBK() /// std::string TSBK::toString(bool isp) { - return std::string("TSBK_IOSP_UNKWN (Unknown TSBK)"); + return std::string("TSBKO, UNKNOWN (Unknown TSBK)"); } /// @@ -144,16 +145,16 @@ uint8_t* TSBK::getDecodedRaw() const void TSBK::setCallsign(std::string callsign) { if (m_siteCallsign == nullptr) { - m_siteCallsign = new uint8_t[P25_MOT_CALLSIGN_LENGTH_BYTES]; - ::memset(m_siteCallsign, 0x00U, P25_MOT_CALLSIGN_LENGTH_BYTES); + m_siteCallsign = new uint8_t[MOT_CALLSIGN_LENGTH_BYTES]; + ::memset(m_siteCallsign, 0x00U, MOT_CALLSIGN_LENGTH_BYTES); } uint32_t idLength = callsign.length(); if (idLength > 0) { - ::memset(m_siteCallsign, 0x20U, P25_MOT_CALLSIGN_LENGTH_BYTES); + ::memset(m_siteCallsign, 0x20U, MOT_CALLSIGN_LENGTH_BYTES); - if (idLength > P25_MOT_CALLSIGN_LENGTH_BYTES) - idLength = P25_MOT_CALLSIGN_LENGTH_BYTES; + if (idLength > MOT_CALLSIGN_LENGTH_BYTES) + idLength = MOT_CALLSIGN_LENGTH_BYTES; for (uint32_t i = 0; i < idLength; i++) m_siteCallsign[i] = callsign[i]; } diff --git a/src/common/p25/lc/tdulc/LC_ADJ_STS_BCAST.cpp b/src/common/p25/lc/tdulc/LC_ADJ_STS_BCAST.cpp index 53cc1d2a..502b23a9 100644 --- a/src/common/p25/lc/tdulc/LC_ADJ_STS_BCAST.cpp +++ b/src/common/p25/lc/tdulc/LC_ADJ_STS_BCAST.cpp @@ -7,16 +7,17 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tdulc/LC_ADJ_STS_BCAST.h" #include "Log.h" -using namespace p25::lc::tdulc; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tdulc; #include @@ -28,15 +29,15 @@ using namespace p25; /// Initializes a new instance of the LC_ADJ_STS_BCAST class. /// LC_ADJ_STS_BCAST::LC_ADJ_STS_BCAST() : TDULC(), - m_adjCFVA(P25_CFVA_FAILURE), + m_adjCFVA(CFVA::FAILURE), m_adjSysId(0U), m_adjRfssId(0U), m_adjSiteId(0U), m_adjChannelId(0U), m_adjChannelNo(0U), - m_adjServiceClass(P25_SVC_CLS_INVALID) + m_adjServiceClass(ServiceClass::INVALID) { - m_lco = p25::LC_ADJ_STS_BCAST; + m_lco = LCO::ADJ_STS_BCAST; } /// @@ -79,7 +80,7 @@ void LC_ADJ_STS_BCAST::encode(uint8_t* data) rsValue = (rsValue << 8) + m_adjServiceClass; // System Service Class } else { - LogError(LOG_P25, "LC_ADJ_STS_BCAST::encodeLC(), invalid values for LC_ADJ_STS_BCAST, tsbkAdjSiteRFSSId = $%02X, tsbkAdjSiteId = $%02X, tsbkAdjSiteChannel = $%02X", + LogError(LOG_P25, "LC_ADJ_STS_BCAST::encodeLC(), invalid values for LC_ADJ_STS_BCAST, adjSiteRFSSId = $%02X, adjSiteId = $%02X, adjSiteChannel = $%02X", m_adjRfssId, m_adjSiteId, m_adjChannelNo); return; // blatantly ignore creating this TSBK } diff --git a/src/common/p25/lc/tdulc/LC_CALL_TERM.cpp b/src/common/p25/lc/tdulc/LC_CALL_TERM.cpp index 7691557a..0fec978c 100644 --- a/src/common/p25/lc/tdulc/LC_CALL_TERM.cpp +++ b/src/common/p25/lc/tdulc/LC_CALL_TERM.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tdulc/LC_CALL_TERM.h" -using namespace p25::lc::tdulc; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tdulc; #include @@ -28,7 +29,7 @@ using namespace p25; /// LC_CALL_TERM::LC_CALL_TERM() : TDULC() { - m_lco = p25::LC_CALL_TERM; + m_lco = LCO::CALL_TERM; } /// @@ -58,7 +59,7 @@ void LC_CALL_TERM::encode(uint8_t* data) m_implicit = true; rsValue = 0U; - rsValue = (rsValue << 24) + P25_WUID_FNE; // System Radio Address + rsValue = (rsValue << 24) + WUID_FNE; // System Radio Address std::unique_ptr rs = TDULC::fromValue(rsValue); TDULC::encode(data, rs.get()); diff --git a/src/common/p25/lc/tdulc/LC_CONV_FALLBACK.cpp b/src/common/p25/lc/tdulc/LC_CONV_FALLBACK.cpp index 3fd7613a..51499482 100644 --- a/src/common/p25/lc/tdulc/LC_CONV_FALLBACK.cpp +++ b/src/common/p25/lc/tdulc/LC_CONV_FALLBACK.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tdulc/LC_CONV_FALLBACK.h" -using namespace p25::lc::tdulc; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tdulc; #include @@ -28,7 +29,7 @@ using namespace p25; /// LC_CONV_FALLBACK::LC_CONV_FALLBACK() : TDULC() { - m_lco = p25::LC_CONV_FALLBACK; + m_lco = LCO::CONV_FALLBACK; } /// diff --git a/src/common/p25/lc/tdulc/LC_FAILSOFT.cpp b/src/common/p25/lc/tdulc/LC_FAILSOFT.cpp index a9d95a7c..39691b60 100644 --- a/src/common/p25/lc/tdulc/LC_FAILSOFT.cpp +++ b/src/common/p25/lc/tdulc/LC_FAILSOFT.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2023 Bryan Biedenkapp, N2PLL +* Copyright (C) 2023,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tdulc/LC_FAILSOFT.h" -using namespace p25::lc::tdulc; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tdulc; #include @@ -28,8 +29,8 @@ using namespace p25; /// LC_FAILSOFT::LC_FAILSOFT() : TDULC() { - m_lco = p25::LC_FAILSOFT; - m_mfId = p25::P25_MFG_MOT; + m_lco = LCO::FAILSOFT; + m_mfId = MFG_MOT; } /// diff --git a/src/common/p25/lc/tdulc/LC_GROUP.cpp b/src/common/p25/lc/tdulc/LC_GROUP.cpp index 44909183..b2e077e8 100644 --- a/src/common/p25/lc/tdulc/LC_GROUP.cpp +++ b/src/common/p25/lc/tdulc/LC_GROUP.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tdulc/LC_GROUP.h" -using namespace p25::lc::tdulc; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tdulc; #include @@ -28,7 +29,7 @@ using namespace p25; /// LC_GROUP::LC_GROUP() : TDULC() { - m_lco = p25::LC_GROUP; + m_lco = LCO::GROUP; } /// diff --git a/src/common/p25/lc/tdulc/LC_GROUP_UPDT.cpp b/src/common/p25/lc/tdulc/LC_GROUP_UPDT.cpp index e30cc1fb..92a82c62 100644 --- a/src/common/p25/lc/tdulc/LC_GROUP_UPDT.cpp +++ b/src/common/p25/lc/tdulc/LC_GROUP_UPDT.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tdulc/LC_GROUP_UPDT.h" -using namespace p25::lc::tdulc; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tdulc; #include @@ -28,7 +29,7 @@ using namespace p25; /// LC_GROUP_UPDT::LC_GROUP_UPDT() : TDULC() { - m_lco = p25::LC_GROUP_UPDT; + m_lco = LCO::GROUP_UPDT; } /// diff --git a/src/common/p25/lc/tdulc/LC_IDEN_UP.cpp b/src/common/p25/lc/tdulc/LC_IDEN_UP.cpp index 6d1394c3..910748d8 100644 --- a/src/common/p25/lc/tdulc/LC_IDEN_UP.cpp +++ b/src/common/p25/lc/tdulc/LC_IDEN_UP.cpp @@ -7,16 +7,17 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tdulc/LC_IDEN_UP.h" #include "Log.h" -using namespace p25::lc::tdulc; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tdulc; #include #include @@ -30,7 +31,7 @@ using namespace p25; /// LC_IDEN_UP::LC_IDEN_UP() : TDULC() { - m_lco = p25::LC_IDEN_UP; + m_lco = LCO::IDEN_UP; } /// @@ -70,7 +71,7 @@ void LC_IDEN_UP::encode(uint8_t* data) uCalcTxOffset |= 0x2000U; // this sets a positive offset ... uint32_t calcBaseFreq = (uint32_t)(m_siteIdenEntry.baseFrequency() / 5); - uint8_t chanBw = (m_siteIdenEntry.chBandwidthKhz() >= 12.5F) ? P25_IDEN_UP_VU_BW_125K : P25_IDEN_UP_VU_BW_625K; + uint8_t chanBw = (m_siteIdenEntry.chBandwidthKhz() >= 12.5F) ? IDEN_UP_VU_BW_125K : IDEN_UP_VU_BW_625K; rsValue = m_siteIdenEntry.channelId(); // Channel ID rsValue = (rsValue << 4) + chanBw; // Channel Bandwidth diff --git a/src/common/p25/lc/tdulc/LC_NET_STS_BCAST.cpp b/src/common/p25/lc/tdulc/LC_NET_STS_BCAST.cpp index cee0f806..d19504d9 100644 --- a/src/common/p25/lc/tdulc/LC_NET_STS_BCAST.cpp +++ b/src/common/p25/lc/tdulc/LC_NET_STS_BCAST.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tdulc/LC_NET_STS_BCAST.h" -using namespace p25::lc::tdulc; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tdulc; #include @@ -28,7 +29,7 @@ using namespace p25; /// LC_NET_STS_BCAST::LC_NET_STS_BCAST() : TDULC() { - m_lco = p25::LC_NET_STS_BCAST; + m_lco = LCO::NET_STS_BCAST; } /// diff --git a/src/common/p25/lc/tdulc/LC_PRIVATE.cpp b/src/common/p25/lc/tdulc/LC_PRIVATE.cpp index dec2c5a7..f4f62d96 100644 --- a/src/common/p25/lc/tdulc/LC_PRIVATE.cpp +++ b/src/common/p25/lc/tdulc/LC_PRIVATE.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tdulc/LC_PRIVATE.h" -using namespace p25::lc::tdulc; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tdulc; #include @@ -28,7 +29,7 @@ using namespace p25; /// LC_PRIVATE::LC_PRIVATE() : TDULC() { - m_lco = p25::LC_PRIVATE; + m_lco = LCO::PRIVATE; } /// diff --git a/src/common/p25/lc/tdulc/LC_RFSS_STS_BCAST.cpp b/src/common/p25/lc/tdulc/LC_RFSS_STS_BCAST.cpp index 3c04c32b..24d9863e 100644 --- a/src/common/p25/lc/tdulc/LC_RFSS_STS_BCAST.cpp +++ b/src/common/p25/lc/tdulc/LC_RFSS_STS_BCAST.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tdulc/LC_RFSS_STS_BCAST.h" -using namespace p25::lc::tdulc; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tdulc; #include @@ -28,7 +29,7 @@ using namespace p25; /// LC_RFSS_STS_BCAST::LC_RFSS_STS_BCAST() : TDULC() { - m_lco = p25::LC_RFSS_STS_BCAST; + m_lco = LCO::RFSS_STS_BCAST; } /// diff --git a/src/common/p25/lc/tdulc/LC_SYS_SRV_BCAST.cpp b/src/common/p25/lc/tdulc/LC_SYS_SRV_BCAST.cpp index fe43f6e6..c5627551 100644 --- a/src/common/p25/lc/tdulc/LC_SYS_SRV_BCAST.cpp +++ b/src/common/p25/lc/tdulc/LC_SYS_SRV_BCAST.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tdulc/LC_SYS_SRV_BCAST.h" -using namespace p25::lc::tdulc; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tdulc; #include @@ -28,7 +29,7 @@ using namespace p25; /// LC_SYS_SRV_BCAST::LC_SYS_SRV_BCAST() : TDULC() { - m_lco = p25::LC_SYS_SRV_BCAST; + m_lco = LCO::SYS_SRV_BCAST; } /// @@ -53,7 +54,7 @@ void LC_SYS_SRV_BCAST::encode(uint8_t* data) { assert(data != nullptr); - const uint32_t services = (m_siteData.netActive()) ? P25_SYS_SRV_NET_ACTIVE : 0U | P25_SYS_SRV_DEFAULT; + const uint32_t services = (m_siteData.netActive()) ? SystemService::NET_ACTIVE : 0U | SYS_SRV_DEFAULT; ulong64_t rsValue = 0U; diff --git a/src/common/p25/lc/tdulc/LC_TEL_INT_VCH_USER.cpp b/src/common/p25/lc/tdulc/LC_TEL_INT_VCH_USER.cpp index d6e2d832..488d76bd 100644 --- a/src/common/p25/lc/tdulc/LC_TEL_INT_VCH_USER.cpp +++ b/src/common/p25/lc/tdulc/LC_TEL_INT_VCH_USER.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tdulc/LC_TEL_INT_VCH_USER.h" -using namespace p25::lc::tdulc; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tdulc; #include @@ -28,7 +29,7 @@ using namespace p25; /// LC_TEL_INT_VCH_USER::LC_TEL_INT_VCH_USER() : TDULC() { - m_lco = p25::LC_TEL_INT_VCH_USER; + m_lco = LCO::TEL_INT_VCH_USER; } /// diff --git a/src/common/p25/lc/tdulc/TDULCFactory.cpp b/src/common/p25/lc/tdulc/TDULCFactory.cpp index 1628af20..b33c6bd2 100644 --- a/src/common/p25/lc/tdulc/TDULCFactory.cpp +++ b/src/common/p25/lc/tdulc/TDULCFactory.cpp @@ -7,7 +7,7 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2023 Bryan Biedenkapp, N2PLL +* Copyright (C) 2023,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -16,9 +16,10 @@ #include "Log.h" #include "Utils.h" -using namespace p25::lc::tdulc; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tdulc; #include @@ -80,11 +81,11 @@ std::unique_ptr TDULCFactory::createTDULC(const uint8_t* data) // standard P25 reference opcodes switch (lco) { - case p25::LC_GROUP: + case LCO::GROUP: return decode(new LC_GROUP(), data); - case p25::LC_PRIVATE: + case LCO::PRIVATE: return decode(new LC_PRIVATE(), data); - case p25::LC_TEL_INT_VCH_USER: + case LCO::TEL_INT_VCH_USER: return decode(new LC_TEL_INT_VCH_USER(), data); default: LogError(LOG_P25, "TDULCFactory::create(), unknown TDULC LCO value, lco = $%02X", lco); diff --git a/src/common/p25/lc/tsbk/IOSP_ACK_RSP.cpp b/src/common/p25/lc/tsbk/IOSP_ACK_RSP.cpp index d2531ace..f2e69c31 100644 --- a/src/common/p25/lc/tsbk/IOSP_ACK_RSP.cpp +++ b/src/common/p25/lc/tsbk/IOSP_ACK_RSP.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/IOSP_ACK_RSP.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// IOSP_ACK_RSP::IOSP_ACK_RSP() : TSBK() { - m_lco = TSBK_IOSP_ACK_RSP; + m_lco = TSBKO::IOSP_ACK_RSP; } /// @@ -93,6 +94,6 @@ void IOSP_ACK_RSP::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string IOSP_ACK_RSP::toString(bool isp) { - if (isp) return std::string("TSBK_IOSP_ACK_RSP (Acknowledge Response - Unit)"); - else return std::string("TSBK_IOSP_ACK_RSP (Acknowledge Response - FNE)"); + return (isp) ? std::string("TSBKO, IOSP_ACK_RSP (Acknowledge Response - Unit)") : + std::string("TSBKO, IOSP_ACK_RSP (Acknowledge Response - FNE)"); } diff --git a/src/common/p25/lc/tsbk/IOSP_CALL_ALRT.cpp b/src/common/p25/lc/tsbk/IOSP_CALL_ALRT.cpp index e6f54d8d..68f25c6d 100644 --- a/src/common/p25/lc/tsbk/IOSP_CALL_ALRT.cpp +++ b/src/common/p25/lc/tsbk/IOSP_CALL_ALRT.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/IOSP_CALL_ALRT.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// IOSP_CALL_ALRT::IOSP_CALL_ALRT() : TSBK() { - m_lco = TSBK_IOSP_CALL_ALRT; + m_lco = TSBKO::IOSP_CALL_ALRT; } /// @@ -82,6 +83,6 @@ void IOSP_CALL_ALRT::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string IOSP_CALL_ALRT::toString(bool isp) { - if (isp) return std::string("TSBK_IOSP_CALL_ALRT (Call Alert Request)"); - else return std::string("TSBK_IOSP_CALL_ALRT (Call Alert)"); + return (isp) ? std::string("TSBKO, IOSP_CALL_ALRT (Call Alert Request)") : + std::string("TSBKO, IOSP_CALL_ALRT (Call Alert)"); } diff --git a/src/common/p25/lc/tsbk/IOSP_EXT_FNCT.cpp b/src/common/p25/lc/tsbk/IOSP_EXT_FNCT.cpp index c5daab5c..6c664ab8 100644 --- a/src/common/p25/lc/tsbk/IOSP_EXT_FNCT.cpp +++ b/src/common/p25/lc/tsbk/IOSP_EXT_FNCT.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/IOSP_EXT_FNCT.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -27,9 +28,9 @@ using namespace p25; /// Initializes a new instance of the IOSP_EXT_FNCT class. /// IOSP_EXT_FNCT::IOSP_EXT_FNCT() : TSBK(), - m_extendedFunction(P25_EXT_FNCT_CHECK) + m_extendedFunction(ExtendedFunctions::CHECK) { - m_lco = TSBK_IOSP_EXT_FNCT; + m_lco = TSBKO::IOSP_EXT_FNCT; } /// @@ -85,8 +86,8 @@ void IOSP_EXT_FNCT::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string IOSP_EXT_FNCT::toString(bool isp) { - if (isp) return std::string("TSBK_IOSP_EXT_FNCT (Extended Function Response)"); - else return std::string("TSBK_IOSP_EXT_FNCT (Extended Function Command)"); + return (isp) ? std::string("TSBKO, IOSP_EXT_FNCT (Extended Function Response)") : + std::string("TSBKO, IOSP_EXT_FNCT (Extended Function Command)"); } // --------------------------------------------------------------------------- diff --git a/src/common/p25/lc/tsbk/IOSP_GRP_AFF.cpp b/src/common/p25/lc/tsbk/IOSP_GRP_AFF.cpp index 3736fa22..adac6d70 100644 --- a/src/common/p25/lc/tsbk/IOSP_GRP_AFF.cpp +++ b/src/common/p25/lc/tsbk/IOSP_GRP_AFF.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/IOSP_GRP_AFF.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -27,9 +28,9 @@ using namespace p25; /// Initializes a new instance of the IOSP_GRP_AFF class. /// IOSP_GRP_AFF::IOSP_GRP_AFF() : TSBK(), - m_announceGroup(P25_WUID_ALL) + m_announceGroup(WUID_ALL) { - m_lco = TSBK_IOSP_GRP_AFF; + m_lco = TSBKO::IOSP_GRP_AFF; } /// @@ -87,8 +88,8 @@ void IOSP_GRP_AFF::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string IOSP_GRP_AFF::toString(bool isp) { - if (isp) return std::string("TSBK_IOSP_GRP_AFF (Group Affiliation Request)"); - else return std::string("TSBK_IOSP_GRP_AFF (Group Affiliation Response)"); + return (isp) ? std::string("TSBKO, IOSP_GRP_AFF (Group Affiliation Request)") : + std::string("TSBKO, IOSP_GRP_AFF (Group Affiliation Response)"); } // --------------------------------------------------------------------------- diff --git a/src/common/p25/lc/tsbk/IOSP_GRP_VCH.cpp b/src/common/p25/lc/tsbk/IOSP_GRP_VCH.cpp index 072549e8..70d871d3 100644 --- a/src/common/p25/lc/tsbk/IOSP_GRP_VCH.cpp +++ b/src/common/p25/lc/tsbk/IOSP_GRP_VCH.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/IOSP_GRP_VCH.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -29,7 +30,7 @@ using namespace p25; IOSP_GRP_VCH::IOSP_GRP_VCH() : TSBK(), m_forceChannelId(false) { - m_lco = TSBK_IOSP_GRP_VCH; + m_lco = TSBKO::IOSP_GRP_VCH; } /// @@ -99,6 +100,6 @@ void IOSP_GRP_VCH::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string IOSP_GRP_VCH::toString(bool isp) { - if (isp) return std::string("TSBK_IOSP_GRP_VCH (Group Voice Channel Request)"); - else return std::string("TSBK_IOSP_GRP_VCH (Group Voice Channel Grant)"); + return (isp) ? std::string("TSBKO, IOSP_GRP_VCH (Group Voice Channel Request)") : + std::string("TSBKO, IOSP_GRP_VCH (Group Voice Channel Grant)"); } diff --git a/src/common/p25/lc/tsbk/IOSP_MSG_UPDT.cpp b/src/common/p25/lc/tsbk/IOSP_MSG_UPDT.cpp index 6d7d4eb8..8122f446 100644 --- a/src/common/p25/lc/tsbk/IOSP_MSG_UPDT.cpp +++ b/src/common/p25/lc/tsbk/IOSP_MSG_UPDT.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/IOSP_MSG_UPDT.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -29,7 +30,7 @@ using namespace p25; IOSP_MSG_UPDT::IOSP_MSG_UPDT() : TSBK(), m_messageValue(0U) { - m_lco = TSBK_IOSP_MSG_UPDT; + m_lco = TSBKO::IOSP_MSG_UPDT; } /// @@ -85,8 +86,8 @@ void IOSP_MSG_UPDT::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string IOSP_MSG_UPDT::toString(bool isp) { - if (isp) return std::string("TSBK_IOSP_MSG_UPDT (Message Update Request)"); - else return std::string("TSBK_IOSP_MSG_UPDT (Message Update)"); + return (isp) ? std::string("TSBKO, IOSP_MSG_UPDT (Message Update Request)") : + std::string("TSBKO, IOSP_MSG_UPDT (Message Update)"); } // --------------------------------------------------------------------------- diff --git a/src/common/p25/lc/tsbk/IOSP_RAD_MON.cpp b/src/common/p25/lc/tsbk/IOSP_RAD_MON.cpp index 44501ee7..8143398d 100644 --- a/src/common/p25/lc/tsbk/IOSP_RAD_MON.cpp +++ b/src/common/p25/lc/tsbk/IOSP_RAD_MON.cpp @@ -8,15 +8,16 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2022 by Jason-UWU -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/IOSP_RAD_MON.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -30,7 +31,7 @@ using namespace p25; IOSP_RAD_MON::IOSP_RAD_MON() : TSBK(), m_txMult(0U) { - m_lco = TSBK_IOSP_RAD_MON; + m_lco = TSBKO::IOSP_RAD_MON; } /// @@ -86,8 +87,8 @@ void IOSP_RAD_MON::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string IOSP_RAD_MON::toString(bool isp) { - if (isp) return std::string("TSBK_IOSP_RAD_MON (Radio Unit Monitor Request)"); - else return std::string("TSBK_IOSP_RAD_MON (Radio Unit Monitor Command)"); + return (isp) ? std::string("TSBKO, IOSP_RAD_MON (Radio Unit Monitor Request)") : + std::string("TSBKO, IOSP_RAD_MON (Radio Unit Monitor Command)"); } // --------------------------------------------------------------------------- diff --git a/src/common/p25/lc/tsbk/IOSP_STS_UPDT.cpp b/src/common/p25/lc/tsbk/IOSP_STS_UPDT.cpp index 2aca0948..ef53433a 100644 --- a/src/common/p25/lc/tsbk/IOSP_STS_UPDT.cpp +++ b/src/common/p25/lc/tsbk/IOSP_STS_UPDT.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/IOSP_STS_UPDT.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -29,7 +30,7 @@ using namespace p25; IOSP_STS_UPDT::IOSP_STS_UPDT() : TSBK(), m_statusValue(0U) { - m_lco = TSBK_IOSP_STS_UPDT; + m_lco = TSBKO::IOSP_STS_UPDT; } /// @@ -85,8 +86,8 @@ void IOSP_STS_UPDT::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string IOSP_STS_UPDT::toString(bool isp) { - if (isp) return std::string("TSBK_IOSP_STS_UPDT (Status Update Request)"); - else return std::string("TSBK_IOSP_STS_UPDT (Status Update)"); + return (isp) ? std::string("TSBKO, IOSP_STS_UPDT (Status Update Request)") : + std::string("TSBKO, IOSP_STS_UPDT (Status Update)"); } // --------------------------------------------------------------------------- diff --git a/src/common/p25/lc/tsbk/IOSP_UU_ANS.cpp b/src/common/p25/lc/tsbk/IOSP_UU_ANS.cpp index f163add9..32c2bf86 100644 --- a/src/common/p25/lc/tsbk/IOSP_UU_ANS.cpp +++ b/src/common/p25/lc/tsbk/IOSP_UU_ANS.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/IOSP_UU_ANS.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// IOSP_UU_ANS::IOSP_UU_ANS() : TSBK() { - m_lco = TSBK_IOSP_UU_ANS; + m_lco = TSBKO::IOSP_UU_ANS; } /// @@ -90,6 +91,6 @@ void IOSP_UU_ANS::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string IOSP_UU_ANS::toString(bool isp) { - if (isp) return std::string("TSBK_IOSP_UU_ANS (Unit-to-Unit Answer Response)"); - else return std::string("TSBK_IOSP_UU_ANS (Unit-to-Unit Answer Request)"); + return (isp) ? std::string("TSBKO, IOSP_UU_ANS (Unit-to-Unit Answer Response)") : + std::string("TSBKO, IOSP_UU_ANS (Unit-to-Unit Answer Request)"); } diff --git a/src/common/p25/lc/tsbk/IOSP_UU_VCH.cpp b/src/common/p25/lc/tsbk/IOSP_UU_VCH.cpp index 58e31e9e..d1659791 100644 --- a/src/common/p25/lc/tsbk/IOSP_UU_VCH.cpp +++ b/src/common/p25/lc/tsbk/IOSP_UU_VCH.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/IOSP_UU_VCH.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// IOSP_UU_VCH::IOSP_UU_VCH() : TSBK() { - m_lco = TSBK_IOSP_UU_VCH; + m_lco = TSBKO::IOSP_UU_VCH; } /// @@ -98,6 +99,6 @@ void IOSP_UU_VCH::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string IOSP_UU_VCH::toString(bool isp) { - if (isp) return std::string("TSBK_IOSP_UU_VCH (Unit-to-Unit Voice Channel Request)"); - else return std::string("TSBK_IOSP_UU_VCH (Unit-to-Unit Voice Channel Grant)"); + return (isp) ? std::string("TSBKO, IOSP_UU_VCH (Unit-to-Unit Voice Channel Request)") : + std::string("TSBKO, IOSP_UU_VCH (Unit-to-Unit Voice Channel Grant)"); } diff --git a/src/common/p25/lc/tsbk/IOSP_U_REG.cpp b/src/common/p25/lc/tsbk/IOSP_U_REG.cpp index 67b0fe9a..c2bb2c2c 100644 --- a/src/common/p25/lc/tsbk/IOSP_U_REG.cpp +++ b/src/common/p25/lc/tsbk/IOSP_U_REG.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/IOSP_U_REG.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// IOSP_U_REG::IOSP_U_REG() : TSBK() { - m_lco = TSBK_IOSP_U_REG; + m_lco = TSBKO::IOSP_U_REG; } /// @@ -85,6 +86,6 @@ void IOSP_U_REG::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string IOSP_U_REG::toString(bool isp) { - if (isp) return std::string("TSBK_IOSP_U_REG (Unit Registration Request)"); - else return std::string("TSBK_IOSP_U_REG (Unit Registration Response)"); + return (isp) ? std::string("TSBKO, IOSP_U_REG (Unit Registration Request)") : + std::string("TSBKO, IOSP_U_REG (Unit Registration Response)"); } diff --git a/src/common/p25/lc/tsbk/ISP_AUTH_FNE_RST.cpp b/src/common/p25/lc/tsbk/ISP_AUTH_FNE_RST.cpp index 2595cc27..34a90275 100644 --- a/src/common/p25/lc/tsbk/ISP_AUTH_FNE_RST.cpp +++ b/src/common/p25/lc/tsbk/ISP_AUTH_FNE_RST.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/ISP_AUTH_FNE_RST.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -30,7 +31,7 @@ ISP_AUTH_FNE_RST::ISP_AUTH_FNE_RST() : TSBK(), m_authSuccess(false), m_authStandalone(false) { - m_lco = TSBK_ISP_AUTH_FNE_RST; + m_lco = TSBKO::ISP_AUTH_FNE_RST; } /// @@ -79,7 +80,7 @@ void ISP_AUTH_FNE_RST::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string ISP_AUTH_FNE_RST::toString(bool isp) { - return std::string("TSBK_ISP_AUTH_FNE_RST (Authentication FNE Result)"); + return std::string("TSBKO, ISP_AUTH_FNE_RST (Authentication FNE Result)"); } // --------------------------------------------------------------------------- diff --git a/src/common/p25/lc/tsbk/ISP_AUTH_RESP.cpp b/src/common/p25/lc/tsbk/ISP_AUTH_RESP.cpp index 605c1300..91c57e46 100644 --- a/src/common/p25/lc/tsbk/ISP_AUTH_RESP.cpp +++ b/src/common/p25/lc/tsbk/ISP_AUTH_RESP.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/ISP_AUTH_RESP.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -30,10 +31,10 @@ ISP_AUTH_RESP::ISP_AUTH_RESP() : TSBK(), m_authStandalone(false), m_authRes(nullptr) { - m_lco = TSBK_ISP_AUTH_RESP; + m_lco = TSBKO::ISP_AUTH_RESP; - m_authRes = new uint8_t[P25_AUTH_RES_LENGTH_BYTES]; - ::memset(m_authRes, 0x00U, P25_AUTH_RES_LENGTH_BYTES); + m_authRes = new uint8_t[AUTH_RES_LENGTH_BYTES]; + ::memset(m_authRes, 0x00U, AUTH_RES_LENGTH_BYTES); } /// @@ -97,7 +98,7 @@ void ISP_AUTH_RESP::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string ISP_AUTH_RESP::toString(bool isp) { - return std::string("TSBK_ISP_AUTH_RESP (Authentication Response)"); + return std::string("TSBKO, ISP_AUTH_RESP (Authentication Response)"); } /// Gets the authentication result. @@ -106,7 +107,7 @@ void ISP_AUTH_RESP::getAuthRes(uint8_t* res) const { assert(res != nullptr); - ::memcpy(res, m_authRes, P25_AUTH_RES_LENGTH_BYTES); + ::memcpy(res, m_authRes, AUTH_RES_LENGTH_BYTES); } // --------------------------------------------------------------------------- @@ -127,6 +128,6 @@ void ISP_AUTH_RESP::copy(const ISP_AUTH_RESP& data) delete[] m_authRes; } - m_authRes = new uint8_t[P25_AUTH_RES_LENGTH_BYTES]; - ::memcpy(m_authRes, data.m_authRes, P25_AUTH_RES_LENGTH_BYTES); + m_authRes = new uint8_t[AUTH_RES_LENGTH_BYTES]; + ::memcpy(m_authRes, data.m_authRes, AUTH_RES_LENGTH_BYTES); } diff --git a/src/common/p25/lc/tsbk/ISP_AUTH_SU_DMD.cpp b/src/common/p25/lc/tsbk/ISP_AUTH_SU_DMD.cpp index 5b3e09fb..d02da778 100644 --- a/src/common/p25/lc/tsbk/ISP_AUTH_SU_DMD.cpp +++ b/src/common/p25/lc/tsbk/ISP_AUTH_SU_DMD.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/ISP_AUTH_SU_DMD.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// ISP_AUTH_SU_DMD::ISP_AUTH_SU_DMD() : TSBK() { - m_lco = TSBK_ISP_AUTH_SU_DMD; + m_lco = TSBKO::ISP_AUTH_SU_DMD; } /// @@ -75,5 +76,5 @@ void ISP_AUTH_SU_DMD::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string ISP_AUTH_SU_DMD::toString(bool isp) { - return std::string("TSBK_ISP_AUTH_SU_DMD (Authentication SU Demand)"); + return std::string("TSBKO, ISP_AUTH_SU_DMD (Authentication SU Demand)"); } diff --git a/src/common/p25/lc/tsbk/ISP_CAN_SRV_REQ.cpp b/src/common/p25/lc/tsbk/ISP_CAN_SRV_REQ.cpp index 1bdae04c..30a9eaeb 100644 --- a/src/common/p25/lc/tsbk/ISP_CAN_SRV_REQ.cpp +++ b/src/common/p25/lc/tsbk/ISP_CAN_SRV_REQ.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/ISP_CAN_SRV_REQ.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// ISP_CAN_SRV_REQ::ISP_CAN_SRV_REQ() : TSBK() { - m_lco = TSBK_ISP_CAN_SRV_REQ; + m_lco = TSBKO::ISP_CAN_SRV_REQ; } /// @@ -79,5 +80,5 @@ void ISP_CAN_SRV_REQ::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string ISP_CAN_SRV_REQ::toString(bool isp) { - return std::string("TSBK_ISP_CAN_SRV_REQ (Cancel Service Request)"); + return std::string("TSBKO, ISP_CAN_SRV_REQ (Cancel Service Request)"); } diff --git a/src/common/p25/lc/tsbk/ISP_EMERG_ALRM_REQ.cpp b/src/common/p25/lc/tsbk/ISP_EMERG_ALRM_REQ.cpp index 8821036c..d2b10e93 100644 --- a/src/common/p25/lc/tsbk/ISP_EMERG_ALRM_REQ.cpp +++ b/src/common/p25/lc/tsbk/ISP_EMERG_ALRM_REQ.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/ISP_EMERG_ALRM_REQ.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// ISP_EMERG_ALRM_REQ::ISP_EMERG_ALRM_REQ() : TSBK() { - m_lco = TSBK_ISP_EMERG_ALRM_REQ; + m_lco = TSBKO::ISP_EMERG_ALRM_REQ; } /// @@ -90,5 +91,5 @@ void ISP_EMERG_ALRM_REQ::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string ISP_EMERG_ALRM_REQ::toString(bool isp) { - return std::string("TSBK_ISP_EMERG_ALRM_REQ (Emergency Alarm Request)"); + return std::string("TSBKO, ISP_EMERG_ALRM_REQ (Emergency Alarm Request)"); } diff --git a/src/common/p25/lc/tsbk/ISP_GRP_AFF_Q_RSP.cpp b/src/common/p25/lc/tsbk/ISP_GRP_AFF_Q_RSP.cpp index 1a01d735..2d2aede4 100644 --- a/src/common/p25/lc/tsbk/ISP_GRP_AFF_Q_RSP.cpp +++ b/src/common/p25/lc/tsbk/ISP_GRP_AFF_Q_RSP.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/ISP_GRP_AFF_Q_RSP.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -27,9 +28,9 @@ using namespace p25; /// Initializes a new instance of the ISP_GRP_AFF_Q_RSP class. /// ISP_GRP_AFF_Q_RSP::ISP_GRP_AFF_Q_RSP() : TSBK(), - m_announceGroup(P25_WUID_ALL) + m_announceGroup(WUID_ALL) { - m_lco = TSBK_ISP_GRP_AFF_Q_RSP; + m_lco = TSBKO::ISP_GRP_AFF_Q_RSP; } /// @@ -78,7 +79,7 @@ void ISP_GRP_AFF_Q_RSP::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string ISP_GRP_AFF_Q_RSP::toString(bool isp) { - return std::string("TSBK_ISP_GRP_AFF_Q_RSP (Group Affiliation Query Response)"); + return std::string("TSBKO, ISP_GRP_AFF_Q_RSP (Group Affiliation Query Response)"); } // --------------------------------------------------------------------------- diff --git a/src/common/p25/lc/tsbk/ISP_LOC_REG_REQ.cpp b/src/common/p25/lc/tsbk/ISP_LOC_REG_REQ.cpp index 245326ee..ee612eb6 100644 --- a/src/common/p25/lc/tsbk/ISP_LOC_REG_REQ.cpp +++ b/src/common/p25/lc/tsbk/ISP_LOC_REG_REQ.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/ISP_LOC_REG_REQ.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -29,7 +30,7 @@ using namespace p25; ISP_LOC_REG_REQ::ISP_LOC_REG_REQ() : TSBK(), m_lra(0U) { - m_lco = TSBK_ISP_LOC_REG_REQ; + m_lco = TSBKO::ISP_LOC_REG_REQ; } /// @@ -78,7 +79,7 @@ void ISP_LOC_REG_REQ::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string ISP_LOC_REG_REQ::toString(bool isp) { - return std::string("TSBK_ISP_LOC_REG_REQ (Location Registration Request)"); + return std::string("TSBKO, ISP_LOC_REG_REQ (Location Registration Request)"); } // --------------------------------------------------------------------------- diff --git a/src/common/p25/lc/tsbk/ISP_SNDCP_CH_REQ.cpp b/src/common/p25/lc/tsbk/ISP_SNDCP_CH_REQ.cpp index ba53e802..7e41c218 100644 --- a/src/common/p25/lc/tsbk/ISP_SNDCP_CH_REQ.cpp +++ b/src/common/p25/lc/tsbk/ISP_SNDCP_CH_REQ.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/ISP_SNDCP_CH_REQ.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -30,7 +31,7 @@ ISP_SNDCP_CH_REQ::ISP_SNDCP_CH_REQ() : TSBK(), m_dataServiceOptions(0U), m_dataAccessControl(0U) { - m_lco = TSBK_ISP_SNDCP_CH_REQ; + m_lco = TSBKO::ISP_SNDCP_CH_REQ; } /// @@ -79,7 +80,7 @@ void ISP_SNDCP_CH_REQ::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string ISP_SNDCP_CH_REQ::toString(bool isp) { - return std::string("TSBK_ISP_SNDCP_CH_REQ (SNDCP Data Channel Request)"); + return std::string("TSBKO, ISP_SNDCP_CH_REQ (SNDCP Data Channel Request)"); } // --------------------------------------------------------------------------- diff --git a/src/common/p25/lc/tsbk/ISP_U_DEREG_REQ.cpp b/src/common/p25/lc/tsbk/ISP_U_DEREG_REQ.cpp index 792868e8..6e054992 100644 --- a/src/common/p25/lc/tsbk/ISP_U_DEREG_REQ.cpp +++ b/src/common/p25/lc/tsbk/ISP_U_DEREG_REQ.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/ISP_U_DEREG_REQ.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// ISP_U_DEREG_REQ::ISP_U_DEREG_REQ() : TSBK() { - m_lco = TSBK_ISP_U_DEREG_REQ; + m_lco = TSBKO::ISP_U_DEREG_REQ; } /// @@ -77,5 +78,5 @@ void ISP_U_DEREG_REQ::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string ISP_U_DEREG_REQ::toString(bool isp) { - return std::string("TSBK_ISP_U_DEREG_REQ (Unit De-Registration Request)"); + return std::string("TSBKO, ISP_U_DEREG_REQ (Unit De-Registration Request)"); } diff --git a/src/common/p25/lc/tsbk/OSP_ADJ_STS_BCAST.cpp b/src/common/p25/lc/tsbk/OSP_ADJ_STS_BCAST.cpp index 3a147fef..78156122 100644 --- a/src/common/p25/lc/tsbk/OSP_ADJ_STS_BCAST.cpp +++ b/src/common/p25/lc/tsbk/OSP_ADJ_STS_BCAST.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_ADJ_STS_BCAST.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -27,15 +28,15 @@ using namespace p25; /// Initializes a new instance of the OSP_ADJ_STS_BCAST class. /// OSP_ADJ_STS_BCAST::OSP_ADJ_STS_BCAST() : TSBK(), - m_adjCFVA(P25_CFVA_FAILURE), + m_adjCFVA(CFVA::FAILURE), m_adjSysId(0U), m_adjRfssId(0U), m_adjSiteId(0U), m_adjChannelId(0U), m_adjChannelNo(0U), - m_adjServiceClass(P25_SVC_CLS_INVALID) + m_adjServiceClass(ServiceClass::INVALID) { - m_lco = TSBK_OSP_ADJ_STS_BCAST; + m_lco = TSBKO::OSP_ADJ_STS_BCAST; } /// @@ -99,7 +100,7 @@ void OSP_ADJ_STS_BCAST::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_ADJ_STS_BCAST::toString(bool isp) { - return std::string("TSBK_OSP_ADJ_STS_BCAST (Adjacent Site Status Broadcast)"); + return std::string("TSBKO, OSP_ADJ_STS_BCAST (Adjacent Site Status Broadcast)"); } // --------------------------------------------------------------------------- diff --git a/src/common/p25/lc/tsbk/OSP_AUTH_FNE_RESP.cpp b/src/common/p25/lc/tsbk/OSP_AUTH_FNE_RESP.cpp index 040dc342..d772ea38 100644 --- a/src/common/p25/lc/tsbk/OSP_AUTH_FNE_RESP.cpp +++ b/src/common/p25/lc/tsbk/OSP_AUTH_FNE_RESP.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_AUTH_FNE_RESP.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -29,10 +30,10 @@ using namespace p25; OSP_AUTH_FNE_RESP::OSP_AUTH_FNE_RESP() : TSBK(), m_authRes(nullptr) { - m_lco = TSBK_OSP_AUTH_FNE_RESP; + m_lco = TSBKO::OSP_AUTH_FNE_RESP; - m_authRes = new uint8_t[P25_AUTH_RES_LENGTH_BYTES]; - ::memset(m_authRes, 0x00U, P25_AUTH_RES_LENGTH_BYTES); + m_authRes = new uint8_t[AUTH_RES_LENGTH_BYTES]; + ::memset(m_authRes, 0x00U, AUTH_RES_LENGTH_BYTES); } /// @@ -90,7 +91,7 @@ void OSP_AUTH_FNE_RESP::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_AUTH_FNE_RESP::toString(bool isp) { - return std::string("TSBK_OSP_AUTH_FNE_RESP (Authentication FNE Response)"); + return std::string("TSBKO, OSP_AUTH_FNE_RESP (Authentication FNE Response)"); } /// Sets the authentication result. @@ -103,8 +104,8 @@ void OSP_AUTH_FNE_RESP::setAuthRes(const uint8_t* res) delete[] m_authRes; } - m_authRes = new uint8_t[P25_AUTH_RES_LENGTH_BYTES]; - ::memcpy(m_authRes, res, P25_AUTH_RES_LENGTH_BYTES); + m_authRes = new uint8_t[AUTH_RES_LENGTH_BYTES]; + ::memcpy(m_authRes, res, AUTH_RES_LENGTH_BYTES); } // --------------------------------------------------------------------------- @@ -123,6 +124,6 @@ void OSP_AUTH_FNE_RESP::copy(const OSP_AUTH_FNE_RESP& data) delete[] m_authRes; } - m_authRes = new uint8_t[P25_AUTH_RES_LENGTH_BYTES]; - ::memcpy(m_authRes, data.m_authRes, P25_AUTH_RES_LENGTH_BYTES); + m_authRes = new uint8_t[AUTH_RES_LENGTH_BYTES]; + ::memcpy(m_authRes, data.m_authRes, AUTH_RES_LENGTH_BYTES); } diff --git a/src/common/p25/lc/tsbk/OSP_DENY_RSP.cpp b/src/common/p25/lc/tsbk/OSP_DENY_RSP.cpp index febd7e75..44ca8a42 100644 --- a/src/common/p25/lc/tsbk/OSP_DENY_RSP.cpp +++ b/src/common/p25/lc/tsbk/OSP_DENY_RSP.cpp @@ -7,16 +7,17 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_DENY_RSP.h" #include "Log.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -29,7 +30,7 @@ using namespace p25; /// OSP_DENY_RSP::OSP_DENY_RSP() : TSBK() { - m_lco = TSBK_OSP_DENY_RSP; + m_lco = TSBKO::OSP_DENY_RSP; } /// @@ -73,7 +74,7 @@ void OSP_DENY_RSP::encode(uint8_t* data, bool rawTSBK, bool noTrellis) ulong64_t tsbkValue = 0U; if (m_response == 0U) { - LogError(LOG_P25, "OSP_DENY_RSP::encode(), invalid values for TSBK_OSP_DENY_RSP, reason = %u", m_response); + LogError(LOG_P25, "OSP_DENY_RSP::encode(), invalid values for TSBKO::OSP_DENY_RSP, reason = %u", m_response); return; // blatantly ignore creating this TSBK } @@ -106,5 +107,5 @@ void OSP_DENY_RSP::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_DENY_RSP::toString(bool isp) { - return std::string("TSBK_OSP_DENY_RSP (Deny Response)"); + return std::string("TSBKO, OSP_DENY_RSP (Deny Response)"); } diff --git a/src/common/p25/lc/tsbk/OSP_DVM_LC_CALL_TERM.cpp b/src/common/p25/lc/tsbk/OSP_DVM_LC_CALL_TERM.cpp index 057a224e..f7f645fe 100644 --- a/src/common/p25/lc/tsbk/OSP_DVM_LC_CALL_TERM.cpp +++ b/src/common/p25/lc/tsbk/OSP_DVM_LC_CALL_TERM.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_DVM_LC_CALL_TERM.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,8 +29,7 @@ using namespace p25; /// OSP_DVM_LC_CALL_TERM::OSP_DVM_LC_CALL_TERM() : TSBK() { - m_lco = LC_CALL_TERM; - m_mfId = P25_MFG_DVM_OCS; + m_lco = LCO::CALL_TERM; } /// @@ -71,6 +71,8 @@ void OSP_DVM_LC_CALL_TERM::encode(uint8_t* data, bool rawTSBK, bool noTrellis) ulong64_t tsbkValue = 0U; + m_mfId = MFG_DVM_OCS; + tsbkValue = (tsbkValue << 4) + m_siteData.channelId(); // Channel ID tsbkValue = (tsbkValue << 12) + m_grpVchNo; // Channel Number tsbkValue = (tsbkValue << 16) + m_dstId; // Talkgroup Address diff --git a/src/common/p25/lc/tsbk/OSP_GRP_AFF_Q.cpp b/src/common/p25/lc/tsbk/OSP_GRP_AFF_Q.cpp index 085cc7b8..0c023345 100644 --- a/src/common/p25/lc/tsbk/OSP_GRP_AFF_Q.cpp +++ b/src/common/p25/lc/tsbk/OSP_GRP_AFF_Q.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_GRP_AFF_Q.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// OSP_GRP_AFF_Q::OSP_GRP_AFF_Q() : TSBK() { - m_lco = TSBK_OSP_GRP_AFF_Q; + m_lco = TSBKO::OSP_GRP_AFF_Q; } /// @@ -72,5 +73,5 @@ void OSP_GRP_AFF_Q::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_GRP_AFF_Q::toString(bool isp) { - return std::string("TSBK_OSP_GRP_AFF_Q (Group Affiliation Query)"); + return std::string("TSBKO, OSP_GRP_AFF_Q (Group Affiliation Query)"); } diff --git a/src/common/p25/lc/tsbk/OSP_GRP_VCH_GRANT_UPD.cpp b/src/common/p25/lc/tsbk/OSP_GRP_VCH_GRANT_UPD.cpp index f10c9811..92a3ae41 100644 --- a/src/common/p25/lc/tsbk/OSP_GRP_VCH_GRANT_UPD.cpp +++ b/src/common/p25/lc/tsbk/OSP_GRP_VCH_GRANT_UPD.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_GRP_VCH_GRANT_UPD.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// OSP_GRP_VCH_GRANT_UPD::OSP_GRP_VCH_GRANT_UPD() : TSBK() { - m_lco = TSBK_OSP_GRP_VCH_GRANT_UPD; + m_lco = TSBKO::OSP_GRP_VCH_GRANT_UPD; } /// @@ -90,5 +91,5 @@ void OSP_GRP_VCH_GRANT_UPD::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_GRP_VCH_GRANT_UPD::toString(bool isp) { - return std::string("TSBK_OSP_GRP_VCH_GRANT_UPD (Group Voice Channel Grant Update)"); + return std::string("TSBKO, OSP_GRP_VCH_GRANT_UPD (Group Voice Channel Grant Update)"); } diff --git a/src/common/p25/lc/tsbk/OSP_IDEN_UP.cpp b/src/common/p25/lc/tsbk/OSP_IDEN_UP.cpp index 82aa3568..f779cad8 100644 --- a/src/common/p25/lc/tsbk/OSP_IDEN_UP.cpp +++ b/src/common/p25/lc/tsbk/OSP_IDEN_UP.cpp @@ -7,16 +7,17 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_IDEN_UP.h" #include "Log.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include #include @@ -30,7 +31,7 @@ using namespace p25; /// OSP_IDEN_UP::OSP_IDEN_UP() : TSBK() { - m_lco = TSBK_OSP_IDEN_UP; + m_lco = TSBKO::OSP_IDEN_UP; } /// @@ -63,7 +64,7 @@ void OSP_IDEN_UP::encode(uint8_t* data, bool rawTSBK, bool noTrellis) if ((m_siteIdenEntry.chBandwidthKhz() != 0.0F) && (m_siteIdenEntry.chSpaceKhz() != 0.0F) && (m_siteIdenEntry.txOffsetMhz() != 0.0F) && (m_siteIdenEntry.baseFrequency() != 0U)) { if (m_siteIdenEntry.baseFrequency() < 762000000U) { - LogError(LOG_P25, "OSP_IDEN_UP::encode(), invalid values for TSBK_OSP_IDEN_UP, baseFrequency = %uHz", + LogError(LOG_P25, "OSP_IDEN_UP::encode(), invalid values for TSBKO::OSP_IDEN_UP, baseFrequency = %uHz", m_siteIdenEntry.baseFrequency()); return; // blatantly ignore creating this TSBK } @@ -85,7 +86,7 @@ void OSP_IDEN_UP::encode(uint8_t* data, bool rawTSBK, bool noTrellis) tsbkValue = (tsbkValue << 32) + calcBaseFreq; // Base Frequency } else { - LogError(LOG_P25, "OSP_IDEN_UP::encode(), invalid values for TSBK_OSP_IDEN_UP, baseFrequency = %uHz, txOffsetMhz = %fMHz, chBandwidthKhz = %fKHz, chSpaceKhz = %fKHz", + LogError(LOG_P25, "OSP_IDEN_UP::encode(), invalid values for TSBKO::OSP_IDEN_UP, baseFrequency = %uHz, txOffsetMhz = %fMHz, chBandwidthKhz = %fKHz, chSpaceKhz = %fKHz", m_siteIdenEntry.baseFrequency(), m_siteIdenEntry.txOffsetMhz(), m_siteIdenEntry.chBandwidthKhz(), m_siteIdenEntry.chSpaceKhz()); return; // blatently ignore creating this TSBK @@ -102,5 +103,5 @@ void OSP_IDEN_UP::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_IDEN_UP::toString(bool isp) { - return std::string("TSBK_OSP_IDEN_UP (Channel Identifier Update)"); + return std::string("TSBKO, OSP_IDEN_UP (Channel Identifier Update)"); } diff --git a/src/common/p25/lc/tsbk/OSP_IDEN_UP_VU.cpp b/src/common/p25/lc/tsbk/OSP_IDEN_UP_VU.cpp index 22053098..16b019b5 100644 --- a/src/common/p25/lc/tsbk/OSP_IDEN_UP_VU.cpp +++ b/src/common/p25/lc/tsbk/OSP_IDEN_UP_VU.cpp @@ -7,16 +7,17 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_IDEN_UP_VU.h" #include "Log.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include #include @@ -30,7 +31,7 @@ using namespace p25; /// OSP_IDEN_UP_VU::OSP_IDEN_UP_VU() : TSBK() { - m_lco = TSBK_OSP_IDEN_UP_VU; + m_lco = TSBKO::OSP_IDEN_UP_VU; } /// @@ -70,7 +71,7 @@ void OSP_IDEN_UP_VU::encode(uint8_t* data, bool rawTSBK, bool noTrellis) uCalcTxOffset |= 0x2000U; // this sets a positive offset ... uint32_t calcBaseFreq = (uint32_t)(m_siteIdenEntry.baseFrequency() / 5); - uint8_t chanBw = (m_siteIdenEntry.chBandwidthKhz() >= 12.5F) ? P25_IDEN_UP_VU_BW_125K : P25_IDEN_UP_VU_BW_625K; + uint8_t chanBw = (m_siteIdenEntry.chBandwidthKhz() >= 12.5F) ? IDEN_UP_VU_BW_125K : IDEN_UP_VU_BW_625K; tsbkValue = m_siteIdenEntry.channelId(); // Channel ID tsbkValue = (tsbkValue << 4) + chanBw; // Channel Bandwidth @@ -79,7 +80,7 @@ void OSP_IDEN_UP_VU::encode(uint8_t* data, bool rawTSBK, bool noTrellis) tsbkValue = (tsbkValue << 32) + calcBaseFreq; // Base Frequency } else { - LogError(LOG_P25, "OSP_IDEN_UP_VU::encode(), invalid values for TSBK_OSP_IDEN_UP_VU, baseFrequency = %uHz, txOffsetMhz = %fMHz, chBandwidthKhz = %fKHz, chSpaceKhz = %fKHz", + LogError(LOG_P25, "OSP_IDEN_UP_VU::encode(), invalid values for TSBKO::OSP_IDEN_UP_VU, baseFrequency = %uHz, txOffsetMhz = %fMHz, chBandwidthKhz = %fKHz, chSpaceKhz = %fKHz", m_siteIdenEntry.baseFrequency(), m_siteIdenEntry.txOffsetMhz(), m_siteIdenEntry.chBandwidthKhz(), m_siteIdenEntry.chSpaceKhz()); return; // blatantly ignore creating this TSBK @@ -96,5 +97,5 @@ void OSP_IDEN_UP_VU::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_IDEN_UP_VU::toString(bool isp) { - return std::string("TSBK_OSP_IDEN_UP_VU (Channel Identifier Update for VHF/UHF Bands)"); + return std::string("TSBKO, OSP_IDEN_UP_VU (Channel Identifier Update for VHF/UHF Bands)"); } diff --git a/src/common/p25/lc/tsbk/OSP_LOC_REG_RSP.cpp b/src/common/p25/lc/tsbk/OSP_LOC_REG_RSP.cpp index fb53134a..454f3e7e 100644 --- a/src/common/p25/lc/tsbk/OSP_LOC_REG_RSP.cpp +++ b/src/common/p25/lc/tsbk/OSP_LOC_REG_RSP.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_LOC_REG_RSP.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// OSP_LOC_REG_RSP::OSP_LOC_REG_RSP() : TSBK() { - m_lco = TSBK_OSP_LOC_REG_RSP; + m_lco = TSBKO::OSP_LOC_REG_RSP; } /// @@ -75,5 +76,5 @@ void OSP_LOC_REG_RSP::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_LOC_REG_RSP::toString(bool isp) { - return std::string("TSBK_OSP_LOC_REG_RSP (Location Registration Response)"); + return std::string("TSBKO, OSP_LOC_REG_RSP (Location Registration Response)"); } diff --git a/src/common/p25/lc/tsbk/OSP_MOT_CC_BSI.cpp b/src/common/p25/lc/tsbk/OSP_MOT_CC_BSI.cpp index 7ae994fc..9135ec55 100644 --- a/src/common/p25/lc/tsbk/OSP_MOT_CC_BSI.cpp +++ b/src/common/p25/lc/tsbk/OSP_MOT_CC_BSI.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_MOT_CC_BSI.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,8 +29,7 @@ using namespace p25; /// OSP_MOT_CC_BSI::OSP_MOT_CC_BSI() : TSBK() { - m_lco = TSBK_OSP_MOT_CC_BSI; - m_mfId = P25_MFG_MOT; + m_lco = TSBKO::OSP_MOT_CC_BSI; } /// @@ -59,8 +59,10 @@ void OSP_MOT_CC_BSI::encode(uint8_t* data, bool rawTSBK, bool noTrellis) ulong64_t tsbkValue = 0U; + m_mfId = MFG_MOT; + tsbkValue = (m_siteCallsign[0] - 43U) & 0x3F; // Character 0 - for (uint8_t i = 1; i < P25_MOT_CALLSIGN_LENGTH_BYTES; i++) { + for (uint8_t i = 1; i < MOT_CALLSIGN_LENGTH_BYTES; i++) { tsbkValue = (tsbkValue << 6) + ((m_siteCallsign[i] - 43U) & 0x3F); // Character 1 - 7 } tsbkValue = (tsbkValue << 4) + m_siteData.channelId(); // Channel ID @@ -77,5 +79,5 @@ void OSP_MOT_CC_BSI::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_MOT_CC_BSI::toString(bool isp) { - return std::string("TSBK_OSP_MOT_CC_BSI (Motorola / Control Channel Base Station Identifier)"); + return std::string("TSBKO, OSP_MOT_CC_BSI (Motorola / Control Channel Base Station Identifier)"); } diff --git a/src/common/p25/lc/tsbk/OSP_MOT_GRG_ADD.cpp b/src/common/p25/lc/tsbk/OSP_MOT_GRG_ADD.cpp index 6a385afa..81498247 100644 --- a/src/common/p25/lc/tsbk/OSP_MOT_GRG_ADD.cpp +++ b/src/common/p25/lc/tsbk/OSP_MOT_GRG_ADD.cpp @@ -7,16 +7,17 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_MOT_GRG_ADD.h" #include "Log.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -33,7 +34,7 @@ OSP_MOT_GRG_ADD::OSP_MOT_GRG_ADD() : TSBK(), m_patchGroup2Id(0U), m_patchGroup3Id(0U) { - m_lco = TSBK_OSP_MOT_GRG_ADD; + m_lco = TSBKO::OSP_MOT_GRG_ADD; } /// @@ -63,7 +64,7 @@ void OSP_MOT_GRG_ADD::encode(uint8_t* data, bool rawTSBK, bool noTrellis) ulong64_t tsbkValue = 0U; - m_mfId = P25_MFG_MOT; + m_mfId = MFG_MOT; if ((m_patchSuperGroupId != 0U)) { tsbkValue = m_patchSuperGroupId; // Patch Super Group Address @@ -84,7 +85,7 @@ void OSP_MOT_GRG_ADD::encode(uint8_t* data, bool rawTSBK, bool noTrellis) } } else { - LogError(LOG_P25, "OSP_MOT_GRG_ADD::encode(), invalid values for TSBK_OSP_MOT_GRG_DEL, patchSuperGroupId = $%02X, patchGroup1Id = $%02X", + LogError(LOG_P25, "OSP_MOT_GRG_ADD::encode(), invalid values for TSBKO::OSP_MOT_GRG_DEL, patchSuperGroupId = $%02X, patchGroup1Id = $%02X", m_patchSuperGroupId, m_patchGroup1Id); return; // blatantly ignore creating this TSBK } @@ -100,7 +101,7 @@ void OSP_MOT_GRG_ADD::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_MOT_GRG_ADD::toString(bool isp) { - return std::string("TSBK_OSP_MOT_GRG_ADD (Motorola / Group Regroup Add)"); + return std::string("TSBKO, OSP_MOT_GRG_ADD (Motorola / Group Regroup Add)"); } // --------------------------------------------------------------------------- diff --git a/src/common/p25/lc/tsbk/OSP_MOT_GRG_DEL.cpp b/src/common/p25/lc/tsbk/OSP_MOT_GRG_DEL.cpp index 74ca55ce..68b755d0 100644 --- a/src/common/p25/lc/tsbk/OSP_MOT_GRG_DEL.cpp +++ b/src/common/p25/lc/tsbk/OSP_MOT_GRG_DEL.cpp @@ -7,16 +7,17 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_MOT_GRG_DEL.h" #include "Log.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -33,7 +34,7 @@ OSP_MOT_GRG_DEL::OSP_MOT_GRG_DEL() : TSBK(), m_patchGroup2Id(0U), m_patchGroup3Id(0U) { - m_lco = TSBK_OSP_MOT_GRG_DEL; + m_lco = TSBKO::OSP_MOT_GRG_DEL; } /// @@ -63,7 +64,7 @@ void OSP_MOT_GRG_DEL::encode(uint8_t* data, bool rawTSBK, bool noTrellis) ulong64_t tsbkValue = 0U; - m_mfId = P25_MFG_MOT; + m_mfId = MFG_MOT; if ((m_patchSuperGroupId != 0U) && (m_patchGroup1Id != 0U)) { tsbkValue = m_patchSuperGroupId; // Patch Super Group Address @@ -84,7 +85,7 @@ void OSP_MOT_GRG_DEL::encode(uint8_t* data, bool rawTSBK, bool noTrellis) } } else { - LogError(LOG_P25, "OSP_MOT_GRG_DEL::encode(), invalid values for TSBK_OSP_MOT_GRG_DEL, patchSuperGroupId = $%02X, patchGroup1Id = $%02X", + LogError(LOG_P25, "OSP_MOT_GRG_DEL::encode(), invalid values for TSBKO::OSP_MOT_GRG_DEL, patchSuperGroupId = $%02X, patchGroup1Id = $%02X", m_patchSuperGroupId, m_patchGroup1Id); return; // blatantly ignore creating this TSBK } @@ -100,7 +101,7 @@ void OSP_MOT_GRG_DEL::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_MOT_GRG_DEL::toString(bool isp) { - return std::string("TSBK_OSP_MOT_GRG_DEL (Motorola / Group Regroup Delete)"); + return std::string("TSBKO, OSP_MOT_GRG_DEL (Motorola / Group Regroup Delete)"); } // --------------------------------------------------------------------------- diff --git a/src/common/p25/lc/tsbk/OSP_MOT_GRG_VCH_GRANT.cpp b/src/common/p25/lc/tsbk/OSP_MOT_GRG_VCH_GRANT.cpp index af9cc02f..46103a04 100644 --- a/src/common/p25/lc/tsbk/OSP_MOT_GRG_VCH_GRANT.cpp +++ b/src/common/p25/lc/tsbk/OSP_MOT_GRG_VCH_GRANT.cpp @@ -7,16 +7,17 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_MOT_GRG_VCH_GRANT.h" #include "Log.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -30,7 +31,7 @@ using namespace p25; OSP_MOT_GRG_VCH_GRANT::OSP_MOT_GRG_VCH_GRANT() : TSBK(), m_patchSuperGroupId(0U) { - m_lco = TSBK_OSP_MOT_GRG_VCH_GRANT; + m_lco = TSBKO::OSP_MOT_GRG_VCH_GRANT; } /// @@ -60,7 +61,7 @@ void OSP_MOT_GRG_VCH_GRANT::encode(uint8_t* data, bool rawTSBK, bool noTrellis) ulong64_t tsbkValue = 0U; - m_mfId = P25_MFG_MOT; + m_mfId = MFG_MOT; if (m_patchSuperGroupId != 0U) { tsbkValue = 0U; // Priority @@ -70,7 +71,7 @@ void OSP_MOT_GRG_VCH_GRANT::encode(uint8_t* data, bool rawTSBK, bool noTrellis) tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address } else { - LogError(LOG_P25, "OSP_MOT_GRG_VCH_GRANT::encode(), invalid values for TSBK_OSP_MOT_GRG_VCH_GRANT, patchSuperGroupId = $%02X", m_patchSuperGroupId); + LogError(LOG_P25, "OSP_MOT_GRG_VCH_GRANT::encode(), invalid values for TSBKO::OSP_MOT_GRG_VCH_GRANT, patchSuperGroupId = $%02X", m_patchSuperGroupId); return; // blatantly ignore creating this TSBK } @@ -85,7 +86,7 @@ void OSP_MOT_GRG_VCH_GRANT::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_MOT_GRG_VCH_GRANT::toString(bool isp) { - return std::string("TSBK_OSP_MOT_GRG_VCH_GRANT (Group Regroup Voice Channel Grant)"); + return std::string("TSBKO, OSP_MOT_GRG_VCH_GRANT (Group Regroup Voice Channel Grant)"); } // --------------------------------------------------------------------------- diff --git a/src/common/p25/lc/tsbk/OSP_MOT_GRG_VCH_UPD.cpp b/src/common/p25/lc/tsbk/OSP_MOT_GRG_VCH_UPD.cpp index d01f83e0..69f2ef15 100644 --- a/src/common/p25/lc/tsbk/OSP_MOT_GRG_VCH_UPD.cpp +++ b/src/common/p25/lc/tsbk/OSP_MOT_GRG_VCH_UPD.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_MOT_GRG_VCH_UPD.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -30,7 +31,7 @@ OSP_MOT_GRG_VCH_UPD::OSP_MOT_GRG_VCH_UPD() : TSBK(), m_patchGroup1Id(0U), m_patchGroup2Id(0U) { - m_lco = TSBK_OSP_MOT_GRG_VCH_UPD; + m_lco = TSBKO::OSP_MOT_GRG_VCH_UPD; } /// @@ -60,7 +61,7 @@ void OSP_MOT_GRG_VCH_UPD::encode(uint8_t* data, bool rawTSBK, bool noTrellis) ulong64_t tsbkValue = 0U; - m_mfId = P25_MFG_MOT; + m_mfId = MFG_MOT; tsbkValue = m_siteData.channelId(); // Channel ID tsbkValue = (tsbkValue << 4) + m_siteData.channelNo(); // Channel Number @@ -80,7 +81,7 @@ void OSP_MOT_GRG_VCH_UPD::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_MOT_GRG_VCH_UPD::toString(bool isp) { - return std::string("TSBK_OSP_MOT_GRG_VCH_UPD (Group Regroup Voice Channel Grant Update)"); + return std::string("TSBKO, OSP_MOT_GRG_VCH_UPD (Group Regroup Voice Channel Grant Update)"); } // --------------------------------------------------------------------------- diff --git a/src/common/p25/lc/tsbk/OSP_MOT_PSH_CCH.cpp b/src/common/p25/lc/tsbk/OSP_MOT_PSH_CCH.cpp index 96f634d9..ea6187bb 100644 --- a/src/common/p25/lc/tsbk/OSP_MOT_PSH_CCH.cpp +++ b/src/common/p25/lc/tsbk/OSP_MOT_PSH_CCH.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_MOT_PSH_CCH.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,8 +29,7 @@ using namespace p25; /// OSP_MOT_PSH_CCH::OSP_MOT_PSH_CCH() : TSBK() { - m_lco = TSBK_OSP_MOT_PSH_CCH; - m_mfId = P25_MFG_MOT; + m_lco = TSBKO::OSP_MOT_PSH_CCH; } /// @@ -59,6 +59,8 @@ void OSP_MOT_PSH_CCH::encode(uint8_t* data, bool rawTSBK, bool noTrellis) ulong64_t tsbkValue = 0U; + m_mfId = MFG_MOT; + std::unique_ptr tsbk = TSBK::fromValue(tsbkValue); TSBK::encode(data, tsbk.get(), rawTSBK, noTrellis); } @@ -70,5 +72,5 @@ void OSP_MOT_PSH_CCH::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_MOT_PSH_CCH::toString(bool isp) { - return std::string("TSBK_OSP_MOT_PSH_CCH (Motorola / Planned Control Channel Shutdown)"); + return std::string("TSBKO, OSP_MOT_PSH_CCH (Motorola / Planned Control Channel Shutdown)"); } diff --git a/src/common/p25/lc/tsbk/OSP_NET_STS_BCAST.cpp b/src/common/p25/lc/tsbk/OSP_NET_STS_BCAST.cpp index b4b69dc3..0fd754e2 100644 --- a/src/common/p25/lc/tsbk/OSP_NET_STS_BCAST.cpp +++ b/src/common/p25/lc/tsbk/OSP_NET_STS_BCAST.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_NET_STS_BCAST.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// OSP_NET_STS_BCAST::OSP_NET_STS_BCAST() : TSBK() { - m_lco = TSBK_OSP_NET_STS_BCAST; + m_lco = TSBKO::OSP_NET_STS_BCAST; } /// @@ -76,5 +77,5 @@ void OSP_NET_STS_BCAST::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_NET_STS_BCAST::toString(bool isp) { - return std::string("TSBK_OSP_NET_STS_BCAST (Network Status Broadcast)"); + return std::string("TSBKO, OSP_NET_STS_BCAST (Network Status Broadcast)"); } diff --git a/src/common/p25/lc/tsbk/OSP_QUE_RSP.cpp b/src/common/p25/lc/tsbk/OSP_QUE_RSP.cpp index 9ab7c920..da8fcc75 100644 --- a/src/common/p25/lc/tsbk/OSP_QUE_RSP.cpp +++ b/src/common/p25/lc/tsbk/OSP_QUE_RSP.cpp @@ -7,16 +7,17 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_QUE_RSP.h" #include "Log.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -29,7 +30,7 @@ using namespace p25; /// OSP_QUE_RSP::OSP_QUE_RSP() : TSBK() { - m_lco = TSBK_OSP_QUE_RSP; + m_lco = TSBKO::OSP_QUE_RSP; } /// @@ -73,7 +74,7 @@ void OSP_QUE_RSP::encode(uint8_t* data, bool rawTSBK, bool noTrellis) ulong64_t tsbkValue = 0U; if (m_response == 0U) { - LogError(LOG_P25, "OSP_QUE_RSP::encode(), invalid values for TSBK_OSP_QUE_RSP, reason = %u", m_response); + LogError(LOG_P25, "OSP_QUE_RSP::encode(), invalid values for TSBKO::OSP_QUE_RSP, reason = %u", m_response); return; // blatantly ignore creating this TSBK } @@ -106,5 +107,5 @@ void OSP_QUE_RSP::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_QUE_RSP::toString(bool isp) { - return std::string("TSBK_OSP_QUE_RSP (Queued Response)"); + return std::string("TSBKO, OSP_QUE_RSP (Queued Response)"); } diff --git a/src/common/p25/lc/tsbk/OSP_RFSS_STS_BCAST.cpp b/src/common/p25/lc/tsbk/OSP_RFSS_STS_BCAST.cpp index 4d0f86b7..55bc29e5 100644 --- a/src/common/p25/lc/tsbk/OSP_RFSS_STS_BCAST.cpp +++ b/src/common/p25/lc/tsbk/OSP_RFSS_STS_BCAST.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_RFSS_STS_BCAST.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -29,7 +30,7 @@ using namespace p25; OSP_RFSS_STS_BCAST::OSP_RFSS_STS_BCAST() : TSBK(), m_roamerReaccess(false) { - m_lco = TSBK_OSP_RFSS_STS_BCAST; + m_lco = TSBKO::OSP_RFSS_STS_BCAST; } /// @@ -81,5 +82,5 @@ void OSP_RFSS_STS_BCAST::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_RFSS_STS_BCAST::toString(bool isp) { - return std::string("TSBK_OSP_RFSS_STS_BCAST (RFSS Status Broadcast)"); + return std::string("TSBKO, OSP_RFSS_STS_BCAST (RFSS Status Broadcast)"); } diff --git a/src/common/p25/lc/tsbk/OSP_SCCB.cpp b/src/common/p25/lc/tsbk/OSP_SCCB.cpp index b7974e90..b1a4c89b 100644 --- a/src/common/p25/lc/tsbk/OSP_SCCB.cpp +++ b/src/common/p25/lc/tsbk/OSP_SCCB.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_SCCB.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -30,7 +31,7 @@ OSP_SCCB::OSP_SCCB() : TSBK(), m_sccbChannelId1(0U), m_sccbChannelId2(0U) { - m_lco = TSBK_OSP_SCCB; + m_lco = TSBKO::OSP_SCCB; } /// @@ -67,14 +68,14 @@ void OSP_SCCB::encode(uint8_t* data, bool rawTSBK, bool noTrellis) tsbkValue = (tsbkValue << 8) + m_siteData.serviceClass(); // System Service Class } else { - tsbkValue = (tsbkValue << 8) + (P25_SVC_CLS_INVALID); // System Service Class + tsbkValue = (tsbkValue << 8) + (ServiceClass::INVALID); // System Service Class } tsbkValue = (tsbkValue << 16) + m_sccbChannelId2; // SCCB Channel ID 2 if (m_sccbChannelId2 > 0) { tsbkValue = (tsbkValue << 8) + m_siteData.serviceClass(); // System Service Class } else { - tsbkValue = (tsbkValue << 8) + (P25_SVC_CLS_INVALID); // System Service Class + tsbkValue = (tsbkValue << 8) + (ServiceClass::INVALID); // System Service Class } std::unique_ptr tsbk = TSBK::fromValue(tsbkValue); @@ -88,7 +89,7 @@ void OSP_SCCB::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_SCCB::toString(bool isp) { - return std::string("TSBK_OSP_SCCB (Secondary Control Channel Broadcast)"); + return std::string("TSBKO, OSP_SCCB (Secondary Control Channel Broadcast)"); } // --------------------------------------------------------------------------- diff --git a/src/common/p25/lc/tsbk/OSP_SCCB_EXP.cpp b/src/common/p25/lc/tsbk/OSP_SCCB_EXP.cpp index e813db07..fa350b1e 100644 --- a/src/common/p25/lc/tsbk/OSP_SCCB_EXP.cpp +++ b/src/common/p25/lc/tsbk/OSP_SCCB_EXP.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_SCCB_EXP.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -30,7 +31,7 @@ OSP_SCCB_EXP::OSP_SCCB_EXP() : TSBK(), m_sccbChannelId1(0U), m_sccbChannelNo(0U) { - m_lco = TSBK_OSP_SCCB_EXP; + m_lco = TSBKO::OSP_SCCB_EXP; } /// @@ -72,7 +73,7 @@ void OSP_SCCB_EXP::encode(uint8_t* data, bool rawTSBK, bool noTrellis) tsbkValue = (tsbkValue << 8) + m_siteData.serviceClass(); // System Service Class } else { - tsbkValue = (tsbkValue << 8) + (P25_SVC_CLS_INVALID); // System Service Class + tsbkValue = (tsbkValue << 8) + (ServiceClass::INVALID); // System Service Class } std::unique_ptr tsbk = TSBK::fromValue(tsbkValue); @@ -86,7 +87,7 @@ void OSP_SCCB_EXP::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_SCCB_EXP::toString(bool isp) { - return std::string("TSBK_OSP_SCCB_EXP (Secondary Control Channel Broadcast - Explicit)"); + return std::string("TSBKO, OSP_SCCB_EXP (Secondary Control Channel Broadcast - Explicit)"); } // --------------------------------------------------------------------------- diff --git a/src/common/p25/lc/tsbk/OSP_SNDCP_CH_ANN.cpp b/src/common/p25/lc/tsbk/OSP_SNDCP_CH_ANN.cpp index a8cc6cda..afa77096 100644 --- a/src/common/p25/lc/tsbk/OSP_SNDCP_CH_ANN.cpp +++ b/src/common/p25/lc/tsbk/OSP_SNDCP_CH_ANN.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_SNDCP_CH_ANN.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -30,7 +31,7 @@ OSP_SNDCP_CH_ANN::OSP_SNDCP_CH_ANN() : TSBK(), m_sndcpAutoAccess(true), m_sndcpDAC(1U) { - m_lco = TSBK_OSP_SNDCP_CH_ANN; + m_lco = TSBKO::OSP_SNDCP_CH_ANN; } /// @@ -92,7 +93,7 @@ void OSP_SNDCP_CH_ANN::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_SNDCP_CH_ANN::toString(bool isp) { - return std::string("TSBK_OSP_SNDCP_CH_ANN (SNDCP Data Channel Announcement)"); + return std::string("TSBKO, OSP_SNDCP_CH_ANN (SNDCP Data Channel Announcement)"); } // --------------------------------------------------------------------------- diff --git a/src/common/p25/lc/tsbk/OSP_SNDCP_CH_GNT.cpp b/src/common/p25/lc/tsbk/OSP_SNDCP_CH_GNT.cpp index 184d67c7..63766722 100644 --- a/src/common/p25/lc/tsbk/OSP_SNDCP_CH_GNT.cpp +++ b/src/common/p25/lc/tsbk/OSP_SNDCP_CH_GNT.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_SNDCP_CH_GNT.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -30,7 +31,7 @@ OSP_SNDCP_CH_GNT::OSP_SNDCP_CH_GNT() : TSBK(), m_dataServiceOptions(0U), m_dataChannelNo(0U) { - m_lco = TSBK_OSP_SNDCP_CH_GNT; + m_lco = TSBKO::OSP_SNDCP_CH_GNT; } /// @@ -98,7 +99,7 @@ void OSP_SNDCP_CH_GNT::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_SNDCP_CH_GNT::toString(bool isp) { - return std::string("TSBK_OSP_SNDCP_CH_GNT (SNDCP Data Channel Grant)"); + return std::string("TSBKO, OSP_SNDCP_CH_GNT (SNDCP Data Channel Grant)"); } // --------------------------------------------------------------------------- diff --git a/src/common/p25/lc/tsbk/OSP_SYNC_BCAST.cpp b/src/common/p25/lc/tsbk/OSP_SYNC_BCAST.cpp index ce8f9013..4326abe6 100644 --- a/src/common/p25/lc/tsbk/OSP_SYNC_BCAST.cpp +++ b/src/common/p25/lc/tsbk/OSP_SYNC_BCAST.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_SYNC_BCAST.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include #include @@ -32,7 +33,7 @@ using namespace p25; OSP_SYNC_BCAST::OSP_SYNC_BCAST() : TSBK(), m_microslotCount(0U) { - m_lco = TSBK_OSP_SYNC_BCAST; + m_lco = TSBKO::OSP_SYNC_BCAST; } /// @@ -70,7 +71,7 @@ void OSP_SYNC_BCAST::encode(uint8_t* data, bool rawTSBK, bool noTrellis) uint32_t tmY = (local_tm.tm_year + 1900) - 2000; #if DEBUG_P25_TSBK - LogDebug(LOG_P25, "TSBK_OSP_SYNC_BCAST, tmM = %u / %u, tmY = %u / %u", local_tm.tm_mon, tmM, local_tm.tm_year, tmY); + LogDebug(LOG_P25, "TSBKO, OSP_SYNC_BCAST, tmM = %u / %u, tmY = %u / %u", local_tm.tm_mon, tmM, local_tm.tm_year, tmY); #endif // determine LTO and direction (positive or negative) @@ -120,7 +121,7 @@ void OSP_SYNC_BCAST::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_SYNC_BCAST::toString(bool isp) { - return std::string("TSBK_OSP_SYNC_BCAST (Synchronization Broadcast)"); + return std::string("TSBKO, OSP_SYNC_BCAST (Synchronization Broadcast)"); } // --------------------------------------------------------------------------- diff --git a/src/common/p25/lc/tsbk/OSP_SYS_SRV_BCAST.cpp b/src/common/p25/lc/tsbk/OSP_SYS_SRV_BCAST.cpp index 088b5747..e64e369e 100644 --- a/src/common/p25/lc/tsbk/OSP_SYS_SRV_BCAST.cpp +++ b/src/common/p25/lc/tsbk/OSP_SYS_SRV_BCAST.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_SYS_SRV_BCAST.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// OSP_SYS_SRV_BCAST::OSP_SYS_SRV_BCAST() : TSBK() { - m_lco = TSBK_OSP_SYS_SRV_BCAST; + m_lco = TSBKO::OSP_SYS_SRV_BCAST; } /// @@ -56,7 +57,7 @@ void OSP_SYS_SRV_BCAST::encode(uint8_t* data, bool rawTSBK, bool noTrellis) { assert(data != nullptr); - const uint32_t services = (m_siteData.netActive()) ? P25_SYS_SRV_NET_ACTIVE : 0U | P25_SYS_SRV_DEFAULT; + const uint32_t services = (m_siteData.netActive()) ? SystemService::NET_ACTIVE : 0U | SYS_SRV_DEFAULT; ulong64_t tsbkValue = 0U; @@ -74,5 +75,5 @@ void OSP_SYS_SRV_BCAST::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_SYS_SRV_BCAST::toString(bool isp) { - return std::string("TSBK_OSP_SYS_SRV_BCAST (System Service Broadcast)"); + return std::string("TSBKO, OSP_SYS_SRV_BCAST (System Service Broadcast)"); } diff --git a/src/common/p25/lc/tsbk/OSP_TIME_DATE_ANN.cpp b/src/common/p25/lc/tsbk/OSP_TIME_DATE_ANN.cpp index 22809772..c7432cd3 100644 --- a/src/common/p25/lc/tsbk/OSP_TIME_DATE_ANN.cpp +++ b/src/common/p25/lc/tsbk/OSP_TIME_DATE_ANN.cpp @@ -8,15 +8,16 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2022 by Jason-UWU -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_TIME_DATE_ANN.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include #include @@ -32,7 +33,7 @@ using namespace p25; /// OSP_TIME_DATE_ANN::OSP_TIME_DATE_ANN() : TSBK() { - m_lco = TSBK_OSP_TIME_DATE_ANN; + m_lco = TSBKO::OSP_TIME_DATE_ANN; } /// @@ -78,7 +79,7 @@ void OSP_TIME_DATE_ANN::encode(uint8_t* data, bool rawTSBK, bool noTrellis) } #if DEBUG_P25_TSBK - LogDebug(LOG_P25, "TSBK_OSP_TIME_DATE_ANN, tmM = %u / %u, tmY = %u / %u", local_tm.tm_mon, tmM, local_tm.tm_year, tmY); + LogDebug(LOG_P25, "TSBKO, OSP_TIME_DATE_ANN, tmM = %u / %u, tmY = %u / %u", local_tm.tm_mon, tmM, local_tm.tm_year, tmY); #endif uint8_t lto = fabs(m_siteData.lto()) * 2U; // this will cause a bug for half-hour timezone intervals... @@ -106,7 +107,7 @@ void OSP_TIME_DATE_ANN::encode(uint8_t* data, bool rawTSBK, bool noTrellis) tsbkValue = (tsbkValue << 7); // Reserved #if DEBUG_P25_TSBK - LogDebug(LOG_P25, "TSBK_OSP_TIME_DATE_ANN, tmM = %u, tmMDAY = %u, tmY = %u, tmH = %u, tmMin = %u, tmS = %u", tmM, tmMDAY, tmY, tmH, tmMin, tmS); + LogDebug(LOG_P25, "TSBKO, OSP_TIME_DATE_ANN, tmM = %u, tmMDAY = %u, tmY = %u, tmH = %u, tmMin = %u, tmS = %u", tmM, tmMDAY, tmY, tmH, tmMin, tmS); #endif std::unique_ptr tsbk = TSBK::fromValue(tsbkValue); @@ -120,5 +121,5 @@ void OSP_TIME_DATE_ANN::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_TIME_DATE_ANN::toString(bool isp) { - return std::string("TSBK_OSP_TIME_DATE_ANN (Time and Date Announcement)"); + return std::string("TSBKO, OSP_TIME_DATE_ANN (Time and Date Announcement)"); } diff --git a/src/common/p25/lc/tsbk/OSP_TSBK_RAW.cpp b/src/common/p25/lc/tsbk/OSP_TSBK_RAW.cpp index eabd7206..fde73e26 100644 --- a/src/common/p25/lc/tsbk/OSP_TSBK_RAW.cpp +++ b/src/common/p25/lc/tsbk/OSP_TSBK_RAW.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2023 Bryan Biedenkapp, N2PLL +* Copyright (C) 2023,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_TSBK_RAW.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -29,7 +30,7 @@ using namespace p25; OSP_TSBK_RAW::OSP_TSBK_RAW() : TSBK(), m_tsbk(nullptr) { - m_lco = TSBK_IOSP_ACK_RSP; + m_lco = TSBKO::IOSP_ACK_RSP; } /// diff --git a/src/common/p25/lc/tsbk/OSP_UU_VCH_GRANT_UPD.cpp b/src/common/p25/lc/tsbk/OSP_UU_VCH_GRANT_UPD.cpp index 1c4885e9..68391d75 100644 --- a/src/common/p25/lc/tsbk/OSP_UU_VCH_GRANT_UPD.cpp +++ b/src/common/p25/lc/tsbk/OSP_UU_VCH_GRANT_UPD.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2023 Bryan Biedenkapp, N2PLL +* Copyright (C) 2023,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_UU_VCH_GRANT_UPD.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// OSP_UU_VCH_GRANT_UPD::OSP_UU_VCH_GRANT_UPD() : TSBK() { - m_lco = TSBK_OSP_UU_VCH_GRANT_UPD; + m_lco = TSBKO::OSP_UU_VCH_GRANT_UPD; } /// @@ -91,5 +92,5 @@ void OSP_UU_VCH_GRANT_UPD::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_UU_VCH_GRANT_UPD::toString(bool isp) { - return std::string("TSBK_OSP_UU_VCH_GRANT_UPD (Unit-to-Unit Voice Channel Grant Update)"); + return std::string("TSBKO, OSP_UU_VCH_GRANT_UPD (Unit-to-Unit Voice Channel Grant Update)"); } diff --git a/src/common/p25/lc/tsbk/OSP_U_DEREG_ACK.cpp b/src/common/p25/lc/tsbk/OSP_U_DEREG_ACK.cpp index ae0e6694..ee156534 100644 --- a/src/common/p25/lc/tsbk/OSP_U_DEREG_ACK.cpp +++ b/src/common/p25/lc/tsbk/OSP_U_DEREG_ACK.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_U_DEREG_ACK.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// OSP_U_DEREG_ACK::OSP_U_DEREG_ACK() : TSBK() { - m_lco = TSBK_OSP_U_DEREG_ACK; + m_lco = TSBKO::OSP_U_DEREG_ACK; } /// @@ -84,5 +85,5 @@ void OSP_U_DEREG_ACK::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_U_DEREG_ACK::toString(bool isp) { - return std::string("TSBK_OSP_U_DEREG_ACK (Unit De-Registration Acknowledge)"); + return std::string("TSBKO, OSP_U_DEREG_ACK (Unit De-Registration Acknowledge)"); } diff --git a/src/common/p25/lc/tsbk/OSP_U_REG_CMD.cpp b/src/common/p25/lc/tsbk/OSP_U_REG_CMD.cpp index 94badc27..a08fb0ba 100644 --- a/src/common/p25/lc/tsbk/OSP_U_REG_CMD.cpp +++ b/src/common/p25/lc/tsbk/OSP_U_REG_CMD.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_U_REG_CMD.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// OSP_U_REG_CMD::OSP_U_REG_CMD() : TSBK() { - m_lco = TSBK_OSP_U_REG_CMD; + m_lco = TSBKO::OSP_U_REG_CMD; } /// @@ -72,5 +73,5 @@ void OSP_U_REG_CMD::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_U_REG_CMD::toString(bool isp) { - return std::string("TSBK_OSP_U_REG_CMD (Unit Registration Command)"); + return std::string("TSBKO, OSP_U_REG_CMD (Unit Registration Command)"); } diff --git a/src/common/p25/lc/tsbk/TSBKFactory.cpp b/src/common/p25/lc/tsbk/TSBKFactory.cpp index 7623ff03..a650f0f4 100644 --- a/src/common/p25/lc/tsbk/TSBKFactory.cpp +++ b/src/common/p25/lc/tsbk/TSBKFactory.cpp @@ -7,7 +7,7 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -16,9 +16,10 @@ #include "Log.h" #include "Utils.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -118,34 +119,34 @@ std::unique_ptr TSBKFactory::createTSBK(const uint8_t* data, bool rawTSBK) uint8_t mfId = tsbk[1U]; // Mfg Id. // Motorola P25 vendor opcodes - if (mfId == P25_MFG_MOT) { + if (mfId == MFG_MOT) { switch (lco) { - case TSBK_IOSP_GRP_VCH: - case TSBK_IOSP_UU_VCH: - case TSBK_IOSP_UU_ANS: - case TSBK_IOSP_TELE_INT_ANS: - case TSBK_IOSP_STS_UPDT: - case TSBK_IOSP_STS_Q: - case TSBK_IOSP_MSG_UPDT: - case TSBK_IOSP_CALL_ALRT: - case TSBK_IOSP_ACK_RSP: - case TSBK_IOSP_GRP_AFF: - case TSBK_IOSP_U_REG: - case TSBK_ISP_CAN_SRV_REQ: - case TSBK_ISP_GRP_AFF_Q_RSP: - case TSBK_OSP_DENY_RSP: - case TSBK_OSP_QUE_RSP: - case TSBK_ISP_U_DEREG_REQ: - case TSBK_OSP_U_DEREG_ACK: - case TSBK_ISP_LOC_REG_REQ: - mfId = P25_MFG_STANDARD; + case TSBKO::IOSP_GRP_VCH: + case TSBKO::IOSP_UU_VCH: + case TSBKO::IOSP_UU_ANS: + case TSBKO::IOSP_TELE_INT_ANS: + case TSBKO::IOSP_STS_UPDT: + case TSBKO::IOSP_STS_Q: + case TSBKO::IOSP_MSG_UPDT: + case TSBKO::IOSP_CALL_ALRT: + case TSBKO::IOSP_ACK_RSP: + case TSBKO::IOSP_GRP_AFF: + case TSBKO::IOSP_U_REG: + case TSBKO::ISP_CAN_SRV_REQ: + case TSBKO::ISP_GRP_AFF_Q_RSP: + case TSBKO::OSP_DENY_RSP: + case TSBKO::OSP_QUE_RSP: + case TSBKO::ISP_U_DEREG_REQ: + case TSBKO::OSP_U_DEREG_ACK: + case TSBKO::ISP_LOC_REG_REQ: + mfId = MFG_STANDARD; break; default: LogError(LOG_P25, "TSBKFactory::createTSBK(), unknown TSBK LCO value, mfId = $%02X, lco = $%02X", mfId, lco); break; } - if (mfId == P25_MFG_MOT) { + if (mfId == MFG_MOT) { return nullptr; } else { @@ -154,16 +155,16 @@ std::unique_ptr TSBKFactory::createTSBK(const uint8_t* data, bool rawTSBK) } // internal / Omaha Communication Systems P25 vendor opcodes - if (mfId == P25_MFG_DVM_OCS) { + if (mfId == MFG_DVM_OCS) { switch (lco) { - case LC_CALL_TERM: + case LCO::CALL_TERM: return decode(new OSP_DVM_LC_CALL_TERM(), data, rawTSBK); default: - mfId = P25_MFG_STANDARD; + mfId = MFG_STANDARD; break; } - if (mfId == P25_MFG_DVM_OCS) { + if (mfId == MFG_DVM_OCS) { return nullptr; } else { @@ -173,55 +174,55 @@ std::unique_ptr TSBKFactory::createTSBK(const uint8_t* data, bool rawTSBK) // standard P25 reference opcodes switch (lco) { - case TSBK_IOSP_GRP_VCH: + case TSBKO::IOSP_GRP_VCH: return decode(new IOSP_GRP_VCH(), data, rawTSBK); - case TSBK_OSP_GRP_VCH_GRANT_UPD: + case TSBKO::OSP_GRP_VCH_GRANT_UPD: return decode(new OSP_GRP_VCH_GRANT_UPD(), data, rawTSBK); - case TSBK_IOSP_UU_VCH: + case TSBKO::IOSP_UU_VCH: return decode(new IOSP_UU_VCH(), data, rawTSBK); - case TSBK_OSP_UU_VCH_GRANT_UPD: + case TSBKO::OSP_UU_VCH_GRANT_UPD: return decode(new OSP_UU_VCH_GRANT_UPD(), data, rawTSBK); - case TSBK_IOSP_UU_ANS: + case TSBKO::IOSP_UU_ANS: return decode(new IOSP_UU_ANS(), data, rawTSBK); - case TSBK_ISP_SNDCP_CH_REQ: + case TSBKO::ISP_SNDCP_CH_REQ: return decode(new ISP_SNDCP_CH_REQ(), data, rawTSBK); - case TSBK_IOSP_STS_UPDT: + case TSBKO::IOSP_STS_UPDT: return decode(new IOSP_STS_UPDT(), data, rawTSBK); - case TSBK_IOSP_MSG_UPDT: + case TSBKO::IOSP_MSG_UPDT: return decode(new IOSP_MSG_UPDT(), data, rawTSBK); - case TSBK_IOSP_RAD_MON: + case TSBKO::IOSP_RAD_MON: return decode(new IOSP_RAD_MON(), data, rawTSBK); - case TSBK_IOSP_CALL_ALRT: + case TSBKO::IOSP_CALL_ALRT: return decode(new IOSP_CALL_ALRT(), data, rawTSBK); - case TSBK_IOSP_ACK_RSP: + case TSBKO::IOSP_ACK_RSP: return decode(new IOSP_ACK_RSP(), data, rawTSBK); - case TSBK_ISP_EMERG_ALRM_REQ: + case TSBKO::ISP_EMERG_ALRM_REQ: return decode(new ISP_EMERG_ALRM_REQ(), data, rawTSBK); - case TSBK_IOSP_EXT_FNCT: + case TSBKO::IOSP_EXT_FNCT: return decode(new IOSP_EXT_FNCT(), data, rawTSBK); - case TSBK_IOSP_GRP_AFF: + case TSBKO::IOSP_GRP_AFF: return decode(new IOSP_GRP_AFF(), data, rawTSBK); - case TSBK_IOSP_U_REG: + case TSBKO::IOSP_U_REG: return decode(new IOSP_U_REG(), data, rawTSBK); - case TSBK_ISP_CAN_SRV_REQ: + case TSBKO::ISP_CAN_SRV_REQ: return decode(new ISP_CAN_SRV_REQ(), data, rawTSBK); - case TSBK_ISP_GRP_AFF_Q_RSP: + case TSBKO::ISP_GRP_AFF_Q_RSP: return decode(new ISP_GRP_AFF_Q_RSP(), data, rawTSBK); - case TSBK_OSP_QUE_RSP: + case TSBKO::OSP_QUE_RSP: return decode(new OSP_QUE_RSP(), data, rawTSBK); - case TSBK_ISP_U_DEREG_REQ: + case TSBKO::ISP_U_DEREG_REQ: return decode(new ISP_U_DEREG_REQ(), data, rawTSBK); - case TSBK_OSP_U_DEREG_ACK: + case TSBKO::OSP_U_DEREG_ACK: return decode(new OSP_U_DEREG_ACK(), data, rawTSBK); - case TSBK_ISP_LOC_REG_REQ: + case TSBKO::ISP_LOC_REG_REQ: return decode(new ISP_LOC_REG_REQ(), data, rawTSBK); - case TSBK_ISP_AUTH_RESP: + case TSBKO::ISP_AUTH_RESP: return decode(new ISP_AUTH_RESP(), data, rawTSBK); - case TSBK_ISP_AUTH_FNE_RST: + case TSBKO::ISP_AUTH_FNE_RST: return decode(new ISP_AUTH_FNE_RST(), data, rawTSBK); - case TSBK_ISP_AUTH_SU_DMD: + case TSBKO::ISP_AUTH_SU_DMD: return decode(new ISP_AUTH_SU_DMD(), data, rawTSBK); - case TSBK_OSP_ADJ_STS_BCAST: + case TSBKO::OSP_ADJ_STS_BCAST: return decode(new OSP_ADJ_STS_BCAST(), data, rawTSBK); default: LogError(LOG_P25, "TSBKFactory::create(), unknown TSBK LCO value, mfId = $%02X, lco = $%02X", mfId, lco); @@ -241,7 +242,7 @@ std::unique_ptr TSBKFactory::createAMBT(const data::DataHeader& dataHeader { assert(blocks != nullptr); - if (dataHeader.getFormat() != PDU_FMT_AMBT) { + if (dataHeader.getFormat() != PDUFormatType::AMBT) { LogError(LOG_P25, "TSBKFactory::createAMBT(), PDU is not a AMBT PDU"); return nullptr; } @@ -255,35 +256,35 @@ std::unique_ptr TSBKFactory::createAMBT(const data::DataHeader& dataHeader uint8_t mfId = dataHeader.getMFId(); // Mfg Id. // Motorola P25 vendor opcodes - if (mfId == P25_MFG_MOT) { + if (mfId == MFG_MOT) { switch (lco) { - case TSBK_IOSP_GRP_VCH: - case TSBK_IOSP_UU_VCH: - case TSBK_IOSP_UU_ANS: - case TSBK_IOSP_TELE_INT_ANS: - case TSBK_IOSP_STS_UPDT: - case TSBK_IOSP_STS_Q: - case TSBK_IOSP_MSG_UPDT: - case TSBK_IOSP_CALL_ALRT: - case TSBK_IOSP_ACK_RSP: - case TSBK_IOSP_GRP_AFF: - case TSBK_IOSP_U_REG: - case TSBK_ISP_CAN_SRV_REQ: - case TSBK_OSP_DENY_RSP: - case TSBK_OSP_QUE_RSP: - case TSBK_ISP_U_DEREG_REQ: - case TSBK_OSP_U_DEREG_ACK: - case TSBK_ISP_LOC_REG_REQ: - mfId = P25_MFG_STANDARD; + case TSBKO::IOSP_GRP_VCH: + case TSBKO::IOSP_UU_VCH: + case TSBKO::IOSP_UU_ANS: + case TSBKO::IOSP_TELE_INT_ANS: + case TSBKO::IOSP_STS_UPDT: + case TSBKO::IOSP_STS_Q: + case TSBKO::IOSP_MSG_UPDT: + case TSBKO::IOSP_CALL_ALRT: + case TSBKO::IOSP_ACK_RSP: + case TSBKO::IOSP_GRP_AFF: + case TSBKO::IOSP_U_REG: + case TSBKO::ISP_CAN_SRV_REQ: + case TSBKO::OSP_DENY_RSP: + case TSBKO::OSP_QUE_RSP: + case TSBKO::ISP_U_DEREG_REQ: + case TSBKO::OSP_U_DEREG_ACK: + case TSBKO::ISP_LOC_REG_REQ: + mfId = MFG_STANDARD; break; - case TSBK_ISP_GRP_AFF_Q_RSP: + case TSBKO::ISP_GRP_AFF_Q_RSP: return decode(new MBT_ISP_GRP_AFF_Q_RSP(), dataHeader, blocks); default: LogError(LOG_P25, "TSBKFactory::createAMBT(), unknown TSBK LCO value, mfId = $%02X, lco = $%02X", mfId, lco); break; } - if (mfId == P25_MFG_MOT) { + if (mfId == MFG_MOT) { return nullptr; } else { @@ -293,23 +294,23 @@ std::unique_ptr TSBKFactory::createAMBT(const data::DataHeader& dataHeader // standard P25 reference opcodes switch (lco) { - case TSBK_IOSP_STS_UPDT: + case TSBKO::IOSP_STS_UPDT: return decode(new MBT_IOSP_STS_UPDT(), dataHeader, blocks); - case TSBK_IOSP_MSG_UPDT: + case TSBKO::IOSP_MSG_UPDT: return decode(new MBT_IOSP_MSG_UPDT(), dataHeader, blocks); - case TSBK_IOSP_CALL_ALRT: + case TSBKO::IOSP_CALL_ALRT: return decode(new MBT_IOSP_CALL_ALRT(), dataHeader, blocks); - case TSBK_IOSP_ACK_RSP: + case TSBKO::IOSP_ACK_RSP: return decode(new MBT_IOSP_ACK_RSP(), dataHeader, blocks); - case TSBK_IOSP_GRP_AFF: + case TSBKO::IOSP_GRP_AFF: return decode(new MBT_IOSP_GRP_AFF(), dataHeader, blocks); - case TSBK_ISP_CAN_SRV_REQ: + case TSBKO::ISP_CAN_SRV_REQ: return decode(new MBT_ISP_CAN_SRV_REQ(), dataHeader, blocks); - case TSBK_IOSP_EXT_FNCT: + case TSBKO::IOSP_EXT_FNCT: return decode(new MBT_IOSP_EXT_FNCT(), dataHeader, blocks); - case TSBK_ISP_AUTH_RESP_M: + case TSBKO::ISP_AUTH_RESP_M: return decode(new MBT_ISP_AUTH_RESP_M(), dataHeader, blocks); - case TSBK_ISP_AUTH_SU_DMD: + case TSBKO::ISP_AUTH_SU_DMD: return decode(new MBT_ISP_AUTH_SU_DMD(), dataHeader, blocks); default: LogError(LOG_P25, "TSBKFactory::createAMBT(), unknown TSBK LCO value, mfId = $%02X, lco = $%02X", mfId, lco); diff --git a/src/common/p25/lc/tsbk/TSBKFactory.h b/src/common/p25/lc/tsbk/TSBKFactory.h index 54ea39f7..0b34e246 100644 --- a/src/common/p25/lc/tsbk/TSBKFactory.h +++ b/src/common/p25/lc/tsbk/TSBKFactory.h @@ -17,6 +17,7 @@ #include "common/edac/Trellis.h" +// TSBK #include "common/p25/lc/TSBK.h" #include "common/p25/lc/tsbk/IOSP_ACK_RSP.h" #include "common/p25/lc/tsbk/IOSP_CALL_ALRT.h" @@ -68,6 +69,7 @@ #include "common/p25/lc/tsbk/OSP_U_REG_CMD.h" #include "common/p25/lc/tsbk/OSP_UU_VCH_GRANT_UPD.h" +// AMBT #include "common/p25/lc/AMBT.h" #include "common/p25/lc/tsbk/mbt/MBT_IOSP_ACK_RSP.h" #include "common/p25/lc/tsbk/mbt/MBT_IOSP_CALL_ALRT.h" diff --git a/src/common/p25/lc/tsbk/mbt/MBT_IOSP_ACK_RSP.cpp b/src/common/p25/lc/tsbk/mbt/MBT_IOSP_ACK_RSP.cpp index 7fd69ac2..4b7bc235 100644 --- a/src/common/p25/lc/tsbk/mbt/MBT_IOSP_ACK_RSP.cpp +++ b/src/common/p25/lc/tsbk/mbt/MBT_IOSP_ACK_RSP.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/mbt/MBT_IOSP_ACK_RSP.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// MBT_IOSP_ACK_RSP::MBT_IOSP_ACK_RSP() : AMBT() { - m_lco = TSBK_IOSP_ACK_RSP; + m_lco = TSBKO::IOSP_ACK_RSP; } /// @@ -81,6 +82,6 @@ void MBT_IOSP_ACK_RSP::encodeMBT(data::DataHeader& dataHeader, uint8_t* pduUserD /// std::string MBT_IOSP_ACK_RSP::toString(bool isp) { - if (isp) return std::string("TSBK_IOSP_ACK_RSP (Acknowledge Response - Unit)"); - else return std::string("TSBK_IOSP_ACK_RSP (Acknowledge Response - FNE)"); + return (isp) ? std::string("TSBKO, IOSP_ACK_RSP (Acknowledge Response - Unit)") : + std::string("TSBKO, IOSP_ACK_RSP (Acknowledge Response - FNE)"); } diff --git a/src/common/p25/lc/tsbk/mbt/MBT_IOSP_CALL_ALRT.cpp b/src/common/p25/lc/tsbk/mbt/MBT_IOSP_CALL_ALRT.cpp index fc91e510..a460c73b 100644 --- a/src/common/p25/lc/tsbk/mbt/MBT_IOSP_CALL_ALRT.cpp +++ b/src/common/p25/lc/tsbk/mbt/MBT_IOSP_CALL_ALRT.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/mbt/MBT_IOSP_CALL_ALRT.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// MBT_IOSP_CALL_ALRT::MBT_IOSP_CALL_ALRT() : AMBT() { - m_lco = TSBK_IOSP_CALL_ALRT; + m_lco = TSBKO::IOSP_CALL_ALRT; } /// @@ -79,6 +80,6 @@ void MBT_IOSP_CALL_ALRT::encodeMBT(data::DataHeader& dataHeader, uint8_t* pduUse /// std::string MBT_IOSP_CALL_ALRT::toString(bool isp) { - if (isp) return std::string("TSBK_IOSP_CALL_ALRT (Call Alert Request)"); - else return std::string("TSBK_IOSP_CALL_ALRT (Call Alert)"); + return (isp) ? std::string("TSBKO, IOSP_CALL_ALRT (Call Alert Request)") : + std::string("TSBKO, IOSP_CALL_ALRT (Call Alert)"); } diff --git a/src/common/p25/lc/tsbk/mbt/MBT_IOSP_EXT_FNCT.cpp b/src/common/p25/lc/tsbk/mbt/MBT_IOSP_EXT_FNCT.cpp index 54737b37..a65060c3 100644 --- a/src/common/p25/lc/tsbk/mbt/MBT_IOSP_EXT_FNCT.cpp +++ b/src/common/p25/lc/tsbk/mbt/MBT_IOSP_EXT_FNCT.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/mbt/MBT_IOSP_EXT_FNCT.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -27,9 +28,9 @@ using namespace p25; /// Initializes a new instance of the MBT_IOSP_EXT_FNCT class. /// MBT_IOSP_EXT_FNCT::MBT_IOSP_EXT_FNCT() : AMBT(), - m_extendedFunction(P25_EXT_FNCT_CHECK) + m_extendedFunction(ExtendedFunctions::CHECK) { - m_lco = TSBK_IOSP_EXT_FNCT; + m_lco = TSBKO::IOSP_EXT_FNCT; } /// @@ -81,8 +82,8 @@ void MBT_IOSP_EXT_FNCT::encodeMBT(data::DataHeader& dataHeader, uint8_t* pduUser /// std::string MBT_IOSP_EXT_FNCT::toString(bool isp) { - if (isp) return std::string("TSBK_IOSP_EXT_FNCT (Extended Function Response)"); - else return std::string("TSBK_IOSP_EXT_FNCT (Extended Function Command)"); + return (isp) ? std::string("TSBKO, IOSP_EXT_FNCT (Extended Function Response)") : + std::string("TSBKO, IOSP_EXT_FNCT (Extended Function Command)"); } // --------------------------------------------------------------------------- diff --git a/src/common/p25/lc/tsbk/mbt/MBT_IOSP_GRP_AFF.cpp b/src/common/p25/lc/tsbk/mbt/MBT_IOSP_GRP_AFF.cpp index 258c16fc..14de1405 100644 --- a/src/common/p25/lc/tsbk/mbt/MBT_IOSP_GRP_AFF.cpp +++ b/src/common/p25/lc/tsbk/mbt/MBT_IOSP_GRP_AFF.cpp @@ -13,9 +13,10 @@ #include "Defines.h" #include "p25/lc/tsbk/mbt/MBT_IOSP_GRP_AFF.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -27,9 +28,9 @@ using namespace p25; /// Initializes a new instance of the MBT_IOSP_GRP_AFF class. /// MBT_IOSP_GRP_AFF::MBT_IOSP_GRP_AFF() : AMBT(), - m_announceGroup(P25_WUID_ALL) + m_announceGroup(WUID_ALL) { - m_lco = TSBK_IOSP_GRP_AFF; + m_lco = TSBKO::IOSP_GRP_AFF; } /// @@ -95,6 +96,6 @@ void MBT_IOSP_GRP_AFF::encodeMBT(data::DataHeader& dataHeader, uint8_t* pduUserD /// std::string MBT_IOSP_GRP_AFF::toString(bool isp) { - if (isp) return std::string("TSBK_IOSP_GRP_AFF (Group Affiliation Request)"); - else return std::string("TSBK_IOSP_GRP_AFF (Group Affiliation Response)"); + return (isp) ? std::string("TSBKO, IOSP_GRP_AFF (Group Affiliation Request)") : + std::string("TSBKO, IOSP_GRP_AFF (Group Affiliation Response)"); } diff --git a/src/common/p25/lc/tsbk/mbt/MBT_IOSP_MSG_UPDT.cpp b/src/common/p25/lc/tsbk/mbt/MBT_IOSP_MSG_UPDT.cpp index ede50ee2..9f5f1815 100644 --- a/src/common/p25/lc/tsbk/mbt/MBT_IOSP_MSG_UPDT.cpp +++ b/src/common/p25/lc/tsbk/mbt/MBT_IOSP_MSG_UPDT.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/mbt/MBT_IOSP_MSG_UPDT.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -29,7 +30,7 @@ using namespace p25; MBT_IOSP_MSG_UPDT::MBT_IOSP_MSG_UPDT() : AMBT(), m_messageValue(0U) { - m_lco = TSBK_IOSP_MSG_UPDT; + m_lco = TSBKO::IOSP_MSG_UPDT; } /// @@ -81,8 +82,8 @@ void MBT_IOSP_MSG_UPDT::encodeMBT(data::DataHeader& dataHeader, uint8_t* pduUser /// std::string MBT_IOSP_MSG_UPDT::toString(bool isp) { - if (isp) return std::string("TSBK_IOSP_MSG_UPDT (Message Update Request)"); - else return std::string("TSBK_IOSP_MSG_UPDT (Message Update)"); + return (isp) ? std::string("TSBKO, IOSP_MSG_UPDT (Message Update Request)") : + std::string("TSBKO, IOSP_MSG_UPDT (Message Update)"); } // --------------------------------------------------------------------------- diff --git a/src/common/p25/lc/tsbk/mbt/MBT_IOSP_STS_UPDT.cpp b/src/common/p25/lc/tsbk/mbt/MBT_IOSP_STS_UPDT.cpp index 9609007e..48caec68 100644 --- a/src/common/p25/lc/tsbk/mbt/MBT_IOSP_STS_UPDT.cpp +++ b/src/common/p25/lc/tsbk/mbt/MBT_IOSP_STS_UPDT.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/mbt/MBT_IOSP_STS_UPDT.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -29,7 +30,7 @@ using namespace p25; MBT_IOSP_STS_UPDT::MBT_IOSP_STS_UPDT() : AMBT(), m_statusValue(0U) { - m_lco = TSBK_IOSP_STS_UPDT; + m_lco = TSBKO::IOSP_STS_UPDT; } /// @@ -81,8 +82,8 @@ void MBT_IOSP_STS_UPDT::encodeMBT(data::DataHeader& dataHeader, uint8_t* pduUser /// std::string MBT_IOSP_STS_UPDT::toString(bool isp) { - if (isp) return std::string("TSBK_IOSP_STS_UPDT (Status Update Request)"); - else return std::string("TSBK_IOSP_STS_UPDT (Status Update)"); + return (isp) ? std::string("TSBKO, IOSP_STS_UPDT (Status Update Request)") : + std::string("TSBKO, IOSP_STS_UPDT (Status Update)"); } // --------------------------------------------------------------------------- diff --git a/src/common/p25/lc/tsbk/mbt/MBT_ISP_AUTH_RESP_M.cpp b/src/common/p25/lc/tsbk/mbt/MBT_ISP_AUTH_RESP_M.cpp index 11516103..bc8b36f8 100644 --- a/src/common/p25/lc/tsbk/mbt/MBT_ISP_AUTH_RESP_M.cpp +++ b/src/common/p25/lc/tsbk/mbt/MBT_ISP_AUTH_RESP_M.cpp @@ -7,16 +7,17 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/mbt/MBT_ISP_AUTH_RESP_M.h" #include "Log.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -30,12 +31,12 @@ using namespace p25; MBT_ISP_AUTH_RESP_M::MBT_ISP_AUTH_RESP_M() : AMBT(), m_authStandalone(false) { - m_lco = TSBK_ISP_AUTH_RESP_M; + m_lco = TSBKO::ISP_AUTH_RESP_M; - m_authRes = new uint8_t[P25_AUTH_RES_LENGTH_BYTES]; - ::memset(m_authRes, 0x00U, P25_AUTH_RES_LENGTH_BYTES); - m_authRC = new uint8_t[P25_AUTH_RAND_CHLNG_LENGTH_BYTES]; - ::memset(m_authRC, 0x00U, P25_AUTH_RAND_CHLNG_LENGTH_BYTES); + m_authRes = new uint8_t[AUTH_RES_LENGTH_BYTES]; + ::memset(m_authRes, 0x00U, AUTH_RES_LENGTH_BYTES); + m_authRC = new uint8_t[AUTH_RAND_CHLNG_LENGTH_BYTES]; + ::memset(m_authRC, 0x00U, AUTH_RAND_CHLNG_LENGTH_BYTES); } /// @@ -120,7 +121,7 @@ void MBT_ISP_AUTH_RESP_M::encodeMBT(data::DataHeader& dataHeader, uint8_t* pduUs /// std::string MBT_ISP_AUTH_RESP_M::toString(bool isp) { - return std::string("TSBK_ISP_AUTH_RESP_M (Authentication Response Mutual)"); + return std::string("TSBKO, ISP_AUTH_RESP_M (Authentication Response Mutual)"); } /// Gets the authentication result. @@ -129,7 +130,7 @@ void MBT_ISP_AUTH_RESP_M::getAuthRes(uint8_t* res) const { assert(res != nullptr); - ::memcpy(res, m_authRes, P25_AUTH_RES_LENGTH_BYTES); + ::memcpy(res, m_authRes, AUTH_RES_LENGTH_BYTES); } /// Sets the authentication random challenge. @@ -138,7 +139,7 @@ void MBT_ISP_AUTH_RESP_M::setAuthRC(const uint8_t* rc) { assert(rc != nullptr); - ::memcpy(m_authRC, rc, P25_AUTH_RAND_CHLNG_LENGTH_BYTES); + ::memcpy(m_authRC, rc, AUTH_RAND_CHLNG_LENGTH_BYTES); } /// Gets the authentication random challenge. @@ -147,7 +148,7 @@ void MBT_ISP_AUTH_RESP_M::getAuthRC(uint8_t* rc) const { assert(rc != nullptr); - ::memcpy(rc, m_authRC, P25_AUTH_RAND_CHLNG_LENGTH_BYTES); + ::memcpy(rc, m_authRC, AUTH_RAND_CHLNG_LENGTH_BYTES); } // --------------------------------------------------------------------------- @@ -168,13 +169,13 @@ void MBT_ISP_AUTH_RESP_M::copy(const MBT_ISP_AUTH_RESP_M& data) delete[] m_authRes; } - m_authRes = new uint8_t[P25_AUTH_RES_LENGTH_BYTES]; - ::memcpy(m_authRes, data.m_authRes, P25_AUTH_RES_LENGTH_BYTES); + m_authRes = new uint8_t[AUTH_RES_LENGTH_BYTES]; + ::memcpy(m_authRes, data.m_authRes, AUTH_RES_LENGTH_BYTES); if (m_authRC != nullptr) { delete[] m_authRC; } - m_authRC = new uint8_t[P25_AUTH_RAND_CHLNG_LENGTH_BYTES]; - ::memcpy(m_authRC, data.m_authRC, P25_AUTH_RAND_CHLNG_LENGTH_BYTES); + m_authRC = new uint8_t[AUTH_RAND_CHLNG_LENGTH_BYTES]; + ::memcpy(m_authRC, data.m_authRC, AUTH_RAND_CHLNG_LENGTH_BYTES); } diff --git a/src/common/p25/lc/tsbk/mbt/MBT_ISP_AUTH_SU_DMD.cpp b/src/common/p25/lc/tsbk/mbt/MBT_ISP_AUTH_SU_DMD.cpp index 2d17e68f..c0c2f9c3 100644 --- a/src/common/p25/lc/tsbk/mbt/MBT_ISP_AUTH_SU_DMD.cpp +++ b/src/common/p25/lc/tsbk/mbt/MBT_ISP_AUTH_SU_DMD.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/mbt/MBT_ISP_AUTH_SU_DMD.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// MBT_ISP_AUTH_SU_DMD::MBT_ISP_AUTH_SU_DMD() : AMBT() { - m_lco = TSBK_IOSP_GRP_AFF; + m_lco = TSBKO::IOSP_GRP_AFF; } /// @@ -78,5 +79,5 @@ void MBT_ISP_AUTH_SU_DMD::encodeMBT(data::DataHeader& dataHeader, uint8_t* pduUs /// std::string MBT_ISP_AUTH_SU_DMD::toString(bool isp) { - return std::string("TSBK_ISP_AUTH_SU_DMD (Authentication SU Demand)"); + return std::string("TSBKO, ISP_AUTH_SU_DMD (Authentication SU Demand)"); } diff --git a/src/common/p25/lc/tsbk/mbt/MBT_ISP_CAN_SRV_REQ.cpp b/src/common/p25/lc/tsbk/mbt/MBT_ISP_CAN_SRV_REQ.cpp index d5d61c5c..5d250bfe 100644 --- a/src/common/p25/lc/tsbk/mbt/MBT_ISP_CAN_SRV_REQ.cpp +++ b/src/common/p25/lc/tsbk/mbt/MBT_ISP_CAN_SRV_REQ.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/mbt/MBT_ISP_CAN_SRV_REQ.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// MBT_ISP_CAN_SRV_REQ::MBT_ISP_CAN_SRV_REQ() : AMBT() { - m_lco = TSBK_ISP_CAN_SRV_REQ; + m_lco = TSBKO::ISP_CAN_SRV_REQ; } /// @@ -83,5 +84,5 @@ void MBT_ISP_CAN_SRV_REQ::encodeMBT(data::DataHeader& dataHeader, uint8_t* pduUs /// std::string MBT_ISP_CAN_SRV_REQ::toString(bool isp) { - return std::string("TSBK_ISP_CAN_SRV_REQ (Cancel Service Request)"); + return std::string("TSBKO, ISP_CAN_SRV_REQ (Cancel Service Request)"); } diff --git a/src/common/p25/lc/tsbk/mbt/MBT_ISP_GRP_AFF_Q_RSP.cpp b/src/common/p25/lc/tsbk/mbt/MBT_ISP_GRP_AFF_Q_RSP.cpp index 728d22d9..7723d269 100644 --- a/src/common/p25/lc/tsbk/mbt/MBT_ISP_GRP_AFF_Q_RSP.cpp +++ b/src/common/p25/lc/tsbk/mbt/MBT_ISP_GRP_AFF_Q_RSP.cpp @@ -13,9 +13,10 @@ #include "Defines.h" #include "p25/lc/tsbk/mbt/MBT_ISP_GRP_AFF_Q_RSP.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// MBT_ISP_GRP_AFF_Q_RSP::MBT_ISP_GRP_AFF_Q_RSP() : AMBT() { - m_lco = TSBK_ISP_GRP_AFF_Q_RSP; + m_lco = TSBKO::ISP_GRP_AFF_Q_RSP; } /// @@ -79,5 +80,5 @@ void MBT_ISP_GRP_AFF_Q_RSP::encodeMBT(data::DataHeader& dataHeader, uint8_t* pdu /// std::string MBT_ISP_GRP_AFF_Q_RSP::toString(bool isp) { - return std::string("TSBK_ISP_GRP_AFF_Q_RSP (Group Affiliation Query Response)"); + return std::string("TSBKO, ISP_GRP_AFF_Q_RSP (Group Affiliation Query Response)"); } diff --git a/src/common/p25/lc/tsbk/mbt/MBT_OSP_ADJ_STS_BCAST.cpp b/src/common/p25/lc/tsbk/mbt/MBT_OSP_ADJ_STS_BCAST.cpp index 983674cc..8bece086 100644 --- a/src/common/p25/lc/tsbk/mbt/MBT_OSP_ADJ_STS_BCAST.cpp +++ b/src/common/p25/lc/tsbk/mbt/MBT_OSP_ADJ_STS_BCAST.cpp @@ -7,16 +7,17 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/mbt/MBT_OSP_ADJ_STS_BCAST.h" #include "Log.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,15 +29,15 @@ using namespace p25; /// Initializes a new instance of the MBT_OSP_ADJ_STS_BCAST class. /// MBT_OSP_ADJ_STS_BCAST::MBT_OSP_ADJ_STS_BCAST() : AMBT(), - m_adjCFVA(P25_CFVA_FAILURE), + m_adjCFVA(CFVA::FAILURE), m_adjSysId(0U), m_adjRfssId(0U), m_adjSiteId(0U), m_adjChannelId(0U), m_adjChannelNo(0U), - m_adjServiceClass(P25_SVC_CLS_INVALID) + m_adjServiceClass(ServiceClass::INVALID) { - m_lco = TSBK_OSP_ADJ_STS_BCAST; + m_lco = TSBKO::OSP_ADJ_STS_BCAST; } /// @@ -105,7 +106,7 @@ void MBT_OSP_ADJ_STS_BCAST::encodeMBT(data::DataHeader& dataHeader, uint8_t* pdu /// std::string MBT_OSP_ADJ_STS_BCAST::toString(bool isp) { - return std::string("TSBK_OSP_ADJ_STS_BCAST (Adjacent Site Status Broadcast - Explicit)"); + return std::string("TSBKO, OSP_ADJ_STS_BCAST (Adjacent Site Status Broadcast - Explicit)"); } // --------------------------------------------------------------------------- diff --git a/src/common/p25/lc/tsbk/mbt/MBT_OSP_AUTH_DMD.cpp b/src/common/p25/lc/tsbk/mbt/MBT_OSP_AUTH_DMD.cpp index 22106fec..7caac41f 100644 --- a/src/common/p25/lc/tsbk/mbt/MBT_OSP_AUTH_DMD.cpp +++ b/src/common/p25/lc/tsbk/mbt/MBT_OSP_AUTH_DMD.cpp @@ -7,16 +7,17 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/mbt/MBT_OSP_AUTH_DMD.h" #include "Utils.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -29,12 +30,12 @@ using namespace p25; /// MBT_OSP_AUTH_DMD::MBT_OSP_AUTH_DMD() : AMBT() { - m_lco = TSBK_OSP_AUTH_DMD; + m_lco = TSBKO::OSP_AUTH_DMD; - m_authRS = new uint8_t[P25_AUTH_RAND_SEED_LENGTH_BYTES]; - ::memset(m_authRS, 0x00U, P25_AUTH_RAND_SEED_LENGTH_BYTES); - m_authRC = new uint8_t[P25_AUTH_RAND_CHLNG_LENGTH_BYTES]; - ::memset(m_authRC, 0x00U, P25_AUTH_RAND_CHLNG_LENGTH_BYTES); + m_authRS = new uint8_t[AUTH_RAND_SEED_LENGTH_BYTES]; + ::memset(m_authRS, 0x00U, AUTH_RAND_SEED_LENGTH_BYTES); + m_authRC = new uint8_t[AUTH_RAND_CHLNG_LENGTH_BYTES]; + ::memset(m_authRC, 0x00U, AUTH_RAND_CHLNG_LENGTH_BYTES); } /// @@ -117,7 +118,7 @@ void MBT_OSP_AUTH_DMD::encodeMBT(data::DataHeader& dataHeader, uint8_t* pduUserD /// std::string MBT_OSP_AUTH_DMD::toString(bool isp) { - return std::string("TSBK_OSP_AUTH_DMD (Authentication Demand)"); + return std::string("TSBKO, OSP_AUTH_DMD (Authentication Demand)"); } /// Sets the authentication random seed. @@ -126,7 +127,7 @@ void MBT_OSP_AUTH_DMD::setAuthRS(const uint8_t* rs) { assert(rs != nullptr); - ::memcpy(m_authRS, rs, P25_AUTH_RAND_SEED_LENGTH_BYTES); + ::memcpy(m_authRS, rs, AUTH_RAND_SEED_LENGTH_BYTES); } /// Gets the authentication random seed. @@ -135,7 +136,7 @@ void MBT_OSP_AUTH_DMD::getAuthRS(uint8_t* rs) const { assert(rs != nullptr); - ::memcpy(rs, m_authRS, P25_AUTH_RAND_SEED_LENGTH_BYTES); + ::memcpy(rs, m_authRS, AUTH_RAND_SEED_LENGTH_BYTES); } /// Sets the authentication random challenge. @@ -144,7 +145,7 @@ void MBT_OSP_AUTH_DMD::setAuthRC(const uint8_t* rc) { assert(rc != nullptr); - ::memcpy(m_authRC, rc, P25_AUTH_RAND_CHLNG_LENGTH_BYTES); + ::memcpy(m_authRC, rc, AUTH_RAND_CHLNG_LENGTH_BYTES); } /// Gets the authentication random challenge. @@ -153,7 +154,7 @@ void MBT_OSP_AUTH_DMD::getAuthRC(uint8_t* rc) const { assert(rc != nullptr); - ::memcpy(rc, m_authRC, P25_AUTH_RAND_CHLNG_LENGTH_BYTES); + ::memcpy(rc, m_authRC, AUTH_RAND_CHLNG_LENGTH_BYTES); } // --------------------------------------------------------------------------- @@ -172,13 +173,13 @@ void MBT_OSP_AUTH_DMD::copy(const MBT_OSP_AUTH_DMD& data) delete[] m_authRS; } - m_authRS = new uint8_t[P25_AUTH_RAND_SEED_LENGTH_BYTES]; - ::memcpy(m_authRS, data.m_authRS, P25_AUTH_RAND_SEED_LENGTH_BYTES); + m_authRS = new uint8_t[AUTH_RAND_SEED_LENGTH_BYTES]; + ::memcpy(m_authRS, data.m_authRS, AUTH_RAND_SEED_LENGTH_BYTES); if (m_authRC != nullptr) { delete[] m_authRC; } - m_authRC = new uint8_t[P25_AUTH_RAND_CHLNG_LENGTH_BYTES]; - ::memcpy(m_authRC, data.m_authRC, P25_AUTH_RAND_CHLNG_LENGTH_BYTES); + m_authRC = new uint8_t[AUTH_RAND_CHLNG_LENGTH_BYTES]; + ::memcpy(m_authRC, data.m_authRC, AUTH_RAND_CHLNG_LENGTH_BYTES); } diff --git a/src/common/p25/lc/tsbk/mbt/MBT_OSP_NET_STS_BCAST.cpp b/src/common/p25/lc/tsbk/mbt/MBT_OSP_NET_STS_BCAST.cpp index 17409fc0..89d292c4 100644 --- a/src/common/p25/lc/tsbk/mbt/MBT_OSP_NET_STS_BCAST.cpp +++ b/src/common/p25/lc/tsbk/mbt/MBT_OSP_NET_STS_BCAST.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/mbt/MBT_OSP_NET_STS_BCAST.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// MBT_OSP_NET_STS_BCAST::MBT_OSP_NET_STS_BCAST() : AMBT() { - m_lco = TSBK_OSP_NET_STS_BCAST; + m_lco = TSBKO::OSP_NET_STS_BCAST; } /// @@ -82,5 +83,5 @@ void MBT_OSP_NET_STS_BCAST::encodeMBT(data::DataHeader& dataHeader, uint8_t* pdu /// std::string MBT_OSP_NET_STS_BCAST::toString(bool isp) { - return std::string("TSBK_OSP_NET_STS_BCAST (Network Status Broadcast - Explicit)"); + return std::string("TSBKO, OSP_NET_STS_BCAST (Network Status Broadcast - Explicit)"); } diff --git a/src/common/p25/lc/tsbk/mbt/MBT_OSP_RFSS_STS_BCAST.cpp b/src/common/p25/lc/tsbk/mbt/MBT_OSP_RFSS_STS_BCAST.cpp index 0d73ebf4..8bc2baaf 100644 --- a/src/common/p25/lc/tsbk/mbt/MBT_OSP_RFSS_STS_BCAST.cpp +++ b/src/common/p25/lc/tsbk/mbt/MBT_OSP_RFSS_STS_BCAST.cpp @@ -7,15 +7,16 @@ * @package DVM / Common Library * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/mbt/MBT_OSP_RFSS_STS_BCAST.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -28,7 +29,7 @@ using namespace p25; /// MBT_OSP_RFSS_STS_BCAST::MBT_OSP_RFSS_STS_BCAST() : AMBT() { - m_lco = TSBK_OSP_RFSS_STS_BCAST; + m_lco = TSBKO::OSP_RFSS_STS_BCAST; } /// @@ -84,5 +85,5 @@ void MBT_OSP_RFSS_STS_BCAST::encodeMBT(data::DataHeader& dataHeader, uint8_t* pd /// std::string MBT_OSP_RFSS_STS_BCAST::toString(bool isp) { - return std::string("TSBK_OSP_RFSS_STS_BCAST (RFSS Status Broadcast)"); + return std::string("TSBKO, OSP_RFSS_STS_BCAST (RFSS Status Broadcast)"); } diff --git a/src/dfsi/frames/BlockHeader.cpp b/src/dfsi/frames/BlockHeader.cpp index 313a0d2b..7bf30d4c 100644 --- a/src/dfsi/frames/BlockHeader.cpp +++ b/src/dfsi/frames/BlockHeader.cpp @@ -32,7 +32,7 @@ using namespace p25::dfsi; /// BlockHeader::BlockHeader() : m_payloadType(false), - m_blockLength(UNDEFINED) + m_blockLength(BlockType::UNDEFINED) { /* stub */ } @@ -44,7 +44,7 @@ BlockHeader::BlockHeader() : /// BlockHeader::BlockHeader(uint8_t* data, bool verbose) : m_payloadType(false), - m_blockLength(UNDEFINED) + m_blockLength(BlockType::UNDEFINED) { decode(data, verbose); } @@ -68,7 +68,7 @@ bool BlockHeader::decode(const uint8_t* data, bool verbose) value = (value << 8) + data[3U]; m_payloadType = (data[0U] & 0x80U) == 0x80U; // Payload Type - m_blockType = (BlockType)(data[0U] & 0x7FU); // Block Type + m_blockType = (BlockType::E)(data[0U] & 0x7FU); // Block Type if (verbose) { m_timestampOffset = (uint32_t)((value >> 10) & 0x3FFU); // Timestamp Offset diff --git a/src/dfsi/frames/BlockHeader.h b/src/dfsi/frames/BlockHeader.h index cdab1824..cb1ea3a0 100644 --- a/src/dfsi/frames/BlockHeader.h +++ b/src/dfsi/frames/BlockHeader.h @@ -63,7 +63,7 @@ namespace p25 /// This simple boolean marks this header as either IANA standard, or profile specific. __PROPERTY(bool, payloadType, PayloadType); /// Block type. - __PROPERTY(BlockType, blockType, BlockType); + __PROPERTY(BlockType::E, blockType, BlockType); /// Timestamp Offset. __PROPERTY(uint16_t, timestampOffset, TimestampOffset); /// Block length. diff --git a/src/dfsi/frames/FrameDefines.h b/src/dfsi/frames/FrameDefines.h index ba36afbe..4318f5c1 100644 --- a/src/dfsi/frames/FrameDefines.h +++ b/src/dfsi/frames/FrameDefines.h @@ -28,131 +28,118 @@ namespace p25 /// /// Control Service Message. /// - enum FSCMessageType { - /// - /// Establish connection with FSS. - /// - FSC_CONNECT = 0, - - /// - /// Heartbeat/Connectivity Maintenance. - /// - FSC_HEARTBEAT = 1, - /// - /// Control Service Ack. - /// - FSC_ACK = 2, - - /// - /// Detach Control Service. - /// - FSC_DISCONNECT = 9, - - /// - /// Invalid Control Message. - /// - FSC_INVALID = 127, - }; + namespace FSCMessageType { + // FSC Control Service Message Enumeration + enum E : uint8_t { + FSC_CONNECT = 0, // Establish connection with FSS. + FSC_HEARTBEAT = 1, // Heartbeat/Connectivity Maintenance. + FSC_ACK = 2, // Control Service Ack. + + FSC_DISCONNECT = 9, // Detach Control Service. + + FSC_INVALID = 127, // Invalid Control Message. + }; + } /// /// ACK/NAK Codes /// - enum FSCAckResponseCode { - /// - /// Acknowledgement. - /// - CONTROL_ACK = 0, - /// - /// Unspecified Negative Acknowledgement. - /// - CONTROL_NAK = 1, - /// - /// Server is connected to some other host. - /// - CONTROL_NAK_CONNECTED = 2, - /// - /// Unsupported Manufactuerer Message. - /// - CONTROL_NAK_M_UNSUPP = 3, - /// - /// Unsupported Message Version. - /// - CONTROL_NAK_V_UNSUPP = 4, - /// - /// Unsupported Function. - /// - CONTROL_NAK_F_UNSUPP = 5, - /// - /// Bad / Unsupported Command Parameters. - /// - CONTROL_NAK_PARMS = 6, - /// - /// FSS is currently busy with a function. - /// - CONTROL_NAK_BUSY = 7 - }; + namespace FSCAckResponseCode { + // FSC ACK/NAK Code Enumeration + enum E : uint8_t { + CONTROL_ACK = 0, // Acknowledgement. + CONTROL_NAK = 1, // Unspecified Negative Acknowledgement. + CONTROL_NAK_CONNECTED = 2, // Server is connected to some other host. + CONTROL_NAK_M_UNSUPP = 3, // Unsupported Manufactuerer Message. + CONTROL_NAK_V_UNSUPP = 4, // Unsupported Message Version. + CONTROL_NAK_F_UNSUPP = 5, // Unsupported Function. + CONTROL_NAK_PARMS = 6, // Bad / Unsupported Command Parameters. + CONTROL_NAK_BUSY = 7 // FSS is currently busy with a function. + }; + } /// /// DFSI Block Types /// - enum BlockType { - FULL_RATE_VOICE = 0, + namespace BlockType { + // DFSI Block Types Enumeration + enum E : uint8_t { + FULL_RATE_VOICE = 0, // - VOICE_HEADER_P1 = 6, - VOICE_HEADER_P2 = 7, + VOICE_HEADER_P1 = 6, // + VOICE_HEADER_P2 = 7, // - START_OF_STREAM = 9, - END_OF_STREAM = 10, + START_OF_STREAM = 9, // + END_OF_STREAM = 10, // - UNDEFINED = 127 - }; + UNDEFINED = 127 // + }; + } /// /// /// - enum RTFlag { - ENABLED = 0x02U, - DISABLED = 0x04U - }; + namespace RTFlag { + // + enum E : uint8_t { + ENABLED = 0x02U, // + DISABLED = 0x04U // + }; + } /// /// /// - enum StartStopFlag { - START = 0x0CU, - STOP = 0x25U - }; + namespace StartStopFlag { + // + enum E : uint8_t { + START = 0x0CU, // + STOP = 0x25U // + }; + } /// /// /// - enum StreamTypeFlag { - VOICE = 0x0BU - }; + namespace StreamTypeFlag { + // + enum E : uint8_t { + VOICE = 0x0BU // + }; + } /// /// /// - enum RssiValidityFlag { - INVALID = 0x00U, - VALID = 0x1A - }; + namespace RssiValidityFlag { + // + enum E : uint8_t { + INVALID = 0x00U, // + VALID = 0x1A // + }; + } /// /// /// - enum SourceFlag { - SOURCE_DIU = 0x00U, - SOURCE_QUANTAR = 0x02U - }; + namespace SourceFlag { + // + enum E : uint8_t { + DIU = 0x00U, // + QUANTAR = 0x02U // + }; + } /// /// /// - enum ICWFlag { - ICW_DIU = 0x00U, - ICW_QUANTAR = 0x1B - }; + namespace ICWFlag { + // + enum E : uint8_t { + DIU = 0x00U, // + QUANTAR = 0x1B // + }; + } } // namespace dfsi } // namespace p25 diff --git a/src/dfsi/frames/FullRateVoice.cpp b/src/dfsi/frames/FullRateVoice.cpp index 81f21f6f..c6b0e295 100644 --- a/src/dfsi/frames/FullRateVoice.cpp +++ b/src/dfsi/frames/FullRateVoice.cpp @@ -22,6 +22,7 @@ using namespace p25; using namespace p25::dfsi; +using namespace p25::dfsi::defines; // --------------------------------------------------------------------------- // Public Class Members @@ -33,7 +34,7 @@ using namespace p25::dfsi; FullRateVoice::FullRateVoice() : imbeData(nullptr), additionalData(nullptr), - m_frameType(P25_DFSI_LDU1_VOICE1), + m_frameType(DFSIFrameType::LDU1_VOICE1), m_totalErrors(0U), m_muteFrame(false), m_lostFrame(false), @@ -51,7 +52,7 @@ FullRateVoice::FullRateVoice() : FullRateVoice::FullRateVoice(uint8_t* data) : imbeData(nullptr), additionalData(nullptr), - m_frameType(P25_DFSI_LDU1_VOICE1), + m_frameType(DFSIFrameType::LDU1_VOICE1), m_totalErrors(0U), m_muteFrame(false), m_lostFrame(false), @@ -86,7 +87,7 @@ bool FullRateVoice::decode(const uint8_t* data) imbeData = new uint8_t[IMBE_BUF_LEN]; ::memset(imbeData, 0x00U, IMBE_BUF_LEN); - m_frameType = data[0U]; // Frame Type + m_frameType = (DFSIFrameType::E)data[0U]; // Frame Type ::memcpy(imbeData, data + 1U, IMBE_BUF_LEN); // IMBE m_totalErrors = (uint8_t)((data[12U] >> 5) & 0x07U); // Total Errors @@ -155,8 +156,8 @@ void FullRateVoice::encode(uint8_t* data) /// bool FullRateVoice::isVoice3thru8() { - if ( (m_frameType == P25_DFSI_LDU1_VOICE3) || (m_frameType == P25_DFSI_LDU1_VOICE4) || (m_frameType == P25_DFSI_LDU1_VOICE5) || - (m_frameType == P25_DFSI_LDU1_VOICE6) || (m_frameType == P25_DFSI_LDU1_VOICE7) || (m_frameType == P25_DFSI_LDU1_VOICE8) ) { + if ( (m_frameType == DFSIFrameType::LDU1_VOICE3) || (m_frameType == DFSIFrameType::LDU1_VOICE4) || (m_frameType == DFSIFrameType::LDU1_VOICE5) || + (m_frameType == DFSIFrameType::LDU1_VOICE6) || (m_frameType == DFSIFrameType::LDU1_VOICE7) || (m_frameType == DFSIFrameType::LDU1_VOICE8) ) { return true; } else { return false; @@ -169,8 +170,8 @@ bool FullRateVoice::isVoice3thru8() /// bool FullRateVoice::isVoice12thru17() { - if ( (m_frameType == P25_DFSI_LDU2_VOICE12) || (m_frameType == P25_DFSI_LDU2_VOICE13) || (m_frameType == P25_DFSI_LDU2_VOICE14) || - (m_frameType == P25_DFSI_LDU2_VOICE15) || (m_frameType == P25_DFSI_LDU2_VOICE16) || (m_frameType == P25_DFSI_LDU2_VOICE17) ) { + if ( (m_frameType == DFSIFrameType::LDU2_VOICE12) || (m_frameType == DFSIFrameType::LDU2_VOICE13) || (m_frameType == DFSIFrameType::LDU2_VOICE14) || + (m_frameType == DFSIFrameType::LDU2_VOICE15) || (m_frameType == DFSIFrameType::LDU2_VOICE16) || (m_frameType == DFSIFrameType::LDU2_VOICE17) ) { return true; } else { return false; @@ -183,7 +184,7 @@ bool FullRateVoice::isVoice12thru17() /// bool FullRateVoice::isVoice9or10() { - if ( (m_frameType == P25_DFSI_LDU1_VOICE9) || (m_frameType == P25_DFSI_LDU2_VOICE10) ) { + if ( (m_frameType == DFSIFrameType::LDU1_VOICE9) || (m_frameType == DFSIFrameType::LDU2_VOICE10) ) { return true; } else { return false; diff --git a/src/dfsi/frames/FullRateVoice.h b/src/dfsi/frames/FullRateVoice.h index e662851d..050d1253 100644 --- a/src/dfsi/frames/FullRateVoice.h +++ b/src/dfsi/frames/FullRateVoice.h @@ -16,6 +16,7 @@ #include "Defines.h" #include "common/Defines.h" +#include "common/p25/dfsi/DFSIDefines.h" #include "common/Log.h" #include "common/Utils.h" #include "frames/FrameDefines.h" @@ -189,7 +190,7 @@ namespace p25 uint8_t* additionalData; // ?? - this should probably be private with getters/setters /// Frame Type. - __PROPERTY(uint8_t, frameType, FrameType); + __PROPERTY(defines::DFSIFrameType::E, frameType, FrameType); /// Total errors detected in the frame. __PROPERTY(uint8_t, totalErrors, TotalErrors); /// Flag indicating the frame should be muted. diff --git a/src/dfsi/frames/MotFullRateVoice.cpp b/src/dfsi/frames/MotFullRateVoice.cpp index a3d29c27..108ccfdf 100644 --- a/src/dfsi/frames/MotFullRateVoice.cpp +++ b/src/dfsi/frames/MotFullRateVoice.cpp @@ -14,6 +14,7 @@ */ #include "frames/MotFullRateVoice.h" +#include "common/p25/P25Defines.h" #include "common/p25/dfsi/DFSIDefines.h" #include "common/Utils.h" #include "common/Log.h" @@ -22,7 +23,9 @@ #include using namespace p25; +using namespace p25::defines; using namespace p25::dfsi; +using namespace p25::dfsi::defines; // --------------------------------------------------------------------------- // Public Class Members @@ -34,11 +37,11 @@ using namespace p25::dfsi; MotFullRateVoice::MotFullRateVoice() : imbeData(nullptr), additionalData(nullptr), - m_frameType(P25_DFSI_LDU1_VOICE1), - m_source(SOURCE_QUANTAR) + m_frameType(DFSIFrameType::LDU1_VOICE1), + m_source(SourceFlag::QUANTAR) { - imbeData = new uint8_t[IMBE_BUF_LEN]; - ::memset(imbeData, 0x00U, IMBE_BUF_LEN); + imbeData = new uint8_t[RAW_IMBE_LENGTH_BYTES]; + ::memset(imbeData, 0x00U, RAW_IMBE_LENGTH_BYTES); } /// @@ -100,18 +103,18 @@ bool MotFullRateVoice::decode(const uint8_t* data, bool shortened) if (imbeData != nullptr) delete imbeData; - imbeData = new uint8_t[IMBE_BUF_LEN]; - ::memset(imbeData, 0x00U, IMBE_BUF_LEN); + imbeData = new uint8_t[RAW_IMBE_LENGTH_BYTES]; + ::memset(imbeData, 0x00U, RAW_IMBE_LENGTH_BYTES); - m_frameType = data[0U]; + m_frameType = (DFSIFrameType::E)data[0U]; if (isVoice2or11()) { shortened = true; } if (shortened) { - ::memcpy(imbeData, data + 1U, IMBE_BUF_LEN); - m_source = (SourceFlag)data[12U]; + ::memcpy(imbeData, data + 1U, RAW_IMBE_LENGTH_BYTES); + m_source = (SourceFlag::E)data[12U]; // Forgot to set this originally and left additionalData uninitialized, whoops! additionalData = nullptr; } else { @@ -128,9 +131,9 @@ bool MotFullRateVoice::decode(const uint8_t* data, bool shortened) ::memcpy(additionalData, data + 1U, ADDITIONAL_LENGTH); // copy IMBE data based on our imbe start position - ::memcpy(imbeData, data + imbeStart, IMBE_BUF_LEN); + ::memcpy(imbeData, data + imbeStart, RAW_IMBE_LENGTH_BYTES); - m_source = (SourceFlag)data[IMBE_BUF_LEN + imbeStart]; + m_source = (SourceFlag::E)data[RAW_IMBE_LENGTH_BYTES + imbeStart]; } return true; @@ -154,7 +157,7 @@ void MotFullRateVoice::encode(uint8_t* data, bool shortened) // copy based on shortened frame or not if (shortened) { - ::memcpy(data + 1U, imbeData, IMBE_BUF_LEN); + ::memcpy(data + 1U, imbeData, RAW_IMBE_LENGTH_BYTES); data[12U] = (uint8_t)m_source; } // if not shortened, our IMBE data start position depends on frame type @@ -171,7 +174,7 @@ void MotFullRateVoice::encode(uint8_t* data, bool shortened) } // Copy rest of data - ::memcpy(data + imbeStart, imbeData, IMBE_BUF_LEN); + ::memcpy(data + imbeStart, imbeData, RAW_IMBE_LENGTH_BYTES); // Source byte at the end data[11U + imbeStart] = (uint8_t)m_source; @@ -188,7 +191,8 @@ void MotFullRateVoice::encode(uint8_t* data, bool shortened) /// bool MotFullRateVoice::isVoice1or2or10or11() { - if ( (m_frameType == P25_DFSI_LDU1_VOICE1) || (m_frameType == P25_DFSI_LDU1_VOICE2) || (m_frameType == P25_DFSI_LDU2_VOICE10) || (m_frameType == P25_DFSI_LDU2_VOICE11) ) { + if ( (m_frameType == DFSIFrameType::LDU1_VOICE1) || (m_frameType == DFSIFrameType::LDU1_VOICE2) || + (m_frameType == DFSIFrameType::LDU2_VOICE10) || (m_frameType == DFSIFrameType::LDU2_VOICE11) ) { return true; } else { return false; @@ -201,7 +205,7 @@ bool MotFullRateVoice::isVoice1or2or10or11() /// bool MotFullRateVoice::isVoice2or11() { - if ( (m_frameType == P25_DFSI_LDU1_VOICE2) || (m_frameType == P25_DFSI_LDU2_VOICE11) ) { + if ( (m_frameType == DFSIFrameType::LDU1_VOICE2) || (m_frameType == DFSIFrameType::LDU2_VOICE11) ) { return true; } else { return false; @@ -214,7 +218,7 @@ bool MotFullRateVoice::isVoice2or11() /// bool MotFullRateVoice::isVoice9or18() { - if ( (m_frameType == P25_DFSI_LDU1_VOICE9) || (m_frameType == P25_DFSI_LDU2_VOICE18) ) { + if ( (m_frameType == DFSIFrameType::LDU1_VOICE9) || (m_frameType == DFSIFrameType::LDU2_VOICE18) ) { return true; } else { return false; diff --git a/src/dfsi/frames/MotFullRateVoice.h b/src/dfsi/frames/MotFullRateVoice.h index 68b9dbd3..f49052a6 100644 --- a/src/dfsi/frames/MotFullRateVoice.h +++ b/src/dfsi/frames/MotFullRateVoice.h @@ -17,6 +17,7 @@ #include "Defines.h" #include "common/Defines.h" +#include "common/p25/dfsi/DFSIDefines.h" #include "common/Log.h" #include "common/Utils.h" #include "frames/FrameDefines.h" @@ -49,7 +50,6 @@ namespace p25 static const uint8_t LENGTH = 17; static const uint8_t SHORTENED_LENGTH = 13; static const uint8_t ADDITIONAL_LENGTH = 4; - static const uint8_t IMBE_BUF_LEN = 11; /// Initializes a copy instance of the MotFullRateVoice class. MotFullRateVoice(); @@ -70,9 +70,9 @@ namespace p25 uint8_t* additionalData; // ?? - this should probably be private with getters/setters /// Frame Type. - __PROPERTY(uint8_t, frameType, FrameType); + __PROPERTY(defines::DFSIFrameType::E, frameType, FrameType); /// - __PROPERTY(uint8_t, source, Source); + __PROPERTY(SourceFlag::E, source, Source); private: /// diff --git a/src/dfsi/frames/MotStartOfStream.cpp b/src/dfsi/frames/MotStartOfStream.cpp index 317a3e14..aad685bc 100644 --- a/src/dfsi/frames/MotStartOfStream.cpp +++ b/src/dfsi/frames/MotStartOfStream.cpp @@ -23,6 +23,7 @@ using namespace p25; using namespace p25::dfsi; +using namespace p25::dfsi::defines; // --------------------------------------------------------------------------- // Public Class Members @@ -33,9 +34,9 @@ using namespace p25::dfsi; /// MotStartOfStream::MotStartOfStream() : m_marker(FIXED_MARKER), - m_rt(DISABLED), - m_startStop(START), - m_streamType(VOICE) + m_rt(RTFlag::DISABLED), + m_startStop(StartStopFlag::START), + m_streamType(StreamTypeFlag::VOICE) { /* stub */ } @@ -46,9 +47,9 @@ MotStartOfStream::MotStartOfStream() : /// MotStartOfStream::MotStartOfStream(uint8_t* data) : m_marker(FIXED_MARKER), - m_rt(DISABLED), - m_startStop(START), - m_streamType(VOICE) + m_rt(RTFlag::DISABLED), + m_startStop(StartStopFlag::START), + m_streamType(StreamTypeFlag::VOICE) { decode(data); } @@ -62,9 +63,9 @@ bool MotStartOfStream::decode(const uint8_t* data) { assert(data != nullptr); - m_rt = (RTFlag)data[2U]; - m_startStop = (StartStopFlag)data[3U]; - m_streamType = (StreamTypeFlag)data[4U]; + m_rt = (RTFlag::E)data[2U]; + m_startStop = (StartStopFlag::E)data[3U]; + m_streamType = (StreamTypeFlag::E)data[4U]; return true; } @@ -77,9 +78,9 @@ void MotStartOfStream::encode(uint8_t* data) { assert(data != nullptr); - data[0U] = P25_DFSI_MOT_START_STOP; + data[0U] = DFSIFrameType::MOT_START_STOP; data[1U] = FIXED_MARKER; - data[2U] = (uint8_t)m_rt; - data[3U] = (uint8_t)m_startStop; - data[4U] = (uint8_t)m_streamType; + data[2U] = m_rt; + data[3U] = m_startStop; + data[4U] = m_streamType; } diff --git a/src/dfsi/frames/MotStartOfStream.h b/src/dfsi/frames/MotStartOfStream.h index a846f33b..bdc05e98 100644 --- a/src/dfsi/frames/MotStartOfStream.h +++ b/src/dfsi/frames/MotStartOfStream.h @@ -59,11 +59,11 @@ namespace p25 /// __PROPERTY(uint8_t, marker, Marker); /// - __PROPERTY(RTFlag, rt, RT); + __PROPERTY(RTFlag::E, rt, RT); /// - __PROPERTY(StartStopFlag, startStop, StartStop); + __PROPERTY(StartStopFlag::E, startStop, StartStop); /// - __PROPERTY(StreamTypeFlag, streamType, StreamType); + __PROPERTY(StreamTypeFlag::E, streamType, StreamType); }; } // namespace dfsi } // namespace p25 diff --git a/src/dfsi/frames/MotStartVoiceFrame.cpp b/src/dfsi/frames/MotStartVoiceFrame.cpp index c4a1afb4..fba1d42f 100644 --- a/src/dfsi/frames/MotStartVoiceFrame.cpp +++ b/src/dfsi/frames/MotStartVoiceFrame.cpp @@ -23,6 +23,7 @@ using namespace p25; using namespace p25::dfsi; +using namespace p25::dfsi::defines; // --------------------------------------------------------------------------- // Public Class Members @@ -34,9 +35,9 @@ using namespace p25::dfsi; MotStartVoiceFrame::MotStartVoiceFrame() : startOfStream(nullptr), fullRateVoice(nullptr), - m_icw(ICW_DIU), + m_icw(ICWFlag::DIU), m_rssi(0U), - m_rssiValidity(INVALID), + m_rssiValidity(RssiValidityFlag::INVALID), m_nRssi(0U), m_adjMM(0U) { @@ -51,9 +52,9 @@ MotStartVoiceFrame::MotStartVoiceFrame() : MotStartVoiceFrame::MotStartVoiceFrame(uint8_t* data) : startOfStream(nullptr), fullRateVoice(nullptr), - m_icw(ICW_DIU), + m_icw(ICWFlag::DIU), m_rssi(0U), - m_rssiValidity(INVALID), + m_rssiValidity(RssiValidityFlag::INVALID), m_nRssi(0U), m_adjMM(0U) { @@ -105,9 +106,9 @@ bool MotStartVoiceFrame::decode(const uint8_t* data) fullRateVoice->decode(voiceBuffer, true); // get rest of data - m_icw = (ICWFlag)data[5U]; + m_icw = (ICWFlag::E)data[5U]; m_rssi = data[6U]; - m_rssiValidity = (RssiValidityFlag)data[7U]; + m_rssiValidity = (RssiValidityFlag::E)data[7U]; m_nRssi = data[8U]; m_adjMM = data[9U]; @@ -143,9 +144,9 @@ void MotStartVoiceFrame::encode(uint8_t* data) } // Copy the rest - data[5U] = (uint8_t)m_icw; + data[5U] = m_icw; data[6U] = m_rssi; - data[7U] = (uint8_t)m_rssiValidity; + data[7U] = m_rssiValidity; data[8U] = m_nRssi; data[9U] = m_adjMM; } diff --git a/src/dfsi/frames/MotStartVoiceFrame.h b/src/dfsi/frames/MotStartVoiceFrame.h index d4a770c5..fc183b2d 100644 --- a/src/dfsi/frames/MotStartVoiceFrame.h +++ b/src/dfsi/frames/MotStartVoiceFrame.h @@ -69,11 +69,11 @@ namespace p25 MotFullRateVoice* fullRateVoice; // ?? - this should probably be private with getters/setters /// - __PROPERTY(ICWFlag, icw, ICW); + __PROPERTY(ICWFlag::E, icw, ICW); /// __PROPERTY(uint8_t, rssi, RSSI); /// - __PROPERTY(RssiValidityFlag, rssiValidity, RSSIValidity); + __PROPERTY(RssiValidityFlag::E, rssiValidity, RSSIValidity); /// __PROPERTY(uint8_t, nRssi, NRSSI); /// diff --git a/src/dfsi/frames/MotVoiceHeader1.cpp b/src/dfsi/frames/MotVoiceHeader1.cpp index 048c140c..4177ba5b 100644 --- a/src/dfsi/frames/MotVoiceHeader1.cpp +++ b/src/dfsi/frames/MotVoiceHeader1.cpp @@ -23,6 +23,7 @@ using namespace p25; using namespace p25::dfsi; +using namespace p25::dfsi::defines; // --------------------------------------------------------------------------- // Public Class Members @@ -34,9 +35,9 @@ using namespace p25::dfsi; MotVoiceHeader1::MotVoiceHeader1() : header(nullptr), startOfStream(nullptr), - m_icw(ICW_DIU), + m_icw(ICWFlag::DIU), m_rssi(0U), - m_rssiValidity(INVALID), + m_rssiValidity(RssiValidityFlag::INVALID), m_nRssi(0U) { startOfStream = new MotStartOfStream(); @@ -52,9 +53,9 @@ MotVoiceHeader1::MotVoiceHeader1() : MotVoiceHeader1::MotVoiceHeader1(uint8_t* data) : header(nullptr), startOfStream(nullptr), - m_icw(ICW_DIU), + m_icw(ICWFlag::DIU), m_rssi(0U), - m_rssiValidity(INVALID), + m_rssiValidity(RssiValidityFlag::INVALID), m_nRssi(0U) { decode(data); @@ -93,9 +94,9 @@ bool MotVoiceHeader1::decode(const uint8_t* data) startOfStream->decode(buffer); // decode the other stuff - m_icw = (ICWFlag)data[5U]; + m_icw = (ICWFlag::E)data[5U]; m_rssi = data[6U]; - m_rssiValidity = (RssiValidityFlag)data[7U]; + m_rssiValidity = (RssiValidityFlag::E)data[7U]; m_nRssi = data[8U]; // our header includes the trailing source and check bytes @@ -117,7 +118,7 @@ void MotVoiceHeader1::encode(uint8_t* data) assert(data != nullptr); assert(startOfStream != nullptr); - data[0U] = P25_DFSI_MOT_VHDR_1; + data[0U] = DFSIFrameType::MOT_VHDR_1; // scope is intentional { @@ -129,9 +130,9 @@ void MotVoiceHeader1::encode(uint8_t* data) ::memcpy(data + 1U, buffer + 1U, 4U); } - data[5U] = (uint8_t)m_icw; + data[5U] = m_icw; data[6U] = m_rssi; - data[7U] = (uint8_t)m_rssiValidity; + data[7U] = m_rssiValidity; data[8U] = m_nRssi; // our header includes the trailing source and check bytes diff --git a/src/dfsi/frames/MotVoiceHeader1.h b/src/dfsi/frames/MotVoiceHeader1.h index eacf869c..42442b01 100644 --- a/src/dfsi/frames/MotVoiceHeader1.h +++ b/src/dfsi/frames/MotVoiceHeader1.h @@ -73,11 +73,11 @@ namespace p25 MotStartOfStream* startOfStream; // ?? - this should probably be private with getters/setters /// - __PROPERTY(ICWFlag, icw, ICW); + __PROPERTY(ICWFlag::E, icw, ICW); /// __PROPERTY(uint8_t, rssi, RSSI); /// - __PROPERTY(RssiValidityFlag, rssiValidity, RSSIValidity); + __PROPERTY(RssiValidityFlag::E, rssiValidity, RSSIValidity); /// __PROPERTY(uint8_t, nRssi, NRSSI); }; diff --git a/src/dfsi/frames/MotVoiceHeader2.cpp b/src/dfsi/frames/MotVoiceHeader2.cpp index 75677972..d4fec192 100644 --- a/src/dfsi/frames/MotVoiceHeader2.cpp +++ b/src/dfsi/frames/MotVoiceHeader2.cpp @@ -23,6 +23,7 @@ using namespace p25; using namespace p25::dfsi; +using namespace p25::dfsi::defines; // --------------------------------------------------------------------------- // Public Class Members @@ -33,7 +34,7 @@ using namespace p25::dfsi; /// MotVoiceHeader2::MotVoiceHeader2() : header(nullptr), - m_source(SOURCE_QUANTAR) + m_source(SourceFlag::QUANTAR) { header = new uint8_t[HCW_LENGTH]; ::memset(header, 0x00U, HCW_LENGTH); @@ -45,7 +46,7 @@ MotVoiceHeader2::MotVoiceHeader2() : /// MotVoiceHeader2::MotVoiceHeader2(uint8_t* data) : header(nullptr), - m_source(SOURCE_QUANTAR) + m_source(SourceFlag::QUANTAR) { decode(data); } @@ -68,7 +69,7 @@ bool MotVoiceHeader2::decode(const uint8_t* data) { assert(data != nullptr); - m_source = (SourceFlag)data[21]; + m_source = (SourceFlag::E)data[21]; if (header != nullptr) { delete[] header; @@ -89,7 +90,7 @@ void MotVoiceHeader2::encode(uint8_t* data) { assert(data != nullptr); - data[0U] = P25_DFSI_MOT_VHDR_2; + data[0U] = DFSIFrameType::MOT_VHDR_2; if (header != nullptr) { ::memcpy(data + 1U, header, HCW_LENGTH); diff --git a/src/dfsi/frames/MotVoiceHeader2.h b/src/dfsi/frames/MotVoiceHeader2.h index 89b921bc..94b5f353 100644 --- a/src/dfsi/frames/MotVoiceHeader2.h +++ b/src/dfsi/frames/MotVoiceHeader2.h @@ -68,7 +68,7 @@ namespace p25 uint8_t* header; // ?? - this should probably be a private with getters/setters /// - __PROPERTY(SourceFlag, source, Source); + __PROPERTY(SourceFlag::E, source, Source); }; } // namespace dfsi } // namespace p25 diff --git a/src/dfsi/frames/fsc/FSCACK.cpp b/src/dfsi/frames/fsc/FSCACK.cpp index d64405e3..ba641101 100644 --- a/src/dfsi/frames/fsc/FSCACK.cpp +++ b/src/dfsi/frames/fsc/FSCACK.cpp @@ -31,13 +31,13 @@ using namespace p25::dfsi::fsc; /// Initializes a instance of the FSCACK class. /// FSCACK::FSCACK() : FSCMessage(), - m_ackMessageId(FSC_INVALID), + m_ackMessageId(FSCMessageType::FSC_INVALID), m_ackVersion(1U), m_ackCorrelationTag(0U), - m_responseCode(CONTROL_ACK), + m_responseCode(FSCAckResponseCode::CONTROL_ACK), m_respLength(0U) { - m_messageId = FSC_ACK; + m_messageId = FSCMessageType::FSC_ACK; } /// @@ -45,10 +45,10 @@ FSCACK::FSCACK() : FSCMessage(), /// /// FSCACK::FSCACK(uint8_t* data) : FSCMessage(data), - m_ackMessageId(FSC_INVALID), + m_ackMessageId(FSCMessageType::FSC_INVALID), m_ackVersion(1U), m_ackCorrelationTag(0U), - m_responseCode(CONTROL_ACK), + m_responseCode(FSCAckResponseCode::CONTROL_ACK), m_respLength(0U) { decode(data); @@ -64,10 +64,10 @@ bool FSCACK::decode(const uint8_t* data) assert(data != nullptr); FSCMessage::decode(data); - m_ackMessageId = (FSCMessageType)(data[2U]); // Ack Message ID + m_ackMessageId = (FSCMessageType::E)(data[2U]); // Ack Message ID m_ackVersion = data[3U]; // Ack Message Version m_ackCorrelationTag = data[4U]; // Ack Message Correlation Tag - m_responseCode = (FSCAckResponseCode)(data[5U]); // Response Code + m_responseCode = (FSCAckResponseCode::E)(data[5U]); // Response Code m_respLength = data[6U]; // Response Data Length if (m_respLength > 0) { diff --git a/src/dfsi/frames/fsc/FSCACK.h b/src/dfsi/frames/fsc/FSCACK.h index f3f963cf..2ea5490f 100644 --- a/src/dfsi/frames/fsc/FSCACK.h +++ b/src/dfsi/frames/fsc/FSCACK.h @@ -50,13 +50,13 @@ namespace p25 uint8_t* responseData; // ?? - this should probably be private with getters/setters /// Acknowledged Message ID. - __PROPERTY(FSCMessageType, ackMessageId, AckMessageId); + __PROPERTY(FSCMessageType::E, ackMessageId, AckMessageId); /// Acknowledged Message Version. __READONLY_PROPERTY(uint8_t, ackVersion, AckVersion); /// __READONLY_PROPERTY(uint8_t, ackCorrelationTag, AckCorrelationTag); /// Response code. - __PROPERTY(FSCAckResponseCode, responseCode, ResponseCode); + __PROPERTY(FSCAckResponseCode::E, responseCode, ResponseCode); /// Response Data Length. __PROPERTY(uint8_t, respLength, ResponseLength); }; diff --git a/src/dfsi/frames/fsc/FSCConnect.cpp b/src/dfsi/frames/fsc/FSCConnect.cpp index e9dbd74f..bf2feff8 100644 --- a/src/dfsi/frames/fsc/FSCConnect.cpp +++ b/src/dfsi/frames/fsc/FSCConnect.cpp @@ -36,7 +36,7 @@ FSCConnect::FSCConnect() : FSCMessage(), m_fsHeartbeatPeriod(5U), m_hostHeartbeatPeriod(5U) { - m_messageId = FSC_CONNECT; + m_messageId = FSCMessageType::FSC_CONNECT; } /// diff --git a/src/dfsi/frames/fsc/FSCDisconnect.cpp b/src/dfsi/frames/fsc/FSCDisconnect.cpp index d5ae17bb..b23b4b09 100644 --- a/src/dfsi/frames/fsc/FSCDisconnect.cpp +++ b/src/dfsi/frames/fsc/FSCDisconnect.cpp @@ -32,7 +32,7 @@ using namespace p25::dfsi::fsc; /// FSCDisconnect::FSCDisconnect() : FSCMessage() { - m_messageId = FSC_DISCONNECT; + m_messageId = FSCMessageType::FSC_DISCONNECT; } /// diff --git a/src/dfsi/frames/fsc/FSCHeartbeat.cpp b/src/dfsi/frames/fsc/FSCHeartbeat.cpp index 840fb0a0..c677d43d 100644 --- a/src/dfsi/frames/fsc/FSCHeartbeat.cpp +++ b/src/dfsi/frames/fsc/FSCHeartbeat.cpp @@ -32,7 +32,7 @@ using namespace p25::dfsi::fsc; /// FSCHeartbeat::FSCHeartbeat() : FSCMessage() { - m_messageId = FSC_HEARTBEAT; + m_messageId = FSCMessageType::FSC_HEARTBEAT; } /// diff --git a/src/dfsi/frames/fsc/FSCMessage.cpp b/src/dfsi/frames/fsc/FSCMessage.cpp index f486e427..b7a0b8d7 100644 --- a/src/dfsi/frames/fsc/FSCMessage.cpp +++ b/src/dfsi/frames/fsc/FSCMessage.cpp @@ -31,7 +31,7 @@ using namespace p25::dfsi::fsc; /// Initializes a instance of the FSCMessage class. /// FSCMessage::FSCMessage() : - m_messageId(FSC_INVALID), + m_messageId(FSCMessageType::FSC_INVALID), m_version(1U), m_correlationTag(0U) { @@ -43,7 +43,7 @@ FSCMessage::FSCMessage() : /// /// FSCMessage::FSCMessage(uint8_t* data) : - m_messageId(FSC_INVALID), + m_messageId(FSCMessageType::FSC_INVALID), m_version(1U), m_correlationTag(0U) { @@ -59,7 +59,7 @@ bool FSCMessage::decode(const uint8_t* data) { assert(data != nullptr); - m_messageId = (FSCMessageType)(data[0U]); // Message ID + m_messageId = (FSCMessageType::E)(data[0U]); // Message ID m_version = data[1U]; // Message Version if (m_messageId != FSCMessageType::FSC_HEARTBEAT && m_messageId != FSCMessageType::FSC_ACK) diff --git a/src/dfsi/frames/fsc/FSCMessage.h b/src/dfsi/frames/fsc/FSCMessage.h index 0cb07d3d..90d4d265 100644 --- a/src/dfsi/frames/fsc/FSCMessage.h +++ b/src/dfsi/frames/fsc/FSCMessage.h @@ -47,7 +47,7 @@ namespace p25 public: /// Message ID. - __PROTECTED_PROPERTY(FSCMessageType, messageId, MessageId); + __PROTECTED_PROPERTY(FSCMessageType::E, messageId, MessageId); /// Message Version. __PROTECTED_READONLY_PROPERTY(uint8_t, version, Version); /// diff --git a/src/dfsi/network/CallData.cpp b/src/dfsi/network/CallData.cpp index 186fe1d5..b5298627 100644 --- a/src/dfsi/network/CallData.cpp +++ b/src/dfsi/network/CallData.cpp @@ -19,18 +19,19 @@ using namespace network; using namespace modem; using namespace p25; +using namespace p25::defines; using namespace dfsi; VoiceCallData::VoiceCallData() : srcId(0U), dstId(0U), lco(0U), - mfId(P25_MFG_STANDARD), + mfId(MFG_STANDARD), serviceOptions(0U), lsd1(0U), lsd2(0U), mi(), - algoId(P25_ALGO_UNENCRYPT), + algoId(ALGO_UNENCRYPT), kId(0U), VHDR1(), VHDR2(), @@ -40,7 +41,7 @@ VoiceCallData::VoiceCallData() : n(0U), streamId(0U) { - mi = new uint8_t[P25_MI_LENGTH_BYTES]; + mi = new uint8_t[MI_LENGTH_BYTES]; VHDR1 = new uint8_t[MotVoiceHeader1::HCW_LENGTH]; VHDR2 = new uint8_t[MotVoiceHeader2::HCW_LENGTH]; netLDU1 = new uint8_t[9U * 25U]; @@ -62,14 +63,14 @@ void VoiceCallData::resetCallData() { srcId = 0U; dstId = 0U; lco = 0U; - mfId = P25_MFG_STANDARD; + mfId = MFG_STANDARD; serviceOptions = 0U; lsd1 = 0U; lsd2 = 0U; - ::memset(mi, 0x00U, P25_MI_LENGTH_BYTES); + ::memset(mi, 0x00U, MI_LENGTH_BYTES); - algoId = P25_ALGO_UNENCRYPT; + algoId = ALGO_UNENCRYPT; kId = 0U; ::memset(VHDR1, 0x00U, MotVoiceHeader1::HCW_LENGTH); diff --git a/src/dfsi/network/DfsiPeerNetwork.cpp b/src/dfsi/network/DfsiPeerNetwork.cpp index eccd57ad..a5a93e4c 100644 --- a/src/dfsi/network/DfsiPeerNetwork.cpp +++ b/src/dfsi/network/DfsiPeerNetwork.cpp @@ -9,6 +9,7 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2024 Patrick McDonnell, W3AXL +* Copyright (C) 2024 Bryan Biedenkapp, N2PLL * */ #include "dfsi/Defines.h" @@ -61,7 +62,7 @@ DfsiPeerNetwork::DfsiPeerNetwork(const std::string& address, uint16_t port, uint /// /// /// -bool DfsiPeerNetwork::writeP25LDU1(const p25::lc::LC& control, const p25::data::LowSpeedData& lsd, const uint8_t* data, uint8_t frameType) +bool DfsiPeerNetwork::writeP25LDU1(const p25::lc::LC& control, const p25::data::LowSpeedData& lsd, const uint8_t* data, P25DEF::FrameType::E frameType) { if (m_status != NET_STAT_RUNNING && m_status != NET_STAT_MST_RUNNING) return false; @@ -187,8 +188,10 @@ bool DfsiPeerNetwork::writeConfig() /// /// UInt8Array DfsiPeerNetwork::createP25_LDU1Message_Raw(uint32_t& length, const p25::lc::LC& control, const p25::data::LowSpeedData& lsd, - const uint8_t* data, uint8_t frameType) + const uint8_t* data, P25DEF::FrameType::E frameType) { + using namespace p25::dfsi::defines; + using namespace p25::defines; assert(data != nullptr); p25::dfsi::LC dfsiLC = p25::dfsi::LC(control, lsd); @@ -197,56 +200,56 @@ UInt8Array DfsiPeerNetwork::createP25_LDU1Message_Raw(uint32_t& length, const p2 ::memset(buffer, 0x00U, P25_LDU1_PACKET_LENGTH + PACKET_PAD); // construct P25 message header - createP25_MessageHdr(buffer, p25::P25_DUID_LDU1, control, lsd, frameType); + createP25_MessageHdr(buffer, DUID::LDU1, control, lsd, frameType); // pack DFSI data uint32_t count = MSG_HDR_SIZE; - uint8_t imbe[p25::P25_RAW_IMBE_LENGTH_BYTES]; + uint8_t imbe[RAW_IMBE_LENGTH_BYTES]; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE1); - ::memcpy(imbe, data + 10U, p25::P25_RAW_IMBE_LENGTH_BYTES); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE1); + ::memcpy(imbe, data + 10U, RAW_IMBE_LENGTH_BYTES); dfsiLC.encodeLDU1(buffer + 24U, imbe); - count += p25::dfsi::P25_DFSI_LDU1_VOICE1_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE1_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE2); - ::memcpy(imbe, data + 26U, p25::P25_RAW_IMBE_LENGTH_BYTES); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE2); + ::memcpy(imbe, data + 26U, RAW_IMBE_LENGTH_BYTES); dfsiLC.encodeLDU1(buffer + 46U, imbe); - count += p25::dfsi::P25_DFSI_LDU1_VOICE2_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE2_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE3); - ::memcpy(imbe, data + 55U, p25::P25_RAW_IMBE_LENGTH_BYTES); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE3); + ::memcpy(imbe, data + 55U, RAW_IMBE_LENGTH_BYTES); dfsiLC.encodeLDU1(buffer + 60U, imbe); - count += p25::dfsi::P25_DFSI_LDU1_VOICE3_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE3_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE4); - ::memcpy(imbe, data + 80U, p25::P25_RAW_IMBE_LENGTH_BYTES); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE4); + ::memcpy(imbe, data + 80U, RAW_IMBE_LENGTH_BYTES); dfsiLC.encodeLDU1(buffer + 77U, imbe); - count += p25::dfsi::P25_DFSI_LDU1_VOICE4_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE4_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE5); - ::memcpy(imbe, data + 105U, p25::P25_RAW_IMBE_LENGTH_BYTES); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE5); + ::memcpy(imbe, data + 105U, RAW_IMBE_LENGTH_BYTES); dfsiLC.encodeLDU1(buffer + 94U, imbe); - count += p25::dfsi::P25_DFSI_LDU1_VOICE5_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE5_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE6); - ::memcpy(imbe, data + 130U, p25::P25_RAW_IMBE_LENGTH_BYTES); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE6); + ::memcpy(imbe, data + 130U, RAW_IMBE_LENGTH_BYTES); dfsiLC.encodeLDU1(buffer + 111U, imbe); - count += p25::dfsi::P25_DFSI_LDU1_VOICE6_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE6_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE7); - ::memcpy(imbe, data + 155U, p25::P25_RAW_IMBE_LENGTH_BYTES); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE7); + ::memcpy(imbe, data + 155U, RAW_IMBE_LENGTH_BYTES); dfsiLC.encodeLDU1(buffer + 128U, imbe); - count += p25::dfsi::P25_DFSI_LDU1_VOICE7_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE7_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE8); - ::memcpy(imbe, data + 180U, p25::P25_RAW_IMBE_LENGTH_BYTES); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE8); + ::memcpy(imbe, data + 180U, RAW_IMBE_LENGTH_BYTES); dfsiLC.encodeLDU1(buffer + 145U, imbe); - count += p25::dfsi::P25_DFSI_LDU1_VOICE8_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE8_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE9); - ::memcpy(imbe, data + 204U, p25::P25_RAW_IMBE_LENGTH_BYTES); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE9); + ::memcpy(imbe, data + 204U, RAW_IMBE_LENGTH_BYTES); dfsiLC.encodeLDU1(buffer + 162U, imbe); - count += p25::dfsi::P25_DFSI_LDU1_VOICE9_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE9_FRAME_LENGTH_BYTES; buffer[23U] = count; @@ -268,6 +271,8 @@ UInt8Array DfsiPeerNetwork::createP25_LDU1Message_Raw(uint32_t& length, const p2 UInt8Array DfsiPeerNetwork::createP25_LDU2Message_Raw(uint32_t& length, const p25::lc::LC& control, const p25::data::LowSpeedData& lsd, const uint8_t* data) { + using namespace p25::dfsi::defines; + using namespace p25::defines; assert(data != nullptr); p25::dfsi::LC dfsiLC = p25::dfsi::LC(control, lsd); @@ -276,56 +281,56 @@ UInt8Array DfsiPeerNetwork::createP25_LDU2Message_Raw(uint32_t& length, const p2 ::memset(buffer, 0x00U, P25_LDU2_PACKET_LENGTH + PACKET_PAD); // construct P25 message header - createP25_MessageHdr(buffer, p25::P25_DUID_LDU2, control, lsd, p25::P25_FT_DATA_UNIT); + createP25_MessageHdr(buffer, DUID::LDU2, control, lsd, FrameType::DATA_UNIT); // pack DFSI data uint32_t count = MSG_HDR_SIZE; - uint8_t imbe[p25::P25_RAW_IMBE_LENGTH_BYTES]; + uint8_t imbe[RAW_IMBE_LENGTH_BYTES]; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE10); - ::memcpy(imbe, data + 10U, p25::P25_RAW_IMBE_LENGTH_BYTES); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE10); + ::memcpy(imbe, data + 10U, RAW_IMBE_LENGTH_BYTES); dfsiLC.encodeLDU2(buffer + 24U, imbe); - count += p25::dfsi::P25_DFSI_LDU2_VOICE10_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE10_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE11); - ::memcpy(imbe, data + 26U, p25::P25_RAW_IMBE_LENGTH_BYTES); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE11); + ::memcpy(imbe, data + 26U, RAW_IMBE_LENGTH_BYTES); dfsiLC.encodeLDU2(buffer + 46U, imbe); - count += p25::dfsi::P25_DFSI_LDU2_VOICE11_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE11_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE12); - ::memcpy(imbe, data + 55U, p25::P25_RAW_IMBE_LENGTH_BYTES); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE12); + ::memcpy(imbe, data + 55U, RAW_IMBE_LENGTH_BYTES); dfsiLC.encodeLDU2(buffer + 60U, imbe); - count += p25::dfsi::P25_DFSI_LDU2_VOICE12_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE12_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE13); - ::memcpy(imbe, data + 80U, p25::P25_RAW_IMBE_LENGTH_BYTES); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE13); + ::memcpy(imbe, data + 80U, RAW_IMBE_LENGTH_BYTES); dfsiLC.encodeLDU2(buffer + 77U, imbe); - count += p25::dfsi::P25_DFSI_LDU2_VOICE13_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE13_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE14); - ::memcpy(imbe, data + 105U, p25::P25_RAW_IMBE_LENGTH_BYTES); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE14); + ::memcpy(imbe, data + 105U, RAW_IMBE_LENGTH_BYTES); dfsiLC.encodeLDU2(buffer + 94U, imbe); - count += p25::dfsi::P25_DFSI_LDU2_VOICE14_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE14_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE15); - ::memcpy(imbe, data + 130U, p25::P25_RAW_IMBE_LENGTH_BYTES); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE15); + ::memcpy(imbe, data + 130U, RAW_IMBE_LENGTH_BYTES); dfsiLC.encodeLDU2(buffer + 111U, imbe); - count += p25::dfsi::P25_DFSI_LDU2_VOICE15_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE15_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE16); - ::memcpy(imbe, data + 155U, p25::P25_RAW_IMBE_LENGTH_BYTES); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE16); + ::memcpy(imbe, data + 155U, RAW_IMBE_LENGTH_BYTES); dfsiLC.encodeLDU2(buffer + 128U, imbe); - count += p25::dfsi::P25_DFSI_LDU2_VOICE16_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE16_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE17); - ::memcpy(imbe, data + 180U, p25::P25_RAW_IMBE_LENGTH_BYTES); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE17); + ::memcpy(imbe, data + 180U, RAW_IMBE_LENGTH_BYTES); dfsiLC.encodeLDU2(buffer + 145U, imbe); - count += p25::dfsi::P25_DFSI_LDU2_VOICE17_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE17_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE18); - ::memcpy(imbe, data + 204U, p25::P25_RAW_IMBE_LENGTH_BYTES); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE18); + ::memcpy(imbe, data + 204U, RAW_IMBE_LENGTH_BYTES); dfsiLC.encodeLDU2(buffer + 162U, imbe); - count += p25::dfsi::P25_DFSI_LDU2_VOICE18_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE18_FRAME_LENGTH_BYTES; buffer[23U] = count; diff --git a/src/dfsi/network/DfsiPeerNetwork.h b/src/dfsi/network/DfsiPeerNetwork.h index 68456aad..6a12b34b 100644 --- a/src/dfsi/network/DfsiPeerNetwork.h +++ b/src/dfsi/network/DfsiPeerNetwork.h @@ -9,6 +9,7 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2024 Patrick McDonnell, W3AXL +* Copyright (C) 2024 Bryan Biedenkapp, N2PLL * */ #if !defined(__DFSI_PEER_NETWORK_H__) @@ -35,7 +36,7 @@ namespace network /// Writes P25 LDU1 frame data to the network. bool writeP25LDU1(const p25::lc::LC& control, const p25::data::LowSpeedData& lsd, const uint8_t* data, - uint8_t frameType) override; + P25DEF::FrameType::E frameType) override; /// Writes P25 LDU2 frame data to the network. bool writeP25LDU2(const p25::lc::LC& control, const p25::data::LowSpeedData& lsd, const uint8_t* data) override; @@ -46,7 +47,7 @@ namespace network private: /// Creates an P25 LDU1 frame message. UInt8Array createP25_LDU1Message_Raw(uint32_t& length, const p25::lc::LC& control, const p25::data::LowSpeedData& lsd, - const uint8_t* data, uint8_t frameType); + const uint8_t* data, P25DEF::FrameType::E frameType); /// Creates an P25 LDU2 frame message. UInt8Array createP25_LDU2Message_Raw(uint32_t& length, const p25::lc::LC& control, const p25::data::LowSpeedData& lsd, const uint8_t* data); diff --git a/src/dfsi/network/SerialService.cpp b/src/dfsi/network/SerialService.cpp index 2f5fc9d0..b8633f0c 100644 --- a/src/dfsi/network/SerialService.cpp +++ b/src/dfsi/network/SerialService.cpp @@ -21,6 +21,8 @@ using namespace network; using namespace modem; using namespace p25; +using namespace p25::defines; +using namespace p25::dfsi::defines; using namespace dfsi; // --------------------------------------------------------------------------- @@ -91,7 +93,7 @@ SerialService::SerialService(std::string& portType, const std::string& portName, } m_lastIMBE = new uint8_t[11U]; - ::memcpy(m_lastIMBE, P25_NULL_IMBE, 11U); + ::memcpy(m_lastIMBE, NULL_IMBE, 11U); m_msgBuffer = new uint8_t[BUFFER_LENGTH]; } @@ -277,7 +279,7 @@ void SerialService::processP25FromNet(UInt8Array p25Buffer, uint32_t length) //bool unitToUnit = (p25Buffer[14U] & 0x01U) == 0x01U; // Decode network header - uint8_t duid = p25Buffer[22U]; + DUID::E duid = (DUID::E)p25Buffer[22U]; uint8_t mfid = p25Buffer[15U]; // Setup P25 data handlers @@ -285,7 +287,7 @@ void SerialService::processP25FromNet(UInt8Array p25Buffer, uint32_t length) uint8_t frameLength = p25Buffer[23U]; // Handle PDUs - if (duid == p25::P25_DUID_PDU) { + if (duid == DUID::PDU) { frameLength = length; data = std::unique_ptr(new uint8_t[length]); ::memset(data.get(), 0x00U, length); @@ -313,7 +315,7 @@ void SerialService::processP25FromNet(UInt8Array p25Buffer, uint32_t length) uint32_t netId = __GET_UINT16(p25Buffer, 16U); uint8_t lsd1 = p25Buffer[20U]; uint8_t lsd2 = p25Buffer[21U]; - uint8_t frameType = p25::P25_FT_DATA_UNIT; + FrameType::E frameType = FrameType::DATA_UNIT; // Default any 0's if (netId == 0U) { @@ -332,22 +334,22 @@ void SerialService::processP25FromNet(UInt8Array p25Buffer, uint32_t length) data::LowSpeedData lsd; // is this a LDU1, is this the first of a call? - if (duid == p25::P25_DUID_LDU1) { - frameType = p25Buffer[180U]; + if (duid == DUID::LDU1) { + frameType = (FrameType::E)p25Buffer[180U]; if (m_debug) { LogDebug(LOG_NET, "P25, frameType = $%02X", frameType); } - if (frameType == p25::P25_FT_HDU_VALID) { + if (frameType == FrameType::HDU_VALID) { uint8_t algId = p25Buffer[181U]; uint32_t kid = (p25Buffer[182U] << 8) | (p25Buffer[183U] << 0); // copy MI data - uint8_t mi[p25::P25_MI_LENGTH_BYTES]; - ::memset(mi, 0x00U, p25::P25_MI_LENGTH_BYTES); + uint8_t mi[MI_LENGTH_BYTES]; + ::memset(mi, 0x00U, MI_LENGTH_BYTES); - for (uint8_t i = 0; i < p25::P25_MI_LENGTH_BYTES; i++) { + for (uint8_t i = 0; i < MI_LENGTH_BYTES; i++) { mi[i] = p25Buffer[184U + i]; } @@ -385,54 +387,54 @@ void SerialService::processP25FromNet(UInt8Array p25Buffer, uint32_t length) // forward onto the specific processor for final processing and delivery switch (duid) { - case P25_DUID_LDU1: + case DUID::LDU1: { - if ((message[0U] == dfsi::P25_DFSI_LDU1_VOICE1) && (message[22U] == dfsi::P25_DFSI_LDU1_VOICE2) && - (message[36U] == dfsi::P25_DFSI_LDU1_VOICE3) && (message[53U] == dfsi::P25_DFSI_LDU1_VOICE4) && - (message[70U] == dfsi::P25_DFSI_LDU1_VOICE5) && (message[87U] == dfsi::P25_DFSI_LDU1_VOICE6) && - (message[104U] == dfsi::P25_DFSI_LDU1_VOICE7) && (message[121U] == dfsi::P25_DFSI_LDU1_VOICE8) && - (message[138U] == dfsi::P25_DFSI_LDU1_VOICE9)) { + if ((message[0U] == DFSIFrameType::LDU1_VOICE1) && (message[22U] == DFSIFrameType::LDU1_VOICE2) && + (message[36U] == DFSIFrameType::LDU1_VOICE3) && (message[53U] == DFSIFrameType::LDU1_VOICE4) && + (message[70U] == DFSIFrameType::LDU1_VOICE5) && (message[87U] == DFSIFrameType::LDU1_VOICE6) && + (message[104U] == DFSIFrameType::LDU1_VOICE7) && (message[121U] == DFSIFrameType::LDU1_VOICE8) && + (message[138U] == DFSIFrameType::LDU1_VOICE9)) { uint32_t count = 0U; dfsi::LC dfsiLC = dfsi::LC(control, lsd); uint8_t netLDU1[9U * 25U]; ::memset(netLDU1, 0x00U, 9U * 25U); - dfsiLC.setFrameType(dfsi::P25_DFSI_LDU1_VOICE1); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE1); dfsiLC.decodeLDU1(message + count, netLDU1 + 10U); - count += dfsi::P25_DFSI_LDU1_VOICE1_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE1_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(dfsi::P25_DFSI_LDU1_VOICE2); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE2); dfsiLC.decodeLDU1(message + count, netLDU1 + 26U); - count += dfsi::P25_DFSI_LDU1_VOICE2_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE2_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(dfsi::P25_DFSI_LDU1_VOICE3); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE3); dfsiLC.decodeLDU1(message + count, netLDU1 + 55U); - count += dfsi::P25_DFSI_LDU1_VOICE3_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE3_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(dfsi::P25_DFSI_LDU1_VOICE4); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE4); dfsiLC.decodeLDU1(message + count, netLDU1 + 80U); - count += dfsi::P25_DFSI_LDU1_VOICE4_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE4_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(dfsi::P25_DFSI_LDU1_VOICE5); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE5); dfsiLC.decodeLDU1(message + count, netLDU1 + 105U); - count += dfsi::P25_DFSI_LDU1_VOICE5_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE5_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(dfsi::P25_DFSI_LDU1_VOICE6); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE6); dfsiLC.decodeLDU1(message + count, netLDU1 + 130U); - count += dfsi::P25_DFSI_LDU1_VOICE6_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE6_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(dfsi::P25_DFSI_LDU1_VOICE7); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE7); dfsiLC.decodeLDU1(message + count, netLDU1 + 155U); - count += dfsi::P25_DFSI_LDU1_VOICE7_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE7_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(dfsi::P25_DFSI_LDU1_VOICE8); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE8); dfsiLC.decodeLDU1(message + count, netLDU1 + 180U); - count += dfsi::P25_DFSI_LDU1_VOICE8_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE8_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(dfsi::P25_DFSI_LDU1_VOICE9); + dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE9); dfsiLC.decodeLDU1(message + count, netLDU1 + 204U); - count += dfsi::P25_DFSI_LDU1_VOICE9_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE9_FRAME_LENGTH_BYTES; control = lc::LC(*dfsiLC.control()); @@ -449,54 +451,54 @@ void SerialService::processP25FromNet(UInt8Array p25Buffer, uint32_t length) } } break; - case P25_DUID_LDU2: + case DUID::LDU2: { - if ((message[0U] == dfsi::P25_DFSI_LDU2_VOICE10) && (message[22U] == dfsi::P25_DFSI_LDU2_VOICE11) && - (message[36U] == dfsi::P25_DFSI_LDU2_VOICE12) && (message[53U] == dfsi::P25_DFSI_LDU2_VOICE13) && - (message[70U] == dfsi::P25_DFSI_LDU2_VOICE14) && (message[87U] == dfsi::P25_DFSI_LDU2_VOICE15) && - (message[104U] == dfsi::P25_DFSI_LDU2_VOICE16) && (message[121U] == dfsi::P25_DFSI_LDU2_VOICE17) && - (message[138U] == dfsi::P25_DFSI_LDU2_VOICE18)) { + if ((message[0U] == DFSIFrameType::LDU2_VOICE10) && (message[22U] == DFSIFrameType::LDU2_VOICE11) && + (message[36U] == DFSIFrameType::LDU2_VOICE12) && (message[53U] == DFSIFrameType::LDU2_VOICE13) && + (message[70U] == DFSIFrameType::LDU2_VOICE14) && (message[87U] == DFSIFrameType::LDU2_VOICE15) && + (message[104U] == DFSIFrameType::LDU2_VOICE16) && (message[121U] == DFSIFrameType::LDU2_VOICE17) && + (message[138U] == DFSIFrameType::LDU2_VOICE18)) { uint32_t count = 0U; dfsi::LC dfsiLC = dfsi::LC(control, lsd); uint8_t netLDU2[9U * 25U]; ::memset(netLDU2, 0x00U, 9U * 25U); - dfsiLC.setFrameType(dfsi::P25_DFSI_LDU2_VOICE10); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE10); dfsiLC.decodeLDU2(message + count, netLDU2 + 10U); - count += dfsi::P25_DFSI_LDU2_VOICE10_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE10_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(dfsi::P25_DFSI_LDU2_VOICE11); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE11); dfsiLC.decodeLDU2(message + count, netLDU2 + 26U); - count += dfsi::P25_DFSI_LDU2_VOICE11_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE11_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(dfsi::P25_DFSI_LDU2_VOICE12); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE12); dfsiLC.decodeLDU2(message + count, netLDU2 + 55U); - count += dfsi::P25_DFSI_LDU2_VOICE12_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE12_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(dfsi::P25_DFSI_LDU2_VOICE13); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE13); dfsiLC.decodeLDU2(message + count, netLDU2 + 80U); - count += dfsi::P25_DFSI_LDU2_VOICE13_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE13_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(dfsi::P25_DFSI_LDU2_VOICE14); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE14); dfsiLC.decodeLDU2(message + count, netLDU2 + 105U); - count += dfsi::P25_DFSI_LDU2_VOICE14_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE14_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(dfsi::P25_DFSI_LDU2_VOICE15); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE15); dfsiLC.decodeLDU2(message + count, netLDU2 + 130U); - count += dfsi::P25_DFSI_LDU2_VOICE15_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE15_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(dfsi::P25_DFSI_LDU2_VOICE16); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE16); dfsiLC.decodeLDU2(message + count, netLDU2 + 155U); - count += dfsi::P25_DFSI_LDU2_VOICE16_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE16_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(dfsi::P25_DFSI_LDU2_VOICE17); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE17); dfsiLC.decodeLDU2(message + count, netLDU2 + 180U); - count += dfsi::P25_DFSI_LDU2_VOICE17_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE17_FRAME_LENGTH_BYTES; - dfsiLC.setFrameType(dfsi::P25_DFSI_LDU2_VOICE18); + dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE18); dfsiLC.decodeLDU2(message + count, netLDU2 + 204U); - count += dfsi::P25_DFSI_LDU2_VOICE18_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE18_FRAME_LENGTH_BYTES; control = lc::LC(*dfsiLC.control()); LogInfoEx(LOG_SERIAL, P25_LDU2_STR " audio, algo = $%02X, kid = $%04X", control.getAlgId(), control.getKId()); @@ -508,26 +510,26 @@ void SerialService::processP25FromNet(UInt8Array p25Buffer, uint32_t length) } break; - case P25_DUID_TSDU: + case DUID::TSDU: //processTSDU(data.get(), frameLength, control, lsd); // We don't handle TSDUs right now break; - case P25_DUID_TDU: - case P25_DUID_TDULC: + case DUID::TDU: + case DUID::TDULC: { - if (duid == P25_DUID_TDULC) { + if (duid == DUID::TDULC) { std::unique_ptr tdulc = lc::tdulc::TDULCFactory::createTDULC(data.get()); if (tdulc == nullptr) { LogWarning(LOG_NET, P25_TDULC_STR ", undecodable TDULC"); } else { - if (tdulc->getLCO() != LC_CALL_TERM) + if (tdulc->getLCO() != LCO::CALL_TERM) break; } } // is this an TDU with a grant demand? - if (duid == P25_DUID_TDU && grantDemand) { + if (duid == DUID::TDU && grantDemand) { break; // ignore grant demands } @@ -541,6 +543,9 @@ void SerialService::processP25FromNet(UInt8Array p25Buffer, uint32_t length) m_sequences[dstId] = RTP_END_OF_CALL_SEQ; } break; + + default: + break; } } @@ -605,7 +610,7 @@ void SerialService::processP25ToNet() ::memcpy(dfsiData, data + 2U, len - 2); // Extract DFSI frame type - uint8_t frameType = dfsiData[0U]; + DFSIFrameType::E frameType = (DFSIFrameType::E)dfsiData[0U]; //LogDebug(LOG_SERIAL, "Handling DFSI frameType 0x%02X", frameType); @@ -615,7 +620,7 @@ void SerialService::processP25ToNet() // Switch based on DFSI frame type switch (frameType) { // Start/Stop Frame - case P25_DFSI_MOT_START_STOP: + case DFSIFrameType::MOT_START_STOP: { // Decode the frame MotStartOfStream start = MotStartOfStream(dfsiData); @@ -644,7 +649,7 @@ void SerialService::processP25ToNet() } break; // VHDR 1 Frame - case P25_DFSI_MOT_VHDR_1: + case DFSIFrameType::MOT_VHDR_1: { // Decode MotVoiceHeader1 vhdr1 = MotVoiceHeader1(dfsiData); @@ -659,7 +664,7 @@ void SerialService::processP25ToNet() } break; // VHDR 2 Frame - case P25_DFSI_MOT_VHDR_2: + case DFSIFrameType::MOT_VHDR_2: { // Decode MotVoiceHeader2 vhdr2 = MotVoiceHeader2(dfsiData); @@ -671,7 +676,7 @@ void SerialService::processP25ToNet() } // Buffer for raw VHDR data - uint8_t raw[P25_DFSI_VHDR_RAW_LEN]; + uint8_t raw[DFSI_VHDR_RAW_LEN]; // Get VHDR1 data ::memcpy(raw, m_rxVoiceCallData->VHDR1, 8U); ::memcpy(raw + 8U, m_rxVoiceCallData->VHDR1 + 9U, 8U); @@ -682,11 +687,11 @@ void SerialService::processP25ToNet() ::memcpy(raw + 34U, m_rxVoiceCallData->VHDR2 + 18U, 2U); // Buffer for decoded VHDR data - uint8_t vhdr[P25_DFSI_VHDR_LEN]; + uint8_t vhdr[DFSI_VHDR_LEN]; // Copy over the data, decoding hex with the weird bit stuffing nonsense uint offset = 0U; - for (uint32_t i = 0; i < P25_DFSI_VHDR_RAW_LEN; i++, offset += 6) + for (uint32_t i = 0; i < DFSI_VHDR_RAW_LEN; i++, offset += 6) Utils::hex2Bin(raw[i], vhdr, offset); // Try to decode the RS data @@ -696,7 +701,7 @@ void SerialService::processP25ToNet() LogError(LOG_SERIAL, "V24 traffic failed to decode RS (36,20,17) FEC [STREAM ID %u]", m_rxVoiceCallData->streamId); } else { // Copy Message Indicator - ::memcpy(m_rxVoiceCallData->mi, vhdr, P25_MI_LENGTH_BYTES); + ::memcpy(m_rxVoiceCallData->mi, vhdr, MI_LENGTH_BYTES); // Get additional info m_rxVoiceCallData->mfId = vhdr[9U]; m_rxVoiceCallData->algoId = vhdr[10U]; @@ -714,22 +719,22 @@ void SerialService::processP25ToNet() } break; // VOICE1/10 create a start voice frame - case P25_DFSI_LDU1_VOICE1: + case DFSIFrameType::LDU1_VOICE1: { // Decode MotStartVoiceFrame svf = MotStartVoiceFrame(dfsiData); // Copy - ::memcpy(m_rxVoiceCallData->netLDU1 + 10U, svf.fullRateVoice->imbeData, MotFullRateVoice::IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU1 + 10U, svf.fullRateVoice->imbeData, RAW_IMBE_LENGTH_BYTES); // Increment our voice frame counter m_rxVoiceCallData->n++; } break; - case P25_DFSI_LDU2_VOICE10: + case DFSIFrameType::LDU2_VOICE10: { // Decode MotStartVoiceFrame svf = MotStartVoiceFrame(dfsiData); // Copy - ::memcpy(m_rxVoiceCallData->netLDU2 + 10U, svf.fullRateVoice->imbeData, MotFullRateVoice::IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU2 + 10U, svf.fullRateVoice->imbeData, RAW_IMBE_LENGTH_BYTES); // Increment our voice frame counter m_rxVoiceCallData->n++; } @@ -742,15 +747,15 @@ void SerialService::processP25ToNet() // Copy based on frame type switch (frameType) { // VOICE2 - case P25_DFSI_LDU1_VOICE2: + case DFSIFrameType::LDU1_VOICE2: { - ::memcpy(m_rxVoiceCallData->netLDU1 + 26U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU1 + 26U, voice.imbeData, RAW_IMBE_LENGTH_BYTES); } break; // VOICE3 - case P25_DFSI_LDU1_VOICE3: + case DFSIFrameType::LDU1_VOICE3: { - ::memcpy(m_rxVoiceCallData->netLDU1 + 55U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU1 + 55U, voice.imbeData, RAW_IMBE_LENGTH_BYTES); if (voice.additionalData != nullptr) { m_rxVoiceCallData->lco = voice.additionalData[0U]; m_rxVoiceCallData->mfId = voice.additionalData[1U]; @@ -761,9 +766,9 @@ void SerialService::processP25ToNet() } break; // VOICE4 - case P25_DFSI_LDU1_VOICE4: + case DFSIFrameType::LDU1_VOICE4: { - ::memcpy(m_rxVoiceCallData->netLDU1 + 80U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU1 + 80U, voice.imbeData, RAW_IMBE_LENGTH_BYTES); if (voice.additionalData != nullptr) { m_rxVoiceCallData->dstId = __GET_UINT16(voice.additionalData, 0U); } else { @@ -772,9 +777,9 @@ void SerialService::processP25ToNet() } break; // VOICE5 - case P25_DFSI_LDU1_VOICE5: + case DFSIFrameType::LDU1_VOICE5: { - ::memcpy(m_rxVoiceCallData->netLDU1 + 105U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU1 + 105U, voice.imbeData, RAW_IMBE_LENGTH_BYTES); if (voice.additionalData != nullptr) { m_rxVoiceCallData->srcId = __GET_UINT16(voice.additionalData, 0U); } else { @@ -783,27 +788,27 @@ void SerialService::processP25ToNet() } break; // VOICE6 - case P25_DFSI_LDU1_VOICE6: + case DFSIFrameType::LDU1_VOICE6: { - ::memcpy(m_rxVoiceCallData->netLDU1 + 130U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU1 + 130U, voice.imbeData, RAW_IMBE_LENGTH_BYTES); } break; // VOICE7 - case P25_DFSI_LDU1_VOICE7: + case DFSIFrameType::LDU1_VOICE7: { - ::memcpy(m_rxVoiceCallData->netLDU1 + 155U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU1 + 155U, voice.imbeData, RAW_IMBE_LENGTH_BYTES); } break; // VOICE8 - case P25_DFSI_LDU1_VOICE8: + case DFSIFrameType::LDU1_VOICE8: { - ::memcpy(m_rxVoiceCallData->netLDU1 + 180U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU1 + 180U, voice.imbeData, RAW_IMBE_LENGTH_BYTES); } break; // VOICE9 - case P25_DFSI_LDU1_VOICE9: + case DFSIFrameType::LDU1_VOICE9: { - ::memcpy(m_rxVoiceCallData->netLDU1 + 204U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU1 + 204U, voice.imbeData, RAW_IMBE_LENGTH_BYTES); if (voice.additionalData != nullptr) { m_rxVoiceCallData->lsd1 = voice.additionalData[0U]; m_rxVoiceCallData->lsd2 = voice.additionalData[1U]; @@ -813,15 +818,15 @@ void SerialService::processP25ToNet() } break; // VOICE11 - case P25_DFSI_LDU2_VOICE11: + case DFSIFrameType::LDU2_VOICE11: { - ::memcpy(m_rxVoiceCallData->netLDU2 + 26U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU2 + 26U, voice.imbeData, RAW_IMBE_LENGTH_BYTES); } break; // VOICE12 - case P25_DFSI_LDU2_VOICE12: + case DFSIFrameType::LDU2_VOICE12: { - ::memcpy(m_rxVoiceCallData->netLDU2 + 55U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU2 + 55U, voice.imbeData, RAW_IMBE_LENGTH_BYTES); if (voice.additionalData != nullptr) { ::memcpy(m_rxVoiceCallData->mi, voice.additionalData, 3U); } else { @@ -830,9 +835,9 @@ void SerialService::processP25ToNet() } break; // VOICE13 - case P25_DFSI_LDU2_VOICE13: + case DFSIFrameType::LDU2_VOICE13: { - ::memcpy(m_rxVoiceCallData->netLDU2 + 80U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU2 + 80U, voice.imbeData, RAW_IMBE_LENGTH_BYTES); if (voice.additionalData != nullptr) { ::memcpy(m_rxVoiceCallData->mi + 3U, voice.additionalData, 3U); } else { @@ -841,9 +846,9 @@ void SerialService::processP25ToNet() } break; // VOICE14 - case P25_DFSI_LDU2_VOICE14: + case DFSIFrameType::LDU2_VOICE14: { - ::memcpy(m_rxVoiceCallData->netLDU2 + 105U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU2 + 105U, voice.imbeData, RAW_IMBE_LENGTH_BYTES); if (voice.additionalData != nullptr) { ::memcpy(m_rxVoiceCallData->mi + 6U, voice.additionalData, 3U); } else { @@ -852,9 +857,9 @@ void SerialService::processP25ToNet() } break; // VOICE15 - case P25_DFSI_LDU2_VOICE15: + case DFSIFrameType::LDU2_VOICE15: { - ::memcpy(m_rxVoiceCallData->netLDU2 + 130U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU2 + 130U, voice.imbeData, RAW_IMBE_LENGTH_BYTES); if (voice.additionalData != nullptr) { m_rxVoiceCallData->algoId = voice.additionalData[0U]; m_rxVoiceCallData->kId = __GET_UINT16B(voice.additionalData, 1U); @@ -864,21 +869,21 @@ void SerialService::processP25ToNet() } break; // VOICE16 - case P25_DFSI_LDU2_VOICE16: + case DFSIFrameType::LDU2_VOICE16: { - ::memcpy(m_rxVoiceCallData->netLDU2 + 155U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU2 + 155U, voice.imbeData, RAW_IMBE_LENGTH_BYTES); } break; // VOICE17 - case P25_DFSI_LDU2_VOICE17: + case DFSIFrameType::LDU2_VOICE17: { - ::memcpy(m_rxVoiceCallData->netLDU2 + 180U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU2 + 180U, voice.imbeData, RAW_IMBE_LENGTH_BYTES); } break; // VOICE18 - case P25_DFSI_LDU2_VOICE18: + case DFSIFrameType::LDU2_VOICE18: { - ::memcpy(m_rxVoiceCallData->netLDU2 + 204U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU2 + 204U, voice.imbeData, RAW_IMBE_LENGTH_BYTES); if (voice.additionalData != nullptr) { m_rxVoiceCallData->lsd1 = voice.additionalData[0U]; m_rxVoiceCallData->lsd2 = voice.additionalData[1U]; @@ -887,6 +892,9 @@ void SerialService::processP25ToNet() } } break; + + default: + break; } // Increment our voice frame counter @@ -920,7 +928,7 @@ void SerialService::processP25ToNet() // Send LDU1 if ready if (m_rxVoiceCallData->n == 9U) { // Send (TODO: dynamically set HDU_VALID or DATA_VALID depending on start of call or not) - bool ret = m_network->writeP25LDU1(*m_rxVoiceControl, *m_rxVoiceLsd, m_rxVoiceCallData->netLDU1, P25_FT_HDU_VALID); + bool ret = m_network->writeP25LDU1(*m_rxVoiceControl, *m_rxVoiceLsd, m_rxVoiceCallData->netLDU1, FrameType::HDU_VALID); // Print LogInfoEx(LOG_NET, P25_LDU1_STR " audio, srcId = %u, dstId = %u", m_rxVoiceCallData->srcId, m_rxVoiceCallData->dstId); // Optional Debug @@ -1255,7 +1263,7 @@ uint32_t SerialService::readP25Frame(uint8_t* data) /// /// This is very similar to the C# Mot_DFSISendFrame functions, we don't implement the TIA DFSI sendframe in serial /// because the only devices we connect to over serial V24 are Moto -void SerialService::writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu) +void SerialService::writeP25Frame(DUID::E duid, dfsi::LC& lc, uint8_t* ldu) { // Sanity check assert(ldu != nullptr); @@ -1274,14 +1282,14 @@ void SerialService::writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu) (control.getPriority() & 0x07U); // Get the MI - uint8_t mi[P25_MI_LENGTH_BYTES]; + uint8_t mi[MI_LENGTH_BYTES]; control.getMI(mi); // Calculate reed-solomon encoding depending on DUID type uint8_t rs[P25_LDU_LC_FEC_LENGTH_BYTES]; ::memset(rs, 0x00U, P25_LDU_LC_FEC_LENGTH_BYTES); switch(duid) { - case P25_DUID_LDU1: + case DUID::LDU1: { rs[0U] = control.getLCO(); // LCO rs[1U] = control.getMFId(); // MFId @@ -1299,9 +1307,9 @@ void SerialService::writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu) m_rs.encode241213(rs); } break; - case P25_DUID_LDU2: + case DUID::LDU2: { - for (uint32_t i = 0; i < P25_MI_LENGTH_BYTES; i++) + for (uint32_t i = 0; i < MI_LENGTH_BYTES; i++) rs[i] = mi[i]; // Message Indicator rs[9U] = control.getAlgId(); // Algorithm ID @@ -1312,6 +1320,9 @@ void SerialService::writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu) m_rs.encode24169(rs); } break; + + default: + break; } // Placeholder for last call timestamp retrieved below (Not used yet) @@ -1337,16 +1348,16 @@ void SerialService::writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu) } // Check if we need to start a new data stream - if (duid == P25_DUID_LDU1 && ((sequence == 0U) || (sequence == RTP_END_OF_CALL_SEQ))) { + if (duid == DUID::LDU1 && ((sequence == 0U) || (sequence == RTP_END_OF_CALL_SEQ))) { // Start the new stream startOfStream(lc); // Update our call entry m_sequences[control.getDstId()] = ++sequence; // Log - LogInfoEx(LOG_SERIAL, "CALL START: %svoice call from %u to TG %u", (control.getAlgId() != P25_ALGO_UNENCRYPT) ? "encrypted " : "", control.getSrcId(), control.getDstId()); + LogInfoEx(LOG_SERIAL, "CALL START: %svoice call from %u to TG %u", (control.getAlgId() != ALGO_UNENCRYPT) ? "encrypted " : "", control.getSrcId(), control.getDstId()); - ActivityLog("network %svoice transmission call from %u to TG %u", (control.getAlgId() != P25_ALGO_UNENCRYPT) ? "encrypted " : "", control.getSrcId(), control.getDstId()); + ActivityLog("network %svoice transmission call from %u to TG %u", (control.getAlgId() != ALGO_UNENCRYPT) ? "encrypted " : "", control.getSrcId(), control.getDstId()); } else { // If this TGID isn't either lookup, consider it a late entry and start a new stream if ( (m_sequences.find(control.getDstId()) == m_sequences.end()) || (m_lastHeard.find(control.getDstId()) == m_lastHeard.end()) ) { @@ -1355,17 +1366,17 @@ void SerialService::writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu) m_lastHeard[control.getDstId()] = now; m_sequences[control.getDstId()] = ++sequence; - LogInfoEx(LOG_SERIAL, "LATE CALL START: %svoice call from %u to TG %u", (control.getAlgId() != P25_ALGO_UNENCRYPT) ? "encrypted " : "", control.getSrcId(), control.getDstId()); - ActivityLog("network %svoice transmission late entry from %u to TG %u", (control.getAlgId() != P25_ALGO_UNENCRYPT) ? "encrypted " : "", control.getSrcId(), control.getDstId()); + LogInfoEx(LOG_SERIAL, "LATE CALL START: %svoice call from %u to TG %u", (control.getAlgId() != ALGO_UNENCRYPT) ? "encrypted " : "", control.getSrcId(), control.getDstId()); + ActivityLog("network %svoice transmission late entry from %u to TG %u", (control.getAlgId() != ALGO_UNENCRYPT) ? "encrypted " : "", control.getSrcId(), control.getDstId()); } } // Check if we need to end the call - if ( (duid == P25_DUID_TDU) || (duid == P25_DUID_TDULC) ) { + if ( (duid == DUID::TDU) || (duid == DUID::TDULC) ) { // Stop endOfStream(); // Log - LogInfoEx(LOG_SERIAL, "CALL END: %svoice call from %u to TG %u", (control.getAlgId() != P25_ALGO_UNENCRYPT) ? "encrypted " : "", control.getSrcId(), control.getDstId()); + LogInfoEx(LOG_SERIAL, "CALL END: %svoice call from %u to TG %u", (control.getAlgId() != ALGO_UNENCRYPT) ? "encrypted " : "", control.getSrcId(), control.getDstId()); // Clear our counters m_sequences[control.getDstId()] = RTP_END_OF_CALL_SEQ; } @@ -1385,7 +1396,7 @@ void SerialService::writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu) case 0: // VOICE1/10 { // Set frametype - voice.setFrameType((duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE1 : P25_DFSI_LDU2_VOICE10); + voice.setFrameType((duid == DUID::LDU1) ? DFSIFrameType::LDU1_VOICE1 : DFSIFrameType::LDU2_VOICE10); // Create the new frame objects MotStartVoiceFrame svf = MotStartVoiceFrame(); // Set values appropriately @@ -1394,10 +1405,10 @@ void SerialService::writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu) // Set frame type svf.fullRateVoice->setFrameType(voice.getFrameType()); // Set source flag & ICW flag - svf.fullRateVoice->setSource(m_diu ? SOURCE_DIU : SOURCE_QUANTAR); - svf.setICW(m_diu ? ICW_DIU : ICW_QUANTAR); + svf.fullRateVoice->setSource(m_diu ? SourceFlag::DIU : SourceFlag::QUANTAR); + svf.setICW(m_diu ? ICWFlag::DIU : ICWFlag::QUANTAR); // Copy data - ::memcpy(svf.fullRateVoice->imbeData, ldu + 10U, MotFullRateVoice::IMBE_BUF_LEN); + ::memcpy(svf.fullRateVoice->imbeData, ldu + 10U, RAW_IMBE_LENGTH_BYTES); // Encode buffer = new uint8_t[svf.LENGTH]; ::memset(buffer, 0x00U, svf.LENGTH); @@ -1407,21 +1418,21 @@ void SerialService::writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu) break; case 1: // VOICE2/11 { - voice.setFrameType((duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE2 : P25_DFSI_LDU2_VOICE11); + voice.setFrameType((duid == DUID::LDU1) ? DFSIFrameType::LDU1_VOICE2 : DFSIFrameType::LDU2_VOICE11); // Set source flag - voice.setSource(m_diu ? SOURCE_DIU : SOURCE_QUANTAR); - ::memcpy(voice.imbeData, ldu + 26U, voice.IMBE_BUF_LEN); + voice.setSource(m_diu ? SourceFlag::DIU : SourceFlag::QUANTAR); + ::memcpy(voice.imbeData, ldu + 26U, RAW_IMBE_LENGTH_BYTES); } break; case 2: // VOICE3/12 { - voice.setFrameType((duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE3 : P25_DFSI_LDU2_VOICE12); - ::memcpy(voice.imbeData, ldu + 55U, voice.IMBE_BUF_LEN); + voice.setFrameType((duid == DUID::LDU1) ? DFSIFrameType::LDU1_VOICE3 : DFSIFrameType::LDU2_VOICE12); + ::memcpy(voice.imbeData, ldu + 55U, RAW_IMBE_LENGTH_BYTES); // Create the additional data array voice.additionalData = new uint8_t[voice.ADDITIONAL_LENGTH]; ::memset(voice.additionalData, 0x00U, voice.ADDITIONAL_LENGTH); // Copy additional data - if (voice.getFrameType() == P25_DUID_LDU1) { + if (voice.getFrameType() == DFSIFrameType::LDU1_VOICE3) { voice.additionalData[0U] = control.getLCO(); voice.additionalData[1U] = control.getMFId(); voice.additionalData[2U] = serviceOptions; @@ -1434,20 +1445,20 @@ void SerialService::writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu) break; case 3: // VOICE4/13 { - voice.setFrameType((duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE4 : P25_DFSI_LDU2_VOICE13); - ::memcpy(voice.imbeData, ldu + 80U, voice.IMBE_BUF_LEN); + voice.setFrameType((duid == DUID::LDU1) ? DFSIFrameType::LDU1_VOICE4 : DFSIFrameType::LDU2_VOICE13); + ::memcpy(voice.imbeData, ldu + 80U, RAW_IMBE_LENGTH_BYTES); // Create the additional data array voice.additionalData = new uint8_t[voice.ADDITIONAL_LENGTH]; ::memset(voice.additionalData, 0x00U, voice.ADDITIONAL_LENGTH); // We set the additional data based on LDU1/2 switch (duid) { - case P25_DUID_LDU1: + case DUID::LDU1: { // Destination address (3 bytes) __SET_UINT16(control.getDstId(), voice.additionalData, 0U); } break; - case P25_DUID_LDU2: + case DUID::LDU2: { // Message Indicator voice.additionalData[0U] = mi[3U]; @@ -1455,25 +1466,27 @@ void SerialService::writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu) voice.additionalData[2U] = mi[5U]; } break; + default: + break; } } break; case 4: // VOICE5/14 { - voice.setFrameType((duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE5 : P25_DFSI_LDU2_VOICE14); - ::memcpy(voice.imbeData, ldu + 105U, voice.IMBE_BUF_LEN); + voice.setFrameType((duid == DUID::LDU1) ? DFSIFrameType::LDU1_VOICE5 : DFSIFrameType::LDU2_VOICE14); + ::memcpy(voice.imbeData, ldu + 105U, RAW_IMBE_LENGTH_BYTES); // Create the additional data array voice.additionalData = new uint8_t[voice.ADDITIONAL_LENGTH]; ::memset(voice.additionalData, 0x00U, voice.ADDITIONAL_LENGTH); // Same as case 3 above switch (duid) { - case P25_DUID_LDU1: + case DUID::LDU1: { // Source address (3 bytes) __SET_UINT16(control.getSrcId(), voice.additionalData, 0U); } break; - case P25_DUID_LDU2: + case DUID::LDU2: { // Message Indicator voice.additionalData[0U] = mi[6U]; @@ -1481,19 +1494,21 @@ void SerialService::writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu) voice.additionalData[2U] = mi[8U]; } break; + default: + break; } } break; case 5: // VOICE6/15 { - voice.setFrameType((duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE6 : P25_DFSI_LDU2_VOICE15); - ::memcpy(voice.imbeData, ldu + 130U, voice.IMBE_BUF_LEN); + voice.setFrameType((duid == DUID::LDU1) ? DFSIFrameType::LDU1_VOICE6 : DFSIFrameType::LDU2_VOICE15); + ::memcpy(voice.imbeData, ldu + 130U, RAW_IMBE_LENGTH_BYTES); // Create the additional data array voice.additionalData = new uint8_t[voice.ADDITIONAL_LENGTH]; ::memset(voice.additionalData, 0x00U, voice.ADDITIONAL_LENGTH); // Another switch on LDU1/2 switch (duid) { - case P25_DUID_LDU1: + case DUID::LDU1: { // RS encoding voice.additionalData[0U] = rs[9U]; @@ -1501,19 +1516,21 @@ void SerialService::writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu) voice.additionalData[2U] = rs[11U]; } break; - case P25_DUID_LDU2: + case DUID::LDU2: { voice.additionalData[0U] = control.getAlgId(); // Algo ID __SET_UINT16B(control.getKId(), voice.additionalData, 1U); // Key ID } break; + default: + break; } } break; case 6: // VOICE7/16 { - voice.setFrameType((duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE7 : P25_DFSI_LDU2_VOICE16); - ::memcpy(voice.imbeData, ldu + 155U, voice.IMBE_BUF_LEN); + voice.setFrameType((duid == DUID::LDU1) ? DFSIFrameType::LDU1_VOICE7 : DFSIFrameType::LDU2_VOICE16); + ::memcpy(voice.imbeData, ldu + 155U, RAW_IMBE_LENGTH_BYTES); // Create the additional data array voice.additionalData = new uint8_t[voice.ADDITIONAL_LENGTH]; ::memset(voice.additionalData, 0x00U, voice.ADDITIONAL_LENGTH); @@ -1525,8 +1542,8 @@ void SerialService::writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu) break; case 7: // VOICE8/17 { - voice.setFrameType((duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE8 : P25_DFSI_LDU2_VOICE17); - ::memcpy(voice.imbeData, ldu + 180U, voice.IMBE_BUF_LEN); + voice.setFrameType((duid == DUID::LDU1) ? DFSIFrameType::LDU1_VOICE8 : DFSIFrameType::LDU2_VOICE17); + ::memcpy(voice.imbeData, ldu + 180U, RAW_IMBE_LENGTH_BYTES); // Create the additional data array voice.additionalData = new uint8_t[voice.ADDITIONAL_LENGTH]; ::memset(voice.additionalData, 0x00U, voice.ADDITIONAL_LENGTH); @@ -1538,8 +1555,8 @@ void SerialService::writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu) break; case 8: // VOICE9/18 { - voice.setFrameType((duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE9 : P25_DFSI_LDU2_VOICE18); - ::memcpy(voice.imbeData, ldu + 204U, voice.IMBE_BUF_LEN); + voice.setFrameType((duid == DUID::LDU1) ? DFSIFrameType::LDU1_VOICE9 : DFSIFrameType::LDU2_VOICE18); + ::memcpy(voice.imbeData, ldu + 204U, RAW_IMBE_LENGTH_BYTES); // Create the additional data array voice.additionalData = new uint8_t[voice.ADDITIONAL_LENGTH]; ::memset(voice.additionalData, 0x00U, voice.ADDITIONAL_LENGTH); @@ -1604,16 +1621,16 @@ void SerialService::startOfStream(const LC& lc) data::LowSpeedData lsd = data::LowSpeedData(*lc.lsd()); // Init message indicator & get - uint8_t mi[P25_MI_LENGTH_BYTES]; - ::memset(mi, 0x00U, P25_MI_LENGTH_BYTES); + uint8_t mi[MI_LENGTH_BYTES]; + ::memset(mi, 0x00U, MI_LENGTH_BYTES); control.getMI(mi); // Init VHDR data array - uint8_t vhdr[P25_DFSI_VHDR_LEN]; - ::memset(vhdr, 0x00U, P25_DFSI_VHDR_LEN); + uint8_t vhdr[DFSI_VHDR_LEN]; + ::memset(vhdr, 0x00U, DFSI_VHDR_LEN); // Copy MI to VHDR - ::memcpy(vhdr, mi, P25_MI_LENGTH_BYTES); + ::memcpy(vhdr, mi, MI_LENGTH_BYTES); // Set values vhdr[9U] = control.getMFId(); @@ -1625,9 +1642,9 @@ void SerialService::startOfStream(const LC& lc) m_rs.encode362017(vhdr); // Convert the binary bytes to hex bytes (some kind of bit packing thing I don't understand) - uint8_t raw[P25_DFSI_VHDR_RAW_LEN]; + uint8_t raw[DFSI_VHDR_RAW_LEN]; uint32_t offset = 0; - for (uint8_t i = 0; i < P25_DFSI_VHDR_RAW_LEN; i++, offset += 6) { + for (uint8_t i = 0; i < DFSI_VHDR_RAW_LEN; i++, offset += 6) { raw[i] = Utils::bin2Hex(vhdr, offset); } @@ -1635,7 +1652,7 @@ void SerialService::startOfStream(const LC& lc) MotVoiceHeader1 vhdr1 = MotVoiceHeader1(); vhdr1.startOfStream->setStartStop(StartStopFlag::START); vhdr1.startOfStream->setRT(m_rtrt ? RTFlag::ENABLED : RTFlag::DISABLED); - vhdr1.setICW(m_diu ? ICW_DIU : ICW_QUANTAR); + vhdr1.setICW(m_diu ? ICWFlag::DIU : ICWFlag::QUANTAR); ::memcpy(vhdr1.header, raw, 8U); ::memcpy(vhdr1.header + 9U, raw + 8U, 8U); ::memcpy(vhdr1.header + 18U, raw + 16U, 2U); diff --git a/src/dfsi/network/SerialService.h b/src/dfsi/network/SerialService.h index 86881fc5..65122b46 100644 --- a/src/dfsi/network/SerialService.h +++ b/src/dfsi/network/SerialService.h @@ -146,7 +146,7 @@ namespace network int writeSerial(); uint32_t readP25Frame(uint8_t* data); - void writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu); + void writeP25Frame(P25DEF::DUID::E duid, dfsi::LC& lc, uint8_t* ldu); // Helpers for TX stream data void startOfStream(const LC& lc); diff --git a/src/fne/network/RESTAPI.cpp b/src/fne/network/RESTAPI.cpp index 3e365dcb..6665f504 100644 --- a/src/fne/network/RESTAPI.cpp +++ b/src/fne/network/RESTAPI.cpp @@ -1494,6 +1494,7 @@ void RESTAPI::restAPI_GetAffList(const HTTPPayload& request, HTTPPayload& reply, /// void RESTAPI::restAPI_PutDMRRID(const HTTPPayload& request, HTTPPayload& reply, const RequestMatch& match) { + using namespace dmr::defines; if (!validateAuth(request, reply)) { return; } @@ -1549,16 +1550,16 @@ void RESTAPI::restAPI_PutDMRRID(const HTTPPayload& request, HTTPPayload& reply, errorPayload(reply, "OK", HTTPPayload::OK); std::string command = req["command"].get(); if (::strtolower(command) == RID_CMD_PAGE) { - m_network->m_tagDMR->write_Call_Alrt(peerId, slot, p25::P25_WUID_FNE, dstId); + m_network->m_tagDMR->write_Call_Alrt(peerId, slot, WUID_ALL, dstId); } else if (::strtolower(command) == RID_CMD_CHECK) { - m_network->m_tagDMR->write_Ext_Func(peerId, slot, dmr::DMR_EXT_FNCT_CHECK, p25::P25_WUID_FNE, dstId); + m_network->m_tagDMR->write_Ext_Func(peerId, slot, ExtendedFunctions::CHECK, WUID_ALL, dstId); } else if (::strtolower(command) == RID_CMD_INHIBIT) { - m_network->m_tagDMR->write_Ext_Func(peerId, slot, dmr::DMR_EXT_FNCT_INHIBIT, p25::P25_WUID_FNE, dstId); + m_network->m_tagDMR->write_Ext_Func(peerId, slot, ExtendedFunctions::INHIBIT, WUID_STUNI, dstId); } else if (::strtolower(command) == RID_CMD_UNINHIBIT) { - m_network->m_tagDMR->write_Ext_Func(peerId, slot, dmr::DMR_EXT_FNCT_UNINHIBIT, p25::P25_WUID_FNE, dstId); + m_network->m_tagDMR->write_Ext_Func(peerId, slot, ExtendedFunctions::UNINHIBIT, WUID_STUNI, dstId); } else { errorPayload(reply, "invalid command"); @@ -1578,6 +1579,7 @@ void RESTAPI::restAPI_PutDMRRID(const HTTPPayload& request, HTTPPayload& reply, /// void RESTAPI::restAPI_PutP25RID(const HTTPPayload& request, HTTPPayload& reply, const RequestMatch& match) { + using namespace p25::defines; if (!validateAuth(request, reply)) { return; } @@ -1622,16 +1624,16 @@ void RESTAPI::restAPI_PutP25RID(const HTTPPayload& request, HTTPPayload& reply, errorPayload(reply, "OK", HTTPPayload::OK); if (::strtolower(command) == RID_CMD_PAGE) { - m_network->m_tagP25->write_TSDU_Call_Alrt(peerId, p25::P25_WUID_FNE, dstId); + m_network->m_tagP25->write_TSDU_Call_Alrt(peerId, WUID_FNE, dstId); } else if (::strtolower(command) == RID_CMD_CHECK) { - m_network->m_tagP25->write_TSDU_Ext_Func(peerId, p25::P25_EXT_FNCT_CHECK, p25::P25_WUID_FNE, dstId); + m_network->m_tagP25->write_TSDU_Ext_Func(peerId, ExtendedFunctions::CHECK, WUID_FNE, dstId); } else if (::strtolower(command) == RID_CMD_INHIBIT) { - m_network->m_tagP25->write_TSDU_Ext_Func(peerId, p25::P25_EXT_FNCT_INHIBIT, p25::P25_WUID_FNE, dstId); + m_network->m_tagP25->write_TSDU_Ext_Func(peerId, ExtendedFunctions::INHIBIT, WUID_FNE, dstId); } else if (::strtolower(command) == RID_CMD_UNINHIBIT) { - m_network->m_tagP25->write_TSDU_Ext_Func(peerId, p25::P25_EXT_FNCT_UNINHIBIT, p25::P25_WUID_FNE, dstId); + m_network->m_tagP25->write_TSDU_Ext_Func(peerId, ExtendedFunctions::UNINHIBIT, WUID_FNE, dstId); } else if (::strtolower(command) == RID_CMD_GAQ) { m_network->m_tagP25->write_TSDU_Grp_Aff_Q(peerId, dstId); diff --git a/src/fne/network/callhandler/TagDMRData.cpp b/src/fne/network/callhandler/TagDMRData.cpp index cf719426..9151b500 100644 --- a/src/fne/network/callhandler/TagDMRData.cpp +++ b/src/fne/network/callhandler/TagDMRData.cpp @@ -27,6 +27,7 @@ using namespace system_clock; using namespace network; using namespace network::callhandler; using namespace dmr; +using namespace dmr::defines; #include #include @@ -78,11 +79,11 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId uint32_t srcId = __GET_UINT16(data, 5U); uint32_t dstId = __GET_UINT16(data, 8U); - uint8_t flco = (data[15U] & 0x40U) == 0x40U ? FLCO_PRIVATE : FLCO_GROUP; + FLCO::E flco = (data[15U] & 0x40U) == 0x40U ? FLCO::PRIVATE : FLCO::GROUP; uint32_t slotNo = (data[15U] & 0x80U) == 0x80U ? 2U : 1U; - uint8_t dataType = data[15U] & 0x0FU; + DataType::E dataType = (DataType::E)(data[15U] & 0x0FU); data::Data dmrData; dmrData.setSeqNo(seqNo); @@ -101,13 +102,13 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId } else if (voiceSync) { dmrData.setData(data + 20U); - dmrData.setDataType(DT_VOICE_SYNC); + dmrData.setDataType(DataType::VOICE_SYNC); dmrData.setN(0U); } else { uint8_t n = data[15U] & 0x0FU; dmrData.setData(data + 20U); - dmrData.setDataType(DT_VOICE); + dmrData.setDataType(DataType::VOICE); dmrData.setN(n); } @@ -123,7 +124,7 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId } // is this the end of the call stream? - if (dataSync && (dataType == DT_TERMINATOR_WITH_LC)) { + if (dataSync && (dataType == DataType::TERMINATOR_WITH_LC)) { if (srcId == 0U && dstId == 0U) { LogWarning(LOG_NET, "DMR, invalid TERMINATOR, peer = %u, srcId = %u, dstId = %u, streamId = %u, external = %u", peerId, srcId, dstId, streamId, external); return false; @@ -177,7 +178,7 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId } // is this a new call stream? - if (dataSync && (dataType == DT_VOICE_LC_HEADER)) { + if (dataSync && (dataType == DataType::VOICE_LC_HEADER)) { if (srcId == 0U && dstId == 0U) { LogWarning(LOG_NET, "DMR, invalid call, peer = %u, srcId = %u, dstId = %u, streamId = %u, external = %u", peerId, srcId, dstId, streamId, external); return false; @@ -481,7 +482,7 @@ void TagDMRData::write_Call_Alrt(uint32_t peerId, uint8_t slot, uint32_t srcId, /// /// /// -void TagDMRData::routeRewrite(uint8_t* buffer, uint32_t peerId, dmr::data::Data& dmrData, uint8_t dataType, uint32_t dstId, uint32_t slotNo, bool outbound) +void TagDMRData::routeRewrite(uint8_t* buffer, uint32_t peerId, dmr::data::Data& dmrData, DataType::E dataType, uint32_t dstId, uint32_t slotNo, bool outbound) { uint32_t rewriteDstId = dstId; uint32_t rewriteSlotNo = slotNo; @@ -500,8 +501,8 @@ void TagDMRData::routeRewrite(uint8_t* buffer, uint32_t peerId, dmr::data::Data& uint8_t data[DMR_FRAME_LENGTH_BYTES + 2U]; dmrData.getData(data + 2U); - if (dataType == DT_VOICE_LC_HEADER || - dataType == DT_TERMINATOR_WITH_LC) { + if (dataType == DataType::VOICE_LC_HEADER || + dataType == DataType::TERMINATOR_WITH_LC) { // decode and reconstruct embedded DMR data lc::FullLC fullLC; std::unique_ptr lc = fullLC.decode(data + 2U, dataType); @@ -516,7 +517,7 @@ void TagDMRData::routeRewrite(uint8_t* buffer, uint32_t peerId, dmr::data::Data& fullLC.encode(*lc, data + 2U, dataType); dmrData.setData(data + 2U); } - else if (dataType == DT_VOICE_PI_HEADER) { + else if (dataType == DataType::VOICE_PI_HEADER) { // decode and reconstruct embedded DMR data lc::FullLC fullLC; std::unique_ptr lc = fullLC.decodePI(data + 2U); @@ -584,11 +585,11 @@ bool TagDMRData::peerRewrite(uint32_t peerId, uint32_t& dstId, uint32_t& slotNo, bool TagDMRData::processCSBK(uint8_t* buffer, uint32_t peerId, dmr::data::Data& dmrData) { // are we receiving a CSBK? - if (dmrData.getDataType() == DT_CSBK) { + if (dmrData.getDataType() == DataType::CSBK) { uint8_t data[DMR_FRAME_LENGTH_BYTES + 2U]; dmrData.getData(data + 2U); - std::unique_ptr csbk = lc::csbk::CSBKFactory::createCSBK(data + 2U, DT_CSBK); + std::unique_ptr csbk = lc::csbk::CSBKFactory::createCSBK(data + 2U, DataType::CSBK); if (csbk != nullptr) { // report csbk event to InfluxDB if (m_network->m_enableInfluxDB && m_network->m_influxLogRawData) { @@ -612,12 +613,12 @@ bool TagDMRData::processCSBK(uint8_t* buffer, uint32_t peerId, dmr::data::Data& } switch (csbk->getCSBKO()) { - case CSBKO_BROADCAST: + case CSBKO::BROADCAST: { lc::csbk::CSBK_BROADCAST* osp = static_cast(csbk.get()); - if (osp->getAnncType() == BCAST_ANNC_ANN_WD_TSCC) { + if (osp->getAnncType() == BroadcastAnncType::ANN_WD_TSCC) { if (m_network->m_disallowAdjStsBcast) { - // LogWarning(LOG_NET, "PEER %u, passing BCAST_ANNC_ANN_WD_TSCC to internal peers is prohibited, dropping", peerId); + // LogWarning(LOG_NET, "PEER %u, passing BroadcastAnncType::ANN_WD_TSCC to internal peers is prohibited, dropping", peerId); return false; } else { if (m_network->m_verbose) { @@ -650,14 +651,14 @@ bool TagDMRData::processCSBK(uint8_t* buffer, uint32_t peerId, dmr::data::Data& /// bool TagDMRData::isPeerPermitted(uint32_t peerId, data::Data& data, uint32_t streamId, bool external) { - if (data.getDataType() == FLCO_PRIVATE) { + if (data.getFLCO() == FLCO::PRIVATE) { if (!m_network->checkU2UDroppedPeer(peerId)) return true; return false; } // is this a group call? - if (data.getDataType() == FLCO_GROUP) { + if (data.getFLCO() == FLCO::GROUP) { lookups::TalkgroupRuleGroupVoice tg = m_network->m_tidLookup->find(data.getDstId(), data.getSlotNo()); std::vector inclusion = tg.config().inclusion(); @@ -762,11 +763,11 @@ bool TagDMRData::validate(uint32_t peerId, data::Data& data, uint32_t streamId) } // always validate a terminator if the source is valid - if (data.getDataType() == DT_TERMINATOR_WITH_LC) + if (data.getDataType() == DataType::TERMINATOR_WITH_LC) return true; // is this a private call? - if (data.getDataType() == FLCO_PRIVATE) { + if (data.getFLCO() == FLCO::PRIVATE) { // is the destination ID a blacklisted ID? lookups::RadioId rid = m_network->m_ridLookup->find(data.getDstId()); if (!rid.radioDefault()) { @@ -791,7 +792,7 @@ bool TagDMRData::validate(uint32_t peerId, data::Data& data, uint32_t streamId) } // is this a group call? - if (data.getDataType() == FLCO_GROUP) { + if (data.getFLCO() == FLCO::GROUP) { lookups::TalkgroupRuleGroupVoice tg = m_network->m_tidLookup->find(data.getDstId()); if (tg.isInvalid()) { // report error event to InfluxDB @@ -870,7 +871,7 @@ bool TagDMRData::write_CSBK_Grant(uint32_t peerId, uint32_t srcId, uint32_t dstI bool broadcast = ((serviceOptions & 0xFFU) & 0x10U) == 0x10U; // Broadcast Flag uint8_t priority = ((serviceOptions & 0xFFU) & 0x03U); // Priority - if (dstId == DMR_WUID_ALL) { + if (dstId == WUID_ALL || dstId == WUID_ALLZ || dstId == WUID_ALLL) { return true; // do not generate grant packets for $FFFF (All Call) TGID } @@ -890,12 +891,12 @@ bool TagDMRData::write_CSBK_Grant(uint32_t peerId, uint32_t srcId, uint32_t dstI if (grp) { std::unique_ptr csbk = std::make_unique(); if (broadcast) - csbk->setCSBKO(CSBKO_BTV_GRANT); + csbk->setCSBKO(CSBKO::BTV_GRANT); csbk->setLogicalCh1(0U); csbk->setSlotNo(slot); if (m_network->m_verbose) { - LogMessage(LOG_NET, "DMR, DT_CSBK, %s, emerg = %u, privacy = %u, broadcast = %u, prio = %u, chNo = %u, slot = %u, srcId = %u, dstId = %u, peerId = %u", + LogMessage(LOG_NET, "DMR, CSBK, %s, emerg = %u, privacy = %u, broadcast = %u, prio = %u, chNo = %u, slot = %u, srcId = %u, dstId = %u, peerId = %u", csbk->toString().c_str(), emergency, privacy, broadcast, priority, csbk->getLogicalCh1(), csbk->getSlotNo(), srcId, dstId, peerId); } @@ -911,7 +912,7 @@ bool TagDMRData::write_CSBK_Grant(uint32_t peerId, uint32_t srcId, uint32_t dstI csbk->setSlotNo(slot); if (m_network->m_verbose) { - LogMessage(LOG_NET, "DMR, DT_CSBK, %s, emerg = %u, privacy = %u, broadcast = %u, prio = %u, chNo = %u, slot = %u, srcId = %u, dstId = %u, peerId = %u", + LogMessage(LOG_NET, "DMR, CSBK, %s, emerg = %u, privacy = %u, broadcast = %u, prio = %u, chNo = %u, slot = %u, srcId = %u, dstId = %u, peerId = %u", csbk->toString().c_str(), emergency, privacy, broadcast, priority, csbk->getLogicalCh1(), csbk->getSlotNo(), srcId, dstId, peerId); } @@ -937,7 +938,7 @@ void TagDMRData::write_CSBK_NACK_RSP(uint32_t peerId, uint32_t dstId, uint8_t re std::unique_ptr csbk = std::make_unique(); csbk->setServiceKind(service); csbk->setReason(reason); - csbk->setSrcId(DMR_WUID_ALL); // hmmm... + csbk->setSrcId(WUID_ALL); // hmmm... csbk->setDstId(dstId); write_CSBK(peerId, 1U, csbk.get()); @@ -956,7 +957,7 @@ void TagDMRData::write_CSBK(uint32_t peerId, uint8_t slot, lc::CSBK* csbk) SlotType slotType; slotType.setColorCode(0U); - slotType.setDataType(DT_CSBK); + slotType.setDataType(DataType::CSBK); // Regenerate the CSBK data csbk->encode(data + 2U); @@ -969,10 +970,10 @@ void TagDMRData::write_CSBK(uint32_t peerId, uint8_t slot, lc::CSBK* csbk) data::Data dmrData; dmrData.setSlotNo(slot); - dmrData.setDataType(DT_CSBK); + dmrData.setDataType(DataType::CSBK); dmrData.setSrcId(csbk->getSrcId()); dmrData.setDstId(csbk->getDstId()); - dmrData.setFLCO(csbk->getGI() ? FLCO_GROUP : FLCO_PRIVATE); + dmrData.setFLCO(csbk->getGI() ? FLCO::GROUP : FLCO::PRIVATE); dmrData.setN(0U); dmrData.setSeqNo(0U); dmrData.setBER(0U); diff --git a/src/fne/network/callhandler/TagDMRData.h b/src/fne/network/callhandler/TagDMRData.h index f3c6abc4..790ed273 100644 --- a/src/fne/network/callhandler/TagDMRData.h +++ b/src/fne/network/callhandler/TagDMRData.h @@ -88,7 +88,7 @@ namespace network bool m_debug; /// Helper to route rewrite the network data buffer. - void routeRewrite(uint8_t* buffer, uint32_t peerId, dmr::data::Data& dmrData, uint8_t dataType, uint32_t dstId, uint32_t slotNo, bool outbound = true); + void routeRewrite(uint8_t* buffer, uint32_t peerId, dmr::data::Data& dmrData, DMRDEF::DataType::E dataType, uint32_t dstId, uint32_t slotNo, bool outbound = true); /// Helper to route rewrite destination ID and slot. bool peerRewrite(uint32_t peerId, uint32_t& dstId, uint32_t& slotNo, bool outbound = true); diff --git a/src/fne/network/callhandler/TagNXDNData.cpp b/src/fne/network/callhandler/TagNXDNData.cpp index dd8f8d6b..a4fb8541 100644 --- a/src/fne/network/callhandler/TagNXDNData.cpp +++ b/src/fne/network/callhandler/TagNXDNData.cpp @@ -29,6 +29,7 @@ using namespace system_clock; using namespace network; using namespace network::callhandler; using namespace nxdn; +using namespace nxdn::defines; #include #include @@ -101,11 +102,11 @@ bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerI } // specifically only check the following logic for end of call, voice or data frames - if ((messageType == RTCH_MESSAGE_TYPE_TX_REL || messageType == RTCH_MESSAGE_TYPE_TX_REL_EX) || - (messageType == RTCH_MESSAGE_TYPE_VCALL || messageType == RTCH_MESSAGE_TYPE_DCALL_HDR || - messageType == RTCH_MESSAGE_TYPE_DCALL_DATA)) { + if ((messageType == MessageType::RTCH_TX_REL || messageType == MessageType::RTCH_TX_REL_EX) || + (messageType == MessageType::RTCH_VCALL || messageType == MessageType::RTCH_DCALL_HDR || + messageType == MessageType::RTCH_DCALL_DATA)) { // is this the end of the call stream? - if (messageType == RTCH_MESSAGE_TYPE_TX_REL || messageType == RTCH_MESSAGE_TYPE_TX_REL_EX) { + if (messageType == MessageType::RTCH_TX_REL || messageType == MessageType::RTCH_TX_REL_EX) { if (srcId == 0U && dstId == 0U) { LogWarning(LOG_NET, "NXDN, invalid TX_REL, peer = %u, srcId = %u, dstId = %u, streamId = %u, external = %u", peerId, srcId, dstId, streamId, external); return false; @@ -149,7 +150,7 @@ bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerI } // is this a new call stream? - if ((messageType != RTCH_MESSAGE_TYPE_TX_REL && messageType != RTCH_MESSAGE_TYPE_TX_REL_EX)) { + if ((messageType != MessageType::RTCH_TX_REL && messageType != MessageType::RTCH_TX_REL_EX)) { if (srcId == 0U && dstId == 0U) { LogWarning(LOG_NET, "NXDN, invalid call, peer = %u, srcId = %u, dstId = %u, streamId = %u, external = %u", peerId, srcId, dstId, streamId, external); return false; @@ -571,7 +572,7 @@ bool TagNXDNData::validate(uint32_t peerId, lc::RTCH& lc, uint8_t messageType, u } // always validate a terminator if the source is valid - if (messageType == RTCH_MESSAGE_TYPE_TX_REL || messageType == RTCH_MESSAGE_TYPE_TX_REL_EX) + if (messageType == MessageType::RTCH_TX_REL || messageType == MessageType::RTCH_TX_REL_EX) return true; // is this a private call? @@ -670,7 +671,7 @@ bool TagNXDNData::write_Message_Grant(uint32_t peerId, uint32_t srcId, uint32_t } } - rcch->setMessageType(RTCH_MESSAGE_TYPE_VCALL); + rcch->setMessageType(MessageType::RTCH_VCALL); rcch->setGrpVchNo(0U); rcch->setGroup(grp); rcch->setSrcId(srcId); @@ -702,9 +703,9 @@ void TagNXDNData::write_Message_Deny(uint32_t peerId, uint32_t srcId, uint32_t d std::unique_ptr rcch = nullptr; switch (service) { - case RTCH_MESSAGE_TYPE_VCALL: + case MessageType::RTCH_VCALL: rcch = std::make_unique(); - rcch->setMessageType(RTCH_MESSAGE_TYPE_VCALL); + rcch->setMessageType(MessageType::RTCH_VCALL); default: return; } @@ -735,9 +736,9 @@ void TagNXDNData::write_Message(uint32_t peerId, lc::RCCH* rcch) // generate the LICH channel::LICH lich; - lich.setRFCT(NXDN_LICH_RFCT_RCCH); - lich.setFCT(NXDN_LICH_CAC_OUTBOUND); - lich.setOption(NXDN_LICH_DATA_COMMON); + lich.setRFCT(RFChannelType::RCCH); + lich.setFCT(FuncChannelType::CAC_OUTBOUND); + lich.setOption(ChOption::DATA_COMMON); lich.setOutbound(true); lich.encode(data + 2U); @@ -749,7 +750,7 @@ void TagNXDNData::write_Message(uint32_t peerId, lc::RCCH* rcch) // generate the CAC channel::CAC cac; cac.setRAN(0U); - cac.setStructure(NXDN_SR_RCCH_SINGLE); + cac.setStructure(ChStructure::SR_RCCH_SINGLE); cac.setData(buffer); cac.encode(data + 2U); diff --git a/src/fne/network/callhandler/TagP25Data.cpp b/src/fne/network/callhandler/TagP25Data.cpp index de2368b2..cfaa01e7 100644 --- a/src/fne/network/callhandler/TagP25Data.cpp +++ b/src/fne/network/callhandler/TagP25Data.cpp @@ -25,6 +25,7 @@ using namespace system_clock; using namespace network; using namespace network::callhandler; using namespace p25; +using namespace p25::defines; #include #include @@ -88,8 +89,8 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId uint8_t lsd1 = data[20U]; uint8_t lsd2 = data[21U]; - uint8_t duid = data[22U]; - uint8_t frameType = P25_FT_DATA_UNIT; + DUID::E duid = (DUID::E)data[22U]; + FrameType::E frameType = FrameType::DATA_UNIT; // perform TGID route rewrites if configured routeRewrite(buffer, peerId, duid, dstId, false); @@ -99,28 +100,28 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId data::LowSpeedData lsd; // is this a LDU1, is this the first of a call? - if (duid == P25_DUID_LDU1) { - frameType = data[180U]; + if (duid == DUID::LDU1) { + frameType = (FrameType::E)data[180U]; if (m_debug) { LogDebug(LOG_NET, "P25, frameType = $%02X", frameType); } - if (frameType == P25_FT_HDU_VALID) { + if (frameType == FrameType::HDU_VALID) { uint8_t algId = data[181U]; uint32_t kid = (data[182U] << 8) | (data[183U] << 0); // copy MI data - uint8_t mi[P25_MI_LENGTH_BYTES]; - ::memset(mi, 0x00U, P25_MI_LENGTH_BYTES); + uint8_t mi[MI_LENGTH_BYTES]; + ::memset(mi, 0x00U, MI_LENGTH_BYTES); - for (uint8_t i = 0; i < P25_MI_LENGTH_BYTES; i++) { + for (uint8_t i = 0; i < MI_LENGTH_BYTES; i++) { mi[i] = data[184U + i]; } if (m_debug) { LogDebug(LOG_NET, "P25, HDU algId = $%02X, kId = $%02X", algId, kid); - Utils::dump(1U, "P25 HDU Network MI", mi, P25_MI_LENGTH_BYTES); + Utils::dump(1U, "P25 HDU Network MI", mi, MI_LENGTH_BYTES); } control.setAlgId(algId); @@ -141,7 +142,7 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId // process a TSBK out into a class literal if possible std::unique_ptr tsbk; - if (duid == P25_DUID_TSDU) { + if (duid == DUID::TSDU) { UInt8Array data = std::unique_ptr(new uint8_t[frameLength]); ::memset(data.get(), 0x00U, frameLength); ::memcpy(data.get(), buffer + 24U, frameLength); @@ -157,9 +158,9 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId } // specifically only check the following logic for end of call or voice frames - if (duid != P25_DUID_TSDU && duid != P25_DUID_PDU) { + if (duid != DUID::TSDU && duid != DUID::PDU) { // is this the end of the call stream? - if ((duid == P25_DUID_TDU) || (duid == P25_DUID_TDULC)) { + if ((duid == DUID::TDU) || (duid == DUID::TDULC)) { if (srcId == 0U && dstId == 0U) { LogWarning(LOG_NET, "P25, invalid TDU, peer = %u, srcId = %u, dstId = %u, streamId = %u, external = %u", peerId, srcId, dstId, streamId, external); return false; @@ -213,7 +214,7 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId } // is this a new call stream? - if ((duid != P25_DUID_TDU) && (duid != P25_DUID_TDULC)) { + if ((duid != DUID::TDU) && (duid != DUID::TDULC)) { if (srcId == 0U && dstId == 0U) { LogWarning(LOG_NET, "P25, invalid call, peer = %u, srcId = %u, dstId = %u, streamId = %u, external = %u", peerId, srcId, dstId, streamId, external); return false; @@ -222,7 +223,7 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId auto it = std::find_if(m_status.begin(), m_status.end(), [&](StatusMapPair x) { return x.second.dstId == dstId; }); if (it != m_status.end()) { RxStatus status = m_status[dstId]; - if (streamId != status.streamId && ((duid != P25_DUID_TDU) && (duid != P25_DUID_TDULC))) { + if (streamId != status.streamId && ((duid != DUID::TDU) && (duid != DUID::TDULC))) { if (status.srcId != 0U && status.srcId != srcId) { LogWarning(LOG_NET, "P25, Call Collision, peer = %u, srcId = %u, dstId = %u, streamId = %u, rxPeer = %u, rxSrcId = %u, rxDstId = %u, rxStreamId = %u, external = %u", peerId, srcId, dstId, streamId, status.peerId, status.srcId, status.dstId, status.streamId, external); @@ -565,7 +566,7 @@ void TagP25Data::write_TSDU_Ext_Func(uint32_t peerId, uint32_t func, uint32_t ar void TagP25Data::write_TSDU_Grp_Aff_Q(uint32_t peerId, uint32_t dstId) { std::unique_ptr osp = std::make_unique(); - osp->setSrcId(P25_WUID_FNE); + osp->setSrcId(WUID_FNE); osp->setDstId(dstId); LogMessage(LOG_NET, P25_TSDU_STR ", %s, dstId = %u", osp->toString().c_str(), dstId); @@ -581,7 +582,7 @@ void TagP25Data::write_TSDU_Grp_Aff_Q(uint32_t peerId, uint32_t dstId) void TagP25Data::write_TSDU_U_Reg_Cmd(uint32_t peerId, uint32_t dstId) { std::unique_ptr osp = std::make_unique(); - osp->setSrcId(P25_WUID_FNE); + osp->setSrcId(WUID_FNE); osp->setDstId(dstId); LogMessage(LOG_NET, P25_TSDU_STR ", %s, dstId = %u", osp->toString().c_str(), dstId); @@ -614,7 +615,7 @@ void TagP25Data::routeRewrite(uint8_t* buffer, uint32_t peerId, uint8_t duid, ui __SET_UINT16(rewriteDstId, buffer, 8U); // are we receiving a TSDU? - if (duid == P25_DUID_TSDU) { + if (duid == DUID::TSDU) { UInt8Array data = std::unique_ptr(new uint8_t[frameLength]); ::memset(data.get(), 0x00U, frameLength); ::memcpy(data.get(), buffer + 24U, frameLength); @@ -623,7 +624,7 @@ void TagP25Data::routeRewrite(uint8_t* buffer, uint32_t peerId, uint8_t duid, ui if (tsbk != nullptr) { // handle standard P25 reference opcodes switch (tsbk->getLCO()) { - case TSBK_IOSP_GRP_VCH: + case TSBKO::IOSP_GRP_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, rewriteDstId); @@ -652,7 +653,7 @@ void TagP25Data::routeRewrite(uint8_t* buffer, uint32_t peerId, uint8_t duid, ui Utils::dump(1U, "!!! *TSDU (SBF) TSBK Block Data", data + P25_PREAMBLE_LENGTH_BYTES + 2U, P25_TSBK_FEC_LENGTH_BYTES); } - ::memcpy(buffer + 24U, data + 2U, p25::P25_TSDU_FRAME_LENGTH_BYTES); + ::memcpy(buffer + 24U, data + 2U, P25_TSDU_FRAME_LENGTH_BYTES); } } } @@ -701,7 +702,7 @@ bool TagP25Data::peerRewrite(uint32_t peerId, uint32_t& dstId, bool outbound) bool TagP25Data::processTSDUFrom(uint8_t* buffer, uint32_t peerId, uint8_t duid) { // are we receiving a TSDU? - if (duid == P25_DUID_TSDU) { + if (duid == DUID::TSDU) { uint32_t frameLength = buffer[23U]; UInt8Array data = std::unique_ptr(new uint8_t[frameLength]); @@ -733,14 +734,14 @@ bool TagP25Data::processTSDUFrom(uint8_t* buffer, uint32_t peerId, uint8_t duid) // handle standard P25 reference opcodes switch (tsbk->getLCO()) { - case TSBK_IOSP_UU_VCH: - case TSBK_IOSP_UU_ANS: + case TSBKO::IOSP_UU_VCH: + case TSBKO::IOSP_UU_ANS: { if (m_network->checkU2UDroppedPeer(peerId)) return false; } break; - case TSBK_OSP_ADJ_STS_BCAST: + case TSBKO::OSP_ADJ_STS_BCAST: { if (m_network->m_disallowAdjStsBcast) { // LogWarning(LOG_NET, "PEER %u, passing ADJ_STS_BCAST to internal peers is prohibited, dropping", peerId); @@ -776,7 +777,7 @@ bool TagP25Data::processTSDUFrom(uint8_t* buffer, uint32_t peerId, uint8_t duid) bool TagP25Data::processTSDUTo(uint8_t* buffer, uint32_t peerId, uint8_t duid) { // are we receiving a TSDU? - if (duid == P25_DUID_TSDU) { + if (duid == DUID::TSDU) { uint32_t frameLength = buffer[23U]; UInt8Array data = std::unique_ptr(new uint8_t[frameLength]); @@ -795,7 +796,7 @@ bool TagP25Data::processTSDUTo(uint8_t* buffer, uint32_t peerId, uint8_t duid) // handle standard P25 reference opcodes switch (tsbk->getLCO()) { - case TSBK_IOSP_GRP_VCH: + case TSBKO::IOSP_GRP_VCH: { if (m_network->m_restrictGrantToAffOnly) { lookups::TalkgroupRuleGroupVoice tg = m_network->m_tidLookup->find(dstId); @@ -848,7 +849,7 @@ bool TagP25Data::processTSDUTo(uint8_t* buffer, uint32_t peerId, uint8_t duid) bool TagP25Data::processTSDUToExternal(uint8_t* buffer, uint32_t srcPeerId, uint32_t dstPeerId, uint8_t duid) { // are we receiving a TSDU? - if (duid == P25_DUID_TSDU) { + if (duid == DUID::TSDU) { uint32_t frameLength = buffer[23U]; UInt8Array data = std::unique_ptr(new uint8_t[frameLength]); @@ -859,7 +860,7 @@ bool TagP25Data::processTSDUToExternal(uint8_t* buffer, uint32_t srcPeerId, uint if (tsbk != nullptr) { // handle standard P25 reference opcodes switch (tsbk->getLCO()) { - case TSBK_OSP_ADJ_STS_BCAST: + case TSBKO::OSP_ADJ_STS_BCAST: { if (m_network->m_disallowExtAdjStsBcast) { // LogWarning(LOG_NET, "PEER %u, passing ADJ_STS_BCAST to external peers is prohibited, dropping", dstPeerId); @@ -895,19 +896,19 @@ bool TagP25Data::processTSDUToExternal(uint8_t* buffer, uint32_t srcPeerId, uint /// Stream ID /// /// -bool TagP25Data::isPeerPermitted(uint32_t peerId, lc::LC& control, uint8_t duid, uint32_t streamId, bool external) +bool TagP25Data::isPeerPermitted(uint32_t peerId, lc::LC& control, DUID::E duid, uint32_t streamId, bool external) { - if (control.getLCO() == LC_PRIVATE) { + if (control.getLCO() == LCO::PRIVATE) { if (!m_network->checkU2UDroppedPeer(peerId)) return true; return false; } // always permit a TSDU or PDU - if (duid == P25_DUID_TSDU || duid == P25_DUID_PDU) + if (duid == DUID::TSDU || duid == DUID::PDU) return true; - if (duid == P25_DUID_HDU) { + if (duid == DUID::HDU) { if (m_network->m_filterHeaders) { if (control.getSrcId() != 0U && control.getDstId() != 0U) { // is this a group call? @@ -935,12 +936,12 @@ bool TagP25Data::isPeerPermitted(uint32_t peerId, lc::LC& control, uint8_t duid, return true; } - if (duid == P25_DUID_TDULC) { + if (duid == DUID::TDULC) { // always permit a terminator return true; } - if (duid == P25_DUID_TDU) { + if (duid == DUID::TDU) { if (m_network->m_filterTerminators) { if (control.getSrcId() != 0U && control.getDstId() != 0U) { // is this a group call? @@ -1049,7 +1050,7 @@ bool TagP25Data::isPeerPermitted(uint32_t peerId, lc::LC& control, uint8_t duid, /// /// Stream ID /// -bool TagP25Data::validate(uint32_t peerId, lc::LC& control, uint8_t duid, const p25::lc::TSBK* tsbk, uint32_t streamId) +bool TagP25Data::validate(uint32_t peerId, lc::LC& control, DUID::E duid, const p25::lc::TSBK* tsbk, uint32_t streamId) { // is the source ID a blacklisted ID? lookups::RadioId rid = m_network->m_ridLookup->find(control.getSrcId()); @@ -1073,15 +1074,15 @@ bool TagP25Data::validate(uint32_t peerId, lc::LC& control, uint8_t duid, const } // always validate a PDU if the source is valid - if (duid == P25_DUID_PDU) + if (duid == DUID::PDU) return true; // always validate a terminator if the source is valid - if (duid == P25_DUID_TDU || duid == P25_DUID_TDULC) + if (duid == DUID::TDU || duid == DUID::TDULC) return true; // is this a private call? - if (control.getLCO() == LC_PRIVATE) { + if (control.getLCO() == LCO::PRIVATE) { // is the destination ID a blacklisted ID? lookups::RadioId rid = m_network->m_ridLookup->find(control.getDstId()); if (!rid.radioDefault()) { @@ -1107,11 +1108,11 @@ bool TagP25Data::validate(uint32_t peerId, lc::LC& control, uint8_t duid, const } // always validate a TSDU or PDU if the source is valid - if (duid == P25_DUID_TSDU) { + if (duid == DUID::TSDU) { if (tsbk != nullptr) { // handle standard P25 reference opcodes switch (tsbk->getLCO()) { - case TSBK_IOSP_GRP_VCH: + case TSBKO::IOSP_GRP_VCH: { lookups::TalkgroupRuleGroupVoice tg = m_network->m_tidLookup->find(tsbk->getDstId()); @@ -1185,7 +1186,7 @@ bool TagP25Data::write_TSDU_Grant(uint32_t peerId, uint32_t srcId, uint32_t dstI bool encryption = ((serviceOptions & 0xFFU) & 0x40U) == 0x40U; // Encryption Flag uint8_t priority = ((serviceOptions & 0xFFU) & 0x07U); // Priority - if (dstId == P25_TGID_ALL) { + if (dstId == TGID_ALL) { return true; // do not generate grant packets for $FFFF (All Call) TGID } diff --git a/src/fne/network/callhandler/TagP25Data.h b/src/fne/network/callhandler/TagP25Data.h index b5cdba9e..278d82e8 100644 --- a/src/fne/network/callhandler/TagP25Data.h +++ b/src/fne/network/callhandler/TagP25Data.h @@ -109,9 +109,9 @@ namespace network bool processTSDUToExternal(uint8_t* buffer, uint32_t srcPeerId, uint32_t dstPeerId, uint8_t duid); /// Helper to determine if the peer is permitted for traffic. - bool isPeerPermitted(uint32_t peerId, p25::lc::LC& control, uint8_t duid, uint32_t streamId, bool external = false); + bool isPeerPermitted(uint32_t peerId, p25::lc::LC& control, P25DEF::DUID::E duid, uint32_t streamId, bool external = false); /// Helper to validate the P25 call stream. - bool validate(uint32_t peerId, p25::lc::LC& control, uint8_t duid, const p25::lc::TSBK* tsbk, uint32_t streamId); + bool validate(uint32_t peerId, p25::lc::LC& control, P25DEF::DUID::E duid, const p25::lc::TSBK* tsbk, uint32_t streamId); /// Helper to write a grant packet. bool write_TSDU_Grant(uint32_t peerId, uint32_t srcId, uint32_t dstId, uint8_t serviceOptions, bool grp); diff --git a/src/host/Host.Config.cpp b/src/host/Host.Config.cpp index 544eb490..e4742f62 100644 --- a/src/host/Host.Config.cpp +++ b/src/host/Host.Config.cpp @@ -271,7 +271,7 @@ bool Host::readParams() m_dmrColorCode = dmr::DMRUtils::colorCode(m_dmrColorCode); m_dmrNetId = (uint32_t)::strtoul(rfssConfig["dmrNetId"].as("1").c_str(), NULL, 16); - m_dmrNetId = dmr::DMRUtils::netId(m_dmrNetId, dmr::SITE_MODEL_SMALL); + m_dmrNetId = dmr::DMRUtils::netId(m_dmrNetId, dmr::defines::SiteModel::SMALL); m_p25NAC = (uint32_t)::strtoul(rfssConfig["nac"].as("F7E").c_str(), NULL, 16); m_p25NAC = p25::P25Utils::nac(m_p25NAC); @@ -318,7 +318,7 @@ bool Host::readParams() LogInfo(" DMR Network Id: $%05X", m_dmrNetId); LogInfo(" P25 NAC: $%03X", m_p25NAC); - if (p25TxNAC != p25::P25_NAC_DIGITAL_SQ && p25TxNAC != m_p25NAC) { + if (p25TxNAC != p25::defines::NAC_DIGITAL_SQ && p25TxNAC != m_p25NAC) { LogInfo(" P25 Tx NAC: $%03X", p25TxNAC); } @@ -361,7 +361,7 @@ bool Host::createModem() LogWarning(LOG_HOST, "DMR queue size is excessive, >60 frames!"); } - m_dmrQueueSizeBytes = dmrQueueSize * (dmr::DMR_FRAME_LENGTH_BYTES * 5U); + m_dmrQueueSizeBytes = dmrQueueSize * (dmr::defines::DMR_FRAME_LENGTH_BYTES * 5U); yaml::Node p25Protocol = protocolConf["p25"]; uint32_t p25QueueSize = p25Protocol["queueSize"].as(12U); @@ -379,7 +379,7 @@ bool Host::createModem() LogWarning(LOG_HOST, "P25 queue size is excessive, >30 frames!"); } - m_p25QueueSizeBytes = p25QueueSize * p25::P25_LDU_FRAME_LENGTH_BYTES; + m_p25QueueSizeBytes = p25QueueSize * p25::defines::P25_LDU_FRAME_LENGTH_BYTES; yaml::Node nxdnProtocol = protocolConf["nxdn"]; uint32_t nxdnQueueSize = nxdnProtocol["queueSize"].as(31U); @@ -394,7 +394,7 @@ bool Host::createModem() nxdnQueueSize = 50U; } - m_nxdnQueueSizeBytes = nxdnQueueSize * nxdn::NXDN_FRAME_LENGTH_BYTES; + m_nxdnQueueSizeBytes = nxdnQueueSize * nxdn::defines::NXDN_FRAME_LENGTH_BYTES; yaml::Node modemConf = m_conf["system"]["modem"]; @@ -630,8 +630,8 @@ bool Host::createModem() p25PostBWAdj, nxdnPostBWAdj, adfGainMode, afcEnable, afcKI, afcKP, afcRange); m_modem->setSoftPot(rxCoarse, rxFine, txCoarse, txFine, rssiCoarse, rssiFine); m_modem->setDMRColorCode(m_dmrColorCode); - if (m_p25NAC == p25::P25_NAC_REUSE_RX_NAC) - m_modem->setP25NAC(p25::P25_NAC_DIGITAL_SQ); + if (m_p25NAC == p25::defines::NAC_REUSE_RX_NAC) + m_modem->setP25NAC(p25::defines::NAC_DIGITAL_SQ); else m_modem->setP25NAC(m_p25NAC); } diff --git a/src/host/Host.DMR.cpp b/src/host/Host.DMR.cpp index 0db552e9..e3a0f6be 100644 --- a/src/host/Host.DMR.cpp +++ b/src/host/Host.DMR.cpp @@ -7,7 +7,7 @@ * @package DVM / Modem Host Software * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2017-2023 Bryan Biedenkapp, N2PLL +* Copyright (C) 2017-2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -58,7 +58,7 @@ void Host::interruptDMRBeacon(dmr::Control* control) /// void Host::readFramesDMR1(dmr::Control* control, std::function&& afterReadCallback) { - uint8_t data[dmr::DMR_FRAME_LENGTH_BYTES * 2U]; + uint8_t data[DMRDEF::DMR_FRAME_LENGTH_BYTES * 2U]; if (control != nullptr) { // read DMR slot 1 frames from the modem, and if there is any @@ -131,7 +131,7 @@ void Host::readFramesDMR1(dmr::Control* control, std::function&& afterRe /// void Host::writeFramesDMR1(dmr::Control* control, std::function&& afterWriteCallback) { - uint8_t data[dmr::DMR_FRAME_LENGTH_BYTES * 2U]; + uint8_t data[DMRDEF::DMR_FRAME_LENGTH_BYTES * 2U]; if (control != nullptr) { // check if there is space on the modem for DMR slot 1 frames, @@ -191,7 +191,7 @@ void Host::writeFramesDMR1(dmr::Control* control, std::function&& afterW /// void Host::readFramesDMR2(dmr::Control* control, std::function&& afterReadCallback) { - uint8_t data[dmr::DMR_FRAME_LENGTH_BYTES * 2U]; + uint8_t data[DMRDEF::DMR_FRAME_LENGTH_BYTES * 2U]; if (control != nullptr) { // read DMR slot 2 frames from the modem, and if there is any @@ -263,7 +263,7 @@ void Host::readFramesDMR2(dmr::Control* control, std::function&& afterRe /// void Host::writeFramesDMR2(dmr::Control* control, std::function&& afterWriteCallback) { - uint8_t data[dmr::DMR_FRAME_LENGTH_BYTES * 2U]; + uint8_t data[DMRDEF::DMR_FRAME_LENGTH_BYTES * 2U]; if (control != nullptr) { // check if there is space on the modem for DMR slot 2 frames, diff --git a/src/host/Host.NXDN.cpp b/src/host/Host.NXDN.cpp index b99c5bb9..157dcd3a 100644 --- a/src/host/Host.NXDN.cpp +++ b/src/host/Host.NXDN.cpp @@ -7,7 +7,7 @@ * @package DVM / Modem Host Software * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2017-2023 Bryan Biedenkapp, N2PLL +* Copyright (C) 2017-2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -42,7 +42,7 @@ void Host::interruptNXDNControl(nxdn::Control* control) /// void Host::readFramesNXDN(nxdn::Control* control, std::function&& afterReadCallback) { - uint8_t data[nxdn::NXDN_FRAME_LENGTH_BYTES * 2U]; + uint8_t data[NXDDEF::NXDN_FRAME_LENGTH_BYTES * 2U]; if (control != nullptr) { uint32_t len = m_modem->readNXDNFrame(data); @@ -80,7 +80,7 @@ void Host::readFramesNXDN(nxdn::Control* control, std::function&& afterR /// void Host::writeFramesNXDN(nxdn::Control* control, std::function&& afterWriteCallback) { - uint8_t data[nxdn::NXDN_FRAME_LENGTH_BYTES * 2U]; + uint8_t data[NXDDEF::NXDN_FRAME_LENGTH_BYTES * 2U]; // check if there is space on the modem for NXDN frames, // if there is read frames from the NXDN controller and write it diff --git a/src/host/Host.P25.cpp b/src/host/Host.P25.cpp index 35ed82e5..1fcf9118 100644 --- a/src/host/Host.P25.cpp +++ b/src/host/Host.P25.cpp @@ -7,7 +7,7 @@ * @package DVM / Modem Host Software * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2017-2023 Bryan Biedenkapp, N2PLL +* Copyright (C) 2017-2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -43,7 +43,7 @@ void Host::interruptP25Control(p25::Control* control) /// void Host::readFramesP25(p25::Control* control, std::function&& afterReadCallback) { - uint8_t data[p25::P25_PDU_FRAME_LENGTH_BYTES * 2U]; + uint8_t data[P25DEF::P25_PDU_FRAME_LENGTH_BYTES * 2U]; // read P25 frames from modem, and if there are frames // write those frames to the P25 controller @@ -124,7 +124,7 @@ void Host::readFramesP25(p25::Control* control, std::function&& afterRea /// void Host::writeFramesP25(p25::Control* control, std::function&& afterWriteCallback) { - uint8_t data[p25::P25_PDU_FRAME_LENGTH_BYTES * 2U]; + uint8_t data[P25DEF::P25_PDU_FRAME_LENGTH_BYTES * 2U]; // check if there is space on the modem for P25 frames, // if there is read frames from the P25 controller and write it diff --git a/src/host/dmr/Control.cpp b/src/host/dmr/Control.cpp index 7ec12074..9d531c91 100644 --- a/src/host/dmr/Control.cpp +++ b/src/host/dmr/Control.cpp @@ -9,7 +9,7 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2015,2016,2017 Jonathan Naylor, G4KLX -* Copyright (C) 2017-2023 Bryan Biedenkapp, N2PLL +* Copyright (C) 2017-2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -20,6 +20,7 @@ #include "dmr/Control.h" using namespace dmr; +using namespace dmr::defines; #include #include @@ -125,7 +126,7 @@ void Control::setOptions(yaml::Node& conf, bool supervisor, ::lookups::VoiceChDa Slot::m_verifyReg = dmrProtocol["verifyReg"].as(false); - uint8_t nRandWait = (uint8_t)dmrProtocol["nRandWait"].as(dmr::DEFAULT_NRAND_WAIT); + uint8_t nRandWait = (uint8_t)dmrProtocol["nRandWait"].as(DEFAULT_NRAND_WAIT); if (nRandWait > 15U) nRandWait = 15U; uint8_t backOff = (uint8_t)dmrProtocol["backOff"].as(1U); @@ -181,28 +182,28 @@ void Control::setOptions(yaml::Node& conf, bool supervisor, ::lookups::VoiceChDa /* ** Voice Silence and Frame Loss Thresholds */ - uint32_t silenceThreshold = dmrProtocol["silenceThreshold"].as(dmr::DEFAULT_SILENCE_THRESHOLD); + uint32_t silenceThreshold = dmrProtocol["silenceThreshold"].as(DEFAULT_SILENCE_THRESHOLD); if (silenceThreshold > MAX_DMR_VOICE_ERRORS) { - LogWarning(LOG_DMR, "Silence threshold > %u, defaulting to %u", dmr::MAX_DMR_VOICE_ERRORS, dmr::DEFAULT_SILENCE_THRESHOLD); - silenceThreshold = dmr::DEFAULT_SILENCE_THRESHOLD; + LogWarning(LOG_DMR, "Silence threshold > %u, defaulting to %u", MAX_DMR_VOICE_ERRORS, DEFAULT_SILENCE_THRESHOLD); + silenceThreshold = DEFAULT_SILENCE_THRESHOLD; } // either MAX_DMR_VOICE_ERRORS or 0 will disable the threshold logic if (silenceThreshold == 0U) { - LogWarning(LOG_DMR, "Silence threshold set to zero, defaulting to %u", dmr::MAX_DMR_VOICE_ERRORS); - silenceThreshold = dmr::MAX_DMR_VOICE_ERRORS; + LogWarning(LOG_DMR, "Silence threshold set to zero, defaulting to %u", MAX_DMR_VOICE_ERRORS); + silenceThreshold = MAX_DMR_VOICE_ERRORS; } m_slot1->setSilenceThreshold(silenceThreshold); m_slot2->setSilenceThreshold(silenceThreshold); - uint8_t frameLossThreshold = (uint8_t)dmrProtocol["frameLossThreshold"].as(dmr::DEFAULT_FRAME_LOSS_THRESHOLD); + uint8_t frameLossThreshold = (uint8_t)dmrProtocol["frameLossThreshold"].as(DEFAULT_FRAME_LOSS_THRESHOLD); if (frameLossThreshold == 0U) { frameLossThreshold = 1U; } - if (frameLossThreshold > dmr::DEFAULT_FRAME_LOSS_THRESHOLD * 2U) { - LogWarning(LOG_DMR, "Frame loss threshold may be excessive, default is %u, configured is %u", dmr::DEFAULT_FRAME_LOSS_THRESHOLD, frameLossThreshold); + if (frameLossThreshold > DEFAULT_FRAME_LOSS_THRESHOLD * 2U) { + LogWarning(LOG_DMR, "Frame loss threshold may be excessive, default is %u, configured is %u", DEFAULT_FRAME_LOSS_THRESHOLD, frameLossThreshold); } m_slot1->setFrameLossThreshold(frameLossThreshold); @@ -286,16 +287,16 @@ bool Control::processWakeup(const uint8_t* data) assert(data != nullptr); // wakeups always come in on slot 1 - if (data[0U] != modem::TAG_DATA || data[1U] != (DMR_IDLE_RX | DMR_SYNC_DATA | DT_CSBK)) + if (data[0U] != modem::TAG_DATA || data[1U] != (IDLE_RX | SYNC_DATA | DataType::CSBK)) return false; // generate a new CSBK and check validity - std::unique_ptr csbk = lc::csbk::CSBKFactory::createCSBK(data + 2U, DT_CSBK); + std::unique_ptr csbk = lc::csbk::CSBKFactory::createCSBK(data + 2U, DataType::CSBK); if (csbk == nullptr) return false; uint8_t csbko = csbk->getCSBKO(); - if (csbko != CSBKO_BSDWNACT) + if (csbko != CSBKO::BSDWNACT) return false; uint32_t srcId = csbk->getSrcId(); @@ -303,12 +304,12 @@ bool Control::processWakeup(const uint8_t* data) // check the srcId against the ACL control bool ret = acl::AccessControl::validateSrcId(srcId); if (!ret) { - LogError(LOG_RF, "DMR, invalid CSBKO_BSDWNACT, srcId = %u", srcId); + LogError(LOG_RF, "DMR, invalid CSBKO, BSDWNACT, srcId = %u", srcId); return false; } if (m_verbose) { - LogMessage(LOG_RF, "DMR, CSBKO_BSDWNACT, srcId = %u", srcId); + LogMessage(LOG_RF, "DMR, CSBKO, BSDWNACT, srcId = %u", srcId); } return true; @@ -743,7 +744,7 @@ void Control::processNetwork() uint32_t srcId = __GET_UINT16(buffer, 5U); uint32_t dstId = __GET_UINT16(buffer, 8U); - uint8_t flco = (buffer[15U] & 0x40U) == 0x40U ? dmr::FLCO_PRIVATE : dmr::FLCO_GROUP; + FLCO::E flco = (buffer[15U] & 0x40U) == 0x40U ? FLCO::PRIVATE : FLCO::GROUP; uint32_t slotNo = (buffer[15U] & 0x80U) == 0x80U ? 2U : 1U; @@ -783,20 +784,20 @@ void Control::processNetwork() // process raw DMR data bytes if (dataSync) { - uint8_t dataType = buffer[15U] & 0x0FU; + DataType::E dataType = (DataType::E)(buffer[15U] & 0x0FU); data.setData(buffer.get() + 20U); data.setDataType(dataType); data.setN(0U); } else if (voiceSync) { data.setData(buffer.get() + 20U); - data.setDataType(dmr::DT_VOICE_SYNC); + data.setDataType(DataType::VOICE_SYNC); data.setN(0U); } else { uint8_t n = buffer[15U] & 0x0FU; data.setData(buffer.get() + 20U); - data.setDataType(dmr::DT_VOICE); + data.setDataType(DataType::VOICE); data.setN(n); } diff --git a/src/host/dmr/Slot.cpp b/src/host/dmr/Slot.cpp index 8198cf99..63ec3f0c 100644 --- a/src/host/dmr/Slot.cpp +++ b/src/host/dmr/Slot.cpp @@ -27,6 +27,7 @@ #include "ActivityLog.h" using namespace dmr; +using namespace dmr::defines; using namespace dmr::packet; #include @@ -71,10 +72,10 @@ uint32_t Slot::m_jitterSlots = 6U; uint8_t* Slot::m_idle = nullptr; -uint8_t Slot::m_flco1; +FLCO::E Slot::m_flco1; uint8_t Slot::m_id1 = 0U; bool Slot::m_voice1 = true; -uint8_t Slot::m_flco2; +FLCO::E Slot::m_flco2; uint8_t Slot::m_id2 = 0U; bool Slot::m_voice2 = true; @@ -270,8 +271,8 @@ bool Slot::processFrame(uint8_t *data, uint32_t len) m_rssiCount++; } - bool dataSync = (data[1U] & DMR_SYNC_DATA) == DMR_SYNC_DATA; - bool voiceSync = (data[1U] & DMR_SYNC_VOICE) == DMR_SYNC_VOICE; + bool dataSync = (data[1U] & SYNC_DATA) == SYNC_DATA; + bool voiceSync = (data[1U] & SYNC_VOICE) == SYNC_VOICE; if (!(dataSync || voiceSync) && m_rfState == RS_RF_LISTENING) { uint8_t sync[DMR_SYNC_LENGTH_BYTES]; @@ -280,12 +281,12 @@ bool Slot::processFrame(uint8_t *data, uint32_t len) // count data sync errors uint8_t dataErrs = 0U; for (uint8_t i = 0U; i < DMR_SYNC_LENGTH_BYTES; i++) - dataErrs += Utils::countBits8(sync[i] ^ DMR_MS_DATA_SYNC_BYTES[i]); + dataErrs += Utils::countBits8(sync[i] ^ MS_DATA_SYNC_BYTES[i]); // count voice sync errors uint8_t voiceErrs = 0U; for (uint8_t i = 0U; i < DMR_SYNC_LENGTH_BYTES; i++) - voiceErrs += Utils::countBits8(sync[i] ^ DMR_MS_VOICE_SYNC_BYTES[i]); + voiceErrs += Utils::countBits8(sync[i] ^ MS_VOICE_SYNC_BYTES[i]); LogWarning(LOG_RF, "DMR, possible sync word rejected, dataErrs = %u, voiceErrs = %u, sync word = %02X %02X %02X %02X %02X %02X", dataErrs, voiceErrs, sync[0U], sync[1U], sync[2U], sync[3U], sync[4U], sync[5U]); @@ -299,9 +300,9 @@ bool Slot::processFrame(uint8_t *data, uint32_t len) m_rfTGHang.start(); if (dataSync) { - uint8_t dataType = data[1U] & 0x0FU; + DataType::E dataType = (DataType::E)(data[1U] & 0x0FU); - if (dataType == DT_CSBK) { + if (dataType == DataType::CSBK) { return m_control->process(data, len); } @@ -310,15 +311,15 @@ bool Slot::processFrame(uint8_t *data, uint32_t len) switch (dataType) { - case DT_VOICE_LC_HEADER: - case DT_VOICE_PI_HEADER: + case DataType::VOICE_LC_HEADER: + case DataType::VOICE_PI_HEADER: return m_voice->process(data, len); - case DT_TERMINATOR_WITH_LC: + case DataType::TERMINATOR_WITH_LC: m_frameLossCnt = 0U; - case DT_DATA_HEADER: - case DT_RATE_12_DATA: - case DT_RATE_34_DATA: - case DT_RATE_1_DATA: + case DataType::DATA_HEADER: + case DataType::RATE_12_DATA: + case DataType::RATE_34_DATA: + case DataType::RATE_1_DATA: default: return m_data->process(data, len); } @@ -420,30 +421,30 @@ void Slot::processNetwork(const data::Data& dmrData) m_networkWatchdog.start(); - uint8_t dataType = dmrData.getDataType(); + DataType::E dataType = dmrData.getDataType(); // ignore non-CSBK data destined for the TSCC slot if (m_enableTSCC && m_dedicatedTSCC && m_slotNo == m_dmr->m_tsccSlotNo && - dataType != DT_CSBK) { + dataType != DataType::CSBK) { return; } switch (dataType) { - case DT_CSBK: + case DataType::CSBK: m_control->processNetwork(dmrData); break; - case DT_VOICE_LC_HEADER: - case DT_VOICE_PI_HEADER: - case DT_VOICE_SYNC: - case DT_VOICE: + case DataType::VOICE_LC_HEADER: + case DataType::VOICE_PI_HEADER: + case DataType::VOICE_SYNC: + case DataType::VOICE: m_voice->processNetwork(dmrData); break; - case DT_TERMINATOR_WITH_LC: - case DT_DATA_HEADER: - case DT_RATE_12_DATA: - case DT_RATE_34_DATA: - case DT_RATE_1_DATA: + case DataType::TERMINATOR_WITH_LC: + case DataType::DATA_HEADER: + case DataType::RATE_12_DATA: + case DataType::RATE_34_DATA: + case DataType::RATE_1_DATA: default: m_data->processNetwork(dmrData); break; @@ -542,7 +543,7 @@ void Slot::clock() } if ((m_dmr->m_tsccCnt % 2) > 0) { - setShortLC(m_slotNo, m_tsccPayloadDstId, m_tsccPayloadGroup ? FLCO_GROUP : FLCO_PRIVATE, m_tsccPayloadVoice); + setShortLC(m_slotNo, m_tsccPayloadDstId, m_tsccPayloadGroup ? FLCO::GROUP : FLCO::PRIVATE, m_tsccPayloadVoice); } } } @@ -971,7 +972,7 @@ void Slot::init(Control* dmr, bool authoritative, uint32_t colorCode, SiteData s HTTP_PUT, PUT_DMR_TSCC_PAYLOAD_ACT, req, voiceChData.ssl(), REST_QUICK_WAIT, tscc->m_debug); } else { - ::LogError(LOG_DMR, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), failed to clear payload channel, chNo = %u, slot = %u", tscc->m_slotNo, chNo, slot); + ::LogError(LOG_DMR, "DMR Slot %u, CSBK, RAND (Random Access), failed to clear payload channel, chNo = %u, slot = %u", tscc->m_slotNo, chNo, slot); } // callback REST API to clear TG permit for the granted TG on the specified voice channel @@ -988,7 +989,7 @@ void Slot::init(Control* dmr, bool authoritative, uint32_t colorCode, SiteData s HTTP_PUT, PUT_PERMIT_TG, req, voiceChData.ssl(), REST_QUICK_WAIT, m_dmr->m_debug); } else { - ::LogError(LOG_DMR, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), failed to clear TG permit, chNo = %u, slot = %u", tscc->m_slotNo, chNo, slot); + ::LogError(LOG_DMR, "DMR Slot %u, CSBK, RAND (Random Access), failed to clear TG permit, chNo = %u, slot = %u", tscc->m_slotNo, chNo, slot); } } } @@ -1010,12 +1011,12 @@ void Slot::init(Control* dmr, bool authoritative, uint32_t colorCode, SiteData s m_jitterSlots = (uint32_t)(std::ceil(jitter_tmp) * 6.0F); m_idle = new uint8_t[DMR_FRAME_LENGTH_BYTES + 2U]; - ::memcpy(m_idle, DMR_IDLE_DATA, DMR_FRAME_LENGTH_BYTES + 2U); + ::memcpy(m_idle, IDLE_DATA, DMR_FRAME_LENGTH_BYTES + 2U); // Generate the Slot Type for the Idle frame SlotType slotType; slotType.setColorCode(colorCode); - slotType.setDataType(DT_IDLE); + slotType.setDataType(DataType::IDLE); slotType.encode(m_idle + 2U); } @@ -1030,7 +1031,7 @@ void Slot::init(Control* dmr, bool authoritative, uint32_t colorCode, SiteData s /// void Slot::setSiteData(::lookups::VoiceChData controlChData, uint32_t netId, uint8_t siteId, uint8_t channelId, uint32_t channelNo, bool requireReg) { - m_siteData = SiteData(SITE_MODEL_SMALL, netId, siteId, 3U, requireReg); + m_siteData = SiteData(SiteModel::SMALL, netId, siteId, 3U, requireReg); m_channelNo = channelNo; std::vector<::lookups::IdenTable> entries = m_idenTable->list(); @@ -1254,7 +1255,7 @@ void Slot::notifyCC_TouchGrant(uint32_t dstId) /// /// /// -void Slot::writeNetwork(const uint8_t* data, uint8_t dataType, uint8_t errors, bool noSequence) +void Slot::writeNetwork(const uint8_t* data, DataType::E dataType, uint8_t errors, bool noSequence) { assert(data != nullptr); assert(m_rfLC != nullptr); @@ -1272,7 +1273,7 @@ void Slot::writeNetwork(const uint8_t* data, uint8_t dataType, uint8_t errors, b /// /// /// -void Slot::writeNetwork(const uint8_t* data, uint8_t dataType, uint8_t flco, uint32_t srcId, +void Slot::writeNetwork(const uint8_t* data, DataType::E dataType, FLCO::E flco, uint32_t srcId, uint32_t dstId, uint8_t errors, bool noSequence) { assert(data != nullptr); @@ -1324,11 +1325,11 @@ void Slot::writeEndRF(bool writeEnd) Sync::addDMRDataSync(data + 2U, m_duplex); lc::FullLC fullLC; - fullLC.encode(*m_rfLC, data + 2U, DT_TERMINATOR_WITH_LC); + fullLC.encode(*m_rfLC, data + 2U, DataType::TERMINATOR_WITH_LC); SlotType slotType; slotType.setColorCode(m_colorCode); - slotType.setDataType(DT_TERMINATOR_WITH_LC); + slotType.setDataType(DataType::TERMINATOR_WITH_LC); slotType.encode(data + 2U); data[0U] = modem::TAG_EOT; @@ -1375,11 +1376,11 @@ void Slot::writeEndNet(bool writeEnd) Sync::addDMRDataSync(data + 2U, m_duplex); lc::FullLC fullLC; - fullLC.encode(*m_netLC, data + 2U, DT_TERMINATOR_WITH_LC); + fullLC.encode(*m_netLC, data + 2U, DataType::TERMINATOR_WITH_LC); SlotType slotType; slotType.setColorCode(m_colorCode); - slotType.setDataType(DT_TERMINATOR_WITH_LC); + slotType.setDataType(DataType::TERMINATOR_WITH_LC); slotType.encode(data + 2U); data[0U] = modem::TAG_EOT; @@ -1568,7 +1569,7 @@ void Slot::clearTSCCActivated() /// /// /// -void Slot::setShortLC(uint32_t slotNo, uint32_t id, uint8_t flco, bool voice) +void Slot::setShortLC(uint32_t slotNo, uint32_t id, FLCO::E flco, bool voice) { assert(m_modem != nullptr); @@ -1607,7 +1608,7 @@ void Slot::setShortLC(uint32_t slotNo, uint32_t id, uint8_t flco, bool voice) return; uint8_t lc[5U]; - lc[0U] = SLCO_ACT; + lc[0U] = SLCO::ACT; lc[1U] = 0x00U; lc[2U] = 0x00U; lc[3U] = 0x00U; @@ -1615,13 +1616,13 @@ void Slot::setShortLC(uint32_t slotNo, uint32_t id, uint8_t flco, bool voice) if (m_id1 != 0U) { lc[2U] = m_id1; if (m_voice1) { - if (m_flco1 == FLCO_GROUP) + if (m_flco1 == FLCO::GROUP) lc[1U] |= 0x80U; else lc[1U] |= 0x90U; } else { - if (m_flco1 == FLCO_GROUP) + if (m_flco1 == FLCO::GROUP) lc[1U] |= 0xB0U; else lc[1U] |= 0xA0U; @@ -1631,13 +1632,13 @@ void Slot::setShortLC(uint32_t slotNo, uint32_t id, uint8_t flco, bool voice) if (m_id2 != 0U) { lc[3U] = m_id2; if (m_voice2) { - if (m_flco2 == FLCO_GROUP) + if (m_flco2 == FLCO::GROUP) lc[1U] |= 0x08U; else lc[1U] |= 0x09U; } else { - if (m_flco2 == FLCO_GROUP) + if (m_flco2 == FLCO::GROUP) lc[1U] |= 0x0BU; else lc[1U] |= 0x0AU; @@ -1665,30 +1666,30 @@ void Slot::setShortLC_TSCC(SiteData siteData, uint16_t counter) uint8_t lc[5U]; uint32_t lcValue = 0U; - lcValue = SLCO_TSCC; + lcValue = SLCO::TSCC; lcValue = (lcValue << 2) + siteData.siteModel(); switch (siteData.siteModel()) { - case SITE_MODEL_TINY: + case SiteModel::TINY: { lcValue = (lcValue << 9) + siteData.netId(); lcValue = (lcValue << 3) + siteData.siteId(); } break; - case SITE_MODEL_SMALL: + case SiteModel::SMALL: { lcValue = (lcValue << 7) + siteData.netId(); lcValue = (lcValue << 5) + siteData.siteId(); } break; - case SITE_MODEL_LARGE: + case SiteModel::LARGE: { lcValue = (lcValue << 5) + siteData.netId(); lcValue = (lcValue << 7) + siteData.siteId(); } break; - case SITE_MODEL_HUGE: + case SiteModel::HUGE: { lcValue = (lcValue << 2) + siteData.netId(); lcValue = (lcValue << 10) + siteData.siteId(); @@ -1728,30 +1729,30 @@ void Slot::setShortLC_Payload(SiteData siteData, uint16_t counter) uint8_t lc[5U]; uint32_t lcValue = 0U; - lcValue = SLCO_PAYLOAD; + lcValue = SLCO::PAYLOAD; lcValue = (lcValue << 2) + siteData.siteModel(); switch (siteData.siteModel()) { - case SITE_MODEL_TINY: + case SiteModel::TINY: { lcValue = (lcValue << 9) + siteData.netId(); lcValue = (lcValue << 3) + siteData.siteId(); } break; - case SITE_MODEL_SMALL: + case SiteModel::SMALL: { lcValue = (lcValue << 7) + siteData.netId(); lcValue = (lcValue << 5) + siteData.siteId(); } break; - case SITE_MODEL_LARGE: + case SiteModel::LARGE: { lcValue = (lcValue << 5) + siteData.netId(); lcValue = (lcValue << 7) + siteData.siteId(); } break; - case SITE_MODEL_HUGE: + case SiteModel::HUGE: { lcValue = (lcValue << 2) + siteData.netId(); lcValue = (lcValue << 10) + siteData.siteId(); diff --git a/src/host/dmr/Slot.h b/src/host/dmr/Slot.h index def929e3..f986997b 100644 --- a/src/host/dmr/Slot.h +++ b/src/host/dmr/Slot.h @@ -278,11 +278,11 @@ namespace dmr static uint8_t* m_idle; - static uint8_t m_flco1; + static defines::FLCO::E m_flco1; static uint8_t m_id1; static bool m_voice1; - static uint8_t m_flco2; + static defines::FLCO::E m_flco2; static uint8_t m_id2; static bool m_voice2; @@ -303,9 +303,9 @@ namespace dmr void notifyCC_TouchGrant(uint32_t dstId); /// Write data frame to the network. - void writeNetwork(const uint8_t* data, uint8_t dataType, uint8_t errors = 0U, bool noSequence = false); + void writeNetwork(const uint8_t* data, defines::DataType::E dataType, uint8_t errors = 0U, bool noSequence = false); /// Write data frame to the network. - void writeNetwork(const uint8_t* data, uint8_t dataType, uint8_t flco, uint32_t srcId, + void writeNetwork(const uint8_t* data, defines::DataType::E dataType, defines::FLCO::E flco, uint32_t srcId, uint32_t dstId, uint8_t errors = 0U, bool noSequence = false); /// Helper to write RF end of frame data. @@ -320,7 +320,7 @@ namespace dmr void clearTSCCActivated(); /// Helper to set the DMR short LC. - static void setShortLC(uint32_t slotNo, uint32_t id, uint8_t flco = FLCO_GROUP, bool voice = true); + static void setShortLC(uint32_t slotNo, uint32_t id, defines::FLCO::E flco = defines::FLCO::GROUP, bool voice = true); /// Helper to set the DMR short LC for TSCC. static void setShortLC_TSCC(SiteData siteData, uint16_t counter); /// Helper to set the DMR short LC for payload. diff --git a/src/host/dmr/lc/csbk/CSBK_DVM_GIT_HASH.cpp b/src/host/dmr/lc/csbk/CSBK_DVM_GIT_HASH.cpp index 65175be2..e1451896 100644 --- a/src/host/dmr/lc/csbk/CSBK_DVM_GIT_HASH.cpp +++ b/src/host/dmr/lc/csbk/CSBK_DVM_GIT_HASH.cpp @@ -7,16 +7,17 @@ * @package DVM / Modem Host Software * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "dmr/lc/csbk/CSBK_DVM_GIT_HASH.h" #include "HostMain.h" -using namespace dmr::lc::csbk; -using namespace dmr::lc; using namespace dmr; +using namespace dmr::defines; +using namespace dmr::lc; +using namespace dmr::lc::csbk; #include @@ -29,8 +30,8 @@ using namespace dmr; /// CSBK_DVM_GIT_HASH::CSBK_DVM_GIT_HASH() : CSBK() { - m_CSBKO = CSBKO_DVM_GIT_HASH; - m_FID = FID_OCS_DVM; + m_CSBKO = CSBKO::DVM_GIT_HASH; + m_FID = FID_DVM_OCS; } /// @@ -75,5 +76,5 @@ void CSBK_DVM_GIT_HASH::encode(uint8_t* data) /// std::string CSBK_DVM_GIT_HASH::toString() { - return std::string("CSBKO_DVM_GIT_HASH (DVM Git Hash Identifier)"); + return std::string("CSBKO, DVM_GIT_HASH (DVM Git Hash Identifier)"); } diff --git a/src/host/dmr/packet/ControlSignaling.cpp b/src/host/dmr/packet/ControlSignaling.cpp index 27aca4bb..f33c0d1d 100644 --- a/src/host/dmr/packet/ControlSignaling.cpp +++ b/src/host/dmr/packet/ControlSignaling.cpp @@ -27,6 +27,7 @@ #include "ActivityLog.h" using namespace dmr; +using namespace dmr::defines; using namespace dmr::lc::csbk; using namespace dmr::packet; @@ -54,7 +55,7 @@ using namespace dmr::packet; #define IS_SUPPORT_CONTROL_CHECK(_PCKT_STR, _PCKT, _SRCID) \ if (!m_slot->m_dmr->getTSCCSlot()->m_enableTSCC) { \ LogWarning(LOG_RF, "DMR Slot %u, %s denial, unsupported service, srcId = %u", m_slot->m_slotNo, _PCKT_STR.c_str(), _SRCID); \ - writeRF_CSBK_ACK_RSP(_SRCID, TS_DENY_RSN_SYS_UNSUPPORTED_SVC, 0U); \ + writeRF_CSBK_ACK_RSP(_SRCID, ReasonCode::TS_DENY_RSN_SYS_UNSUPPORTED_SVC, 0U); \ return false; \ } @@ -62,7 +63,7 @@ using namespace dmr::packet; #define VALID_SRCID(_PCKT_STR, _PCKT, _SRCID) \ if (!acl::AccessControl::validateSrcId(_SRCID)) { \ LogWarning(LOG_RF, "DMR Slot %u, %s denial, RID rejection, srcId = %u", m_slot->m_slotNo, _PCKT_STR.c_str(), _SRCID); \ - writeRF_CSBK_ACK_RSP(_SRCID, TS_DENY_RSN_PERM_USER_REFUSED, 0U); \ + writeRF_CSBK_ACK_RSP(_SRCID, ReasonCode::TS_DENY_RSN_PERM_USER_REFUSED, 0U); \ return false; \ } @@ -70,7 +71,7 @@ using namespace dmr::packet; #define VALID_DSTID(_PCKT_STR, _PCKT, _SRCID, _DSTID) \ if (!acl::AccessControl::validateSrcId(_DSTID)) { \ LogWarning(LOG_RF, "DMR Slot %u, %s denial, RID rejection, dstId = %u", m_slot->m_slotNo, _PCKT_STR.c_str(), _DSTID); \ - writeRF_CSBK_ACK_RSP(_SRCID, TS_DENY_RSN_TEMP_USER_REFUSED, 0U); \ + writeRF_CSBK_ACK_RSP(_SRCID, ReasonCode::TS_DENY_RSN_TEMP_USER_REFUSED, 0U); \ return false; \ } @@ -78,7 +79,7 @@ using namespace dmr::packet; #define VALID_TGID(_PCKT_STR, _PCKT, _SRCID, _DSTID) \ if (!acl::AccessControl::validateTGId(0U, _DSTID)) { \ LogWarning(LOG_RF, "DMR Slot %u, %s denial, TGID rejection, dstId = %u", m_slot->m_slotNo, _PCKT_STR.c_str(), _DSTID); \ - writeRF_CSBK_ACK_RSP(_SRCID, TS_DENY_RSN_TGT_GROUP_NOT_VALID, 0U); \ + writeRF_CSBK_ACK_RSP(_SRCID, ReasonCode::TS_DENY_RSN_TGT_GROUP_NOT_VALID, 0U); \ return false; \ } @@ -86,32 +87,32 @@ using namespace dmr::packet; #define VERIFY_SRCID_REG(_PCKT_STR, _PCKT, _SRCID) \ if (!m_slot->m_affiliations->isUnitReg(_SRCID) && m_slot->m_verifyReg) { \ LogWarning(LOG_RF, "DMR Slot %u, %s denial, RID not registered, srcId = %u", m_slot->m_slotNo, _PCKT_STR.c_str(), _SRCID); \ - writeRF_CSBK_ACK_RSP(_SRCID, TS_DENY_RSN_PERM_USER_REFUSED, 0U); \ + writeRF_CSBK_ACK_RSP(_SRCID, ReasonCode::TS_DENY_RSN_PERM_USER_REFUSED, 0U); \ return false; \ } // Macro helper to verbose log a generic CSBK. #define VERBOSE_LOG_CSBK(_PCKT_STR, _SRCID, _DSTID) \ if (m_verbose) { \ - LogMessage(LOG_RF, "DMR Slot %u, DT_CSBK, %s, srcId = %u, dstId = %u", m_slot->m_slotNo, _PCKT_STR.c_str(), _SRCID, _DSTID); \ + LogMessage(LOG_RF, "DMR Slot %u, CSBK, %s, srcId = %u, dstId = %u", m_slot->m_slotNo, _PCKT_STR.c_str(), _SRCID, _DSTID); \ } // Macro helper to verbose log a generic CSBK. #define VERBOSE_LOG_CSBK_DST(_PCKT_STR, _DSTID) \ if (m_verbose) { \ - LogMessage(LOG_RF, "DMR Slot %u, DT_CSBK, %s, dstId = %u", m_slot->m_slotNo, _PCKT_STR.c_str(), _DSTID); \ + LogMessage(LOG_RF, "DMR Slot %u, CSBK, %s, dstId = %u", m_slot->m_slotNo, _PCKT_STR.c_str(), _DSTID); \ } // Macro helper to verbose log a generic network CSBK. #define VERBOSE_LOG_CSBK_NET(_PCKT_STR, _SRCID, _DSTID) \ if (m_verbose) { \ - LogMessage(LOG_NET, "DMR Slot %u, DT_CSBK, %s, srcId = %u, dstId = %u", m_slot->m_slotNo, _PCKT_STR.c_str(), _SRCID, _DSTID); \ + LogMessage(LOG_NET, "DMR Slot %u, CSBK, %s, srcId = %u, dstId = %u", m_slot->m_slotNo, _PCKT_STR.c_str(), _SRCID, _DSTID); \ } // Macro helper to verbose log a generic network CSBK. #define DEBUG_LOG_CSBK(_PCKT_STR) \ if (m_debug) { \ - LogMessage(LOG_RF, "DMR Slot %u, DT_CSBK, %s", m_slot->m_slotNo, _PCKT_STR.c_str()); \ + LogMessage(LOG_RF, "DMR Slot %u, CSBK, %s", m_slot->m_slotNo, _PCKT_STR.c_str()); \ } // --------------------------------------------------------------------------- @@ -135,21 +136,21 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len) { assert(data != nullptr); - // Get the type from the packet metadata - uint8_t dataType = data[1U] & 0x0FU; + // get the type from the packet metadata + DataType::E dataType = (DataType::E)(data[1U] & 0x0FU); SlotType slotType; slotType.setColorCode(m_slot->m_colorCode); slotType.setDataType(dataType); - if (dataType == DT_CSBK) { + if (dataType == DataType::CSBK) { // generate a new CSBK and check validity std::unique_ptr csbk = CSBKFactory::createCSBK(data + 2U, dataType); if (csbk == nullptr) return false; uint8_t csbko = csbk->getCSBKO(); - if (csbko == CSBKO_BSDWNACT) + if (csbko == CSBKO::BSDWNACT) return false; bool gi = csbk->getGI(); @@ -163,7 +164,7 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len) // validate the source RID if (!acl::AccessControl::validateSrcId(srcId)) { - LogWarning(LOG_RF, "DMR Slot %u, DT_CSBK denial, RID rejection, srcId = %u", m_slot->m_slotNo, srcId); + LogWarning(LOG_RF, "DMR Slot %u, DataType::CSBK denial, RID rejection, srcId = %u", m_slot->m_slotNo, srcId); m_slot->m_rfState = RS_RF_REJECTED; return false; } @@ -171,7 +172,7 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len) // validate the target ID if (gi) { if (!acl::AccessControl::validateTGId(m_slot->m_slotNo, dstId)) { - LogWarning(LOG_RF, "DMR Slot %u, DT_CSBK denial, TGID rejection, srcId = %u, dstId = %u", m_slot->m_slotNo, srcId, dstId); + LogWarning(LOG_RF, "DMR Slot %u, DataType::CSBK denial, TGID rejection, srcId = %u, dstId = %u", m_slot->m_slotNo, srcId, dstId); m_slot->m_rfState = RS_RF_REJECTED; return false; } @@ -180,17 +181,17 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len) bool handled = false; switch (csbko) { - case CSBKO_UU_V_REQ: + case CSBKO::UU_V_REQ: VERBOSE_LOG_CSBK(csbk->toString(), srcId, dstId); break; - case CSBKO_UU_ANS_RSP: + case CSBKO::UU_ANS_RSP: VERBOSE_LOG_CSBK(csbk->toString(), srcId, dstId); break; - case CSBKO_RAND: + case CSBKO::RAND: { if (csbk->getFID() == FID_DMRA) { if (m_verbose) { - LogMessage(LOG_RF, "DMR Slot %u, DT_CSBK, %s, srcId = %u, dstId = %u", + LogMessage(LOG_RF, "DMR Slot %u, CSBK, %s, srcId = %u, dstId = %u", m_slot->m_slotNo, csbk->toString().c_str(), srcId, dstId); } @@ -200,25 +201,25 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len) CSBK_RAND* isp = static_cast(csbk.get()); if (m_verbose) { - LogMessage(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), serviceKind = $%02X, serviceOptions = $%02X, serviceExtra = $%02X, srcId = %u, dstId = %u", + LogMessage(LOG_RF, "DMR Slot %u, , CSBK, RAND (Random Access), serviceKind = $%02X, serviceOptions = $%02X, serviceExtra = $%02X, srcId = %u, dstId = %u", m_slot->m_slotNo, isp->getServiceKind(), isp->getServiceOptions(), isp->getServiceExtra(), isp->getSrcId(), isp->getDstId()); } switch (isp->getServiceKind()) { - case SVC_KIND_IND_VOICE_CALL: + case ServiceKind::IND_VOICE_CALL: // make sure control data is supported - IS_SUPPORT_CONTROL_CHECK(csbk->toString(), SVC_KIND_IND_VOICE_CALL, srcId); + IS_SUPPORT_CONTROL_CHECK(csbk->toString(), ServiceKind::IND_VOICE_CALL, srcId); // validate the source RID - VALID_SRCID(csbk->toString(), SVC_KIND_IND_VOICE_CALL, srcId); + VALID_SRCID(csbk->toString(), ServiceKind::IND_VOICE_CALL, srcId); // validate the target RID - VALID_DSTID(csbk->toString(), SVC_KIND_IND_VOICE_CALL, srcId, dstId); + VALID_DSTID(csbk->toString(), ServiceKind::IND_VOICE_CALL, srcId, dstId); // verify the source RID is registered - VERIFY_SRCID_REG(csbk->toString(), SVC_KIND_IND_VOICE_CALL, srcId); + VERIFY_SRCID_REG(csbk->toString(), ServiceKind::IND_VOICE_CALL, srcId); - writeRF_CSBK_ACK_RSP(srcId, TS_WAIT_RSN, 1U); + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_WAIT_RSN, 1U); if (m_slot->m_authoritative) { writeRF_CSBK_Grant(srcId, dstId, isp->getServiceOptions(), false); @@ -227,17 +228,17 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len) m_slot->m_network->writeGrantReq(modem::DVM_STATE::STATE_DMR, srcId, dstId, m_slot->m_slotNo, true); } break; - case SVC_KIND_GRP_VOICE_CALL: + case ServiceKind::GRP_VOICE_CALL: // make sure control data is supported - IS_SUPPORT_CONTROL_CHECK(csbk->toString(), SVC_KIND_GRP_VOICE_CALL, srcId); + IS_SUPPORT_CONTROL_CHECK(csbk->toString(), ServiceKind::GRP_VOICE_CALL, srcId); // validate the source RID - VALID_SRCID(csbk->toString(), SVC_KIND_GRP_VOICE_CALL, srcId); + VALID_SRCID(csbk->toString(), ServiceKind::GRP_VOICE_CALL, srcId); // validate the talkgroup ID - VALID_TGID(csbk->toString(), SVC_KIND_GRP_VOICE_CALL, srcId, dstId); + VALID_TGID(csbk->toString(), ServiceKind::GRP_VOICE_CALL, srcId, dstId); - writeRF_CSBK_ACK_RSP(srcId, TS_WAIT_RSN, 1U); + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_WAIT_RSN, 1U); if (m_slot->m_authoritative) { writeRF_CSBK_Grant(srcId, dstId, isp->getServiceOptions(), true); @@ -246,117 +247,117 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len) m_slot->m_network->writeGrantReq(modem::DVM_STATE::STATE_DMR, srcId, dstId, m_slot->m_slotNo, false); } break; - case SVC_KIND_IND_DATA_CALL: - case SVC_KIND_IND_UDT_DATA_CALL: + case ServiceKind::IND_DATA_CALL: + case ServiceKind::IND_UDT_DATA_CALL: // make sure control data is supported - IS_SUPPORT_CONTROL_CHECK(csbk->toString(), SVC_KIND_IND_VOICE_CALL, srcId); + IS_SUPPORT_CONTROL_CHECK(csbk->toString(), ServiceKind::IND_VOICE_CALL, srcId); // validate the source RID - VALID_SRCID(csbk->toString(), SVC_KIND_IND_VOICE_CALL, srcId); + VALID_SRCID(csbk->toString(), ServiceKind::IND_VOICE_CALL, srcId); // validate the target RID - VALID_DSTID(csbk->toString(), SVC_KIND_IND_VOICE_CALL, srcId, dstId); + VALID_DSTID(csbk->toString(), ServiceKind::IND_VOICE_CALL, srcId, dstId); // verify the source RID is registered - VERIFY_SRCID_REG(csbk->toString(), SVC_KIND_IND_VOICE_CALL, srcId); + VERIFY_SRCID_REG(csbk->toString(), ServiceKind::IND_VOICE_CALL, srcId); - writeRF_CSBK_ACK_RSP(srcId, TS_WAIT_RSN, 0U); + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_WAIT_RSN, 0U); writeRF_CSBK_Data_Grant(srcId, dstId, isp->getServiceOptions(), false); break; - case SVC_KIND_GRP_DATA_CALL: - case SVC_KIND_GRP_UDT_DATA_CALL: + case ServiceKind::GRP_DATA_CALL: + case ServiceKind::GRP_UDT_DATA_CALL: // make sure control data is supported - IS_SUPPORT_CONTROL_CHECK(csbk->toString(), SVC_KIND_GRP_VOICE_CALL, srcId); + IS_SUPPORT_CONTROL_CHECK(csbk->toString(), ServiceKind::GRP_VOICE_CALL, srcId); // validate the source RID - VALID_SRCID(csbk->toString(), SVC_KIND_GRP_VOICE_CALL, srcId); + VALID_SRCID(csbk->toString(), ServiceKind::GRP_VOICE_CALL, srcId); // validate the talkgroup ID - VALID_TGID(csbk->toString(), SVC_KIND_GRP_VOICE_CALL, srcId, dstId); + VALID_TGID(csbk->toString(), ServiceKind::GRP_VOICE_CALL, srcId, dstId); - writeRF_CSBK_ACK_RSP(srcId, TS_WAIT_RSN, 0U); + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_WAIT_RSN, 0U); writeRF_CSBK_Data_Grant(srcId, dstId, isp->getServiceOptions(), true); break; - case SVC_KIND_REG_SVC: + case ServiceKind::REG_SVC: // make sure control data is supported - IS_SUPPORT_CONTROL_CHECK(csbk->toString(), SVC_KIND_REG_SVC, srcId); + IS_SUPPORT_CONTROL_CHECK(csbk->toString(), ServiceKind::REG_SVC, srcId); writeRF_CSBK_U_Reg_Rsp(srcId, isp->getServiceOptions()); break; default: - LogWarning(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), unhandled service, serviceKind = %02X", m_slot->m_slotNo, isp->getServiceKind()); + LogWarning(LOG_RF, "DMR Slot %u, , CSBK, RAND (Random Access), unhandled service, serviceKind = %02X", m_slot->m_slotNo, isp->getServiceKind()); // should we drop the CSBK and not repeat it? break; } } } break; - case CSBKO_ACK_RSP: + case CSBKO::ACK_RSP: { VERBOSE_LOG_CSBK(csbk->toString(), srcId, dstId); ::ActivityLog("DMR", true, "Slot %u ack response from %u to %u", m_slot->m_slotNo, srcId, dstId); } break; - case CSBKO_EXT_FNCT: + case CSBKO::EXT_FNCT: { CSBK_EXT_FNCT* isp = static_cast(csbk.get()); if (m_verbose) { - LogMessage(LOG_RF, "DMR Slot %u, DT_CSBK, %s, op = $%02X, arg = %u, tgt = %u", + LogMessage(LOG_RF, "DMR Slot %u, CSBK, %s, op = $%02X, arg = %u, tgt = %u", m_slot->m_slotNo, csbk->toString().c_str(), isp->getExtendedFunction(), dstId, srcId); } // generate activity log entry switch (isp->getExtendedFunction()) { - case DMR_EXT_FNCT_CHECK: + case ExtendedFunctions::CHECK: ::ActivityLog("DMR", true, "Slot %u radio check request from %u to %u", m_slot->m_slotNo, dstId, srcId); break; - case DMR_EXT_FNCT_INHIBIT: + case ExtendedFunctions::INHIBIT: ::ActivityLog("DMR", true, "Slot %u radio inhibit request from %u to %u", m_slot->m_slotNo, dstId, srcId); break; - case DMR_EXT_FNCT_UNINHIBIT: + case ExtendedFunctions::UNINHIBIT: ::ActivityLog("DMR", true, "Slot %u radio uninhibit request from %u to %u", m_slot->m_slotNo, dstId, srcId); break; - case DMR_EXT_FNCT_CHECK_ACK: + case ExtendedFunctions::CHECK_ACK: ::ActivityLog("DMR", true, "Slot %u radio check response from %u to %u", m_slot->m_slotNo, dstId, srcId); break; - case DMR_EXT_FNCT_INHIBIT_ACK: + case ExtendedFunctions::INHIBIT_ACK: ::ActivityLog("DMR", true, "Slot %u radio inhibit response from %u to %u", m_slot->m_slotNo, dstId, srcId); break; - case DMR_EXT_FNCT_UNINHIBIT_ACK: + case ExtendedFunctions::UNINHIBIT_ACK: ::ActivityLog("DMR", true, "Slot %u radio uninhibit response from %u to %u", m_slot->m_slotNo, dstId, srcId); break; default: - LogWarning(LOG_RF, "DMR Slot %u, DT_CSBK, %s, unhandled op, op = $%02X", m_slot->m_slotNo, csbk->toString().c_str(), isp->getExtendedFunction()); + LogWarning(LOG_RF, "DMR Slot %u, CSBK, %s, unhandled op, op = $%02X", m_slot->m_slotNo, csbk->toString().c_str(), isp->getExtendedFunction()); break; } } break; - case CSBKO_NACK_RSP: + case CSBKO::NACK_RSP: { VERBOSE_LOG_CSBK(csbk->toString(), srcId, dstId); } break; - case CSBKO_MAINT: + case CSBKO::MAINT: { CSBK_MAINT* isp = static_cast(csbk.get()); if (m_verbose) { - LogMessage(LOG_RF, "DMR Slot %u, DT_CSBK, %s, kind = $%02X, srcId = %u", + LogMessage(LOG_RF, "DMR Slot %u, CSBK, %s, kind = $%02X, srcId = %u", m_slot->m_slotNo, csbk->toString().c_str(), isp->getMaintKind(), srcId); } } break; - case CSBKO_PRECCSBK: + case CSBKO::PRECCSBK: { if (m_verbose) { - LogMessage(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_PRECCSBK (%s Preamble CSBK), toFollow = %u, srcId = %u, dstId = %u", + LogMessage(LOG_RF, "DMR Slot %u, , CSBK, PRECCSBK (%s Preamble CSBK), toFollow = %u, srcId = %u, dstId = %u", m_slot->m_slotNo, csbk->getDataContent() ? "Data" : "CSBK", csbk->getCBF(), srcId, dstId); } } break; default: - LogWarning(LOG_RF, "DMR Slot %u, DT_CSBK, unhandled CSBK, csbko = $%02X, fid = $%02X", m_slot->m_slotNo, csbko, csbk->getFID()); + LogWarning(LOG_RF, "DMR Slot %u, CSBK, unhandled CSBK, csbko = $%02X, fid = $%02X", m_slot->m_slotNo, csbko, csbk->getFID()); // should we drop the CSBK and not repeat it? break; } @@ -379,7 +380,7 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len) if (m_slot->m_duplex) m_slot->addFrame(data); - m_slot->writeNetwork(data, DT_CSBK, gi ? FLCO_GROUP : FLCO_PRIVATE, srcId, dstId, 0U, true); + m_slot->writeNetwork(data, DataType::CSBK, gi ? FLCO::GROUP : FLCO::PRIVATE, srcId, dstId, 0U, true); } return true; @@ -394,26 +395,26 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len) /// void ControlSignaling::processNetwork(const data::Data & dmrData) { - uint8_t dataType = dmrData.getDataType(); + DataType::E dataType = dmrData.getDataType(); uint8_t data[DMR_FRAME_LENGTH_BYTES + 2U]; dmrData.getData(data + 2U); - if (dataType == DT_CSBK) { + if (dataType == DataType::CSBK) { std::unique_ptr csbk = CSBKFactory::createCSBK(data + 2U, dataType); if (csbk == nullptr) { - LogError(LOG_NET, "DMR Slot %u, DT_CSBK, unable to decode the network CSBK", m_slot->m_slotNo); + LogError(LOG_NET, "DMR Slot %u, CSBK, unable to decode the network CSBK", m_slot->m_slotNo); return; } uint8_t csbko = csbk->getCSBKO(); - if (csbko == CSBKO_BSDWNACT) + if (csbko == CSBKO::BSDWNACT) return; // handle updating internal adjacent site information - if (csbko == CSBKO_BROADCAST) { + if (csbko == CSBKO::BROADCAST) { CSBK_BROADCAST* osp = static_cast(csbk.get()); - if (osp->getAnncType() == BCAST_ANNC_ANN_WD_TSCC) { + if (osp->getAnncType() == BroadcastAnncType::ANN_WD_TSCC) { if (!m_slot->m_enableTSCC) { return; } @@ -428,7 +429,7 @@ void ControlSignaling::processNetwork(const data::Data & dmrData) } if (m_verbose) { - LogMessage(LOG_NET, "DMR Slot %u, DT_CSBK, %s, sysId = $%03X, chNo = %u", m_slot->m_slotNo, csbk->toString().c_str(), + LogMessage(LOG_NET, "DMR Slot %u, CSBK, %s, sysId = $%03X, chNo = %u", m_slot->m_slotNo, csbk->toString().c_str(), osp->getSystemId(), osp->getLogicalCh1()); } @@ -451,21 +452,21 @@ void ControlSignaling::processNetwork(const data::Data & dmrData) bool handled = false; switch (csbko) { - case CSBKO_UU_V_REQ: + case CSBKO::UU_V_REQ: { VERBOSE_LOG_CSBK_NET(csbk->toString(), srcId, dstId); } break; - case CSBKO_UU_ANS_RSP: + case CSBKO::UU_ANS_RSP: { VERBOSE_LOG_CSBK_NET(csbk->toString(), srcId, dstId); } break; - case CSBKO_RAND: + case CSBKO::RAND: { if (csbk->getFID() == FID_DMRA) { if (m_verbose) { - LogMessage(LOG_NET, "DMR Slot %u, DT_CSBK, %s, srcId = %u, dstId = %u", + LogMessage(LOG_NET, "DMR Slot %u, CSBK, %s, srcId = %u, dstId = %u", m_slot->m_slotNo, csbk->toString().c_str(), srcId, dstId); } @@ -473,41 +474,41 @@ void ControlSignaling::processNetwork(const data::Data & dmrData) } else { CSBK_RAND* isp = static_cast(csbk.get()); if (m_verbose) { - LogMessage(LOG_NET, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), serviceKind = $%02X, serviceOptions = $%02X, serviceExtra = $%02X, srcId = %u, dstId = %u", + LogMessage(LOG_NET, "DMR Slot %u, , CSBK, RAND (Random Access), serviceKind = $%02X, serviceOptions = $%02X, serviceExtra = $%02X, srcId = %u, dstId = %u", m_slot->m_slotNo, isp->getServiceKind(), isp->getServiceOptions(), isp->getServiceExtra(), isp->getSrcId(), isp->getDstId()); } switch (isp->getServiceKind()) { - case SVC_KIND_IND_VOICE_CALL: - writeRF_CSBK_ACK_RSP(srcId, TS_WAIT_RSN, 1U); + case ServiceKind::IND_VOICE_CALL: + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_WAIT_RSN, 1U); if (!m_slot->m_affiliations->isGranted(dstId)) { writeRF_CSBK_Grant(srcId, dstId, isp->getServiceOptions(), false, true); } break; - case SVC_KIND_GRP_VOICE_CALL: - writeRF_CSBK_ACK_RSP(srcId, TS_WAIT_RSN, 1U); + case ServiceKind::GRP_VOICE_CALL: + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_WAIT_RSN, 1U); if (!m_slot->m_affiliations->isGranted(dstId)) { writeRF_CSBK_Grant(srcId, dstId, isp->getServiceOptions(), true, true); } break; - case SVC_KIND_IND_DATA_CALL: - case SVC_KIND_IND_UDT_DATA_CALL: - writeRF_CSBK_ACK_RSP(srcId, TS_WAIT_RSN, 0U); + case ServiceKind::IND_DATA_CALL: + case ServiceKind::IND_UDT_DATA_CALL: + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_WAIT_RSN, 0U); writeRF_CSBK_Data_Grant(srcId, dstId, isp->getServiceOptions(), false, true); break; - case SVC_KIND_GRP_DATA_CALL: - case SVC_KIND_GRP_UDT_DATA_CALL: - writeRF_CSBK_ACK_RSP(srcId, TS_WAIT_RSN, 0U); + case ServiceKind::GRP_DATA_CALL: + case ServiceKind::GRP_UDT_DATA_CALL: + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_WAIT_RSN, 0U); writeRF_CSBK_Data_Grant(srcId, dstId, isp->getServiceOptions(), true, true); break; - case SVC_KIND_REG_SVC: + case ServiceKind::REG_SVC: break; default: - LogWarning(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), unhandled service, serviceKind = %02X", m_slot->m_slotNo, isp->getServiceKind()); + LogWarning(LOG_RF, "DMR Slot %u, , CSBK, RAND (Random Access), unhandled service, serviceKind = %02X", m_slot->m_slotNo, isp->getServiceKind()); // should we drop the CSBK and not repeat it? break; } @@ -516,61 +517,61 @@ void ControlSignaling::processNetwork(const data::Data & dmrData) } } break; - case CSBKO_ACK_RSP: + case CSBKO::ACK_RSP: { VERBOSE_LOG_CSBK_NET(csbk->toString(), srcId, dstId); ::ActivityLog("DMR", false, "Slot %u ack response from %u to %u", m_slot->m_slotNo, srcId, dstId); } break; - case CSBKO_EXT_FNCT: + case CSBKO::EXT_FNCT: { CSBK_EXT_FNCT* isp = static_cast(csbk.get()); if (m_verbose) { - LogMessage(LOG_NET, "DMR Slot %u, DT_CSBK, %s, op = $%02X, arg = %u, tgt = %u", + LogMessage(LOG_NET, "DMR Slot %u, CSBK, %s, op = $%02X, arg = %u, tgt = %u", m_slot->m_slotNo, csbk->toString().c_str(), isp->getExtendedFunction(), dstId, srcId); } // generate activity log entry switch (isp->getExtendedFunction()) { - case DMR_EXT_FNCT_CHECK: + case ExtendedFunctions::CHECK: ::ActivityLog("DMR", false, "Slot %u radio check request from %u to %u", m_slot->m_slotNo, dstId, srcId); break; - case DMR_EXT_FNCT_INHIBIT: + case ExtendedFunctions::INHIBIT: ::ActivityLog("DMR", false, "Slot %u radio inhibit request from %u to %u", m_slot->m_slotNo, dstId, srcId); break; - case DMR_EXT_FNCT_UNINHIBIT: + case ExtendedFunctions::UNINHIBIT: ::ActivityLog("DMR", false, "Slot %u radio uninhibit request from %u to %u", m_slot->m_slotNo, dstId, srcId); break; - case DMR_EXT_FNCT_CHECK_ACK: + case ExtendedFunctions::CHECK_ACK: ::ActivityLog("DMR", false, "Slot %u radio check response from %u to %u", m_slot->m_slotNo, dstId, srcId); break; - case DMR_EXT_FNCT_INHIBIT_ACK: + case ExtendedFunctions::INHIBIT_ACK: ::ActivityLog("DMR", false, "Slot %u radio inhibit response from %u to %u", m_slot->m_slotNo, dstId, srcId); break; - case DMR_EXT_FNCT_UNINHIBIT_ACK: + case ExtendedFunctions::UNINHIBIT_ACK: ::ActivityLog("DMR", false, "Slot %u radio uninhibit response from %u to %u", m_slot->m_slotNo, dstId, srcId); break; default: - LogWarning(LOG_NET, "DMR Slot %u, DT_CSBK, %s, unhandled op, op = $%02X", m_slot->m_slotNo, csbk->toString().c_str(), isp->getExtendedFunction()); + LogWarning(LOG_NET, "DMR Slot %u, CSBK, %s, unhandled op, op = $%02X", m_slot->m_slotNo, csbk->toString().c_str(), isp->getExtendedFunction()); break; } } break; - case CSBKO_NACK_RSP: + case CSBKO::NACK_RSP: { VERBOSE_LOG_CSBK_NET(csbk->toString(), srcId, dstId); } break; - case CSBKO_PRECCSBK: + case CSBKO::PRECCSBK: { if (m_verbose) { - LogMessage(LOG_NET, "DMR Slot %u, DT_CSBK, CSBKO_PRECCSBK (%s Preamble CSBK), toFollow = %u, srcId = %u, dstId = %u", + LogMessage(LOG_NET, "DMR Slot %u, , CSBK, PRECCSBK (%s Preamble CSBK), toFollow = %u, srcId = %u, dstId = %u", m_slot->m_slotNo, csbk->getDataContent() ? "Data" : "CSBK", csbk->getCBF(), srcId, dstId); } } break; default: - LogWarning(LOG_NET, "DMR Slot %u, DT_CSBK, unhandled network CSBK, csbko = $%02X, fid = $%02X", m_slot->m_slotNo, csbko, csbk->getFID()); + LogWarning(LOG_NET, "DMR Slot %u, CSBK, unhandled network CSBK, csbko = $%02X, fid = $%02X", m_slot->m_slotNo, csbko, csbk->getFID()); // should we drop the CSBK and not repeat it? break; } @@ -591,7 +592,7 @@ void ControlSignaling::processNetwork(const data::Data & dmrData) data[0U] = modem::TAG_DATA; data[1U] = 0x00U; - if (csbko == CSBKO_PRECCSBK && csbk->getDataContent()) { + if (csbko == CSBKO::PRECCSBK && csbk->getDataContent()) { uint32_t cbf = NO_PREAMBLE_CSBK + csbk->getCBF() - 1U; for (uint32_t i = 0U; i < NO_PREAMBLE_CSBK; i++, cbf--) { // change blocks to follow @@ -636,14 +637,14 @@ void ControlSignaling::writeAdjSSNetwork() std::unique_ptr csbk = std::make_unique(); csbk->siteIdenEntry(m_slot->m_idenEntry); csbk->setCdef(false); - csbk->setAnncType(BCAST_ANNC_ANN_WD_TSCC); + csbk->setAnncType(BroadcastAnncType::ANN_WD_TSCC); csbk->setLogicalCh1(m_slot->m_channelNo); csbk->setAnnWdCh1(true); csbk->setSystemId(m_slot->m_siteData.systemIdentity()); csbk->setRequireReg(m_slot->m_siteData.requireReg()); if (m_verbose) { - LogMessage(LOG_NET, "DMR Slot %u, DT_CSBK, %s, network announce, sysId = $%03X, chNo = %u", m_slot->m_slotNo, csbk->toString().c_str(), + LogMessage(LOG_NET, "DMR Slot %u, CSBK, %s, network announce, sysId = $%03X, chNo = %u", m_slot->m_slotNo, csbk->toString().c_str(), m_slot->m_siteData.systemIdentity(), m_slot->m_channelNo); } @@ -666,18 +667,18 @@ void ControlSignaling::writeRF_Ext_Func(uint32_t func, uint32_t arg, uint32_t ds csbk->setDstId(dstId); if (m_verbose) { - LogMessage(LOG_RF, "DMR Slot %u, DT_CSBK, %s, op = $%02X, arg = %u, tgt = %u", + LogMessage(LOG_RF, "DMR Slot %u, CSBK, %s, op = $%02X, arg = %u, tgt = %u", m_slot->m_slotNo, csbk->toString().c_str(), func, arg, dstId); } // generate activity log entry - if (func == DMR_EXT_FNCT_CHECK) { + if (func == ExtendedFunctions::CHECK) { ::ActivityLog("DMR", true, "Slot %u radio check request from %u to %u", m_slot->m_slotNo, arg, dstId); } - else if (func == DMR_EXT_FNCT_INHIBIT) { + else if (func == ExtendedFunctions::INHIBIT) { ::ActivityLog("DMR", true, "Slot %u radio inhibit request from %u to %u", m_slot->m_slotNo, arg, dstId); } - else if (func == DMR_EXT_FNCT_UNINHIBIT) { + else if (func == ExtendedFunctions::UNINHIBIT) { ::ActivityLog("DMR", true, "Slot %u radio uninhibit request from %u to %u", m_slot->m_slotNo, arg, dstId); } @@ -751,7 +752,7 @@ void ControlSignaling::writeRF_CSBK(lc::CSBK* csbk, bool imm) SlotType slotType; slotType.setColorCode(m_slot->m_colorCode); - slotType.setDataType(DT_CSBK); + slotType.setDataType(DataType::CSBK); // Regenerate the CSBK data csbk->encode(data + 2U); @@ -782,7 +783,7 @@ void ControlSignaling::writeNet_CSBK(lc::CSBK* csbk) SlotType slotType; slotType.setColorCode(m_slot->m_colorCode); - slotType.setDataType(DT_CSBK); + slotType.setDataType(DataType::CSBK); // Regenerate the CSBK data csbk->encode(data + 2U); @@ -801,7 +802,7 @@ void ControlSignaling::writeNet_CSBK(lc::CSBK* csbk) if (m_slot->m_duplex) m_slot->addFrame(data); - m_slot->writeNetwork(data, DT_CSBK, csbk->getGI() ? FLCO_GROUP : FLCO_PRIVATE, csbk->getSrcId(), csbk->getDstId(), 0U, true); + m_slot->writeNetwork(data, DataType::CSBK, csbk->getGI() ? FLCO::GROUP : FLCO::PRIVATE, csbk->getSrcId(), csbk->getDstId(), 0U, true); } /* @@ -819,7 +820,7 @@ void ControlSignaling::writeRF_CSBK_ACK_RSP(uint32_t dstId, uint8_t reason, uint std::unique_ptr csbk = std::make_unique(); csbk->setResponse(responseInfo); csbk->setReason(reason); - csbk->setSrcId(DMR_WUID_ALL); // hmmm... + csbk->setSrcId(WUID_ALL); // hmmm... csbk->setDstId(dstId); writeRF_CSBK_Imm(csbk.get()); @@ -836,7 +837,7 @@ void ControlSignaling::writeRF_CSBK_NACK_RSP(uint32_t dstId, uint8_t reason, uin std::unique_ptr csbk = std::make_unique(); csbk->setServiceKind(service); csbk->setReason(reason); - csbk->setSrcId(DMR_WUID_ALL); // hmmm... + csbk->setSrcId(WUID_ALL); // hmmm... csbk->setDstId(dstId); writeRF_CSBK_Imm(csbk.get()); @@ -864,7 +865,7 @@ bool ControlSignaling::writeRF_CSBK_Grant(uint32_t srcId, uint32_t dstId, uint8_ bool broadcast = ((serviceOptions & 0xFFU) & 0x10U) == 0x10U; // Broadcast Flag uint8_t priority = ((serviceOptions & 0xFFU) & 0x03U); // Priority - if (dstId == DMR_WUID_ALL) { + if (dstId == WUID_ALL || dstId == WUID_ALLZ || dstId == WUID_ALLL) { return true; // do not generate grant packets for $FFFF (All Call) TGID } @@ -872,8 +873,8 @@ bool ControlSignaling::writeRF_CSBK_Grant(uint32_t srcId, uint32_t dstId, uint8_ if (!skip) { if (m_slot->m_rfState != RS_RF_LISTENING && m_slot->m_rfState != RS_RF_DATA) { if (!net) { - LogWarning(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), SVC_KIND_VOICE_CALL (Voice Call) denied, traffic in progress, dstId = %u", m_tscc->m_slotNo, dstId); - writeRF_CSBK_ACK_RSP(srcId, TS_DENY_RSN_TGT_BUSY, (grp) ? 1U : 0U); + LogWarning(LOG_RF, "DMR Slot %u, , CSBK, RAND (Random Access, VOICE_CALL (Voice Call) denied, traffic in progress, dstId = %u", m_tscc->m_slotNo, dstId); + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_DENY_RSN_TGT_BUSY, (grp) ? 1U : 0U); ::ActivityLog("DMR", true, "Slot %u group grant request %u to TG %u denied", m_tscc->m_slotNo, srcId, dstId); m_slot->m_rfState = RS_RF_REJECTED; @@ -884,8 +885,8 @@ bool ControlSignaling::writeRF_CSBK_Grant(uint32_t srcId, uint32_t dstId, uint8_ if (m_slot->m_netState != RS_NET_IDLE && dstId == m_slot->m_netLastDstId) { if (!net) { - LogWarning(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), SVC_KIND_VOICE_CALL (Voice Call) denied, traffic in progress, dstId = %u", m_tscc->m_slotNo, dstId); - writeRF_CSBK_ACK_RSP(srcId, TS_DENY_RSN_TGT_BUSY, (grp) ? 1U : 0U); + LogWarning(LOG_RF, "DMR Slot %u, , CSBK, RAND (Random Access, VOICE_CALL (Voice Call) denied, traffic in progress, dstId = %u", m_tscc->m_slotNo, dstId); + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_DENY_RSN_TGT_BUSY, (grp) ? 1U : 0U); ::ActivityLog("DMR", true, "Slot %u group grant request %u to TG %u denied", m_tscc->m_slotNo, srcId, dstId); m_slot->m_rfState = RS_RF_REJECTED; @@ -898,7 +899,7 @@ bool ControlSignaling::writeRF_CSBK_Grant(uint32_t srcId, uint32_t dstId, uint8_ if (m_slot->m_rfLastDstId != 0U) { if (m_slot->m_rfLastDstId != dstId && (m_slot->m_rfTGHang.isRunning() && !m_slot->m_rfTGHang.hasExpired())) { if (!net) { - writeRF_CSBK_ACK_RSP(srcId, TS_DENY_RSN_TGT_BUSY, (grp) ? 1U : 0U); + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_DENY_RSN_TGT_BUSY, (grp) ? 1U : 0U); m_slot->m_rfState = RS_RF_REJECTED; } @@ -910,8 +911,8 @@ bool ControlSignaling::writeRF_CSBK_Grant(uint32_t srcId, uint32_t dstId, uint8_ if (!m_tscc->m_affiliations->rfCh()->isRFChAvailable()) { if (grp) { if (!net) { - LogWarning(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), SVC_KIND_GRP_VOICE_CALL (Group Voice Call) queued, no channels available, dstId = %u", m_tscc->m_slotNo, dstId); - writeRF_CSBK_ACK_RSP(srcId, TS_QUEUED_RSN_NO_RESOURCE, (grp) ? 1U : 0U); + LogWarning(LOG_RF, "DMR Slot %u, , CSBK, RAND (Random Access, GRP_VOICE_CALL (Group Voice Call) queued, no channels available, dstId = %u", m_tscc->m_slotNo, dstId); + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_QUEUED_RSN_NO_RESOURCE, (grp) ? 1U : 0U); ::ActivityLog("DMR", true, "Slot %u group grant request %u to TG %u queued", m_tscc->m_slotNo, srcId, dstId); m_slot->m_rfState = RS_RF_REJECTED; @@ -921,8 +922,8 @@ bool ControlSignaling::writeRF_CSBK_Grant(uint32_t srcId, uint32_t dstId, uint8_ } else { if (!net) { - LogWarning(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), SVC_KIND_IND_VOICE_CALL (Individual Voice Call) queued, no channels available, dstId = %u", m_tscc->m_slotNo, dstId); - writeRF_CSBK_ACK_RSP(srcId, TS_QUEUED_RSN_NO_RESOURCE, (grp) ? 1U : 0U); + LogWarning(LOG_RF, "DMR Slot %u, , CSBK, RAND (Random Access, IND_VOICE_CALL (Individual Voice Call) queued, no channels available, dstId = %u", m_tscc->m_slotNo, dstId); + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_QUEUED_RSN_NO_RESOURCE, (grp) ? 1U : 0U); ::ActivityLog("DMR", true, "Slot %u group grant request %u to TG %u queued", m_tscc->m_slotNo, srcId, dstId); m_slot->m_rfState = RS_RF_REJECTED; @@ -946,8 +947,8 @@ bool ControlSignaling::writeRF_CSBK_Grant(uint32_t srcId, uint32_t dstId, uint8_ uint32_t grantedSrcId = m_tscc->m_affiliations->getGrantedSrcId(dstId); if (srcId != grantedSrcId) { if (!net) { - LogWarning(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), SVC_KIND_VOICE_CALL (Voice Call) denied, traffic in progress, dstId = %u", m_tscc->m_slotNo, dstId); - writeRF_CSBK_ACK_RSP(srcId, TS_DENY_RSN_TGT_BUSY, (grp) ? 1U : 0U); + LogWarning(LOG_RF, "DMR Slot %u, , CSBK, RAND (Random Access, VOICE_CALL (Voice Call) denied, traffic in progress, dstId = %u", m_tscc->m_slotNo, dstId); + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_DENY_RSN_TGT_BUSY, (grp) ? 1U : 0U); ::ActivityLog("DMR", true, "Slot %u group grant request %u to TG %u denied", m_tscc->m_slotNo, srcId, dstId); m_slot->m_rfState = RS_RF_REJECTED; @@ -994,10 +995,10 @@ bool ControlSignaling::writeRF_CSBK_Grant(uint32_t srcId, uint32_t dstId, uint8_ int ret = RESTClient::send(voiceChData.address(), voiceChData.port(), voiceChData.password(), HTTP_PUT, PUT_PERMIT_TG, req, voiceChData.ssl(), REST_QUICK_WAIT, m_tscc->m_debug); if (ret != network::rest::http::HTTPPayload::StatusType::OK) { - ::LogError(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), failed to permit TG for use, chNo = %u, slot = %u", m_tscc->m_slotNo, chNo, slot); + ::LogError(LOG_RF, "DMR Slot %u, , CSBK, RAND (Random Access), failed to permit TG for use, chNo = %u, slot = %u", m_tscc->m_slotNo, chNo, slot); m_tscc->m_affiliations->releaseGrant(dstId, false); if (!net) { - writeRF_CSBK_ACK_RSP(srcId, TS_DENY_RSN_TGT_BUSY, (grp) ? 1U : 0U); + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_DENY_RSN_TGT_BUSY, (grp) ? 1U : 0U); m_slot->m_rfState = RS_RF_REJECTED; } @@ -1005,20 +1006,20 @@ bool ControlSignaling::writeRF_CSBK_Grant(uint32_t srcId, uint32_t dstId, uint8_ } } else { - ::LogError(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), failed to permit TG for use, chNo = %u, slot = %u", m_tscc->m_slotNo, chNo, slot); + ::LogError(LOG_RF, "DMR Slot %u, , CSBK, RAND (Random Access), failed to permit TG for use, chNo = %u, slot = %u", m_tscc->m_slotNo, chNo, slot); } } - writeRF_CSBK_ACK_RSP(srcId, TS_ACK_RSN_MSG, (grp) ? 1U : 0U); + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_ACK_RSN_MSG, (grp) ? 1U : 0U); std::unique_ptr csbk = std::make_unique(); if (broadcast) - csbk->setCSBKO(CSBKO_BTV_GRANT); + csbk->setCSBKO(CSBKO::BTV_GRANT); csbk->setLogicalCh1(chNo); csbk->setSlotNo(slot); if (m_verbose) { - LogMessage((net) ? LOG_NET : LOG_RF, "DMR Slot %u, DT_CSBK, %s, emerg = %u, privacy = %u, broadcast = %u, prio = %u, chNo = %u, slot = %u, srcId = %u, dstId = %u", + LogMessage((net) ? LOG_NET : LOG_RF, "DMR Slot %u, CSBK, %s, emerg = %u, privacy = %u, broadcast = %u, prio = %u, chNo = %u, slot = %u, srcId = %u, dstId = %u", m_tscc->m_slotNo, csbk->toString().c_str(), emergency, privacy, broadcast, priority, csbk->getLogicalCh1(), csbk->getSlotNo(), srcId, dstId); } @@ -1046,7 +1047,7 @@ bool ControlSignaling::writeRF_CSBK_Grant(uint32_t srcId, uint32_t dstId, uint8_ HTTP_PUT, PUT_DMR_TSCC_PAYLOAD_ACT, req, voiceChData.ssl(), REST_QUICK_WAIT, m_tscc->m_debug); } else { - ::LogError(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), failed to activate payload channel, chNo = %u, slot = %u", m_tscc->m_slotNo, chNo, slot); + ::LogError(LOG_RF, "DMR Slot %u, , CSBK, RAND (Random Access), failed to activate payload channel, chNo = %u, slot = %u", m_tscc->m_slotNo, chNo, slot); } } else { @@ -1072,10 +1073,10 @@ bool ControlSignaling::writeRF_CSBK_Grant(uint32_t srcId, uint32_t dstId, uint8_ int ret = RESTClient::send(voiceChData.address(), voiceChData.port(), voiceChData.password(), HTTP_PUT, PUT_PERMIT_TG, req, voiceChData.ssl(), REST_QUICK_WAIT, m_tscc->m_debug); if (ret != network::rest::http::HTTPPayload::StatusType::OK) { - ::LogError(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), failed to permit TG for use, chNo = %u, slot = %u", m_tscc->m_slotNo, chNo, slot); + ::LogError(LOG_RF, "DMR Slot %u, , CSBK, RAND (Random Access), failed to permit TG for use, chNo = %u, slot = %u", m_tscc->m_slotNo, chNo, slot); m_tscc->m_affiliations->releaseGrant(dstId, false); if (!net) { - writeRF_CSBK_ACK_RSP(srcId, TS_DENY_RSN_TGT_BUSY, (grp) ? 1U : 0U); + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_DENY_RSN_TGT_BUSY, (grp) ? 1U : 0U); m_slot->m_rfState = RS_RF_REJECTED; } @@ -1083,18 +1084,18 @@ bool ControlSignaling::writeRF_CSBK_Grant(uint32_t srcId, uint32_t dstId, uint8_ } } else { - ::LogError(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), failed to permit TG for use, chNo = %u, slot = %u", m_tscc->m_slotNo, chNo, slot); + ::LogError(LOG_RF, "DMR Slot %u, , CSBK, RAND (Random Access), failed to permit TG for use, chNo = %u, slot = %u", m_tscc->m_slotNo, chNo, slot); } } - writeRF_CSBK_ACK_RSP(srcId, TS_ACK_RSN_MSG, (grp) ? 1U : 0U); + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_ACK_RSN_MSG, (grp) ? 1U : 0U); std::unique_ptr csbk = std::make_unique(); csbk->setLogicalCh1(chNo); csbk->setSlotNo(slot); if (m_verbose) { - LogMessage((net) ? LOG_NET : LOG_RF, "DMR Slot %u, DT_CSBK, %s, emerg = %u, privacy = %u, broadcast = %u, prio = %u, chNo = %u, slot = %u, srcId = %u, dstId = %u", + LogMessage((net) ? LOG_NET : LOG_RF, "DMR Slot %u, CSBK, %s, emerg = %u, privacy = %u, broadcast = %u, prio = %u, chNo = %u, slot = %u, srcId = %u, dstId = %u", m_tscc->m_slotNo, csbk->toString().c_str(), emergency, privacy, broadcast, priority, csbk->getLogicalCh1(), csbk->getSlotNo(), srcId, dstId); } @@ -1122,7 +1123,7 @@ bool ControlSignaling::writeRF_CSBK_Grant(uint32_t srcId, uint32_t dstId, uint8_ HTTP_PUT, PUT_DMR_TSCC_PAYLOAD_ACT, req, voiceChData.ssl(), REST_QUICK_WAIT, m_tscc->m_debug); } else { - ::LogError(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), failed to activate payload channel, chNo = %u, slot = %u", m_tscc->m_slotNo, chNo, slot); + ::LogError(LOG_RF, "DMR Slot %u, , CSBK, RAND (Random Access), failed to activate payload channel, chNo = %u, slot = %u", m_tscc->m_slotNo, chNo, slot); } } else { @@ -1155,7 +1156,7 @@ bool ControlSignaling::writeRF_CSBK_Data_Grant(uint32_t srcId, uint32_t dstId, u bool broadcast = ((serviceOptions & 0xFFU) & 0x10U) == 0x10U; // Broadcast Flag uint8_t priority = ((serviceOptions & 0xFFU) & 0x03U); // Priority - if (dstId == DMR_WUID_ALL) { + if (dstId == WUID_ALL || dstId == WUID_ALLZ || dstId == WUID_ALLL) { return true; // do not generate grant packets for $FFFF (All Call) TGID } @@ -1163,8 +1164,8 @@ bool ControlSignaling::writeRF_CSBK_Data_Grant(uint32_t srcId, uint32_t dstId, u if (!skip) { if (m_slot->m_rfState != RS_RF_LISTENING && m_slot->m_rfState != RS_RF_DATA) { if (!net) { - LogWarning(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), SVC_KIND_DATA_CALL (Data Call) denied, traffic in progress, dstId = %u", m_tscc->m_slotNo, dstId); - writeRF_CSBK_ACK_RSP(srcId, TS_DENY_RSN_TGT_BUSY, (grp) ? 1U : 0U); + LogWarning(LOG_RF, "DMR Slot %u, , CSBK, RAND (Random Access, DATA_CALL (Data Call) denied, traffic in progress, dstId = %u", m_tscc->m_slotNo, dstId); + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_DENY_RSN_TGT_BUSY, (grp) ? 1U : 0U); ::ActivityLog("DMR", true, "Slot %u group grant request %u to TG %u denied", m_tscc->m_slotNo, srcId, dstId); m_slot->m_rfState = RS_RF_REJECTED; @@ -1175,8 +1176,8 @@ bool ControlSignaling::writeRF_CSBK_Data_Grant(uint32_t srcId, uint32_t dstId, u if (m_slot->m_netState != RS_NET_IDLE && dstId == m_slot->m_netLastDstId) { if (!net) { - LogWarning(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), SVC_KIND_DATA_CALL (Data Call) denied, traffic in progress, dstId = %u", m_tscc->m_slotNo, dstId); - writeRF_CSBK_ACK_RSP(srcId, TS_DENY_RSN_TGT_BUSY, (grp) ? 1U : 0U); + LogWarning(LOG_RF, "DMR Slot %u, , CSBK, RAND (Random Access, DATA_CALL (Data Call) denied, traffic in progress, dstId = %u", m_tscc->m_slotNo, dstId); + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_DENY_RSN_TGT_BUSY, (grp) ? 1U : 0U); ::ActivityLog("DMR", true, "Slot %u group grant request %u to TG %u denied", m_tscc->m_slotNo, srcId, dstId); m_slot->m_rfState = RS_RF_REJECTED; @@ -1189,7 +1190,7 @@ bool ControlSignaling::writeRF_CSBK_Data_Grant(uint32_t srcId, uint32_t dstId, u if (m_slot->m_rfLastDstId != 0U) { if (m_slot->m_rfLastDstId != dstId && (m_slot->m_rfTGHang.isRunning() && !m_slot->m_rfTGHang.hasExpired())) { if (!net) { - writeRF_CSBK_ACK_RSP(srcId, TS_DENY_RSN_TGT_BUSY, (grp) ? 1U : 0U); + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_DENY_RSN_TGT_BUSY, (grp) ? 1U : 0U); m_slot->m_rfState = RS_RF_REJECTED; } @@ -1201,8 +1202,8 @@ bool ControlSignaling::writeRF_CSBK_Data_Grant(uint32_t srcId, uint32_t dstId, u if (!m_tscc->m_affiliations->rfCh()->isRFChAvailable()) { if (grp) { if (!net) { - LogWarning(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), SVC_KIND_GRP_DATA_CALL (Group Data Call) queued, no channels available, dstId = %u", m_tscc->m_slotNo, dstId); - writeRF_CSBK_ACK_RSP(srcId, TS_QUEUED_RSN_NO_RESOURCE, (grp) ? 1U : 0U); + LogWarning(LOG_RF, "DMR Slot %u, , CSBK, RAND (Random Access, GRP_DATA_CALL (Group Data Call) queued, no channels available, dstId = %u", m_tscc->m_slotNo, dstId); + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_QUEUED_RSN_NO_RESOURCE, (grp) ? 1U : 0U); ::ActivityLog("DMR", true, "Slot %u group grant request %u to TG %u queued", m_tscc->m_slotNo, srcId, dstId); m_slot->m_rfState = RS_RF_REJECTED; @@ -1212,8 +1213,8 @@ bool ControlSignaling::writeRF_CSBK_Data_Grant(uint32_t srcId, uint32_t dstId, u } else { if (!net) { - LogWarning(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), SVC_KIND_IND_DATA_CALL (Individual Data Call) queued, no channels available, dstId = %u", m_tscc->m_slotNo, dstId); - writeRF_CSBK_ACK_RSP(srcId, TS_QUEUED_RSN_NO_RESOURCE, (grp) ? 1U : 0U); + LogWarning(LOG_RF, "DMR Slot %u, , CSBK, RAND (Random Access, IND_DATA_CALL (Individual Data Call) queued, no channels available, dstId = %u", m_tscc->m_slotNo, dstId); + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_QUEUED_RSN_NO_RESOURCE, (grp) ? 1U : 0U); ::ActivityLog("DMR", true, "Slot %u group grant request %u to TG %u queued", m_tscc->m_slotNo, srcId, dstId); m_slot->m_rfState = RS_RF_REJECTED; @@ -1245,14 +1246,14 @@ bool ControlSignaling::writeRF_CSBK_Data_Grant(uint32_t srcId, uint32_t dstId, u ::ActivityLog("DMR", true, "Slot %u group grant request from %u to TG %u", m_tscc->m_slotNo, srcId, dstId); } - writeRF_CSBK_ACK_RSP(srcId, TS_ACK_RSN_MSG, (grp) ? 1U : 0U); + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_ACK_RSN_MSG, (grp) ? 1U : 0U); std::unique_ptr csbk = std::make_unique(); csbk->setLogicalCh1(chNo); csbk->setSlotNo(slot); if (m_verbose) { - LogMessage((net) ? LOG_NET : LOG_RF, "DMR Slot %u, DT_CSBK, %s, emerg = %u, privacy = %u, broadcast = %u, prio = %u, chNo = %u, slot = %u, srcId = %u, dstId = %u", + LogMessage((net) ? LOG_NET : LOG_RF, "DMR Slot %u, CSBK, %s, emerg = %u, privacy = %u, broadcast = %u, prio = %u, chNo = %u, slot = %u, srcId = %u, dstId = %u", m_tscc->m_slotNo, csbk->toString().c_str(), emergency, privacy, broadcast, priority, csbk->getLogicalCh1(), csbk->getSlotNo(), srcId, dstId); } @@ -1280,7 +1281,7 @@ bool ControlSignaling::writeRF_CSBK_Data_Grant(uint32_t srcId, uint32_t dstId, u HTTP_PUT, PUT_DMR_TSCC_PAYLOAD_ACT, req, voiceChData.ssl(), REST_QUICK_WAIT, m_tscc->m_debug); } else { - ::LogError(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), failed to activate payload channel, chNo = %u, slot = %u", m_tscc->m_slotNo, chNo, slot); + ::LogError(LOG_RF, "DMR Slot %u, , CSBK, RAND (Random Access), failed to activate payload channel, chNo = %u, slot = %u", m_tscc->m_slotNo, chNo, slot); } } else { @@ -1292,14 +1293,14 @@ bool ControlSignaling::writeRF_CSBK_Data_Grant(uint32_t srcId, uint32_t dstId, u ::ActivityLog("DMR", true, "Slot %u individual grant request from %u to TG %u", m_tscc->m_slotNo, srcId, dstId); } - writeRF_CSBK_ACK_RSP(srcId, TS_ACK_RSN_MSG, (grp) ? 1U : 0U); + writeRF_CSBK_ACK_RSP(srcId, ReasonCode::TS_ACK_RSN_MSG, (grp) ? 1U : 0U); std::unique_ptr csbk = std::make_unique(); csbk->setLogicalCh1(chNo); csbk->setSlotNo(slot); if (m_verbose) { - LogMessage((net) ? LOG_NET : LOG_RF, "DMR Slot %u, DT_CSBK, %s, emerg = %u, privacy = %u, broadcast = %u, prio = %u, chNo = %u, slot = %u, srcId = %u, dstId = %u", + LogMessage((net) ? LOG_NET : LOG_RF, "DMR Slot %u, CSBK, %s, emerg = %u, privacy = %u, broadcast = %u, prio = %u, chNo = %u, slot = %u, srcId = %u, dstId = %u", m_tscc->m_slotNo, csbk->toString().c_str(), emergency, privacy, broadcast, priority, csbk->getLogicalCh1(), csbk->getSlotNo(), srcId, dstId); } @@ -1327,7 +1328,7 @@ bool ControlSignaling::writeRF_CSBK_Data_Grant(uint32_t srcId, uint32_t dstId, u HTTP_PUT, PUT_DMR_TSCC_PAYLOAD_ACT, req, voiceChData.ssl(), REST_QUICK_WAIT, m_tscc->m_debug); } else { - ::LogError(LOG_RF, "DMR Slot %u, DT_CSBK, CSBKO_RAND (Random Access), failed to activate payload channel, chNo = %u, slot = %u", m_tscc->m_slotNo, chNo, slot); + ::LogError(LOG_RF, "DMR Slot %u, , CSBK, RAND (Random Access), failed to activate payload channel, chNo = %u, slot = %u", m_tscc->m_slotNo, chNo, slot); } } else { @@ -1353,7 +1354,7 @@ void ControlSignaling::writeRF_CSBK_U_Reg_Rsp(uint32_t srcId, uint8_t serviceOpt if (!dereg) { if (m_verbose) { - LogMessage(LOG_RF, "DMR Slot %u, DT_CSBK, %s, srcId = %u, serviceOptions = $%02X", m_tscc->m_slotNo, csbk->toString().c_str(), srcId, serviceOptions); + LogMessage(LOG_RF, "DMR Slot %u, CSBK, %s, srcId = %u, serviceOptions = $%02X", m_tscc->m_slotNo, csbk->toString().c_str(), srcId, serviceOptions); } // remove dynamic unit registration table entry @@ -1362,22 +1363,22 @@ void ControlSignaling::writeRF_CSBK_U_Reg_Rsp(uint32_t srcId, uint8_t serviceOpt // if (m_slot->m_network != nullptr) // m_slot->m_network->announceUnitDeregistration(srcId); - csbk->setReason(TS_ACK_RSN_REG); + csbk->setReason(ReasonCode::TS_ACK_RSN_REG); } else { - csbk->setReason(TS_ACK_RSN_REG); + csbk->setReason(ReasonCode::TS_ACK_RSN_REG); // validate the source RID if (!acl::AccessControl::validateSrcId(srcId)) { - LogWarning(LOG_RF, "DMR Slot %u, DT_CSBK, %s, denial, RID rejection, srcId = %u", m_tscc->m_slotNo, csbk->toString().c_str(), srcId); + LogWarning(LOG_RF, "DMR Slot %u, CSBK, %s, denial, RID rejection, srcId = %u", m_tscc->m_slotNo, csbk->toString().c_str(), srcId); ::ActivityLog("DMR", true, "unit registration request from %u denied", srcId); - csbk->setReason(TS_DENY_RSN_REG_DENIED); + csbk->setReason(ReasonCode::TS_DENY_RSN_REG_DENIED); } - if (csbk->getReason() == TS_ACK_RSN_REG) { + if (csbk->getReason() == ReasonCode::TS_ACK_RSN_REG) { if (m_verbose) { - LogMessage(LOG_RF, "DMR Slot %u, DT_CSBK, %s, srcId = %u, serviceOptions = $%02X", m_tscc->m_slotNo, csbk->toString().c_str(), srcId, serviceOptions); + LogMessage(LOG_RF, "DMR Slot %u, CSBK, %s, srcId = %u, serviceOptions = $%02X", m_tscc->m_slotNo, csbk->toString().c_str(), srcId, serviceOptions); } ::ActivityLog("DMR", true, "unit registration request from %u", srcId); @@ -1392,7 +1393,7 @@ void ControlSignaling::writeRF_CSBK_U_Reg_Rsp(uint32_t srcId, uint8_t serviceOpt } } - csbk->setSrcId(DMR_WUID_REGI); + csbk->setSrcId(WUID_REGI); csbk->setDstId(srcId); writeRF_CSBK_Imm(csbk.get()); @@ -1450,18 +1451,18 @@ void ControlSignaling::writeRF_CSBK_Payload_Activate(uint32_t dstId, uint32_t sr std::unique_ptr csbk = std::make_unique(); if (voice) { if (grp) { - csbk->setCSBKO(CSBKO_TV_GRANT); + csbk->setCSBKO(CSBKO::TV_GRANT); } else { - csbk->setCSBKO(CSBKO_PV_GRANT); + csbk->setCSBKO(CSBKO::PV_GRANT); } } else { if (grp) { - csbk->setCSBKO(CSBKO_TD_GRANT); + csbk->setCSBKO(CSBKO::TD_GRANT); } else { - csbk->setCSBKO(CSBKO_PD_GRANT); + csbk->setCSBKO(CSBKO::PD_GRANT); } } @@ -1474,7 +1475,7 @@ void ControlSignaling::writeRF_CSBK_Payload_Activate(uint32_t dstId, uint32_t sr csbk->setDstId(dstId); if (m_verbose) { - LogMessage(LOG_RF, "DMR Slot %u, DT_CSBK, %s, csbko = $%02X, chNo = %u, slot = %u, srcId = %u, dstId = %u", + LogMessage(LOG_RF, "DMR Slot %u, CSBK, %s, csbko = $%02X, chNo = %u, slot = %u, srcId = %u, dstId = %u", m_slot->m_slotNo, csbk->toString().c_str(), csbk->getCSBKO(), csbk->getLogicalCh1(), csbk->getSlotNo(), srcId, dstId); } @@ -1505,7 +1506,7 @@ void ControlSignaling::writeRF_CSBK_Payload_Clear(uint32_t dstId, uint32_t srcId csbk->setDstId(dstId); if (m_verbose) { - LogMessage(LOG_RF, "DMR Slot %u, DT_CSBK, %s, group = %u, chNo = %u, slot = %u, srcId = %u, dstId = %u", + LogMessage(LOG_RF, "DMR Slot %u, CSBK, %s, group = %u, chNo = %u, slot = %u, srcId = %u, dstId = %u", m_slot->m_slotNo, csbk->toString().c_str(), csbk->getGI(), csbk->getLogicalCh1(), csbk->getSlotNo(), srcId, dstId); } @@ -1540,14 +1541,14 @@ void ControlSignaling::writeRF_TSCC_Bcast_Ann_Wd(uint32_t channelNo, bool annWd, std::unique_ptr csbk = std::make_unique(); csbk->siteIdenEntry(m_slot->m_idenEntry); csbk->setCdef(false); - csbk->setAnncType(BCAST_ANNC_ANN_WD_TSCC); + csbk->setAnncType(BroadcastAnncType::ANN_WD_TSCC); csbk->setLogicalCh1(channelNo); csbk->setAnnWdCh1(annWd); csbk->setSystemId(systemIdentity); csbk->setRequireReg(requireReg); if (m_debug) { - LogMessage(LOG_RF, "DMR Slot %u, DT_CSBK, %s, channelNo = %u, annWd = %u", + LogMessage(LOG_RF, "DMR Slot %u, CSBK, %s, channelNo = %u, annWd = %u", m_slot->m_slotNo, csbk->toString().c_str(), channelNo, annWd); } @@ -1561,7 +1562,7 @@ void ControlSignaling::writeRF_TSCC_Bcast_Sys_Parm() { std::unique_ptr csbk = std::make_unique(); DEBUG_LOG_CSBK(csbk->toString()); - csbk->setAnncType(BCAST_ANNC_SITE_PARMS); + csbk->setAnncType(BroadcastAnncType::SITE_PARMS); writeRF_CSBK(csbk.get()); } diff --git a/src/host/dmr/packet/Data.cpp b/src/host/dmr/packet/Data.cpp index 41913186..5c462694 100644 --- a/src/host/dmr/packet/Data.cpp +++ b/src/host/dmr/packet/Data.cpp @@ -9,7 +9,7 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2015,2016,2017,2018 Jonathan Naylor, G4KLX -* Copyright (C) 2017-2023 Bryan Biedenkapp, N2PLL +* Copyright (C) 2017-2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -27,6 +27,7 @@ #include "ActivityLog.h" using namespace dmr; +using namespace dmr::defines; using namespace dmr::packet; #include @@ -84,20 +85,20 @@ bool Data::process(uint8_t* data, uint32_t len) { assert(data != nullptr); - // Get the type from the packet metadata - uint8_t dataType = data[1U] & 0x0FU; + // get the type from the packet metadata + DataType::E dataType = (DataType::E)(data[1U] & 0x0FU); SlotType slotType; slotType.setColorCode(m_slot->m_colorCode); slotType.setDataType(dataType); - if (dataType == DT_TERMINATOR_WITH_LC) { + if (dataType == DataType::TERMINATOR_WITH_LC) { if (m_slot->m_rfState != RS_RF_AUDIO) return false; // Regenerate the LC data lc::FullLC fullLC; - fullLC.encode(*m_slot->m_rfLC, data + 2U, DT_TERMINATOR_WITH_LC); + fullLC.encode(*m_slot->m_rfLC, data + 2U, DataType::TERMINATOR_WITH_LC); // Regenerate the Slot Type slotType.encode(data + 2U); @@ -109,7 +110,7 @@ bool Data::process(uint8_t* data, uint32_t len) data[0U] = modem::TAG_EOT; data[1U] = 0x00U; - m_slot->writeNetwork(data, DT_TERMINATOR_WITH_LC); + m_slot->writeNetwork(data, DataType::TERMINATOR_WITH_LC); if (m_slot->m_duplex) { for (uint32_t i = 0U; i < m_slot->m_hangCount; i++) @@ -154,7 +155,7 @@ bool Data::process(uint8_t* data, uint32_t len) return true; } } - else if (dataType == DT_DATA_HEADER) { + else if (dataType == DataType::DATA_HEADER) { if (m_slot->m_rfState == RS_RF_DATA) return true; @@ -178,7 +179,7 @@ bool Data::process(uint8_t* data, uint32_t len) // validate the source RID if (!acl::AccessControl::validateSrcId(srcId)) { - LogWarning(LOG_RF, "DMR Slot %u, DT_DATA_HEADER denial, RID rejection, srcId = %u", m_slot->m_slotNo, srcId); + LogWarning(LOG_RF, "DMR Slot %u, DATA_HEADER denial, RID rejection, srcId = %u", m_slot->m_slotNo, srcId); m_slot->m_rfState = RS_RF_REJECTED; return false; } @@ -186,7 +187,7 @@ bool Data::process(uint8_t* data, uint32_t len) // validate the target ID if (gi) { if (!acl::AccessControl::validateTGId(m_slot->m_slotNo, dstId)) { - LogWarning(LOG_RF, "DMR Slot %u, DT_DATA_HEADER denial, TGID rejection, srcId = %u, dstId = %u", m_slot->m_slotNo, srcId, dstId); + LogWarning(LOG_RF, "DMR Slot %u, DATA_HEADER denial, TGID rejection, srcId = %u, dstId = %u", m_slot->m_slotNo, srcId, dstId); m_slot->m_rfState = RS_RF_REJECTED; return false; } @@ -194,7 +195,7 @@ bool Data::process(uint8_t* data, uint32_t len) m_slot->m_rfFrames = dataHeader->getBlocks(); m_slot->m_rfSeqNo = 0U; - m_slot->m_rfLC = std::make_unique(gi ? FLCO_GROUP : FLCO_PRIVATE, srcId, dstId); + m_slot->m_rfLC = std::make_unique(gi ? FLCO::GROUP : FLCO::PRIVATE, srcId, dstId); // Regenerate the data header dataHeader->encode(data + 2U); @@ -211,14 +212,14 @@ bool Data::process(uint8_t* data, uint32_t len) if (m_slot->m_duplex && m_repeatDataPacket) m_slot->addFrame(data); - m_slot->writeNetwork(data, DT_DATA_HEADER); + m_slot->writeNetwork(data, DataType::DATA_HEADER); m_slot->m_rfState = RS_RF_DATA; m_slot->m_rfLastDstId = dstId; m_slot->m_rfLastSrcId = srcId; if (m_slot->m_netState == RS_NET_IDLE) { - m_slot->setShortLC(m_slot->m_slotNo, dstId, gi ? FLCO_GROUP : FLCO_PRIVATE, false); + m_slot->setShortLC(m_slot->m_slotNo, dstId, gi ? FLCO::GROUP : FLCO::PRIVATE, false); } if (m_verbose) { @@ -229,7 +230,7 @@ bool Data::process(uint8_t* data, uint32_t len) ::ActivityLog("DMR", true, "Slot %u RF data header from %u to %s%u, %u blocks", m_slot->m_slotNo, srcId, gi ? "TG " : "", dstId, m_slot->m_rfFrames); - ::memset(m_pduUserData, 0x00U, DMR_MAX_PDU_COUNT * DMR_MAX_PDU_LENGTH + 2U); + ::memset(m_pduUserData, 0x00U, MAX_PDU_COUNT * MAX_PDU_LENGTH + 2U); m_pduDataOffset = 0U; if (m_slot->m_rfFrames == 0U) { @@ -239,7 +240,7 @@ bool Data::process(uint8_t* data, uint32_t len) return true; } - else if (dataType == DT_RATE_12_DATA || dataType == DT_RATE_34_DATA || dataType == DT_RATE_1_DATA) { + else if (dataType == DataType::RATE_12_DATA || dataType == DataType::RATE_34_DATA || dataType == DataType::RATE_1_DATA) { if (m_slot->m_rfState != RS_RF_DATA || m_slot->m_rfFrames == 0U) return false; @@ -247,7 +248,7 @@ bool Data::process(uint8_t* data, uint32_t len) edac::Trellis trellis; // decode the rate 1/2 payload - if (dataType == DT_RATE_12_DATA) { + if (dataType == DataType::RATE_12_DATA) { // decode the BPTC (196,96) FEC uint8_t payload[12U]; bptc.decode(data + 2U, payload); @@ -259,7 +260,7 @@ bool Data::process(uint8_t* data, uint32_t len) // encode the BPTC (196,96) FEC bptc.encode(payload, data + 2U); } - else if (dataType == DT_RATE_34_DATA) { + else if (dataType == DataType::RATE_34_DATA) { // decode the Trellis 3/4 rate FEC uint8_t payload[18U]; bool ret = trellis.decode34(data + 2U, payload); @@ -271,7 +272,7 @@ bool Data::process(uint8_t* data, uint32_t len) trellis.encode34(payload, data + 2U); } else { - LogWarning(LOG_RF, "DMR Slot %u, DT_RATE_34_DATA, unfixable RF rate 3/4 data", m_slot->m_slotNo); + LogWarning(LOG_RF, "DMR Slot %u, RATE_34_DATA, unfixable RF rate 3/4 data", m_slot->m_slotNo); Utils::dump(1U, "Unfixable PDU Data", data + 2U, DMR_FRAME_LENGTH_BYTES); } @@ -300,15 +301,15 @@ bool Data::process(uint8_t* data, uint32_t len) Utils::dump(1U, "PDU Packet", m_pduUserData, m_pduDataOffset); } - LogMessage(LOG_RF, "DMR Slot %u, DT_RATE_12/34_DATA, ended data transmission", m_slot->m_slotNo); + LogMessage(LOG_RF, "DMR Slot %u, RATE_12/34_DATA, ended data transmission", m_slot->m_slotNo); m_slot->writeEndRF(); } if (m_verbose) { - if (dataType == DT_RATE_12_DATA) { + if (dataType == DataType::RATE_12_DATA) { LogMessage(LOG_RF, DMR_DT_RATE_12_DATA ", block = %u", m_slot->m_rfFrames + 1); } - else if (dataType == DT_RATE_34_DATA) { + else if (dataType == DataType::RATE_34_DATA) { LogMessage(LOG_RF, DMR_DT_RATE_34_DATA ", block = %u", m_slot->m_rfFrames + 1); } else { @@ -333,18 +334,18 @@ void Data::processNetwork(const data::Data& dmrData) uint8_t data[DMR_FRAME_LENGTH_BYTES + 2U]; dmrData.getData(data + 2U); - if (dataType == DT_TERMINATOR_WITH_LC) { + if (dataType == DataType::TERMINATOR_WITH_LC) { if (m_slot->m_netState != RS_NET_AUDIO) return; // Regenerate the LC data lc::FullLC fullLC; - fullLC.encode(*m_slot->m_netLC, data + 2U, DT_TERMINATOR_WITH_LC); + fullLC.encode(*m_slot->m_netLC, data + 2U, DataType::TERMINATOR_WITH_LC); // Regenerate the Slot Type SlotType slotType; slotType.setColorCode(m_slot->m_colorCode); - slotType.setDataType(DT_TERMINATOR_WITH_LC); + slotType.setDataType(DataType::TERMINATOR_WITH_LC); slotType.encode(data + 2U); // Convert the Data Sync to be from the BS or MS as needed @@ -386,14 +387,14 @@ void Data::processNetwork(const data::Data& dmrData) m_slot->writeEndNet(); } - else if (dataType == DT_DATA_HEADER) { + else if (dataType == DataType::DATA_HEADER) { if (m_slot->m_netState == RS_NET_DATA) return; data::DataHeader* dataHeader = new data::DataHeader(); bool valid = dataHeader->decode(data + 2U); if (!valid) { - LogError(LOG_NET, "DMR Slot %u, DT_DATA_HEADER, unable to decode the network data header", m_slot->m_slotNo); + LogError(LOG_NET, "DMR Slot %u, DataType::DATA_HEADER, unable to decode the network data header", m_slot->m_slotNo); return; } @@ -411,7 +412,7 @@ void Data::processNetwork(const data::Data& dmrData) } m_slot->m_netFrames = dataHeader->getBlocks(); - m_slot->m_netLC = std::make_unique(gi ? FLCO_GROUP : FLCO_PRIVATE, srcId, dstId); + m_slot->m_netLC = std::make_unique(gi ? FLCO::GROUP : FLCO::PRIVATE, srcId, dstId); // Regenerate the data header dataHeader->encode(data + 2U); @@ -419,7 +420,7 @@ void Data::processNetwork(const data::Data& dmrData) // Regenerate the Slot Type SlotType slotType; slotType.setColorCode(m_slot->m_colorCode); - slotType.setDataType(DT_DATA_HEADER); + slotType.setDataType(DataType::DATA_HEADER); slotType.encode(data + 2U); // Convert the Data Sync to be from the BS or MS as needed @@ -438,7 +439,7 @@ void Data::processNetwork(const data::Data& dmrData) m_slot->m_netLastDstId = dstId; m_slot->m_netLastSrcId = srcId; - m_slot->setShortLC(m_slot->m_slotNo, dstId, gi ? FLCO_GROUP : FLCO_PRIVATE, false); + m_slot->setShortLC(m_slot->m_slotNo, dstId, gi ? FLCO::GROUP : FLCO::PRIVATE, false); if (m_verbose) { LogMessage(LOG_NET, DMR_DT_DATA_HEADER ", slot = %u, dpf = $%02X, sap = $%02X, fullMessage = %u, blocksToFollow = %u, padCount = %u, seqNo = %u, dstId = %u, srcId = %u, group = %u", @@ -449,7 +450,7 @@ void Data::processNetwork(const data::Data& dmrData) ::ActivityLog("DMR", false, "Slot %u network data header from %u to %s%u, %u blocks", m_slot->m_slotNo, srcId, gi ? "TG " : "", dstId, m_slot->m_netFrames); - ::memset(m_pduUserData, 0x00U, DMR_MAX_PDU_COUNT * DMR_MAX_PDU_LENGTH + 2U); + ::memset(m_pduUserData, 0x00U, MAX_PDU_COUNT * MAX_PDU_LENGTH + 2U); m_pduDataOffset = 0U; if (m_slot->m_netFrames == 0U) { @@ -457,14 +458,14 @@ void Data::processNetwork(const data::Data& dmrData) m_slot->writeEndNet(); } } - else if (dataType == DT_RATE_12_DATA || dataType == DT_RATE_34_DATA || dataType == DT_RATE_1_DATA) { + else if (dataType == DataType::RATE_12_DATA || dataType == DataType::RATE_34_DATA || dataType == DataType::RATE_1_DATA) { if (m_slot->m_netState != RS_NET_DATA || m_slot->m_netFrames == 0U) { m_slot->writeEndNet(); return; } // regenerate the rate 1/2 payload - if (dataType == DT_RATE_12_DATA) { + if (dataType == DataType::RATE_12_DATA) { // decode the BPTC (196,96) FEC edac::BPTC19696 bptc; uint8_t payload[12U]; @@ -477,7 +478,7 @@ void Data::processNetwork(const data::Data& dmrData) // encode the BPTC (196,96) FEC bptc.encode(payload, data + 2U); } - else if (dataType == DT_RATE_34_DATA) { + else if (dataType == DataType::RATE_34_DATA) { // decode the Trellis 3/4 rate FEC edac::Trellis trellis; uint8_t payload[18U]; @@ -490,7 +491,7 @@ void Data::processNetwork(const data::Data& dmrData) trellis.encode34(payload, data + 2U); } else { - LogWarning(LOG_NET, "DMR Slot %u, DT_RATE_34_DATA, unfixable network rate 3/4 data", m_slot->m_slotNo); + LogWarning(LOG_NET, "DMR Slot %u, RATE_34_DATA, unfixable network rate 3/4 data", m_slot->m_slotNo); Utils::dump(1U, "Data", data + 2U, DMR_FRAME_LENGTH_BYTES); } @@ -515,10 +516,10 @@ void Data::processNetwork(const data::Data& dmrData) m_slot->addFrame(data, true); if (m_verbose) { - if (dataType == DT_RATE_12_DATA) { + if (dataType == DataType::RATE_12_DATA) { LogMessage(LOG_RF, DMR_DT_RATE_12_DATA ", block = %u", m_slot->m_netFrames + 1); } - else if (dataType == DT_RATE_34_DATA) { + else if (dataType == DataType::RATE_34_DATA) { LogMessage(LOG_RF, DMR_DT_RATE_34_DATA ", block = %u", m_slot->m_netFrames + 1); } else { @@ -532,7 +533,7 @@ void Data::processNetwork(const data::Data& dmrData) Utils::dump(1U, "PDU Packet", m_pduUserData, m_pduDataOffset); } - LogMessage(LOG_NET, "DMR Slot %u, DT_RATE_12/34_DATA, ended data transmission", m_slot->m_slotNo); + LogMessage(LOG_NET, "DMR Slot %u, RATE_12/34_DATA, ended data transmission", m_slot->m_slotNo); m_slot->writeEndNet(); } } @@ -565,8 +566,8 @@ Data::Data(Slot* slot, network::BaseNetwork* network, bool dumpDataPacket, bool m_verbose(verbose), m_debug(debug) { - m_pduUserData = new uint8_t[DMR_MAX_PDU_COUNT * DMR_MAX_PDU_LENGTH + 2U]; - ::memset(m_pduUserData, 0x00U, DMR_MAX_PDU_COUNT * DMR_MAX_PDU_LENGTH + 2U); + m_pduUserData = new uint8_t[MAX_PDU_COUNT * MAX_PDU_LENGTH + 2U]; + ::memset(m_pduUserData, 0x00U, MAX_PDU_COUNT * MAX_PDU_LENGTH + 2U); } /// diff --git a/src/host/dmr/packet/Voice.cpp b/src/host/dmr/packet/Voice.cpp index 1a487d3c..ae1a29e9 100644 --- a/src/host/dmr/packet/Voice.cpp +++ b/src/host/dmr/packet/Voice.cpp @@ -9,7 +9,7 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2015,2016,2017,2018 Jonathan Naylor, G4KLX -* Copyright (C) 2017-2023 Bryan Biedenkapp, N2PLL +* Copyright (C) 2017-2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -26,6 +26,7 @@ #include "ActivityLog.h" using namespace dmr; +using namespace dmr::defines; using namespace dmr::packet; #include @@ -90,28 +91,28 @@ bool Voice::process(uint8_t* data, uint32_t len) { assert(data != nullptr); - bool dataSync = (data[1U] & DMR_SYNC_DATA) == DMR_SYNC_DATA; - bool voiceSync = (data[1U] & DMR_SYNC_VOICE) == DMR_SYNC_VOICE; + bool dataSync = (data[1U] & SYNC_DATA) == SYNC_DATA; + bool voiceSync = (data[1U] & SYNC_VOICE) == SYNC_VOICE; if (dataSync) { - uint8_t dataType = data[1U] & 0x0FU; + DataType::E dataType = (DataType::E)(data[1U] & 0x0FU); SlotType slotType; slotType.setColorCode(m_slot->m_colorCode); slotType.setDataType(dataType); - if (dataType == DT_VOICE_LC_HEADER) { + if (dataType == DataType::VOICE_LC_HEADER) { if (m_slot->m_rfState == RS_RF_AUDIO) return true; lc::FullLC fullLC; - std::unique_ptr lc = fullLC.decode(data + 2U, DT_VOICE_LC_HEADER); + std::unique_ptr lc = fullLC.decode(data + 2U, DataType::VOICE_LC_HEADER); if (lc == nullptr) return false; uint32_t srcId = lc->getSrcId(); uint32_t dstId = lc->getDstId(); - uint8_t flco = lc->getFLCO(); + FLCO::E flco = lc->getFLCO(); CHECK_AUTHORITATIVE(dstId); CHECK_TRAFFIC_COLLISION(dstId); @@ -123,8 +124,8 @@ bool Voice::process(uint8_t* data, uint32_t len) // validate source RID if (!acl::AccessControl::validateSrcId(srcId)) { if (m_slot->m_data->m_lastRejectId == 0U || m_slot->m_data->m_lastRejectId == srcId) { - LogWarning(LOG_RF, "DMR Slot %u, DT_VOICE_LC_HEADER denial, RID rejection, srcId = %u", m_slot->m_slotNo, srcId); - ::ActivityLog("DMR", true, "Slot %u RF voice rejection from %u to %s%u ", m_slot->m_slotNo, srcId, flco == FLCO_GROUP ? "TG " : "", dstId); + LogWarning(LOG_RF, "DMR Slot %u, VOICE_LC_HEADER denial, RID rejection, srcId = %u", m_slot->m_slotNo, srcId); + ::ActivityLog("DMR", true, "Slot %u RF voice rejection from %u to %s%u ", m_slot->m_slotNo, srcId, flco == FLCO::GROUP ? "TG " : "", dstId); } m_slot->m_rfLastDstId = 0U; @@ -136,10 +137,10 @@ bool Voice::process(uint8_t* data, uint32_t len) } // validate target TID, if the target is a talkgroup - if (flco == FLCO_GROUP) { + if (flco == FLCO::GROUP) { if (!acl::AccessControl::validateTGId(m_slot->m_slotNo, dstId)) { if (m_slot->m_data->m_lastRejectId == 0U || m_slot->m_data->m_lastRejectId == dstId) { - LogWarning(LOG_RF, "DMR Slot %u, DT_VOICE_LC_HEADER denial, TGID rejection, srcId = %u, dstId = %u", m_slot->m_slotNo, srcId, dstId); + LogWarning(LOG_RF, "DMR Slot %u, VOICE_LC_HEADER denial, TGID rejection, srcId = %u, dstId = %u", m_slot->m_slotNo, srcId, dstId); ::ActivityLog("DMR", true, "Slot %u RF voice rejection from %u to TG %u ", m_slot->m_slotNo, srcId, dstId); } @@ -168,7 +169,7 @@ bool Voice::process(uint8_t* data, uint32_t len) m_slot->m_voice->m_rfEmbeddedData[1U].setLC(*m_slot->m_rfLC); // Regenerate the LC data - fullLC.encode(*m_slot->m_rfLC, data + 2U, DT_VOICE_LC_HEADER); + fullLC.encode(*m_slot->m_rfLC, data + 2U, DataType::VOICE_LC_HEADER); // Regenerate the Slot Type slotType.encode(data + 2U); @@ -189,7 +190,7 @@ bool Voice::process(uint8_t* data, uint32_t len) m_slot->m_voice->m_rfEmbeddedReadN = 0U; m_slot->m_voice->m_rfEmbeddedWriteN = 1U; - m_slot->m_voice->m_rfTalkerId = TALKER_ID_NONE; + m_slot->m_voice->m_rfTalkerId = TalkerID::NONE; m_slot->m_minRSSI = m_slot->m_rssi; m_slot->m_maxRSSI = m_slot->m_rssi; @@ -204,7 +205,7 @@ bool Voice::process(uint8_t* data, uint32_t len) m_slot->addFrame(data); } - m_slot->writeNetwork(data, DT_VOICE_LC_HEADER); + m_slot->writeNetwork(data, DataType::VOICE_LC_HEADER); m_slot->m_rfState = RS_RF_AUDIO; m_slot->m_rfLastDstId = dstId; @@ -219,17 +220,17 @@ bool Voice::process(uint8_t* data, uint32_t len) m_slot->m_rfLC->getSrcId(), m_slot->m_rfLC->getDstId(), m_slot->m_rfLC->getFLCO(), m_slot->m_rfLC->getFID(), m_slot->m_rfLC->getPF()); } - ::ActivityLog("DMR", true, "Slot %u RF %svoice header from %u to %s%u", m_slot->m_slotNo, encrypted ? "encrypted " : "", srcId, flco == FLCO_GROUP ? "TG " : "", dstId); + ::ActivityLog("DMR", true, "Slot %u RF %svoice header from %u to %s%u", m_slot->m_slotNo, encrypted ? "encrypted " : "", srcId, flco == FLCO::GROUP ? "TG " : "", dstId); return true; } - else if (dataType == DT_VOICE_PI_HEADER) { + else if (dataType == DataType::VOICE_PI_HEADER) { if (m_slot->m_rfState != RS_RF_AUDIO) return false; lc::FullLC fullLC; std::unique_ptr lc = fullLC.decodePI(data + 2U); if (lc == nullptr) { - LogWarning(LOG_RF, "DMR Slot %u, DT_VOICE_PI_HEADER, bad LC received, replacing", m_slot->m_slotNo); + LogWarning(LOG_RF, "DMR Slot %u, VOICE_PI_HEADER, bad LC received, replacing", m_slot->m_slotNo); lc = std::make_unique(); lc->setDstId(m_slot->m_rfLC->getDstId()); } @@ -251,7 +252,7 @@ bool Voice::process(uint8_t* data, uint32_t len) if (m_slot->m_duplex) m_slot->addFrame(data); - m_slot->writeNetwork(data, DT_VOICE_PI_HEADER); + m_slot->writeNetwork(data, DataType::VOICE_PI_HEADER); if (m_verbose) { LogMessage(LOG_RF, DMR_DT_VOICE_PI_HEADER ", slot = %u, algId = %u, kId = %u, dstId = %u", m_slot->m_slotNo, @@ -309,7 +310,7 @@ bool Voice::process(uint8_t* data, uint32_t len) if (m_slot->m_duplex) m_slot->addFrame(data); - m_slot->writeNetwork(data, DT_VOICE_SYNC, errors); + m_slot->writeNetwork(data, DataType::VOICE_SYNC, errors); return true; } @@ -382,13 +383,13 @@ bool Voice::process(uint8_t* data, uint32_t len) char text[80U]; switch (flco) { - case FLCO_GROUP: - case FLCO_PRIVATE: + case FLCO::GROUP: + case FLCO::PRIVATE: break; - case FLCO_GPS_INFO: + case FLCO::GPS_INFO: if (m_dumpTAData) { - ::sprintf(text, "DMR Slot %u, FLCO_GPS_INFO (Embedded GPS Info)", m_slot->m_slotNo); + ::sprintf(text, "DMR Slot %u, GPS_INFO (Embedded GPS Info)", m_slot->m_slotNo); Utils::dump(2U, text, data, 9U); } @@ -397,47 +398,47 @@ bool Voice::process(uint8_t* data, uint32_t len) } break; - case FLCO_TALKER_ALIAS_HEADER: - if (!(m_rfTalkerId & TALKER_ID_HEADER)) { + case FLCO::TALKER_ALIAS_HEADER: + if (!(m_rfTalkerId & TalkerID::HEADER)) { if (m_dumpTAData) { - ::sprintf(text, "DMR Slot %u, FLCO_TALKER_ALIAS_HEADER (Embedded Talker Alias Header)", m_slot->m_slotNo); + ::sprintf(text, "DMR Slot %u, TALKER_ALIAS_HEADER (Embedded Talker Alias Header)", m_slot->m_slotNo); Utils::dump(2U, text, data, 9U); } - m_rfTalkerId |= TALKER_ID_HEADER; + m_rfTalkerId |= TalkerID::HEADER; } break; - case FLCO_TALKER_ALIAS_BLOCK1: - if (!(m_rfTalkerId & TALKER_ID_BLOCK1)) { + case FLCO::TALKER_ALIAS_BLOCK1: + if (!(m_rfTalkerId & TalkerID::BLOCK1)) { if (m_dumpTAData) { - ::sprintf(text, "DMR Slot %u, FLCO_TALKER_ALIAS_BLOCK1 (Embedded Talker Alias Block 1)", m_slot->m_slotNo); + ::sprintf(text, "DMR Slot %u, TALKER_ALIAS_BLOCK1 (Embedded Talker Alias Block 1)", m_slot->m_slotNo); Utils::dump(2U, text, data, 9U); } - m_rfTalkerId |= TALKER_ID_BLOCK1; + m_rfTalkerId |= TalkerID::BLOCK1; } break; - case FLCO_TALKER_ALIAS_BLOCK2: - if (!(m_rfTalkerId & TALKER_ID_BLOCK2)) { + case FLCO::TALKER_ALIAS_BLOCK2: + if (!(m_rfTalkerId & TalkerID::BLOCK2)) { if (m_dumpTAData) { - ::sprintf(text, "DMR Slot %u, FLCO_TALKER_ALIAS_BLOCK2 (Embedded Talker Alias Block 2)", m_slot->m_slotNo); + ::sprintf(text, "DMR Slot %u, TALKER_ALIAS_BLOCK2 (Embedded Talker Alias Block 2)", m_slot->m_slotNo); Utils::dump(2U, text, data, 9U); } - m_rfTalkerId |= TALKER_ID_BLOCK2; + m_rfTalkerId |= TalkerID::BLOCK2; } break; - case FLCO_TALKER_ALIAS_BLOCK3: - if (!(m_rfTalkerId & TALKER_ID_BLOCK3)) { + case FLCO::TALKER_ALIAS_BLOCK3: + if (!(m_rfTalkerId & TalkerID::BLOCK3)) { if (m_dumpTAData) { - ::sprintf(text, "DMR Slot %u, FLCO_TALKER_ALIAS_BLOCK3 (Embedded Talker Alias Block 3)", m_slot->m_slotNo); + ::sprintf(text, "DMR Slot %u, TALKER_ALIAS_BLOCK3 (Embedded Talker Alias Block 3)", m_slot->m_slotNo); Utils::dump(2U, text, data, 9U); } - m_rfTalkerId |= TALKER_ID_BLOCK3; + m_rfTalkerId |= TalkerID::BLOCK3; } break; @@ -463,7 +464,7 @@ bool Voice::process(uint8_t* data, uint32_t len) data[0U] = modem::TAG_DATA; data[1U] = 0x00U; - m_slot->writeNetwork(data, DT_VOICE, errors); + m_slot->writeNetwork(data, DataType::VOICE, errors); if (m_embeddedLCOnly) { // Only send the previously received LC @@ -497,22 +498,22 @@ bool Voice::process(uint8_t* data, uint32_t len) if (lc != nullptr) { uint32_t srcId = lc->getSrcId(); uint32_t dstId = lc->getDstId(); - uint8_t flco = lc->getFLCO(); + FLCO::E flco = lc->getFLCO(); CHECK_AUTHORITATIVE(dstId); CHECK_TRAFFIC_COLLISION(dstId); // validate the source RID if (!acl::AccessControl::validateSrcId(srcId)) { - LogWarning(LOG_RF, "DMR Slot %u, DT_VOICE denial, RID rejection, srcId = %u", m_slot->m_slotNo, srcId); + LogWarning(LOG_RF, "DMR Slot %u, VOICE denial, RID rejection, srcId = %u", m_slot->m_slotNo, srcId); m_slot->m_rfState = RS_RF_REJECTED; return false; } // validate the target ID, if the target is a talkgroup - if (flco == FLCO_GROUP) { + if (flco == FLCO::GROUP) { if (!acl::AccessControl::validateTGId(m_slot->m_slotNo, dstId)) { - LogWarning(LOG_RF, "DMR Slot %u, DT_VOICE denial, TGID rejection, srcId = %u, dstId = %u", m_slot->m_slotNo, srcId, dstId); + LogWarning(LOG_RF, "DMR Slot %u, VOICE denial, TGID rejection, srcId = %u, dstId = %u", m_slot->m_slotNo, srcId, dstId); m_slot->m_rfState = RS_RF_REJECTED; return false; } @@ -531,11 +532,11 @@ bool Voice::process(uint8_t* data, uint32_t len) Sync::addDMRDataSync(start + 2U, m_slot->m_duplex); lc::FullLC fullLC; - fullLC.encode(*m_slot->m_rfLC, start + 2U, DT_VOICE_LC_HEADER); + fullLC.encode(*m_slot->m_rfLC, start + 2U, DataType::VOICE_LC_HEADER); SlotType slotType; slotType.setColorCode(m_slot->m_colorCode); - slotType.setDataType(DT_VOICE_LC_HEADER); + slotType.setDataType(DataType::VOICE_LC_HEADER); slotType.encode(start + 2U); start[0U] = modem::TAG_DATA; @@ -551,7 +552,7 @@ bool Voice::process(uint8_t* data, uint32_t len) m_rfEmbeddedReadN = 0U; m_rfEmbeddedWriteN = 1U; - m_rfTalkerId = TALKER_ID_NONE; + m_rfTalkerId = TalkerID::NONE; m_slot->m_minRSSI = m_slot->m_rssi; m_slot->m_maxRSSI = m_slot->m_rssi; @@ -566,7 +567,7 @@ bool Voice::process(uint8_t* data, uint32_t len) m_slot->addFrame(start); } - m_slot->writeNetwork(start, DT_VOICE_LC_HEADER); + m_slot->writeNetwork(start, DataType::VOICE_LC_HEADER); m_rfN = data[1U] & 0x0FU; @@ -615,7 +616,7 @@ bool Voice::process(uint8_t* data, uint32_t len) if (m_slot->m_duplex) m_slot->addFrame(data); - m_slot->writeNetwork(data, DT_VOICE, errors); + m_slot->writeNetwork(data, DataType::VOICE, errors); m_slot->m_rfState = RS_RF_AUDIO; @@ -628,7 +629,7 @@ bool Voice::process(uint8_t* data, uint32_t len) m_slot->setShortLC(m_slot->m_slotNo, dstId, flco, true); } - ::ActivityLog("DMR", true, "Slot %u RF late entry from %u to %s%u", m_slot->m_slotNo, srcId, flco == FLCO_GROUP ? "TG " : "", dstId); + ::ActivityLog("DMR", true, "Slot %u RF late entry from %u to %s%u", m_slot->m_slotNo, srcId, flco == FLCO::GROUP ? "TG " : "", dstId); return true; } } @@ -648,20 +649,20 @@ void Voice::processNetwork(const data::Data& dmrData) uint8_t data[DMR_FRAME_LENGTH_BYTES + 2U]; dmrData.getData(data + 2U); - if (dataType == DT_VOICE_LC_HEADER) { + if (dataType == DataType::VOICE_LC_HEADER) { if (m_slot->m_netState == RS_NET_AUDIO) return; lc::FullLC fullLC; - std::unique_ptr lc = fullLC.decode(data + 2U, DT_VOICE_LC_HEADER); + std::unique_ptr lc = fullLC.decode(data + 2U, DataType::VOICE_LC_HEADER); if (lc == nullptr) { - LogWarning(LOG_NET, "DMR Slot %u, DT_VOICE_LC_HEADER, bad LC received from the network, replacing", m_slot->m_slotNo); + LogWarning(LOG_NET, "DMR Slot %u, VOICE_LC_HEADER, bad LC received from the network, replacing", m_slot->m_slotNo); lc = std::make_unique(dmrData.getFLCO(), dmrData.getSrcId(), dmrData.getDstId()); } uint32_t srcId = lc->getSrcId(); uint32_t dstId = lc->getDstId(); - uint8_t flco = lc->getFLCO(); + FLCO::E flco = lc->getFLCO(); CHECK_NET_AUTHORITATIVE(dstId); CHECK_NET_TRAFFIC_COLLISION(dstId); @@ -671,12 +672,12 @@ void Voice::processNetwork(const data::Data& dmrData) } if (dstId != dmrData.getDstId() || srcId != dmrData.getSrcId() || flco != dmrData.getFLCO()) - LogWarning(LOG_NET, "DMR Slot %u, DT_VOICE_LC_HEADER, header doesn't match the DMR RF header: %u->%s%u %u->%s%u", m_slot->m_slotNo, - dmrData.getSrcId(), dmrData.getFLCO() == FLCO_GROUP ? "TG" : "", dmrData.getDstId(), - srcId, flco == FLCO_GROUP ? "TG" : "", dstId); + LogWarning(LOG_NET, "DMR Slot %u, VOICE_LC_HEADER, header doesn't match the DMR RF header: %u->%s%u %u->%s%u", m_slot->m_slotNo, + dmrData.getSrcId(), dmrData.getFLCO() == FLCO::GROUP ? "TG" : "", dmrData.getDstId(), + srcId, flco == FLCO::GROUP ? "TG" : "", dstId); if (m_verbose) { - LogMessage(LOG_NET, "DMR Slot %u, DT_VOICE_LC_HEADER, srcId = %u, dstId = %u, FLCO = $%02X, FID = $%02X, PF = %u", m_slot->m_slotNo, lc->getSrcId(), lc->getDstId(), lc->getFLCO(), lc->getFID(), lc->getPF()); + LogMessage(LOG_NET, "DMR Slot %u, VOICE_LC_HEADER, srcId = %u, dstId = %u, FLCO = $%02X, FID = $%02X, PF = %u", m_slot->m_slotNo, lc->getSrcId(), lc->getDstId(), lc->getFLCO(), lc->getFID(), lc->getPF()); } m_slot->m_netLC = std::move(lc); @@ -687,12 +688,12 @@ void Voice::processNetwork(const data::Data& dmrData) m_slot->m_voice->m_netEmbeddedData[1U].setLC(*m_slot->m_netLC); // Regenerate the LC data - fullLC.encode(*m_slot->m_netLC, data + 2U, DT_VOICE_LC_HEADER); + fullLC.encode(*m_slot->m_netLC, data + 2U, DataType::VOICE_LC_HEADER); // Regenerate the Slot Type SlotType slotType; slotType.setColorCode(m_slot->m_colorCode); - slotType.setDataType(DT_VOICE_LC_HEADER); + slotType.setDataType(DataType::VOICE_LC_HEADER); slotType.encode(data + 2U); // Convert the Data Sync to be from the BS or MS as needed @@ -713,7 +714,7 @@ void Voice::processNetwork(const data::Data& dmrData) m_slot->m_voice->m_netEmbeddedReadN = 0U; m_slot->m_voice->m_netEmbeddedWriteN = 1U; - m_slot->m_voice->m_netTalkerId = TALKER_ID_NONE; + m_slot->m_voice->m_netTalkerId = TalkerID::NONE; if (m_slot->m_duplex) { m_slot->m_txQueue.clear(); @@ -744,9 +745,9 @@ void Voice::processNetwork(const data::Data& dmrData) m_slot->m_netLC->getSrcId(), m_slot->m_netLC->getDstId(), m_slot->m_netLC->getFLCO(), m_slot->m_netLC->getFID(), m_slot->m_netLC->getPF()); } - ::ActivityLog("DMR", false, "Slot %u network voice header from %u to %s%u", m_slot->m_slotNo, srcId, flco == FLCO_GROUP ? "TG " : "", dstId); + ::ActivityLog("DMR", false, "Slot %u network voice header from %u to %s%u", m_slot->m_slotNo, srcId, flco == FLCO::GROUP ? "TG " : "", dstId); } - else if (dataType == DT_VOICE_PI_HEADER) { + else if (dataType == DataType::VOICE_PI_HEADER) { if (m_slot->m_netState != RS_NET_AUDIO) { std::unique_ptr lc = std::make_unique(dmrData.getFLCO(), dmrData.getSrcId(), dmrData.getDstId()); @@ -777,11 +778,11 @@ void Voice::processNetwork(const data::Data& dmrData) Sync::addDMRDataSync(start + 2U, m_slot->m_duplex); lc::FullLC fullLC; - fullLC.encode(*m_slot->m_netLC, start + 2U, DT_VOICE_LC_HEADER); + fullLC.encode(*m_slot->m_netLC, start + 2U, DataType::VOICE_LC_HEADER); SlotType slotType; slotType.setColorCode(m_slot->m_colorCode); - slotType.setDataType(DT_VOICE_LC_HEADER); + slotType.setDataType(DataType::VOICE_LC_HEADER); slotType.encode(start + 2U); start[0U] = modem::TAG_DATA; @@ -809,13 +810,13 @@ void Voice::processNetwork(const data::Data& dmrData) m_slot->setShortLC(m_slot->m_slotNo, dstId, m_slot->m_netLC->getFLCO(), true); ::ActivityLog("DMR", false, "Slot %u network late entry from %u to %s%u", - m_slot->m_slotNo, srcId, m_slot->m_netLC->getFLCO() == FLCO_GROUP ? "TG " : "", dstId); + m_slot->m_slotNo, srcId, m_slot->m_netLC->getFLCO() == FLCO::GROUP ? "TG " : "", dstId); } lc::FullLC fullLC; std::unique_ptr lc = fullLC.decodePI(data + 2U); if (lc == nullptr) { - LogWarning(LOG_NET, "DMR Slot %u, DT_VOICE_PI_HEADER, bad LC received, replacing", m_slot->m_slotNo); + LogWarning(LOG_NET, "DMR Slot %u, VOICE_PI_HEADER, bad LC received, replacing", m_slot->m_slotNo); lc = std::make_unique(); lc->setDstId(dmrData.getDstId()); } @@ -828,7 +829,7 @@ void Voice::processNetwork(const data::Data& dmrData) // Regenerate the Slot Type SlotType slotType; slotType.setColorCode(m_slot->m_colorCode); - slotType.setDataType(DT_VOICE_PI_HEADER); + slotType.setDataType(DataType::VOICE_PI_HEADER); slotType.encode(data + 2U); // Convert the Data Sync to be from the BS or MS as needed @@ -844,7 +845,7 @@ void Voice::processNetwork(const data::Data& dmrData) m_slot->m_netPrivacyLC->getAlgId(), m_slot->m_netPrivacyLC->getKId(), m_slot->m_netPrivacyLC->getDstId()); } } - else if (dataType == DT_VOICE_SYNC) { + else if (dataType == DataType::VOICE_SYNC) { if (m_slot->m_netState == RS_NET_IDLE) { std::unique_ptr lc = std::make_unique(dmrData.getFLCO(), dmrData.getSrcId(), dmrData.getDstId()); @@ -879,11 +880,11 @@ void Voice::processNetwork(const data::Data& dmrData) Sync::addDMRDataSync(start + 2U, m_slot->m_duplex); lc::FullLC fullLC; - fullLC.encode(*m_slot->m_netLC, start + 2U, DT_VOICE_LC_HEADER); + fullLC.encode(*m_slot->m_netLC, start + 2U, DataType::VOICE_LC_HEADER); SlotType slotType; slotType.setColorCode(m_slot->m_colorCode); - slotType.setDataType(DT_VOICE_LC_HEADER); + slotType.setDataType(DataType::VOICE_LC_HEADER); slotType.encode(start + 2U); start[0U] = modem::TAG_DATA; @@ -905,7 +906,7 @@ void Voice::processNetwork(const data::Data& dmrData) m_netEmbeddedReadN = 0U; m_netEmbeddedWriteN = 1U; - m_netTalkerId = TALKER_ID_NONE; + m_netTalkerId = TalkerID::NONE; m_slot->m_netState = RS_NET_AUDIO; m_slot->m_netLastDstId = dstId; @@ -915,7 +916,7 @@ void Voice::processNetwork(const data::Data& dmrData) m_slot->setShortLC(m_slot->m_slotNo, dstId, m_slot->m_netLC->getFLCO(), true); ::ActivityLog("DMR", false, "Slot %u network late entry from %u to %s%u", - m_slot->m_slotNo, srcId, m_slot->m_netLC->getFLCO() == FLCO_GROUP ? "TG " : "", dstId); + m_slot->m_slotNo, srcId, m_slot->m_netLC->getFLCO() == FLCO::GROUP ? "TG " : "", dstId); } if (m_slot->m_netState == RS_NET_AUDIO) { @@ -923,7 +924,7 @@ void Voice::processNetwork(const data::Data& dmrData) if (fid == FID_ETSI || fid == FID_DMRA) { m_slot->m_netErrs += m_fec.regenerateDMR(data + 2U); if (m_verbose) { - LogMessage(LOG_NET, "DMR Slot %u, DT_VOICE_SYNC audio, sequence no = %u, errs = %u/141 (%.1f%%)", + LogMessage(LOG_NET, "DMR Slot %u, VOICE_SYNC audio, sequence no = %u, errs = %u/141 (%.1f%%)", m_slot->m_slotNo, m_netN, m_slot->m_netErrs, float(m_slot->m_netErrs) / 1.41F); } } @@ -965,7 +966,7 @@ void Voice::processNetwork(const data::Data& dmrData) m_netN = dmrData.getN(); } } - else if (dataType == DT_VOICE) { + else if (dataType == DataType::VOICE) { if (m_slot->m_netState != RS_NET_AUDIO) return; @@ -995,55 +996,55 @@ void Voice::processNetwork(const data::Data& dmrData) char text[80U]; switch (flco) { - case FLCO_GROUP: - case FLCO_PRIVATE: + case FLCO::GROUP: + case FLCO::PRIVATE: break; - case FLCO_GPS_INFO: + case FLCO::GPS_INFO: if (m_dumpTAData) { - ::sprintf(text, "DMR Slot %u, FLCO_GPS_INFO (Embedded GPS Info)", m_slot->m_slotNo); + ::sprintf(text, "DMR Slot %u, GPS_INFO (Embedded GPS Info)", m_slot->m_slotNo); Utils::dump(2U, text, data, 9U); } logGPSPosition(m_slot->m_netLC->getSrcId(), data); break; - case FLCO_TALKER_ALIAS_HEADER: - if (!(m_netTalkerId & TALKER_ID_HEADER)) { + case FLCO::TALKER_ALIAS_HEADER: + if (!(m_netTalkerId & TalkerID::HEADER)) { if (m_dumpTAData) { - ::sprintf(text, "DMR Slot %u, FLCO_TALKER_ALIAS_HEADER (Embedded Talker Alias Header)", m_slot->m_slotNo); + ::sprintf(text, "DMR Slot %u, TALKER_ALIAS_HEADER (Embedded Talker Alias Header)", m_slot->m_slotNo); Utils::dump(2U, text, data, 9U); } - m_netTalkerId |= TALKER_ID_HEADER; + m_netTalkerId |= TalkerID::HEADER; } break; - case FLCO_TALKER_ALIAS_BLOCK1: - if (!(m_netTalkerId & TALKER_ID_BLOCK1)) { + case FLCO::TALKER_ALIAS_BLOCK1: + if (!(m_netTalkerId & TalkerID::BLOCK1)) { if (m_dumpTAData) { - ::sprintf(text, "DMR Slot %u, FLCO_TALKER_ALIAS_BLOCK1 (Embedded Talker Alias Block 1)", m_slot->m_slotNo); + ::sprintf(text, "DMR Slot %u, TALKER_ALIAS_BLOCK1 (Embedded Talker Alias Block 1)", m_slot->m_slotNo); Utils::dump(2U, text, data, 9U); } - m_netTalkerId |= TALKER_ID_BLOCK1; + m_netTalkerId |= TalkerID::BLOCK1; } break; - case FLCO_TALKER_ALIAS_BLOCK2: - if (!(m_netTalkerId & TALKER_ID_BLOCK2)) { + case FLCO::TALKER_ALIAS_BLOCK2: + if (!(m_netTalkerId & TalkerID::BLOCK2)) { if (m_dumpTAData) { - ::sprintf(text, "DMR Slot %u, FLCO_TALKER_ALIAS_BLOCK2 (Embedded Talker Alias Block 2)", m_slot->m_slotNo); + ::sprintf(text, "DMR Slot %u, TALKER_ALIAS_BLOCK2 (Embedded Talker Alias Block 2)", m_slot->m_slotNo); Utils::dump(2U, text, data, 9U); } - m_netTalkerId |= TALKER_ID_BLOCK2; + m_netTalkerId |= TalkerID::BLOCK2; } break; - case FLCO_TALKER_ALIAS_BLOCK3: - if (!(m_netTalkerId & TALKER_ID_BLOCK3)) { + case FLCO::TALKER_ALIAS_BLOCK3: + if (!(m_netTalkerId & TalkerID::BLOCK3)) { if (m_dumpTAData) { - ::sprintf(text, "DMR Slot %u, FLCO_TALKER_ALIAS_BLOCK3 (Embedded Talker Alias Block 3)", m_slot->m_slotNo); + ::sprintf(text, "DMR Slot %u, TALKER_ALIAS_BLOCK3 (Embedded Talker Alias Block 3)", m_slot->m_slotNo); Utils::dump(2U, text, data, 9U); } - m_netTalkerId |= TALKER_ID_BLOCK3; + m_netTalkerId |= TalkerID::BLOCK3; } break; default: @@ -1128,8 +1129,8 @@ Voice::Voice(Slot* slot, network::BaseNetwork* network, bool embeddedLCOnly, boo m_netEmbeddedData(nullptr), m_netEmbeddedReadN(0U), m_netEmbeddedWriteN(1U), - m_rfTalkerId(TALKER_ID_NONE), - m_netTalkerId(TALKER_ID_NONE), + m_rfTalkerId(TalkerID::NONE), + m_netTalkerId(TalkerID::NONE), m_fec(), m_embeddedLCOnly(embeddedLCOnly), m_dumpTAData(dumpTAData), @@ -1211,11 +1212,11 @@ void Voice::logGPSPosition(const uint32_t srcId, const uint8_t* data) /// void Voice::insertNullAudio(uint8_t* data) { - uint8_t* ambeBuffer = new uint8_t[dmr::DMR_AMBE_LENGTH_BYTES]; - ::memset(ambeBuffer, 0x00U, dmr::DMR_AMBE_LENGTH_BYTES); + uint8_t* ambeBuffer = new uint8_t[DMR_AMBE_LENGTH_BYTES]; + ::memset(ambeBuffer, 0x00U, DMR_AMBE_LENGTH_BYTES); for (uint32_t i = 0; i < 3U; i++) { - ::memcpy(ambeBuffer + (i * 9U), DMR_NULL_AMBE, 9U); + ::memcpy(ambeBuffer + (i * 9U), NULL_AMBE, 9U); } ::memcpy(data, ambeBuffer, 13U); @@ -1276,7 +1277,7 @@ void Voice::insertSilence(uint32_t count) } else { // Not sure what to do if this isn't AMBE audio - ::memcpy(data, DMR_SILENCE_DATA, DMR_FRAME_LENGTH_BYTES + 2U); + ::memcpy(data, SILENCE_DATA, DMR_FRAME_LENGTH_BYTES + 2U); } uint8_t n = (m_netN + 1U) % 6U; @@ -1290,7 +1291,7 @@ void Voice::insertSilence(uint32_t count) // only use our silence frame if its AMBE audio data if (fid == FID_ETSI || fid == FID_DMRA) { if (i > 0U) { - ::memcpy(data, DMR_SILENCE_DATA, DMR_FRAME_LENGTH_BYTES + 2U); + ::memcpy(data, SILENCE_DATA, DMR_FRAME_LENGTH_BYTES + 2U); m_lastFrameValid = false; } } diff --git a/src/host/modem/Modem.cpp b/src/host/modem/Modem.cpp index 566674e5..6a3c1822 100644 --- a/src/host/modem/Modem.cpp +++ b/src/host/modem/Modem.cpp @@ -651,7 +651,7 @@ void Modem::clock(uint32_t ms) uint8_t data = m_length - 2U; m_rxDMRQueue1.addData(&data, 1U); - if (m_buffer[3U] == (dmr::DMR_SYNC_DATA | dmr::DT_TERMINATOR_WITH_LC)) + if (m_buffer[3U] == (DMRDEF::SYNC_DATA | DMRDEF::DataType::TERMINATOR_WITH_LC)) data = TAG_EOT; else data = TAG_DATA; @@ -676,7 +676,7 @@ void Modem::clock(uint32_t ms) uint8_t data = m_length - 2U; m_rxDMRQueue2.addData(&data, 1U); - if (m_buffer[3U] == (dmr::DMR_SYNC_DATA | dmr::DT_TERMINATOR_WITH_LC)) + if (m_buffer[3U] == (DMRDEF::SYNC_DATA | DMRDEF::DataType::TERMINATOR_WITH_LC)) data = TAG_EOT; else data = TAG_DATA; @@ -897,10 +897,10 @@ void Modem::clock(uint32_t ms) m_cd = (m_buffer[5U] & 0x40U) == 0x40U; // spaces from the modem are returned in "logical" frame count, not raw byte size - m_dmrSpace1 = m_buffer[7U] * (dmr::DMR_FRAME_LENGTH_BYTES + 2U); - m_dmrSpace2 = m_buffer[8U] * (dmr::DMR_FRAME_LENGTH_BYTES + 2U); - m_p25Space = m_buffer[10U] * (p25::P25_LDU_FRAME_LENGTH_BYTES); - m_nxdnSpace = m_buffer[11U] * (nxdn::NXDN_FRAME_LENGTH_BYTES); + m_dmrSpace1 = m_buffer[7U] * (DMRDEF::DMR_FRAME_LENGTH_BYTES + 2U); + m_dmrSpace2 = m_buffer[8U] * (DMRDEF::DMR_FRAME_LENGTH_BYTES + 2U); + m_p25Space = m_buffer[10U] * (P25DEF::P25_LDU_FRAME_LENGTH_BYTES);//(P25DEF::P25_PDU_FRAME_LENGTH_BYTES); + m_nxdnSpace = m_buffer[11U] * (NXDDEF::NXDN_FRAME_LENGTH_BYTES); if (m_dumpModemStatus) { LogDebug(LOG_MODEM, "Modem::clock(), CMD_GET_STATUS, isHotspot = %u, dmr = %u / %u, p25 = %u / %u, nxdn = %u / %u, modemState = %u, tx = %u, adcOverflow = %u, rxOverflow = %u, txOverflow = %u, dacOverflow = %u, dmrSpace1 = %u, dmrSpace2 = %u, p25Space = %u, nxdnSpace = %u", @@ -1099,7 +1099,7 @@ uint32_t Modem::readNXDNFrame(uint8_t* data) /// True, if the DMR Slot 1 ring buffer has free space, otherwise false. bool Modem::hasDMRSpace1() const { - return m_dmrSpace1 >= (dmr::DMR_FRAME_LENGTH_BYTES + 2U); + return m_dmrSpace1 >= (DMRDEF::DMR_FRAME_LENGTH_BYTES + 2U); } /// @@ -1108,7 +1108,7 @@ bool Modem::hasDMRSpace1() const /// True, if the DMR Slot 2 ring buffer has free space, otherwise false. bool Modem::hasDMRSpace2() const { - return m_dmrSpace2 >= (dmr::DMR_FRAME_LENGTH_BYTES + 2U); + return m_dmrSpace2 >= (DMRDEF::DMR_FRAME_LENGTH_BYTES + 2U); } /// @@ -1127,7 +1127,7 @@ bool Modem::hasP25Space(uint32_t length) const /// True, if the NXDN ring buffer has free space, otherwise false. bool Modem::hasNXDNSpace() const { - return m_nxdnSpace >= nxdn::NXDN_FRAME_LENGTH_BYTES; + return m_nxdnSpace >= NXDDEF::NXDN_FRAME_LENGTH_BYTES; } /// @@ -1271,7 +1271,7 @@ void Modem::injectDMRFrame1(const uint8_t* data, uint32_t length) val = TAG_DATA; m_rxDMRQueue1.addData(&val, 1U); - val = dmr::DMR_SYNC_VOICE & dmr::DMR_SYNC_DATA; // valid sync + val = DMRDEF::SYNC_VOICE & DMRDEF::SYNC_DATA; // valid sync m_rxDMRQueue1.addData(&val, 1U); m_rxDMRQueue1.addData(data, length); @@ -1297,7 +1297,7 @@ void Modem::injectDMRFrame2(const uint8_t* data, uint32_t length) val = TAG_DATA; m_rxDMRQueue2.addData(&val, 1U); - val = dmr::DMR_SYNC_VOICE & dmr::DMR_SYNC_DATA; // valid sync + val = DMRDEF::SYNC_VOICE & DMRDEF::SYNC_DATA; // valid sync m_rxDMRQueue2.addData(&val, 1U); m_rxDMRQueue2.addData(data, length); diff --git a/src/host/network/RESTAPI.cpp b/src/host/network/RESTAPI.cpp index edc35a6c..9d08b665 100644 --- a/src/host/network/RESTAPI.cpp +++ b/src/host/network/RESTAPI.cpp @@ -149,7 +149,7 @@ RESTAPI::RESTAPI(const std::string& address, uint16_t port, const std::string& p m_enableSSL(enableSSL), #endif // ENABLE_TCP_SSL m_random(), - m_p25MFId(p25::P25_MFG_STANDARD), + m_p25MFId(P25DEF::MFG_STANDARD), m_password(password), m_passwordHash(nullptr), m_debug(debug), @@ -1475,6 +1475,7 @@ void RESTAPI::restAPI_GetDMRDumpCSBK(const HTTPPayload& request, HTTPPayload& re /// void RESTAPI::restAPI_PutDMRRID(const HTTPPayload& request, HTTPPayload& reply, const RequestMatch& match) { + using namespace dmr::defines; if (!validateAuth(request, reply)) { return; } @@ -1523,16 +1524,16 @@ void RESTAPI::restAPI_PutDMRRID(const HTTPPayload& request, HTTPPayload& reply, errorPayload(reply, "OK", HTTPPayload::OK); std::string command = req["command"].get(); if (::strtolower(command) == RID_CMD_PAGE) { - m_dmr->writeRF_Call_Alrt(slot, p25::P25_WUID_FNE, dstId); + m_dmr->writeRF_Call_Alrt(slot, WUID_ALL, dstId); } else if (::strtolower(command) == RID_CMD_CHECK) { - m_dmr->writeRF_Ext_Func(slot, dmr::DMR_EXT_FNCT_CHECK, p25::P25_WUID_FNE, dstId); + m_dmr->writeRF_Ext_Func(slot, ExtendedFunctions::CHECK, WUID_ALL, dstId); } else if (::strtolower(command) == RID_CMD_INHIBIT) { - m_dmr->writeRF_Ext_Func(slot, dmr::DMR_EXT_FNCT_INHIBIT, p25::P25_WUID_FNE, dstId); + m_dmr->writeRF_Ext_Func(slot, ExtendedFunctions::INHIBIT, WUID_STUNI, dstId); } else if (::strtolower(command) == RID_CMD_UNINHIBIT) { - m_dmr->writeRF_Ext_Func(slot, dmr::DMR_EXT_FNCT_UNINHIBIT, p25::P25_WUID_FNE, dstId); + m_dmr->writeRF_Ext_Func(slot, ExtendedFunctions::UNINHIBIT, WUID_STUNI, dstId); } else { errorPayload(reply, "invalid command"); @@ -1840,7 +1841,9 @@ void RESTAPI::restAPI_GetP25DumpTSBK(const HTTPPayload& request, HTTPPayload& re /// void RESTAPI::restAPI_PutP25RID(const HTTPPayload& request, HTTPPayload& reply, const RequestMatch& match) { - if (!validateAuth(request, reply)) { + using namespace p25::defines; + if (!validateAuth(request, reply)) + { return; } @@ -1891,16 +1894,16 @@ void RESTAPI::restAPI_PutP25RID(const HTTPPayload& request, HTTPPayload& reply, m_p25->control()->setLastMFId(mfId); } else if (::strtolower(command) == RID_CMD_PAGE) { - m_p25->control()->writeRF_TSDU_Call_Alrt(p25::P25_WUID_FNE, dstId); + m_p25->control()->writeRF_TSDU_Call_Alrt(WUID_FNE, dstId); } else if (::strtolower(command) == RID_CMD_CHECK) { - m_p25->control()->writeRF_TSDU_Ext_Func(p25::P25_EXT_FNCT_CHECK, p25::P25_WUID_FNE, dstId); + m_p25->control()->writeRF_TSDU_Ext_Func(ExtendedFunctions::CHECK, WUID_FNE, dstId); } else if (::strtolower(command) == RID_CMD_INHIBIT) { - m_p25->control()->writeRF_TSDU_Ext_Func(p25::P25_EXT_FNCT_INHIBIT, p25::P25_WUID_FNE, dstId); + m_p25->control()->writeRF_TSDU_Ext_Func(ExtendedFunctions::INHIBIT, WUID_FNE, dstId); } else if (::strtolower(command) == RID_CMD_UNINHIBIT) { - m_p25->control()->writeRF_TSDU_Ext_Func(p25::P25_EXT_FNCT_UNINHIBIT, p25::P25_WUID_FNE, dstId); + m_p25->control()->writeRF_TSDU_Ext_Func(ExtendedFunctions::UNINHIBIT, WUID_FNE, dstId); } else if (::strtolower(command) == RID_CMD_GAQ) { m_p25->control()->writeRF_TSDU_Grp_Aff_Q(dstId); @@ -2018,7 +2021,9 @@ void RESTAPI::restAPI_GetP25CCBroadcast(const HTTPPayload& request, HTTPPayload& /// void RESTAPI::restAPI_PutP25RawTSBK(const HTTPPayload& request, HTTPPayload& reply, const RequestMatch& match) { - if (!validateAuth(request, reply)) { + using namespace p25::defines; + if (!validateAuth(request, reply)) + { return; } @@ -2051,17 +2056,17 @@ void RESTAPI::restAPI_PutP25RawTSBK(const HTTPPayload& request, HTTPPayload& rep } const char* tsbkPtr = tsbkBytes.c_str(); - uint8_t* tsbk = new uint8_t[p25::P25_TSBK_LENGTH_BYTES]; - ::memset(tsbk, 0x00U, p25::P25_TSBK_LENGTH_BYTES); + uint8_t* tsbk = new uint8_t[P25_TSBK_LENGTH_BYTES]; + ::memset(tsbk, 0x00U, P25_TSBK_LENGTH_BYTES); - for (uint8_t i = 0; i < p25::P25_TSBK_LENGTH_BYTES; i++) { + for (uint8_t i = 0; i < P25_TSBK_LENGTH_BYTES; i++) { char t[4] = {tsbkPtr[0], tsbkPtr[1], 0}; tsbk[i] = (uint8_t)::strtoul(t, NULL, 16); tsbkPtr += 2 * sizeof(char); } if (m_debug) { - Utils::dump("Raw TSBK", tsbk, p25::P25_TSBK_LENGTH_BYTES); + Utils::dump("Raw TSBK", tsbk, P25_TSBK_LENGTH_BYTES); } m_p25->control()->writeRF_TSDU_Raw(tsbk); diff --git a/src/host/nxdn/Control.cpp b/src/host/nxdn/Control.cpp index 829e8473..853542ff 100644 --- a/src/host/nxdn/Control.cpp +++ b/src/host/nxdn/Control.cpp @@ -28,6 +28,7 @@ #include "ActivityLog.h" using namespace nxdn; +using namespace nxdn::defines; using namespace nxdn::packet; #include @@ -237,39 +238,39 @@ void Control::setOptions(yaml::Node& conf, bool supervisor, const std::string cw /* ** Voice Silence and Frame Loss Thresholds */ - m_voice->m_silenceThreshold = nxdnProtocol["silenceThreshold"].as(nxdn::DEFAULT_SILENCE_THRESHOLD); + m_voice->m_silenceThreshold = nxdnProtocol["silenceThreshold"].as(DEFAULT_SILENCE_THRESHOLD); if (m_voice->m_silenceThreshold > MAX_NXDN_VOICE_ERRORS) { - LogWarning(LOG_NXDN, "Silence threshold > %u, defaulting to %u", nxdn::MAX_NXDN_VOICE_ERRORS, nxdn::DEFAULT_SILENCE_THRESHOLD); - m_voice->m_silenceThreshold = nxdn::DEFAULT_SILENCE_THRESHOLD; + LogWarning(LOG_NXDN, "Silence threshold > %u, defaulting to %u", MAX_NXDN_VOICE_ERRORS, DEFAULT_SILENCE_THRESHOLD); + m_voice->m_silenceThreshold = DEFAULT_SILENCE_THRESHOLD; } // either MAX_NXDN_VOICE_ERRORS or 0 will disable the threshold logic if (m_voice->m_silenceThreshold == 0) { - LogWarning(LOG_NXDN, "Silence threshold set to zero, defaulting to %u", nxdn::MAX_NXDN_VOICE_ERRORS); - m_voice->m_silenceThreshold = nxdn::MAX_NXDN_VOICE_ERRORS; + LogWarning(LOG_NXDN, "Silence threshold set to zero, defaulting to %u", MAX_NXDN_VOICE_ERRORS); + m_voice->m_silenceThreshold = MAX_NXDN_VOICE_ERRORS; } - m_frameLossThreshold = (uint8_t)nxdnProtocol["frameLossThreshold"].as(nxdn::DEFAULT_FRAME_LOSS_THRESHOLD); + m_frameLossThreshold = (uint8_t)nxdnProtocol["frameLossThreshold"].as(DEFAULT_FRAME_LOSS_THRESHOLD); if (m_frameLossThreshold == 0U) { m_frameLossThreshold = 1U; } - if (m_frameLossThreshold > nxdn::DEFAULT_FRAME_LOSS_THRESHOLD * 2U) { - LogWarning(LOG_NXDN, "Frame loss threshold may be excessive, default is %u, configured is %u", nxdn::DEFAULT_FRAME_LOSS_THRESHOLD, m_frameLossThreshold); + if (m_frameLossThreshold > DEFAULT_FRAME_LOSS_THRESHOLD * 2U) { + LogWarning(LOG_NXDN, "Frame loss threshold may be excessive, default is %u, configured is %u", DEFAULT_FRAME_LOSS_THRESHOLD, m_frameLossThreshold); } /* ** CC Service Class */ - uint8_t serviceClass = NXDN_SIF1_VOICE_CALL_SVC | NXDN_SIF1_DATA_CALL_SVC; + uint8_t serviceClass = SiteInformation1::VOICE_CALL_SVC | SiteInformation1::DATA_CALL_SVC; if (m_enableControl) { - serviceClass |= NXDN_SIF1_GRP_REG_SVC; + serviceClass |= SiteInformation1::GRP_REG_SVC; } /* ** Site Data */ // calculate the NXDN location ID - uint32_t locId = NXDN_LOC_CAT_GLOBAL; // DVM is currently fixed to "global" category + uint32_t locId = LocationCategory::GLOBAL; // DVM is currently fixed to "global" category locId = (locId << 10) + (sysId & 0x3FFU); locId = (locId << 12) + (siteId & 0xFFFU); @@ -460,9 +461,9 @@ bool Control::processFrame(uint8_t* data, uint32_t len) return false; } - uint8_t rfct = m_rfLastLICH.getRFCT(); - uint8_t fct = m_rfLastLICH.getFCT(); - uint8_t option = m_rfLastLICH.getOption(); + RFChannelType::E rfct = m_rfLastLICH.getRFCT(); + FuncChannelType::E fct = m_rfLastLICH.getFCT(); + ChOption::E option = m_rfLastLICH.getOption(); if (m_debug) { LogDebug(LOG_RF, "NXDN, valid LICH, rfState = %u, netState = %u, rfct = %u, fct = %u", m_rfState, m_netState, rfct, fct); @@ -470,19 +471,19 @@ bool Control::processFrame(uint8_t* data, uint32_t len) // are we interrupting a running CC? if (m_ccRunning) { - if ((fct != NXDN_LICH_CAC_INBOUND_SHORT) || (fct != NXDN_LICH_CAC_INBOUND_LONG)) { + if ((fct != FuncChannelType::CAC_INBOUND_SHORT) || (fct != FuncChannelType::CAC_INBOUND_LONG)) { m_ccHalted = true; } } bool ret = false; - if (rfct == NXDN_LICH_RFCT_RCCH) { + if (rfct == RFChannelType::RCCH) { ret = m_control->process(fct, option, data, len); } - else if (rfct == NXDN_LICH_RFCT_RTCH || rfct == NXDN_LICH_RFCT_RDCH) { + else if (rfct == RFChannelType::RTCH || rfct == RFChannelType::RDCH) { switch (fct) { - case NXDN_LICH_USC_UDCH: + case FuncChannelType::USC_UDCH: if (!m_dedicatedControl) ret = m_data->process(option, data, len); break; @@ -1016,12 +1017,12 @@ void Control::processNetwork() if (valid) m_rfLastLICH = lich; - uint8_t usc = m_rfLastLICH.getFCT(); - uint8_t option = m_rfLastLICH.getOption(); + FuncChannelType::E usc = m_rfLastLICH.getFCT(); + ChOption::E option = m_rfLastLICH.getOption(); // forward onto the specific processor for final processing and delivery switch (usc) { - case NXDN_LICH_USC_UDCH: + case FuncChannelType::USC_UDCH: ret = m_data->processNetwork(option, lc, data.get(), frameLength); break; default: @@ -1190,23 +1191,23 @@ void Control::writeRF_Message_Tx_Rel(bool noNetwork) // generate the LICH channel::LICH lich; - lich.setRFCT(NXDN_LICH_RFCT_RTCH); - lich.setFCT(NXDN_LICH_USC_SACCH_NS); - lich.setOption(NXDN_LICH_STEAL_FACCH); + lich.setRFCT(RFChannelType::RTCH); + lich.setFCT(FuncChannelType::USC_SACCH_NS); + lich.setOption(ChOption::STEAL_FACCH); lich.setOutbound(true); lich.encode(data + 2U); uint8_t buffer[NXDN_RTCH_LC_LENGTH_BYTES]; ::memset(buffer, 0x00U, NXDN_RTCH_LC_LENGTH_BYTES); - m_rfLC.setMessageType(RTCH_MESSAGE_TYPE_TX_REL); + m_rfLC.setMessageType(MessageType::RTCH_TX_REL); m_rfLC.encode(buffer, NXDN_UDCH_LENGTH_BITS); // generate the SACCH channel::SACCH sacch; sacch.setData(SACCH_IDLE); sacch.setRAN(m_ran); - sacch.setStructure(NXDN_SR_SINGLE); + sacch.setStructure(ChStructure::SR_SINGLE); sacch.encode(data + 2U); // generate the FACCH1 diff --git a/src/host/nxdn/packet/ControlSignaling.cpp b/src/host/nxdn/packet/ControlSignaling.cpp index 07550467..3e0d4826 100644 --- a/src/host/nxdn/packet/ControlSignaling.cpp +++ b/src/host/nxdn/packet/ControlSignaling.cpp @@ -24,6 +24,7 @@ #include "ActivityLog.h" using namespace nxdn; +using namespace nxdn::defines; using namespace nxdn::lc; using namespace nxdn::lc::rcch; using namespace nxdn::packet; @@ -39,7 +40,7 @@ using namespace nxdn::packet; #define IS_SUPPORT_CONTROL_CHECK(_PCKT_STR, _PCKT, _SRCID) \ if (!m_nxdn->m_enableControl) { \ LogWarning(LOG_RF, "NXDN, %s denial, unsupported service, srcId = %u", _PCKT_STR.c_str(), _SRCID); \ - writeRF_Message_Deny(0U, _SRCID, NXDN_CAUSE_SVC_UNAVAILABLE, _PCKT); \ + writeRF_Message_Deny(0U, _SRCID, CauseResponse::SVC_UNAVAILABLE, _PCKT); \ m_nxdn->m_rfState = RS_RF_REJECTED; \ return false; \ } @@ -131,7 +132,7 @@ const uint32_t GRANT_TIMER_TIMEOUT = 15U; /// Buffer containing data frame. /// Length of data frame. /// -bool ControlSignaling::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) +bool ControlSignaling::process(FuncChannelType::E fct, ChOption::E option, uint8_t* data, uint32_t len) { assert(data != nullptr); @@ -166,19 +167,19 @@ bool ControlSignaling::process(uint8_t fct, uint8_t option, uint8_t* data, uint3 m_nxdn->m_affiliations.touchUnitReg(srcId); switch (rcch->getMessageType()) { - case RTCH_MESSAGE_TYPE_VCALL: + case MessageType::RTCH_VCALL: { // make sure control data is supported - IS_SUPPORT_CONTROL_CHECK(rcch->toString(true), RTCH_MESSAGE_TYPE_VCALL, srcId); + IS_SUPPORT_CONTROL_CHECK(rcch->toString(true), MessageType::RTCH_VCALL, srcId); // validate the source RID - VALID_SRCID(rcch->toString(true), RTCH_MESSAGE_TYPE_VCALL, srcId, NXDN_CAUSE_VD_REQ_UNIT_NOT_PERM); + VALID_SRCID(rcch->toString(true), MessageType::RTCH_VCALL, srcId, CauseResponse::VD_REQ_UNIT_NOT_PERM); // validate the talkgroup ID - VALID_TGID(rcch->toString(true), RTCH_MESSAGE_TYPE_VCALL, dstId, srcId, NXDN_CAUSE_VD_TGT_UNIT_NOT_PERM); + VALID_TGID(rcch->toString(true), MessageType::RTCH_VCALL, dstId, srcId, CauseResponse::VD_TGT_UNIT_NOT_PERM); // verify the source RID is affiliated - VERIFY_SRCID_AFF(rcch->toString(true), RTCH_MESSAGE_TYPE_VCALL, srcId, dstId, NXDN_CAUSE_VD_REQ_UNIT_NOT_REG); + VERIFY_SRCID_AFF(rcch->toString(true), MessageType::RTCH_VCALL, srcId, dstId, CauseResponse::VD_REQ_UNIT_NOT_REG); VERBOSE_LOG_MSG(rcch->toString(true), srcId, dstId); uint8_t serviceOptions = (rcch->getEmergency() ? 0x80U : 0x00U) + // Emergency Flag @@ -193,10 +194,10 @@ bool ControlSignaling::process(uint8_t fct, uint8_t option, uint8_t* data, uint3 } } break; - case RCCH_MESSAGE_TYPE_REG: + case MessageType::RCCH_REG: { // make sure control data is supported - IS_SUPPORT_CONTROL_CHECK(rcch->toString(true), RCCH_MESSAGE_TYPE_REG, srcId); + IS_SUPPORT_CONTROL_CHECK(rcch->toString(true), MessageType::RCCH_REG, srcId); if (m_verbose) { LogMessage(LOG_RF, "NXDN, %s, srcId = %u, locId = %u", @@ -206,10 +207,10 @@ bool ControlSignaling::process(uint8_t fct, uint8_t option, uint8_t* data, uint3 writeRF_Message_U_Reg_Rsp(srcId, rcch->getLocId()); } break; - case RCCH_MESSAGE_TYPE_GRP_REG: + case MessageType::RCCH_GRP_REG: { // make sure control data is supported - IS_SUPPORT_CONTROL_CHECK(rcch->toString(true), RCCH_MESSAGE_TYPE_GRP_REG, srcId); + IS_SUPPORT_CONTROL_CHECK(rcch->toString(true), MessageType::RCCH_GRP_REG, srcId); if (m_verbose) { LogMessage(LOG_RF, "NXDN, %s, srcId = %u, dstId = %u, locId = %u", @@ -237,7 +238,7 @@ bool ControlSignaling::process(uint8_t fct, uint8_t option, uint8_t* data, uint3 /// Buffer containing data frame. /// Length of data frame. /// -bool ControlSignaling::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t* data, uint32_t len) +bool ControlSignaling::processNetwork(FuncChannelType::E fct, ChOption::E option, lc::RTCH& netLC, uint8_t* data, uint32_t len) { assert(data != nullptr); @@ -261,7 +262,7 @@ bool ControlSignaling::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& net // handle standard NXDN message opcodes switch (rcch->getMessageType()) { - case RTCH_MESSAGE_TYPE_VCALL: + case MessageType::RTCH_VCALL: { if (m_nxdn->m_dedicatedControl) { if (!m_nxdn->m_affiliations.isGranted(dstId)) { @@ -279,7 +280,7 @@ bool ControlSignaling::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& net } } return true; // don't allow this to write to the air - case RCCH_MESSAGE_TYPE_VCALL_CONN: + case MessageType::RCCH_VCALL_CONN: break; // the FNE may explicitly send these default: LogError(LOG_NET, "NXDN, unhandled message type, messageType = $%02X", rcch->getMessageType()); @@ -364,9 +365,9 @@ void ControlSignaling::writeRF_Message(RCCH* rcch, bool noNetwork, bool imm) // generate the LICH channel::LICH lich; - lich.setRFCT(NXDN_LICH_RFCT_RCCH); - lich.setFCT(NXDN_LICH_CAC_OUTBOUND); - lich.setOption(NXDN_LICH_DATA_COMMON); + lich.setRFCT(RFChannelType::RCCH); + lich.setFCT(FuncChannelType::CAC_OUTBOUND); + lich.setOption(ChOption::DATA_COMMON); lich.setOutbound(true); lich.encode(data + 2U); @@ -378,7 +379,7 @@ void ControlSignaling::writeRF_Message(RCCH* rcch, bool noNetwork, bool imm) // generate the CAC channel::CAC cac; cac.setRAN(m_nxdn->m_ran); - cac.setStructure(NXDN_SR_RCCH_SINGLE); + cac.setStructure(ChStructure::SR_SINGLE); cac.setData(buffer); cac.encode(data + 2U); @@ -473,7 +474,7 @@ bool ControlSignaling::writeRF_Message_Grant(uint32_t srcId, uint32_t dstId, uin if (m_nxdn->m_rfState != RS_RF_LISTENING && m_nxdn->m_rfState != RS_RF_DATA) { if (!net) { LogWarning(LOG_RF, "NXDN, %s denied, traffic in progress, dstId = %u", rcch->toString().c_str(), dstId); - writeRF_Message_Deny(0U, srcId, NXDN_CAUSE_VD_QUE_GRP_BUSY, RTCH_MESSAGE_TYPE_VCALL); + writeRF_Message_Deny(0U, srcId, CauseResponse::VD_QUE_GRP_BUSY, MessageType::RTCH_VCALL); ::ActivityLog("NXDN", true, "group grant request from %u to TG %u denied", srcId, dstId); m_nxdn->m_rfState = RS_RF_REJECTED; @@ -485,7 +486,7 @@ bool ControlSignaling::writeRF_Message_Grant(uint32_t srcId, uint32_t dstId, uin if (m_nxdn->m_netState != RS_NET_IDLE && dstId == m_nxdn->m_netLastDstId) { if (!net) { LogWarning(LOG_RF, "NXDN, %s denied, traffic in progress, dstId = %u", rcch->toString().c_str(), dstId); - writeRF_Message_Deny(0U, srcId, NXDN_CAUSE_VD_QUE_GRP_BUSY, RTCH_MESSAGE_TYPE_VCALL); + writeRF_Message_Deny(0U, srcId, CauseResponse::VD_QUE_GRP_BUSY, MessageType::RTCH_VCALL); ::ActivityLog("NXDN", true, "group grant request from %u to TG %u denied", srcId, dstId); m_nxdn->m_rfState = RS_RF_REJECTED; @@ -498,7 +499,7 @@ bool ControlSignaling::writeRF_Message_Grant(uint32_t srcId, uint32_t dstId, uin if (m_nxdn->m_rfLastDstId != 0U) { if (m_nxdn->m_rfLastDstId != dstId && (m_nxdn->m_rfTGHang.isRunning() && !m_nxdn->m_rfTGHang.hasExpired())) { if (!net) { - writeRF_Message_Deny(0U, srcId, NXDN_CAUSE_VD_QUE_GRP_BUSY, RTCH_MESSAGE_TYPE_VCALL); + writeRF_Message_Deny(0U, srcId, CauseResponse::VD_QUE_GRP_BUSY, MessageType::RTCH_VCALL); m_nxdn->m_rfState = RS_RF_REJECTED; } @@ -511,7 +512,7 @@ bool ControlSignaling::writeRF_Message_Grant(uint32_t srcId, uint32_t dstId, uin if (grp) { if (!net) { LogWarning(LOG_RF, "NXDN, %s queued, no channels available, dstId = %u", rcch->toString().c_str(), dstId); - writeRF_Message_Deny(0U, srcId, NXDN_CAUSE_VD_QUE_CHN_RESOURCE_NOT_AVAIL, RTCH_MESSAGE_TYPE_VCALL); + writeRF_Message_Deny(0U, srcId, CauseResponse::VD_QUE_CHN_RESOURCE_NOT_AVAIL, MessageType::RTCH_VCALL); ::ActivityLog("NXDN", true, "group grant request from %u to TG %u queued", srcId, dstId); m_nxdn->m_rfState = RS_RF_REJECTED; @@ -522,7 +523,7 @@ bool ControlSignaling::writeRF_Message_Grant(uint32_t srcId, uint32_t dstId, uin else { if (!net) { LogWarning(LOG_RF, "NXDN, %s queued, no channels available, dstId = %u", rcch->toString().c_str(), dstId); - writeRF_Message_Deny(0U, srcId, NXDN_CAUSE_VD_QUE_CHN_RESOURCE_NOT_AVAIL, RTCH_MESSAGE_TYPE_VCALL); + writeRF_Message_Deny(0U, srcId, CauseResponse::VD_QUE_CHN_RESOURCE_NOT_AVAIL, MessageType::RTCH_VCALL); ::ActivityLog("P25", true, "unit-to-unit grant request from %u to %u queued", srcId, dstId); m_nxdn->m_rfState = RS_RF_REJECTED; @@ -545,7 +546,7 @@ bool ControlSignaling::writeRF_Message_Grant(uint32_t srcId, uint32_t dstId, uin if (srcId != grantedSrcId) { if (!net) { LogWarning(LOG_RF, "NXDN, %s denied, traffic in progress, dstId = %u", rcch->toString().c_str(), dstId); - writeRF_Message_Deny(0U, srcId, NXDN_CAUSE_VD_QUE_GRP_BUSY, RTCH_MESSAGE_TYPE_VCALL); + writeRF_Message_Deny(0U, srcId, CauseResponse::VD_QUE_GRP_BUSY, MessageType::RTCH_VCALL); ::ActivityLog("NXDN", true, "group grant request from %u to TG %u denied", srcId, dstId); m_nxdn->m_rfState = RS_RF_REJECTED; @@ -596,7 +597,7 @@ bool ControlSignaling::writeRF_Message_Grant(uint32_t srcId, uint32_t dstId, uin ::LogError((net) ? LOG_NET : LOG_RF, "NXDN, %s, failed to permit TG for use, chNo = %u", rcch->toString().c_str(), chNo); m_nxdn->m_affiliations.releaseGrant(dstId, false); if (!net) { - writeRF_Message_Deny(0U, srcId, NXDN_CAUSE_VD_QUE_GRP_BUSY, RTCH_MESSAGE_TYPE_VCALL); + writeRF_Message_Deny(0U, srcId, CauseResponse::VD_QUE_GRP_BUSY, MessageType::RTCH_VCALL); m_nxdn->m_rfState = RS_RF_REJECTED; } @@ -608,7 +609,7 @@ bool ControlSignaling::writeRF_Message_Grant(uint32_t srcId, uint32_t dstId, uin } } - rcch->setMessageType(RTCH_MESSAGE_TYPE_VCALL); + rcch->setMessageType(MessageType::RTCH_VCALL); rcch->setGrpVchNo(chNo); rcch->setGroup(grp); rcch->setSrcId(srcId); @@ -640,9 +641,9 @@ void ControlSignaling::writeRF_Message_Deny(uint32_t srcId, uint32_t dstId, uint std::unique_ptr rcch = nullptr; switch (service) { - case RTCH_MESSAGE_TYPE_VCALL: + case MessageType::RTCH_VCALL: rcch = std::make_unique(); - rcch->setMessageType(RTCH_MESSAGE_TYPE_VCALL); + rcch->setMessageType(MessageType::RTCH_VCALL); default: return; } @@ -670,27 +671,27 @@ bool ControlSignaling::writeRF_Message_Grp_Reg_Rsp(uint32_t srcId, uint32_t dstI bool ret = false; std::unique_ptr rcch = std::make_unique(); - rcch->setCauseResponse(NXDN_CAUSE_MM_REG_ACCEPTED); + rcch->setCauseResponse(CauseResponse::MM_REG_ACCEPTED); // validate the location ID if (locId != m_nxdn->m_siteData.locId()) { LogWarning(LOG_RF, "NXDN, %s denial, LOCID rejection, locId = $%04X", rcch->toString().c_str(), locId); ::ActivityLog("NXDN", true, "group affiliation request from %u denied", srcId); - rcch->setCauseResponse(NXDN_CAUSE_MM_REG_FAILED); + rcch->setCauseResponse(CauseResponse::MM_REG_FAILED); } // validate the source RID if (!acl::AccessControl::validateSrcId(srcId)) { LogWarning(LOG_RF, "NXDN, %s denial, RID rejection, srcId = %u", rcch->toString().c_str(), srcId); ::ActivityLog("NXDN", true, "group affiliation request from %u to %s %u denied", srcId, "TG ", dstId); - rcch->setCauseResponse(NXDN_CAUSE_MM_REG_FAILED); + rcch->setCauseResponse(CauseResponse::MM_REG_FAILED); } // validate the source RID is registered if (!m_nxdn->m_affiliations.isUnitReg(srcId) && m_verifyReg) { LogWarning(LOG_RF, "NXDN, %s denial, RID not registered, srcId = %u", rcch->toString().c_str(), srcId); ::ActivityLog("NXDN", true, "group affiliation request from %u to %s %u denied", srcId, "TG ", dstId); - rcch->setCauseResponse(NXDN_CAUSE_MM_REG_REFUSED); + rcch->setCauseResponse(CauseResponse::MM_REG_REFUSED); } // validate the talkgroup ID @@ -701,11 +702,11 @@ bool ControlSignaling::writeRF_Message_Grp_Reg_Rsp(uint32_t srcId, uint32_t dstI if (!acl::AccessControl::validateTGId(dstId)) { LogWarning(LOG_RF, "NXDN, %s denial, TGID rejection, dstId = %u", rcch->toString().c_str(), dstId); ::ActivityLog("NXDN", true, "group affiliation request from %u to %s %u denied", srcId, "TG ", dstId); - rcch->setCauseResponse(NXDN_CAUSE_MM_LOC_ACPT_GRP_REFUSE); + rcch->setCauseResponse(CauseResponse::MM_LOC_ACPT_GRP_REFUSE); } } - if (rcch->getCauseResponse() == NXDN_CAUSE_MM_REG_ACCEPTED) { + if (rcch->getCauseResponse() == CauseResponse::MM_REG_ACCEPTED) { VERBOSE_LOG_MSG(rcch->toString(), srcId, dstId); ::ActivityLog("NXDN", true, "group affiliation request from %u to %s %u", srcId, "TG ", dstId); @@ -729,23 +730,23 @@ bool ControlSignaling::writeRF_Message_Grp_Reg_Rsp(uint32_t srcId, uint32_t dstI void ControlSignaling::writeRF_Message_U_Reg_Rsp(uint32_t srcId, uint32_t locId) { std::unique_ptr rcch = std::make_unique(); - rcch->setCauseResponse(NXDN_CAUSE_MM_REG_ACCEPTED); + rcch->setCauseResponse(CauseResponse::MM_REG_ACCEPTED); // validate the location ID if (locId != m_nxdn->m_siteData.locId()) { LogWarning(LOG_RF, "NXDN, %s denial, LOCID rejection, locId = $%04X", rcch->toString().c_str(), locId); ::ActivityLog("NXDN", true, "unit registration request from %u denied", srcId); - rcch->setCauseResponse(NXDN_CAUSE_MM_REG_FAILED); + rcch->setCauseResponse(CauseResponse::MM_REG_FAILED); } // validate the source RID if (!acl::AccessControl::validateSrcId(srcId)) { LogWarning(LOG_RF, "NXDN, %s denial, RID rejection, srcId = %u", rcch->toString().c_str(), srcId); ::ActivityLog("NXDN", true, "unit registration request from %u denied", srcId); - rcch->setCauseResponse(NXDN_CAUSE_MM_REG_FAILED); + rcch->setCauseResponse(CauseResponse::MM_REG_FAILED); } - if (rcch->getCauseResponse() == NXDN_CAUSE_MM_REG_ACCEPTED) { + if (rcch->getCauseResponse() == CauseResponse::MM_REG_ACCEPTED) { if (m_verbose) { LogMessage(LOG_RF, "NXDN, %s, srcId = %u, locId = %u", rcch->toString().c_str(), srcId, locId); @@ -780,9 +781,9 @@ void ControlSignaling::writeRF_CC_Message_Site_Info() // generate the LICH channel::LICH lich; - lich.setRFCT(NXDN_LICH_RFCT_RCCH); - lich.setFCT(NXDN_LICH_CAC_OUTBOUND); - lich.setOption(NXDN_LICH_DATA_NORMAL); + lich.setRFCT(RFChannelType::RCCH); + lich.setFCT(FuncChannelType::CAC_OUTBOUND); + lich.setOption(ChOption::DATA_NORMAL); lich.setOutbound(true); lich.encode(data + 2U); @@ -802,7 +803,7 @@ void ControlSignaling::writeRF_CC_Message_Site_Info() // generate the CAC channel::CAC cac; cac.setRAN(m_nxdn->m_ran); - cac.setStructure(NXDN_SR_RCCH_HEAD_SINGLE); + cac.setStructure(ChStructure::SR_RCCH_HEAD_SINGLE); cac.setData(buffer); cac.encode(data + 2U); @@ -829,9 +830,9 @@ void ControlSignaling::writeRF_CC_Message_Service_Info() // generate the LICH channel::LICH lich; - lich.setRFCT(NXDN_LICH_RFCT_RCCH); - lich.setFCT(NXDN_LICH_CAC_OUTBOUND); - lich.setOption(NXDN_LICH_DATA_NORMAL); + lich.setRFCT(RFChannelType::RCCH); + lich.setFCT(FuncChannelType::CAC_OUTBOUND); + lich.setOption(ChOption::DATA_NORMAL); lich.setOutbound(true); lich.encode(data + 2U); @@ -846,7 +847,7 @@ void ControlSignaling::writeRF_CC_Message_Service_Info() // generate the CAC channel::CAC cac; cac.setRAN(m_nxdn->m_ran); - cac.setStructure(NXDN_SR_RCCH_SINGLE); + cac.setStructure(ChStructure::SR_RCCH_SINGLE); cac.setData(buffer); cac.encode(data + 2U); diff --git a/src/host/nxdn/packet/ControlSignaling.h b/src/host/nxdn/packet/ControlSignaling.h index 79db92ab..05830a2d 100644 --- a/src/host/nxdn/packet/ControlSignaling.h +++ b/src/host/nxdn/packet/ControlSignaling.h @@ -7,7 +7,7 @@ * @package DVM / Modem Host Software * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022-2023 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022-2024 Bryan Biedenkapp, N2PLL * */ #if !defined(__NXDN_PACKET_CONTROL_SIGNALING_H__) @@ -40,9 +40,9 @@ namespace nxdn class HOST_SW_API ControlSignaling { public: /// Process a data frame from the RF interface. - bool process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len); + bool process(defines::FuncChannelType::E fct, defines::ChOption::E option, uint8_t* data, uint32_t len); /// Process a data frame from the network. - bool processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t* data, uint32_t len); + bool processNetwork(defines::FuncChannelType::E fct, defines::ChOption::E option, lc::RTCH& netLC, uint8_t* data, uint32_t len); protected: friend class nxdn::packet::Data; diff --git a/src/host/nxdn/packet/Data.cpp b/src/host/nxdn/packet/Data.cpp index 78064d2a..bf48f305 100644 --- a/src/host/nxdn/packet/Data.cpp +++ b/src/host/nxdn/packet/Data.cpp @@ -9,7 +9,7 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2015-2020 Jonathan Naylor, G4KLX -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022-2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -23,6 +23,7 @@ #include "ActivityLog.h" using namespace nxdn; +using namespace nxdn::defines; using namespace nxdn::packet; #include @@ -162,7 +163,7 @@ void Data::resetNet() /// Buffer containing data frame. /// Length of data frame. /// -bool Data::process(uint8_t option, uint8_t* data, uint32_t len) +bool Data::process(ChOption::E option, uint8_t* data, uint32_t len) { assert(data != nullptr); @@ -190,7 +191,7 @@ bool Data::process(uint8_t option, uint8_t* data, uint32_t len) if (m_nxdn->m_rfState == RS_RF_LISTENING) { uint8_t type = lc.getMessageType(); - if (type != RTCH_MESSAGE_TYPE_DCALL_HDR) + if (type != MessageType::RTCH_DCALL_HDR) return false; CHECK_TRAFFIC_COLLISION(srcId, dstId); @@ -220,18 +221,18 @@ bool Data::process(uint8_t option, uint8_t* data, uint32_t len) Sync::addNXDNSync(data + 2U); channel::LICH lich; - lich.setRFCT(NXDN_LICH_RFCT_RDCH); - lich.setFCT(NXDN_LICH_USC_UDCH); + lich.setRFCT(RFChannelType::RDCH); + lich.setFCT(FuncChannelType::USC_UDCH); lich.setOption(option); lich.setOutbound(!m_nxdn->m_duplex ? false : true); lich.encode(data + 2U); lich.setOutbound(false); - uint8_t type = RTCH_MESSAGE_TYPE_DCALL_DATA; + uint8_t type = MessageType::RTCH_DCALL_DATA; if (validUDCH) { type = lc.getMessageType(); - data[0U] = type == RTCH_MESSAGE_TYPE_TX_REL ? modem::TAG_EOT : modem::TAG_DATA; + data[0U] = type == MessageType::RTCH_TX_REL ? modem::TAG_EOT : modem::TAG_DATA; udch.setRAN(m_nxdn->m_ran); udch.encode(data + 2U); @@ -270,7 +271,7 @@ bool Data::process(uint8_t option, uint8_t* data, uint32_t len) /// Buffer containing data frame. /// Length of data frame. /// -bool Data::processNetwork(uint8_t option, lc::RTCH& netLC, uint8_t* data, uint32_t len) +bool Data::processNetwork(ChOption::E option, lc::RTCH& netLC, uint8_t* data, uint32_t len) { assert(data != nullptr); @@ -306,7 +307,7 @@ bool Data::processNetwork(uint8_t option, lc::RTCH& netLC, uint8_t* data, uint32 if (m_nxdn->m_netState == RS_NET_IDLE) { uint8_t type = lc.getMessageType(); - if (type != RTCH_MESSAGE_TYPE_DCALL_HDR) + if (type != MessageType::RTCH_DCALL_HDR) return false; CHECK_NET_TRAFFIC_COLLISION(lc, srcId, dstId); @@ -336,16 +337,16 @@ bool Data::processNetwork(uint8_t option, lc::RTCH& netLC, uint8_t* data, uint32 Sync::addNXDNSync(data + 2U); channel::LICH lich; - lich.setRFCT(NXDN_LICH_RFCT_RDCH); - lich.setFCT(NXDN_LICH_USC_UDCH); + lich.setRFCT(RFChannelType::RDCH); + lich.setFCT(FuncChannelType::USC_UDCH); lich.setOption(option); lich.setOutbound(true); lich.encode(data + 2U); - uint8_t type = RTCH_MESSAGE_TYPE_DCALL_DATA; + uint8_t type = MessageType::RTCH_DCALL_DATA; if (validUDCH) { type = lc.getMessageType(); - data[0U] = type == RTCH_MESSAGE_TYPE_TX_REL ? modem::TAG_EOT : modem::TAG_DATA; + data[0U] = type == MessageType::RTCH_TX_REL ? modem::TAG_EOT : modem::TAG_DATA; udch.setRAN(m_nxdn->m_ran); udch.encode(data + 2U); diff --git a/src/host/nxdn/packet/Data.h b/src/host/nxdn/packet/Data.h index 4e56a681..2824bb1f 100644 --- a/src/host/nxdn/packet/Data.h +++ b/src/host/nxdn/packet/Data.h @@ -9,7 +9,7 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2015-2020 Jonathan Naylor, G4KLX -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022-2024 Bryan Biedenkapp, N2PLL * */ #if !defined(__NXDN_PACKET_DATA_H__) @@ -44,9 +44,9 @@ namespace nxdn void resetNet(); /// Process a data frame from the RF interface. - bool process(uint8_t option, uint8_t* data, uint32_t len); + bool process(defines::ChOption::E option, uint8_t* data, uint32_t len); /// Process a data frame from the network. - bool processNetwork(uint8_t option, lc::RTCH& netLC, uint8_t* data, uint32_t len); + bool processNetwork(defines::ChOption::E option, lc::RTCH& netLC, uint8_t* data, uint32_t len); protected: friend class nxdn::Control; diff --git a/src/host/nxdn/packet/Voice.cpp b/src/host/nxdn/packet/Voice.cpp index e95e47d7..8c5312be 100644 --- a/src/host/nxdn/packet/Voice.cpp +++ b/src/host/nxdn/packet/Voice.cpp @@ -9,7 +9,7 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2015-2020 Jonathan Naylor, G4KLX -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022-2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" @@ -24,6 +24,7 @@ #include "ActivityLog.h" using namespace nxdn; +using namespace nxdn::defines; using namespace nxdn::packet; #include @@ -205,7 +206,7 @@ void Voice::resetNet() /// Buffer containing data frame. /// Length of data frame. /// -bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) +bool Voice::process(FuncChannelType::E fct, ChOption::E option, uint8_t* data, uint32_t len) { assert(data != nullptr); @@ -219,7 +220,7 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) return false; } - if (fct == NXDN_LICH_USC_SACCH_NS) { + if (fct == FuncChannelType::USC_SACCH_NS) { // the SACCH on a non-superblock frame is usually an idle and not interesting apart from the RAN. channel::FACCH1 facch; bool valid = facch.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS); @@ -250,7 +251,7 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) } uint8_t type = lc.getMessageType(); - if (type == RTCH_MESSAGE_TYPE_TX_REL) { + if (type == MessageType::RTCH_TX_REL) { if (m_nxdn->m_rfState != RS_RF_AUDIO) { m_nxdn->m_rfState = RS_RF_LISTENING; m_nxdn->m_rfMask = 0x00U; @@ -258,7 +259,7 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) m_nxdn->m_frameLossCnt = 0U; return false; } - } else if (type == RTCH_MESSAGE_TYPE_VCALL) { + } else if (type == MessageType::RTCH_VCALL) { CHECK_TRAFFIC_COLLISION(srcId, dstId); // validate source RID @@ -280,9 +281,9 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) // generate the LICH channel::LICH lich; - lich.setRFCT(NXDN_LICH_RFCT_RDCH); - lich.setFCT(NXDN_LICH_USC_SACCH_NS); - lich.setOption(NXDN_LICH_STEAL_FACCH); + lich.setRFCT(RFChannelType::RDCH); + lich.setFCT(FuncChannelType::USC_SACCH_NS); + lich.setOption(ChOption::STEAL_FACCH); lich.setOutbound(!m_nxdn->m_duplex ? false : true); lich.encode(data + 2U); @@ -290,7 +291,7 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) channel::SACCH sacch; sacch.setData(SACCH_IDLE); sacch.setRAN(m_nxdn->m_ran); - sacch.setStructure(NXDN_SR_SINGLE); + sacch.setStructure(ChStructure::SR_SINGLE); sacch.encode(data + 2U); uint8_t lcBuffer[NXDN_RTCH_LC_LENGTH_BYTES]; @@ -305,7 +306,7 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) writeNetwork(data, NXDN_FRAME_LENGTH_BYTES + 2U); if (m_nxdn->m_duplex) { - data[0U] = type == RTCH_MESSAGE_TYPE_TX_REL ? modem::TAG_EOT : modem::TAG_DATA; + data[0U] = type == MessageType::RTCH_TX_REL ? modem::TAG_EOT : modem::TAG_DATA; data[1U] = 0x00U; m_nxdn->addFrame(data, NXDN_FRAME_LENGTH_BYTES + 2U); @@ -353,15 +354,15 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) channel::FACCH1 facch; bool valid = false; switch (option) { - case NXDN_LICH_STEAL_FACCH: + case ChOption::STEAL_FACCH: valid = facch.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS); if (!valid) valid = facch.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS + NXDN_FACCH1_FEC_LENGTH_BITS); break; - case NXDN_LICH_STEAL_FACCH1_1: + case ChOption::STEAL_FACCH1_1: valid = facch.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS); break; - case NXDN_LICH_STEAL_FACCH1_2: + case ChOption::STEAL_FACCH1_2: valid = facch.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS + NXDN_FACCH1_FEC_LENGTH_BITS); break; default: @@ -376,7 +377,7 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) lc::RTCH lc; lc.decode(buffer, NXDN_FACCH1_FEC_LENGTH_BITS); - hasInfo = lc.getMessageType() == RTCH_MESSAGE_TYPE_VCALL; + hasInfo = lc.getMessageType() == MessageType::RTCH_VCALL; if (!hasInfo) return false; @@ -389,22 +390,22 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) uint8_t structure = sacch.getStructure(); switch (structure) { - case NXDN_SR_1_4: + case ChStructure::SR_1_4: m_nxdn->m_rfLC.decode(message, 18U, 0U); - if(m_nxdn->m_rfLC.getMessageType() == RTCH_MESSAGE_TYPE_VCALL) + if(m_nxdn->m_rfLC.getMessageType() == MessageType::RTCH_VCALL) m_nxdn->m_rfMask = 0x01U; else m_nxdn->m_rfMask = 0x00U; break; - case NXDN_SR_2_4: + case ChStructure::SR_2_4: m_nxdn->m_rfMask |= 0x02U; m_nxdn->m_rfLC.decode(message, 18U, 18U); break; - case NXDN_SR_3_4: + case ChStructure::SR_3_4: m_nxdn->m_rfMask |= 0x04U; m_nxdn->m_rfLC.decode(message, 18U, 36U); break; - case NXDN_SR_4_4: + case ChStructure::SR_4_4: m_nxdn->m_rfMask |= 0x08U; m_nxdn->m_rfLC.decode(message, 18U, 54U); break; @@ -416,7 +417,7 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) return false; uint8_t type = m_nxdn->m_rfLC.getMessageType(); - if (type != RTCH_MESSAGE_TYPE_VCALL) + if (type != MessageType::RTCH_VCALL) return false; } @@ -464,9 +465,9 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) // generate the LICH channel::LICH lich; - lich.setRFCT(NXDN_LICH_RFCT_RDCH); - lich.setFCT(NXDN_LICH_USC_SACCH_NS); - lich.setOption(NXDN_LICH_STEAL_FACCH); + lich.setRFCT(RFChannelType::RDCH); + lich.setFCT(FuncChannelType::USC_SACCH_NS); + lich.setOption(ChOption::STEAL_FACCH); lich.setOutbound(!m_nxdn->m_duplex ? false : true); lich.encode(start + 2U); @@ -476,7 +477,7 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) channel::SACCH sacch; sacch.setData(SACCH_IDLE); sacch.setRAN(m_nxdn->m_ran); - sacch.setStructure(NXDN_SR_SINGLE); + sacch.setStructure(ChStructure::SR_SINGLE); sacch.encode(start + 2U); uint8_t buffer[NXDN_RTCH_LC_LENGTH_BYTES]; @@ -505,8 +506,8 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) // regenerate the LICH channel::LICH lich; - lich.setRFCT(NXDN_LICH_RFCT_RDCH); - lich.setFCT(NXDN_LICH_USC_SACCH_SS); + lich.setRFCT(RFChannelType::RDCH); + lich.setFCT(FuncChannelType::USC_SACCH_SS); lich.setOption(option); lich.setOutbound(!m_nxdn->m_duplex ? false : true); lich.encode(data + 2U); @@ -525,7 +526,7 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) m_nxdn->m_rfLC.encode(lcBuffer, NXDN_RTCH_LC_LENGTH_BITS); // regenerate the audio and interpret the FACCH1 data - if (option == NXDN_LICH_STEAL_NONE) { + if (option == ChOption::STEAL_NONE) { edac::AMBEFEC ambe; uint32_t errors = 0U; @@ -540,10 +541,10 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) if (errors > m_silenceThreshold) { // bryanb: this is probably the wrong way to go about this... // generate null audio - ::memcpy(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 0U, NXDN_NULL_AMBE, 9U); - ::memcpy(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 9U, NXDN_NULL_AMBE, 9U); - ::memcpy(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U, NXDN_NULL_AMBE, 9U); - ::memcpy(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 27U, NXDN_NULL_AMBE, 9U); + ::memcpy(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 0U, NULL_AMBE, 9U); + ::memcpy(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 9U, NULL_AMBE, 9U); + ::memcpy(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U, NULL_AMBE, 9U); + ::memcpy(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 27U, NULL_AMBE, 9U); LogWarning(LOG_RF, "NXDN, " NXDN_RTCH_MSG_TYPE_VCALL ", exceeded lost audio threshold, filling in"); } @@ -554,7 +555,7 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) if (m_verbose) { LogMessage(LOG_RF, "NXDN, " NXDN_RTCH_MSG_TYPE_VCALL ", audio, srcId = %u, dstId = %u, errs = %u/188 (%.1f%%)", m_nxdn->m_rfLC.getSrcId(), m_nxdn->m_rfLC.getDstId(), errors, float(errors) / 1.88F); } - } else if (option == NXDN_LICH_STEAL_FACCH1_1) { + } else if (option == ChOption::STEAL_FACCH1_1) { channel::FACCH1 facch11; bool valid = facch11.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS); if (valid) @@ -572,8 +573,8 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) if (errors > (m_silenceThreshold / 2U)) { // bryanb: this is probably the wrong way to go about this... // generate null audio - ::memcpy(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U, NXDN_NULL_AMBE, 9U); - ::memcpy(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 27U, NXDN_NULL_AMBE, 9U); + ::memcpy(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U, NULL_AMBE, 9U); + ::memcpy(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 27U, NULL_AMBE, 9U); LogWarning(LOG_RF, "NXDN, " NXDN_RTCH_MSG_TYPE_VCALL ", exceeded lost audio threshold, filling in"); } @@ -584,7 +585,7 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) if (m_verbose) { LogMessage(LOG_RF, "NXDN, " NXDN_RTCH_MSG_TYPE_VCALL ", audio, srcId = %u, dstId = %u, errs = %u/94 (%.1f%%)", m_nxdn->m_rfLC.getSrcId(), m_nxdn->m_rfLC.getDstId(), errors, float(errors) / 0.94F); } - } else if (option == NXDN_LICH_STEAL_FACCH1_2) { + } else if (option == ChOption::STEAL_FACCH1_2) { edac::AMBEFEC ambe; uint32_t errors = 0U; @@ -597,8 +598,8 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) if (errors > (m_silenceThreshold / 2U)) { // bryanb: this is probably the wrong way to go about this... // generate null audio - ::memcpy(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 0U, NXDN_NULL_AMBE, 9U); - ::memcpy(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 9U, NXDN_NULL_AMBE, 9U); + ::memcpy(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 0U, NULL_AMBE, 9U); + ::memcpy(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 9U, NULL_AMBE, 9U); LogWarning(LOG_RF, "NXDN, " NXDN_RTCH_MSG_TYPE_VCALL ", exceeded lost audio threshold, filling in"); } @@ -655,7 +656,7 @@ bool Voice::process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len) /// Buffer containing data frame. /// Length of data frame. /// -bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t *data, uint32_t len) +bool Voice::processNetwork(FuncChannelType::E fct, ChOption::E option, lc::RTCH& netLC, uint8_t *data, uint32_t len) { assert(data != nullptr); @@ -669,7 +670,7 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t channel::SACCH sacch; sacch.decode(data + 2U); - if (fct == NXDN_LICH_USC_SACCH_NS) { + if (fct == FuncChannelType::USC_SACCH_NS) { // the SACCH on a non-superblock frame is usually an idle and not interesting apart from the RAN. channel::FACCH1 facch; bool valid = facch.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS); @@ -708,7 +709,7 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t } uint8_t type = lc.getMessageType(); - if (type == RTCH_MESSAGE_TYPE_TX_REL) { + if (type == MessageType::RTCH_TX_REL) { if (m_nxdn->m_netState != RS_NET_AUDIO) { m_nxdn->m_netState = RS_NET_IDLE; m_nxdn->m_netMask = 0x00U; @@ -717,7 +718,7 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t m_nxdn->m_netLastSrcId = 0U; return false; } - } else if (type == RTCH_MESSAGE_TYPE_VCALL) { + } else if (type == MessageType::RTCH_VCALL) { CHECK_NET_TRAFFIC_COLLISION(lc, srcId, dstId); // validate source RID @@ -738,9 +739,9 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t // generate the LICH channel::LICH lich; - lich.setRFCT(NXDN_LICH_RFCT_RDCH); - lich.setFCT(NXDN_LICH_USC_SACCH_NS); - lich.setOption(NXDN_LICH_STEAL_FACCH); + lich.setRFCT(RFChannelType::RDCH); + lich.setFCT(FuncChannelType::USC_SACCH_NS); + lich.setOption(ChOption::STEAL_FACCH); lich.setOutbound(true); lich.encode(data + 2U); @@ -748,7 +749,7 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t channel::SACCH sacch; sacch.setData(SACCH_IDLE); sacch.setRAN(m_nxdn->m_ran); - sacch.setStructure(NXDN_SR_SINGLE); + sacch.setStructure(ChStructure::SR_SINGLE); sacch.encode(data + 2U); facch.encode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS); @@ -757,7 +758,7 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t NXDNUtils::scrambler(data + 2U); if (m_nxdn->m_duplex) { - data[0U] = type == RTCH_MESSAGE_TYPE_TX_REL ? modem::TAG_EOT : modem::TAG_DATA; + data[0U] = type == MessageType::RTCH_TX_REL ? modem::TAG_EOT : modem::TAG_DATA; data[1U] = 0x00U; m_nxdn->addFrame(data, NXDN_FRAME_LENGTH_BYTES + 2U, true); @@ -790,15 +791,15 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t channel::FACCH1 facch; bool valid = false; switch (option) { - case NXDN_LICH_STEAL_FACCH: + case ChOption::STEAL_FACCH: valid = facch.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS); if (!valid) valid = facch.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS + NXDN_FACCH1_FEC_LENGTH_BITS); break; - case NXDN_LICH_STEAL_FACCH1_1: + case ChOption::STEAL_FACCH1_1: valid = facch.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS); break; - case NXDN_LICH_STEAL_FACCH1_2: + case ChOption::STEAL_FACCH1_2: valid = facch.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS + NXDN_FACCH1_FEC_LENGTH_BITS); break; default: @@ -813,7 +814,7 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t lc::RTCH lc; lc.decode(buffer, NXDN_FACCH1_FEC_LENGTH_BITS); - hasInfo = lc.getMessageType() == RTCH_MESSAGE_TYPE_VCALL; + hasInfo = lc.getMessageType() == MessageType::RTCH_VCALL; if (!hasInfo) return false; @@ -826,22 +827,22 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t uint8_t structure = sacch.getStructure(); switch (structure) { - case NXDN_SR_1_4: + case ChStructure::SR_1_4: m_nxdn->m_netLC.decode(message, 18U, 0U); - if(m_nxdn->m_netLC.getMessageType() == RTCH_MESSAGE_TYPE_VCALL) + if(m_nxdn->m_netLC.getMessageType() == MessageType::RTCH_VCALL) m_nxdn->m_netMask = 0x01U; else m_nxdn->m_netMask = 0x00U; break; - case NXDN_SR_2_4: + case ChStructure::SR_2_4: m_nxdn->m_netMask |= 0x02U; m_nxdn->m_netLC.decode(message, 18U, 18U); break; - case NXDN_SR_3_4: + case ChStructure::SR_3_4: m_nxdn->m_netMask |= 0x04U; m_nxdn->m_netLC.decode(message, 18U, 36U); break; - case NXDN_SR_4_4: + case ChStructure::SR_4_4: m_nxdn->m_netMask |= 0x08U; m_nxdn->m_netLC.decode(message, 18U, 54U); break; @@ -853,7 +854,7 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t return false; uint8_t type = m_nxdn->m_netLC.getMessageType(); - if (type != RTCH_MESSAGE_TYPE_VCALL) + if (type != MessageType::RTCH_VCALL) return false; } @@ -895,9 +896,9 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t // generate the LICH channel::LICH lich; - lich.setRFCT(NXDN_LICH_RFCT_RDCH); - lich.setFCT(NXDN_LICH_USC_SACCH_NS); - lich.setOption(NXDN_LICH_STEAL_FACCH); + lich.setRFCT(RFChannelType::RDCH); + lich.setFCT(FuncChannelType::USC_SACCH_NS); + lich.setOption(ChOption::STEAL_FACCH); lich.setOutbound(true); lich.encode(start + 2U); @@ -905,7 +906,7 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t channel::SACCH sacch; sacch.setData(SACCH_IDLE); sacch.setRAN(m_nxdn->m_ran); - sacch.setStructure(NXDN_SR_SINGLE); + sacch.setStructure(ChStructure::SR_SINGLE); sacch.encode(start + 2U); uint8_t buffer[NXDN_RTCH_LC_LENGTH_BYTES]; @@ -932,8 +933,8 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t // regenerate the LICH channel::LICH lich; - lich.setRFCT(NXDN_LICH_RFCT_RDCH); - lich.setFCT(NXDN_LICH_USC_SACCH_SS); + lich.setRFCT(RFChannelType::RDCH); + lich.setFCT(FuncChannelType::USC_SACCH_SS); lich.setOption(option); lich.setOutbound(true); lich.encode(data + 2U); @@ -947,7 +948,7 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t } // regenerate the audio and interpret the FACCH1 data - if (option == NXDN_LICH_STEAL_NONE) { + if (option == ChOption::STEAL_NONE) { edac::AMBEFEC ambe; uint32_t errors = 0U; @@ -963,7 +964,7 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t if (m_verbose) { LogMessage(LOG_NET, "NXDN, " NXDN_RTCH_MSG_TYPE_VCALL ", audio, srcId = %u, dstId = %u, errs = %u/141 (%.1f%%)", m_nxdn->m_netLC.getSrcId(), m_nxdn->m_netLC.getDstId(), errors, float(errors) / 1.88F); } - } else if (option == NXDN_LICH_STEAL_FACCH1_1) { + } else if (option == ChOption::STEAL_FACCH1_1) { channel::FACCH1 facch1; bool valid = facch1.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_FEC_LENGTH_BITS); if (valid) @@ -982,7 +983,7 @@ bool Voice::processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t if (m_verbose) { LogMessage(LOG_NET, "NXDN, " NXDN_RTCH_MSG_TYPE_VCALL ", audio, srcId = %u, dstId = %u, errs = %u/94 (%.1f%%)", m_nxdn->m_netLC.getSrcId(), m_nxdn->m_netLC.getDstId(), errors, float(errors) / 0.94F); } - } else if (option == NXDN_LICH_STEAL_FACCH1_2) { + } else if (option == ChOption::STEAL_FACCH1_2) { edac::AMBEFEC ambe; uint32_t errors = 0U; diff --git a/src/host/nxdn/packet/Voice.h b/src/host/nxdn/packet/Voice.h index 25b9efc2..95033ded 100644 --- a/src/host/nxdn/packet/Voice.h +++ b/src/host/nxdn/packet/Voice.h @@ -9,7 +9,7 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2015-2020 Jonathan Naylor, G4KLX -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022-2024 Bryan Biedenkapp, N2PLL * */ #if !defined(__NXDN_PACKET_VOICE_H__) @@ -45,9 +45,9 @@ namespace nxdn void resetNet(); /// Process a data frame from the RF interface. - bool process(uint8_t fct, uint8_t option, uint8_t* data, uint32_t len); + bool process(defines::FuncChannelType::E fct, defines::ChOption::E option, uint8_t* data, uint32_t len); /// Process a data frame from the network. - bool processNetwork(uint8_t fct, uint8_t option, lc::RTCH& netLC, uint8_t* data, uint32_t len); + bool processNetwork(defines::FuncChannelType::E fct, defines::ChOption::E option, lc::RTCH& netLC, uint8_t* data, uint32_t len); protected: friend class packet::Data; diff --git a/src/host/p25/Control.cpp b/src/host/p25/Control.cpp index cedd903f..7ab97c69 100644 --- a/src/host/p25/Control.cpp +++ b/src/host/p25/Control.cpp @@ -25,8 +25,9 @@ #include "ActivityLog.h" #include "HostMain.h" -using namespace p25; using namespace p25::packet; +using namespace p25::defines; +using namespace p25; #include #include @@ -163,9 +164,9 @@ Control::Control(bool authoritative, uint32_t nac, uint32_t callHang, uint32_t q m_random = mt; m_llaK = nullptr; - m_llaRS = new uint8_t[P25_AUTH_KEY_LENGTH_BYTES]; - m_llaCRS = new uint8_t[P25_AUTH_KEY_LENGTH_BYTES]; - m_llaKS = new uint8_t[P25_AUTH_KEY_LENGTH_BYTES]; + m_llaRS = new uint8_t[AUTH_KEY_LENGTH_BYTES]; + m_llaCRS = new uint8_t[AUTH_KEY_LENGTH_BYTES]; + m_llaKS = new uint8_t[AUTH_KEY_LENGTH_BYTES]; } /// @@ -241,10 +242,10 @@ void Control::setOptions(yaml::Node& conf, bool supervisor, const std::string cw if (key.size() == 32) { if ((key.find_first_not_of("0123456789abcdefABCDEF", 2) == std::string::npos)) { const char* keyPtr = key.c_str(); - m_llaK = new uint8_t[P25_AUTH_KEY_LENGTH_BYTES]; - ::memset(m_llaK, 0x00U, P25_AUTH_KEY_LENGTH_BYTES); + m_llaK = new uint8_t[AUTH_KEY_LENGTH_BYTES]; + ::memset(m_llaK, 0x00U, AUTH_KEY_LENGTH_BYTES); - for (uint8_t i = 0; i < P25_AUTH_KEY_LENGTH_BYTES; i++) { + for (uint8_t i = 0; i < AUTH_KEY_LENGTH_BYTES; i++) { char t[4] = {keyPtr[0], keyPtr[1], 0}; m_llaK[i] = (uint8_t)::strtoul(t, NULL, 16); keyPtr += 2 * sizeof(char); @@ -336,24 +337,24 @@ void Control::setOptions(yaml::Node& conf, bool supervisor, const std::string cw /* ** Voice Silence and Frame Loss Thresholds */ - m_voice->m_silenceThreshold = p25Protocol["silenceThreshold"].as(p25::DEFAULT_SILENCE_THRESHOLD); + m_voice->m_silenceThreshold = p25Protocol["silenceThreshold"].as(DEFAULT_SILENCE_THRESHOLD); if (m_voice->m_silenceThreshold > MAX_P25_VOICE_ERRORS) { - LogWarning(LOG_P25, "Silence threshold > %u, defaulting to %u", p25::MAX_P25_VOICE_ERRORS, p25::DEFAULT_SILENCE_THRESHOLD); - m_voice->m_silenceThreshold = p25::DEFAULT_SILENCE_THRESHOLD; + LogWarning(LOG_P25, "Silence threshold > %u, defaulting to %u", MAX_P25_VOICE_ERRORS, DEFAULT_SILENCE_THRESHOLD); + m_voice->m_silenceThreshold = DEFAULT_SILENCE_THRESHOLD; } // either MAX_P25_VOICE_ERRORS or 0 will disable the threshold logic if (m_voice->m_silenceThreshold == 0) { - LogWarning(LOG_P25, "Silence threshold set to zero, defaulting to %u", p25::MAX_P25_VOICE_ERRORS); - m_voice->m_silenceThreshold = p25::MAX_P25_VOICE_ERRORS; + LogWarning(LOG_P25, "Silence threshold set to zero, defaulting to %u", MAX_P25_VOICE_ERRORS); + m_voice->m_silenceThreshold = MAX_P25_VOICE_ERRORS; } - m_frameLossThreshold = (uint8_t)p25Protocol["frameLossThreshold"].as(p25::DEFAULT_FRAME_LOSS_THRESHOLD); + m_frameLossThreshold = (uint8_t)p25Protocol["frameLossThreshold"].as(DEFAULT_FRAME_LOSS_THRESHOLD); if (m_frameLossThreshold == 0U) { m_frameLossThreshold = 1U; } - if (m_frameLossThreshold > p25::DEFAULT_FRAME_LOSS_THRESHOLD * 2U) { - LogWarning(LOG_P25, "Frame loss threshold may be excessive, default is %u, configured is %u", p25::DEFAULT_FRAME_LOSS_THRESHOLD, m_frameLossThreshold); + if (m_frameLossThreshold > DEFAULT_FRAME_LOSS_THRESHOLD * 2U) { + LogWarning(LOG_P25, "Frame loss threshold may be excessive, default is %u, configured is %u", DEFAULT_FRAME_LOSS_THRESHOLD, m_frameLossThreshold); } /* @@ -380,9 +381,9 @@ void Control::setOptions(yaml::Node& conf, bool supervisor, const std::string cw /* ** CC Service Class */ - uint8_t serviceClass = P25_SVC_CLS_VOICE | P25_SVC_CLS_DATA; + uint8_t serviceClass = ServiceClass::VOICE | ServiceClass::DATA; if (m_enableControl) { - serviceClass |= P25_SVC_CLS_REG; + serviceClass |= ServiceClass::REG; } /* @@ -435,7 +436,7 @@ void Control::setOptions(yaml::Node& conf, bool supervisor, const std::string cw HTTP_PUT, PUT_PERMIT_TG, req, voiceChData.ssl(), REST_DEFAULT_WAIT, m_debug); } else { - ::LogError(LOG_P25, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Grant), failed to clear TG permit, chNo = %u", chNo); + ::LogError(LOG_P25, P25_TSDU_STR ", TSBKO, IOSP_GRP_VCH (Group Voice Channel Grant), failed to clear TG permit, chNo = %u", chNo); } } }); @@ -507,7 +508,7 @@ void Control::setOptions(yaml::Node& conf, bool supervisor, const std::string cw // are we overriding the NAC for split NAC operations? uint32_t txNAC = (uint32_t)::strtoul(systemConf["config"]["txNAC"].as("F7E").c_str(), NULL, 16); - if (txNAC != P25_NAC_DIGITAL_SQ && txNAC != m_nac) { + if (txNAC != NAC_DIGITAL_SQ && txNAC != m_nac) { LogMessage(LOG_P25, "Split NAC operations, setting Tx NAC to $%03X", txNAC); m_txNAC = txNAC; m_nid.setTxNAC(m_txNAC); @@ -600,7 +601,7 @@ bool Control::processFrame(uint8_t* data, uint32_t len) if (!valid && m_rfState == RS_RF_LISTENING) return false; - uint8_t duid = m_nid.getDUID(); + DUID::E duid = m_nid.getDUID(); // Have we got RSSI bytes on the end of a P25 LDU? if (len == (P25_LDU_FRAME_LENGTH_BYTES + 4U)) { @@ -632,7 +633,7 @@ bool Control::processFrame(uint8_t* data, uint32_t len) // are we interrupting a running CC? if (m_ccRunning) { - if (duid != P25_DUID_TSDU) { + if (duid != DUID::TSDU) { m_ccHalted = true; } } @@ -641,11 +642,11 @@ bool Control::processFrame(uint8_t* data, uint32_t len) // handle individual DUIDs switch (duid) { - case P25_DUID_HDU: - case P25_DUID_LDU1: - case P25_DUID_VSELP1: - case P25_DUID_VSELP2: - case P25_DUID_LDU2: + case DUID::HDU: + case DUID::LDU1: + case DUID::VSELP1: + case DUID::VSELP2: + case DUID::LDU2: if (m_controlOnly) { if (m_debug) { LogDebug(LOG_RF, "CC only mode, ignoring HDU/LDU from RF"); @@ -661,17 +662,17 @@ bool Control::processFrame(uint8_t* data, uint32_t len) } break; - case P25_DUID_TDU: - case P25_DUID_TDULC: + case DUID::TDU: + case DUID::TDULC: m_frameLossCnt = 0U; ret = m_voice->process(data, len); break; - case P25_DUID_PDU: + case DUID::PDU: ret = m_data->process(data, len); break; - case P25_DUID_TSDU: + case DUID::TSDU: ret = m_control->process(data, len); break; @@ -1249,13 +1250,13 @@ void Control::processNetwork() bool unitToUnit = (buffer[14U] & 0x01U) == 0x01U; // process network message header - uint8_t duid = buffer[22U]; + DUID::E duid = (DUID::E)buffer[22U]; uint8_t MFId = buffer[15U]; // process raw P25 data bytes UInt8Array data; uint8_t frameLength = buffer[23U]; - if (duid == p25::P25_DUID_PDU) { + if (duid == DUID::PDU) { frameLength = length; data = std::unique_ptr(new uint8_t[length]); ::memset(data.get(), 0x00U, length); @@ -1274,7 +1275,7 @@ void Control::processNetwork() } // is this a PDU? - if (duid == P25_DUID_PDU) { + if (duid == DUID::PDU) { if (m_controlOnly) { if (m_debug) { LogDebug(LOG_NET, "CC only mode, ignoring PDU from network"); @@ -1307,7 +1308,7 @@ void Control::processNetwork() uint8_t lsd1 = buffer[20U]; uint8_t lsd2 = buffer[21U]; - uint8_t frameType = p25::P25_FT_DATA_UNIT; + FrameType::E frameType = FrameType::DATA_UNIT; // if the netId or sysId is missing; default to our netId and sysId if (netId == 0U) { @@ -1326,28 +1327,28 @@ void Control::processNetwork() data::LowSpeedData lsd; // is this a LDU1, is this the first of a call? - if (duid == p25::P25_DUID_LDU1) { - frameType = buffer[180U]; + if (duid == DUID::LDU1) { + frameType = (FrameType::E)buffer[180U]; if (m_debug) { LogDebug(LOG_NET, "P25, frameType = $%02X", frameType); } - if (frameType == p25::P25_FT_HDU_VALID) { + if (frameType == FrameType::HDU_VALID) { uint8_t algId = buffer[181U]; uint32_t kid = (buffer[182U] << 8) | (buffer[183U] << 0); // copy MI data - uint8_t mi[p25::P25_MI_LENGTH_BYTES]; - ::memset(mi, 0x00U, p25::P25_MI_LENGTH_BYTES); + uint8_t mi[MI_LENGTH_BYTES]; + ::memset(mi, 0x00U, MI_LENGTH_BYTES); - for (uint8_t i = 0; i < p25::P25_MI_LENGTH_BYTES; i++) { + for (uint8_t i = 0; i < MI_LENGTH_BYTES; i++) { mi[i] = buffer[184U + i]; } if (m_debug) { LogDebug(LOG_NET, "P25, HDU algId = $%02X, kId = $%02X", algId, kid); - Utils::dump(1U, "P25 HDU Network MI", mi, p25::P25_MI_LENGTH_BYTES); + Utils::dump(1U, "P25 HDU Network MI", mi, MI_LENGTH_BYTES); } control.setAlgId(algId); @@ -1375,11 +1376,11 @@ void Control::processNetwork() // forward onto the specific processor for final processing and delivery switch (duid) { - case P25_DUID_HDU: - case P25_DUID_LDU1: - case P25_DUID_VSELP1: - case P25_DUID_VSELP2: - case P25_DUID_LDU2: + case DUID::HDU: + case DUID::LDU1: + case DUID::VSELP1: + case DUID::VSELP2: + case DUID::LDU2: if (m_controlOnly) { if (m_debug) { LogDebug(LOG_NET, "CC only mode, ignoring HDU/LDU from network"); @@ -1390,10 +1391,10 @@ void Control::processNetwork() ret = m_voice->processNetwork(data.get(), frameLength, control, lsd, duid, frameType); break; - case P25_DUID_TDU: - case P25_DUID_TDULC: + case DUID::TDU: + case DUID::TDULC: // is this an TDU with a grant demand? - if (duid == P25_DUID_TDU && m_enableControl && grantDemand) { + if (duid == DUID::TDU && m_enableControl && grantDemand) { if (m_disableNetworkGrant) { return; } @@ -1418,7 +1419,7 @@ void Control::processNetwork() // are we denying the grant? if (grantDenial) { - m_control->writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_COLLIDE, (!unitToUnit) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH); + m_control->writeRF_TSDU_Deny(srcId, dstId, ReasonCode::DENY_PTT_COLLIDE, (!unitToUnit) ? TSBKO::IOSP_GRP_VCH : TSBKO::IOSP_UU_VCH); return; } @@ -1435,10 +1436,13 @@ void Control::processNetwork() m_voice->processNetwork(data.get(), frameLength, control, lsd, duid, frameType); break; - case P25_DUID_TSDU: + case DUID::TSDU: m_control->processNetwork(data.get(), frameLength, control, lsd, duid); break; - } + + default: + break; + } } /// @@ -1466,7 +1470,7 @@ void Control::processFrameLoss() m_control->writeNet_TSDU_Call_Term(m_voice->m_rfLC.getSrcId(), m_voice->m_rfLC.getDstId()); writeRF_TDU(false); - m_voice->m_lastDUID = P25_DUID_TDU; + m_voice->m_lastDUID = DUID::TDU; m_voice->writeNet_TDU(); m_rfState = RS_RF_LISTENING; @@ -1634,7 +1638,7 @@ bool Control::writeRF_ControlEnd() if (m_netState == RS_NET_IDLE && m_rfState == RS_RF_LISTENING) { for (uint32_t i = 0; i < TSBK_PCH_CCH_CNT; i++) { - m_control->queueRF_TSBK_Ctrl(TSBK_OSP_MOT_PSH_CCH); + m_control->queueRF_TSBK_Ctrl(TSBKO::OSP_MOT_PSH_CCH); } writeRF_Nulls(); @@ -1710,13 +1714,13 @@ void Control::writeRF_TDU(bool noNetwork) Sync::addP25Sync(data + 2U); // Generate NID - m_nid.encode(data + 2U, P25_DUID_TDU); + m_nid.encode(data + 2U, DUID::TDU); // Add busy bits P25Utils::addBusyBits(data + 2U, P25_TDU_FRAME_LENGTH_BITS, true, true); if (!noNetwork) - m_voice->writeNetwork(data + 2U, P25_DUID_TDU); + m_voice->writeNetwork(data + 2U, DUID::TDU); if (m_duplex) { data[0U] = modem::TAG_EOT; @@ -1731,9 +1735,9 @@ void Control::writeRF_TDU(bool noNetwork) /// void Control::generateLLA_AM1_Parameters() { - ::memset(m_llaRS, 0x00U, P25_AUTH_KEY_LENGTH_BYTES); - ::memset(m_llaCRS, 0x00U, P25_AUTH_KEY_LENGTH_BYTES); - ::memset(m_llaKS, 0x00U, P25_AUTH_KEY_LENGTH_BYTES); + ::memset(m_llaRS, 0x00U, AUTH_KEY_LENGTH_BYTES); + ::memset(m_llaCRS, 0x00U, AUTH_KEY_LENGTH_BYTES); + ::memset(m_llaKS, 0x00U, AUTH_KEY_LENGTH_BYTES); if (m_llaK == nullptr) { return; @@ -1742,7 +1746,7 @@ void Control::generateLLA_AM1_Parameters() crypto::AES* aes = new crypto::AES(crypto::AESKeyLength::AES_128); // generate new RS - uint8_t RS[P25_AUTH_RAND_SEED_LENGTH_BYTES]; + uint8_t RS[AUTH_RAND_SEED_LENGTH_BYTES]; std::uniform_int_distribution dist(DVM_RAND_MIN, DVM_RAND_MAX); uint32_t rnd = dist(m_random); __SET_UINT32(rnd, RS, 0U); @@ -1754,16 +1758,16 @@ void Control::generateLLA_AM1_Parameters() RS[9U] = (uint8_t)(rnd & 0xFFU); // expand RS to 16 bytes - for (uint32_t i = 0; i < P25_AUTH_RAND_SEED_LENGTH_BYTES; i++) + for (uint32_t i = 0; i < AUTH_RAND_SEED_LENGTH_BYTES; i++) m_llaRS[i] = RS[i]; // complement RS - for (uint32_t i = 0; i < P25_AUTH_KEY_LENGTH_BYTES; i++) + for (uint32_t i = 0; i < AUTH_KEY_LENGTH_BYTES; i++) m_llaCRS[i] = ~m_llaRS[i]; // perform crypto - uint8_t* KS = aes->encryptECB(m_llaRS, P25_AUTH_KEY_LENGTH_BYTES * sizeof(uint8_t), m_llaK); - ::memcpy(m_llaKS, KS, P25_AUTH_KEY_LENGTH_BYTES); + uint8_t* KS = aes->encryptECB(m_llaRS, AUTH_KEY_LENGTH_BYTES * sizeof(uint8_t), m_llaK); + ::memcpy(m_llaKS, KS, AUTH_KEY_LENGTH_BYTES); if (m_verbose) { LogMessage(LOG_P25, "P25, generated LLA AM1 parameters"); diff --git a/src/host/p25/lc/tsbk/OSP_DVM_GIT_HASH.cpp b/src/host/p25/lc/tsbk/OSP_DVM_GIT_HASH.cpp index 44fadde7..e68165e5 100644 --- a/src/host/p25/lc/tsbk/OSP_DVM_GIT_HASH.cpp +++ b/src/host/p25/lc/tsbk/OSP_DVM_GIT_HASH.cpp @@ -7,16 +7,17 @@ * @package DVM / Modem Host Software * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2022,2024 Bryan Biedenkapp, N2PLL * */ #include "Defines.h" #include "p25/lc/tsbk/OSP_DVM_GIT_HASH.h" #include "HostMain.h" -using namespace p25::lc::tsbk; -using namespace p25::lc; using namespace p25; +using namespace p25::defines; +using namespace p25::lc; +using namespace p25::lc::tsbk; #include @@ -29,8 +30,7 @@ using namespace p25; /// OSP_DVM_GIT_HASH::OSP_DVM_GIT_HASH() : TSBK() { - m_lco = TSBK_OSP_DVM_GIT_HASH; - m_mfId = P25_MFG_DVM_OCS; + m_lco = TSBKO::OSP_DVM_GIT_HASH; } /// @@ -60,6 +60,8 @@ void OSP_DVM_GIT_HASH::encode(uint8_t* data, bool rawTSBK, bool noTrellis) ulong64_t tsbkValue = 0U; + m_mfId = MFG_DVM_OCS; + tsbkValue = g_gitHashBytes[0]; // ... tsbkValue = (tsbkValue << 8) + (g_gitHashBytes[1U]); // ... tsbkValue = (tsbkValue << 8) + (g_gitHashBytes[2U]); // ... @@ -79,5 +81,5 @@ void OSP_DVM_GIT_HASH::encode(uint8_t* data, bool rawTSBK, bool noTrellis) /// std::string OSP_DVM_GIT_HASH::toString(bool isp) { - return std::string("TSBK_OSP_DVM_GIT_HASH (DVM Git Hash Identifier)"); + return std::string("TSBKO, OSP_DVM_GIT_HASH (DVM Git Hash Identifier)"); } diff --git a/src/host/p25/packet/ControlSignaling.cpp b/src/host/p25/packet/ControlSignaling.cpp index 861dbc62..1f6399d6 100644 --- a/src/host/p25/packet/ControlSignaling.cpp +++ b/src/host/p25/packet/ControlSignaling.cpp @@ -30,8 +30,9 @@ #include "HostMain.h" using namespace p25; -using namespace p25::data; +using namespace p25::defines; using namespace p25::lc::tsbk; +using namespace p25::data; using namespace p25::packet; #include @@ -46,7 +47,7 @@ using namespace p25::packet; #define IS_SUPPORT_CONTROL_CHECK(_PCKT_STR, _PCKT, _SRCID) \ if (!m_p25->m_enableControl) { \ LogWarning(LOG_RF, P25_TSDU_STR ", %s denial, unsupported service, srcId = %u", _PCKT_STR.c_str(), _SRCID); \ - writeRF_TSDU_Deny(_SRCID, P25_WUID_FNE, P25_DENY_RSN_SYS_UNSUPPORTED_SVC, _PCKT); \ + writeRF_TSDU_Deny(_SRCID, WUID_FNE, ReasonCode::DENY_SYS_UNSUPPORTED_SVC, _PCKT); \ m_p25->m_rfState = RS_RF_REJECTED; \ return false; \ } @@ -55,7 +56,7 @@ using namespace p25::packet; #define VALID_SRCID(_PCKT_STR, _PCKT, _SRCID) \ if (!acl::AccessControl::validateSrcId(_SRCID)) { \ LogWarning(LOG_RF, P25_TSDU_STR ", %s denial, RID rejection, srcId = %u", _PCKT_STR.c_str(), _SRCID); \ - writeRF_TSDU_Deny(_SRCID, P25_WUID_FNE, P25_DENY_RSN_REQ_UNIT_NOT_VALID, _PCKT); \ + writeRF_TSDU_Deny(_SRCID, WUID_FNE, ReasonCode::DENY_REQ_UNIT_NOT_VALID, _PCKT); \ denialInhibit(_SRCID); \ m_p25->m_rfState = RS_RF_REJECTED; \ return false; \ @@ -65,7 +66,7 @@ using namespace p25::packet; #define VALID_DSTID(_PCKT_STR, _PCKT, _SRCID, _DSTID) \ if (!acl::AccessControl::validateSrcId(_DSTID)) { \ LogWarning(LOG_RF, P25_TSDU_STR ", %s denial, RID rejection, dstId = %u", _PCKT_STR.c_str(), _DSTID); \ - writeRF_TSDU_Deny(_SRCID, _DSTID, P25_DENY_RSN_TGT_UNIT_NOT_VALID, _PCKT); \ + writeRF_TSDU_Deny(_SRCID, _DSTID, ReasonCode::DENY_TGT_UNIT_NOT_VALID, _PCKT); \ m_p25->m_rfState = RS_RF_REJECTED; \ return false; \ } @@ -74,7 +75,7 @@ using namespace p25::packet; #define VALID_TGID(_PCKT_STR, _PCKT, _SRCID, _DSTID) \ if (!acl::AccessControl::validateTGId(_DSTID)) { \ LogWarning(LOG_RF, P25_TSDU_STR ", %s denial, TGID rejection, dstId = %u", _PCKT_STR.c_str(), _DSTID); \ - writeRF_TSDU_Deny(_SRCID, _DSTID, P25_DENY_RSN_TGT_GROUP_NOT_VALID, _PCKT); \ + writeRF_TSDU_Deny(_SRCID, _DSTID, ReasonCode::DENY_TGT_GROUP_NOT_VALID, _PCKT); \ m_p25->m_rfState = RS_RF_REJECTED; \ return false; \ } @@ -83,7 +84,7 @@ using namespace p25::packet; #define VERIFY_SRCID_REG(_PCKT_STR, _PCKT, _SRCID) \ if (!m_p25->m_affiliations.isUnitReg(_SRCID) && m_verifyReg) { \ LogWarning(LOG_RF, P25_TSDU_STR ", %s denial, RID not registered, srcId = %u", _PCKT_STR.c_str(), _SRCID); \ - writeRF_TSDU_Deny(_SRCID, P25_WUID_FNE, P25_DENY_RSN_REQ_UNIT_NOT_AUTH, _PCKT); \ + writeRF_TSDU_Deny(_SRCID, WUID_FNE, ReasonCode::DENY_REQ_UNIT_NOT_AUTH, _PCKT); \ writeRF_TSDU_U_Reg_Cmd(_SRCID); \ m_p25->m_rfState = RS_RF_REJECTED; \ return false; \ @@ -93,7 +94,7 @@ using namespace p25::packet; #define VERIFY_SRCID_AFF(_PCKT_STR, _PCKT, _SRCID, _DSTID) \ if (!m_p25->m_affiliations.isGroupAff(_SRCID, _DSTID) && m_verifyAff) { \ LogWarning(LOG_RF, P25_TSDU_STR ", %s denial, RID not affiliated to TGID, srcId = %u, dstId = %u", _PCKT_STR.c_str(), _SRCID, _DSTID); \ - writeRF_TSDU_Deny(_SRCID, _DSTID, P25_DENY_RSN_REQ_UNIT_NOT_AUTH, _PCKT); \ + writeRF_TSDU_Deny(_SRCID, _DSTID, ReasonCode::DENY_REQ_UNIT_NOT_AUTH, _PCKT); \ writeRF_TSDU_U_Reg_Cmd(_SRCID); \ m_p25->m_rfState = RS_RF_REJECTED; \ return false; \ @@ -173,7 +174,7 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptrm_enableControl) return false; - uint8_t duid = 0U; + DUID::E duid = DUID::HDU; if (preDecodedTSBK == nullptr) { // Decode the NID bool valid = m_p25->m_nid.decode(data + 2U); @@ -183,14 +184,14 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptrm_nid.getDUID(); } else { - duid = P25_DUID_TSDU; + duid = DUID::TSDU; } RPT_RF_STATE prevRfState = m_p25->m_rfState; std::unique_ptr tsbk; // handle individual DUIDs - if (duid == P25_DUID_TSDU) { + if (duid == DUID::TSDU) { if (m_p25->m_rfState != RS_RF_DATA) { m_p25->m_rfState = RS_RF_DATA; } @@ -219,19 +220,19 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptrgetLCO()) { - case TSBK_IOSP_GRP_VCH: + case TSBKO::IOSP_GRP_VCH: { // make sure control data is supported - IS_SUPPORT_CONTROL_CHECK(tsbk->toString(true), TSBK_IOSP_GRP_VCH, srcId); + IS_SUPPORT_CONTROL_CHECK(tsbk->toString(true), TSBKO::IOSP_GRP_VCH, srcId); // validate the source RID - VALID_SRCID(tsbk->toString(true), TSBK_IOSP_GRP_VCH, srcId); + VALID_SRCID(tsbk->toString(true), TSBKO::IOSP_GRP_VCH, srcId); // validate the talkgroup ID - VALID_TGID(tsbk->toString(true), TSBK_IOSP_GRP_VCH, srcId, dstId); + VALID_TGID(tsbk->toString(true), TSBKO::IOSP_GRP_VCH, srcId, dstId); // verify the source RID is affiliated - VERIFY_SRCID_AFF(tsbk->toString(true), TSBK_IOSP_GRP_VCH, srcId, dstId); + VERIFY_SRCID_AFF(tsbk->toString(true), TSBKO::IOSP_GRP_VCH, srcId, dstId); VERBOSE_LOG_TSBK(tsbk->toString(true), srcId, dstId); if (m_p25->m_authoritative) { @@ -246,19 +247,19 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptrtoString(true), TSBK_IOSP_UU_VCH, srcId); + IS_SUPPORT_CONTROL_CHECK(tsbk->toString(true), TSBKO::IOSP_UU_VCH, srcId); // validate the source RID - VALID_SRCID(tsbk->toString(true), TSBK_IOSP_UU_VCH, srcId); + VALID_SRCID(tsbk->toString(true), TSBKO::IOSP_UU_VCH, srcId); // validate the target RID - VALID_DSTID(tsbk->toString(true), TSBK_IOSP_UU_VCH, srcId, dstId); + VALID_DSTID(tsbk->toString(true), TSBKO::IOSP_UU_VCH, srcId, dstId); // verify the source RID is registered - VERIFY_SRCID_REG(tsbk->toString(true), TSBK_IOSP_UU_VCH, srcId); + VERIFY_SRCID_REG(tsbk->toString(true), TSBKO::IOSP_UU_VCH, srcId); VERBOSE_LOG_TSBK(tsbk->toString(true), srcId, dstId); if (m_unitToUnitAvailCheck) { @@ -278,16 +279,16 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptrtoString(true), TSBK_IOSP_UU_ANS, srcId); + IS_SUPPORT_CONTROL_CHECK(tsbk->toString(true), TSBKO::IOSP_UU_ANS, srcId); // validate the source RID - VALID_SRCID(tsbk->toString(true), TSBK_IOSP_UU_ANS, srcId); + VALID_SRCID(tsbk->toString(true), TSBKO::IOSP_UU_ANS, srcId); // validate the target RID - VALID_DSTID(tsbk->toString(true), TSBK_IOSP_UU_ANS, srcId, dstId); + VALID_DSTID(tsbk->toString(true), TSBKO::IOSP_UU_ANS, srcId, dstId); IOSP_UU_ANS* iosp = static_cast(tsbk.get()); if (m_verbose) { @@ -295,7 +296,7 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptrtoString(true).c_str(), iosp->getResponse(), srcId, dstId); } - if (iosp->getResponse() == P25_ANS_RSP_PROCEED) { + if (iosp->getResponse() == ResponseCode::ANS_PROCEED) { if (m_p25->m_authoritative) { uint8_t serviceOptions = (tsbk->getEmergency() ? 0x80U : 0x00U) + // Emergency Flag (tsbk->getEncrypted() ? 0x40U : 0x00U) + // Encrypted Flag @@ -307,32 +308,32 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptrm_network->writeGrantReq(modem::DVM_STATE::STATE_P25, srcId, dstId, 0U, true); } } - else if (iosp->getResponse() == P25_ANS_RSP_DENY) { - writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_TGT_UNIT_REFUSED, TSBK_IOSP_UU_ANS); + else if (iosp->getResponse() == ResponseCode::ANS_DENY) { + writeRF_TSDU_Deny(srcId, dstId, ReasonCode::DENY_TGT_UNIT_REFUSED, TSBKO::IOSP_UU_ANS); } - else if (iosp->getResponse() == P25_ANS_RSP_WAIT) { - writeRF_TSDU_Queue(srcId, dstId, P25_QUE_RSN_TGT_UNIT_QUEUED, TSBK_IOSP_UU_ANS); + else if (iosp->getResponse() == ResponseCode::ANS_WAIT) { + writeRF_TSDU_Queue(srcId, dstId, ReasonCode::QUE_TGT_UNIT_QUEUED, TSBKO::IOSP_UU_ANS); } } break; - case TSBK_IOSP_TELE_INT_ANS: + case TSBKO::IOSP_TELE_INT_ANS: { // make sure control data is supported - IS_SUPPORT_CONTROL_CHECK(tsbk->toString(true), TSBK_IOSP_TELE_INT_ANS, srcId); + IS_SUPPORT_CONTROL_CHECK(tsbk->toString(true), TSBKO::IOSP_TELE_INT_ANS, srcId); // validate the source RID - VALID_SRCID(tsbk->toString(true), TSBK_IOSP_TELE_INT_ANS, srcId); + VALID_SRCID(tsbk->toString(true), TSBKO::IOSP_TELE_INT_ANS, srcId); - writeRF_TSDU_Deny(srcId, P25_WUID_FNE, P25_DENY_RSN_SYS_UNSUPPORTED_SVC, TSBK_IOSP_TELE_INT_ANS); + writeRF_TSDU_Deny(srcId, WUID_FNE, ReasonCode::DENY_SYS_UNSUPPORTED_SVC, TSBKO::IOSP_TELE_INT_ANS); } break; - case TSBK_ISP_SNDCP_CH_REQ: + case TSBKO::ISP_SNDCP_CH_REQ: { // make sure control data is supported - IS_SUPPORT_CONTROL_CHECK(tsbk->toString(true), TSBK_ISP_SNDCP_CH_REQ, srcId); + IS_SUPPORT_CONTROL_CHECK(tsbk->toString(true), TSBKO::ISP_SNDCP_CH_REQ, srcId); // validate the source RID - VALID_SRCID(tsbk->toString(true), TSBK_ISP_SNDCP_CH_REQ, srcId); + VALID_SRCID(tsbk->toString(true), TSBKO::ISP_SNDCP_CH_REQ, srcId); ISP_SNDCP_CH_REQ* isp = static_cast(tsbk.get()); if (m_verbose) { @@ -344,14 +345,14 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptrtoString(true), TSBK_IOSP_STS_UPDT, srcId); + VALID_SRCID(tsbk->toString(true), TSBKO::IOSP_STS_UPDT, srcId); IOSP_STS_UPDT* iosp = static_cast(tsbk.get()); if (m_verbose) { @@ -362,16 +363,16 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptrtoString(true), TSBK_IOSP_MSG_UPDT, srcId); + VALID_SRCID(tsbk->toString(true), TSBKO::IOSP_MSG_UPDT, srcId); IOSP_MSG_UPDT* iosp = static_cast(tsbk.get()); if (m_verbose) { @@ -382,19 +383,19 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptrtoString(true), TSBK_IOSP_RAD_MON, srcId); + VALID_SRCID(tsbk->toString(true), TSBKO::IOSP_RAD_MON, srcId); // validate the target RID - VALID_DSTID(tsbk->toString(true), TSBK_IOSP_RAD_MON, srcId, dstId); + VALID_DSTID(tsbk->toString(true), TSBKO::IOSP_RAD_MON, srcId, dstId); IOSP_RAD_MON* iosp = static_cast(tsbk.get()); if (m_verbose) { @@ -407,13 +408,13 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptrgetTxMult()); } break; - case TSBK_IOSP_CALL_ALRT: + case TSBKO::IOSP_CALL_ALRT: { // validate the source RID - VALID_SRCID(tsbk->toString(true), TSBK_IOSP_CALL_ALRT, srcId); + VALID_SRCID(tsbk->toString(true), TSBKO::IOSP_CALL_ALRT, srcId); // validate the target RID - VALID_DSTID(tsbk->toString(true), TSBK_IOSP_CALL_ALRT, srcId, dstId); + VALID_DSTID(tsbk->toString(true), TSBKO::IOSP_CALL_ALRT, srcId, dstId); VERBOSE_LOG_TSBK(tsbk->toString(true), srcId, dstId); ::ActivityLog("P25", true, "call alert request from %u to %u", srcId, dstId); @@ -421,13 +422,13 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptrtoString(true), TSBK_IOSP_ACK_RSP, srcId); + VALID_SRCID(tsbk->toString(true), TSBKO::IOSP_ACK_RSP, srcId); // validate the target RID - VALID_DSTID(tsbk->toString(true), TSBK_IOSP_ACK_RSP, srcId, dstId); + VALID_DSTID(tsbk->toString(true), TSBKO::IOSP_ACK_RSP, srcId, dstId); IOSP_ACK_RSP* iosp = static_cast(tsbk.get()); if (m_verbose) { @@ -448,7 +449,7 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptr(tsbk.get()); if (m_verbose) { @@ -458,10 +459,10 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptr(tsbk.get()); if (m_verbose) { @@ -470,20 +471,20 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptrgetExtendedFunction() == P25_EXT_FNCT_CHECK_ACK) { + if (iosp->getExtendedFunction() == ExtendedFunctions::CHECK_ACK) { ::ActivityLog("P25", true, "radio check response from %u to %u", dstId, srcId); } - else if (iosp->getExtendedFunction() == P25_EXT_FNCT_INHIBIT_ACK) { + else if (iosp->getExtendedFunction() == ExtendedFunctions::INHIBIT_ACK) { ::ActivityLog("P25", true, "radio inhibit response from %u to %u", dstId, srcId); } - else if (iosp->getExtendedFunction() == P25_EXT_FNCT_UNINHIBIT_ACK) { + else if (iosp->getExtendedFunction() == ExtendedFunctions::UNINHIBIT_ACK) { ::ActivityLog("P25", true, "radio uninhibit response from %u to %u", dstId, srcId); } writeRF_TSDU_SBF(iosp, true); } break; - case TSBK_ISP_EMERG_ALRM_REQ: + case TSBKO::ISP_EMERG_ALRM_REQ: { ISP_EMERG_ALRM_REQ* isp = static_cast(tsbk.get()); if (isp->getEmergency()) { @@ -493,30 +494,30 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptrtoString(true), TSBK_IOSP_GRP_AFF, srcId); + IS_SUPPORT_CONTROL_CHECK(tsbk->toString(true), TSBKO::IOSP_GRP_AFF, srcId); VERBOSE_LOG_TSBK(tsbk->toString(true), srcId, dstId); if (m_p25->m_ackTSBKRequests) { - writeRF_TSDU_ACK_FNE(srcId, TSBK_IOSP_GRP_AFF, true, true); + writeRF_TSDU_ACK_FNE(srcId, TSBKO::IOSP_GRP_AFF, true, true); } writeRF_TSDU_Grp_Aff_Rsp(srcId, dstId); } break; - case TSBK_ISP_GRP_AFF_Q_RSP: + case TSBKO::ISP_GRP_AFF_Q_RSP: { // make sure control data is supported - IS_SUPPORT_CONTROL_CHECK(tsbk->toString(true), TSBK_ISP_GRP_AFF_Q_RSP, srcId); + IS_SUPPORT_CONTROL_CHECK(tsbk->toString(true), TSBKO::ISP_GRP_AFF_Q_RSP, srcId); if (m_p25->m_ackTSBKRequests) { - writeRF_TSDU_ACK_FNE(srcId, TSBK_ISP_GRP_AFF_Q_RSP, true, true); + writeRF_TSDU_ACK_FNE(srcId, TSBKO::ISP_GRP_AFF_Q_RSP, true, true); } ISP_GRP_AFF_Q_RSP* isp = static_cast(tsbk.get()); @@ -528,13 +529,13 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptrtoString(true), TSBK_ISP_U_DEREG_REQ, srcId); + IS_SUPPORT_CONTROL_CHECK(tsbk->toString(true), TSBKO::ISP_U_DEREG_REQ, srcId); // validate the source RID - VALID_SRCID(tsbk->toString(true), TSBK_ISP_U_DEREG_REQ, srcId); + VALID_SRCID(tsbk->toString(true), TSBKO::ISP_U_DEREG_REQ, srcId); if (m_verbose) { LogMessage(LOG_RF, P25_TSDU_STR ", %s, srcId = %u, sysId = $%03X, netId = $%05X", @@ -542,16 +543,16 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptrm_ackTSBKRequests) { - writeRF_TSDU_ACK_FNE(srcId, TSBK_ISP_U_DEREG_REQ, true, true); + writeRF_TSDU_ACK_FNE(srcId, TSBKO::ISP_U_DEREG_REQ, true, true); } writeRF_TSDU_U_Dereg_Ack(srcId); } break; - case TSBK_IOSP_U_REG: + case TSBKO::IOSP_U_REG: { // make sure control data is supported - IS_SUPPORT_CONTROL_CHECK(tsbk->toString(true), TSBK_IOSP_U_REG, srcId); + IS_SUPPORT_CONTROL_CHECK(tsbk->toString(true), TSBKO::IOSP_U_REG, srcId); if (m_verbose) { LogMessage(LOG_RF, P25_TSDU_STR ", %s, srcId = %u, sysId = $%03X, netId = $%05X", @@ -559,7 +560,7 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptrm_ackTSBKRequests) { - writeRF_TSDU_ACK_FNE(srcId, TSBK_IOSP_U_REG, true, true); + writeRF_TSDU_ACK_FNE(srcId, TSBKO::IOSP_U_REG, true, true); } if (m_requireLLAForReg) { @@ -570,19 +571,19 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptrtoString(true), TSBK_ISP_LOC_REG_REQ, srcId); + IS_SUPPORT_CONTROL_CHECK(tsbk->toString(true), TSBKO::ISP_LOC_REG_REQ, srcId); VERBOSE_LOG_TSBK(tsbk->toString(true), srcId, dstId); writeRF_TSDU_Loc_Reg_Rsp(srcId, dstId, tsbk->getGroup()); } break; - case TSBK_ISP_AUTH_RESP: + case TSBKO::ISP_AUTH_RESP: { // make sure control data is supported - IS_SUPPORT_CONTROL_CHECK(tsbk->toString(true), TSBK_ISP_AUTH_RESP, srcId); + IS_SUPPORT_CONTROL_CHECK(tsbk->toString(true), TSBKO::ISP_AUTH_RESP, srcId); ISP_AUTH_RESP* isp = static_cast(tsbk.get()); if (m_verbose) { @@ -595,7 +596,7 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptrgetAuthRes(RES1); // get challenge for our SU @@ -607,22 +608,22 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptr> 8, RC, 0); RC[4U] = (uint8_t)(challenge & 0xFFU); // expand RAND1 to 16 bytes uint8_t expandedRAND1[16]; - ::memset(expandedRAND1, 0x00U, P25_AUTH_KEY_LENGTH_BYTES); - for (uint32_t i = 0; i < P25_AUTH_RAND_CHLNG_LENGTH_BYTES; i++) + ::memset(expandedRAND1, 0x00U, AUTH_KEY_LENGTH_BYTES); + for (uint32_t i = 0; i < AUTH_RAND_CHLNG_LENGTH_BYTES; i++) expandedRAND1[i] = RC[i]; // generate XRES1 - uint8_t* XRES1 = aes->encryptECB(expandedRAND1, P25_AUTH_KEY_LENGTH_BYTES * sizeof(uint8_t), m_p25->m_llaKS); + uint8_t* XRES1 = aes->encryptECB(expandedRAND1, AUTH_KEY_LENGTH_BYTES * sizeof(uint8_t), m_p25->m_llaKS); // compare RES1 and XRES1 bool authFailed = false; - for (uint32_t i = 0; i < P25_AUTH_RES_LENGTH_BYTES; i++) { + for (uint32_t i = 0; i < AUTH_RES_LENGTH_BYTES; i++) { if (XRES1[i] != RES1[i]) { authFailed = true; } @@ -637,7 +638,7 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptrtoString().c_str(), srcId); ::ActivityLog("P25", true, "unit registration request from %u denied, authentication failure", srcId); - writeRF_TSDU_Deny(srcId, P25_WUID_FNE, P25_DENY_RSN_SU_FAILED_AUTH, TSBK_IOSP_U_REG); + writeRF_TSDU_Deny(srcId, WUID_FNE, ReasonCode::DENY_SU_FAILED_AUTH, TSBKO::IOSP_U_REG); } } break; @@ -670,7 +671,7 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptr /// /// -bool ControlSignaling::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, data::LowSpeedData& lsd, uint8_t& duid) +bool ControlSignaling::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, data::LowSpeedData& lsd, DUID::E& duid) { if (!m_p25->m_enableControl) return false; @@ -678,7 +679,7 @@ bool ControlSignaling::processNetwork(uint8_t* data, uint32_t len, lc::LC& contr return false; switch (duid) { - case P25_DUID_TSDU: + case DUID::TSDU: if (m_p25->m_netState == RS_NET_IDLE) { std::unique_ptr tsbk = TSBKFactory::createTSBK(data); if (tsbk == nullptr) { @@ -686,7 +687,7 @@ bool ControlSignaling::processNetwork(uint8_t* data, uint32_t len, lc::LC& contr } // handle updating internal adjacent site information - if (tsbk->getLCO() == TSBK_OSP_ADJ_STS_BCAST) { + if (tsbk->getLCO() == TSBKO::OSP_ADJ_STS_BCAST) { if (!m_p25->m_enableControl) { return false; } @@ -741,9 +742,9 @@ bool ControlSignaling::processNetwork(uint8_t* data, uint32_t len, lc::LC& contr uint32_t dstId = tsbk->getDstId(); // handle internal / Omaha Communication Systems DVM TSDUs - if (tsbk->getMFId() == P25_MFG_DVM_OCS) { + if (tsbk->getMFId() == MFG_DVM_OCS) { switch (tsbk->getLCO()) { - case LC_CALL_TERM: + case LCO::CALL_TERM: { if (m_p25->m_dedicatedControl) { uint32_t chNo = tsbk->getGrpVchNo(); @@ -761,7 +762,7 @@ bool ControlSignaling::processNetwork(uint8_t* data, uint32_t len, lc::LC& contr return true; // don't allow this to write to the air } - case TSBK_OSP_DVM_GIT_HASH: + case TSBKO::OSP_DVM_GIT_HASH: // ignore return true; // don't allow this to write to the air default: @@ -775,8 +776,8 @@ bool ControlSignaling::processNetwork(uint8_t* data, uint32_t len, lc::LC& contr // handle standard P25 reference opcodes switch (tsbk->getLCO()) { - case TSBK_IOSP_GRP_VCH: - case TSBK_IOSP_UU_VCH: + case TSBKO::IOSP_GRP_VCH: + case TSBKO::IOSP_UU_VCH: { if (m_p25->m_enableControl && m_p25->m_dedicatedControl) { if (!m_p25->m_affiliations.isGranted(dstId)) { @@ -789,15 +790,15 @@ bool ControlSignaling::processNetwork(uint8_t* data, uint32_t len, lc::LC& contr (tsbk->getEncrypted() ? 0x40U : 0x00U) + // Encrypted Flag (tsbk->getPriority() & 0x07U); // Priority - writeRF_TSDU_Grant(srcId, dstId, serviceOptions, (tsbk->getLCO() == TSBK_IOSP_GRP_VCH), true); + writeRF_TSDU_Grant(srcId, dstId, serviceOptions, (tsbk->getLCO() == TSBKO::IOSP_GRP_VCH), true); } } } return true; // don't allow this to write to the air - case TSBK_OSP_GRP_VCH_GRANT_UPD: - case TSBK_OSP_UU_VCH_GRANT_UPD: + case TSBKO::OSP_GRP_VCH_GRANT_UPD: + case TSBKO::OSP_UU_VCH_GRANT_UPD: return true; // don't allow this to write to the air - case TSBK_IOSP_UU_ANS: + case TSBKO::IOSP_UU_ANS: { IOSP_UU_ANS* iosp = static_cast(tsbk.get()); if (iosp->getResponse() > 0U) { @@ -811,7 +812,7 @@ bool ControlSignaling::processNetwork(uint8_t* data, uint32_t len, lc::LC& contr } } break; - case TSBK_IOSP_STS_UPDT: + case TSBKO::IOSP_STS_UPDT: { // validate the source RID VALID_SRCID_NET(tsbk->toString(), srcId); @@ -825,7 +826,7 @@ bool ControlSignaling::processNetwork(uint8_t* data, uint32_t len, lc::LC& contr ::ActivityLog("P25", false, "status update from %u", srcId); } break; - case TSBK_IOSP_MSG_UPDT: + case TSBKO::IOSP_MSG_UPDT: { // validate the source RID VALID_SRCID_NET(tsbk->toString(), srcId); @@ -839,13 +840,13 @@ bool ControlSignaling::processNetwork(uint8_t* data, uint32_t len, lc::LC& contr ::ActivityLog("P25", false, "message update from %u", srcId); } break; - case TSBK_IOSP_RAD_MON: + case TSBKO::IOSP_RAD_MON: { // validate the source RID - VALID_SRCID(tsbk->toString(true), TSBK_IOSP_RAD_MON, srcId); + VALID_SRCID(tsbk->toString(true), TSBKO::IOSP_RAD_MON, srcId); // validate the target RID - VALID_DSTID(tsbk->toString(true), TSBK_IOSP_RAD_MON, srcId, dstId); + VALID_DSTID(tsbk->toString(true), TSBKO::IOSP_RAD_MON, srcId, dstId); IOSP_RAD_MON* iosp = static_cast(tsbk.get()); VERBOSE_LOG_TSBK_NET(tsbk->toString(true), srcId, dstId); @@ -855,7 +856,7 @@ bool ControlSignaling::processNetwork(uint8_t* data, uint32_t len, lc::LC& contr writeRF_TSDU_Radio_Mon(srcId , dstId , iosp->getTxMult()); } break; - case TSBK_IOSP_CALL_ALRT: + case TSBKO::IOSP_CALL_ALRT: { // validate the source RID VALID_SRCID_NET(tsbk->toString(true), srcId); @@ -865,7 +866,7 @@ bool ControlSignaling::processNetwork(uint8_t* data, uint32_t len, lc::LC& contr // validate source RID if (!acl::AccessControl::validateSrcId(srcId)) { - LogWarning(LOG_NET, "P25_DUID_TSDU (Trunking System Data Unit) denial, RID rejection, srcId = %u", srcId); + LogWarning(LOG_NET, "DUID::TSDU (Trunking System Data Unit) denial, RID rejection, srcId = %u", srcId); return false; } @@ -873,7 +874,7 @@ bool ControlSignaling::processNetwork(uint8_t* data, uint32_t len, lc::LC& contr ::ActivityLog("P25", false, "call alert request from %u to %u", srcId, dstId); } break; - case TSBK_IOSP_ACK_RSP: + case TSBKO::IOSP_ACK_RSP: { // validate the source RID VALID_SRCID_NET(tsbk->toString(true), srcId); @@ -890,7 +891,7 @@ bool ControlSignaling::processNetwork(uint8_t* data, uint32_t len, lc::LC& contr ::ActivityLog("P25", false, "ack response from %u to %u", srcId, dstId); } break; - case TSBK_IOSP_EXT_FNCT: + case TSBKO::IOSP_EXT_FNCT: { // validate the target RID VALID_DSTID_NET(tsbk->toString(true), dstId); @@ -902,9 +903,9 @@ bool ControlSignaling::processNetwork(uint8_t* data, uint32_t len, lc::LC& contr } } break; - case TSBK_ISP_EMERG_ALRM_REQ: + case TSBKO::ISP_EMERG_ALRM_REQ: { - // non-emergency mode is a TSBK_OSP_DENY_RSP + // non-emergency mode is a TSBKO::OSP_DENY_RSP if (!tsbk->getEmergency()) { break; // the FNE may explicitly send these } else { @@ -913,18 +914,18 @@ bool ControlSignaling::processNetwork(uint8_t* data, uint32_t len, lc::LC& contr } } break; - case TSBK_IOSP_GRP_AFF: + case TSBKO::IOSP_GRP_AFF: // ignore a network group affiliation command return true; // don't allow this to write to the air - case TSBK_OSP_U_DEREG_ACK: + case TSBKO::OSP_U_DEREG_ACK: // ignore a network user deregistration command return true; // don't allow this to write to the air - case TSBK_OSP_LOC_REG_RSP: + case TSBKO::OSP_LOC_REG_RSP: // ignore a network location registration command return true; // don't allow this to write to the air - case TSBK_OSP_U_REG_CMD: + case TSBKO::OSP_U_REG_CMD: break; // the FNE may explicitly send these - case TSBK_OSP_QUE_RSP: + case TSBKO::OSP_QUE_RSP: break; // the FNE may explicitly send these default: LogError(LOG_NET, P25_TSDU_STR ", unhandled LCO, mfId = $%02X, lco = $%02X", tsbk->getMFId(), tsbk->getLCO()); @@ -975,14 +976,14 @@ void ControlSignaling::writeAdjSSNetwork() } if (m_p25->m_network != nullptr) { - uint8_t cfva = P25_CFVA_VALID; + uint8_t cfva = CFVA::VALID; if (m_p25->m_enableControl && !m_p25->m_dedicatedControl) { - cfva |= P25_CFVA_CONV; + cfva |= CFVA::CONV; } // transmit adjacent site broadcast std::unique_ptr osp = std::make_unique(); - osp->setSrcId(P25_WUID_FNE); + osp->setSrcId(WUID_FNE); osp->setAdjSiteCFVA(cfva); osp->setAdjSiteSysId(m_p25->m_siteData.sysId()); osp->setAdjSiteRFSSId(m_p25->m_siteData.rfssId()); @@ -1011,9 +1012,9 @@ void ControlSignaling::writeRF_TSDU_Call_Alrt(uint32_t srcId, uint32_t dstId) iosp->setSrcId(srcId); iosp->setDstId(dstId); - if (m_lastMFID != P25_MFG_STANDARD) { + if (m_lastMFID != MFG_STANDARD) { iosp->setMFId(m_lastMFID); - m_lastMFID = P25_MFG_STANDARD; + m_lastMFID = MFG_STANDARD; } VERBOSE_LOG_TSBK(iosp->toString(), srcId, dstId); @@ -1057,9 +1058,9 @@ void ControlSignaling::writeRF_TSDU_Ext_Func(uint32_t func, uint32_t arg, uint32 iosp->setSrcId(arg); iosp->setDstId(dstId); - if (m_lastMFID != P25_MFG_STANDARD) { + if (m_lastMFID != MFG_STANDARD) { iosp->setMFId(m_lastMFID); - m_lastMFID = P25_MFG_STANDARD; + m_lastMFID = MFG_STANDARD; } if (m_verbose) { @@ -1068,13 +1069,13 @@ void ControlSignaling::writeRF_TSDU_Ext_Func(uint32_t func, uint32_t arg, uint32 } // generate activity log entry - if (func == P25_EXT_FNCT_CHECK) { + if (func == ExtendedFunctions::CHECK) { ::ActivityLog("P25", true, "radio check request from %u to %u", arg, dstId); } - else if (func == P25_EXT_FNCT_INHIBIT) { + else if (func == ExtendedFunctions::INHIBIT) { ::ActivityLog("P25", true, "radio inhibit request from %u to %u", arg, dstId); } - else if (func == P25_EXT_FNCT_UNINHIBIT) { + else if (func == ExtendedFunctions::UNINHIBIT) { ::ActivityLog("P25", true, "radio uninhibit request from %u to %u", arg, dstId); } @@ -1088,16 +1089,16 @@ void ControlSignaling::writeRF_TSDU_Ext_Func(uint32_t func, uint32_t arg, uint32 void ControlSignaling::writeRF_TSDU_Grp_Aff_Q(uint32_t dstId) { std::unique_ptr osp = std::make_unique(); - osp->setSrcId(P25_WUID_FNE); + osp->setSrcId(WUID_FNE); osp->setDstId(dstId); - if (m_lastMFID != P25_MFG_STANDARD) { + if (m_lastMFID != MFG_STANDARD) { osp->setMFId(m_lastMFID); - m_lastMFID = P25_MFG_STANDARD; + m_lastMFID = MFG_STANDARD; } VERBOSE_LOG_TSBK_DST(osp->toString(), dstId); - ::ActivityLog("P25", true, "group affiliation query command from %u to %u", P25_WUID_FNE, dstId); + ::ActivityLog("P25", true, "group affiliation query command from %u to %u", WUID_FNE, dstId); writeRF_TSDU_SBF(osp.get(), true); } @@ -1109,16 +1110,16 @@ void ControlSignaling::writeRF_TSDU_Grp_Aff_Q(uint32_t dstId) void ControlSignaling::writeRF_TSDU_U_Reg_Cmd(uint32_t dstId) { std::unique_ptr osp = std::make_unique(); - osp->setSrcId(P25_WUID_FNE); + osp->setSrcId(WUID_FNE); osp->setDstId(dstId); - if (m_lastMFID != P25_MFG_STANDARD) { + if (m_lastMFID != MFG_STANDARD) { osp->setMFId(m_lastMFID); - m_lastMFID = P25_MFG_STANDARD; + m_lastMFID = MFG_STANDARD; } VERBOSE_LOG_TSBK_DST(osp->toString(), dstId); - ::ActivityLog("P25", true, "unit registration command from %u to %u", P25_WUID_FNE, dstId); + ::ActivityLog("P25", true, "unit registration command from %u to %u", WUID_FNE, dstId); writeRF_TSDU_SBF(osp.get(), true); } @@ -1211,7 +1212,7 @@ ControlSignaling::ControlSignaling(Control* p25, bool dumpTSBKData, bool debug, m_sccbTable(), m_sccbUpdateCnt(), m_llaDemandTable(), - m_lastMFID(P25_MFG_STANDARD), + m_lastMFID(MFG_STANDARD), m_noStatusAck(false), m_noMessageAck(true), m_unitToUnitAvailCheck(true), @@ -1330,7 +1331,7 @@ void ControlSignaling::writeRF_TDULC(lc::TDULC* lc, bool noNetwork) Sync::addP25Sync(data + 2U); // Generate NID - m_p25->m_nid.encode(data + 2U, P25_DUID_TDULC); + m_p25->m_nid.encode(data + 2U, DUID::TDULC); // Generate TDULC Data lc->encode(data + 2U); @@ -1341,7 +1342,7 @@ void ControlSignaling::writeRF_TDULC(lc::TDULC* lc, bool noNetwork) m_p25->m_rfTimeout.stop(); if (!noNetwork) - writeNetworkRF(lc, data + 2U, P25_DUID_TDULC); + writeNetworkRF(lc, data + 2U, false); if (m_p25->m_duplex) { data[0U] = modem::TAG_EOT; @@ -1371,7 +1372,7 @@ void ControlSignaling::writeNet_TDULC(lc::TDULC* lc) Sync::addP25Sync(buffer + 2U); // Generate NID - m_p25->m_nid.encode(buffer + 2U, P25_DUID_TDULC); + m_p25->m_nid.encode(buffer + 2U, DUID::TDULC); // Regenerate TDULC Data lc->encode(buffer + 2U); @@ -1423,7 +1424,7 @@ void ControlSignaling::writeRF_TSDU_SBF(lc::TSBK* tsbk, bool noNetwork, bool for Sync::addP25Sync(data + 2U); // Generate NID - m_p25->m_nid.encode(data + 2U, P25_DUID_TSDU); + m_p25->m_nid.encode(data + 2U, DUID::TSDU); // Generate TSBK block tsbk->setLastBlock(true); // always set last block -- this a Single Block TSDU @@ -1494,7 +1495,7 @@ void ControlSignaling::writeNet_TSDU(lc::TSBK* tsbk) Sync::addP25Sync(buffer + 2U); // Generate NID - m_p25->m_nid.encode(buffer + 2U, P25_DUID_TSDU); + m_p25->m_nid.encode(buffer + 2U, DUID::TSDU); // Regenerate TSDU Data tsbk->setLastBlock(true); // always set last block -- this a Single Block TSDU @@ -1590,7 +1591,7 @@ void ControlSignaling::writeRF_TSDU_MBF(lc::TSBK* tsbk) Sync::addP25Sync(data + 2U); // Generate NID - m_p25->m_nid.encode(data + 2U, P25_DUID_TSDU); + m_p25->m_nid.encode(data + 2U, DUID::TSDU); // interleave P25Utils::encode(tsdu, data + 2U, 114U, 720U); @@ -1707,7 +1708,7 @@ void ControlSignaling::writeRF_TDULC_ChanRelease(bool grp, uint32_t srcId, uint3 } if (m_verbose) { - LogMessage(LOG_RF, P25_TDULC_STR ", LC_CALL_TERM (Call Termination), srcId = %u, dstId = %u", srcId, dstId); + LogMessage(LOG_RF, P25_TDULC_STR ", CALL_TERM (Call Termination), srcId = %u, dstId = %u", srcId, dstId); } lc = std::make_unique(); @@ -1774,28 +1775,28 @@ void ControlSignaling::writeRF_ControlData(uint8_t frameCnt, uint8_t n, bool adj /** required data */ case 0: default: - queueRF_TSBK_Ctrl(TSBK_OSP_IDEN_UP); + queueRF_TSBK_Ctrl(TSBKO::OSP_IDEN_UP); break; case 1: if (alt) - queueRF_TSBK_Ctrl(TSBK_OSP_RFSS_STS_BCAST); + queueRF_TSBK_Ctrl(TSBKO::OSP_RFSS_STS_BCAST); else - queueRF_TSBK_Ctrl(TSBK_OSP_NET_STS_BCAST); + queueRF_TSBK_Ctrl(TSBKO::OSP_NET_STS_BCAST); break; case 2: if (alt) - queueRF_TSBK_Ctrl(TSBK_OSP_NET_STS_BCAST); + queueRF_TSBK_Ctrl(TSBKO::OSP_NET_STS_BCAST); else - queueRF_TSBK_Ctrl(TSBK_OSP_RFSS_STS_BCAST); + queueRF_TSBK_Ctrl(TSBKO::OSP_RFSS_STS_BCAST); break; case 3: if (alt) - queueRF_TSBK_Ctrl(TSBK_OSP_RFSS_STS_BCAST); + queueRF_TSBK_Ctrl(TSBKO::OSP_RFSS_STS_BCAST); else - queueRF_TSBK_Ctrl(TSBK_OSP_NET_STS_BCAST); + queueRF_TSBK_Ctrl(TSBKO::OSP_NET_STS_BCAST); break; case 4: - queueRF_TSBK_Ctrl(TSBK_OSP_SYNC_BCAST); + queueRF_TSBK_Ctrl(TSBKO::OSP_SYNC_BCAST); break; /** update data */ case 5: @@ -1805,12 +1806,12 @@ void ControlSignaling::writeRF_ControlData(uint8_t frameCnt, uint8_t n, bool adj break; /** extra data */ case 6: - queueRF_TSBK_Ctrl(TSBK_OSP_SNDCP_CH_ANN); + queueRF_TSBK_Ctrl(TSBKO::OSP_SNDCP_CH_ANN); break; case 7: // write ADJSS if (adjSS && m_adjSiteTable.size() > 0) { - queueRF_TSBK_Ctrl(TSBK_OSP_ADJ_STS_BCAST); + queueRF_TSBK_Ctrl(TSBKO::OSP_ADJ_STS_BCAST); break; } else { forcePad = true; @@ -1819,7 +1820,7 @@ void ControlSignaling::writeRF_ControlData(uint8_t frameCnt, uint8_t n, bool adj case 8: // write SCCB if (adjSS && m_sccbTable.size() > 0) { - queueRF_TSBK_Ctrl(TSBK_OSP_SCCB_EXP); + queueRF_TSBK_Ctrl(TSBKO::OSP_SCCB_EXP); break; } break; @@ -1828,19 +1829,19 @@ void ControlSignaling::writeRF_ControlData(uint8_t frameCnt, uint8_t n, bool adj // are we transmitting the time/date annoucement? bool timeDateAnn = (frameCnt % 64U) == 0U; if (m_ctrlTimeDateAnn && timeDateAnn && n > 4U) { - queueRF_TSBK_Ctrl(TSBK_OSP_TIME_DATE_ANN); + queueRF_TSBK_Ctrl(TSBKO::OSP_TIME_DATE_ANN); } // should we insert the BSI bursts? bool bsi = (frameCnt % 127U) == 0U; if (bsi && n > 4U) { - queueRF_TSBK_Ctrl(TSBK_OSP_MOT_CC_BSI); + queueRF_TSBK_Ctrl(TSBKO::OSP_MOT_CC_BSI); } // should we insert the Git Hash burst? bool hash = (frameCnt % 125U) == 0U; if (hash && n > 4U) { - queueRF_TSBK_Ctrl(TSBK_OSP_DVM_GIT_HASH); + queueRF_TSBK_Ctrl(TSBKO::OSP_DVM_GIT_HASH); } // add padding after the last sequence or if forced; and only @@ -1849,8 +1850,8 @@ void ControlSignaling::writeRF_ControlData(uint8_t frameCnt, uint8_t n, bool adj { // pad MBF if we have 1 queued TSDUs if (m_mbfCnt == 1U) { - queueRF_TSBK_Ctrl(TSBK_OSP_RFSS_STS_BCAST); - queueRF_TSBK_Ctrl(TSBK_OSP_NET_STS_BCAST); + queueRF_TSBK_Ctrl(TSBKO::OSP_RFSS_STS_BCAST); + queueRF_TSBK_Ctrl(TSBKO::OSP_NET_STS_BCAST); if (m_debug) { LogDebug(LOG_P25, "writeRF_ControlData, have 1 pad 2, mbfCnt = %u", m_mbfCnt); } @@ -1860,10 +1861,10 @@ void ControlSignaling::writeRF_ControlData(uint8_t frameCnt, uint8_t n, bool adj if (m_mbfCnt == 2U) { std::vector<::lookups::IdenTable> entries = m_p25->m_idenTable->list(); if (entries.size() > 1U) { - queueRF_TSBK_Ctrl(TSBK_OSP_IDEN_UP); + queueRF_TSBK_Ctrl(TSBKO::OSP_IDEN_UP); } else { - queueRF_TSBK_Ctrl(TSBK_OSP_RFSS_STS_BCAST); + queueRF_TSBK_Ctrl(TSBKO::OSP_RFSS_STS_BCAST); } if (m_debug) { @@ -1890,7 +1891,7 @@ void ControlSignaling::queueRF_TSBK_Ctrl(uint8_t lco) std::unique_ptr tsbk; switch (lco) { - case TSBK_OSP_IDEN_UP: + case TSBKO::OSP_IDEN_UP: { std::vector<::lookups::IdenTable> entries = m_p25->m_idenTable->list(); if (m_mbfIdenCnt >= entries.size()) @@ -1931,17 +1932,17 @@ void ControlSignaling::queueRF_TSBK_Ctrl(uint8_t lco) } } break; - case TSBK_OSP_NET_STS_BCAST: + case TSBKO::OSP_NET_STS_BCAST: // transmit net status burst tsbk = std::make_unique(); DEBUG_LOG_TSBK(tsbk->toString()); break; - case TSBK_OSP_RFSS_STS_BCAST: + case TSBKO::OSP_RFSS_STS_BCAST: // transmit rfss status burst tsbk = std::make_unique(); DEBUG_LOG_TSBK(tsbk->toString()); break; - case TSBK_OSP_ADJ_STS_BCAST: + case TSBKO::OSP_ADJ_STS_BCAST: // write ADJSS if (m_adjSiteTable.size() > 0) { if (m_mbfAdjSSCnt >= m_adjSiteTable.size()) @@ -1965,12 +1966,12 @@ void ControlSignaling::queueRF_TSBK_Ctrl(uint8_t lco) site.siteId() == m_p25->m_siteData.siteId() && site.sysId() == m_p25->m_siteData.sysId()) continue; - uint8_t cfva = P25_CFVA_NETWORK; + uint8_t cfva = CFVA::NETWORK; if (m_adjSiteUpdateCnt[site.siteId()] == 0U) { - cfva |= P25_CFVA_FAILURE; + cfva |= CFVA::FAILURE; } else { - cfva |= P25_CFVA_VALID; + cfva |= CFVA::VALID; } // transmit adjacent site broadcast @@ -1992,7 +1993,7 @@ void ControlSignaling::queueRF_TSBK_Ctrl(uint8_t lco) return; // don't create anything } break; - case TSBK_OSP_SCCB_EXP: + case TSBKO::OSP_SCCB_EXP: // write SCCB if (m_sccbTable.size() > 0) { if (m_mbfSCCBCnt >= m_sccbTable.size()) @@ -2012,7 +2013,7 @@ void ControlSignaling::queueRF_TSBK_Ctrl(uint8_t lco) SiteData site = entry.second; // transmit SCCB broadcast - osp->setLCO(TSBK_OSP_SCCB_EXP); + osp->setLCO(TSBKO::OSP_SCCB_EXP); osp->setSCCBChnId1(site.channelId()); osp->setSCCBChnNo(site.channelNo()); @@ -2026,12 +2027,12 @@ void ControlSignaling::queueRF_TSBK_Ctrl(uint8_t lco) return; // don't create anything } break; - case TSBK_OSP_SNDCP_CH_ANN: + case TSBKO::OSP_SNDCP_CH_ANN: // transmit SNDCP announcement tsbk = std::make_unique(); DEBUG_LOG_TSBK(tsbk->toString()); break; - case TSBK_OSP_SYNC_BCAST: + case TSBKO::OSP_SYNC_BCAST: { // transmit sync broadcast std::unique_ptr osp = std::make_unique(); @@ -2040,7 +2041,7 @@ void ControlSignaling::queueRF_TSBK_Ctrl(uint8_t lco) tsbk = std::move(osp); } break; - case TSBK_OSP_TIME_DATE_ANN: + case TSBKO::OSP_TIME_DATE_ANN: { if (m_ctrlTimeDateAnn) { // transmit time/date announcement @@ -2051,20 +2052,20 @@ void ControlSignaling::queueRF_TSBK_Ctrl(uint8_t lco) break; /** Motorola CC data */ - case TSBK_OSP_MOT_PSH_CCH: + case TSBKO::OSP_MOT_PSH_CCH: // transmit motorola PSH CCH burst tsbk = std::make_unique(); DEBUG_LOG_TSBK(tsbk->toString()); break; - case TSBK_OSP_MOT_CC_BSI: + case TSBKO::OSP_MOT_CC_BSI: // transmit motorola CC BSI burst tsbk = std::make_unique(); DEBUG_LOG_TSBK(tsbk->toString()); break; /** DVM CC data */ - case TSBK_OSP_DVM_GIT_HASH: + case TSBKO::OSP_DVM_GIT_HASH: // transmit git hash burst tsbk = std::make_unique(); DEBUG_LOG_TSBK(tsbk->toString()); @@ -2100,7 +2101,7 @@ bool ControlSignaling::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_ bool encryption = ((serviceOptions & 0xFFU) & 0x40U) == 0x40U; // Encryption Flag uint8_t priority = ((serviceOptions & 0xFFU) & 0x07U); // Priority - if (dstId == P25_TGID_ALL) { + if (dstId == TGID_ALL) { return true; // do not generate grant packets for $FFFF (All Call) TGID } @@ -2109,8 +2110,8 @@ bool ControlSignaling::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_ // don't process RF grant if the network isn't in a idle state and the RF destination is the network destination if (m_p25->m_netState != RS_NET_IDLE && dstId == m_p25->m_netLastDstId) { LogWarning(LOG_RF, "Traffic collision detect, preempting new RF traffic to existing network traffic!"); - LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic collision, dstId = %u", dstId); - writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_COLLIDE, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH, grp, true); + LogWarning(LOG_RF, P25_TSDU_STR ", TSBKO, IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic collision, dstId = %u", dstId); + writeRF_TSDU_Deny(srcId, dstId, ReasonCode::DENY_PTT_COLLIDE, (grp) ? TSBKO::IOSP_GRP_VCH : TSBKO::IOSP_UU_VCH, grp, true); ::ActivityLog("P25", true, "group grant request from %u to TG %u denied", srcId, dstId); m_p25->m_rfState = RS_RF_REJECTED; @@ -2127,14 +2128,14 @@ bool ControlSignaling::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_ if (!skip) { if (m_p25->m_rfState != RS_RF_LISTENING && m_p25->m_rfState != RS_RF_DATA) { if (!net) { - LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic in progress, dstId = %u", dstId); - writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_COLLIDE, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH, grp, true); + LogWarning(LOG_RF, P25_TSDU_STR ", TSBKO, IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic in progress, dstId = %u", dstId); + writeRF_TSDU_Deny(srcId, dstId, ReasonCode::DENY_PTT_COLLIDE, (grp) ? TSBKO::IOSP_GRP_VCH : TSBKO::IOSP_UU_VCH, grp, true); ::ActivityLog("P25", true, "group grant request from %u to TG %u denied", srcId, dstId); m_p25->m_rfState = RS_RF_REJECTED; } else { - LogWarning(LOG_NET, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic in progress, dstId = %u", dstId); + LogWarning(LOG_NET, P25_TSDU_STR ", TSBKO, IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic in progress, dstId = %u", dstId); } return false; @@ -2144,14 +2145,14 @@ bool ControlSignaling::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_ if (!m_p25->m_dedicatedControl) { if (m_p25->m_netState != RS_NET_IDLE && dstId == m_p25->m_netLastDstId) { if (!net) { - LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic in progress, dstId = %u", dstId); - writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_COLLIDE, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH, grp, true); + LogWarning(LOG_RF, P25_TSDU_STR ", TSBKO, IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic in progress, dstId = %u", dstId); + writeRF_TSDU_Deny(srcId, dstId, ReasonCode::DENY_PTT_COLLIDE, (grp) ? TSBKO::IOSP_GRP_VCH : TSBKO::IOSP_UU_VCH, grp, true); ::ActivityLog("P25", true, "group grant request from %u to TG %u denied", srcId, dstId); m_p25->m_rfState = RS_RF_REJECTED; } else { - LogWarning(LOG_NET, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic in progress, dstId = %u", dstId); + LogWarning(LOG_NET, P25_TSDU_STR ", TSBKO, IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic in progress, dstId = %u", dstId); } return false; @@ -2161,7 +2162,7 @@ bool ControlSignaling::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_ if (m_p25->m_rfLastDstId != 0U) { if (m_p25->m_rfLastDstId != dstId && (m_p25->m_rfTGHang.isRunning() && !m_p25->m_rfTGHang.hasExpired())) { if (!net) { - writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_BONK, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH, grp, true); + writeRF_TSDU_Deny(srcId, dstId, ReasonCode::DENY_PTT_BONK, (grp) ? TSBKO::IOSP_GRP_VCH : TSBKO::IOSP_UU_VCH, grp, true); m_p25->m_rfState = RS_RF_REJECTED; } @@ -2174,28 +2175,28 @@ bool ControlSignaling::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_ if (!m_p25->m_affiliations.rfCh()->isRFChAvailable()) { if (grp) { if (!net) { - LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, no channels available, dstId = %u", dstId); - writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_NO_RF_RSRC_AVAIL, TSBK_IOSP_GRP_VCH, grp, true); + LogWarning(LOG_RF, P25_TSDU_STR ", TSBKO, IOSP_GRP_VCH (Group Voice Channel Request) denied, no channels available, dstId = %u", dstId); + writeRF_TSDU_Deny(srcId, dstId, ReasonCode::DENY_NO_RF_RSRC_AVAIL, TSBKO::IOSP_GRP_VCH, grp, true); ::ActivityLog("P25", true, "group grant request from %u to TG %u denied", srcId, dstId); m_p25->m_rfState = RS_RF_REJECTED; } else { - LogWarning(LOG_NET, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, no channels available, dstId = %u", dstId); + LogWarning(LOG_NET, P25_TSDU_STR ", TSBKO, IOSP_GRP_VCH (Group Voice Channel Request) denied, no channels available, dstId = %u", dstId); } return false; } else { if (!net) { - LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_UU_VCH (Unit-to-Unit Voice Channel Request) denied, no channels available, dstId = %u", dstId); - writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_NO_RF_RSRC_AVAIL, TSBK_IOSP_GRP_VCH, grp, true); + LogWarning(LOG_RF, P25_TSDU_STR ", TSBKO, IOSP_UU_VCH (Unit-to-Unit Voice Channel Request) denied, no channels available, dstId = %u", dstId); + writeRF_TSDU_Deny(srcId, dstId, ReasonCode::DENY_NO_RF_RSRC_AVAIL, TSBKO::IOSP_GRP_VCH, grp, true); ::ActivityLog("P25", true, "unit-to-unit grant request from %u to %u denied", srcId, dstId); m_p25->m_rfState = RS_RF_REJECTED; } else { - LogWarning(LOG_NET, P25_TSDU_STR ", TSBK_IOSP_UU_VCH (Unit-to-Unit Voice Channel Request) denied, no channels available, dstId = %u", dstId); + LogWarning(LOG_NET, P25_TSDU_STR ", TSBKO, IOSP_UU_VCH (Unit-to-Unit Voice Channel Request) denied, no channels available, dstId = %u", dstId); } return false; @@ -2215,14 +2216,14 @@ bool ControlSignaling::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_ uint32_t grantedSrcId = m_p25->m_affiliations.getGrantedSrcId(dstId); if (srcId != grantedSrcId) { if (!net) { - LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic collision, dstId = %u", dstId); - writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_COLLIDE, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH, grp, true); + LogWarning(LOG_RF, P25_TSDU_STR ", TSBKO, IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic collision, dstId = %u", dstId); + writeRF_TSDU_Deny(srcId, dstId, ReasonCode::DENY_PTT_COLLIDE, (grp) ? TSBKO::IOSP_GRP_VCH : TSBKO::IOSP_UU_VCH, grp, true); ::ActivityLog("P25", true, "group grant request from %u to TG %u denied", srcId, dstId); m_p25->m_rfState = RS_RF_REJECTED; } else { - LogWarning(LOG_NET, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic collision, dstId = %u", dstId); + LogWarning(LOG_NET, P25_TSDU_STR ", TSBKO, IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic collision, dstId = %u", dstId); } return false; @@ -2259,10 +2260,10 @@ bool ControlSignaling::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_ int ret = RESTClient::send(voiceChData.address(), voiceChData.port(), voiceChData.password(), HTTP_PUT, PUT_PERMIT_TG, req, voiceChData.ssl(), REST_QUICK_WAIT, m_p25->m_debug); if (ret != network::rest::http::HTTPPayload::StatusType::OK) { - ::LogError((net) ? LOG_NET : LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request), failed to permit TG for use, chNo = %u", chNo); + ::LogError((net) ? LOG_NET : LOG_RF, P25_TSDU_STR ", TSBKO, IOSP_GRP_VCH (Group Voice Channel Request), failed to permit TG for use, chNo = %u", chNo); m_p25->m_affiliations.releaseGrant(dstId, false); if (!net) { - writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_BONK, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH, grp, true); + writeRF_TSDU_Deny(srcId, dstId, ReasonCode::DENY_PTT_BONK, (grp) ? TSBKO::IOSP_GRP_VCH : TSBKO::IOSP_UU_VCH, grp, true); m_p25->m_rfState = RS_RF_REJECTED; } @@ -2270,7 +2271,7 @@ bool ControlSignaling::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_ } } else { - ::LogError((net) ? LOG_NET : LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request), failed to permit TG for use, chNo = %u", chNo); + ::LogError((net) ? LOG_NET : LOG_RF, P25_TSDU_STR ", TSBKO, IOSP_GRP_VCH (Group Voice Channel Request), failed to permit TG for use, chNo = %u", chNo); } } @@ -2313,10 +2314,10 @@ bool ControlSignaling::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_ int ret = RESTClient::send(voiceChData.address(), voiceChData.port(), voiceChData.password(), HTTP_PUT, PUT_PERMIT_TG, req, voiceChData.ssl(), REST_QUICK_WAIT, m_p25->m_debug); if (ret != network::rest::http::HTTPPayload::StatusType::OK) { - ::LogError((net) ? LOG_NET : LOG_RF, P25_TSDU_STR ", TSBK_IOSP_UU_VCH (Unit-to-Unit Voice Channel Request), failed to permit TG for use, chNo = %u", chNo); + ::LogError((net) ? LOG_NET : LOG_RF, P25_TSDU_STR ", TSBKO, IOSP_UU_VCH (Unit-to-Unit Voice Channel Request), failed to permit TG for use, chNo = %u", chNo); m_p25->m_affiliations.releaseGrant(dstId, false); if (!net) { - writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_BONK, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH, grp, true); + writeRF_TSDU_Deny(srcId, dstId, ReasonCode::DENY_PTT_BONK, (grp) ? TSBKO::IOSP_GRP_VCH : TSBKO::IOSP_UU_VCH, grp, true); m_p25->m_rfState = RS_RF_REJECTED; } @@ -2324,7 +2325,7 @@ bool ControlSignaling::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_ } } else { - ::LogError((net) ? LOG_NET : LOG_RF, P25_TSDU_STR ", TSBK_IOSP_UU_VCH (Unit-to-Unit Voice Channel Request), failed to permit TG for use, chNo = %u", chNo); + ::LogError((net) ? LOG_NET : LOG_RF, P25_TSDU_STR ", TSBKO, IOSP_UU_VCH (Unit-to-Unit Voice Channel Request), failed to permit TG for use, chNo = %u", chNo); } } @@ -2401,7 +2402,7 @@ void ControlSignaling::writeRF_TSDU_Grant_Update() DEBUG_LOG_TSBK(osp->toString()); // transmit group voice grant update - osp->setLCO(TSBK_OSP_GRP_VCH_GRANT_UPD); + osp->setLCO(TSBKO::OSP_GRP_VCH_GRANT_UPD); osp->setDstId(dstId); osp->setGrpVchId(voiceChData.chId()); osp->setGrpVchNo(chNo); @@ -2415,7 +2416,7 @@ void ControlSignaling::writeRF_TSDU_Grant_Update() DEBUG_LOG_TSBK(osp->toString()); // transmit group voice grant update - osp->setLCO(TSBK_OSP_UU_VCH_GRANT_UPD); + osp->setLCO(TSBKO::OSP_UU_VCH_GRANT_UPD); osp->setSrcId(srcId); osp->setDstId(dstId); osp->setGrpVchId(voiceChData.chId()); @@ -2454,7 +2455,7 @@ bool ControlSignaling::writeRF_TSDU_SNDCP_Grant(uint32_t srcId, uint32_t dstId, osp->setSrcId(srcId); osp->setDstId(dstId); - if (dstId == P25_TGID_ALL) { + if (dstId == TGID_ALL) { return true; // do not generate grant packets for $FFFF (All Call) TGID } @@ -2462,8 +2463,8 @@ bool ControlSignaling::writeRF_TSDU_SNDCP_Grant(uint32_t srcId, uint32_t dstId, if (!skip) { if (m_p25->m_rfState != RS_RF_LISTENING && m_p25->m_rfState != RS_RF_DATA) { if (!net) { - LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_ISP_SNDCP_CH_REQ (SNDCP Data Channel Request) denied, traffic in progress, srcId = %u", srcId); - writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_COLLIDE, TSBK_ISP_SNDCP_CH_REQ, false, true); + LogWarning(LOG_RF, P25_TSDU_STR ", TSBKO, ISP_SNDCP_CH_REQ (SNDCP Data Channel Request) denied, traffic in progress, srcId = %u", srcId); + writeRF_TSDU_Deny(srcId, dstId, ReasonCode::DENY_PTT_COLLIDE, TSBKO::ISP_SNDCP_CH_REQ, false, true); ::ActivityLog("P25", true, "SNDCP grant request from %u denied", srcId); m_p25->m_rfState = RS_RF_REJECTED; @@ -2475,8 +2476,8 @@ bool ControlSignaling::writeRF_TSDU_SNDCP_Grant(uint32_t srcId, uint32_t dstId, if (!m_p25->m_affiliations.isGranted(srcId)) { if (!m_p25->m_affiliations.rfCh()->isRFChAvailable()) { if (!net) { - LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_ISP_SNDCP_CH_REQ (SNDCP Data Channel Request) denied, no channels available, srcId = %u", srcId); - writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_NO_RF_RSRC_AVAIL, TSBK_ISP_SNDCP_CH_REQ, false, true); + LogWarning(LOG_RF, P25_TSDU_STR ", TSBKO, ISP_SNDCP_CH_REQ (SNDCP Data Channel Request) denied, no channels available, srcId = %u", srcId); + writeRF_TSDU_Deny(srcId, dstId, ReasonCode::DENY_NO_RF_RSRC_AVAIL, TSBKO::ISP_SNDCP_CH_REQ, false, true); ::ActivityLog("P25", true, "SNDCP grant request from %u denied", srcId); m_p25->m_rfState = RS_RF_REJECTED; @@ -2608,7 +2609,7 @@ bool ControlSignaling::writeRF_TSDU_Grp_Aff_Rsp(uint32_t srcId, uint32_t dstId) iosp->setAnnounceGroup(m_announcementGroup); iosp->setSrcId(srcId); iosp->setDstId(dstId); - iosp->setResponse(P25_RSP_ACCEPT); + iosp->setResponse(ResponseCode::ACCEPT); bool noNet = false; @@ -2616,17 +2617,17 @@ bool ControlSignaling::writeRF_TSDU_Grp_Aff_Rsp(uint32_t srcId, uint32_t dstId) if (!acl::AccessControl::validateSrcId(srcId)) { LogWarning(LOG_RF, P25_TSDU_STR ", %s denial, RID rejection, srcId = %u", iosp->toString().c_str(), srcId); ::ActivityLog("P25", true, "group affiliation request from %u to %s %u denied", srcId, "TG ", dstId); - iosp->setResponse(P25_RSP_REFUSED); + iosp->setResponse(ResponseCode::REFUSED); noNet = true; } // register the RID if the MFID is $90 (this is typically DVRS, and DVRS won't unit register so we'll do it for them) - if (!m_p25->m_affiliations.isUnitReg(srcId) && m_lastMFID == P25_MFG_MOT) { + if (!m_p25->m_affiliations.isUnitReg(srcId) && m_lastMFID == MFG_MOT) { // validate the source RID if (!acl::AccessControl::validateSrcId(srcId)) { LogWarning(LOG_RF, P25_TSDU_STR ", %s denial, RID rejection, srcId = %u", iosp->toString().c_str(), srcId); ::ActivityLog("P25", true, "unit registration request from %u denied", srcId); - iosp->setResponse(P25_RSP_REFUSED); + iosp->setResponse(ResponseCode::REFUSED); noNet = true; } else { @@ -2644,7 +2645,7 @@ bool ControlSignaling::writeRF_TSDU_Grp_Aff_Rsp(uint32_t srcId, uint32_t dstId) if (!m_p25->m_affiliations.isUnitReg(srcId) && m_verifyReg) { LogWarning(LOG_RF, P25_TSDU_STR ", %s denial, RID not registered, srcId = %u", iosp->toString().c_str(), srcId); ::ActivityLog("P25", true, "group affiliation request from %u to %s %u denied", srcId, "TG ", dstId); - iosp->setResponse(P25_RSP_REFUSED); + iosp->setResponse(ResponseCode::REFUSED); noNet = true; } @@ -2656,7 +2657,7 @@ bool ControlSignaling::writeRF_TSDU_Grp_Aff_Rsp(uint32_t srcId, uint32_t dstId) if (!acl::AccessControl::validateTGId(dstId)) { LogWarning(LOG_RF, P25_TSDU_STR ", %s denial, TGID rejection, dstId = %u", iosp->toString().c_str(), dstId); ::ActivityLog("P25", true, "group affiliation request from %u to %s %u denied", srcId, "TG ", dstId); - iosp->setResponse(P25_RSP_DENY); + iosp->setResponse(ResponseCode::DENY); noNet = true; } @@ -2664,12 +2665,12 @@ bool ControlSignaling::writeRF_TSDU_Grp_Aff_Rsp(uint32_t srcId, uint32_t dstId) if (acl::AccessControl::tgidNonPreferred(dstId)) { LogWarning(LOG_RF, P25_TSDU_STR ", %s non-preferred on this site, TGID rejection, dstId = %u", iosp->toString().c_str(), dstId); ::ActivityLog("P25", true, "group affiliation request from %u to %s %u denied", srcId, "TG ", dstId); - iosp->setResponse(P25_RSP_DENY); + iosp->setResponse(ResponseCode::DENY); noNet = true; } } - if (iosp->getResponse() == P25_RSP_ACCEPT) { + if (iosp->getResponse() == ResponseCode::ACCEPT) { if (m_verbose) { LogMessage(LOG_RF, P25_TSDU_STR ", %s, anncId = %u, srcId = %u, dstId = %u", iosp->toString().c_str(), m_announcementGroup, srcId, dstId); @@ -2698,7 +2699,7 @@ void ControlSignaling::writeRF_TSDU_U_Reg_Rsp(uint32_t srcId, uint32_t sysId) { std::unique_ptr iosp = std::make_unique(); iosp->setMFId(m_lastMFID); - iosp->setResponse(P25_RSP_ACCEPT); + iosp->setResponse(ResponseCode::ACCEPT); iosp->setSrcId(srcId); iosp->setDstId(srcId); @@ -2706,17 +2707,17 @@ void ControlSignaling::writeRF_TSDU_U_Reg_Rsp(uint32_t srcId, uint32_t sysId) if (sysId != m_p25->m_siteData.sysId()) { LogWarning(LOG_RF, P25_TSDU_STR ", %s denial, SYSID rejection, sysId = $%03X", iosp->toString().c_str(), sysId); ::ActivityLog("P25", true, "unit registration request from %u denied", srcId); - iosp->setResponse(P25_RSP_DENY); + iosp->setResponse(ResponseCode::DENY); } // validate the source RID if (!acl::AccessControl::validateSrcId(srcId)) { LogWarning(LOG_RF, P25_TSDU_STR ", %s denial, RID rejection, srcId = %u", iosp->toString().c_str(), srcId); ::ActivityLog("P25", true, "unit registration request from %u denied", srcId); - iosp->setResponse(P25_RSP_REFUSED); + iosp->setResponse(ResponseCode::REFUSED); } - if (iosp->getResponse() == P25_RSP_ACCEPT) { + if (iosp->getResponse() == ResponseCode::ACCEPT) { if (m_verbose) { LogMessage(LOG_RF, P25_TSDU_STR ", %s, srcId = %u, sysId = $%03X", iosp->toString().c_str(), srcId, sysId); } @@ -2754,7 +2755,7 @@ void ControlSignaling::writeRF_TSDU_U_Dereg_Ack(uint32_t srcId) if (dereged) { std::unique_ptr osp = std::make_unique(); osp->setMFId(m_lastMFID); - osp->setSrcId(P25_WUID_FNE); + osp->setSrcId(WUID_FNE); osp->setDstId(srcId); if (m_verbose) { @@ -2808,7 +2809,7 @@ bool ControlSignaling::writeRF_TSDU_Loc_Reg_Rsp(uint32_t srcId, uint32_t dstId, std::unique_ptr osp = std::make_unique(); osp->setMFId(m_lastMFID); - osp->setResponse(P25_RSP_ACCEPT); + osp->setResponse(ResponseCode::ACCEPT); osp->setDstId(dstId); osp->setSrcId(srcId); @@ -2818,7 +2819,7 @@ bool ControlSignaling::writeRF_TSDU_Loc_Reg_Rsp(uint32_t srcId, uint32_t dstId, if (!acl::AccessControl::validateSrcId(srcId)) { LogWarning(LOG_RF, P25_TSDU_STR ", %s denial, RID rejection, srcId = %u", osp->toString().c_str(), srcId); ::ActivityLog("P25", true, "location registration request from %u denied", srcId); - osp->setResponse(P25_RSP_REFUSED); + osp->setResponse(ResponseCode::REFUSED); noNet = true; } @@ -2839,13 +2840,13 @@ bool ControlSignaling::writeRF_TSDU_Loc_Reg_Rsp(uint32_t srcId, uint32_t dstId, if (!acl::AccessControl::validateTGId(dstId)) { LogWarning(LOG_RF, P25_TSDU_STR ", %s denial, TGID rejection, dstId = %u", osp->toString().c_str(), dstId); ::ActivityLog("P25", true, "location registration request from %u to %s %u denied", srcId, "TG ", dstId); - osp->setResponse(P25_RSP_DENY); + osp->setResponse(ResponseCode::DENY); noNet = true; } } } - if (osp->getResponse() == P25_RSP_ACCEPT) { + if (osp->getResponse() == ResponseCode::ACCEPT) { if (m_verbose) { LogMessage(LOG_RF, P25_TSDU_STR ", %s, srcId = %u, dstId = %u", osp->toString().c_str(), srcId, dstId); } @@ -2865,12 +2866,12 @@ bool ControlSignaling::writeRF_TSDU_Loc_Reg_Rsp(uint32_t srcId, uint32_t dstId, void ControlSignaling::writeRF_TSDU_Auth_Dmd(uint32_t srcId) { std::unique_ptr osp = std::make_unique(); - osp->setSrcId(P25_WUID_FNE); + osp->setSrcId(WUID_FNE); osp->setDstId(srcId); osp->setAuthRS(m_p25->m_llaRS); // generate challenge - uint8_t RC[P25_AUTH_RAND_CHLNG_LENGTH_BYTES]; + uint8_t RC[AUTH_RAND_CHLNG_LENGTH_BYTES]; std::uniform_int_distribution dist(DVM_RAND_MIN, DVM_RAND_MAX); uint32_t rnd = dist(m_p25->m_random); __SET_UINT32(rnd, RC, 0U); @@ -2930,7 +2931,7 @@ void ControlSignaling::writeNet_TSDU_From_RF(lc::TSBK* tsbk, uint8_t* data) Sync::addP25Sync(data); // Generate NID - m_p25->m_nid.encode(data, P25_DUID_TSDU); + m_p25->m_nid.encode(data, DUID::TSDU); // Regenerate TSDU Data tsbk->setLastBlock(true); // always set last block -- this a Single Block TSDU @@ -2956,6 +2957,6 @@ void ControlSignaling::denialInhibit(uint32_t srcId) // this check should have already been done -- but do it again anyway if (!acl::AccessControl::validateSrcId(srcId)) { LogWarning(LOG_P25, P25_TSDU_STR ", denial, system auto-inhibit RID, srcId = %u", srcId); - writeRF_TSDU_Ext_Func(P25_EXT_FNCT_INHIBIT, P25_WUID_FNE, srcId); + writeRF_TSDU_Ext_Func(ExtendedFunctions::INHIBIT, WUID_FNE, srcId); } } diff --git a/src/host/p25/packet/ControlSignaling.h b/src/host/p25/packet/ControlSignaling.h index d12eaf28..faad840d 100644 --- a/src/host/p25/packet/ControlSignaling.h +++ b/src/host/p25/packet/ControlSignaling.h @@ -50,7 +50,7 @@ namespace p25 /// Process a data frame from the RF interface. bool process(uint8_t* data, uint32_t len, std::unique_ptr preDecodedTSBK = nullptr); /// Process a data frame from the network. - bool processNetwork(uint8_t* data, uint32_t len, lc::LC& control, data::LowSpeedData& lsd, uint8_t& duid); + bool processNetwork(uint8_t* data, uint32_t len, lc::LC& control, data::LowSpeedData& lsd, defines::DUID::E& duid); /// Helper used to process AMBTs from PDU data. bool processMBT(data::DataHeader& dataHeader, data::DataBlock* blocks); diff --git a/src/host/p25/packet/Data.cpp b/src/host/p25/packet/Data.cpp index 5dcd299a..15f8450c 100644 --- a/src/host/p25/packet/Data.cpp +++ b/src/host/p25/packet/Data.cpp @@ -23,9 +23,10 @@ #include "p25/packet/Data.h" #include "ActivityLog.h" -using namespace p25; -using namespace p25::data; using namespace p25::packet; +using namespace p25::data; +using namespace p25::defines; +using namespace p25; #include #include @@ -80,7 +81,7 @@ bool Data::process(uint8_t* data, uint32_t len) } // handle individual DUIDs - if (duid == P25_DUID_PDU) { + if (duid == DUID::PDU) { if (m_p25->m_rfState != RS_RF_DATA) { m_rfDataHeader.reset(); m_rfDataBlockCnt = 0U; @@ -142,7 +143,7 @@ bool Data::process(uint8_t* data, uint32_t len) } // if we're a dedicated CC or in control only mode, we only want to handle AMBTs. Otherwise return - if ((m_p25->m_dedicatedControl || m_p25->m_controlOnly) && m_rfDataHeader.getFormat() != PDU_FMT_AMBT) { + if ((m_p25->m_dedicatedControl || m_p25->m_controlOnly) && m_rfDataHeader.getFormat() != PDUFormatType::AMBT) { if (m_debug) { LogDebug(LOG_RF, "CC only mode, ignoring non-AMBT PDU from RF"); } @@ -160,9 +161,9 @@ bool Data::process(uint8_t* data, uint32_t len) // only send data blocks across the network, if we're not an AMBT, // an RSP or a registration service - if ((m_rfDataHeader.getFormat() != PDU_FMT_AMBT) && - (m_rfDataHeader.getFormat() != PDU_FMT_RSP) && - (m_rfDataHeader.getSAP() != PDU_SAP_REG)) { + if ((m_rfDataHeader.getFormat() != PDUFormatType::AMBT) && + (m_rfDataHeader.getFormat() != PDUFormatType::RSP) && + (m_rfDataHeader.getSAP() != PDUSAP::REG)) { writeNetwork(0U, buffer, P25_PDU_FEC_LENGTH_BYTES, false); } } @@ -170,8 +171,8 @@ bool Data::process(uint8_t* data, uint32_t len) if (m_p25->m_rfState == RS_RF_DATA) { uint32_t blocksToFollow = m_rfDataHeader.getBlocksToFollow(); // process second header if we're using enhanced addressing - if (m_rfDataHeader.getSAP() == PDU_SAP_EXT_ADDR && - m_rfDataHeader.getFormat() == PDU_FMT_UNCONFIRMED) { + if (m_rfDataHeader.getSAP() == PDUSAP::EXT_ADDR && + m_rfDataHeader.getFormat() == PDUFormatType::UNCONFIRMED) { ::memset(buffer, 0x00U, P25_PDU_FEC_LENGTH_BYTES); Utils::getBitRange(m_rfPDU, buffer, offset, P25_PDU_FEC_LENGTH_BITS); bool ret = m_rfSecondHeader.decode(buffer); @@ -200,9 +201,9 @@ bool Data::process(uint8_t* data, uint32_t len) // only send data blocks across the network, if we're not an AMBT, // an RSP or a registration service - if ((m_rfDataHeader.getFormat() != PDU_FMT_AMBT) && - (m_rfDataHeader.getFormat() != PDU_FMT_RSP) && - (m_rfDataHeader.getSAP() != PDU_SAP_REG)) { + if ((m_rfDataHeader.getFormat() != PDUFormatType::AMBT) && + (m_rfDataHeader.getFormat() != PDUFormatType::RSP) && + (m_rfDataHeader.getSAP() != PDUSAP::REG)) { writeNetwork(1U, buffer, P25_PDU_FEC_LENGTH_BYTES, false); } @@ -236,14 +237,14 @@ bool Data::process(uint8_t* data, uint32_t len) if (ret) { // if we are getting unconfirmed or confirmed blocks, and if we've reached the total number of blocks // set this block as the last block for full packet CRC - if ((m_rfDataHeader.getFormat() == PDU_FMT_CONFIRMED) || (m_rfDataHeader.getFormat() == PDU_FMT_UNCONFIRMED)) { + if ((m_rfDataHeader.getFormat() == PDUFormatType::CONFIRMED) || (m_rfDataHeader.getFormat() == PDUFormatType::UNCONFIRMED)) { if ((m_rfDataBlockCnt + 1U) == blocksToFollow) { m_rfData[i].setLastBlock(true); } } // are we processing extended address data from the first block? - if (m_rfDataHeader.getSAP() == PDU_SAP_EXT_ADDR && m_rfDataHeader.getFormat() == PDU_FMT_CONFIRMED && + if (m_rfDataHeader.getSAP() == PDUSAP::EXT_ADDR && m_rfDataHeader.getFormat() == PDUFormatType::CONFIRMED && m_rfData[i].getSerialNo() == 0U) { if (m_verbose) { LogMessage(LOG_RF, P25_PDU_STR ", ISP, block %u, fmt = $%02X, lastBlock = %u, sap = $%02X, llId = %u", @@ -268,7 +269,7 @@ bool Data::process(uint8_t* data, uint32_t len) else { if (m_verbose) { LogMessage(LOG_RF, P25_PDU_STR ", ISP, block %u, fmt = $%02X, lastBlock = %u", - (m_rfDataHeader.getFormat() == PDU_FMT_CONFIRMED) ? m_rfData[i].getSerialNo() : m_rfDataBlockCnt, m_rfData[i].getFormat(), + (m_rfDataHeader.getFormat() == PDUFormatType::CONFIRMED) ? m_rfData[i].getSerialNo() : m_rfDataBlockCnt, m_rfData[i].getFormat(), m_rfData[i].getLastBlock()); if (m_dumpPDUData) { @@ -281,14 +282,14 @@ bool Data::process(uint8_t* data, uint32_t len) } m_rfData[i].getData(m_pduUserData + dataOffset); - dataOffset += (m_rfDataHeader.getFormat() == PDU_FMT_CONFIRMED) ? P25_PDU_CONFIRMED_DATA_LENGTH_BYTES : P25_PDU_UNCONFIRMED_LENGTH_BYTES; + dataOffset += (m_rfDataHeader.getFormat() == PDUFormatType::CONFIRMED) ? P25_PDU_CONFIRMED_DATA_LENGTH_BYTES : P25_PDU_UNCONFIRMED_LENGTH_BYTES; m_pduUserDataLength = dataOffset; // only send data blocks across the network, if we're not an AMBT, // an RSP or a registration service - if ((m_rfDataHeader.getFormat() != PDU_FMT_AMBT) && - (m_rfDataHeader.getFormat() != PDU_FMT_RSP) && - (m_rfDataHeader.getSAP() != PDU_SAP_REG)) { + if ((m_rfDataHeader.getFormat() != PDUFormatType::AMBT) && + (m_rfDataHeader.getFormat() != PDUFormatType::RSP) && + (m_rfDataHeader.getSAP() != PDUSAP::REG)) { writeNetwork(m_rfDataBlockCnt, buffer, P25_PDU_FEC_LENGTH_BYTES, m_rfData[i].getLastBlock()); } @@ -303,7 +304,7 @@ bool Data::process(uint8_t* data, uint32_t len) } } else { - if (m_rfData[i].getFormat() == PDU_FMT_CONFIRMED) { + if (m_rfData[i].getFormat() == PDUFormatType::CONFIRMED) { LogWarning(LOG_RF, P25_PDU_STR ", unfixable PDU data (3/4 rate or CRC), block %u", i); // to prevent data block offset errors fill the bad block with 0's @@ -341,7 +342,7 @@ bool Data::process(uint8_t* data, uint32_t len) } // did we receive a response header? - if (m_rfDataHeader.getFormat() == PDU_FMT_RSP) { + if (m_rfDataHeader.getFormat() == PDUFormatType::RSP) { if (m_verbose) { LogMessage(LOG_RF, P25_PDU_STR ", ISP, response, fmt = $%02X, rspClass = $%02X, rspType = $%02X, rspStatus = $%02X, llId = %u, srcLlId = %u", m_rfDataHeader.getFormat(), m_rfDataHeader.getResponseClass(), m_rfDataHeader.getResponseType(), m_rfDataHeader.getResponseStatus(), @@ -350,7 +351,7 @@ bool Data::process(uint8_t* data, uint32_t len) if (m_repeatPDU) { if (!m_rfDataHeader.getFullMessage()) { - m_rfDataHeader.setSAP(PDU_SAP_EXT_ADDR); + m_rfDataHeader.setSAP(PDUSAP::EXT_ADDR); } writeRF_PDU_Ack_Response(m_rfDataHeader.getResponseClass(), m_rfDataHeader.getResponseType(), m_rfDataHeader.getResponseStatus(), @@ -360,18 +361,18 @@ bool Data::process(uint8_t* data, uint32_t len) else { // handle standard P25 service access points switch (m_rfDataHeader.getSAP()) { - case PDU_SAP_REG: + case PDUSAP::REG: { uint8_t regType = (m_pduUserData[0] >> 4) & 0x0F; switch (regType) { - case PDU_REG_TYPE_REQ_CNCT: + case PDURegType::CNCT: { uint32_t llId = (m_pduUserData[1U] << 16) + (m_pduUserData[2U] << 8) + m_pduUserData[3U]; ulong64_t ipAddr = (m_pduUserData[8U] << 24) + (m_pduUserData[9U] << 16) + (m_pduUserData[10U] << 8) + m_pduUserData[11U]; if (m_verbose) { - LogMessage(LOG_RF, P25_PDU_STR ", PDU_REG_TYPE_REQ_CNCT (Registration Request Connect), llId = %u, ipAddr = %s", llId, __IP_FROM_ULONG(ipAddr).c_str()); + LogMessage(LOG_RF, P25_PDU_STR ", CNCT (Registration Request Connect), llId = %u, ipAddr = %s", llId, __IP_FROM_ULONG(ipAddr).c_str()); } m_connQueueTable[llId] = std::make_tuple(m_rfDataHeader.getMFId(), ipAddr); @@ -380,12 +381,12 @@ bool Data::process(uint8_t* data, uint32_t len) m_connTimerTable[llId].start(); } break; - case PDU_REG_TYPE_REQ_DISCNCT: + case PDURegType::DISCNCT: { uint32_t llId = (m_pduUserData[1U] << 16) + (m_pduUserData[2U] << 8) + m_pduUserData[3U]; if (m_verbose) { - LogMessage(LOG_RF, P25_PDU_STR ", PDU_REG_TYPE_REQ_DISCNCT (Registration Request Disconnect), llId = %u", llId); + LogMessage(LOG_RF, P25_PDU_STR ", DISCNCT (Registration Request Disconnect), llId = %u", llId); } if (hasLLIdFNEReg(llId)) { @@ -406,10 +407,10 @@ bool Data::process(uint8_t* data, uint32_t len) } } break; - case PDU_SAP_TRUNK_CTRL: + case PDUSAP::TRUNK_CTRL: { if (m_verbose) { - LogMessage(LOG_RF, P25_PDU_STR ", PDU_SAP_TRUNK_CTRL (Alternate MBT Packet), lco = $%02X, blocksToFollow = %u", + LogMessage(LOG_RF, P25_PDU_STR ", TRUNK_CTRL (Alternate MBT Packet), lco = $%02X, blocksToFollow = %u", m_rfDataHeader.getAMBTOpcode(), m_rfDataHeader.getBlocksToFollow()); } @@ -514,7 +515,7 @@ bool Data::processNetwork(uint8_t* data, uint32_t len, uint32_t blockLength) } // if we're a dedicated CC or in control only mode, we only want to handle AMBTs. Otherwise return - if ((m_p25->m_dedicatedControl || m_p25->m_controlOnly) && m_netDataHeader.getFormat() != PDU_FMT_AMBT) { + if ((m_p25->m_dedicatedControl || m_p25->m_controlOnly) && m_netDataHeader.getFormat() != PDUFormatType::AMBT) { if (m_debug) { LogDebug(LOG_NET, "CC only mode, ignoring non-AMBT PDU from network"); } @@ -545,8 +546,8 @@ bool Data::processNetwork(uint8_t* data, uint32_t len, uint32_t blockLength) uint8_t buffer[P25_PDU_FEC_LENGTH_BYTES]; // process second header if we're using enhanced addressing - if (m_netDataHeader.getSAP() == PDU_SAP_EXT_ADDR && - m_netDataHeader.getFormat() == PDU_FMT_UNCONFIRMED) { + if (m_netDataHeader.getSAP() == PDUSAP::EXT_ADDR && + m_netDataHeader.getFormat() == PDUFormatType::UNCONFIRMED) { ::memset(buffer, 0x00U, P25_PDU_FEC_LENGTH_BYTES); ::memcpy(buffer, m_netPDU, P25_PDU_FEC_LENGTH_BYTES); @@ -598,14 +599,14 @@ bool Data::processNetwork(uint8_t* data, uint32_t len, uint32_t blockLength) if (ret) { // if we are getting unconfirmed or confirmed blocks, and if we've reached the total number of blocks // set this block as the last block for full packet CRC - if ((m_netDataHeader.getFormat() == PDU_FMT_CONFIRMED) || (m_netDataHeader.getFormat() == PDU_FMT_UNCONFIRMED)) { + if ((m_netDataHeader.getFormat() == PDUFormatType::CONFIRMED) || (m_netDataHeader.getFormat() == PDUFormatType::UNCONFIRMED)) { if ((m_netDataBlockCnt + 1U) == blocksToFollow) { m_netData[i].setLastBlock(true); } } // are we processing extended address data from the first block? - if (m_netDataHeader.getSAP() == PDU_SAP_EXT_ADDR && m_netDataHeader.getFormat() == PDU_FMT_CONFIRMED && + if (m_netDataHeader.getSAP() == PDUSAP::EXT_ADDR && m_netDataHeader.getFormat() == PDUFormatType::CONFIRMED && m_netData[i].getSerialNo() == 0U) { LogMessage(LOG_NET, P25_PDU_STR ", block %u, fmt = $%02X, lastBlock = %u, sap = $%02X, llId = %u", m_netData[i].getSerialNo(), m_netData[i].getFormat(), m_netData[i].getLastBlock(), m_netData[i].getSAP(), m_netData[i].getLLId()); @@ -618,12 +619,12 @@ bool Data::processNetwork(uint8_t* data, uint32_t len, uint32_t blockLength) } else { LogMessage(LOG_NET, P25_PDU_STR ", block %u, fmt = $%02X, lastBlock = %u", - (m_netDataHeader.getFormat() == PDU_FMT_CONFIRMED) ? m_netData[i].getSerialNo() : m_netDataBlockCnt, m_netData[i].getFormat(), + (m_netDataHeader.getFormat() == PDUFormatType::CONFIRMED) ? m_netData[i].getSerialNo() : m_netDataBlockCnt, m_netData[i].getFormat(), m_netData[i].getLastBlock()); } m_netData[i].getData(m_pduUserData + dataOffset); - dataOffset += (m_rfDataHeader.getFormat() == PDU_FMT_CONFIRMED) ? P25_PDU_CONFIRMED_DATA_LENGTH_BYTES : P25_PDU_UNCONFIRMED_LENGTH_BYTES; + dataOffset += (m_rfDataHeader.getFormat() == PDUFormatType::CONFIRMED) ? P25_PDU_CONFIRMED_DATA_LENGTH_BYTES : P25_PDU_UNCONFIRMED_LENGTH_BYTES; m_pduUserDataLength = dataOffset; m_netDataBlockCnt++; @@ -637,7 +638,7 @@ bool Data::processNetwork(uint8_t* data, uint32_t len, uint32_t blockLength) } } else { - if (m_netData[i].getFormat() == PDU_FMT_CONFIRMED) + if (m_netData[i].getFormat() == PDUFormatType::CONFIRMED) LogWarning(LOG_NET, P25_PDU_STR ", unfixable PDU data (3/4 rate or CRC), block %u", i); else LogWarning(LOG_NET, P25_PDU_STR ", unfixable PDU data (1/2 rate or CRC), block %u", i); @@ -734,7 +735,7 @@ void Data::writeRF_PDU_User(data::DataHeader& dataHeader, const uint8_t* pduUser DataBlock rspBlock = DataBlock(); uint32_t dataOffset = 0U; for (uint8_t i = 0; i < dataHeader.getBlocksToFollow(); i++) { - rspBlock.setFormat(PDU_FMT_UNCONFIRMED); + rspBlock.setFormat(PDUFormatType::UNCONFIRMED); rspBlock.setSerialNo(0U); rspBlock.setData(pduUserData + dataOffset); @@ -771,8 +772,8 @@ void Data::clock(uint32_t ms) uint64_t ipAddr = std::get<1>(m_connQueueTable[llId]); if (!acl::AccessControl::validateSrcId(llId)) { - LogWarning(LOG_RF, P25_PDU_STR ", PDU_REG_TYPE_RSP_DENY (Registration Response Deny), llId = %u, ipAddr = %s", llId, __IP_FROM_ULONG(ipAddr).c_str()); - writeRF_PDU_Reg_Response(PDU_REG_TYPE_RSP_DENY, mfId, llId, ipAddr); + LogWarning(LOG_RF, P25_PDU_STR ", DENY (Registration Response Deny), llId = %u, ipAddr = %s", llId, __IP_FROM_ULONG(ipAddr).c_str()); + writeRF_PDU_Reg_Response(PDURegType::DENY, mfId, llId, ipAddr); } else { if (!hasLLIdFNEReg(llId)) { @@ -781,10 +782,10 @@ void Data::clock(uint32_t ms) } if (m_verbose) { - LogMessage(LOG_RF, P25_PDU_STR ", PDU_REG_TYPE_RSP_ACCPT (Registration Response Accept), llId = %u, ipAddr = %s", llId, __IP_FROM_ULONG(ipAddr).c_str()); + LogMessage(LOG_RF, P25_PDU_STR ", ACCPT (Registration Response Accept), llId = %u, ipAddr = %s", llId, __IP_FROM_ULONG(ipAddr).c_str()); } - writeRF_PDU_Reg_Response(PDU_REG_TYPE_RSP_ACCPT, mfId, llId, ipAddr); + writeRF_PDU_Reg_Response(PDURegType::ACCPT, mfId, llId, ipAddr); } m_connQueueTable.erase(llId); @@ -908,7 +909,7 @@ void Data::writeRF_PDU(const uint8_t* pdu, uint32_t bitLength, bool noNulls) Sync::addP25Sync(data + 2U); // Regenerate NID - m_p25->m_nid.encode(data + 2U, P25_DUID_PDU); + m_p25->m_nid.encode(data + 2U, DUID::PDU); // Add busy bits P25Utils::addBusyBits(data + 2U, newBitLength, true, false); @@ -993,7 +994,7 @@ void Data::writeNet_PDU_Buffered() Utils::setBitRange(block, data, offset, P25_PDU_FEC_LENGTH_BITS); // are we processing extended address data from the first block? - if (m_netDataHeader.getSAP() == PDU_SAP_EXT_ADDR && m_netDataHeader.getFormat() == PDU_FMT_CONFIRMED && + if (m_netDataHeader.getSAP() == PDUSAP::EXT_ADDR && m_netDataHeader.getFormat() == PDUFormatType::CONFIRMED && m_netData[i].getSerialNo() == 0U) { if (m_verbose) { LogMessage(LOG_NET, P25_PDU_STR ", OSP, block %u, fmt = $%02X, lastBlock = %u, sap = $%02X, llId = %u", @@ -1010,7 +1011,7 @@ void Data::writeNet_PDU_Buffered() else { if (m_verbose) { LogMessage(LOG_NET, P25_PDU_STR ", OSP, block %u, fmt = $%02X, lastBlock = %u", - (m_netDataHeader.getFormat() == PDU_FMT_CONFIRMED) ? m_netData[i].getSerialNo() : i, m_netData[i].getFormat(), + (m_netDataHeader.getFormat() == PDUFormatType::CONFIRMED) ? m_netData[i].getSerialNo() : i, m_netData[i].getFormat(), m_netData[i].getLastBlock()); if (m_dumpPDUData) { @@ -1023,7 +1024,7 @@ void Data::writeNet_PDU_Buffered() } offset += P25_PDU_FEC_LENGTH_BITS; - dataOffset += (m_netDataHeader.getFormat() == PDU_FMT_CONFIRMED) ? P25_PDU_CONFIRMED_DATA_LENGTH_BYTES : P25_PDU_UNCONFIRMED_LENGTH_BYTES; + dataOffset += (m_netDataHeader.getFormat() == PDUFormatType::CONFIRMED) ? P25_PDU_CONFIRMED_DATA_LENGTH_BYTES : P25_PDU_UNCONFIRMED_LENGTH_BYTES; } writeRF_PDU(data, bitLength); @@ -1089,7 +1090,7 @@ void Data::writeRF_PDU_Buffered() m_rfData[i].setData(m_pduUserData + dataOffset); // are we processing extended address data from the first block? - if (m_rfDataHeader.getSAP() == PDU_SAP_EXT_ADDR && m_rfDataHeader.getFormat() == PDU_FMT_CONFIRMED && + if (m_rfDataHeader.getSAP() == PDUSAP::EXT_ADDR && m_rfDataHeader.getFormat() == PDUFormatType::CONFIRMED && m_rfData[i].getSerialNo() == 0U) { if (m_verbose) { LogMessage(LOG_RF, P25_PDU_STR ", OSP, block %u, fmt = $%02X, lastBlock = %u, sap = $%02X, llId = %u", @@ -1106,7 +1107,7 @@ void Data::writeRF_PDU_Buffered() else { if (m_verbose) { LogMessage(LOG_RF, P25_PDU_STR ", OSP, block %u, fmt = $%02X, lastBlock = %u", - (m_rfDataHeader.getFormat() == PDU_FMT_CONFIRMED) ? m_rfData[i].getSerialNo() : i, m_rfData[i].getFormat(), + (m_rfDataHeader.getFormat() == PDUFormatType::CONFIRMED) ? m_rfData[i].getSerialNo() : i, m_rfData[i].getFormat(), m_rfData[i].getLastBlock()); if (m_dumpPDUData) { @@ -1123,7 +1124,7 @@ void Data::writeRF_PDU_Buffered() Utils::setBitRange(block, data, offset, P25_PDU_FEC_LENGTH_BITS); offset += P25_PDU_FEC_LENGTH_BITS; - dataOffset += (m_rfDataHeader.getFormat() == PDU_FMT_CONFIRMED) ? P25_PDU_CONFIRMED_DATA_LENGTH_BYTES : P25_PDU_UNCONFIRMED_LENGTH_BYTES; + dataOffset += (m_rfDataHeader.getFormat() == PDUFormatType::CONFIRMED) ? P25_PDU_CONFIRMED_DATA_LENGTH_BYTES : P25_PDU_UNCONFIRMED_LENGTH_BYTES; } writeRF_PDU(data, bitLength); @@ -1138,7 +1139,7 @@ void Data::writeRF_PDU_Buffered() /// void Data::writeRF_PDU_Reg_Response(uint8_t regType, uint8_t mfId, uint32_t llId, ulong64_t ipAddr) { - if ((regType != PDU_REG_TYPE_RSP_ACCPT) && (regType != PDU_REG_TYPE_RSP_DENY)) + if ((regType != PDURegType::ACCPT) && (regType != PDURegType::DENY)) return; uint32_t bitLength = (2U * P25_PDU_FEC_LENGTH_BITS) + P25_PREAMBLE_LENGTH_BITS; @@ -1150,11 +1151,11 @@ void Data::writeRF_PDU_Reg_Response(uint8_t regType, uint8_t mfId, uint32_t llId ::memset(block, 0x00U, P25_PDU_FEC_LENGTH_BYTES); DataHeader rspHeader = DataHeader(); - rspHeader.setFormat(PDU_FMT_CONFIRMED); + rspHeader.setFormat(PDUFormatType::CONFIRMED); rspHeader.setMFId(mfId); rspHeader.setAckNeeded(true); rspHeader.setOutbound(true); - rspHeader.setSAP(PDU_SAP_REG); + rspHeader.setSAP(PDUSAP::REG); rspHeader.setLLId(llId); rspHeader.setBlocksToFollow(1U); @@ -1171,7 +1172,7 @@ void Data::writeRF_PDU_Reg_Response(uint8_t regType, uint8_t mfId, uint32_t llId rspData[1U] = (llId >> 16) & 0xFFU; // Logical Link ID rspData[2U] = (llId >> 8) & 0xFFU; rspData[3U] = (llId >> 0) & 0xFFU; - if (regType == PDU_REG_TYPE_RSP_ACCPT) { + if (regType == PDURegType::ACCPT) { rspData[8U] = (ipAddr >> 24) & 0xFFU; // IP Address rspData[9U] = (ipAddr >> 16) & 0xFFU; rspData[10U] = (ipAddr >> 8) & 0xFFU; @@ -1182,7 +1183,7 @@ void Data::writeRF_PDU_Reg_Response(uint8_t regType, uint8_t mfId, uint32_t llId // Generate the PDU data DataBlock rspBlock = DataBlock(); - rspBlock.setFormat(PDU_FMT_CONFIRMED); + rspBlock.setFormat(PDUFormatType::CONFIRMED); rspBlock.setSerialNo(0U); rspBlock.setData(rspData); @@ -1204,7 +1205,7 @@ void Data::writeRF_PDU_Reg_Response(uint8_t regType, uint8_t mfId, uint32_t llId /// void Data::writeRF_PDU_Ack_Response(uint8_t ackClass, uint8_t ackType, uint8_t ackStatus, uint32_t llId, uint32_t srcLlId, bool noNulls) { - if (ackClass == PDU_ACK_CLASS_ACK && ackType != PDU_ACK_TYPE_ACK) + if (ackClass == PDUAckClass::ACK && ackType != PDUAckType::ACK) return; uint32_t bitLength = (1U * P25_PDU_FEC_LENGTH_BITS) + P25_PREAMBLE_LENGTH_BITS; @@ -1216,14 +1217,14 @@ void Data::writeRF_PDU_Ack_Response(uint8_t ackClass, uint8_t ackType, uint8_t a ::memset(block, 0x00U, P25_PDU_FEC_LENGTH_BYTES); DataHeader rspHeader = DataHeader(); - rspHeader.setFormat(PDU_FMT_RSP); + rspHeader.setFormat(PDUFormatType::RSP); rspHeader.setMFId(m_rfDataHeader.getMFId()); rspHeader.setOutbound(true); rspHeader.setResponseClass(ackClass); rspHeader.setResponseType(ackType); rspHeader.setResponseStatus(ackStatus); rspHeader.setLLId(llId); - if (m_rfDataHeader.getSAP() == PDU_SAP_EXT_ADDR) { + if (m_rfDataHeader.getSAP() == PDUSAP::EXT_ADDR) { rspHeader.setSrcLLId(srcLlId); rspHeader.setFullMessage(false); } diff --git a/src/host/p25/packet/Voice.cpp b/src/host/p25/packet/Voice.cpp index adcaf030..9a3a3933 100644 --- a/src/host/p25/packet/Voice.cpp +++ b/src/host/p25/packet/Voice.cpp @@ -26,8 +26,10 @@ #include "p25/packet/Voice.h" #include "ActivityLog.h" -using namespace p25; using namespace p25::packet; +using namespace p25::dfsi::defines; +using namespace p25::defines; +using namespace p25; #include #include @@ -97,19 +99,19 @@ bool Voice::process(uint8_t* data, uint32_t len) return false; } - uint8_t duid = m_p25->m_nid.getDUID(); + DUID::E duid = m_p25->m_nid.getDUID(); if (m_p25->m_rfState != RS_RF_LISTENING) { m_p25->m_rfTGHang.start(); } - if (duid == P25_DUID_HDU && m_lastDUID == P25_DUID_HDU) { - duid = P25_DUID_LDU1; + if (duid == DUID::HDU && m_lastDUID == DUID::HDU) { + duid = DUID::LDU1; } // handle individual DUIDs - if (duid == P25_DUID_HDU) { - m_lastDUID = P25_DUID_HDU; + if (duid == DUID::HDU) { + m_lastDUID = DUID::HDU; if (m_p25->m_rfState == RS_RF_LISTENING || m_p25->m_rfState == RS_RF_AUDIO) { resetRF(); @@ -123,10 +125,11 @@ bool Voice::process(uint8_t* data, uint32_t len) } if (m_verbose && m_debug) { - uint8_t mi[P25_MI_LENGTH_BYTES]; - ::memset(mi, 0x00U, p25::P25_MI_LENGTH_BYTES); + uint8_t mi[MI_LENGTH_BYTES]; + ::memset(mi, 0x00U, MI_LENGTH_BYTES); lc.getMI(mi); - Utils::dump(1U, "P25 HDU MI read from RF", mi, P25_MI_LENGTH_BYTES); + + Utils::dump(1U, "P25 HDU MI read from RF", mi, MI_LENGTH_BYTES); } if (m_verbose) { @@ -187,15 +190,15 @@ bool Voice::process(uint8_t* data, uint32_t len) return true; } - else if (duid == P25_DUID_LDU1) { + else if (duid == DUID::LDU1) { // prevent two xDUs of the same type from being sent consecutively - if (m_lastDUID == P25_DUID_LDU1) { + if (m_lastDUID == DUID::LDU1) { return false; } - m_lastDUID = P25_DUID_LDU1; + m_lastDUID = DUID::LDU1; bool alreadyDecoded = false; - uint8_t frameType = P25_FT_DATA_UNIT; + FrameType::E frameType = FrameType::DATA_UNIT; if (m_p25->m_rfState == RS_RF_LISTENING) { lc::LC lc = lc::LC(); bool ret = lc.decodeLDU1(data + 2U); @@ -286,7 +289,7 @@ bool Voice::process(uint8_t* data, uint32_t len) if (m_lastRejectId == 0U || m_lastRejectId != srcId) { LogWarning(LOG_RF, P25_HDU_STR " denial, RID rejection, srcId = %u", srcId); if (m_p25->m_enableControl) { - m_p25->m_control->writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_REQ_UNIT_NOT_VALID, (group ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH), group, true); + m_p25->m_control->writeRF_TSDU_Deny(srcId, dstId, ReasonCode::DENY_REQ_UNIT_NOT_VALID, (group ? TSBKO::IOSP_GRP_VCH : TSBKO::IOSP_UU_VCH), group, true); m_p25->m_control->denialInhibit(srcId); } @@ -308,7 +311,7 @@ bool Voice::process(uint8_t* data, uint32_t len) if (m_lastRejectId == 0 || m_lastRejectId != dstId) { LogWarning(LOG_RF, P25_HDU_STR " denial, RID rejection, dstId = %u", dstId); if (m_p25->m_enableControl) { - m_p25->m_control->writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_TGT_UNIT_NOT_VALID, TSBK_IOSP_UU_VCH, false, true); + m_p25->m_control->writeRF_TSDU_Deny(srcId, dstId, ReasonCode::DENY_TGT_UNIT_NOT_VALID, TSBKO::IOSP_UU_VCH, false, true); } ::ActivityLog("P25", true, "RF voice rejection from %u to %s%u ", srcId, group ? "TG " : "", dstId); @@ -328,7 +331,7 @@ bool Voice::process(uint8_t* data, uint32_t len) if (m_lastRejectId == 0 || m_lastRejectId != dstId) { LogWarning(LOG_RF, P25_HDU_STR " denial, TGID rejection, dstId = %u", dstId); if (m_p25->m_enableControl) { - m_p25->m_control->writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_TGT_GROUP_NOT_VALID, TSBK_IOSP_GRP_VCH, true, true); + m_p25->m_control->writeRF_TSDU_Deny(srcId, dstId, ReasonCode::DENY_TGT_GROUP_NOT_VALID, TSBKO::IOSP_GRP_VCH, true, true); } ::ActivityLog("P25", true, "RF voice rejection from %u to %s%u ", srcId, group ? "TG " : "", dstId); @@ -349,7 +352,7 @@ bool Voice::process(uint8_t* data, uint32_t len) if (!m_p25->m_affiliations.isGroupAff(srcId, dstId) && m_p25->m_control->m_verifyAff) { if (m_lastRejectId == 0 || m_lastRejectId != srcId) { LogWarning(LOG_RF, P25_HDU_STR " denial, RID not affiliated to TGID, srcId = %u, dstId = %u", srcId, dstId); - m_p25->m_control->writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_REQ_UNIT_NOT_AUTH, TSBK_IOSP_GRP_VCH, true, true); + m_p25->m_control->writeRF_TSDU_Deny(srcId, dstId, ReasonCode::DENY_REQ_UNIT_NOT_AUTH, TSBKO::IOSP_GRP_VCH, true, true); m_p25->m_control->writeRF_TSDU_U_Reg_Cmd(srcId); ::ActivityLog("P25", true, "RF voice rejection from %u to %s%u ", srcId, group ? "TG " : "", dstId); @@ -432,7 +435,7 @@ bool Voice::process(uint8_t* data, uint32_t len) osp = std::make_unique(); // transmit group voice grant update - osp->setLCO(TSBK_OSP_GRP_VCH_GRANT_UPD); + osp->setLCO(TSBKO::OSP_GRP_VCH_GRANT_UPD); osp->setDstId(dstId); osp->setGrpVchId(voiceChData.chId()); osp->setGrpVchNo(chNo); @@ -443,7 +446,7 @@ bool Voice::process(uint8_t* data, uint32_t len) osp = std::make_unique(); // transmit group voice grant update - osp->setLCO(TSBK_OSP_UU_VCH_GRANT_UPD); + osp->setLCO(TSBKO::OSP_UU_VCH_GRANT_UPD); osp->setSrcId(srcId); osp->setDstId(dstId); osp->setGrpVchId(voiceChData.chId()); @@ -484,7 +487,7 @@ bool Voice::process(uint8_t* data, uint32_t len) m_rfLC.setAlgId(m_rfLastHDU.getAlgId()); m_rfLC.setKId(m_rfLastHDU.getKId()); - uint8_t mi[P25_MI_LENGTH_BYTES]; + uint8_t mi[MI_LENGTH_BYTES]; m_rfLastHDU.getMI(mi); m_rfLC.setMI(mi); @@ -495,7 +498,7 @@ bool Voice::process(uint8_t* data, uint32_t len) Sync::addP25Sync(buffer + 2U); // Generate NID - m_p25->m_nid.encode(buffer + 2U, P25_DUID_HDU); + m_p25->m_nid.encode(buffer + 2U, DUID::HDU); // Generate HDU m_rfLC.encodeHDU(buffer + 2U); @@ -503,7 +506,7 @@ bool Voice::process(uint8_t* data, uint32_t len) // Add busy bits P25Utils::addBusyBits(buffer + 2U, P25_HDU_FRAME_LENGTH_BITS, false, true); - writeNetwork(buffer, P25_DUID_HDU); + writeNetwork(buffer, DUID::HDU); if (m_p25->m_duplex) { buffer[0U] = modem::TAG_DATA; @@ -512,14 +515,14 @@ bool Voice::process(uint8_t* data, uint32_t len) m_p25->addFrame(buffer, P25_HDU_FRAME_LENGTH_BYTES + 2U); } - frameType = P25_FT_HDU_VALID; + frameType = FrameType::HDU_VALID; if (m_verbose) { LogMessage(LOG_RF, P25_HDU_STR ", dstId = %u, algo = $%02X, kid = $%04X", m_rfLC.getDstId(), m_rfLC.getAlgId(), m_rfLC.getKId()); } } else { - frameType = P25_FT_HDU_LATE_ENTRY; + frameType = FrameType::HDU_LATE_ENTRY; LogWarning(LOG_RF, P25_HDU_STR ", not transmitted; possible late entry, dstId = %u, algo = $%02X, kid = $%04X", m_rfLastHDU.getDstId(), m_rfLastHDU.getAlgId(), m_rfLastHDU.getKId()); } @@ -535,7 +538,7 @@ bool Voice::process(uint8_t* data, uint32_t len) osp = std::make_unique(); // transmit group voice grant update - osp->setLCO(TSBK_OSP_GRP_VCH_GRANT_UPD); + osp->setLCO(TSBKO::OSP_GRP_VCH_GRANT_UPD); osp->setDstId(dstId); osp->setGrpVchId(voiceChData.chId()); osp->setGrpVchNo(chNo); @@ -546,7 +549,7 @@ bool Voice::process(uint8_t* data, uint32_t len) osp = std::make_unique(); // transmit group voice grant update - osp->setLCO(TSBK_OSP_UU_VCH_GRANT_UPD); + osp->setLCO(TSBKO::OSP_UU_VCH_GRANT_UPD); osp->setSrcId(srcId); osp->setDstId(dstId); osp->setGrpVchId(voiceChData.chId()); @@ -569,7 +572,7 @@ bool Voice::process(uint8_t* data, uint32_t len) m_vocLDU1Count = 0U; m_roamLDU1Count = 0U; m_p25->m_rfTimeout.start(); - m_lastDUID = P25_DUID_HDU; + m_lastDUID = DUID::HDU; m_rfLastHDU = lc::LC(); } @@ -657,7 +660,7 @@ bool Voice::process(uint8_t* data, uint32_t len) m_vocLDU1Count++; if (m_vocLDU1Count > VOC_LDU1_COUNT) { m_vocLDU1Count = 0U; - m_rfLC.setLCO(LC_RFSS_STS_BCAST); + m_rfLC.setLCO(LCO::RFSS_STS_BCAST); } } @@ -665,7 +668,7 @@ bool Voice::process(uint8_t* data, uint32_t len) Sync::addP25Sync(data + 2U); // generate NID - m_p25->m_nid.encode(data + 2U, P25_DUID_LDU1); + m_p25->m_nid.encode(data + 2U, DUID::LDU1); // generate LDU1 Data m_rfLC.encodeLDU1(data + 2U); @@ -711,7 +714,7 @@ bool Voice::process(uint8_t* data, uint32_t len) // add busy bits P25Utils::addBusyBits(data + 2U, P25_LDU_FRAME_LENGTH_BITS, false, true); - writeNetwork(data + 2U, P25_DUID_LDU1, frameType); + writeNetwork(data + 2U, DUID::LDU1, frameType); if (m_p25->m_duplex) { data[0U] = modem::TAG_DATA; @@ -728,12 +731,12 @@ bool Voice::process(uint8_t* data, uint32_t len) return true; } } - else if (duid == P25_DUID_LDU2) { + else if (duid == DUID::LDU2) { // prevent two xDUs of the same type from being sent consecutively - if (m_lastDUID == P25_DUID_LDU2) { + if (m_lastDUID == DUID::LDU2) { return false; } - m_lastDUID = P25_DUID_LDU2; + m_lastDUID = DUID::LDU2; if (m_p25->m_rfState == RS_RF_LISTENING) { return false; @@ -746,18 +749,18 @@ bool Voice::process(uint8_t* data, uint32_t len) m_rfUndecodableLC++; // regenerate the MI using LFSR - uint8_t lastMI[P25_MI_LENGTH_BYTES]; - ::memset(lastMI, 0x00U, P25_MI_LENGTH_BYTES); + uint8_t lastMI[MI_LENGTH_BYTES]; + ::memset(lastMI, 0x00U, MI_LENGTH_BYTES); - uint8_t nextMI[P25_MI_LENGTH_BYTES]; - ::memset(nextMI, 0x00U, P25_MI_LENGTH_BYTES); + uint8_t nextMI[MI_LENGTH_BYTES]; + ::memset(nextMI, 0x00U, MI_LENGTH_BYTES); m_rfLastLDU2.getMI(lastMI); getNextMI(lastMI, nextMI); if (m_verbose && m_debug) { - Utils::dump(1U, "Previous P25 HDU MI", lastMI, P25_MI_LENGTH_BYTES); - Utils::dump(1U, "Calculated next P25 HDU MI", nextMI, P25_MI_LENGTH_BYTES); + Utils::dump(1U, "Previous P25 HDU MI", lastMI, MI_LENGTH_BYTES); + Utils::dump(1U, "Calculated next P25 HDU MI", nextMI, MI_LENGTH_BYTES); } m_rfLC.setMI(nextMI); @@ -771,7 +774,7 @@ bool Voice::process(uint8_t* data, uint32_t len) Sync::addP25Sync(data + 2U); // generate NID - m_p25->m_nid.encode(data + 2U, P25_DUID_LDU2); + m_p25->m_nid.encode(data + 2U, DUID::LDU2); // generate LDU2 data m_rfLC.encodeLDU2(data + 2U); @@ -817,7 +820,7 @@ bool Voice::process(uint8_t* data, uint32_t len) // add busy bits P25Utils::addBusyBits(data + 2U, P25_LDU_FRAME_LENGTH_BITS, false, true); - writeNetwork(data + 2U, P25_DUID_LDU2); + writeNetwork(data + 2U, DUID::LDU2); if (m_p25->m_duplex) { data[0U] = modem::TAG_DATA; @@ -834,12 +837,12 @@ bool Voice::process(uint8_t* data, uint32_t len) return true; } } - else if (duid == P25_DUID_VSELP1) { + else if (duid == DUID::VSELP1) { // prevent two xDUs of the same type from being sent consecutively - if (m_lastDUID == P25_DUID_VSELP1) { + if (m_lastDUID == DUID::VSELP1) { return false; } - m_lastDUID = P25_DUID_VSELP1; + m_lastDUID = DUID::VSELP1; // VSELP has no decoding -- its just passed transparently @@ -885,7 +888,7 @@ bool Voice::process(uint8_t* data, uint32_t len) m_rfLC.setAlgId(m_rfLastHDU.getAlgId()); m_rfLC.setKId(m_rfLastHDU.getKId()); - uint8_t mi[P25_MI_LENGTH_BYTES]; + uint8_t mi[MI_LENGTH_BYTES]; m_rfLastHDU.getMI(mi); m_rfLC.setMI(mi); @@ -896,7 +899,7 @@ bool Voice::process(uint8_t* data, uint32_t len) Sync::addP25Sync(buffer + 2U); // Generate NID - m_p25->m_nid.encode(buffer + 2U, P25_DUID_HDU); + m_p25->m_nid.encode(buffer + 2U, DUID::HDU); // Generate HDU m_rfLC.encodeHDU(buffer + 2U); @@ -904,7 +907,7 @@ bool Voice::process(uint8_t* data, uint32_t len) // Add busy bits P25Utils::addBusyBits(buffer + 2U, P25_HDU_FRAME_LENGTH_BITS, false, true); - writeNetwork(buffer, P25_DUID_HDU); + writeNetwork(buffer, DUID::HDU); if (m_p25->m_duplex) { buffer[0U] = modem::TAG_DATA; @@ -928,7 +931,7 @@ bool Voice::process(uint8_t* data, uint32_t len) m_vocLDU1Count = 0U; m_roamLDU1Count = 0U; m_p25->m_rfTimeout.start(); - m_lastDUID = P25_DUID_HDU; + m_lastDUID = DUID::HDU; m_rfLastHDU = lc::LC(); } @@ -940,12 +943,12 @@ bool Voice::process(uint8_t* data, uint32_t len) Sync::addP25Sync(data + 2U); // generate NID - m_p25->m_nid.encode(data + 2U, P25_DUID_VSELP1); + m_p25->m_nid.encode(data + 2U, DUID::VSELP1); // add busy bits P25Utils::addBusyBits(data + 2U, P25_LDU_FRAME_LENGTH_BITS, false, true); - writeNetwork(data + 2U, P25_DUID_VSELP1); + writeNetwork(data + 2U, DUID::VSELP1); if (m_p25->m_duplex) { data[0U] = modem::TAG_DATA; @@ -961,12 +964,12 @@ bool Voice::process(uint8_t* data, uint32_t len) return true; } } - else if (duid == P25_DUID_VSELP2) { + else if (duid == DUID::VSELP2) { // prevent two xDUs of the same type from being sent consecutively - if (m_lastDUID == P25_DUID_VSELP2) { + if (m_lastDUID == DUID::VSELP2) { return false; } - m_lastDUID = P25_DUID_VSELP2; + m_lastDUID = DUID::VSELP2; // VSELP has no decoding -- its just passed transparently @@ -980,12 +983,12 @@ bool Voice::process(uint8_t* data, uint32_t len) Sync::addP25Sync(data + 2U); // generate NID - m_p25->m_nid.encode(data + 2U, P25_DUID_VSELP2); + m_p25->m_nid.encode(data + 2U, DUID::VSELP2); // add busy bits P25Utils::addBusyBits(data + 2U, P25_LDU_FRAME_LENGTH_BITS, false, true); - writeNetwork(data + 2U, P25_DUID_VSELP2); + writeNetwork(data + 2U, DUID::VSELP2); if (m_p25->m_duplex) { data[0U] = modem::TAG_DATA; @@ -1001,7 +1004,7 @@ bool Voice::process(uint8_t* data, uint32_t len) return true; } } - else if (duid == P25_DUID_TDU || duid == P25_DUID_TDULC) { + else if (duid == DUID::TDU || duid == DUID::TDULC) { if (!m_p25->m_enableControl) { m_p25->m_affiliations.releaseGrant(m_rfLC.getDstId(), false); } @@ -1010,7 +1013,7 @@ bool Voice::process(uint8_t* data, uint32_t len) m_p25->notifyCC_ReleaseGrant(m_rfLC.getDstId()); } - if (duid == P25_DUID_TDU) { + if (duid == DUID::TDU) { m_p25->writeRF_TDU(false); m_lastDUID = duid; @@ -1077,7 +1080,7 @@ bool Voice::process(uint8_t* data, uint32_t len) /// Data Unit ID. /// Network Frame Type. /// -bool Voice::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, data::LowSpeedData& lsd, uint8_t& duid, uint8_t& frameType) +bool Voice::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, data::LowSpeedData& lsd, defines::DUID::E& duid, defines::FrameType::E& frameType) { uint32_t dstId = control.getDstId(); uint32_t srcId = control.getSrcId(); @@ -1099,7 +1102,7 @@ bool Voice::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, data::L // perform authoritative network TG hangtimer and traffic preemption if (m_p25->m_authoritative) { // don't process network frames if the destination ID's don't match and the network TG hang timer is running - if (m_p25->m_netLastDstId != 0U && dstId != 0U && (duid == P25_DUID_LDU1 || duid == P25_DUID_LDU2)) { + if (m_p25->m_netLastDstId != 0U && dstId != 0U && (duid == DUID::LDU1 || duid == DUID::LDU2)) { if (m_p25->m_netLastDstId != dstId && (m_p25->m_netTGHang.isRunning() && !m_p25->m_netTGHang.hasExpired())) { return false; } @@ -1141,50 +1144,50 @@ bool Voice::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, data::L uint32_t count = 0U; switch (duid) { - case P25_DUID_LDU1: - if ((data[0U] == dfsi::P25_DFSI_LDU1_VOICE1) && (data[22U] == dfsi::P25_DFSI_LDU1_VOICE2) && - (data[36U] == dfsi::P25_DFSI_LDU1_VOICE3) && (data[53U] == dfsi::P25_DFSI_LDU1_VOICE4) && - (data[70U] == dfsi::P25_DFSI_LDU1_VOICE5) && (data[87U] == dfsi::P25_DFSI_LDU1_VOICE6) && - (data[104U] == dfsi::P25_DFSI_LDU1_VOICE7) && (data[121U] == dfsi::P25_DFSI_LDU1_VOICE8) && - (data[138U] == dfsi::P25_DFSI_LDU1_VOICE9)) { + case DUID::LDU1: + if ((data[0U] == DFSIFrameType::LDU1_VOICE1) && (data[22U] == DFSIFrameType::LDU1_VOICE2) && + (data[36U] == DFSIFrameType::LDU1_VOICE3) && (data[53U] == DFSIFrameType::LDU1_VOICE4) && + (data[70U] == DFSIFrameType::LDU1_VOICE5) && (data[87U] == DFSIFrameType::LDU1_VOICE6) && + (data[104U] == DFSIFrameType::LDU1_VOICE7) && (data[121U] == DFSIFrameType::LDU1_VOICE8) && + (data[138U] == DFSIFrameType::LDU1_VOICE9)) { m_dfsiLC = dfsi::LC(control, lsd); - m_dfsiLC.setFrameType(dfsi::P25_DFSI_LDU1_VOICE1); + m_dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE1); m_dfsiLC.decodeLDU1(data + count, m_netLDU1 + 10U); - count += dfsi::P25_DFSI_LDU1_VOICE1_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE1_FRAME_LENGTH_BYTES; - m_dfsiLC.setFrameType(dfsi::P25_DFSI_LDU1_VOICE2); + m_dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE2); m_dfsiLC.decodeLDU1(data + count, m_netLDU1 + 26U); - count += dfsi::P25_DFSI_LDU1_VOICE2_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE2_FRAME_LENGTH_BYTES; - m_dfsiLC.setFrameType(dfsi::P25_DFSI_LDU1_VOICE3); + m_dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE3); m_dfsiLC.decodeLDU1(data + count, m_netLDU1 + 55U); - count += dfsi::P25_DFSI_LDU1_VOICE3_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE3_FRAME_LENGTH_BYTES; - m_dfsiLC.setFrameType(dfsi::P25_DFSI_LDU1_VOICE4); + m_dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE4); m_dfsiLC.decodeLDU1(data + count, m_netLDU1 + 80U); - count += dfsi::P25_DFSI_LDU1_VOICE4_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE4_FRAME_LENGTH_BYTES; - m_dfsiLC.setFrameType(dfsi::P25_DFSI_LDU1_VOICE5); + m_dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE5); m_dfsiLC.decodeLDU1(data + count, m_netLDU1 + 105U); - count += dfsi::P25_DFSI_LDU1_VOICE5_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE5_FRAME_LENGTH_BYTES; - m_dfsiLC.setFrameType(dfsi::P25_DFSI_LDU1_VOICE6); + m_dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE6); m_dfsiLC.decodeLDU1(data + count, m_netLDU1 + 130U); - count += dfsi::P25_DFSI_LDU1_VOICE6_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE6_FRAME_LENGTH_BYTES; - m_dfsiLC.setFrameType(dfsi::P25_DFSI_LDU1_VOICE7); + m_dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE7); m_dfsiLC.decodeLDU1(data + count, m_netLDU1 + 155U); - count += dfsi::P25_DFSI_LDU1_VOICE7_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE7_FRAME_LENGTH_BYTES; - m_dfsiLC.setFrameType(dfsi::P25_DFSI_LDU1_VOICE8); + m_dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE8); m_dfsiLC.decodeLDU1(data + count, m_netLDU1 + 180U); - count += dfsi::P25_DFSI_LDU1_VOICE8_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE8_FRAME_LENGTH_BYTES; - m_dfsiLC.setFrameType(dfsi::P25_DFSI_LDU1_VOICE9); + m_dfsiLC.setFrameType(DFSIFrameType::LDU1_VOICE9); m_dfsiLC.decodeLDU1(data + count, m_netLDU1 + 204U); - count += dfsi::P25_DFSI_LDU1_VOICE9_FRAME_LENGTH_BYTES; + count += DFSI_LDU1_VOICE9_FRAME_LENGTH_BYTES; // these aren't set by the DFSI decoder, so we'll manually // reset them @@ -1224,47 +1227,47 @@ bool Voice::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, data::L } } break; - case P25_DUID_LDU2: - if ((data[0U] == dfsi::P25_DFSI_LDU2_VOICE10) && (data[22U] == dfsi::P25_DFSI_LDU2_VOICE11) && - (data[36U] == dfsi::P25_DFSI_LDU2_VOICE12) && (data[53U] == dfsi::P25_DFSI_LDU2_VOICE13) && - (data[70U] == dfsi::P25_DFSI_LDU2_VOICE14) && (data[87U] == dfsi::P25_DFSI_LDU2_VOICE15) && - (data[104U] == dfsi::P25_DFSI_LDU2_VOICE16) && (data[121U] == dfsi::P25_DFSI_LDU2_VOICE17) && - (data[138U] == dfsi::P25_DFSI_LDU2_VOICE18)) { - m_dfsiLC.setFrameType(dfsi::P25_DFSI_LDU2_VOICE10); + case DUID::LDU2: + if ((data[0U] == DFSIFrameType::LDU2_VOICE10) && (data[22U] == DFSIFrameType::LDU2_VOICE11) && + (data[36U] == DFSIFrameType::LDU2_VOICE12) && (data[53U] == DFSIFrameType::LDU2_VOICE13) && + (data[70U] == DFSIFrameType::LDU2_VOICE14) && (data[87U] == DFSIFrameType::LDU2_VOICE15) && + (data[104U] == DFSIFrameType::LDU2_VOICE16) && (data[121U] == DFSIFrameType::LDU2_VOICE17) && + (data[138U] == DFSIFrameType::LDU2_VOICE18)) { + m_dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE10); m_dfsiLC.decodeLDU2(data + count, m_netLDU2 + 10U); - count += dfsi::P25_DFSI_LDU2_VOICE10_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE10_FRAME_LENGTH_BYTES; - m_dfsiLC.setFrameType(dfsi::P25_DFSI_LDU2_VOICE11); + m_dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE11); m_dfsiLC.decodeLDU2(data + count, m_netLDU2 + 26U); - count += dfsi::P25_DFSI_LDU2_VOICE11_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE11_FRAME_LENGTH_BYTES; - m_dfsiLC.setFrameType(dfsi::P25_DFSI_LDU2_VOICE12); + m_dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE12); m_dfsiLC.decodeLDU2(data + count, m_netLDU2 + 55U); - count += dfsi::P25_DFSI_LDU2_VOICE12_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE12_FRAME_LENGTH_BYTES; - m_dfsiLC.setFrameType(dfsi::P25_DFSI_LDU2_VOICE13); + m_dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE13); m_dfsiLC.decodeLDU2(data + count, m_netLDU2 + 80U); - count += dfsi::P25_DFSI_LDU2_VOICE13_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE13_FRAME_LENGTH_BYTES; - m_dfsiLC.setFrameType(dfsi::P25_DFSI_LDU2_VOICE14); + m_dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE14); m_dfsiLC.decodeLDU2(data + count, m_netLDU2 + 105U); - count += dfsi::P25_DFSI_LDU2_VOICE14_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE14_FRAME_LENGTH_BYTES; - m_dfsiLC.setFrameType(dfsi::P25_DFSI_LDU2_VOICE15); + m_dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE15); m_dfsiLC.decodeLDU2(data + count, m_netLDU2 + 130U); - count += dfsi::P25_DFSI_LDU2_VOICE15_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE15_FRAME_LENGTH_BYTES; - m_dfsiLC.setFrameType(dfsi::P25_DFSI_LDU2_VOICE16); + m_dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE16); m_dfsiLC.decodeLDU2(data + count, m_netLDU2 + 155U); - count += dfsi::P25_DFSI_LDU2_VOICE16_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE16_FRAME_LENGTH_BYTES; - m_dfsiLC.setFrameType(dfsi::P25_DFSI_LDU2_VOICE17); + m_dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE17); m_dfsiLC.decodeLDU2(data + count, m_netLDU2 + 180U); - count += dfsi::P25_DFSI_LDU2_VOICE17_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE17_FRAME_LENGTH_BYTES; - m_dfsiLC.setFrameType(dfsi::P25_DFSI_LDU2_VOICE18); + m_dfsiLC.setFrameType(DFSIFrameType::LDU2_VOICE18); m_dfsiLC.decodeLDU2(data + count, m_netLDU2 + 204U); - count += dfsi::P25_DFSI_LDU2_VOICE18_FRAME_LENGTH_BYTES; + count += DFSI_LDU2_VOICE18_FRAME_LENGTH_BYTES; if (m_p25->m_enableControl) { lc::LC control = lc::LC(*m_dfsiLC.control()); @@ -1298,12 +1301,12 @@ bool Voice::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, data::L } } break; - case P25_DUID_VSELP1: - case P25_DUID_VSELP2: + case DUID::VSELP1: + case DUID::VSELP2: // currently ignored -- this is a TODO break; - case P25_DUID_TDU: - case P25_DUID_TDULC: + case DUID::TDU: + case DUID::TDULC: // ignore a TDU that doesn't contain our destination ID if (control.getDstId() != m_p25->m_netLastDstId) { return false; @@ -1324,12 +1327,15 @@ bool Voice::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, data::L } if (m_p25->m_netState != RS_NET_IDLE) { - if (duid == P25_DUID_TDU) + if (duid == DUID::TDU) writeNet_TDU(); resetNet(); } break; + + default: + break; } return true; @@ -1360,13 +1366,13 @@ Voice::Voice(Control* p25, bool debug, bool verbose) : m_rfLastLDU2(), m_netLC(), m_netLastLDU1(), - m_netLastFrameType(P25_FT_DATA_UNIT), + m_netLastFrameType(FrameType::DATA_UNIT), m_rfLSD(), m_netLSD(), m_dfsiLC(), m_netLDU1(nullptr), m_netLDU2(nullptr), - m_lastDUID(P25_DUID_TDU), + m_lastDUID(DUID::TDU), m_lastIMBE(nullptr), m_lastMI(nullptr), m_hadVoice(false), @@ -1383,11 +1389,11 @@ Voice::Voice(Control* p25, bool debug, bool verbose) : ::memset(m_netLDU1, 0x00U, 9U * 25U); ::memset(m_netLDU2, 0x00U, 9U * 25U); - m_lastIMBE = new uint8_t[11U]; - ::memcpy(m_lastIMBE, P25_NULL_IMBE, 11U); + m_lastIMBE = new uint8_t[RAW_IMBE_LENGTH_BYTES]; + ::memcpy(m_lastIMBE, NULL_IMBE, RAW_IMBE_LENGTH_BYTES); - m_lastMI = new uint8_t[P25_MI_LENGTH_BYTES]; - ::memset(m_lastMI, 0x00U, P25_MI_LENGTH_BYTES); + m_lastMI = new uint8_t[MI_LENGTH_BYTES]; + ::memset(m_lastMI, 0x00U, MI_LENGTH_BYTES); } /// @@ -1407,7 +1413,7 @@ Voice::~Voice() /// /// /// -void Voice::writeNetwork(const uint8_t *data, uint8_t duid, uint8_t frameType) +void Voice::writeNetwork(const uint8_t *data, defines::DUID::E duid, defines::FrameType::E frameType) { assert(data != nullptr); @@ -1418,17 +1424,17 @@ void Voice::writeNetwork(const uint8_t *data, uint8_t duid, uint8_t frameType) return; switch (duid) { - case P25_DUID_HDU: + case DUID::HDU: // ignore HDU break; - case P25_DUID_LDU1: + case DUID::LDU1: m_p25->m_network->writeP25LDU1(m_rfLC, m_rfLSD, data, frameType); break; - case P25_DUID_LDU2: + case DUID::LDU2: m_p25->m_network->writeP25LDU2(m_rfLC, m_rfLSD, data); break; - case P25_DUID_TDU: - case P25_DUID_TDULC: + case DUID::TDU: + case DUID::TDULC: m_p25->m_network->writeP25TDU(m_rfLC, m_rfLSD); break; default: @@ -1473,7 +1479,7 @@ void Voice::writeNet_TDU() Sync::addP25Sync(buffer + 2U); // Generate NID - m_p25->m_nid.encode(buffer + 2U, P25_DUID_TDU); + m_p25->m_nid.encode(buffer + 2U, DUID::TDU); // Add busy bits P25Utils::addBusyBits(buffer + 2U, P25_TDU_FRAME_LENGTH_BITS, true, true); @@ -1544,7 +1550,7 @@ void Voice::writeNet_LDU1() uint32_t dstId = control.getDstId(); uint32_t srcId = control.getSrcId(); - bool group = control.getLCO() == LC_GROUP; + bool group = control.getLCO() == LCO::GROUP; // ensure our dstId are sane from the last LDU1 if (m_netLastLDU1.getDstId() != 0U) { @@ -1597,19 +1603,19 @@ void Voice::writeNet_LDU1() // if we are idle lets generate HDU data if (m_p25->m_netState == RS_NET_IDLE) { - uint8_t mi[P25_MI_LENGTH_BYTES]; - ::memset(mi, 0x00U, P25_MI_LENGTH_BYTES); + uint8_t mi[MI_LENGTH_BYTES]; + ::memset(mi, 0x00U, MI_LENGTH_BYTES); - if (m_netLastLDU1.getAlgId() != P25_ALGO_UNENCRYPT && m_netLastLDU1.getKId() != 0) { + if (m_netLastLDU1.getAlgId() != ALGO_UNENCRYPT && m_netLastLDU1.getKId() != 0) { control.setAlgId(m_netLastLDU1.getAlgId()); control.setKId(m_netLastLDU1.getKId()); } // restore MI from member variable - ::memcpy(mi, m_lastMI, P25_MI_LENGTH_BYTES); + ::memcpy(mi, m_lastMI, MI_LENGTH_BYTES); if (m_verbose && m_debug) { - Utils::dump(1U, "P25 HDU MI from network to RF", mi, P25_MI_LENGTH_BYTES); + Utils::dump(1U, "P25 HDU MI from network to RF", mi, MI_LENGTH_BYTES); } m_netLC.setMI(mi); @@ -1667,7 +1673,7 @@ void Voice::writeNet_LDU1() m_netLC = lc::LC(); m_netLastLDU1 = lc::LC(); - m_netLastFrameType = P25_FT_DATA_UNIT; + m_netLastFrameType = FrameType::DATA_UNIT; m_p25->m_netState = RS_NET_IDLE; m_p25->m_netLastDstId = 0U; @@ -1695,7 +1701,7 @@ void Voice::writeNet_LDU1() osp = std::make_unique(); // transmit group voice grant update - osp->setLCO(TSBK_OSP_GRP_VCH_GRANT_UPD); + osp->setLCO(TSBKO::OSP_GRP_VCH_GRANT_UPD); osp->setDstId(dstId); osp->setGrpVchId(voiceChData.chId()); osp->setGrpVchNo(chNo); @@ -1706,7 +1712,7 @@ void Voice::writeNet_LDU1() osp = std::make_unique(); // transmit group voice grant update - osp->setLCO(TSBK_OSP_UU_VCH_GRANT_UPD); + osp->setLCO(TSBKO::OSP_UU_VCH_GRANT_UPD); osp->setSrcId(srcId); osp->setDstId(dstId); osp->setGrpVchId(voiceChData.chId()); @@ -1735,7 +1741,7 @@ void Voice::writeNet_LDU1() m_roamLDU1Count = 0U; if (!m_p25->m_disableNetworkHDU) { - if (m_netLastFrameType != P25_FT_HDU_LATE_ENTRY) { + if (m_netLastFrameType != FrameType::HDU_LATE_ENTRY) { uint8_t buffer[P25_HDU_FRAME_LENGTH_BYTES + 2U]; ::memset(buffer, 0x00U, P25_HDU_FRAME_LENGTH_BYTES + 2U); @@ -1743,7 +1749,7 @@ void Voice::writeNet_LDU1() Sync::addP25Sync(buffer + 2U); // Generate NID - m_p25->m_nid.encode(buffer + 2U, P25_DUID_HDU); + m_p25->m_nid.encode(buffer + 2U, DUID::HDU); // Generate header m_netLC.encodeHDU(buffer + 2U); @@ -1796,11 +1802,11 @@ void Voice::writeNet_LDU1() m_roamLDU1Count = 0U; m_netLC.setNetId(netId); m_netLC.setSysId(sysId); - m_netLC.setLCO(LC_EXPLICIT_SOURCE_ID); + m_netLC.setLCO(LCO::EXPLICIT_SOURCE_ID); } else { // flag explicit block to follow in next LDU1 - if (m_netLC.getLCO() == LC_GROUP) { + if (m_netLC.getLCO() == LCO::GROUP) { m_netLC.setExplicitId(true); } } @@ -1817,7 +1823,7 @@ void Voice::writeNet_LDU1() m_vocLDU1Count++; if (m_vocLDU1Count > VOC_LDU1_COUNT) { m_vocLDU1Count = 0U; - m_netLC.setLCO(LC_RFSS_STS_BCAST); + m_netLC.setLCO(LCO::RFSS_STS_BCAST); } } @@ -1830,7 +1836,7 @@ void Voice::writeNet_LDU1() Sync::addP25Sync(buffer + 2U); // Generate NID - m_p25->m_nid.encode(buffer + 2U, P25_DUID_LDU1); + m_p25->m_nid.encode(buffer + 2U, DUID::LDU1); // Generate LDU1 data m_netLC.encodeLDU1(buffer + 2U); @@ -1906,11 +1912,11 @@ void Voice::writeNet_LDU2() return; } - uint8_t mi[P25_MI_LENGTH_BYTES]; + uint8_t mi[MI_LENGTH_BYTES]; control.getMI(mi); if (m_verbose && m_debug) { - Utils::dump(1U, "Network LDU2 MI", mi, P25_MI_LENGTH_BYTES); + Utils::dump(1U, "Network LDU2 MI", mi, MI_LENGTH_BYTES); } m_netLC.setMI(mi); @@ -1926,7 +1932,7 @@ void Voice::writeNet_LDU2() Sync::addP25Sync(buffer + 2U); // Generate NID - m_p25->m_nid.encode(buffer + 2U, P25_DUID_LDU2); + m_p25->m_nid.encode(buffer + 2U, DUID::LDU2); // Generate LDU2 data m_netLC.encodeLDU2(buffer + 2U); @@ -2050,39 +2056,39 @@ void Voice::insertMissingAudio(uint8_t *data) void Voice::insertNullAudio(uint8_t *data) { if (data[0U] == 0x00U) { - ::memcpy(data + 10U, P25_NULL_IMBE, 11U); + ::memcpy(data + 10U, NULL_IMBE, 11U); } if (data[25U] == 0x00U) { - ::memcpy(data + 26U, P25_NULL_IMBE, 11U); + ::memcpy(data + 26U, NULL_IMBE, 11U); } if (data[50U] == 0x00U) { - ::memcpy(data + 55U, P25_NULL_IMBE, 11U); + ::memcpy(data + 55U, NULL_IMBE, 11U); } if (data[75U] == 0x00U) { - ::memcpy(data + 80U, P25_NULL_IMBE, 11U); + ::memcpy(data + 80U, NULL_IMBE, 11U); } if (data[100U] == 0x00U) { - ::memcpy(data + 105U, P25_NULL_IMBE, 11U); + ::memcpy(data + 105U, NULL_IMBE, 11U); } if (data[125U] == 0x00U) { - ::memcpy(data + 130U, P25_NULL_IMBE, 11U); + ::memcpy(data + 130U, NULL_IMBE, 11U); } if (data[150U] == 0x00U) { - ::memcpy(data + 155U, P25_NULL_IMBE, 11U); + ::memcpy(data + 155U, NULL_IMBE, 11U); } if (data[175U] == 0x00U) { - ::memcpy(data + 180U, P25_NULL_IMBE, 11U); + ::memcpy(data + 180U, NULL_IMBE, 11U); } if (data[200U] == 0x00U) { - ::memcpy(data + 204U, P25_NULL_IMBE, 11U); + ::memcpy(data + 204U, NULL_IMBE, 11U); } } @@ -2093,39 +2099,39 @@ void Voice::insertNullAudio(uint8_t *data) void Voice::insertEncryptedNullAudio(uint8_t *data) { if (data[0U] == 0x00U) { - ::memcpy(data + 10U, P25_ENCRYPTED_NULL_IMBE, 11U); + ::memcpy(data + 10U, ENCRYPTED_NULL_IMBE, 11U); } if (data[25U] == 0x00U) { - ::memcpy(data + 26U, P25_ENCRYPTED_NULL_IMBE, 11U); + ::memcpy(data + 26U, ENCRYPTED_NULL_IMBE, 11U); } if (data[50U] == 0x00U) { - ::memcpy(data + 55U, P25_ENCRYPTED_NULL_IMBE, 11U); + ::memcpy(data + 55U, ENCRYPTED_NULL_IMBE, 11U); } if (data[75U] == 0x00U) { - ::memcpy(data + 80U, P25_ENCRYPTED_NULL_IMBE, 11U); + ::memcpy(data + 80U, ENCRYPTED_NULL_IMBE, 11U); } if (data[100U] == 0x00U) { - ::memcpy(data + 105U, P25_ENCRYPTED_NULL_IMBE, 11U); + ::memcpy(data + 105U, ENCRYPTED_NULL_IMBE, 11U); } if (data[125U] == 0x00U) { - ::memcpy(data + 130U, P25_ENCRYPTED_NULL_IMBE, 11U); + ::memcpy(data + 130U, ENCRYPTED_NULL_IMBE, 11U); } if (data[150U] == 0x00U) { - ::memcpy(data + 155U, P25_ENCRYPTED_NULL_IMBE, 11U); + ::memcpy(data + 155U, ENCRYPTED_NULL_IMBE, 11U); } if (data[175U] == 0x00U) { - ::memcpy(data + 180U, P25_ENCRYPTED_NULL_IMBE, 11U); + ::memcpy(data + 180U, ENCRYPTED_NULL_IMBE, 11U); } if (data[200U] == 0x00U) { - ::memcpy(data + 204U, P25_ENCRYPTED_NULL_IMBE, 11U); + ::memcpy(data + 204U, ENCRYPTED_NULL_IMBE, 11U); } } diff --git a/src/host/p25/packet/Voice.h b/src/host/p25/packet/Voice.h index f7537c17..03dc3e98 100644 --- a/src/host/p25/packet/Voice.h +++ b/src/host/p25/packet/Voice.h @@ -9,7 +9,7 @@ * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * * Copyright (C) 2016,2017 Jonathan Naylor, G4KLX -* Copyright (C) 2017-2022 Bryan Biedenkapp, N2PLL +* Copyright (C) 2017-2024 Bryan Biedenkapp, N2PLL * */ #if !defined(__P25_PACKET_VOICE_H__) @@ -51,7 +51,7 @@ namespace p25 /// Process a data frame from the RF interface. bool process(uint8_t* data, uint32_t len); /// Process a data frame from the network. - bool processNetwork(uint8_t* data, uint32_t len, lc::LC& control, data::LowSpeedData& lsd, uint8_t& duid, uint8_t& frameType); + bool processNetwork(uint8_t* data, uint32_t len, lc::LC& control, data::LowSpeedData& lsd, defines::DUID::E& duid, defines::FrameType::E& frameType); protected: friend class packet::ControlSignaling; @@ -74,7 +74,7 @@ namespace p25 lc::LC m_netLC; lc::LC m_netLastLDU1; - uint8_t m_netLastFrameType; + defines::FrameType::E m_netLastFrameType; data::LowSpeedData m_rfLSD; data::LowSpeedData m_netLSD; @@ -83,7 +83,7 @@ namespace p25 uint8_t* m_netLDU1; uint8_t* m_netLDU2; - uint8_t m_lastDUID; + defines::DUID::E m_lastDUID; uint8_t* m_lastIMBE; uint8_t* m_lastMI; @@ -104,7 +104,7 @@ namespace p25 ~Voice(); /// Write data processed from RF to the network. - void writeNetwork(const uint8_t* data, uint8_t duid, uint8_t frameType = P25_FT_DATA_UNIT); + void writeNetwork(const uint8_t* data, defines::DUID::E duid, defines::FrameType::E frameType = defines::FrameType::DATA_UNIT); /// Helper to write end of voice frame data. void writeRF_EndOfVoice(); diff --git a/src/host/setup/HostSetup.cpp b/src/host/setup/HostSetup.cpp index 976f97cb..a9c6b9a3 100644 --- a/src/host/setup/HostSetup.cpp +++ b/src/host/setup/HostSetup.cpp @@ -10,7 +10,7 @@ * * Copyright (C) 2015,2016,2017 Jonathan Naylor, G4KLX * Copyright (C) 2017,2018 Andy Uribe, CA6JAU -* Copyright (C) 2021-2023 Bryan Biedenkapp, N2PLL +* Copyright (C) 2021-2024 Bryan Biedenkapp, N2PLL * */ #include "common/dmr/DMRDefines.h" @@ -331,7 +331,7 @@ bool HostSetup::portModemHandler(Modem* modem, uint32_t ms, RESP_TYPE_DVM rspTyp m_queue.peek(&dataLen, 1U); if (!m_queue.isEmpty() && m_modem->m_p25Space >= dataLen) { - uint8_t data[p25::P25_LDU_FRAME_LENGTH_BYTES + 2U]; + uint8_t data[p25::defines::P25_LDU_FRAME_LENGTH_BYTES + 2U]; dataLen = 0U; m_queue.get(&dataLen, 1U); @@ -508,10 +508,10 @@ bool HostSetup::portModemHandler(Modem* modem, uint32_t ms, RESP_TYPE_DVM rspTyp bool dacOverflow = (buffer[5U] & 0x20U) == 0x20U; // spaces from the modem are returned in "logical" frame count, not raw byte size - m_modem->m_dmrSpace1 = buffer[7U] * (dmr::DMR_FRAME_LENGTH_BYTES + 2U); - m_modem->m_dmrSpace2 = buffer[8U] * (dmr::DMR_FRAME_LENGTH_BYTES + 2U); - m_modem->m_p25Space = buffer[10U] * (p25::P25_LDU_FRAME_LENGTH_BYTES); - m_modem->m_nxdnSpace = buffer[11U] * (nxdn::NXDN_FRAME_LENGTH_BYTES); + m_modem->m_dmrSpace1 = buffer[7U] * (dmr::defines::DMR_FRAME_LENGTH_BYTES + 2U); + m_modem->m_dmrSpace2 = buffer[8U] * (dmr::defines::DMR_FRAME_LENGTH_BYTES + 2U); + m_modem->m_p25Space = buffer[10U] * (p25::defines::P25_PDU_FRAME_LENGTH_BYTES); + m_modem->m_nxdnSpace = buffer[11U] * (nxdn::defines::NXDN_FRAME_LENGTH_BYTES); if (m_hasFetchedStatus && m_requestedStatus) { LogMessage(LOG_CAL, "Diagnostic Values [Modem State: %u, Transmitting: %d, ADC Overflow: %d, Rx Overflow: %d, Tx Overflow: %d, DAC Overflow: %d, HS: %u]", @@ -1111,6 +1111,7 @@ void HostSetup::processDMR1KBER(const uint8_t* buffer, uint8_t seq) /// Buffer containing P25 data void HostSetup::processP25BER(const uint8_t* buffer) { + using namespace p25::defines; using namespace p25; uint8_t sync[P25_SYNC_LENGTH_BYTES]; @@ -1125,14 +1126,14 @@ void HostSetup::processP25BER(const uint8_t* buffer) uint8_t nid[P25_NID_LENGTH_BYTES]; P25Utils::decode(buffer, nid, 48U, 114U); - uint8_t duid = nid[1U] & 0x0FU; + DUID::E duid = (DUID::E)(nid[1U] & 0x0FU); uint32_t errs = 0U; uint8_t imbe[18U]; lc::LC lc = lc::LC(); data::DataHeader dataHeader = data::DataHeader(); - if (duid == P25_DUID_HDU) { + if (duid == DUID::HDU) { timerStart(); bool ret = lc.decodeHDU(buffer); @@ -1150,7 +1151,7 @@ void HostSetup::processP25BER(const uint8_t* buffer) m_berUndecodableLC = 0U; m_berUncorrectable = 0U; } - else if (duid == P25_DUID_TDU) { + else if (duid == DUID::TDU) { if (m_berFrames != 0U) { LogMessage(LOG_CAL, P25_TDU_STR ", total frames: %d, bits: %d, uncorrectable frames: %d, undecodable LC: %d, errors: %d, BER: %.4f%%", m_berFrames, m_berBits, m_berUncorrectable, m_berUndecodableLC, m_berErrs, float(m_berErrs * 100U) / float(m_berBits)); } @@ -1168,7 +1169,7 @@ void HostSetup::processP25BER(const uint8_t* buffer) m_berUncorrectable = 0U; return; } - else if (duid == P25_DUID_LDU1) { + else if (duid == DUID::LDU1) { timerStart(); bool ret = lc.decodeLDU1(buffer); @@ -1223,7 +1224,7 @@ void HostSetup::processP25BER(const uint8_t* buffer) m_berErrs += errs; m_berFrames++; } - else if (duid == P25_DUID_LDU2) { + else if (duid == DUID::LDU2) { timerStart(); bool ret = lc.decodeLDU2(buffer); @@ -1278,7 +1279,7 @@ void HostSetup::processP25BER(const uint8_t* buffer) m_berErrs += errs; m_berFrames++; } - else if (duid == P25_DUID_PDU) { + else if (duid == DUID::PDU) { timerStop(); // note: for the calibrator we will only process the PDU header -- and not the PDU data @@ -1308,7 +1309,7 @@ void HostSetup::processP25BER(const uint8_t* buffer) delete[] rfPDU; } - else if (duid == P25_DUID_TSDU) { + else if (duid == DUID::TSDU) { timerStop(); std::unique_ptr tsbk = lc::tsbk::TSBKFactory::createTSBK(buffer); @@ -1332,16 +1333,17 @@ void HostSetup::processP25BER(const uint8_t* buffer) /// Buffer containing P25 data void HostSetup::processP251KBER(const uint8_t* buffer) { + using namespace p25::defines; using namespace p25; uint8_t nid[P25_NID_LENGTH_BYTES]; P25Utils::decode(buffer, nid, 48U, 114U); - uint8_t duid = nid[1U] & 0x0FU; + DUID::E duid = (DUID::E)(nid[1U] & 0x0FU); uint32_t errs = 0U; lc::LC lc = lc::LC(); - if (duid == P25_DUID_HDU) { + if (duid == DUID::HDU) { timerStart(); bool ret = lc.decodeHDU(buffer); @@ -1359,7 +1361,7 @@ void HostSetup::processP251KBER(const uint8_t* buffer) m_berUndecodableLC = 0U; m_berUncorrectable = 0U; } - else if (duid == P25_DUID_TDU) { + else if (duid == DUID::TDU) { if (m_berFrames != 0U) { LogMessage(LOG_CAL, P25_TDU_STR ", total frames: %d, bits: %d, uncorrectable frames: %d, undecodable LC: %d, errors: %d, BER: %.4f%%", m_berFrames, m_berBits, m_berUncorrectable, m_berUndecodableLC, m_berErrs, float(m_berErrs * 100U) / float(m_berBits)); } @@ -1377,7 +1379,7 @@ void HostSetup::processP251KBER(const uint8_t* buffer) m_berUncorrectable = 0U; return; } - else if (duid == P25_DUID_LDU1) { + else if (duid == DUID::LDU1) { timerStart(); bool ret = lc.decodeLDU1(buffer); @@ -1408,7 +1410,7 @@ void HostSetup::processP251KBER(const uint8_t* buffer) m_berErrs += errs; m_berFrames++; } - else if (duid == P25_DUID_LDU2) { + else if (duid == DUID::LDU2) { timerStart(); bool ret = lc.decodeLDU2(buffer); @@ -1447,6 +1449,7 @@ void HostSetup::processP251KBER(const uint8_t* buffer) /// Buffer containing NXDN data void HostSetup::processNXDNBER(const uint8_t* buffer) { + using namespace nxdn::defines; using namespace nxdn; uint8_t data[NXDN_FRAME_LENGTH_BYTES]; @@ -1457,10 +1460,10 @@ void HostSetup::processNXDNBER(const uint8_t* buffer) bool valid = lich.decode(data); if (valid) { - uint8_t usc = lich.getFCT(); - uint8_t opt = lich.getOption(); + FuncChannelType::E usc = lich.getFCT(); + ChOption::E opt = lich.getOption(); - if (usc == NXDN_LICH_USC_SACCH_NS) { + if (usc == FuncChannelType::USC_SACCH_NS) { if (m_berFrames == 0U) { LogMessage(LOG_CAL, "NXDN VCALL (Voice Call), BER Start"); @@ -1482,7 +1485,7 @@ void HostSetup::processNXDNBER(const uint8_t* buffer) m_berFrames = 0U; return; } - } else if (opt == NXDN_LICH_STEAL_NONE) { + } else if (opt == ChOption::STEAL_NONE) { timerStart(); uint32_t errors = 0U; diff --git a/src/host/setup/SetupApplication.h b/src/host/setup/SetupApplication.h index 3939a298..86b10fe9 100644 --- a/src/host/setup/SetupApplication.h +++ b/src/host/setup/SetupApplication.h @@ -7,7 +7,7 @@ * @package DVM / Modem Host Software * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2023 Bryan Biedenkapp, N2PLL +* Copyright (C) 2023,2024 Bryan Biedenkapp, N2PLL * */ #if !defined(__SETUP_APPLICATION_H__) @@ -45,25 +45,26 @@ protected: /// void processExternalUserEvent() override { + using namespace p25::defines; if (m_setup->m_isConnected) { - if (m_setup->m_p25TduTest && m_setup->m_queue.hasSpace(p25::P25_TDU_FRAME_LENGTH_BYTES + 2U)) { - uint8_t data[p25::P25_TDU_FRAME_LENGTH_BYTES + 2U]; - ::memset(data + 2U, 0x00U, p25::P25_TDU_FRAME_LENGTH_BYTES); + if (m_setup->m_p25TduTest && m_setup->m_queue.hasSpace(P25_TDU_FRAME_LENGTH_BYTES + 2U)) { + uint8_t data[P25_TDU_FRAME_LENGTH_BYTES + 2U]; + ::memset(data + 2U, 0x00U, P25_TDU_FRAME_LENGTH_BYTES); // Generate Sync p25::Sync::addP25Sync(data + 2U); // Generate NID std::unique_ptr nid = std::make_unique(1U); - nid->encode(data + 2U, p25::P25_DUID_TDU); + nid->encode(data + 2U, DUID::TDU); // Add busy bits - p25::P25Utils::addBusyBits(data + 2U, p25::P25_TDU_FRAME_LENGTH_BITS, true, true); + p25::P25Utils::addBusyBits(data + 2U, P25_TDU_FRAME_LENGTH_BITS, true, true); data[0U] = modem::TAG_EOT; data[1U] = 0x00U; - m_setup->addFrame(data, p25::P25_TDU_FRAME_LENGTH_BYTES + 2U, p25::P25_LDU_FRAME_LENGTH_BYTES); + m_setup->addFrame(data, P25_TDU_FRAME_LENGTH_BYTES + 2U, P25_LDU_FRAME_LENGTH_BYTES); } // ------------------------------------------------------ diff --git a/src/host/setup/SiteParamSetWnd.h b/src/host/setup/SiteParamSetWnd.h index a6d16009..3d20b6c6 100644 --- a/src/host/setup/SiteParamSetWnd.h +++ b/src/host/setup/SiteParamSetWnd.h @@ -7,7 +7,7 @@ * @package DVM / Modem Host Software * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * -* Copyright (C) 2023 Bryan Biedenkapp, N2PLL +* Copyright (C) 2023,2024 Bryan Biedenkapp, N2PLL * */ #if !defined(__SITE_PARAM_SET_WND_H__) @@ -180,7 +180,7 @@ private: m_dmrNetId.setInputFilter("[[:xdigit:]]"); m_dmrNetId.addCallback("changed", [&]() { uint32_t id = (uint32_t)::strtoul(std::string(m_dmrNetId.getText().toString()).c_str(), NULL, 16); - id = dmr::DMRUtils::netId(id, dmr::SITE_MODEL_TINY); + id = dmr::DMRUtils::netId(id, dmr::defines::SiteModel::TINY); m_setup->m_conf["system"]["config"]["dmrNetId"] = __INT_HEX_STR(id); });