diff --git a/MMDVMHost.vcxproj b/MMDVMHost.vcxproj
index ef4390c..5e39637 100644
--- a/MMDVMHost.vcxproj
+++ b/MMDVMHost.vcxproj
@@ -198,7 +198,6 @@
-
@@ -281,7 +280,6 @@
-
diff --git a/MMDVMHost.vcxproj.filters b/MMDVMHost.vcxproj.filters
index 8bd9368..8eedd67 100644
--- a/MMDVMHost.vcxproj.filters
+++ b/MMDVMHost.vcxproj.filters
@@ -257,9 +257,6 @@
Header Files
-
- Header Files
-
Header Files
@@ -490,9 +487,6 @@
Source Files
-
- Source Files
-
Source Files
diff --git a/Makefile b/Makefile
index 57470a5..12f36e8 100644
--- a/Makefile
+++ b/Makefile
@@ -10,7 +10,7 @@ OBJECTS = \
AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o \
DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \
Golay24128.o Hamming.o JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NXDNControl.o \
- NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNFACCH2.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o \
+ NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o \
P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o \
SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
diff --git a/Makefile.Pi b/Makefile.Pi
index 97e713e..7379f9f 100644
--- a/Makefile.Pi
+++ b/Makefile.Pi
@@ -10,7 +10,7 @@ OBJECTS = \
AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o \
DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \
Golay24128.o Hamming.o JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NXDNControl.o \
- NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNFACCH2.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o \
+ NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o \
P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o \
SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
diff --git a/Makefile.Pi.Adafruit b/Makefile.Pi.Adafruit
index 7de9641..564c4a4 100644
--- a/Makefile.Pi.Adafruit
+++ b/Makefile.Pi.Adafruit
@@ -10,7 +10,7 @@ OBJECTS = \
AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o \
DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \
Golay24128.o Hamming.o HD44780.o JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NXDNControl.o \
- NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNFACCH2.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o \
+ NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o \
P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o \
StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
diff --git a/Makefile.Pi.HD44780 b/Makefile.Pi.HD44780
index 9b1d770..dbb7df5 100644
--- a/Makefile.Pi.HD44780
+++ b/Makefile.Pi.HD44780
@@ -10,7 +10,7 @@ OBJECTS = \
AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o \
DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \
Golay24128.o Hamming.o HD44780.o JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NXDNControl.o \
- NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNFACCH2.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o \
+ NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o \
P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o \
StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
diff --git a/Makefile.Pi.OLED b/Makefile.Pi.OLED
index 008bc77..19c0c62 100644
--- a/Makefile.Pi.OLED
+++ b/Makefile.Pi.OLED
@@ -10,7 +10,7 @@ OBJECTS = \
AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o \
DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \
Golay24128.o Hamming.o JitterBuffer.o OLED.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NXDNControl.o \
- NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNFACCH2.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o \
+ NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o \
P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o \
SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
diff --git a/Makefile.Pi.PCF8574 b/Makefile.Pi.PCF8574
index f16f7ff..5d28a2b 100644
--- a/Makefile.Pi.PCF8574
+++ b/Makefile.Pi.PCF8574
@@ -10,7 +10,7 @@ OBJECTS = \
AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o \
DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \
Golay24128.o Hamming.o HD44780.o JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NXDNControl.o \
- NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNFACCH2.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o \
+ NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o \
P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o SHA256.o \
StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
diff --git a/Makefile.Solaris b/Makefile.Solaris
index 1fede3a..d40317f 100644
--- a/Makefile.Solaris
+++ b/Makefile.Solaris
@@ -10,7 +10,7 @@ OBJECTS = \
AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o \
DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o DMRAccessControl.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o \
Golay24128.o Hamming.o JitterBuffer.o LCDproc.o Log.o MMDVMHost.o Modem.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NXDNControl.o \
- NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNFACCH2.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o \
+ NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o \
P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o QR1676.o RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialPort.o \
SHA256.o StopWatch.o Sync.o TFTSerial.o Thread.o Timer.o UDPSocket.o UMP.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
diff --git a/NXDNControl.cpp b/NXDNControl.cpp
index ddb1f0f..43e3165 100644
--- a/NXDNControl.cpp
+++ b/NXDNControl.cpp
@@ -13,7 +13,6 @@
#include "NXDNControl.h"
#include "NXDNFACCH1.h"
-#include "NXDNFACCH2.h"
#include "NXDNSACCH.h"
#include "NXDNUDCH.h"
#include "AMBEFEC.h"
@@ -209,7 +208,7 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
return false;
unsigned char messageType = m_rfSACCHMessage.getMessageType();
- if (messageType == NXDN_MESSAGE_TYPE_IDLE)
+ if (messageType != NXDN_MESSAGE_TYPE_VCALL)
return false;
unsigned short srcId = m_rfSACCHMessage.getSourceUnitId();
@@ -247,17 +246,74 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
if (m_rfState != RS_RF_AUDIO)
return false;
+ unsigned char voiceMode = m_rfSACCHMessage.getCallOptions() & 0x07U;
+
if (option == NXDN_LICH_STEAL_NONE) {
CAMBEFEC ambe;
unsigned int errors = 0U;
- //errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES);
- //errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 9U);
- //errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U);
- //errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 27U);
- //LogDebug("NXDN, EHR, AMBE FEC %u/188 (%.1f%%)", errors, float(errors) / 1.88F);
- //errors += ambe.regenerateIMBE(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES);
- //errors += ambe.regenerateIMBE(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U);
- //LogDebug("NXDN, EFR, AMBE FEC %u/288 (%.1f%%)", errors, float(errors) / 2.88F);
+ if (voiceMode == NXDN_VOICE_CALL_OPTION_9600_EFR) {
+ errors += ambe.regenerateIMBE(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES);
+ errors += ambe.regenerateIMBE(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U);
+ m_rfErrs += errors;
+ m_rfBits += 288U;
+ m_display->writeNXDNBER(float(errors) / 2.88F);
+ LogDebug("NXDN, EFR, AMBE FEC %u/288 (%.1f%%)", errors, float(errors) / 2.88F);
+ } else {
+ errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES);
+ errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 9U);
+ errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U);
+ errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 27U);
+ m_rfErrs += errors;
+ m_rfBits += 188U;
+ m_display->writeNXDNBER(float(errors) / 1.88F);
+ LogDebug("NXDN, EHR, AMBE FEC %u/188 (%.1f%%)", errors, float(errors) / 1.88F);
+ }
+ } else if (option == NXDN_LICH_STEAL_FACCH1_1) {
+ CNXDNFACCH1 facch1;
+ facch1.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS);
+
+ CAMBEFEC ambe;
+ unsigned int errors = 0U;
+ if (voiceMode == NXDN_VOICE_CALL_OPTION_9600_EFR) {
+ errors += ambe.regenerateIMBE(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U);
+ m_rfErrs += errors;
+ m_rfBits += 144U;
+ m_display->writeNXDNBER(float(errors) / 1.44F);
+ LogDebug("NXDN, EFR, AMBE FEC %u/144 (%.1f%%)", errors, float(errors) / 1.44F);
+ } else {
+ errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 18U);
+ errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 27U);
+ m_rfErrs += errors;
+ m_rfBits += 94U;
+ m_display->writeNXDNBER(float(errors) / 0.94F);
+ LogDebug("NXDN, EHR, AMBE FEC %u/94 (%.1f%%)", errors, float(errors) / 0.94F);
+ }
+ } else if (option == NXDN_LICH_STEAL_FACCH1_2) {
+ CAMBEFEC ambe;
+ unsigned int errors = 0U;
+ if (voiceMode == NXDN_VOICE_CALL_OPTION_9600_EFR) {
+ errors += ambe.regenerateIMBE(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES);
+ m_rfErrs += errors;
+ m_rfBits += 144U;
+ m_display->writeNXDNBER(float(errors) / 1.44F);
+ LogDebug("NXDN, EFR, AMBE FEC %u/144 (%.1f%%)", errors, float(errors) / 1.44F);
+ } else {
+ errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES);
+ errors += ambe.regenerateDMR(data + 2U + NXDN_FSW_LICH_SACCH_LENGTH_BYTES + 9U);
+ m_rfErrs += errors;
+ m_rfBits += 94U;
+ m_display->writeNXDNBER(float(errors) / 0.94F);
+ LogDebug("NXDN, EHR, AMBE FEC %u/94 (%.1f%%)", errors, float(errors) / 0.94F);
+ }
+
+ CNXDNFACCH1 facch1;
+ facch1.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS + NXDN_FACCH1_LENGTH_BITS);
+ } else {
+ CNXDNFACCH1 facch11;
+ facch11.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS);
+
+ CNXDNFACCH1 facch12;
+ facch12.decode(data + 2U, NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS + NXDN_FACCH1_LENGTH_BITS);
}
#ifdef notdef
@@ -579,65 +635,36 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
bool CNXDNControl::processData(unsigned char option, unsigned char *data)
{
- if (option == NXDN_LICH_STEAL_FACCH) {
- CNXDNFACCH2 facch2;
- bool valid = facch2.decode(data + 2U);
- if (valid) {
- unsigned char ran = facch2.getRAN();
- if (ran != m_ran && ran != 0U)
- return false;
+ CNXDNUDCH udch;
+ bool valid = udch.decode(data + 2U);
+ if (valid) {
+ unsigned char ran = udch.getRAN();
+ if (ran != m_ran && ran != 0U)
+ return false;
- data[0U] = TAG_DATA;
- data[1U] = 0x00U;
+ data[0U] = TAG_DATA;
+ data[1U] = 0x00U;
- CSync::addNXDNSync(data + 2U);
+ CSync::addNXDNSync(data + 2U);
- CNXDNLICH lich;
- lich.setRFCT(NXDN_LICH_RFCT_RDCH);
- lich.setFCT(NXDN_LICH_USC_UDCH);
- lich.setOption(NXDN_LICH_STEAL_FACCH);
- lich.setDirection(m_remoteGateway ? NXDN_LICH_DIRECTION_INBOUND : NXDN_LICH_DIRECTION_OUTBOUND);
- lich.encode(data + 2U);
+ CNXDNLICH lich;
+ lich.setRFCT(NXDN_LICH_RFCT_RDCH);
+ lich.setFCT(NXDN_LICH_USC_UDCH);
+ lich.setOption(option);
+ lich.setDirection(m_remoteGateway ? NXDN_LICH_DIRECTION_INBOUND : NXDN_LICH_DIRECTION_OUTBOUND);
+ lich.encode(data + 2U);
- facch2.setRAN(m_ran);
- facch2.encode(data + 2U);
+ udch.setRAN(m_ran);
+ udch.encode(data + 2U);
- writeQueueNet(data);
+ writeQueueNet(data);
- if (m_duplex)
- writeQueueRF(data);
+ if (m_duplex)
+ writeQueueRF(data);
#if defined(DUMP_NXDN)
- writeFile(data + 2U);
+ writeFile(data + 2U);
#endif
- return true;
- }
- } else {
- CNXDNUDCH udch;
- bool valid = udch.decode(data + 2U);
- if (valid) {
- data[0U] = TAG_DATA;
- data[1U] = 0x00U;
-
- CSync::addNXDNSync(data + 2U);
-
- CNXDNLICH lich;
- lich.setRFCT(NXDN_LICH_RFCT_RDCH);
- lich.setFCT(NXDN_LICH_USC_UDCH);
- lich.setOption(NXDN_LICH_STEAL_NONE);
- lich.setDirection(m_remoteGateway ? NXDN_LICH_DIRECTION_INBOUND : NXDN_LICH_DIRECTION_OUTBOUND);
- lich.encode(data + 2U);
-
- udch.encode(data + 2U);
-
- writeQueueNet(data);
-
- if (m_duplex)
- writeQueueRF(data);
-#if defined(DUMP_NXDN)
- writeFile(data + 2U);
-#endif
- return true;
- }
+ return true;
}
#ifdef notdef
diff --git a/NXDNDefines.h b/NXDNDefines.h
index 2cefccc..79f6a2d 100644
--- a/NXDNDefines.h
+++ b/NXDNDefines.h
@@ -88,4 +88,17 @@ const unsigned char NXDN_MESSAGE_TYPE_AUTH_INQ_REQ = 0x28U;
const unsigned char NXDN_MESSAGE_TYPE_AUTH_INQ_RESP = 0x29U;
const unsigned char NXDN_MESSAGE_TYPE_PROP_FORM = 0x3FU;
+const unsigned char NXDN_VOICE_CALL_OPTION_HALF_DUPLEX = 0x00U;
+const unsigned char NXDN_VOICE_CALL_OPTION_DUPLEX = 0x10U;
+
+const unsigned char NXDN_VOICE_CALL_OPTION_4800_EHR = 0x00U;
+const unsigned char NXDN_VOICE_CALL_OPTION_9600_EHR = 0x02U;
+const unsigned char NXDN_VOICE_CALL_OPTION_9600_EFR = 0x03U;
+
+const unsigned char NXDN_DATA_CALL_OPTION_HALF_DUPLEX = 0x00U;
+const unsigned char NXDN_DATA_CALL_OPTION_DUPLEX = 0x10U;
+
+const unsigned char NXDN_DATA_CALL_OPTION_4800 = 0x00U;
+const unsigned char NXDN_DATA_CALL_OPTION_9600 = 0x02U;
+
#endif
diff --git a/NXDNFACCH1.cpp b/NXDNFACCH1.cpp
index d0c1aba..4e14eb7 100644
--- a/NXDNFACCH1.cpp
+++ b/NXDNFACCH1.cpp
@@ -85,25 +85,18 @@ bool CNXDNFACCH1::decode(const unsigned char* data, unsigned int offset)
uint8_t temp2[192U];
- char text[500U];
- ::strcpy(text, "NXDN, FACCH1 de-punctured: ");
-
unsigned int n = 0U;
unsigned int index = 0U;
for (unsigned int i = 0U; i < NXDN_FACCH1_LENGTH_BITS; i++) {
if (n == PUNCTURE_LIST[index]) {
- ::strcat(text, "X, ");
temp2[n++] = 99U;
index++;
}
bool b = READ_BIT1(temp1, i);
temp2[n++] = b ? 1U : 0U;
- ::strcat(text, b ? "1, " : "0, ");
}
- LogMessage(text);
-
CNXDNConvolution conv;
conv.start();
diff --git a/NXDNFACCH2.cpp b/NXDNFACCH2.cpp
deleted file mode 100644
index ac705fa..0000000
--- a/NXDNFACCH2.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
-* Copyright (C) 2018 by Jonathan Naylor G4KLX
-*
-* This program is free software; you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation; either version 2 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "NXDNFACCH2.h"
-
-#include "NXDNDefines.h"
-#include "NXDNUDCH.h"
-#include "Utils.h"
-#include "Log.h"
-
-#include
-#include
-#include
-
-const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U };
-
-#define WRITE_BIT1(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7])
-#define READ_BIT1(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7])
-
-CNXDNFACCH2::CNXDNFACCH2(const CNXDNFACCH2& facch2) :
-m_data(NULL)
-{
- m_data = new unsigned char[23U];
- ::memcpy(m_data, facch2.m_data, 23U);
-}
-
-CNXDNFACCH2::CNXDNFACCH2() :
-m_data(NULL)
-{
- m_data = new unsigned char[23U];
-}
-
-CNXDNFACCH2::~CNXDNFACCH2()
-{
- delete[] m_data;
-}
-
-bool CNXDNFACCH2::decode(const unsigned char* data)
-{
- assert(data != NULL);
-
- CNXDNUDCH udch;
- bool valid = udch.decode(data);
- if (!valid)
- return false;
-
- udch.getData(m_data);
-
- return true;
-}
-
-void CNXDNFACCH2::encode(unsigned char* data) const
-{
- assert(data != NULL);
-
- CNXDNUDCH udch;
-
- udch.setData(m_data);
-
- udch.encode(data);
-}
-
-unsigned char CNXDNFACCH2::getRAN() const
-{
- return m_data[0U] & 0x3FU;
-}
-
-void CNXDNFACCH2::getData(unsigned char* data) const
-{
- assert(data != NULL);
-
- ::memcpy(data, m_data + 1U, 22U);
-}
-
-void CNXDNFACCH2::setRAN(unsigned char ran)
-{
- m_data[0U] &= 0xC0U;
- m_data[0U] |= ran;
-}
-
-void CNXDNFACCH2::setData(const unsigned char* data)
-{
- assert(data != NULL);
-
- ::memcpy(m_data + 1U, data, 22U);
-}
-
-CNXDNFACCH2& CNXDNFACCH2::operator=(const CNXDNFACCH2& facch2)
-{
- if (&facch2 != this)
- ::memcpy(m_data, facch2.m_data, 23U);
-
- return *this;
-}
diff --git a/NXDNFACCH2.h b/NXDNFACCH2.h
deleted file mode 100644
index 7f8ee57..0000000
--- a/NXDNFACCH2.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
-* Copyright (C) 2018 by Jonathan Naylor G4KLX
-*
-* This program is free software; you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation; either version 2 of the License, or
-* (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program; if not, write to the Free Software
-* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#if !defined(NXDNFACCH2_H)
-#define NXDNFACCH2_H
-
-class CNXDNFACCH2 {
-public:
- CNXDNFACCH2(const CNXDNFACCH2& facch);
- CNXDNFACCH2();
- ~CNXDNFACCH2();
-
- bool decode(const unsigned char* data);
-
- void encode(unsigned char* data) const;
-
- unsigned char getRAN() const;
-
- void getData(unsigned char* data) const;
-
- void setRAN(unsigned char ran);
-
- void setData(const unsigned char* data);
-
- CNXDNFACCH2& operator=(const CNXDNFACCH2& facch);
-
-private:
- unsigned char* m_data;
-};
-
-#endif
diff --git a/NXDNLayer3.cpp b/NXDNLayer3.cpp
index bde954c..f4da16b 100644
--- a/NXDNLayer3.cpp
+++ b/NXDNLayer3.cpp
@@ -88,6 +88,11 @@ bool CNXDNLayer3::getIsGroup() const
return (m_data[2U] & 0x80U) != 0x80U;
}
+unsigned char CNXDNLayer3::getCallOptions() const
+{
+ return m_data[2U] & 0x1FU;
+}
+
CNXDNLayer3& CNXDNLayer3::operator=(const CNXDNLayer3& layer3)
{
if (&layer3 != this)
diff --git a/NXDNLayer3.h b/NXDNLayer3.h
index f91d34d..81aff2b 100644
--- a/NXDNLayer3.h
+++ b/NXDNLayer3.h
@@ -33,6 +33,7 @@ public:
unsigned short getSourceUnitId() const;
unsigned short getDestinationGroupId() const;
bool getIsGroup() const;
+ unsigned char getCallOptions() const;
CNXDNLayer3& operator=(const CNXDNLayer3& layer3);
diff --git a/NXDNSACCH.cpp b/NXDNSACCH.cpp
index 803e702..94fee46 100755
--- a/NXDNSACCH.cpp
+++ b/NXDNSACCH.cpp
@@ -79,25 +79,18 @@ bool CNXDNSACCH::decode(const unsigned char* data)
uint8_t temp2[72U];
- char text[500U];
- ::strcpy(text, "NXDN, SACCH de-punctured: ");
-
unsigned int n = 0U;
unsigned int index = 0U;
for (unsigned int i = 0U; i < NXDN_SACCH_LENGTH_BITS; i++) {
if (n == PUNCTURE_LIST[index]) {
- ::strcat(text, "X, ");
temp2[n++] = 99U;
index++;
}
bool b = READ_BIT1(temp1, i);
temp2[n++] = b ? 1U : 0U;
- ::strcat(text, b ? "1, " : "0, ");
}
- LogMessage(text);
-
CNXDNConvolution conv;
conv.start();
diff --git a/NXDNUDCH.cpp b/NXDNUDCH.cpp
index 4c1d707..e58460e 100644
--- a/NXDNUDCH.cpp
+++ b/NXDNUDCH.cpp
@@ -106,25 +106,18 @@ bool CNXDNUDCH::decode(const unsigned char* data)
uint8_t temp2[406U];
- char text[500U];
- ::strcpy(text, "NXDN, UDCH/FACCH2 de-punctured: ");
-
unsigned int n = 0U;
unsigned int index = 0U;
for (unsigned int i = 0U; i < NXDN_FACCH2_LENGTH_BITS; i++) {
if (n == PUNCTURE_LIST[index]) {
- ::strcat(text, "X, ");
temp2[n++] = 99U;
index++;
}
bool b = READ_BIT1(temp1, i);
temp2[n++] = b ? 1U : 0U;
- ::strcat(text, b ? "1, " : "0, ");
}
- LogMessage(text);
-
CNXDNConvolution conv;
conv.start();
@@ -189,18 +182,29 @@ void CNXDNUDCH::encode(unsigned char* data) const
}
}
+unsigned char CNXDNUDCH::getRAN() const
+{
+ return m_data[0U] & 0x3FU;
+}
+
void CNXDNUDCH::getData(unsigned char* data) const
{
assert(data != NULL);
- ::memcpy(data, m_data, 23U);
+ ::memcpy(data, m_data + 1U, 22U);
+}
+
+void CNXDNUDCH::setRAN(unsigned char ran)
+{
+ m_data[0U] &= 0xC0U;
+ m_data[0U] |= ran;
}
void CNXDNUDCH::setData(const unsigned char* data)
{
assert(data != NULL);
- ::memcpy(m_data, data, 23U);
+ ::memcpy(m_data + 1U, data, 22U);
}
CNXDNUDCH& CNXDNUDCH::operator=(const CNXDNUDCH& udch)
diff --git a/NXDNUDCH.h b/NXDNUDCH.h
index 6847c9c..366cd09 100644
--- a/NXDNUDCH.h
+++ b/NXDNUDCH.h
@@ -29,8 +29,12 @@ public:
void encode(unsigned char* data) const;
+ unsigned char getRAN() const;
+
void getData(unsigned char* data) const;
+ void setRAN(unsigned char ran);
+
void setData(const unsigned char* data);
CNXDNUDCH& operator=(const CNXDNUDCH& udch);