Handle returned modem serial data properly.

This commit is contained in:
Jonathan Naylor 2020-11-13 14:56:39 +00:00
parent a98f65e3aa
commit 2618a14ae5
4 changed files with 43 additions and 33 deletions

View file

@ -55,9 +55,6 @@ public:
virtual unsigned int readM17Data(unsigned char* data) = 0; virtual unsigned int readM17Data(unsigned char* data) = 0;
virtual unsigned int readFMData(unsigned char* data) = 0; virtual unsigned int readFMData(unsigned char* data) = 0;
virtual unsigned int readAX25Data(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 hasDStarSpace() const = 0;
virtual bool hasDMRSpace1() 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 writeFMData(const unsigned char* data, unsigned int length) = 0;
virtual bool writeAX25Data(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 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 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; 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 writeDMRShortLC(const unsigned char* lc) = 0;
virtual bool writeDMRAbort(unsigned int slotNo) = 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 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 unsigned char getMode() const = 0;
virtual bool setMode(unsigned char mode) = 0; virtual bool setMode(unsigned char mode) = 0;

View file

@ -57,9 +57,6 @@ public:
virtual unsigned int readM17Data(unsigned char* data) { return 0U; }; virtual unsigned int readM17Data(unsigned char* data) { return 0U; };
virtual unsigned int readFMData(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 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 hasDStarSpace()const { return true; };
virtual bool hasDMRSpace1() 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 writeFMData(const unsigned char* data, unsigned int length) { return true; };
virtual bool writeAX25Data(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 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 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; }; 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 writeDMRShortLC(const unsigned char* lc) { return true; };
virtual bool writeDMRAbort(unsigned int slotNo) { 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 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 unsigned char getMode() const { return MODE_IDLE; };
virtual bool setMode(unsigned char mode) { return true; }; virtual bool setMode(unsigned char mode) { return true; };

View file

@ -182,6 +182,8 @@ m_rxFMData(5000U, "Modem RX FM"),
m_txFMData(5000U, "Modem TX FM"), m_txFMData(5000U, "Modem TX FM"),
m_rxAX25Data(1000U, "Modem RX AX.25"), m_rxAX25Data(1000U, "Modem RX AX.25"),
m_txAX25Data(1000U, "Modem TX 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_rxTransparentData(1000U, "Modem RX Transparent"),
m_txTransparentData(1000U, "Modem TX Transparent"), m_txTransparentData(1000U, "Modem TX Transparent"),
m_sendTransparentDataFrameType(0U), m_sendTransparentDataFrameType(0U),
@ -865,20 +867,9 @@ void CSerialModem::clock(unsigned int ms)
break; break;
case MMDVM_SERIAL_DATA: case MMDVM_SERIAL_DATA:
//MMDVMHost does not process serial data from the display, if (m_trace)
// so we send it to the transparent port if sendFrameType==1 CUtils::dump(1U, "RX Serial Data", m_buffer, m_length);
if (m_sendTransparentDataFrameType > 0U) { m_rxSerialData.addData(m_buffer + m_offset, m_length - m_offset);
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
}
break; break;
default: default:
@ -1099,6 +1090,19 @@ void CSerialModem::clock(unsigned int ms)
if (ret != int(len)) if (ret != int(len))
LogWarning("Error when writing Transparent data to the MMDVM"); 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() void CSerialModem::close()
@ -1250,13 +1254,18 @@ unsigned int CSerialModem::readTransparentData(unsigned char* data)
return len; return len;
} }
// To be implemented later if needed
unsigned int CSerialModem::readSerial(unsigned char* data, unsigned int length) unsigned int CSerialModem::readSerial(unsigned char* data, unsigned int length)
{ {
assert(data != NULL); assert(data != NULL);
assert(length > 0U); 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 bool CSerialModem::hasDStarSpace() const
@ -1826,9 +1835,11 @@ bool CSerialModem::writeSerial(const unsigned char* data, unsigned int length)
::memcpy(buffer + 3U, data, 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 bool CSerialModem::hasTX() const

View file

@ -75,9 +75,6 @@ public:
virtual unsigned int readM17Data(unsigned char* data); virtual unsigned int readM17Data(unsigned char* data);
virtual unsigned int readFMData(unsigned char* data); virtual unsigned int readFMData(unsigned char* data);
virtual unsigned int readAX25Data(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 hasDStarSpace() const;
virtual bool hasDMRSpace1() const; virtual bool hasDMRSpace1() const;
@ -108,8 +105,6 @@ public:
virtual bool writeFMData(const unsigned char* data, unsigned int length); virtual bool writeFMData(const unsigned char* data, unsigned int length);
virtual bool writeAX25Data(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 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 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); 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 writeDMRShortLC(const unsigned char* lc);
virtual bool writeDMRAbort(unsigned int slotNo); 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 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 unsigned char getMode() const;
virtual bool setMode(unsigned char mode); virtual bool setMode(unsigned char mode);
@ -205,6 +204,8 @@ private:
CRingBuffer<unsigned char> m_txFMData; CRingBuffer<unsigned char> m_txFMData;
CRingBuffer<unsigned char> m_rxAX25Data; CRingBuffer<unsigned char> m_rxAX25Data;
CRingBuffer<unsigned char> m_txAX25Data; CRingBuffer<unsigned char> m_txAX25Data;
CRingBuffer<unsigned char> m_rxSerialData;
CRingBuffer<unsigned char> m_txSerialData;
CRingBuffer<unsigned char> m_rxTransparentData; CRingBuffer<unsigned char> m_rxTransparentData;
CRingBuffer<unsigned char> m_txTransparentData; CRingBuffer<unsigned char> m_txTransparentData;
unsigned int m_sendTransparentDataFrameType; unsigned int m_sendTransparentDataFrameType;