diff --git a/Modem.h b/Modem.h index 566ebbd..faf0917 100644 --- a/Modem.h +++ b/Modem.h @@ -55,9 +55,6 @@ public: virtual unsigned int readM17Data(unsigned char* data) = 0; virtual unsigned int readFMData(unsigned char* data) = 0; virtual unsigned int readAX25Data(unsigned char* data) = 0; - virtual unsigned int readTransparentData(unsigned char* data) = 0; - - virtual unsigned int readSerial(unsigned char* data, unsigned int length) = 0; virtual bool hasDStarSpace() const = 0; virtual bool hasDMRSpace1() const = 0; @@ -88,8 +85,6 @@ public: virtual bool writeFMData(const unsigned char* data, unsigned int length) = 0; virtual bool writeAX25Data(const unsigned char* data, unsigned int length) = 0; - virtual bool writeTransparentData(const unsigned char* data, unsigned int length) = 0; - virtual bool writeDStarInfo(const char* my1, const char* my2, const char* your, const char* type, const char* reflector) = 0; virtual bool writeDMRInfo(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type) = 0; virtual bool writeYSFInfo(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin) = 0; @@ -103,7 +98,11 @@ public: virtual bool writeDMRShortLC(const unsigned char* lc) = 0; virtual bool writeDMRAbort(unsigned int slotNo) = 0; + virtual bool writeTransparentData(const unsigned char* data, unsigned int length) = 0; + virtual unsigned int readTransparentData(unsigned char* data) = 0; + virtual bool writeSerial(const unsigned char* data, unsigned int length) = 0; + virtual unsigned int readSerial(unsigned char* data, unsigned int length) = 0; virtual unsigned char getMode() const = 0; virtual bool setMode(unsigned char mode) = 0; diff --git a/NullModem.h b/NullModem.h index 6126313..83e60d6 100644 --- a/NullModem.h +++ b/NullModem.h @@ -57,9 +57,6 @@ public: virtual unsigned int readM17Data(unsigned char* data) { return 0U; }; virtual unsigned int readFMData(unsigned char* data) { return 0U; }; virtual unsigned int readAX25Data(unsigned char* data) { return 0U; }; - virtual unsigned int readTransparentData(unsigned char* data) { return 0U; }; - - virtual unsigned int readSerial(unsigned char* data, unsigned int length) { return 0; }; virtual bool hasDStarSpace()const { return true; }; virtual bool hasDMRSpace1() const { return true; }; @@ -89,8 +86,6 @@ public: virtual bool writeFMData(const unsigned char* data, unsigned int length) { return true; }; virtual bool writeAX25Data(const unsigned char* data, unsigned int length) { return true; }; - virtual bool writeTransparentData(const unsigned char* data, unsigned int length) { return true; }; - virtual bool writeConfig() { return true; }; virtual bool writeDStarInfo(const char* my1, const char* my2, const char* your, const char* type, const char* reflector) { return true; }; virtual bool writeDMRInfo(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type) { return true; }; @@ -105,7 +100,11 @@ public: virtual bool writeDMRShortLC(const unsigned char* lc) { return true; }; virtual bool writeDMRAbort(unsigned int slotNo) { return true; }; + virtual bool writeTransparentData(const unsigned char* data, unsigned int length) { return true; }; + virtual unsigned int readTransparentData(unsigned char* data) { return 0U; }; + virtual bool writeSerial(const unsigned char* data, unsigned int length) { return true; }; + virtual unsigned int readSerial(unsigned char* data, unsigned int length) { return 0U; }; virtual unsigned char getMode() const { return MODE_IDLE; }; virtual bool setMode(unsigned char mode) { return true; }; diff --git a/SerialModem.cpp b/SerialModem.cpp index 8f498d2..3d7652d 100644 --- a/SerialModem.cpp +++ b/SerialModem.cpp @@ -182,6 +182,8 @@ m_rxFMData(5000U, "Modem RX FM"), m_txFMData(5000U, "Modem TX FM"), m_rxAX25Data(1000U, "Modem RX AX.25"), m_txAX25Data(1000U, "Modem TX AX.25"), +m_rxSerialData(1000U, "Modem RX Serial"), +m_txSerialData(1000U, "Modem TX Serial"), m_rxTransparentData(1000U, "Modem RX Transparent"), m_txTransparentData(1000U, "Modem TX Transparent"), m_sendTransparentDataFrameType(0U), @@ -865,20 +867,9 @@ void CSerialModem::clock(unsigned int ms) break; case MMDVM_SERIAL_DATA: - //MMDVMHost does not process serial data from the display, - // so we send it to the transparent port if sendFrameType==1 - if (m_sendTransparentDataFrameType > 0U) { - if (m_trace) - CUtils::dump(1U, "RX Serial Data", m_buffer, m_length); - - unsigned char offset = m_sendTransparentDataFrameType; - if (offset > 1U) offset = 1U; - unsigned char data = m_length - m_offset + offset; - m_rxTransparentData.addData(&data, 1U); - - m_rxTransparentData.addData(m_buffer + m_offset - offset, m_length - m_offset + offset); - break; //only break when sendFrameType>0, else message is unknown - } + if (m_trace) + CUtils::dump(1U, "RX Serial Data", m_buffer, m_length); + m_rxSerialData.addData(m_buffer + m_offset, m_length - m_offset); break; default: @@ -1099,6 +1090,19 @@ void CSerialModem::clock(unsigned int ms) if (ret != int(len)) LogWarning("Error when writing Transparent data to the MMDVM"); } + + if (!m_txSerialData.isEmpty()) { + unsigned char len = 0U; + m_txSerialData.getData(&len, 1U); + m_txSerialData.getData(m_buffer, len); + + if (m_trace) + CUtils::dump(1U, "TX Serial Data", m_buffer, len); + + int ret = m_serial->write(m_buffer, len); + if (ret != int(len)) + LogWarning("Error when writing Serial data to the MMDVM"); + } } void CSerialModem::close() @@ -1250,13 +1254,18 @@ unsigned int CSerialModem::readTransparentData(unsigned char* data) return len; } -// To be implemented later if needed unsigned int CSerialModem::readSerial(unsigned char* data, unsigned int length) { assert(data != NULL); assert(length > 0U); - return 0U; + unsigned int n = 0U; + while (!m_rxSerialData.isEmpty() && n < length) { + m_rxSerialData.getData(data + n, 1U); + n++; + } + + return n; } bool CSerialModem::hasDStarSpace() const @@ -1826,9 +1835,11 @@ bool CSerialModem::writeSerial(const unsigned char* data, unsigned int length) ::memcpy(buffer + 3U, data, length); - int ret = m_serial->write(buffer, length + 3U); + unsigned char len = length + 3U; + m_txSerialData.addData(&len, 1U); + m_txSerialData.addData(buffer, len); - return ret != int(length + 3U); + return true; } bool CSerialModem::hasTX() const diff --git a/SerialModem.h b/SerialModem.h index 45bfea7..4b56077 100644 --- a/SerialModem.h +++ b/SerialModem.h @@ -75,9 +75,6 @@ public: virtual unsigned int readM17Data(unsigned char* data); virtual unsigned int readFMData(unsigned char* data); virtual unsigned int readAX25Data(unsigned char* data); - virtual unsigned int readTransparentData(unsigned char* data); - - virtual unsigned int readSerial(unsigned char* data, unsigned int length); virtual bool hasDStarSpace() const; virtual bool hasDMRSpace1() const; @@ -108,8 +105,6 @@ public: virtual bool writeFMData(const unsigned char* data, unsigned int length); virtual bool writeAX25Data(const unsigned char* data, unsigned int length); - virtual bool writeTransparentData(const unsigned char* data, unsigned int length); - virtual bool writeDStarInfo(const char* my1, const char* my2, const char* your, const char* type, const char* reflector); virtual bool writeDMRInfo(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type); virtual bool writeYSFInfo(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin); @@ -123,7 +118,11 @@ public: virtual bool writeDMRShortLC(const unsigned char* lc); virtual bool writeDMRAbort(unsigned int slotNo); + virtual bool writeTransparentData(const unsigned char* data, unsigned int length); + virtual unsigned int readTransparentData(unsigned char* data); + virtual bool writeSerial(const unsigned char* data, unsigned int length); + virtual unsigned int readSerial(unsigned char* data, unsigned int length); virtual unsigned char getMode() const; virtual bool setMode(unsigned char mode); @@ -205,6 +204,8 @@ private: CRingBuffer m_txFMData; CRingBuffer m_rxAX25Data; CRingBuffer m_txAX25Data; + CRingBuffer m_rxSerialData; + CRingBuffer m_txSerialData; CRingBuffer m_rxTransparentData; CRingBuffer m_txTransparentData; unsigned int m_sendTransparentDataFrameType;