From c305359ce5c6752ab9b99b61f2b3c503b8b18603 Mon Sep 17 00:00:00 2001 From: Shawn Chain Date: Tue, 13 Aug 2019 00:43:31 +0800 Subject: [PATCH 1/2] Improve the modem serial repeat --- SerialPort.cpp | 54 ++++++++++++++++++++++---------------------------- SerialPort.h | 1 - 2 files changed, 24 insertions(+), 31 deletions(-) diff --git a/SerialPort.cpp b/SerialPort.cpp index ea0af12..d660966 100644 --- a/SerialPort.cpp +++ b/SerialPort.cpp @@ -85,7 +85,6 @@ m_buffer(), m_ptr(0U), m_len(0U), m_serial_buffer(), -m_serial_ptr(0U), m_serial_len(0U), m_debug(false), m_firstCal(false) @@ -871,55 +870,50 @@ void CSerialPort::process() // Check for any incoming serial data from a device/screen on UART2 // !!Notice!! on powerup the Nextion screen dumps FF FF FF 88 FF FF FF to the serial port. while (availableInt(3U)) - { - uint8_t ch = readInt(3U); + { // read UART2 + m_serial_buffer[m_serial_len++] = readInt(3U); - m_serial_buffer[m_serial_ptr] = ch; - m_serial_ptr++; - // fill the buffer one char at a time + if (m_serial_len >=3 && (m_serial_buffer[m_serial_len - 3] == 0xFF) && (m_serial_buffer[m_serial_len - 2] == 0xFF) && (m_serial_buffer[m_serial_len - 1] == 0xFF)) + { + if (m_serial_len > 3) + serial.writeSerialRpt(m_serial_buffer, m_serial_len); - if (m_serial_len > 128) + // if the last 3 bytes are FF's then the screen is done sending data so send the m_serial_buffer to serial.writeSerialRpt() + // + // TODO - BG5HHP + // modem serial data repeat should be generic instead of coupling with the nextion protocol. + // m_serial_len = 0U; - // if length is > 128 reset it - else - m_serial_len++; - // increase length + continue; } - if ((m_serial_buffer[m_serial_len - 3] == 0xFF) && (m_serial_buffer[m_serial_len - 2] == 0xFF) && (m_serial_buffer[m_serial_len - 1] == 0xFF)) - { - serial.writeSerialRpt(m_serial_buffer, m_serial_len); - // if the last 3 bytes are FF's then the screen is done sending data so send the m_serial_buffer to serial.writeSerialRpt() - - m_serial_ptr = 0U; - m_serial_len = 0U; - // set ptr and reset length of buffer data since last message was valid and get ready for new data - - } - + if (m_serial_len == sizeof(m_serial_buffer)) + { + // buffer overflow + m_serial_len = 0U; + continue; + } + } #endif } #if defined(SERIAL_REPEATER) || defined(SERIAL_REPEATER_USART1) void CSerialPort::writeSerialRpt(const uint8_t* data, uint8_t length) { - if (m_modemState != STATE_IDLE) + if (length == 0 || length > 127) return; uint8_t reply[131U]; reply[0U] = MMDVM_FRAME_START; - reply[1U] = 0U; + reply[1U] = length + 3; reply[2U] = MMDVM_SERIAL; - uint8_t count = 3U; - for (uint8_t i = 0U; i < length; i++, count++) - reply[count] = data[i]; - - reply[1U] = count; + for (uint8_t i = 0U; i < length; i++) + reply[i+3] = data[i]; - writeInt(1U, reply, count); + writeInt(1U, reply, length + 3); } #endif diff --git a/SerialPort.h b/SerialPort.h index ffb4553..7061b33 100644 --- a/SerialPort.h +++ b/SerialPort.h @@ -70,7 +70,6 @@ private: uint8_t m_ptr; uint8_t m_len; uint8_t m_serial_buffer[128U]; - uint8_t m_serial_ptr; uint8_t m_serial_len; bool m_debug; From c909c2dbc5c6f323250e294516855b4bdb678979 Mon Sep 17 00:00:00 2001 From: Shawn Chain Date: Tue, 13 Aug 2019 00:54:26 +0800 Subject: [PATCH 2/2] optimize writeSerialRpt() --- SerialPort.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/SerialPort.cpp b/SerialPort.cpp index d660966..91e9d3d 100644 --- a/SerialPort.cpp +++ b/SerialPort.cpp @@ -901,19 +901,16 @@ void CSerialPort::process() #if defined(SERIAL_REPEATER) || defined(SERIAL_REPEATER_USART1) void CSerialPort::writeSerialRpt(const uint8_t* data, uint8_t length) { - if (length == 0 || length > 127) + if (length == 0) return; - uint8_t reply[131U]; + uint8_t head[3]; + head[0U] = MMDVM_FRAME_START; + head[1U] = length + 3; + head[2U] = MMDVM_SERIAL; - reply[0U] = MMDVM_FRAME_START; - reply[1U] = length + 3; - reply[2U] = MMDVM_SERIAL; - - for (uint8_t i = 0U; i < length; i++) - reply[i+3] = data[i]; - - writeInt(1U, reply, length + 3); + writeInt(1U, head, 3U); + writeInt(1U, data, length, true); } #endif