diff --git a/src/dfsi/CMakeLists.txt b/src/dfsi/CMakeLists.txt index 4dc20db5..46601331 100644 --- a/src/dfsi/CMakeLists.txt +++ b/src/dfsi/CMakeLists.txt @@ -24,8 +24,8 @@ file(GLOB dvmdfsi_SRC "src/dfsi/network/*.h" "src/dfsi/network/*.cpp" # DFSI rtp libs - "src/dfsi/rtp/*.h" - "src/dfsi/rtp/*.cpp" + "src/dfsi/frames/*.h" + "src/dfsi/frames/*.cpp" # Core DFSI "src/dfsi/*.h" "src/dfsi/*.cpp" diff --git a/src/dfsi/rtp/RtpDefines.h b/src/dfsi/frames/FrameDefines.h similarity index 90% rename from src/dfsi/rtp/RtpDefines.h rename to src/dfsi/frames/FrameDefines.h index 70f4b235..be9d94f9 100644 --- a/src/dfsi/rtp/RtpDefines.h +++ b/src/dfsi/frames/FrameDefines.h @@ -1,10 +1,10 @@ // SPDX-License-Identifier: GPL-2.0-only /** -* Digital Voice Modem - Common Library +* 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 +* @package DVM / DFSI Peer Application * @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * @@ -12,8 +12,8 @@ * Copyright (C) 2024 Bryan Biedenkapp, N2PLL * */ -#if !defined(__RTP_DEFINES_H__) -#define __RTP_DEFINES_H__ +#if !defined(__FRAME_DEFINES_H__) +#define __FRAME_DEFINES_H__ #include "common/Defines.h" @@ -74,4 +74,4 @@ namespace p25 } // namespace dfsi } // namespace p25 -#endif // __RTP_DEFINES_H__ +#endif // __FRAME_DEFINES_H__ diff --git a/src/dfsi/rtp/RtpFrames.h b/src/dfsi/frames/Frames.h similarity index 51% rename from src/dfsi/rtp/RtpFrames.h rename to src/dfsi/frames/Frames.h index 808595e8..bfca6372 100644 --- a/src/dfsi/rtp/RtpFrames.h +++ b/src/dfsi/frames/Frames.h @@ -1,10 +1,10 @@ // SPDX-License-Identifier: GPL-2.0-only /** -* Digital Voice Modem - Modem Host Software +* 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 +* @package DVM / DFSI Peer Application * @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * @@ -12,15 +12,17 @@ * Copyright (C) 2024 Bryan Biedenkapp, N2PLL * */ -#if !defined(__RTP_FRAMES_H__) -#define __RTP_FRAMES_H__ +#if !defined(__DFSI_FRAMES_H__) +#define __DFSI_FRAMES_H__ #include "Defines.h" -#include "rtp/MotFullRateVoice.h" -#include "rtp/MotStartOfStream.h" -#include "rtp/MotStartVoiceFrame.h" -#include "rtp/MotVoiceHeader1.h" -#include "rtp/MotVoiceHeader2.h" +#include "frames/StartOfStream.h" -#endif // __RTP_FRAMES_H__ \ No newline at end of file +#include "frames/MotFullRateVoice.h" +#include "frames/MotStartOfStream.h" +#include "frames/MotStartVoiceFrame.h" +#include "frames/MotVoiceHeader1.h" +#include "frames/MotVoiceHeader2.h" + +#endif // __DFSI_FRAMES_H__ \ No newline at end of file diff --git a/src/dfsi/rtp/MotFullRateVoice.cpp b/src/dfsi/frames/MotFullRateVoice.cpp similarity index 74% rename from src/dfsi/rtp/MotFullRateVoice.cpp rename to src/dfsi/frames/MotFullRateVoice.cpp index ea5d2350..17a31352 100644 --- a/src/dfsi/rtp/MotFullRateVoice.cpp +++ b/src/dfsi/frames/MotFullRateVoice.cpp @@ -1,10 +1,10 @@ // SPDX-License-Identifier: GPL-2.0-only /** -* Digital Voice Modem - Common Library +* 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 +* @package DVM / DFSI Peer Application * @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * @@ -13,7 +13,7 @@ * */ -#include "rtp/MotFullRateVoice.h" +#include "frames/MotFullRateVoice.h" #include "common/p25/dfsi/DFSIDefines.h" #include "common/Utils.h" #include "common/Log.h" @@ -31,11 +31,12 @@ using namespace dfsi; /// /// Initializes a instance of the MotFullRateVoice class. /// -MotFullRateVoice::MotFullRateVoice() +MotFullRateVoice::MotFullRateVoice() : + imbeData(nullptr), + additionalData(nullptr), + m_frameType(P25_DFSI_LDU1_VOICE1), + m_source(SOURCE_QUANTAR) { - frameType = P25_DFSI_LDU1_VOICE1; - additionalData = nullptr; - source = SOURCE_QUANTAR; imbeData = new uint8_t[IMBE_BUF_LEN]; ::memset(imbeData, 0x00U, IMBE_BUF_LEN); } @@ -54,8 +55,10 @@ MotFullRateVoice::MotFullRateVoice(uint8_t* data) /// MotFullRateVoice::~MotFullRateVoice() { - delete[] imbeData; - delete[] additionalData; + if (imbeData != nullptr) + delete[] imbeData; + if (additionalData != nullptr) + delete[] additionalData; } /// @@ -66,14 +69,14 @@ uint32_t MotFullRateVoice::size() { uint32_t length = 0; - // Set length appropriately based on frame type + // set length appropriately based on frame type if (isVoice1or2or10or11()) { length += SHORTENED_LENGTH; } else { length += LENGTH; } - // These are weird + // these are weird if (isVoice9or18()) { length -= 1; } @@ -91,19 +94,20 @@ bool MotFullRateVoice::decode(const uint8_t* data, bool shortened) { assert(data != nullptr); + if (imbeData != nullptr) + delete imbeData; imbeData = new uint8_t[IMBE_BUF_LEN]; ::memset(imbeData, 0x00U, IMBE_BUF_LEN); - frameType = data[0U]; + m_frameType = data[0U]; if (isVoice2or11()) { shortened = true; } - if (shortened) { ::memcpy(imbeData, data + 1U, IMBE_BUF_LEN); - source = (SourceFlag)data[12U]; + m_source = (SourceFlag)data[12U]; // Forgot to set this originally and left additionalData uninitialized, whoops! additionalData = nullptr; } else { @@ -113,14 +117,16 @@ bool MotFullRateVoice::decode(const uint8_t* data, bool shortened) imbeStart = 4U; } + if (additionalData != nullptr) + delete[] additionalData; additionalData = new uint8_t[ADDITIONAL_LENGTH]; ::memset(additionalData, 0x00U, ADDITIONAL_LENGTH); ::memcpy(additionalData, data + 1U, ADDITIONAL_LENGTH); - // Copy IMBE data based on our imbe start position + // copy IMBE data based on our imbe start position ::memcpy(imbeData, data + imbeStart, IMBE_BUF_LEN); - source = (SourceFlag)data[IMBE_BUF_LEN + imbeStart]; + m_source = (SourceFlag)data[IMBE_BUF_LEN + imbeStart]; } return true; @@ -134,19 +140,20 @@ bool MotFullRateVoice::decode(const uint8_t* data, bool shortened) void MotFullRateVoice::encode(uint8_t* data, bool shortened) { assert(data != nullptr); + assert(imbeData != nullptr); - // Check if we're a shortened frame - data[0U] = frameType; + // check if we're a shortened frame + data[0U] = m_frameType; if (isVoice2or11()) { shortened = true; } - // Copy based on shortened frame or not + // copy based on shortened frame or not if (shortened) { ::memcpy(data + 1U, imbeData, IMBE_BUF_LEN); - data[12U] = (uint8_t)source; + data[12U] = (uint8_t)m_source; } - // If not shortened, our IMBE data start position depends on frame type + // if not shortened, our IMBE data start position depends on frame type else { // Starting index for the IMBE data uint8_t imbeStart = 5U; @@ -163,7 +170,7 @@ void MotFullRateVoice::encode(uint8_t* data, bool shortened) ::memcpy(data + imbeStart, imbeData, IMBE_BUF_LEN); // Source byte at the end - data[11U + imbeStart] = (uint8_t)source; + data[11U + imbeStart] = (uint8_t)m_source; } } @@ -177,7 +184,7 @@ void MotFullRateVoice::encode(uint8_t* data, bool shortened) /// bool MotFullRateVoice::isVoice1or2or10or11() { - if ( (frameType == P25_DFSI_LDU1_VOICE1) || (frameType == P25_DFSI_LDU1_VOICE2) || (frameType == P25_DFSI_LDU2_VOICE10) || (frameType == P25_DFSI_LDU2_VOICE11) ) { + 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) ) { return true; } else { return false; @@ -190,7 +197,7 @@ bool MotFullRateVoice::isVoice1or2or10or11() /// bool MotFullRateVoice::isVoice2or11() { - if ( (frameType == P25_DFSI_LDU1_VOICE2) || (frameType == P25_DFSI_LDU2_VOICE11) ) { + if ( (m_frameType == P25_DFSI_LDU1_VOICE2) || (m_frameType == P25_DFSI_LDU2_VOICE11) ) { return true; } else { return false; @@ -203,7 +210,7 @@ bool MotFullRateVoice::isVoice2or11() /// bool MotFullRateVoice::isVoice9or18() { - if ( (frameType == P25_DFSI_LDU1_VOICE9) || (frameType == P25_DFSI_LDU2_VOICE18) ) { + if ( (m_frameType == P25_DFSI_LDU1_VOICE9) || (m_frameType == P25_DFSI_LDU2_VOICE18) ) { return true; } else { return false; diff --git a/src/dfsi/rtp/MotFullRateVoice.h b/src/dfsi/frames/MotFullRateVoice.h similarity index 85% rename from src/dfsi/rtp/MotFullRateVoice.h rename to src/dfsi/frames/MotFullRateVoice.h index 2ce453da..2d7bc928 100644 --- a/src/dfsi/rtp/MotFullRateVoice.h +++ b/src/dfsi/frames/MotFullRateVoice.h @@ -1,10 +1,10 @@ // SPDX-License-Identifier: GPL-2.0-only /** -* Digital Voice Modem - Common Library +* 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 +* @package DVM / DFSI Peer Application * @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * @@ -19,7 +19,7 @@ #include "common/Defines.h" #include "common/Log.h" #include "common/Utils.h" -#include "rtp/RtpDefines.h" +#include "frames/FrameDefines.h" namespace p25 { @@ -52,11 +52,6 @@ namespace p25 static const uint8_t ADDITIONAL_LENGTH = 4; static const uint8_t IMBE_BUF_LEN = 11; - uint8_t frameType; - uint8_t* imbeData; - uint8_t* additionalData; - SourceFlag source; - /// Initializes a copy instance of the MotFullRateVoice class. MotFullRateVoice(); /// Initializes a copy instance of the MotFullRateVoice class. @@ -70,7 +65,16 @@ namespace p25 bool decode(const uint8_t* data, bool shortened = false); /// Encode a full rate voice frame. void encode(uint8_t* data, bool shortened = false); - + + public: + uint8_t* imbeData; // ?? - this should probably be private with getters/setters + uint8_t* additionalData; // ?? - this should probably be private with getters/setters + + /// + __PROPERTY(uint8_t, frameType, FrameType); + /// + __PROPERTY(uint8_t, source, Source); + private: /// bool isVoice1or2or10or11(); diff --git a/src/dfsi/rtp/MotStartOfStream.cpp b/src/dfsi/frames/MotStartOfStream.cpp similarity index 75% rename from src/dfsi/rtp/MotStartOfStream.cpp rename to src/dfsi/frames/MotStartOfStream.cpp index ee79ad68..aa992d74 100644 --- a/src/dfsi/rtp/MotStartOfStream.cpp +++ b/src/dfsi/frames/MotStartOfStream.cpp @@ -1,10 +1,10 @@ // SPDX-License-Identifier: GPL-2.0-only /** -* Digital Voice Modem - Common Library +* 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 +* @package DVM / DFSI Peer Application * @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * @@ -13,7 +13,7 @@ * */ -#include "rtp/MotStartOfStream.h" +#include "frames/MotStartOfStream.h" #include "common/p25/dfsi/DFSIDefines.h" #include "common/Utils.h" #include "common/Log.h" @@ -31,11 +31,13 @@ using namespace dfsi; /// /// Initializes a instance of the MotStartOfStream class. /// -MotStartOfStream::MotStartOfStream() +MotStartOfStream::MotStartOfStream() : + m_marker(FIXED_MARKER), + m_rt(DISABLED), + m_startStop(START), + m_streamType(VOICE) { - rt = DISABLED; - startStop = START; - streamType = VOICE; + /* stub */ } /// @@ -56,10 +58,9 @@ bool MotStartOfStream::decode(const uint8_t* data) { assert(data != nullptr); - // Get parameters - rt = (RTFlag)data[2U]; - startStop = (StartStopFlag)data[3U]; - streamType = (StreamTypeFlag)data[4U]; + m_rt = (RTFlag)data[2U]; + m_startStop = (StartStopFlag)data[3U]; + m_streamType = (StreamTypeFlag)data[4U]; return true; } @@ -72,10 +73,9 @@ void MotStartOfStream::encode(uint8_t* data) { assert(data != nullptr); - // Copy data data[0U] = P25_DFSI_MOT_START_STOP; data[1U] = FIXED_MARKER; - data[2U] = rt; - data[3U] = startStop; - data[4U] = streamType; + data[2U] = (uint8_t)m_rt; + data[3U] = (uint8_t)m_startStop; + data[4U] = (uint8_t)m_streamType; } diff --git a/src/dfsi/rtp/MotStartOfStream.h b/src/dfsi/frames/MotStartOfStream.h similarity index 80% rename from src/dfsi/rtp/MotStartOfStream.h rename to src/dfsi/frames/MotStartOfStream.h index 5466665c..a846f33b 100644 --- a/src/dfsi/rtp/MotStartOfStream.h +++ b/src/dfsi/frames/MotStartOfStream.h @@ -1,10 +1,10 @@ // SPDX-License-Identifier: GPL-2.0-only /** -* Digital Voice Modem - Common Library +* 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 +* @package DVM / DFSI Peer Application * @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * @@ -19,7 +19,7 @@ #include "common/Defines.h" #include "common/Log.h" #include "common/Utils.h" -#include "rtp/RtpDefines.h" +#include "frames/FrameDefines.h" namespace p25 { @@ -45,12 +45,6 @@ namespace p25 static const uint8_t LENGTH = 10; static const uint8_t FIXED_MARKER = 0x02; - uint8_t marker = FIXED_MARKER; - - RTFlag rt; - StartStopFlag startStop; - StreamTypeFlag streamType; - /// Initializes a copy instance of the MotStartOfStream class. MotStartOfStream(); /// Initializes a copy instance of the MotStartOfStream class. @@ -60,6 +54,16 @@ namespace p25 bool decode(const uint8_t* data); /// Encode a start of stream frame. void encode(uint8_t* data); + + public: + /// + __PROPERTY(uint8_t, marker, Marker); + /// + __PROPERTY(RTFlag, rt, RT); + /// + __PROPERTY(StartStopFlag, startStop, StartStop); + /// + __PROPERTY(StreamTypeFlag, streamType, StreamType); }; } // namespace dfsi } // namespace p25 diff --git a/src/dfsi/rtp/MotStartVoiceFrame.cpp b/src/dfsi/frames/MotStartVoiceFrame.cpp similarity index 50% rename from src/dfsi/rtp/MotStartVoiceFrame.cpp rename to src/dfsi/frames/MotStartVoiceFrame.cpp index 61840061..2df6fce6 100644 --- a/src/dfsi/rtp/MotStartVoiceFrame.cpp +++ b/src/dfsi/frames/MotStartVoiceFrame.cpp @@ -1,10 +1,10 @@ // SPDX-License-Identifier: GPL-2.0-only /** -* Digital Voice Modem - Common Library +* 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 +* @package DVM / DFSI Peer Application * @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * @@ -13,7 +13,7 @@ * */ -#include "rtp/MotStartVoiceFrame.h" +#include "frames/MotStartVoiceFrame.h" #include "common/p25/dfsi/DFSIDefines.h" #include "common/Utils.h" #include "common/Log.h" @@ -31,16 +31,17 @@ using namespace dfsi; /// /// Initializes a instance of the MotStartVoiceFrame class. /// -MotStartVoiceFrame::MotStartVoiceFrame() +MotStartVoiceFrame::MotStartVoiceFrame() : + startOfStream(nullptr), + fullRateVoice(nullptr), + m_icw(ICW_DIU), + m_rssi(0U), + m_rssiValidity(INVALID), + m_nRssi(0U), + m_adjMM(0U) { - icw = ICW_DIU; - rssi = 0; - rssiValidity = INVALID; - nRssi = 0; - adjMM = 0; - - startOfStream = nullptr; - fullRateVoice = nullptr; + startOfStream = new MotStartOfStream(); + fullRateVoice = new MotFullRateVoice(); } /// @@ -57,8 +58,10 @@ MotStartVoiceFrame::MotStartVoiceFrame(uint8_t* data) /// MotStartVoiceFrame::~MotStartVoiceFrame() { - delete startOfStream; - delete fullRateVoice; + if (startOfStream != nullptr) + delete startOfStream; + if (fullRateVoice != nullptr) + delete fullRateVoice; } /// @@ -70,31 +73,36 @@ bool MotStartVoiceFrame::decode(const uint8_t* data) { assert(data != nullptr); - // Create a new startOfStream + // create a new start of stream + if (startOfStream != nullptr) + delete startOfStream; startOfStream = new MotStartOfStream(); - - // Create a buffer to decode the start record skipping the 10th byte (adjMM) - uint8_t startBuffer[startOfStream->LENGTH]; - ::memset(startBuffer, 0x00U, startOfStream->LENGTH); + + // create a buffer to decode the start record skipping the 10th byte (adjMM) + uint8_t startBuffer[MotStartOfStream::LENGTH]; + ::memset(startBuffer, 0x00U, MotStartOfStream::LENGTH); ::memcpy(startBuffer, data, 9U); - // Decode start of stream + // decode start of stream startOfStream->decode(startBuffer); - // Decode the full rate voice frames + // decode the full rate voice frames + if (fullRateVoice != nullptr) + delete fullRateVoice; fullRateVoice = new MotFullRateVoice(); - uint8_t voiceBuffer[fullRateVoice->SHORTENED_LENGTH]; - ::memset(voiceBuffer, 0x00U, fullRateVoice->SHORTENED_LENGTH); + + uint8_t voiceBuffer[MotFullRateVoice::SHORTENED_LENGTH]; + ::memset(voiceBuffer, 0x00U, MotFullRateVoice::SHORTENED_LENGTH); voiceBuffer[0U] = data[0U]; - ::memcpy(voiceBuffer + 1U, data + 10U, fullRateVoice->SHORTENED_LENGTH - 1); + ::memcpy(voiceBuffer + 1U, data + 10U, MotFullRateVoice::SHORTENED_LENGTH - 1); fullRateVoice->decode(voiceBuffer, true); - // Get rest of data - icw = (ICWFlag)data[5U]; - rssi = data[6U]; - rssiValidity = (RssiValidityFlag)data[7U]; - nRssi = data[8U]; - adjMM = data[9U]; + // get rest of data + m_icw = (ICWFlag)data[5U]; + m_rssi = data[6U]; + m_rssiValidity = (RssiValidityFlag)data[7U]; + m_nRssi = data[8U]; + m_adjMM = data[9U]; return true; } @@ -109,26 +117,28 @@ void MotStartVoiceFrame::encode(uint8_t* data) assert(startOfStream != nullptr); assert(fullRateVoice != nullptr); - // Encode start of stream - if (startOfStream != nullptr) { - uint8_t buffer[startOfStream->LENGTH]; + // encode start of stream - scope is intentional + { + uint8_t buffer[MotStartOfStream::LENGTH]; startOfStream->encode(buffer); - // Copy to data array (skipping first and last bytes) - ::memcpy(data + 1U, buffer + 1U, startOfStream->LENGTH - 2); + + // copy to data array (skipping first and last bytes) + ::memcpy(data + 1U, buffer + 1U, MotStartOfStream::LENGTH - 2); } - // Encode full rate voice - if (fullRateVoice != nullptr) { - uint8_t buffer[fullRateVoice->SHORTENED_LENGTH]; + // encode full rate voice - scope is intentional + { + uint8_t buffer[MotFullRateVoice::SHORTENED_LENGTH]; fullRateVoice->encode(buffer, true); - data[0U] = fullRateVoice->frameType; - ::memcpy(data + 10U, buffer + 1U, fullRateVoice->SHORTENED_LENGTH - 1); + + data[0U] = fullRateVoice->getFrameType(); + ::memcpy(data + 10U, buffer + 1U, MotFullRateVoice::SHORTENED_LENGTH - 1); } // Copy the rest - data[5U] = icw; - data[6U] = rssi; - data[7U] = rssiValidity; - data[8U] = nRssi; - data[9U] = adjMM; + data[5U] = (uint8_t)m_icw; + data[6U] = m_rssi; + data[7U] = (uint8_t)m_rssiValidity; + data[8U] = m_nRssi; + data[9U] = m_adjMM; } diff --git a/src/dfsi/rtp/MotStartVoiceFrame.h b/src/dfsi/frames/MotStartVoiceFrame.h similarity index 75% rename from src/dfsi/rtp/MotStartVoiceFrame.h rename to src/dfsi/frames/MotStartVoiceFrame.h index df4a8c64..d4a770c5 100644 --- a/src/dfsi/rtp/MotStartVoiceFrame.h +++ b/src/dfsi/frames/MotStartVoiceFrame.h @@ -1,10 +1,10 @@ // SPDX-License-Identifier: GPL-2.0-only /** -* Digital Voice Modem - Common Library +* 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 +* @package DVM / DFSI Peer Application * @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * @@ -19,9 +19,9 @@ #include "common/Defines.h" #include "common/Log.h" #include "common/Utils.h" -#include "rtp/RtpDefines.h" -#include "rtp/MotStartOfStream.h" -#include "rtp/MotFullRateVoice.h" +#include "frames/FrameDefines.h" +#include "frames/MotStartOfStream.h" +#include "frames/MotFullRateVoice.h" namespace p25 { @@ -52,15 +52,6 @@ namespace p25 public: static const uint8_t LENGTH = 22; - ICWFlag icw; - uint8_t rssi; - RssiValidityFlag rssiValidity; - uint8_t nRssi; - uint8_t adjMM; - - MotStartOfStream* startOfStream; - MotFullRateVoice* fullRateVoice; - /// Initializes a copy instance of the MotStartVoiceFrame class. MotStartVoiceFrame(); /// Initializes a copy instance of the MotStartVoiceFrame class. @@ -72,6 +63,21 @@ namespace p25 bool decode(const uint8_t* data); /// Encode a start voice frame. void encode(uint8_t* data); + + public: + MotStartOfStream* startOfStream; // ?? - this should probably be private with getters/setters + MotFullRateVoice* fullRateVoice; // ?? - this should probably be private with getters/setters + + /// + __PROPERTY(ICWFlag, icw, ICW); + /// + __PROPERTY(uint8_t, rssi, RSSI); + /// + __PROPERTY(RssiValidityFlag, rssiValidity, RSSIValidity); + /// + __PROPERTY(uint8_t, nRssi, NRSSI); + /// + __PROPERTY(uint8_t, adjMM, AdjMM); }; } // namespace dfsi } // namespace p25 diff --git a/src/dfsi/rtp/MotVoiceHeader1.cpp b/src/dfsi/frames/MotVoiceHeader1.cpp similarity index 61% rename from src/dfsi/rtp/MotVoiceHeader1.cpp rename to src/dfsi/frames/MotVoiceHeader1.cpp index b9b41814..16c3cda8 100644 --- a/src/dfsi/rtp/MotVoiceHeader1.cpp +++ b/src/dfsi/frames/MotVoiceHeader1.cpp @@ -1,10 +1,10 @@ // SPDX-License-Identifier: GPL-2.0-only /** -* Digital Voice Modem - Common Library +* 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 +* @package DVM / DFSI Peer Application * @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * @@ -13,7 +13,7 @@ * */ -#include "rtp/MotVoiceHeader1.h" +#include "frames/MotVoiceHeader1.h" #include "common/p25/dfsi/DFSIDefines.h" #include "common/Utils.h" #include "common/Log.h" @@ -31,14 +31,16 @@ using namespace dfsi; /// /// Initializes a instance of the MotVoiceHeader1 class. /// -MotVoiceHeader1::MotVoiceHeader1() +MotVoiceHeader1::MotVoiceHeader1() : + header(nullptr), + startOfStream(nullptr), + m_icw(ICW_DIU), + m_rssi(0U), + m_rssiValidity(INVALID), + m_nRssi(0U) { - icw = ICW_DIU; - rssi = 0; - rssiValidity = INVALID; - nRssi = 0; + startOfStream = new MotStartOfStream(); - startOfStream = nullptr; header = new uint8_t[HCW_LENGTH]; ::memset(header, 0x00U, HCW_LENGTH); } @@ -57,8 +59,10 @@ MotVoiceHeader1::MotVoiceHeader1(uint8_t* data) /// MotVoiceHeader1::~MotVoiceHeader1() { - delete startOfStream; - delete[] header; + if (startOfStream != nullptr) + delete startOfStream; + if (header != nullptr) + delete[] header; } /// @@ -70,21 +74,27 @@ bool MotVoiceHeader1::decode(const uint8_t* data) { assert(data != nullptr); - // Create a start of stream + // create a start of stream + if (startOfStream != nullptr) + delete startOfStream; startOfStream = new MotStartOfStream(); - uint8_t buffer[startOfStream->LENGTH]; - ::memset(buffer, 0x00U, startOfStream->LENGTH); - // We copy the bytes from [1:4] + + uint8_t buffer[MotStartOfStream::LENGTH]; + ::memset(buffer, 0x00U, MotStartOfStream::LENGTH); + + // we copy the bytes from [1:4] ::memcpy(buffer + 1U, data + 1U, 4); startOfStream->decode(buffer); - // Decode the other stuff - icw = (ICWFlag)data[5U]; - rssi = data[6U]; - rssiValidity = (RssiValidityFlag)data[7U]; - nRssi = data[8U]; + // decode the other stuff + m_icw = (ICWFlag)data[5U]; + m_rssi = data[6U]; + m_rssiValidity = (RssiValidityFlag)data[7U]; + m_nRssi = data[8U]; - // Our header includes the trailing source and check bytes + // our header includes the trailing source and check bytes + if (header != nullptr) + delete[] header; header = new uint8_t[HCW_LENGTH]; ::memset(header, 0x00U, HCW_LENGTH); ::memcpy(header, data + 9U, HCW_LENGTH); @@ -103,20 +113,22 @@ void MotVoiceHeader1::encode(uint8_t* data) data[0U] = P25_DFSI_MOT_VHDR_1; - if (startOfStream != nullptr) { - uint8_t buffer[startOfStream->LENGTH]; - ::memset(buffer, 0x00U, startOfStream->LENGTH); + // scope is intentional + { + uint8_t buffer[MotStartOfStream::LENGTH]; + ::memset(buffer, 0x00U, MotStartOfStream::LENGTH); startOfStream->encode(buffer); - // Copy the 4 start record bytes from the start of stream frame + + // copy the 4 start record bytes from the start of stream frame ::memcpy(data + 1U, buffer + 1U, 4U); } - data[5U] = icw; - data[6U] = rssi; - data[7U] = (uint8_t)rssiValidity; - data[8U] = nRssi; + data[5U] = (uint8_t)m_icw; + data[6U] = m_rssi; + data[7U] = (uint8_t)m_rssiValidity; + data[8U] = m_nRssi; - // Our header includes the trailing source and check bytes + // our header includes the trailing source and check bytes if (header != nullptr) { ::memcpy(data + 9U, header, HCW_LENGTH); } diff --git a/src/dfsi/rtp/MotVoiceHeader1.h b/src/dfsi/frames/MotVoiceHeader1.h similarity index 80% rename from src/dfsi/rtp/MotVoiceHeader1.h rename to src/dfsi/frames/MotVoiceHeader1.h index bbb1d25d..eacf869c 100644 --- a/src/dfsi/rtp/MotVoiceHeader1.h +++ b/src/dfsi/frames/MotVoiceHeader1.h @@ -1,10 +1,10 @@ // SPDX-License-Identifier: GPL-2.0-only /** -* Digital Voice Modem - Common Library +* 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 +* @package DVM / DFSI Peer Application * @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * @@ -19,8 +19,8 @@ #include "common/Defines.h" #include "common/Log.h" #include "common/Utils.h" -#include "rtp/RtpDefines.h" -#include "rtp/MotStartOfStream.h" +#include "frames/FrameDefines.h" +#include "frames/MotStartOfStream.h" namespace p25 { @@ -56,14 +56,6 @@ namespace p25 static const uint8_t LENGTH = 30; static const uint8_t HCW_LENGTH = 21; - ICWFlag icw; - uint8_t rssi; - RssiValidityFlag rssiValidity; - uint8_t nRssi; - - uint8_t* header; - MotStartOfStream* startOfStream; - /// Initializes a copy instance of the MotVoiceHeader1 class. MotVoiceHeader1(); /// Initializes a copy instance of the MotVoiceHeader1 class. @@ -75,6 +67,19 @@ namespace p25 bool decode(const uint8_t* data); /// Encode a voice header 1 frame. void encode(uint8_t* data); + + public: + uint8_t* header; // ?? - this should probably be private with getters/setters + MotStartOfStream* startOfStream; // ?? - this should probably be private with getters/setters + + /// + __PROPERTY(ICWFlag, icw, ICW); + /// + __PROPERTY(uint8_t, rssi, RSSI); + /// + __PROPERTY(RssiValidityFlag, rssiValidity, RSSIValidity); + /// + __PROPERTY(uint8_t, nRssi, NRSSI); }; } // namespace dfsi } // namespace p25 diff --git a/src/dfsi/rtp/MotVoiceHeader2.cpp b/src/dfsi/frames/MotVoiceHeader2.cpp similarity index 82% rename from src/dfsi/rtp/MotVoiceHeader2.cpp rename to src/dfsi/frames/MotVoiceHeader2.cpp index 1073f303..3bc7f805 100644 --- a/src/dfsi/rtp/MotVoiceHeader2.cpp +++ b/src/dfsi/frames/MotVoiceHeader2.cpp @@ -1,10 +1,10 @@ // SPDX-License-Identifier: GPL-2.0-only /** -* Digital Voice Modem - Common Library +* 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 +* @package DVM / DFSI Peer Application * @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * @@ -13,7 +13,7 @@ * */ -#include "rtp/MotVoiceHeader2.h" +#include "frames/MotVoiceHeader2.h" #include "common/p25/dfsi/DFSIDefines.h" #include "common/Utils.h" #include "common/Log.h" @@ -31,10 +31,10 @@ using namespace dfsi; /// /// Initializes a instance of the MotVoiceHeader2 class. /// -MotVoiceHeader2::MotVoiceHeader2() +MotVoiceHeader2::MotVoiceHeader2() : + header(nullptr), + m_source(SOURCE_QUANTAR) { - source = SOURCE_QUANTAR; - header = new uint8_t[HCW_LENGTH]; ::memset(header, 0x00U, HCW_LENGTH); } @@ -53,7 +53,8 @@ MotVoiceHeader2::MotVoiceHeader2(uint8_t* data) /// MotVoiceHeader2::~MotVoiceHeader2() { - delete[] header; + if (header != nullptr) + delete[] header; } /// @@ -65,7 +66,11 @@ bool MotVoiceHeader2::decode(const uint8_t* data) { assert(data != nullptr); - source = (SourceFlag)data[21]; + m_source = (SourceFlag)data[21]; + + if (header != nullptr) { + delete[] header; + } header = new uint8_t[HCW_LENGTH]; ::memset(header, 0x00U, HCW_LENGTH); @@ -88,5 +93,5 @@ void MotVoiceHeader2::encode(uint8_t* data) ::memcpy(data + 1U, header, HCW_LENGTH); } - data[LENGTH - 1U] = (uint8_t)source; + data[LENGTH - 1U] = (uint8_t)m_source; } diff --git a/src/dfsi/rtp/MotVoiceHeader2.h b/src/dfsi/frames/MotVoiceHeader2.h similarity index 87% rename from src/dfsi/rtp/MotVoiceHeader2.h rename to src/dfsi/frames/MotVoiceHeader2.h index ebe3b435..89b921bc 100644 --- a/src/dfsi/rtp/MotVoiceHeader2.h +++ b/src/dfsi/frames/MotVoiceHeader2.h @@ -1,10 +1,10 @@ // SPDX-License-Identifier: GPL-2.0-only /** -* Digital Voice Modem - Common Library +* 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 +* @package DVM / DFSI Peer Application * @derivedfrom MMDVMHost (https://github.com/g4klx/MMDVMHost) * @license GPLv2 License (https://opensource.org/licenses/GPL-2.0) * @@ -19,8 +19,8 @@ #include "common/Defines.h" #include "common/Log.h" #include "common/Utils.h" -#include "rtp/RtpDefines.h" -#include "rtp/MotStartOfStream.h" +#include "frames/FrameDefines.h" +#include "frames/MotStartOfStream.h" namespace p25 { @@ -52,15 +52,6 @@ namespace p25 static const uint8_t LENGTH = 22; static const uint8_t HCW_LENGTH = 20; - ICWFlag icw; - uint8_t rssi; - RssiValidityFlag rssiValidity; - uint8_t nRssi; - MotStartOfStream startOfStream; - SourceFlag source; - - uint8_t* header; - /// Initializes a copy instance of the MotVoiceHeader2 class. MotVoiceHeader2(); /// Initializes a copy instance of the MotVoiceHeader2 class. @@ -72,6 +63,12 @@ namespace p25 bool decode(const uint8_t* data); /// Encode a voice header 2 frame. void encode(uint8_t* data); + + public: + uint8_t* header; // ?? - this should probably be a private with getters/setters + + /// + __PROPERTY(SourceFlag, source, Source); }; } // namespace dfsi } // namespace p25 diff --git a/src/dfsi/frames/StartOfStream.cpp b/src/dfsi/frames/StartOfStream.cpp new file mode 100644 index 00000000..b339f5cb --- /dev/null +++ b/src/dfsi/frames/StartOfStream.cpp @@ -0,0 +1,76 @@ +// 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/StartOfStream.h" +#include "common/p25/dfsi/DFSIDefines.h" +#include "common/Utils.h" +#include "common/Log.h" + +#include +#include + +using namespace p25; +using namespace dfsi; + +// --------------------------------------------------------------------------- +// Public Class Members +// --------------------------------------------------------------------------- + +/// +/// Initializes a instance of the StartOfStream class. +/// +StartOfStream::StartOfStream() : + m_nid(0U), + m_errorCount(0U) +{ + /* stub */ +} + +/// +/// Initializes a instance of the StartOfStream class. +/// +/// +StartOfStream::StartOfStream(uint8_t* data) : + m_nid(0U), + m_errorCount(0U) +{ + decode(data); +} + +/// +/// Decode a start of stream frame. +/// +/// +/// +bool StartOfStream::decode(const uint8_t* data) +{ + assert(data != nullptr); + + m_nid = __GET_UINT16(data, 0U); // Network Identifier + m_errorCount = (data[2U] & 0x0FU); // Error Count + + return true; +} + +/// +/// Encode a start of stream frame. +/// +/// +void StartOfStream::encode(uint8_t* data) +{ + assert(data != nullptr); + + __SET_UINT16(m_nid, data, 0U); // Network Identifier + data[2U] = m_errorCount & 0x0FU; // Error Count +} diff --git a/src/dfsi/frames/StartOfStream.h b/src/dfsi/frames/StartOfStream.h new file mode 100644 index 00000000..002af9c5 --- /dev/null +++ b/src/dfsi/frames/StartOfStream.h @@ -0,0 +1,62 @@ +// 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(__START_OF_STREAM_H__) +#define __START_OF_STREAM_H__ + +#include "Defines.h" +#include "common/Defines.h" +#include "common/Log.h" +#include "common/Utils.h" +#include "frames/FrameDefines.h" + +namespace p25 +{ + namespace dfsi + { + // --------------------------------------------------------------------------- + // Class Declaration + // Implements a P25 DFSI start of stream packet. + // + // + // Byte 0 1 2 + // Bit 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 + // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + // | NID | Rsvd | Err C | + // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + // --------------------------------------------------------------------------- + + class HOST_SW_API StartOfStream { + public: + static const uint8_t LENGTH = 4; + + /// Initializes a copy instance of the StartOfStream class. + StartOfStream(); + /// Initializes a copy instance of the StartOfStream class. + StartOfStream(uint8_t* data); + + /// Decode a start of stream frame. + bool decode(const uint8_t* data); + /// Encode a start of stream frame. + void encode(uint8_t* data); + + public: + /// + __PROPERTY(uint16_t, nid, NID); + /// + __PROPERTY(uint8_t, errorCount, ErrorCount); + }; + } // namespace dfsi +} // namespace p25 + +#endif // __START_OF_STREAM_H__ \ No newline at end of file diff --git a/src/dfsi/network/CallData.h b/src/dfsi/network/CallData.h index 1eeb1e3e..bed820bc 100644 --- a/src/dfsi/network/CallData.h +++ b/src/dfsi/network/CallData.h @@ -29,7 +29,7 @@ #include "common/yaml/Yaml.h" #include "common/RingBuffer.h" #include "network/DfsiPeerNetwork.h" -#include "rtp/RtpFrames.h" +#include "frames/Frames.h" #include "host/modem/Modem.h" #include "host/modem/port/IModemPort.h" #include "host/modem/port/UARTPort.h" diff --git a/src/dfsi/network/SerialService.cpp b/src/dfsi/network/SerialService.cpp index a79ba2ff..0008dd61 100644 --- a/src/dfsi/network/SerialService.cpp +++ b/src/dfsi/network/SerialService.cpp @@ -558,7 +558,7 @@ void SerialService::processP25ToNet() // Decode the frame MotStartOfStream start = MotStartOfStream(dfsiData); // Handle start/stop - if (start.startStop == StartStopFlag::START) { + if (start.getStartStop() == StartStopFlag::START) { // Flag we have a local call (i.e. from V24) in progress m_lclCallInProgress = true; // Reset the call data (just in case) @@ -657,7 +657,7 @@ void SerialService::processP25ToNet() // Decode MotStartVoiceFrame svf = MotStartVoiceFrame(dfsiData); // Copy - ::memcpy(m_rxVoiceCallData->netLDU1 + 10U, svf.fullRateVoice->imbeData, svf.fullRateVoice->IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU1 + 10U, svf.fullRateVoice->imbeData, MotFullRateVoice::IMBE_BUF_LEN); // Increment our voice frame counter m_rxVoiceCallData->n++; } @@ -667,7 +667,7 @@ void SerialService::processP25ToNet() // Decode MotStartVoiceFrame svf = MotStartVoiceFrame(dfsiData); // Copy - ::memcpy(m_rxVoiceCallData->netLDU2 + 10U, svf.fullRateVoice->imbeData, svf.fullRateVoice->IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU2 + 10U, svf.fullRateVoice->imbeData, MotFullRateVoice::IMBE_BUF_LEN); // Increment our voice frame counter m_rxVoiceCallData->n++; } @@ -682,13 +682,13 @@ void SerialService::processP25ToNet() // VOICE2 case P25_DFSI_LDU1_VOICE2: { - ::memcpy(m_rxVoiceCallData->netLDU1 + 26U, voice.imbeData, voice.IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU1 + 26U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); } break; // VOICE3 case P25_DFSI_LDU1_VOICE3: { - ::memcpy(m_rxVoiceCallData->netLDU1 + 55U, voice.imbeData, voice.IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU1 + 55U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); if (voice.additionalData != nullptr) { m_rxVoiceCallData->lco = voice.additionalData[0U]; m_rxVoiceCallData->mfId = voice.additionalData[1U]; @@ -701,7 +701,7 @@ void SerialService::processP25ToNet() // VOICE4 case P25_DFSI_LDU1_VOICE4: { - ::memcpy(m_rxVoiceCallData->netLDU1 + 80U, voice.imbeData, voice.IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU1 + 80U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); if (voice.additionalData != nullptr) { m_rxVoiceCallData->dstId = __GET_UINT16(voice.additionalData, 0U); } else { @@ -712,7 +712,7 @@ void SerialService::processP25ToNet() // VOICE5 case P25_DFSI_LDU1_VOICE5: { - ::memcpy(m_rxVoiceCallData->netLDU1 + 105U, voice.imbeData, voice.IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU1 + 105U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); if (voice.additionalData != nullptr) { m_rxVoiceCallData->srcId = __GET_UINT16(voice.additionalData, 0U); } else { @@ -723,25 +723,25 @@ void SerialService::processP25ToNet() // VOICE6 case P25_DFSI_LDU1_VOICE6: { - ::memcpy(m_rxVoiceCallData->netLDU1 + 130U, voice.imbeData, voice.IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU1 + 130U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); } break; // VOICE7 case P25_DFSI_LDU1_VOICE7: { - ::memcpy(m_rxVoiceCallData->netLDU1 + 155U, voice.imbeData, voice.IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU1 + 155U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); } break; // VOICE8 case P25_DFSI_LDU1_VOICE8: { - ::memcpy(m_rxVoiceCallData->netLDU1 + 180U, voice.imbeData, voice.IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU1 + 180U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); } break; // VOICE9 case P25_DFSI_LDU1_VOICE9: { - ::memcpy(m_rxVoiceCallData->netLDU1 + 204U, voice.imbeData, voice.IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU1 + 204U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); if (voice.additionalData != nullptr) { m_rxVoiceCallData->lsd1 = voice.additionalData[0U]; m_rxVoiceCallData->lsd2 = voice.additionalData[1U]; @@ -753,13 +753,13 @@ void SerialService::processP25ToNet() // VOICE11 case P25_DFSI_LDU2_VOICE11: { - ::memcpy(m_rxVoiceCallData->netLDU2 + 26U, voice.imbeData, voice.IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU2 + 26U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); } break; // VOICE12 case P25_DFSI_LDU2_VOICE12: { - ::memcpy(m_rxVoiceCallData->netLDU2 + 55U, voice.imbeData, voice.IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU2 + 55U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); if (voice.additionalData != nullptr) { ::memcpy(m_rxVoiceCallData->mi, voice.additionalData, 3U); } else { @@ -770,7 +770,7 @@ void SerialService::processP25ToNet() // VOICE13 case P25_DFSI_LDU2_VOICE13: { - ::memcpy(m_rxVoiceCallData->netLDU2 + 80U, voice.imbeData, voice.IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU2 + 80U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); if (voice.additionalData != nullptr) { ::memcpy(m_rxVoiceCallData->mi + 3U, voice.additionalData, 3U); } else { @@ -781,7 +781,7 @@ void SerialService::processP25ToNet() // VOICE14 case P25_DFSI_LDU2_VOICE14: { - ::memcpy(m_rxVoiceCallData->netLDU2 + 105U, voice.imbeData, voice.IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU2 + 105U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); if (voice.additionalData != nullptr) { ::memcpy(m_rxVoiceCallData->mi + 6U, voice.additionalData, 3U); } else { @@ -792,7 +792,7 @@ void SerialService::processP25ToNet() // VOICE15 case P25_DFSI_LDU2_VOICE15: { - ::memcpy(m_rxVoiceCallData->netLDU2 + 130U, voice.imbeData, voice.IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU2 + 130U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); if (voice.additionalData != nullptr) { m_rxVoiceCallData->algoId = voice.additionalData[0U]; m_rxVoiceCallData->kId = __GET_UINT16B(voice.additionalData, 1U); @@ -804,19 +804,19 @@ void SerialService::processP25ToNet() // VOICE16 case P25_DFSI_LDU2_VOICE16: { - ::memcpy(m_rxVoiceCallData->netLDU2 + 155U, voice.imbeData, voice.IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU2 + 155U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); } break; // VOICE17 case P25_DFSI_LDU2_VOICE17: { - ::memcpy(m_rxVoiceCallData->netLDU2 + 180U, voice.imbeData, voice.IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU2 + 180U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); } break; // VOICE18 case P25_DFSI_LDU2_VOICE18: { - ::memcpy(m_rxVoiceCallData->netLDU2 + 204U, voice.imbeData, voice.IMBE_BUF_LEN); + ::memcpy(m_rxVoiceCallData->netLDU2 + 204U, voice.imbeData, MotFullRateVoice::IMBE_BUF_LEN); if (voice.additionalData != nullptr) { m_rxVoiceCallData->lsd1 = voice.additionalData[0U]; m_rxVoiceCallData->lsd2 = voice.additionalData[1U]; @@ -1317,21 +1317,19 @@ void SerialService::writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu) case 0: // VOICE1/10 { // Set frametype - voice.frameType = (duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE1 : P25_DFSI_LDU2_VOICE10; + voice.setFrameType((duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE1 : P25_DFSI_LDU2_VOICE10); // Create the new frame objects MotStartVoiceFrame svf = MotStartVoiceFrame(); - svf.startOfStream = new MotStartOfStream(); - svf.fullRateVoice = new MotFullRateVoice(); // Set values appropriately - svf.startOfStream->startStop = StartStopFlag::START; - svf.startOfStream->rt = m_rtrt ? RTFlag::ENABLED : RTFlag::DISABLED; + svf.startOfStream->setStartStop(StartStopFlag::START); + svf.startOfStream->setRT(m_rtrt ? RTFlag::ENABLED : RTFlag::DISABLED); // Set frame type - svf.fullRateVoice->frameType = voice.frameType; + svf.fullRateVoice->setFrameType(voice.getFrameType()); // Set source flag & ICW flag - svf.fullRateVoice->source = m_diu ? SOURCE_DIU : SOURCE_QUANTAR; - svf.icw = m_diu ? ICW_DIU : ICW_QUANTAR; + svf.fullRateVoice->setSource(m_diu ? SOURCE_DIU : SOURCE_QUANTAR); + svf.setICW(m_diu ? ICW_DIU : ICW_QUANTAR); // Copy data - ::memcpy(svf.fullRateVoice->imbeData, ldu + 10U, svf.fullRateVoice->IMBE_BUF_LEN); + ::memcpy(svf.fullRateVoice->imbeData, ldu + 10U, MotFullRateVoice::IMBE_BUF_LEN); // Encode buffer = new uint8_t[svf.LENGTH]; ::memset(buffer, 0x00U, svf.LENGTH); @@ -1341,21 +1339,21 @@ void SerialService::writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu) break; case 1: // VOICE2/11 { - voice.frameType = (duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE2 : P25_DFSI_LDU2_VOICE11; + voice.setFrameType((duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE2 : P25_DFSI_LDU2_VOICE11); // Set source flag - voice.source = m_diu ? SOURCE_DIU : SOURCE_QUANTAR; + voice.setSource(m_diu ? SOURCE_DIU : SOURCE_QUANTAR); ::memcpy(voice.imbeData, ldu + 26U, voice.IMBE_BUF_LEN); } break; case 2: // VOICE3/12 { - voice.frameType = (duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE3 : P25_DFSI_LDU2_VOICE12; + voice.setFrameType((duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE3 : P25_DFSI_LDU2_VOICE12); ::memcpy(voice.imbeData, ldu + 55U, voice.IMBE_BUF_LEN); // 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.frameType == P25_DUID_LDU1) { + if (voice.getFrameType() == P25_DUID_LDU1) { voice.additionalData[0U] = control.getLCO(); voice.additionalData[1U] = control.getMFId(); voice.additionalData[2U] = serviceOptions; @@ -1368,7 +1366,7 @@ void SerialService::writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu) break; case 3: // VOICE4/13 { - voice.frameType = (duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE4 : P25_DFSI_LDU2_VOICE13; + voice.setFrameType((duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE4 : P25_DFSI_LDU2_VOICE13); ::memcpy(voice.imbeData, ldu + 80U, voice.IMBE_BUF_LEN); // Create the additional data array voice.additionalData = new uint8_t[voice.ADDITIONAL_LENGTH]; @@ -1394,7 +1392,7 @@ void SerialService::writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu) break; case 4: // VOICE5/14 { - voice.frameType = (duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE5 : P25_DFSI_LDU2_VOICE14; + voice.setFrameType((duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE5 : P25_DFSI_LDU2_VOICE14); ::memcpy(voice.imbeData, ldu + 105U, voice.IMBE_BUF_LEN); // Create the additional data array voice.additionalData = new uint8_t[voice.ADDITIONAL_LENGTH]; @@ -1420,7 +1418,7 @@ void SerialService::writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu) break; case 5: // VOICE6/15 { - voice.frameType = (duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE6 : P25_DFSI_LDU2_VOICE15; + voice.setFrameType((duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE6 : P25_DFSI_LDU2_VOICE15); ::memcpy(voice.imbeData, ldu + 130U, voice.IMBE_BUF_LEN); // Create the additional data array voice.additionalData = new uint8_t[voice.ADDITIONAL_LENGTH]; @@ -1446,7 +1444,7 @@ void SerialService::writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu) break; case 6: // VOICE7/16 { - voice.frameType = (duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE7 : P25_DFSI_LDU2_VOICE16; + voice.setFrameType((duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE7 : P25_DFSI_LDU2_VOICE16); ::memcpy(voice.imbeData, ldu + 155U, voice.IMBE_BUF_LEN); // Create the additional data array voice.additionalData = new uint8_t[voice.ADDITIONAL_LENGTH]; @@ -1459,7 +1457,7 @@ void SerialService::writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu) break; case 7: // VOICE8/17 { - voice.frameType = (duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE8 : P25_DFSI_LDU2_VOICE17; + voice.setFrameType((duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE8 : P25_DFSI_LDU2_VOICE17); ::memcpy(voice.imbeData, ldu + 180U, voice.IMBE_BUF_LEN); // Create the additional data array voice.additionalData = new uint8_t[voice.ADDITIONAL_LENGTH]; @@ -1472,7 +1470,7 @@ void SerialService::writeP25Frame(uint8_t duid, dfsi::LC& lc, uint8_t* ldu) break; case 8: // VOICE9/18 { - voice.frameType = (duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE9 : P25_DFSI_LDU2_VOICE18; + voice.setFrameType((duid == P25_DUID_LDU1) ? P25_DFSI_LDU1_VOICE9 : P25_DFSI_LDU2_VOICE18); ::memcpy(voice.imbeData, ldu + 204U, voice.IMBE_BUF_LEN); // Create the additional data array voice.additionalData = new uint8_t[voice.ADDITIONAL_LENGTH]; @@ -1516,8 +1514,8 @@ void SerialService::startOfStream(const LC& lc) // Create new start of stream MotStartOfStream start = MotStartOfStream(); - start.startStop = StartStopFlag::START; - start.rt = m_rtrt ? RTFlag::ENABLED : RTFlag::DISABLED; + start.setStartStop(StartStopFlag::START); + start.setRT(m_rtrt ? RTFlag::ENABLED : RTFlag::DISABLED); // Create buffer for bytes and encode uint8_t buffer[start.LENGTH]; @@ -1567,10 +1565,9 @@ void SerialService::startOfStream(const LC& lc) // Prepare VHDR1 MotVoiceHeader1 vhdr1 = MotVoiceHeader1(); - vhdr1.startOfStream = new MotStartOfStream(); - vhdr1.startOfStream->startStop = StartStopFlag::START; - vhdr1.startOfStream->rt = m_rtrt ? RTFlag::ENABLED : RTFlag::DISABLED; - vhdr1.icw = m_diu ? ICW_DIU : ICW_QUANTAR; + vhdr1.startOfStream->setStartStop(StartStopFlag::START); + vhdr1.startOfStream->setRT(m_rtrt ? RTFlag::ENABLED : RTFlag::DISABLED); + vhdr1.setICW(m_diu ? ICW_DIU : ICW_QUANTAR); ::memcpy(vhdr1.header, raw, 8U); ::memcpy(vhdr1.header + 9U, raw + 8U, 8U); ::memcpy(vhdr1.header + 18U, raw + 16U, 2U); @@ -1614,7 +1611,7 @@ void SerialService::endOfStream() { // Create the new end of stream (which looks like a start of stream with the stop flag) MotStartOfStream end = MotStartOfStream(); - end.startStop = StartStopFlag::STOP; + end.setStartStop(StartStopFlag::STOP); // Create buffer and encode uint8_t buffer[end.LENGTH]; diff --git a/src/dfsi/network/SerialService.h b/src/dfsi/network/SerialService.h index 9c0d2573..f70b2f75 100644 --- a/src/dfsi/network/SerialService.h +++ b/src/dfsi/network/SerialService.h @@ -29,7 +29,7 @@ #include "common/RingBuffer.h" #include "network/DfsiPeerNetwork.h" #include "network/CallData.h" -#include "rtp/RtpFrames.h" +#include "frames/Frames.h" #include "host/modem/Modem.h" #include "host/modem/port/IModemPort.h" #include "host/modem/port/UARTPort.h"