diff --git a/network/BaseNetwork.cpp b/network/BaseNetwork.cpp
index 7755fb70..e6b5bbc3 100644
--- a/network/BaseNetwork.cpp
+++ b/network/BaseNetwork.cpp
@@ -554,10 +554,7 @@ bool BaseNetwork::writeP25LDU1(const uint32_t id, const uint32_t streamId, const
assert(data != NULL);
- uint8_t serviceOptions =
- (control.getEmergency() ? 0x80U : 0x00U) +
- (control.getEncrypted() ? 0x40U : 0x00U) +
- (control.getPriority() & 0x07U);
+ p25::dfsi::LC dfsiLC = p25::dfsi::LC(control, lsd);
uint8_t buffer[DATA_PACKET_LENGTH];
::memset(buffer, 0x00U, DATA_PACKET_LENGTH);
@@ -584,71 +581,51 @@ bool BaseNetwork::writeP25LDU1(const uint32_t id, const uint32_t streamId, const
buffer[22U] = p25::P25_DUID_LDU1; // DUID
uint32_t count = 24U;
- uint8_t tempBuf[22U];
+ uint8_t imbe[p25::P25_RAW_IMBE_LENGTH_BYTES];
- // The '62' record
- ::memcpy(tempBuf, LDU1_REC62, 22U);
- m_audio.decode(data, tempBuf + 10U, 0U);
- ::memcpy(buffer + 24U, tempBuf, 22U);
+ dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE1);
+ m_audio.decode(data, imbe, 0U);
+ dfsiLC.encodeLDU1(buffer + 24U, imbe);
count += 22U;
- // The '63' record
- ::memcpy(tempBuf, LDU1_REC63, 14U);
- m_audio.decode(data, tempBuf + 1U, 1U);
- ::memcpy(buffer + 46U, tempBuf, 14U);
+ dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE2);
+ m_audio.decode(data, imbe, 1U);
+ dfsiLC.encodeLDU1(buffer + 46U, imbe);
count += 14U;
- // The '64' record
- ::memcpy(tempBuf, LDU1_REC64, 17U);
- tempBuf[1U] = control.getLCO();
- tempBuf[2U] = control.getMFId();
- tempBuf[3U] = serviceOptions;
- m_audio.decode(data, tempBuf + 5U, 2U);
- ::memcpy(buffer + 60U, tempBuf, 17U);
+ dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE3);
+ m_audio.decode(data, imbe, 2U);
+ dfsiLC.encodeLDU1(buffer + 60U, imbe);
count += 17U;
- // The '65' record
- ::memcpy(tempBuf, LDU1_REC65, 17U);
- tempBuf[1U] = (dstId >> 16) & 0xFFU;
- tempBuf[2U] = (dstId >> 8) & 0xFFU;
- tempBuf[3U] = (dstId >> 0) & 0xFFU;
- m_audio.decode(data, tempBuf + 5U, 3U);
- ::memcpy(buffer + 77U, tempBuf, 17U);
+ dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE4);
+ m_audio.decode(data, imbe, 3U);
+ dfsiLC.encodeLDU1(buffer + 77U, imbe);
count += 17U;
- // The '66' record
- ::memcpy(tempBuf, LDU1_REC66, 17U);
- tempBuf[1U] = (srcId >> 16) & 0xFFU;
- tempBuf[2U] = (srcId >> 8) & 0xFFU;
- tempBuf[3U] = (srcId >> 0) & 0xFFU;
- m_audio.decode(data, tempBuf + 5U, 4U);
- ::memcpy(buffer + 94U, tempBuf, 17U);
+ dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE5);
+ m_audio.decode(data, imbe, 4U);
+ dfsiLC.encodeLDU1(buffer + 94U, imbe);
count += 17U;
- // The '67' record
- ::memcpy(tempBuf, LDU1_REC67, 17U);
- m_audio.decode(data, tempBuf + 5U, 5U);
- ::memcpy(buffer + 111U, tempBuf, 17U);
+ dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE6);
+ m_audio.decode(data, imbe, 5U);
+ dfsiLC.encodeLDU1(buffer + 111U, imbe);
count += 17U;
- // The '68' record
- ::memcpy(tempBuf, LDU1_REC68, 17U);
- m_audio.decode(data, tempBuf + 5U, 6U);
- ::memcpy(buffer + 128U, tempBuf, 17U);
+ dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE7);
+ m_audio.decode(data, imbe, 6U);
+ dfsiLC.encodeLDU1(buffer + 128U, imbe);
count += 17U;
- // The '69' record
- ::memcpy(tempBuf, LDU1_REC69, 17U);
- m_audio.decode(data, tempBuf + 5U, 7U);
- ::memcpy(buffer + 145U, tempBuf, 17U);
+ dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE8);
+ m_audio.decode(data, imbe, 7U);
+ dfsiLC.encodeLDU1(buffer + 145U, imbe);
count += 17U;
- // The '6A' record
- ::memcpy(tempBuf, LDU1_REC6A, 16U);
- tempBuf[1U] = lsd.getLSD1();
- tempBuf[2U] = lsd.getLSD2();
- m_audio.decode(data, tempBuf + 4U, 8U);
- ::memcpy(buffer + 162U, tempBuf, 16U);
+ dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU1_VOICE9);
+ m_audio.decode(data, imbe, 8U);
+ dfsiLC.encodeLDU1(buffer + 162U, imbe);
count += 16U;
buffer[23U] = count;
@@ -678,6 +655,8 @@ bool BaseNetwork::writeP25LDU2(const uint32_t id, const uint32_t streamId, const
assert(data != NULL);
+ p25::dfsi::LC dfsiLC = p25::dfsi::LC(control, lsd);
+
uint8_t buffer[DATA_PACKET_LENGTH];
::memset(buffer, 0x00U, DATA_PACKET_LENGTH);
@@ -703,81 +682,51 @@ bool BaseNetwork::writeP25LDU2(const uint32_t id, const uint32_t streamId, const
buffer[22U] = p25::P25_DUID_LDU2; // DUID
uint32_t count = 24U;
- uint8_t tempBuf[22U];
+ uint8_t imbe[p25::P25_RAW_IMBE_LENGTH_BYTES];
- // The '6B' record
- ::memcpy(tempBuf, LDU2_REC6B, 22U);
- m_audio.decode(data, tempBuf + 10U, 0U);
- ::memcpy(buffer + 24U, tempBuf, 22U);
+ dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE10);
+ m_audio.decode(data, imbe, 0U);
+ dfsiLC.encodeLDU2(buffer + 24U, imbe);
count += 22U;
- // The '6C' record
- ::memcpy(tempBuf, LDU2_REC6C, 14U);
- m_audio.decode(data, tempBuf + 1U, 1U);
- ::memcpy(buffer + 46U, tempBuf, 14U);
+ dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE11);
+ m_audio.decode(data, imbe, 1U);
+ dfsiLC.encodeLDU2(buffer + 46U, imbe);
count += 14U;
- // generate MI data
- uint8_t mi[p25::P25_MI_LENGTH_BYTES];
- control.getMI(mi);
-
- // Utils::dump(1U, "LDU2 Control MI", mi, p25::P25_MI_LENGTH_BYTES);
-
- // The '6D' record
- ::memcpy(tempBuf, LDU2_REC6D, 17U);
- tempBuf[1U] = mi[0U];
- tempBuf[2U] = mi[1U];
- tempBuf[3U] = mi[2U];
- m_audio.decode(data, tempBuf + 5U, 2U);
- ::memcpy(buffer + 60U, tempBuf, 17U);
+ dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE12);
+ m_audio.decode(data, imbe, 2U);
+ dfsiLC.encodeLDU2(buffer + 60U, imbe);
count += 17U;
- // The '6E' record
- ::memcpy(tempBuf, LDU2_REC6E, 17U);
- tempBuf[1U] = mi[3U];
- tempBuf[2U] = mi[4U];
- tempBuf[3U] = mi[5U];
- m_audio.decode(data, tempBuf + 5U, 3U);
- ::memcpy(buffer + 77U, tempBuf, 17U);
+ dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE13);
+ m_audio.decode(data, imbe, 3U);
+ dfsiLC.encodeLDU2(buffer + 77U, imbe);
count += 17U;
- // The '6F' record
- ::memcpy(tempBuf, LDU2_REC6F, 17U);
- tempBuf[1U] = mi[6U];
- tempBuf[2U] = mi[7U];
- tempBuf[3U] = mi[8U];
- m_audio.decode(data, tempBuf + 5U, 4U);
- ::memcpy(buffer + 94U, tempBuf, 17U);
+ dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE14);
+ m_audio.decode(data, imbe, 4U);
+ dfsiLC.encodeLDU2(buffer + 94U, imbe);
count += 17U;
- // The '70' record
- ::memcpy(tempBuf, LDU2_REC70, 17U);
- tempBuf[1U] = control.getAlgId();
- uint32_t kid = control.getKId();
- tempBuf[2U] = (kid >> 8) & 0xFFU;
- tempBuf[3U] = (kid >> 0) & 0xFFU;
- m_audio.decode(data, tempBuf + 5U, 5U);
- ::memcpy(buffer + 111U, tempBuf, 17U);
+ dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE15);
+ m_audio.decode(data, imbe, 5U);
+ dfsiLC.encodeLDU2(buffer + 111U, imbe);
count += 17U;
- // The '71' record
- ::memcpy(tempBuf, LDU2_REC71, 17U);
- m_audio.decode(data, tempBuf + 5U, 6U);
- ::memcpy(buffer + 128U, tempBuf, 17U);
+ dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE16);
+ m_audio.decode(data, imbe, 6U);
+ dfsiLC.encodeLDU2(buffer + 128U, imbe);
count += 17U;
- // The '72' record
- ::memcpy(tempBuf, LDU2_REC72, 17U);
- m_audio.decode(data, tempBuf + 5U, 7U);
- ::memcpy(buffer + 145U, tempBuf, 17U);
+ dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE17);
+ m_audio.decode(data, imbe, 7U);
+ dfsiLC.encodeLDU2(buffer + 145U, imbe);
count += 17U;
- // The '73' record
- ::memcpy(tempBuf, LDU2_REC73, 16U);
- tempBuf[1U] = lsd.getLSD1();
- tempBuf[2U] = lsd.getLSD2();
- m_audio.decode(data, tempBuf + 4U, 8U);
- ::memcpy(buffer + 162U, tempBuf, 16U);
+ dfsiLC.setFrameType(p25::dfsi::P25_DFSI_LDU2_VOICE18);
+ m_audio.decode(data, imbe, 8U);
+ dfsiLC.encodeLDU2(buffer + 162U, imbe);
count += 16U;
buffer[23U] = count;
diff --git a/network/BaseNetwork.h b/network/BaseNetwork.h
index 49cb1fa8..4178406b 100644
--- a/network/BaseNetwork.h
+++ b/network/BaseNetwork.h
@@ -36,6 +36,8 @@
#include "p25/P25Defines.h"
#include "dmr/data/Data.h"
#include "p25/data/LowSpeedData.h"
+#include "p25/dfsi/DFSIDefines.h"
+#include "p25/dfsi/LC.h"
#include "p25/lc/LC.h"
#include "p25/lc/TSBK.h"
#include "p25/lc/TDULC.h"
@@ -83,80 +85,6 @@ namespace network
// Constants
// ---------------------------------------------------------------------------
- // P25 V.24 LDU1 Encapsulation Frames
- const uint8_t LDU1_REC62[] = { // IMBE Voice 1
- // ID RT Md St/Sp Type ICW RSSI IMBE Voice Source
- 0x62U, 0x02U, 0x04U, 0x0CU, 0x0BU, 0x1BU, 0x64U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x02U };
-
- const uint8_t LDU1_REC63[] = { // IMBE Voice 2
- // ID IMBE Voice Source
- 0x63U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x02U };
-
- const uint8_t LDU1_REC64[] = { // IMBE Voice 3 + Link Control
- // ID LCO MFId SvcOp IMBE Voice Status
- 0x64U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x02U };
-
- const uint8_t LDU1_REC65[] = { // IMBE Voice 4 + Link Control
- // ID Destination ID IMBE Voice Status
- 0x65U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x02U };
-
- const uint8_t LDU1_REC66[] = { // IMBE Voice 5 + Link Control
- // ID Source ID IMBE Voice Status
- 0x66U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x02U };
-
- const uint8_t LDU1_REC67[] = { // IMBE Voice 6 + Link Control
- // ID IMBE Voice Status
- 0x67U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x02U };
-
- const uint8_t LDU1_REC68[] = { // IMBE Voice 7 + Link Control
- // ID IMBE Voice Status
- 0x68U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x02U };
-
- const uint8_t LDU1_REC69[] = { // IMBE Voice 8 + Link Control
- // ID IMBE Voice Status
- 0x69U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x02U };
-
- const uint8_t LDU1_REC6A[] = { // IMBE Voice 9 + Low Speed Data
- // ID LSD Status IMBE Voice
- 0x6AU, 0x00U, 0x00U, 0x02U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U };
-
- // P25 V.24 LDU2 Encapsulation Frames
- const uint8_t LDU2_REC6B[] = { // IMBE Voice 10
- // ID RT Md St/Sp Type ICW RSSI IMBE Voice
- 0x6BU, 0x02U, 0x04U, 0x0CU, 0x0BU, 0x1BU, 0x64U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U };
-
- const uint8_t LDU2_REC6C[] = { // IMBE Voice 11
- // ID IMBE Voice Status
- 0x6CU, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x02U };
-
- const uint8_t LDU2_REC6D[] = { // IMBE Voice 12 + Encryption Message Indicator
- // ID Encryption MI IMBE Voice Status
- 0x6DU, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x02U };
-
- const uint8_t LDU2_REC6E[] = { // IMBE Voice 13 + Encryption Message Indicator
- // ID Encryption MI IMBE Voice Status
- 0x6EU, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x02U };
-
- const uint8_t LDU2_REC6F[] = { // IMBE Voice 14 + Encryption Message Indicator
- // ID Encryption MI IMBE Voice Status
- 0x6FU, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x02U };
-
- const uint8_t LDU2_REC70[] = { // IMBE Voice 15 + Encryption Algorithm & Key ID
- // ID AlgId KID KID IMBE Voice Status
- 0x70U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x02U };
-
- const uint8_t LDU2_REC71[] = { // IMBE Voice 16 + Encryption Sync
- // ID Encryption Sync IMBE Voice Status
- 0x71U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x02U };
-
- const uint8_t LDU2_REC72[] = { // IMBE Voice 17 + Encryption Sync
- // ID Encryption Sync IMBE Voice Status
- 0x72U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x02U };
-
- const uint8_t LDU2_REC73[] = { // IMBE Voice 18 + Low Speed Data
- // ID LSD Status IMBE Voice
- 0x73U, 0x00U, 0x00U, 0x02U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U };
-
const uint32_t DATA_PACKET_LENGTH = 8192U;
const uint32_t DMR_PACKET_SIZE = 55U;
const uint32_t PACKET_PAD = 8U;
diff --git a/p25/data/LowSpeedData.cpp b/p25/data/LowSpeedData.cpp
index 28b57dc5..8ff67c09 100644
--- a/p25/data/LowSpeedData.cpp
+++ b/p25/data/LowSpeedData.cpp
@@ -82,6 +82,21 @@ LowSpeedData::~LowSpeedData()
/* stub */
}
+///
+/// Equals operator.
+///
+///
+///
+LowSpeedData& LowSpeedData::operator=(const LowSpeedData& data)
+{
+ if (this != &data) {
+ m_lsd1 = data.m_lsd1;
+ m_lsd2 = data.m_lsd2;
+ }
+
+ return *this;
+}
+
///
/// Decodes embedded low speed data.
///
diff --git a/p25/data/LowSpeedData.h b/p25/data/LowSpeedData.h
index 1bddebbf..052037e6 100644
--- a/p25/data/LowSpeedData.h
+++ b/p25/data/LowSpeedData.h
@@ -48,6 +48,9 @@ namespace p25
/// Finalizes a new instance of the LowSpeedData class.
~LowSpeedData();
+ /// Equals operator.
+ LowSpeedData& operator=(const LowSpeedData& data);
+
/// Decodes embedded low speed data.
void process(uint8_t* data);
/// Encode embedded low speed data.
diff --git a/p25/dfsi/LC.cpp b/p25/dfsi/LC.cpp
index 8b7bd201..ff57a19c 100644
--- a/p25/dfsi/LC.cpp
+++ b/p25/dfsi/LC.cpp
@@ -44,7 +44,6 @@ using namespace p25;
///
/// Initializes a new instance of the LC class.
///
-///
LC::LC() :
m_rtModeFlag(P25_DFSI_RT_ENABLED),
m_startStopFlag(P25_DFSI_START_FLAG),
@@ -61,6 +60,15 @@ LC::LC() :
::memset(m_mi, 0x00U, P25_MI_LENGTH_BYTES);
}
+///
+/// Initializes a new instance of the LC class.
+///
+LC::LC(const p25::lc::LC& control, const p25::data::LowSpeedData& lsd) : LC()
+{
+ m_control = control;
+ m_lsd = lsd;
+}
+
///
/// Finalizes a instance of LC class.
///
@@ -759,9 +767,9 @@ void LC::encodeStart(uint8_t* data)
::memset(rawFrame, 0x00U, P25_DFSI_START_LENGTH_BYTES);
rawFrame[0U] = 0x02U;
- rawFrame[1U] = m_rtModeFlag; // RT Mode Flag
- rawFrame[2U] = m_startStopFlag; // Start/Stop Flag
- rawFrame[3U] = m_typeFlag; // Type flag
+ rawFrame[1U] = m_rtModeFlag; // RT Mode Flag
+ rawFrame[2U] = m_startStopFlag; // Start/Stop Flag
+ rawFrame[3U] = m_typeFlag; // Type flag
::memcpy(data, rawFrame, P25_DFSI_START_LENGTH_BYTES);
}
diff --git a/p25/dfsi/LC.h b/p25/dfsi/LC.h
index 4d3e522c..a3fdee66 100644
--- a/p25/dfsi/LC.h
+++ b/p25/dfsi/LC.h
@@ -46,6 +46,8 @@ namespace p25
public:
/// Initializes a new instance of the LC class.
LC();
+ /// Initializes a new instance of the LC class.
+ LC(const p25::lc::LC& control, const p25::data::LowSpeedData& lsd);
/// Finalizes a instance of the LC class.
~LC();