From e512fd388f50c975eb38aecad8aa23f75b9a3c3e Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Wed, 19 Jun 2024 12:18:23 -0400 Subject: [PATCH] add FSC frame classes; --- src/dfsi/CMakeLists.txt | 2 + src/dfsi/frames/BlockHeader.cpp | 2 +- src/dfsi/frames/ControlOctet.cpp | 2 +- src/dfsi/frames/FrameDefines.h | 67 +++++++++++++ src/dfsi/frames/Frames.h | 9 ++ src/dfsi/frames/FullRateVoice.cpp | 2 +- src/dfsi/frames/MotFullRateVoice.cpp | 2 +- src/dfsi/frames/MotStartOfStream.cpp | 2 +- src/dfsi/frames/MotStartVoiceFrame.cpp | 2 +- src/dfsi/frames/MotVoiceHeader1.cpp | 2 +- src/dfsi/frames/MotVoiceHeader2.cpp | 2 +- src/dfsi/frames/StartOfStream.cpp | 2 +- src/dfsi/frames/fsc/FSCACK.cpp | 107 +++++++++++++++++++++ src/dfsi/frames/fsc/FSCACK.h | 67 +++++++++++++ src/dfsi/frames/fsc/FSCConnect.cpp | 86 +++++++++++++++++ src/dfsi/frames/fsc/FSCConnect.h | 63 ++++++++++++ src/dfsi/frames/fsc/FSCConnectResponse.cpp | 74 ++++++++++++++ src/dfsi/frames/fsc/FSCConnectResponse.h | 57 +++++++++++ src/dfsi/frames/fsc/FSCDisconnect.cpp | 45 +++++++++ src/dfsi/frames/fsc/FSCDisconnect.h | 48 +++++++++ src/dfsi/frames/fsc/FSCHeartbeat.cpp | 45 +++++++++ src/dfsi/frames/fsc/FSCHeartbeat.h | 48 +++++++++ src/dfsi/frames/fsc/FSCMessage.cpp | 84 ++++++++++++++++ src/dfsi/frames/fsc/FSCMessage.h | 60 ++++++++++++ src/dfsi/frames/fsc/FSCResponse.cpp | 72 ++++++++++++++ src/dfsi/frames/fsc/FSCResponse.h | 56 +++++++++++ 26 files changed, 999 insertions(+), 9 deletions(-) create mode 100644 src/dfsi/frames/fsc/FSCACK.cpp create mode 100644 src/dfsi/frames/fsc/FSCACK.h create mode 100644 src/dfsi/frames/fsc/FSCConnect.cpp create mode 100644 src/dfsi/frames/fsc/FSCConnect.h create mode 100644 src/dfsi/frames/fsc/FSCConnectResponse.cpp create mode 100644 src/dfsi/frames/fsc/FSCConnectResponse.h create mode 100644 src/dfsi/frames/fsc/FSCDisconnect.cpp create mode 100644 src/dfsi/frames/fsc/FSCDisconnect.h create mode 100644 src/dfsi/frames/fsc/FSCHeartbeat.cpp create mode 100644 src/dfsi/frames/fsc/FSCHeartbeat.h create mode 100644 src/dfsi/frames/fsc/FSCMessage.cpp create mode 100644 src/dfsi/frames/fsc/FSCMessage.h create mode 100644 src/dfsi/frames/fsc/FSCResponse.cpp create mode 100644 src/dfsi/frames/fsc/FSCResponse.h diff --git a/src/dfsi/CMakeLists.txt b/src/dfsi/CMakeLists.txt index 98e05cc6..9e7d262d 100644 --- a/src/dfsi/CMakeLists.txt +++ b/src/dfsi/CMakeLists.txt @@ -24,6 +24,8 @@ file(GLOB dvmdfsi_SRC # DFSI Data Frames "src/dfsi/frames/*.h" "src/dfsi/frames/*.cpp" + "src/dfsi/frames/fsc/*.h" + "src/dfsi/frames/fsc/*.cpp" # Core "src/dfsi/*.h" diff --git a/src/dfsi/frames/BlockHeader.cpp b/src/dfsi/frames/BlockHeader.cpp index 47a557b8..313a0d2b 100644 --- a/src/dfsi/frames/BlockHeader.cpp +++ b/src/dfsi/frames/BlockHeader.cpp @@ -21,7 +21,7 @@ #include using namespace p25; -using namespace dfsi; +using namespace p25::dfsi; // --------------------------------------------------------------------------- // Public Class Members diff --git a/src/dfsi/frames/ControlOctet.cpp b/src/dfsi/frames/ControlOctet.cpp index b93fcc78..e3337152 100644 --- a/src/dfsi/frames/ControlOctet.cpp +++ b/src/dfsi/frames/ControlOctet.cpp @@ -21,7 +21,7 @@ #include using namespace p25; -using namespace dfsi; +using namespace p25::dfsi; // --------------------------------------------------------------------------- // Public Class Members diff --git a/src/dfsi/frames/FrameDefines.h b/src/dfsi/frames/FrameDefines.h index f9e56a40..ba36afbe 100644 --- a/src/dfsi/frames/FrameDefines.h +++ b/src/dfsi/frames/FrameDefines.h @@ -25,6 +25,73 @@ namespace p25 // Constants // --------------------------------------------------------------------------- + /// + /// 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, + }; + + /// + /// 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 + }; + /// /// DFSI Block Types /// diff --git a/src/dfsi/frames/Frames.h b/src/dfsi/frames/Frames.h index 33a98d1a..f9ba0c8c 100644 --- a/src/dfsi/frames/Frames.h +++ b/src/dfsi/frames/Frames.h @@ -30,4 +30,13 @@ #include "frames/MotVoiceHeader1.h" #include "frames/MotVoiceHeader2.h" +// FSC +#include "frames/fsc/FSCMessage.h" +#include "frames/fsc/FSCResponse.h" +#include "frames/fsc/FSCACK.h" +#include "frames/fsc/FSCConnect.h" +#include "frames/fsc/FSCConnectResponse.h" +#include "frames/fsc/FSCDisconnect.h" +#include "frames/fsc/FSCHeartbeat.h" + #endif // __DFSI_FRAMES_H__ \ No newline at end of file diff --git a/src/dfsi/frames/FullRateVoice.cpp b/src/dfsi/frames/FullRateVoice.cpp index ef3d53c0..81f21f6f 100644 --- a/src/dfsi/frames/FullRateVoice.cpp +++ b/src/dfsi/frames/FullRateVoice.cpp @@ -21,7 +21,7 @@ #include using namespace p25; -using namespace dfsi; +using namespace p25::dfsi; // --------------------------------------------------------------------------- // Public Class Members diff --git a/src/dfsi/frames/MotFullRateVoice.cpp b/src/dfsi/frames/MotFullRateVoice.cpp index 4671c546..a3d29c27 100644 --- a/src/dfsi/frames/MotFullRateVoice.cpp +++ b/src/dfsi/frames/MotFullRateVoice.cpp @@ -22,7 +22,7 @@ #include using namespace p25; -using namespace dfsi; +using namespace p25::dfsi; // --------------------------------------------------------------------------- // Public Class Members diff --git a/src/dfsi/frames/MotStartOfStream.cpp b/src/dfsi/frames/MotStartOfStream.cpp index 8971f076..317a3e14 100644 --- a/src/dfsi/frames/MotStartOfStream.cpp +++ b/src/dfsi/frames/MotStartOfStream.cpp @@ -22,7 +22,7 @@ #include using namespace p25; -using namespace dfsi; +using namespace p25::dfsi; // --------------------------------------------------------------------------- // Public Class Members diff --git a/src/dfsi/frames/MotStartVoiceFrame.cpp b/src/dfsi/frames/MotStartVoiceFrame.cpp index 7f641687..c4a1afb4 100644 --- a/src/dfsi/frames/MotStartVoiceFrame.cpp +++ b/src/dfsi/frames/MotStartVoiceFrame.cpp @@ -22,7 +22,7 @@ #include using namespace p25; -using namespace dfsi; +using namespace p25::dfsi; // --------------------------------------------------------------------------- // Public Class Members diff --git a/src/dfsi/frames/MotVoiceHeader1.cpp b/src/dfsi/frames/MotVoiceHeader1.cpp index 261011d3..048c140c 100644 --- a/src/dfsi/frames/MotVoiceHeader1.cpp +++ b/src/dfsi/frames/MotVoiceHeader1.cpp @@ -22,7 +22,7 @@ #include using namespace p25; -using namespace dfsi; +using namespace p25::dfsi; // --------------------------------------------------------------------------- // Public Class Members diff --git a/src/dfsi/frames/MotVoiceHeader2.cpp b/src/dfsi/frames/MotVoiceHeader2.cpp index 5dafc009..75677972 100644 --- a/src/dfsi/frames/MotVoiceHeader2.cpp +++ b/src/dfsi/frames/MotVoiceHeader2.cpp @@ -22,7 +22,7 @@ #include using namespace p25; -using namespace dfsi; +using namespace p25::dfsi; // --------------------------------------------------------------------------- // Public Class Members diff --git a/src/dfsi/frames/StartOfStream.cpp b/src/dfsi/frames/StartOfStream.cpp index 14bc98fd..005052f3 100644 --- a/src/dfsi/frames/StartOfStream.cpp +++ b/src/dfsi/frames/StartOfStream.cpp @@ -21,7 +21,7 @@ #include using namespace p25; -using namespace dfsi; +using namespace p25::dfsi; // --------------------------------------------------------------------------- // Public Class Members diff --git a/src/dfsi/frames/fsc/FSCACK.cpp b/src/dfsi/frames/fsc/FSCACK.cpp new file mode 100644 index 00000000..d64405e3 --- /dev/null +++ b/src/dfsi/frames/fsc/FSCACK.cpp @@ -0,0 +1,107 @@ +// SPDX-License-Identifier: GPL-2.0-only +/** +* Digital Voice Modem - DFSI Peer Application +* GPLv2 Open Source. Use is subject to license terms. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* @package DVM / DFSI Peer Application +* @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) +* @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) +* +* Copyright (C) 2024 Bryan Biedenkapp, N2PLL +* +*/ + +#include "frames/fsc/FSCACK.h" +#include "common/p25/dfsi/DFSIDefines.h" +#include "common/Utils.h" +#include "common/Log.h" + +#include +#include + +using namespace p25::dfsi; +using namespace p25::dfsi::fsc; + +// --------------------------------------------------------------------------- +// Public Class Members +// --------------------------------------------------------------------------- + +/// +/// Initializes a instance of the FSCACK class. +/// +FSCACK::FSCACK() : FSCMessage(), + m_ackMessageId(FSC_INVALID), + m_ackVersion(1U), + m_ackCorrelationTag(0U), + m_responseCode(CONTROL_ACK), + m_respLength(0U) +{ + m_messageId = FSC_ACK; +} + +/// +/// Initializes a instance of the FSCACK class. +/// +/// +FSCACK::FSCACK(uint8_t* data) : FSCMessage(data), + m_ackMessageId(FSC_INVALID), + m_ackVersion(1U), + m_ackCorrelationTag(0U), + m_responseCode(CONTROL_ACK), + m_respLength(0U) +{ + decode(data); +} + +/// +/// Decode a FSC ACK frame. +/// +/// +/// +bool FSCACK::decode(const uint8_t* data) +{ + assert(data != nullptr); + FSCMessage::decode(data); + + m_ackMessageId = (FSCMessageType)(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_respLength = data[6U]; // Response Data Length + + if (m_respLength > 0) { + if (responseData != nullptr) + delete responseData; + responseData = new uint8_t[m_respLength]; + ::memset(responseData, 0x00U, m_respLength); + ::memcpy(responseData, data, m_respLength); + } + else { + if (responseData != nullptr) + delete responseData; + responseData = nullptr; + } + + return true; +} + +/// +/// Encode a FSC ACK frame. +/// +/// +void FSCACK::encode(uint8_t* data) +{ + assert(data != nullptr); + FSCMessage::encode(data); + + data[2U] = (uint8_t)(m_ackMessageId); // Ack Message ID + data[3U] = m_ackVersion; // Ack Message Version + data[4U] = m_ackCorrelationTag; // Ack Message Correlation Tag + data[5U] = (uint8_t)(m_responseCode); // Response Code + data[6U] = m_respLength; // Response Data Length + + if (m_respLength > 0U && responseData != nullptr) { + ::memcpy(data, responseData, m_respLength); + } +} diff --git a/src/dfsi/frames/fsc/FSCACK.h b/src/dfsi/frames/fsc/FSCACK.h new file mode 100644 index 00000000..f3f963cf --- /dev/null +++ b/src/dfsi/frames/fsc/FSCACK.h @@ -0,0 +1,67 @@ +// SPDX-License-Identifier: GPL-2.0-only +/** +* Digital Voice Modem - DFSI Peer Application +* GPLv2 Open Source. Use is subject to license terms. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* @package DVM / DFSI Peer Application +* @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) +* @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) +* +* Copyright (C) 2024 Bryan Biedenkapp, N2PLL +* +*/ +#if !defined(__FSC_ACK_H__) +#define __FSC_ACK_H__ + +#include "Defines.h" +#include "common/Defines.h" +#include "common/Log.h" +#include "common/Utils.h" +#include "frames/FrameDefines.h" +#include "frames/fsc/FSCMessage.h" + +namespace p25 +{ + namespace dfsi + { + namespace fsc + { + // --------------------------------------------------------------------------- + // Class Declaration + // + // --------------------------------------------------------------------------- + + class HOST_SW_API FSCACK : public FSCMessage { + public: + static const uint8_t LENGTH = 6; + + /// Initializes a copy instance of the FSCACK class. + FSCACK(); + /// Initializes a copy instance of the FSCACK class. + FSCACK(uint8_t* data); + + /// Decode a FSC ACK frame. + bool decode(const uint8_t* data) override; + /// Encode a FSC ACK frame. + void encode(uint8_t* data) override; + + public: + uint8_t* responseData; // ?? - this should probably be private with getters/setters + + /// Acknowledged Message ID. + __PROPERTY(FSCMessageType, ackMessageId, AckMessageId); + /// Acknowledged Message Version. + __READONLY_PROPERTY(uint8_t, ackVersion, AckVersion); + /// + __READONLY_PROPERTY(uint8_t, ackCorrelationTag, AckCorrelationTag); + /// Response code. + __PROPERTY(FSCAckResponseCode, responseCode, ResponseCode); + /// Response Data Length. + __PROPERTY(uint8_t, respLength, ResponseLength); + }; + } // namespace fsc + } // namespace dfsi +} // namespace p25 + +#endif // __FSC_ACK_H__ \ No newline at end of file diff --git a/src/dfsi/frames/fsc/FSCConnect.cpp b/src/dfsi/frames/fsc/FSCConnect.cpp new file mode 100644 index 00000000..e9dbd74f --- /dev/null +++ b/src/dfsi/frames/fsc/FSCConnect.cpp @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: GPL-2.0-only +/** +* Digital Voice Modem - DFSI Peer Application +* GPLv2 Open Source. Use is subject to license terms. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* @package DVM / DFSI Peer Application +* @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) +* @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) +* +* Copyright (C) 2024 Bryan Biedenkapp, N2PLL +* +*/ + +#include "frames/fsc/FSCConnect.h" +#include "common/p25/dfsi/DFSIDefines.h" +#include "common/Utils.h" +#include "common/Log.h" + +#include +#include + +using namespace p25::dfsi; +using namespace p25::dfsi::fsc; + +// --------------------------------------------------------------------------- +// Public Class Members +// --------------------------------------------------------------------------- + +/// +/// Initializes a instance of the FSCConnect class. +/// +FSCConnect::FSCConnect() : FSCMessage(), + m_vcBasePort(0U), + m_vcSSRC(0U), + m_fsHeartbeatPeriod(5U), + m_hostHeartbeatPeriod(5U) +{ + m_messageId = FSC_CONNECT; +} + +/// +/// Initializes a instance of the FSCConnect class. +/// +/// +FSCConnect::FSCConnect(uint8_t* data) : FSCMessage(data), + m_vcBasePort(0U), + m_vcSSRC(0U), + m_fsHeartbeatPeriod(5U), + m_hostHeartbeatPeriod(5U) +{ + decode(data); +} + +/// +/// Decode a FSC connect frame. +/// +/// +/// +bool FSCConnect::decode(const uint8_t* data) +{ + assert(data != nullptr); + FSCMessage::decode(data); + + m_vcBasePort = __GET_UINT16B(data, 3U); // Voice Conveyance RTP Port + m_vcSSRC = __GET_UINT32(data, 5U); // Voice Conveyance SSRC + m_fsHeartbeatPeriod = data[9U]; // Fixed Station Heartbeat Period + m_hostHeartbeatPeriod = data[10U]; // Host Heartbeat Period + + return true; +} + +/// +/// Encode a FSC connect frame. +/// +/// +void FSCConnect::encode(uint8_t* data) +{ + assert(data != nullptr); + FSCMessage::encode(data); + + __SET_UINT16B(m_vcBasePort, data, 3U); // Voice Conveyance RTP Port + __SET_UINT32(m_vcSSRC, data, 5U); // Voice Conveyance SSRC + data[9U] = m_fsHeartbeatPeriod; // Fixed Station Heartbeat Period + data[10U] = m_hostHeartbeatPeriod; // Host Heartbeat Period +} diff --git a/src/dfsi/frames/fsc/FSCConnect.h b/src/dfsi/frames/fsc/FSCConnect.h new file mode 100644 index 00000000..76c9757c --- /dev/null +++ b/src/dfsi/frames/fsc/FSCConnect.h @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: GPL-2.0-only +/** +* Digital Voice Modem - DFSI Peer Application +* GPLv2 Open Source. Use is subject to license terms. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* @package DVM / DFSI Peer Application +* @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) +* @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) +* +* Copyright (C) 2024 Bryan Biedenkapp, N2PLL +* +*/ +#if !defined(__FSC_CONNECT_H__) +#define __FSC_CONNECT_H__ + +#include "Defines.h" +#include "common/Defines.h" +#include "common/Log.h" +#include "common/Utils.h" +#include "frames/FrameDefines.h" +#include "frames/fsc/FSCMessage.h" + +namespace p25 +{ + namespace dfsi + { + namespace fsc + { + // --------------------------------------------------------------------------- + // Class Declaration + // + // --------------------------------------------------------------------------- + + class HOST_SW_API FSCConnect : public FSCMessage { + public: + static const uint8_t LENGTH = 11; + + /// Initializes a copy instance of the FSCConnect class. + FSCConnect(); + /// Initializes a copy instance of the FSCConnect class. + FSCConnect(uint8_t* data); + + /// Decode a FSC connect frame. + bool decode(const uint8_t* data) override; + /// Encode a FSC connect frame. + void encode(uint8_t* data) override; + + public: + /// Voice Conveyance RTP Port. + __PROPERTY(uint16_t, vcBasePort, VCBasePort); + /// SSRC Identifier for all RTP transmissions. + __PROPERTY(uint32_t, vcSSRC, VCSSRC); + /// Fixed Station Heartbeat Period. + __PROPERTY(uint8_t, fsHeartbeatPeriod, FSHeartbeatPeriod); + /// Host Heartbeat Period. + __PROPERTY(uint8_t, hostHeartbeatPeriod, HostHeartbeatPeriod); + }; + } // namespace fsc + } // namespace dfsi +} // namespace p25 + +#endif // __FSC_CONNECT_H__ \ No newline at end of file diff --git a/src/dfsi/frames/fsc/FSCConnectResponse.cpp b/src/dfsi/frames/fsc/FSCConnectResponse.cpp new file mode 100644 index 00000000..68f0dd56 --- /dev/null +++ b/src/dfsi/frames/fsc/FSCConnectResponse.cpp @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: GPL-2.0-only +/** +* Digital Voice Modem - DFSI Peer Application +* GPLv2 Open Source. Use is subject to license terms. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* @package DVM / DFSI Peer Application +* @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) +* @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) +* +* Copyright (C) 2024 Bryan Biedenkapp, N2PLL +* +*/ + +#include "frames/fsc/FSCConnectResponse.h" +#include "common/p25/dfsi/DFSIDefines.h" +#include "common/Utils.h" +#include "common/Log.h" + +#include +#include + +using namespace p25::dfsi; +using namespace p25::dfsi::fsc; + +// --------------------------------------------------------------------------- +// Public Class Members +// --------------------------------------------------------------------------- + +/// +/// Initializes a instance of the FSCConnectResponse class. +/// +FSCConnectResponse::FSCConnectResponse() : FSCResponse(), + m_vcBasePort(0U) +{ + /* stub */ +} + +/// +/// Initializes a instance of the FSCConnectResponse class. +/// +/// +FSCConnectResponse::FSCConnectResponse(uint8_t* data) : FSCResponse(data), + m_vcBasePort(0U) +{ + decode(data); +} + +/// +/// Decode a FSC connect frame. +/// +/// +/// +bool FSCConnectResponse::decode(const uint8_t* data) +{ + assert(data != nullptr); + FSCResponse::decode(data); + + m_vcBasePort = __GET_UINT16B(data, 1U); // Voice Conveyance RTP Port + + return true; +} + +/// +/// Encode a FSC connect frame. +/// +/// +void FSCConnectResponse::encode(uint8_t* data) +{ + assert(data != nullptr); + FSCResponse::encode(data); + + __SET_UINT16B(m_vcBasePort, data, 1U); // Voice Conveyance RTP Port +} diff --git a/src/dfsi/frames/fsc/FSCConnectResponse.h b/src/dfsi/frames/fsc/FSCConnectResponse.h new file mode 100644 index 00000000..8a4bda99 --- /dev/null +++ b/src/dfsi/frames/fsc/FSCConnectResponse.h @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: GPL-2.0-only +/** +* Digital Voice Modem - DFSI Peer Application +* GPLv2 Open Source. Use is subject to license terms. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* @package DVM / DFSI Peer Application +* @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) +* @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) +* +* Copyright (C) 2024 Bryan Biedenkapp, N2PLL +* +*/ +#if !defined(__FSC_CONNECT_RESPONSE_H__) +#define __FSC_CONNECT_RESPONSE_H__ + +#include "Defines.h" +#include "common/Defines.h" +#include "common/Log.h" +#include "common/Utils.h" +#include "frames/FrameDefines.h" +#include "frames/fsc/FSCResponse.h" + +namespace p25 +{ + namespace dfsi + { + namespace fsc + { + // --------------------------------------------------------------------------- + // Class Declaration + // + // --------------------------------------------------------------------------- + + class HOST_SW_API FSCConnectResponse : public FSCResponse { + public: + static const uint8_t LENGTH = 3; + + /// Initializes a copy instance of the FSCConnectResponse class. + FSCConnectResponse(); + /// Initializes a copy instance of the FSCConnectResponse class. + FSCConnectResponse(uint8_t* data); + + /// Decode a FSC connect response frame. + bool decode(const uint8_t* data) override; + /// Encode a FSC connect response frame. + void encode(uint8_t* data) override; + + public: + /// Voice Conveyance RTP Port. + __PROPERTY(uint16_t, vcBasePort, VCBasePort); + }; + } // namespace fsc + } // namespace dfsi +} // namespace p25 + +#endif // __FSC_CONNECT_RESPONSE_H__ \ No newline at end of file diff --git a/src/dfsi/frames/fsc/FSCDisconnect.cpp b/src/dfsi/frames/fsc/FSCDisconnect.cpp new file mode 100644 index 00000000..d5ae17bb --- /dev/null +++ b/src/dfsi/frames/fsc/FSCDisconnect.cpp @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: GPL-2.0-only +/** +* Digital Voice Modem - DFSI Peer Application +* GPLv2 Open Source. Use is subject to license terms. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* @package DVM / DFSI Peer Application +* @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) +* @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) +* +* Copyright (C) 2024 Bryan Biedenkapp, N2PLL +* +*/ + +#include "frames/fsc/FSCDisconnect.h" +#include "common/p25/dfsi/DFSIDefines.h" +#include "common/Utils.h" +#include "common/Log.h" + +#include +#include + +using namespace p25::dfsi; +using namespace p25::dfsi::fsc; + +// --------------------------------------------------------------------------- +// Public Class Members +// --------------------------------------------------------------------------- + +/// +/// Initializes a instance of the FSCDisconnect class. +/// +FSCDisconnect::FSCDisconnect() : FSCMessage() +{ + m_messageId = FSC_DISCONNECT; +} + +/// +/// Initializes a instance of the FSCDisconnect class. +/// +/// +FSCDisconnect::FSCDisconnect(uint8_t* data) : FSCMessage(data) +{ + decode(data); +} diff --git a/src/dfsi/frames/fsc/FSCDisconnect.h b/src/dfsi/frames/fsc/FSCDisconnect.h new file mode 100644 index 00000000..e01f00c0 --- /dev/null +++ b/src/dfsi/frames/fsc/FSCDisconnect.h @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: GPL-2.0-only +/** +* Digital Voice Modem - DFSI Peer Application +* GPLv2 Open Source. Use is subject to license terms. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* @package DVM / DFSI Peer Application +* @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) +* @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) +* +* Copyright (C) 2024 Bryan Biedenkapp, N2PLL +* +*/ +#if !defined(__FSC_DISCONNECT_H__) +#define __FSC_DISCONNECT_H__ + +#include "Defines.h" +#include "common/Defines.h" +#include "common/Log.h" +#include "common/Utils.h" +#include "frames/FrameDefines.h" +#include "frames/fsc/FSCMessage.h" + +namespace p25 +{ + namespace dfsi + { + namespace fsc + { + // --------------------------------------------------------------------------- + // Class Declaration + // + // --------------------------------------------------------------------------- + + class HOST_SW_API FSCDisconnect : public FSCMessage { + public: + static const uint8_t LENGTH = 3; + + /// Initializes a copy instance of the FSCDisconnect class. + FSCDisconnect(); + /// Initializes a copy instance of the FSCDisconnect class. + FSCDisconnect(uint8_t* data); + }; + } // namespace fsc + } // namespace dfsi +} // namespace p25 + +#endif // __FSC_DISCONNECT_H__ \ No newline at end of file diff --git a/src/dfsi/frames/fsc/FSCHeartbeat.cpp b/src/dfsi/frames/fsc/FSCHeartbeat.cpp new file mode 100644 index 00000000..840fb0a0 --- /dev/null +++ b/src/dfsi/frames/fsc/FSCHeartbeat.cpp @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: GPL-2.0-only +/** +* Digital Voice Modem - DFSI Peer Application +* GPLv2 Open Source. Use is subject to license terms. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* @package DVM / DFSI Peer Application +* @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) +* @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) +* +* Copyright (C) 2024 Bryan Biedenkapp, N2PLL +* +*/ + +#include "frames/fsc/FSCHeartbeat.h" +#include "common/p25/dfsi/DFSIDefines.h" +#include "common/Utils.h" +#include "common/Log.h" + +#include +#include + +using namespace p25::dfsi; +using namespace p25::dfsi::fsc; + +// --------------------------------------------------------------------------- +// Public Class Members +// --------------------------------------------------------------------------- + +/// +/// Initializes a instance of the FSCHeartbeat class. +/// +FSCHeartbeat::FSCHeartbeat() : FSCMessage() +{ + m_messageId = FSC_HEARTBEAT; +} + +/// +/// Initializes a instance of the FSCHeartbeat class. +/// +/// +FSCHeartbeat::FSCHeartbeat(uint8_t* data) : FSCMessage(data) +{ + decode(data); +} diff --git a/src/dfsi/frames/fsc/FSCHeartbeat.h b/src/dfsi/frames/fsc/FSCHeartbeat.h new file mode 100644 index 00000000..6e63532c --- /dev/null +++ b/src/dfsi/frames/fsc/FSCHeartbeat.h @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: GPL-2.0-only +/** +* Digital Voice Modem - DFSI Peer Application +* GPLv2 Open Source. Use is subject to license terms. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* @package DVM / DFSI Peer Application +* @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) +* @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) +* +* Copyright (C) 2024 Bryan Biedenkapp, N2PLL +* +*/ +#if !defined(__FSC_HEARTBEAT_H__) +#define __FSC_HEARTBEAT_H__ + +#include "Defines.h" +#include "common/Defines.h" +#include "common/Log.h" +#include "common/Utils.h" +#include "frames/FrameDefines.h" +#include "frames/fsc/FSCMessage.h" + +namespace p25 +{ + namespace dfsi + { + namespace fsc + { + // --------------------------------------------------------------------------- + // Class Declaration + // + // --------------------------------------------------------------------------- + + class HOST_SW_API FSCHeartbeat : public FSCMessage { + public: + static const uint8_t LENGTH = 3; + + /// Initializes a copy instance of the FSCHeartbeat class. + FSCHeartbeat(); + /// Initializes a copy instance of the FSCHeartbeat class. + FSCHeartbeat(uint8_t* data); + }; + } // namespace fsc + } // namespace dfsi +} // namespace p25 + +#endif // __FSC_HEARTBEAT_H__ \ No newline at end of file diff --git a/src/dfsi/frames/fsc/FSCMessage.cpp b/src/dfsi/frames/fsc/FSCMessage.cpp new file mode 100644 index 00000000..f486e427 --- /dev/null +++ b/src/dfsi/frames/fsc/FSCMessage.cpp @@ -0,0 +1,84 @@ +// SPDX-License-Identifier: GPL-2.0-only +/** +* Digital Voice Modem - DFSI Peer Application +* GPLv2 Open Source. Use is subject to license terms. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* @package DVM / DFSI Peer Application +* @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) +* @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) +* +* Copyright (C) 2024 Bryan Biedenkapp, N2PLL +* +*/ + +#include "frames/fsc/FSCMessage.h" +#include "common/p25/dfsi/DFSIDefines.h" +#include "common/Utils.h" +#include "common/Log.h" + +#include +#include + +using namespace p25::dfsi; +using namespace p25::dfsi::fsc; + +// --------------------------------------------------------------------------- +// Public Class Members +// --------------------------------------------------------------------------- + +/// +/// Initializes a instance of the FSCMessage class. +/// +FSCMessage::FSCMessage() : + m_messageId(FSC_INVALID), + m_version(1U), + m_correlationTag(0U) +{ + /* stub */ +} + +/// +/// Initializes a instance of the FSCMessage class. +/// +/// +FSCMessage::FSCMessage(uint8_t* data) : + m_messageId(FSC_INVALID), + m_version(1U), + m_correlationTag(0U) +{ + decode(data); +} + +/// +/// Decode a FSC message frame. +/// +/// +/// +bool FSCMessage::decode(const uint8_t* data) +{ + assert(data != nullptr); + + m_messageId = (FSCMessageType)(data[0U]); // Message ID + m_version = data[1U]; // Message Version + + if (m_messageId != FSCMessageType::FSC_HEARTBEAT && m_messageId != FSCMessageType::FSC_ACK) + m_correlationTag = data[2U]; // Message Correlation Tag + + return true; +} + +/// +/// Encode a FSC message frame. +/// +/// +void FSCMessage::encode(uint8_t* data) +{ + assert(data != nullptr); + + data[0U] = (uint8_t)m_messageId; // Message ID + data[1U] = m_version; // Message Version + + if (m_messageId != FSCMessageType::FSC_HEARTBEAT && m_messageId != FSCMessageType::FSC_ACK) + data[2U] = m_correlationTag; // Message Correlation Tag +} diff --git a/src/dfsi/frames/fsc/FSCMessage.h b/src/dfsi/frames/fsc/FSCMessage.h new file mode 100644 index 00000000..0cb07d3d --- /dev/null +++ b/src/dfsi/frames/fsc/FSCMessage.h @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: GPL-2.0-only +/** +* Digital Voice Modem - DFSI Peer Application +* GPLv2 Open Source. Use is subject to license terms. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* @package DVM / DFSI Peer Application +* @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) +* @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) +* +* Copyright (C) 2024 Bryan Biedenkapp, N2PLL +* +*/ +#if !defined(__FSC_MESSAGE_H__) +#define __FSC_MESSAGE_H__ + +#include "Defines.h" +#include "common/Defines.h" +#include "common/Log.h" +#include "common/Utils.h" +#include "frames/FrameDefines.h" + +namespace p25 +{ + namespace dfsi + { + namespace fsc + { + // --------------------------------------------------------------------------- + // Class Declaration + // + // --------------------------------------------------------------------------- + + class HOST_SW_API FSCMessage { + public: + static const uint8_t LENGTH = 3; + + /// Initializes a copy instance of the FSCMessage class. + FSCMessage(); + /// Initializes a copy instance of the FSCMessage class. + FSCMessage(uint8_t* data); + + /// Decode a FSC message frame. + virtual bool decode(const uint8_t* data); + /// Encode a FSC message frame. + virtual void encode(uint8_t* data); + + public: + /// Message ID. + __PROTECTED_PROPERTY(FSCMessageType, messageId, MessageId); + /// Message Version. + __PROTECTED_READONLY_PROPERTY(uint8_t, version, Version); + /// + __PROTECTED_READONLY_PROPERTY(uint8_t, correlationTag, CorrelationTag); + }; + } // namespace fsc + } // namespace dfsi +} // namespace p25 + +#endif // __FSC_MESSAGE_H__ \ No newline at end of file diff --git a/src/dfsi/frames/fsc/FSCResponse.cpp b/src/dfsi/frames/fsc/FSCResponse.cpp new file mode 100644 index 00000000..c578b94a --- /dev/null +++ b/src/dfsi/frames/fsc/FSCResponse.cpp @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: GPL-2.0-only +/** +* Digital Voice Modem - DFSI Peer Application +* GPLv2 Open Source. Use is subject to license terms. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* @package DVM / DFSI Peer Application +* @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) +* @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) +* +* Copyright (C) 2024 Bryan Biedenkapp, N2PLL +* +*/ + +#include "frames/fsc/FSCResponse.h" +#include "common/p25/dfsi/DFSIDefines.h" +#include "common/Utils.h" +#include "common/Log.h" + +#include +#include + +using namespace p25::dfsi; +using namespace p25::dfsi::fsc; + +// --------------------------------------------------------------------------- +// Public Class Members +// --------------------------------------------------------------------------- + +/// +/// Initializes a instance of the FSCResponse class. +/// +FSCResponse::FSCResponse() : + m_version(1U) +{ + /* stub */ +} + +/// +/// Initializes a instance of the FSCResponse class. +/// +/// +FSCResponse::FSCResponse(uint8_t* data) : + m_version(1U) +{ + decode(data); +} + +/// +/// Decode a FSC message frame. +/// +/// +/// +bool FSCResponse::decode(const uint8_t* data) +{ + assert(data != nullptr); + + m_version = data[0U]; // Response Version + + return true; +} + +/// +/// Encode a FSC message frame. +/// +/// +void FSCResponse::encode(uint8_t* data) +{ + assert(data != nullptr); + + data[0U] = m_version; // Response Version +} diff --git a/src/dfsi/frames/fsc/FSCResponse.h b/src/dfsi/frames/fsc/FSCResponse.h new file mode 100644 index 00000000..b324a9f8 --- /dev/null +++ b/src/dfsi/frames/fsc/FSCResponse.h @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: GPL-2.0-only +/** +* Digital Voice Modem - DFSI Peer Application +* GPLv2 Open Source. Use is subject to license terms. +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* @package DVM / DFSI Peer Application +* @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) +* @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) +* +* Copyright (C) 2024 Bryan Biedenkapp, N2PLL +* +*/ +#if !defined(__FSC_RESPONSE_H__) +#define __FSC_RESPONSE_H__ + +#include "Defines.h" +#include "common/Defines.h" +#include "common/Log.h" +#include "common/Utils.h" +#include "frames/FrameDefines.h" + +namespace p25 +{ + namespace dfsi + { + namespace fsc + { + // --------------------------------------------------------------------------- + // Class Declaration + // + // --------------------------------------------------------------------------- + + class HOST_SW_API FSCResponse { + public: + static const uint8_t LENGTH = 1; + + /// Initializes a copy instance of the FSCResponse class. + FSCResponse(); + /// Initializes a copy instance of the FSCResponse class. + FSCResponse(uint8_t* data); + + /// Decode a FSC message frame. + virtual bool decode(const uint8_t* data); + /// Encode a FSC message frame. + virtual void encode(uint8_t* data); + + public: + /// Response Version. + __PROTECTED_READONLY_PROPERTY(uint8_t, version, Version); + }; + } // namespace fsc + } // namespace dfsi +} // namespace p25 + +#endif // __FSC_RESPONSE_H__ \ No newline at end of file