diff --git a/DMRNetwork.cpp b/DMRNetwork.cpp index c9f251a..0b1edcf 100644 --- a/DMRNetwork.cpp +++ b/DMRNetwork.cpp @@ -46,6 +46,7 @@ m_slot1(slot1), m_slot2(slot2), m_jitterEnabled(jitterEnabled), m_jitterBuffers(NULL), +m_delayBuffers(NULL), m_hwType(hwType), m_status(WAITING_CONNECT), m_retryTimer(1000U, 10U), @@ -79,11 +80,16 @@ m_beacon(false) m_salt = new unsigned char[sizeof(uint32_t)]; m_id = new uint8_t[4U]; m_streamId = new uint32_t[2U]; + m_jitterBuffers = new CJitterBuffer*[3U]; + m_delayBuffers = new CDelayBuffer*[3U]; m_jitterBuffers[1U] = new CJitterBuffer("DMR Slot 1", 60U, DMR_SLOT_TIME, jitter, 256U, debug); m_jitterBuffers[2U] = new CJitterBuffer("DMR Slot 2", 60U, DMR_SLOT_TIME, jitter, 256U, debug); + m_delayBuffers[1U] = new CDelayBuffer("DMR Slot 1", 60U, DMR_SLOT_TIME, jitter, debug); + m_delayBuffers[2U] = new CDelayBuffer("DMR Slot 2", 60U, DMR_SLOT_TIME, jitter, debug); + m_id[0U] = id >> 24; m_id[1U] = id >> 16; m_id[2U] = id >> 8; @@ -101,11 +107,16 @@ CDMRNetwork::~CDMRNetwork() delete m_jitterBuffers[1U]; delete m_jitterBuffers[2U]; + delete m_delayBuffers[1U]; + delete m_delayBuffers[2U]; + delete[] m_buffer; delete[] m_salt; delete[] m_streamId; delete[] m_id; + delete[] m_jitterBuffers; + delete[] m_delayBuffers; } void CDMRNetwork::setOptions(const std::string& options) @@ -151,8 +162,14 @@ bool CDMRNetwork::read(CDMRData& data) for (unsigned int slotNo = 1U; slotNo <= 2U; slotNo++) { unsigned int length = 0U; - JB_STATUS status = m_jitterBuffers[slotNo]->getData(m_buffer, length); - if (status != JBS_NO_DATA) { + B_STATUS status = BS_NO_DATA; + + if (m_jitterEnabled) + status = m_jitterBuffers[slotNo]->getData(m_buffer, length); + else + status = m_delayBuffers[slotNo]->getData(m_buffer, length); + + if (status != BS_NO_DATA) { unsigned char seqNo = m_buffer[4U]; unsigned int srcId = (m_buffer[5U] << 16) | (m_buffer[6U] << 8) | (m_buffer[7U] << 0); @@ -166,7 +183,7 @@ bool CDMRNetwork::read(CDMRData& data) data.setSrcId(srcId); data.setDstId(dstId); data.setFLCO(flco); - data.setMissing(status == JBS_MISSING); + data.setMissing(status == BS_MISSING); bool dataSync = (m_buffer[15U] & 0x20U) == 0x20U; bool voiceSync = (m_buffer[15U] & 0x10U) == 0x10U; @@ -331,6 +348,9 @@ void CDMRNetwork::clock(unsigned int ms) m_jitterBuffers[1U]->clock(ms); m_jitterBuffers[2U]->clock(ms); + m_delayBuffers[1U]->clock(ms); + m_delayBuffers[2U]->clock(ms); + if (m_status == WAITING_CONNECT) { m_retryTimer.clock(ms); if (m_retryTimer.isRunning() && m_retryTimer.hasExpired()) { @@ -475,9 +495,11 @@ void CDMRNetwork::reset(unsigned int slotNo) if (slotNo == 1U) { m_jitterBuffers[1U]->reset(); + m_delayBuffers[1U]->reset(); m_streamId[0U] = ::rand() + 1U; } else { m_jitterBuffers[2U]->reset(); + m_delayBuffers[2U]->reset(); m_streamId[1U] = ::rand() + 1U; } } @@ -514,7 +536,7 @@ void CDMRNetwork::receiveData(const unsigned char* data, unsigned int length) m_jitterBuffers[slotNo]->addData(data, length, seqNo); } } else { - m_jitterBuffers[slotNo]->appendData(data, length); + m_delayBuffers[slotNo]->addData(data, length); } } diff --git a/DMRNetwork.h b/DMRNetwork.h index cfacb77..799b2bc 100644 --- a/DMRNetwork.h +++ b/DMRNetwork.h @@ -20,6 +20,7 @@ #define DMRNetwork_H #include "JitterBuffer.h" +#include "DelayBuffer.h" #include "UDPSocket.h" #include "Timer.h" #include "DMRData.h" @@ -72,6 +73,7 @@ private: bool m_slot2; bool m_jitterEnabled; CJitterBuffer** m_jitterBuffers; + CDelayBuffer** m_delayBuffers; HW_TYPE m_hwType; enum STATUS { diff --git a/DMRSlot.cpp b/DMRSlot.cpp index 3b0f2e1..7db9c53 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -562,6 +562,9 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) if (m_rfState == RS_RF_AUDIO) { m_rfN = data[1U] & 0x0FU; + if(m_rfN > 5U) + return false; + unsigned int errors = 0U; unsigned char fid = m_rfLC->getFID(); if (fid == FID_ETSI || fid == FID_DMRA) { @@ -802,6 +805,9 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) m_rfN = data[1U] & 0x0FU; + if(m_rfN > 5U) + return false; + // Regenerate the EMB emb.getData(data + 2U); @@ -1540,8 +1546,10 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) m_display->writeDMR(m_slotNo, src, gi, dst, "N"); } } else if (dataType == DT_RATE_12_DATA || dataType == DT_RATE_34_DATA || dataType == DT_RATE_1_DATA) { - if (m_netState != RS_NET_DATA || m_netFrames == 0U) + if (m_netState != RS_NET_DATA || m_netFrames == 0U) { + writeEndNet(); return; + } // Regenerate the rate 1/2 payload if (dataType == DT_RATE_12_DATA) { diff --git a/Defines.h b/Defines.h index ebfcd83..5ca086b 100644 --- a/Defines.h +++ b/Defines.h @@ -58,4 +58,10 @@ enum RPT_NET_STATE { RS_NET_DATA }; +enum B_STATUS { + BS_NO_DATA, + BS_DATA, + BS_MISSING +}; + #endif diff --git a/DelayBuffer.cpp b/DelayBuffer.cpp new file mode 100644 index 0000000..e38125b --- /dev/null +++ b/DelayBuffer.cpp @@ -0,0 +1,137 @@ +/* +* 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 "DelayBuffer.h" + +#include "Log.h" + +#include +#include +#include + +CDelayBuffer::CDelayBuffer(const std::string& name, unsigned int blockSize, unsigned int blockTime, unsigned int jitterTime, bool debug) : +m_name(name), +m_blockSize(blockSize), +m_blockTime(blockTime), +m_debug(debug), +m_timer(1000U, 0U, jitterTime), +m_stopWatch(), +m_running(false), +m_buffer(1000U, name.c_str()), +m_outputCount(0U), +m_lastData(NULL), +m_lastDataLength(0U) +{ + assert(blockSize > 0U); + assert(blockTime > 0U); + assert(jitterTime > 0U); + + m_lastData = new unsigned char[m_blockSize]; + + reset(); +} + +CDelayBuffer::~CDelayBuffer() +{ + delete[] m_lastData; +} + +bool CDelayBuffer::addData(const unsigned char* data, unsigned int length) +{ + assert(data != NULL); + assert(length > 0U); + assert(length == m_blockSize); + + if (m_debug) + LogDebug("%s, DelayBuffer: appending data", m_name.c_str()); + + m_buffer.addData(data, length); + + if (!m_timer.isRunning()) { + LogDebug("%s, DelayBuffer: starting the timer from append", m_name.c_str()); + m_timer.start(); + } + + return true; +} + +B_STATUS CDelayBuffer::getData(unsigned char* data, unsigned int& length) +{ + assert(data != NULL); + + if (!m_running) + return BS_NO_DATA; + + unsigned int needed = m_stopWatch.elapsed() / m_blockTime + 2U; + if (needed <= m_outputCount) + return BS_NO_DATA; + + if (!m_buffer.isEmpty()) { + if (m_debug) + LogDebug("%s, DelayBuffer: returning data, elapsed=%ums", m_name.c_str(), m_stopWatch.elapsed()); + + length = m_buffer.getData(data, m_blockSize); + + // Save this data in case no more data is available next time + ::memcpy(m_lastData, data, length); + m_lastDataLength = length; + + m_outputCount++; + + return BS_DATA; + } + + LogDebug("%s, DelayBuffer: no data available, elapsed=%ums", m_name.c_str(), m_stopWatch.elapsed()); + + // Return the last data frame if we have it + if (m_lastDataLength > 0U) { + LogDebug("%s, DelayBuffer: returning the last received frame", m_name.c_str()); + ::memcpy(data, m_lastData, m_lastDataLength); + length = m_lastDataLength; + + m_outputCount++; + + return BS_MISSING; + } + + return BS_NO_DATA; +} + +void CDelayBuffer::reset() +{ + m_buffer.clear(); + + m_lastDataLength = 0U; + + m_outputCount = 0U; + + m_timer.stop(); + + m_running = false; +} + +void CDelayBuffer::clock(unsigned int ms) +{ + m_timer.clock(ms); + if (m_timer.isRunning() && m_timer.hasExpired()) { + if (!m_running) { + m_stopWatch.start(); + m_running = true; + } + } +} diff --git a/DelayBuffer.h b/DelayBuffer.h new file mode 100644 index 0000000..d773f26 --- /dev/null +++ b/DelayBuffer.h @@ -0,0 +1,57 @@ +/* +* 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(DELAYBUFFER_H) +#define DELAYBUFFER_H + +#include "RingBuffer.h" +#include "StopWatch.h" +#include "Defines.h" +#include "Timer.h" + +#include + +class CDelayBuffer { +public: + CDelayBuffer(const std::string& name, unsigned int blockSize, unsigned int blockTime, unsigned int jitterTime, bool debug); + ~CDelayBuffer(); + + bool addData(const unsigned char* data, unsigned int length); + + B_STATUS getData(unsigned char* data, unsigned int& length); + + void reset(); + + void clock(unsigned int ms); + +private: + std::string m_name; + unsigned int m_blockSize; + unsigned int m_blockTime; + bool m_debug; + CTimer m_timer; + CStopWatch m_stopWatch; + bool m_running; + CRingBuffer m_buffer; + unsigned int m_outputCount; + + unsigned char* m_lastData; + unsigned int m_lastDataLength; +}; + +#endif diff --git a/JitterBuffer.cpp b/JitterBuffer.cpp index 25522ec..3af4f48 100644 --- a/JitterBuffer.cpp +++ b/JitterBuffer.cpp @@ -162,16 +162,16 @@ bool CJitterBuffer::appendData(const unsigned char* data, unsigned int length) return true; } -JB_STATUS CJitterBuffer::getData(unsigned char* data, unsigned int& length) +B_STATUS CJitterBuffer::getData(unsigned char* data, unsigned int& length) { assert(data != NULL); if (!m_running) - return JBS_NO_DATA; + return BS_NO_DATA; unsigned int sequenceNumber = m_stopWatch.elapsed() / m_blockTime + 2U; if (m_headSequenceNumber > sequenceNumber) - return JBS_NO_DATA; + return BS_NO_DATA; unsigned int head = m_headSequenceNumber % m_blockCount; @@ -190,7 +190,7 @@ JB_STATUS CJitterBuffer::getData(unsigned char* data, unsigned int& length) m_buffer[head].m_length = 0U; - return JBS_DATA; + return BS_DATA; } m_buffer[head].m_length = 0U; @@ -203,10 +203,10 @@ JB_STATUS CJitterBuffer::getData(unsigned char* data, unsigned int& length) ::memcpy(data, m_lastData, m_lastDataLength); length = m_lastDataLength; - return JBS_MISSING; + return BS_MISSING; } - return JBS_NO_DATA; + return BS_NO_DATA; } void CJitterBuffer::reset() diff --git a/JitterBuffer.h b/JitterBuffer.h index 46575ee..9a9f1fe 100644 --- a/JitterBuffer.h +++ b/JitterBuffer.h @@ -20,16 +20,11 @@ #define JITTERBUFFER_H #include "StopWatch.h" +#include "Defines.h" #include "Timer.h" #include -enum JB_STATUS { - JBS_NO_DATA, - JBS_DATA, - JBS_MISSING -}; - class CJitterBuffer { public: CJitterBuffer(const std::string& name, unsigned int blockSize, unsigned int blockTime, unsigned int jitterTime, unsigned int topSequenceNumber, bool debug); @@ -38,7 +33,7 @@ public: bool addData(const unsigned char* data, unsigned int length, unsigned int sequenceNumber); bool appendData(const unsigned char* data, unsigned int length); - JB_STATUS getData(unsigned char* data, unsigned int& length); + B_STATUS getData(unsigned char* data, unsigned int& length); void reset(); diff --git a/MMDVMHost.vcxproj b/MMDVMHost.vcxproj index 5e39637..cce09e7 100644 --- a/MMDVMHost.vcxproj +++ b/MMDVMHost.vcxproj @@ -158,6 +158,7 @@ + @@ -243,6 +244,7 @@ + diff --git a/MMDVMHost.vcxproj.filters b/MMDVMHost.vcxproj.filters index 8eedd67..8eb6927 100644 --- a/MMDVMHost.vcxproj.filters +++ b/MMDVMHost.vcxproj.filters @@ -263,6 +263,9 @@ Header Files + + Header Files + @@ -493,5 +496,8 @@ Source Files + + Source Files + \ No newline at end of file diff --git a/Makefile b/Makefile index 12f36e8..2f5458c 100644 --- a/Makefile +++ b/Makefile @@ -7,12 +7,13 @@ LIBS = -lpthread LDFLAGS = -g 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 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 + AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o DelayBuffer.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 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 all: MMDVMHost diff --git a/Makefile.Pi b/Makefile.Pi index 7379f9f..1fd9f1a 100644 --- a/Makefile.Pi +++ b/Makefile.Pi @@ -7,12 +7,13 @@ LIBS = -lwiringPi -lwiringPiDev -lpthread LDFLAGS = -g -L/usr/local/lib 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 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 + AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o DelayBuffer.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 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 all: MMDVMHost diff --git a/Makefile.Pi.Adafruit b/Makefile.Pi.Adafruit index 564c4a4..937f035 100644 --- a/Makefile.Pi.Adafruit +++ b/Makefile.Pi.Adafruit @@ -7,12 +7,13 @@ LIBS = -lwiringPi -lwiringPiDev -lpthread LDFLAGS = -g -L/usr/local/lib 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 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 + AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o DelayBuffer.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 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 all: MMDVMHost diff --git a/Makefile.Pi.HD44780 b/Makefile.Pi.HD44780 index dbb7df5..94951a5 100644 --- a/Makefile.Pi.HD44780 +++ b/Makefile.Pi.HD44780 @@ -7,12 +7,13 @@ LIBS = -lwiringPi -lwiringPiDev -lpthread LDFLAGS = -g -L/usr/local/lib 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 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 + AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o DelayBuffer.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 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 all: MMDVMHost diff --git a/Makefile.Pi.OLED b/Makefile.Pi.OLED index 19c0c62..a08c802 100644 --- a/Makefile.Pi.OLED +++ b/Makefile.Pi.OLED @@ -7,12 +7,13 @@ LIBS = -lArduiPi_OLED -li2c -lpthread LDFLAGS = -g -L/usr/local/lib 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 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 + AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o DelayBuffer.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 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 all: MMDVMHost diff --git a/Makefile.Pi.PCF8574 b/Makefile.Pi.PCF8574 index 5d28a2b..9c69817 100644 --- a/Makefile.Pi.PCF8574 +++ b/Makefile.Pi.PCF8574 @@ -7,12 +7,13 @@ LIBS = -lwiringPi -lwiringPiDev -lpthread LDFLAGS = -g -L/usr/local/lib 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 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 + AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o DelayBuffer.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 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 all: MMDVMHost diff --git a/Makefile.Solaris b/Makefile.Solaris index d40317f..8626840 100644 --- a/Makefile.Solaris +++ b/Makefile.Solaris @@ -7,12 +7,13 @@ LIBS = -lpthread -lsocket LDFLAGS = -g 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 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 + AMBEFEC.o BCH.o BPTC19696.o Conf.o CRC.o DelayBuffer.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 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 all: MMDVMHost diff --git a/Nextion.cpp b/Nextion.cpp index c72146a..24c9d75 100644 --- a/Nextion.cpp +++ b/Nextion.cpp @@ -207,15 +207,6 @@ void CNextion::writeDStarInt(const char* my1, const char* my2, const char* your, void CNextion::writeDStarRSSIInt(unsigned char rssi) { - if (m_rssiCount1 == 0U) { - char text[20U]; - ::sprintf(text, "t3.txt=\"-%udBm\"", rssi); - sendCommand(text); - sendCommandAction(47U); - m_rssiCount1 = 1U; - return; - } - m_rssiAccum1 += rssi; m_rssiCount1++; @@ -225,21 +216,12 @@ void CNextion::writeDStarRSSIInt(unsigned char rssi) sendCommand(text); sendCommandAction(47U); m_rssiAccum1 = 0U; - m_rssiCount1 = 1U; + m_rssiCount1 = 0U; } } void CNextion::writeDStarBERInt(float ber) { - if (m_berCount1 == 0U) { - char text[20U]; - ::sprintf(text, "t4.txt=\"%.1f%%\"", ber); - sendCommand(text); - sendCommandAction(48U); - m_berCount1 = 1U; - return; - } - m_berAccum1 += ber; m_berCount1++; @@ -249,7 +231,7 @@ void CNextion::writeDStarBERInt(float ber) sendCommand(text); sendCommandAction(48U); m_berAccum1 = 0.0F; - m_berCount1 = 1U; + m_berCount1 = 0U; } } @@ -341,15 +323,6 @@ void CNextion::writeDMRInt(unsigned int slotNo, const std::string& src, bool gro void CNextion::writeDMRRSSIInt(unsigned int slotNo, unsigned char rssi) { if (slotNo == 1U) { - if (m_rssiCount1 == 0U) { - char text[20U]; - ::sprintf(text, "t4.txt=\"-%udBm\"", rssi); - sendCommand(text); - sendCommandAction(66U); - m_rssiCount1 = 1U; - return; - } - m_rssiAccum1 += rssi; m_rssiCount1++; @@ -359,18 +332,9 @@ void CNextion::writeDMRRSSIInt(unsigned int slotNo, unsigned char rssi) sendCommand(text); sendCommandAction(66U); m_rssiAccum1 = 0U; - m_rssiCount1 = 1U; + m_rssiCount1 = 0U; } } else { - if (m_rssiCount2 == 0U) { - char text[20U]; - ::sprintf(text, "t5.txt=\"-%udBm\"", rssi); - sendCommandAction(74U); - sendCommand(text); - m_rssiCount2 = 1U; - return; - } - m_rssiAccum2 += rssi; m_rssiCount2++; @@ -380,7 +344,7 @@ void CNextion::writeDMRRSSIInt(unsigned int slotNo, unsigned char rssi) sendCommand(text); sendCommandAction(74U); m_rssiAccum2 = 0U; - m_rssiCount2 = 1U; + m_rssiCount2 = 0U; } } } @@ -398,6 +362,7 @@ void CNextion::writeDMRTAInt(unsigned int slotNo, unsigned char* talkerAlias, co if (m_screenLayout == 2U) sendCommand("t2.pco=33808"); sendCommandAction(72U); } + return; } @@ -415,6 +380,7 @@ void CNextion::writeDMRTAInt(unsigned int slotNo, unsigned char* talkerAlias, co sendCommand("t0.pco=1024"); } + sendCommand(text); sendCommandAction(63U); } else { @@ -439,15 +405,6 @@ void CNextion::writeDMRTAInt(unsigned int slotNo, unsigned char* talkerAlias, co void CNextion::writeDMRBERInt(unsigned int slotNo, float ber) { if (slotNo == 1U) { - if (m_berCount1 == 0U) { - char text[20U]; - ::sprintf(text, "t6.txt=\"%.1f%%\"", ber); - sendCommand(text); - sendCommandAction(67U); - m_berCount1 = 1U; - return; - } - m_berAccum1 += ber; m_berCount1++; @@ -457,18 +414,9 @@ void CNextion::writeDMRBERInt(unsigned int slotNo, float ber) sendCommand(text); sendCommandAction(67U); m_berAccum1 = 0U; - m_berCount1 = 1U; + m_berCount1 = 0U; } } else { - if (m_berCount2 == 0U) { - char text[20U]; - ::sprintf(text, "t7.txt=\"%.1f%%\"", ber); - sendCommand(text); - sendCommandAction(75U); - m_berCount2 = 1U; - return; - } - m_berAccum2 += ber; m_berCount2++; @@ -478,7 +426,7 @@ void CNextion::writeDMRBERInt(unsigned int slotNo, float ber) sendCommand(text); sendCommandAction(75U); m_berAccum2 = 0U; - m_berCount2 = 1U; + m_berCount2 = 0U; } } } @@ -553,15 +501,6 @@ void CNextion::writeFusionInt(const char* source, const char* dest, const char* void CNextion::writeFusionRSSIInt(unsigned char rssi) { - if (m_rssiCount1 == 0U) { - char text[20U]; - ::sprintf(text, "t3.txt=\"-%udBm\"", rssi); - sendCommand(text); - sendCommandAction(85U); - m_rssiCount1 = 1U; - return; - } - m_rssiAccum1 += rssi; m_rssiCount1++; @@ -571,21 +510,12 @@ void CNextion::writeFusionRSSIInt(unsigned char rssi) sendCommand(text); sendCommandAction(85U); m_rssiAccum1 = 0U; - m_rssiCount1 = 1U; + m_rssiCount1 = 0U; } } void CNextion::writeFusionBERInt(float ber) { - if (m_berCount1 == 0U) { - char text[20U]; - ::sprintf(text, "t4.txt=\"%.1f%%\"", ber); - sendCommand(text); - sendCommandAction(86U); - m_berCount1 = 1U; - return; - } - m_berAccum1 += ber; m_berCount1++; @@ -595,7 +525,7 @@ void CNextion::writeFusionBERInt(float ber) sendCommand(text); sendCommandAction(86U); m_berAccum1 = 0.0F; - m_berCount1 = 1U; + m_berCount1 = 0U; } } @@ -642,15 +572,6 @@ void CNextion::writeP25Int(const char* source, bool group, unsigned int dest, co void CNextion::writeP25RSSIInt(unsigned char rssi) { - if (m_rssiCount1 == 0U) { - char text[20U]; - ::sprintf(text, "t2.txt=\"-%udBm\"", rssi); - sendCommand(text); - sendCommandAction(104U); - m_rssiCount1 = 1U; - return; - } - m_rssiAccum1 += rssi; m_rssiCount1++; @@ -660,21 +581,12 @@ void CNextion::writeP25RSSIInt(unsigned char rssi) sendCommand(text); sendCommandAction(104U); m_rssiAccum1 = 0U; - m_rssiCount1 = 1U; + m_rssiCount1 = 0U; } } void CNextion::writeP25BERInt(float ber) { - if (m_berCount1 == 0U) { - char text[20U]; - ::sprintf(text, "t3.txt=\"%.1f%%\"", ber); - sendCommand(text); - sendCommandAction(105U); - m_berCount1 = 1U; - return; - } - m_berAccum1 += ber; m_berCount1++; @@ -684,7 +596,7 @@ void CNextion::writeP25BERInt(float ber) sendCommand(text); sendCommandAction(105U); m_berAccum1 = 0.0F; - m_berCount1 = 1U; + m_berCount1 = 0U; } } @@ -730,15 +642,6 @@ void CNextion::writeNXDNInt(const char* source, bool group, unsigned int dest, c void CNextion::writeNXDNRSSIInt(unsigned char rssi) { - if (m_rssiCount1 == 0U) { - char text[20U]; - ::sprintf(text, "t2.txt=\"-%udBm\"", rssi); - sendCommand(text); - sendCommandAction(104U); - m_rssiCount1 = 1U; - return; - } - m_rssiAccum1 += rssi; m_rssiCount1++; @@ -748,21 +651,12 @@ void CNextion::writeNXDNRSSIInt(unsigned char rssi) sendCommand(text); sendCommandAction(104U); m_rssiAccum1 = 0U; - m_rssiCount1 = 1U; + m_rssiCount1 = 0U; } } void CNextion::writeNXDNBERInt(float ber) { - if (m_berCount1 == 0U) { - char text[20U]; - ::sprintf(text, "t3.txt=\"%.1f%%\"", ber); - sendCommand(text); - sendCommandAction(105U); - m_berCount1 = 1U; - return; - } - m_berAccum1 += ber; m_berCount1++; @@ -772,7 +666,7 @@ void CNextion::writeNXDNBERInt(float ber) sendCommand(text); sendCommandAction(105U); m_berAccum1 = 0.0F; - m_berCount1 = 1U; + m_berCount1 = 0U; } } diff --git a/RSSI/RSSI_FC-302_RptrBldrV2.dat b/RSSI/RSSI_FC-302_RptrBldrV2.dat new file mode 100644 index 0000000..aa1e523 --- /dev/null +++ b/RSSI/RSSI_FC-302_RptrBldrV2.dat @@ -0,0 +1,41 @@ +# This file maps the raw RSSI values to dBm values to send to the DMR network. A number of data +# points should be entered and the software will use those to work out the in-between values. +# +# The format of the file is: +# Raw RSSI Value dBm Value +# +# The following values were taken with a Schlumberger Stabilock 4040 radio tester as transmitter +# Radio is a Friendcom FC-302 UHF, 12.5 KHz BW, RSSI PIN 7 directly connected to board +# Setup is MMDVM on a Pi3 with modem "Repeater-Builder STM32-DVM V2", RSSI POT at maximum +# Ralph, dk5ras, 20180204 + +1626 -46 +1622 -49 +1611 -52 +1591 -55 +1547 -58 +1486 -61 +1409 -64 +1344 -67 +1292 -70 +1235 -73 +1155 -76 +1068 -79 +1000 -82 +950 -85 +895 -88 +847 -91 +783 -94 +715 -97 +660 -100 +600 -103 +525 -106 +438 -109 +363 -112 +305 -115 +246 -118 +188 -121 +135 -124 +100 -127 +77 -130 +64 -133