From d8086e468c20c6107bdd454c735594f48406949c Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Tue, 30 Jan 2018 20:41:43 +0000 Subject: [PATCH] Remove FACCH2 processing and add voice body processing. --- MMDVMHost.vcxproj | 2 - MMDVMHost.vcxproj.filters | 6 -- Makefile | 2 +- Makefile.Pi | 2 +- Makefile.Pi.Adafruit | 2 +- Makefile.Pi.HD44780 | 2 +- Makefile.Pi.OLED | 2 +- Makefile.Pi.PCF8574 | 2 +- Makefile.Solaris | 2 +- NXDNControl.cpp | 149 ++++++++++++++++++++++---------------- NXDNDefines.h | 13 ++++ NXDNFACCH1.cpp | 7 -- NXDNFACCH2.cpp | 109 ---------------------------- NXDNFACCH2.h | 46 ------------ NXDNLayer3.cpp | 5 ++ NXDNLayer3.h | 1 + NXDNSACCH.cpp | 7 -- NXDNUDCH.cpp | 22 +++--- NXDNUDCH.h | 4 + 19 files changed, 131 insertions(+), 254 deletions(-) delete mode 100644 NXDNFACCH2.cpp delete mode 100644 NXDNFACCH2.h 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);