Fix the incoming serial data from the screen.

This commit is contained in:
Jonathan Naylor 2023-10-05 19:54:35 +01:00
parent 29bb3cf352
commit 7ff74ed1ba
2 changed files with 35 additions and 45 deletions

View file

@ -88,12 +88,16 @@ const uint8_t PROTOCOL_VERSION = 1U;
char UDID[] = "00000000000000000000000000000000"; char UDID[] = "00000000000000000000000000000000";
#endif #endif
// Parameters for batching serial data
const int MAX_SERIAL_DATA = 250;
const uint16_t MAX_SERIAL_COUNT = 100U;
CSerialPort::CSerialPort() : CSerialPort::CSerialPort() :
m_buffer(), m_buffer(),
m_ptr(0U), m_ptr(0U),
m_len(0U), m_len(0U),
m_serial_buffer(), m_lastSerialAvail(0),
m_serial_len(0U), m_lastSerialAvailCount(0U),
m_debug(false), m_debug(false),
m_firstCal(false) m_firstCal(false)
{ {
@ -479,9 +483,9 @@ uint8_t CSerialPort::setFreq(const uint8_t* data, uint8_t length)
pocsag_freq_tx |= data[11U] << 8; pocsag_freq_tx |= data[11U] << 8;
pocsag_freq_tx |= data[12U] << 16; pocsag_freq_tx |= data[12U] << 16;
pocsag_freq_tx |= data[13U] << 24; pocsag_freq_tx |= data[13U] << 24;
} } else {
else
pocsag_freq_tx = freq_tx; pocsag_freq_tx = freq_tx;
}
return io.setFreq(freq_rx, freq_tx, rf_power, pocsag_freq_tx); return io.setFreq(freq_rx, freq_tx, rf_power, pocsag_freq_tx);
} }
@ -613,8 +617,7 @@ void CSerialPort::process()
m_buffer[0U] = c; m_buffer[0U] = c;
m_ptr = 1U; m_ptr = 1U;
m_len = 0U; m_len = 0U;
} } else {
else {
m_ptr = 0U; m_ptr = 0U;
m_len = 0U; m_len = 0U;
} }
@ -736,7 +739,7 @@ void CSerialPort::process()
break; break;
case MMDVM_DMR_DATA1: case MMDVM_DMR_DATA1:
#if defined(DUPLEX) #if defined(DUPLEX)
if (m_dmrEnable) { if (m_dmrEnable) {
if (m_modemState == STATE_IDLE || m_modemState == STATE_DMR) { if (m_modemState == STATE_IDLE || m_modemState == STATE_DMR) {
if (m_duplex) if (m_duplex)
@ -750,7 +753,7 @@ void CSerialPort::process()
DEBUG2("Received invalid DMR data", err); DEBUG2("Received invalid DMR data", err);
sendNAK(err); sendNAK(err);
} }
#endif #endif
break; break;
case MMDVM_DMR_DATA2: case MMDVM_DMR_DATA2:
@ -776,7 +779,7 @@ void CSerialPort::process()
break; break;
case MMDVM_DMR_START: case MMDVM_DMR_START:
#if defined(DUPLEX) #if defined(DUPLEX)
if (m_dmrEnable) { if (m_dmrEnable) {
err = 4U; err = 4U;
if (m_len == 4U) { if (m_len == 4U) {
@ -795,29 +798,29 @@ void CSerialPort::process()
DEBUG2("Received invalid DMR start", err); DEBUG2("Received invalid DMR start", err);
sendNAK(err); sendNAK(err);
} }
#endif #endif
break; break;
case MMDVM_DMR_SHORTLC: case MMDVM_DMR_SHORTLC:
#if defined(DUPLEX) #if defined(DUPLEX)
if (m_dmrEnable) if (m_dmrEnable)
err = dmrTX.writeShortLC(m_buffer + 3U, m_len - 3U); err = dmrTX.writeShortLC(m_buffer + 3U, m_len - 3U);
if (err != 0U) { if (err != 0U) {
DEBUG2("Received invalid DMR Short LC", err); DEBUG2("Received invalid DMR Short LC", err);
sendNAK(err); sendNAK(err);
} }
#endif #endif
break; break;
case MMDVM_DMR_ABORT: case MMDVM_DMR_ABORT:
#if defined(DUPLEX) #if defined(DUPLEX)
if (m_dmrEnable) if (m_dmrEnable)
err = dmrTX.writeAbort(m_buffer + 3U, m_len - 3U); err = dmrTX.writeAbort(m_buffer + 3U, m_len - 3U);
if (err != 0U) { if (err != 0U) {
DEBUG2("Received invalid DMR Abort", err); DEBUG2("Received invalid DMR Abort", err);
sendNAK(err); sendNAK(err);
} }
#endif #endif
break; break;
case MMDVM_YSF_DATA: case MMDVM_YSF_DATA:
@ -964,32 +967,20 @@ void CSerialPort::process()
#if defined(SERIAL_REPEATER) || defined(SERIAL_REPEATER_USART1) #if defined(SERIAL_REPEATER) || defined(SERIAL_REPEATER_USART1)
// Check for any incoming serial data from a device/screen on UART2 // 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. int serialAvail = availableInt(3U);
while (availableInt(3U)) if ((serialAvail > 0 && serialAvail == m_lastSerialAvail && m_lastSerialAvailCount >= MAX_SERIAL_COUNT) || (serialAvail >= MAX_SERIAL_DATA)) {
{ uint8_t buffer[MAX_SERIAL_DATA];
// read UART2 for (int i = 0; i < serialAvail && i < MAX_SERIAL_DATA; i++) {
m_serial_buffer[m_serial_len++] = readInt(3U); buffer[i] = readInt(3U);
m_lastSerialAvail--;
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 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;
continue;
}
if (m_serial_len == sizeof(m_serial_buffer))
{
// buffer overflow
m_serial_len = 0U;
continue;
} }
serial.writeSerialRpt(buffer, serialAvail - m_lastSerialAvail);
m_lastSerialAvailCount = 0U;
} else if (serialAvail > 0 && serialAvail == m_lastSerialAvail) {
m_lastSerialAvailCount++;
} else {
m_lastSerialAvail = serialAvail;
m_lastSerialAvailCount = 0U;
} }
#endif #endif
} }
@ -1010,7 +1001,6 @@ void CSerialPort::writeSerialRpt(const uint8_t* data, uint8_t length)
} }
#endif #endif
void CSerialPort::writeDStarHeader(const uint8_t* header, uint8_t length) void CSerialPort::writeDStarHeader(const uint8_t* header, uint8_t length)
{ {
if (m_modemState != STATE_DSTAR && m_modemState != STATE_IDLE) if (m_modemState != STATE_DSTAR && m_modemState != STATE_IDLE)

View file

@ -71,11 +71,11 @@ public:
void writeDebug(const char* text, int16_t n1, int16_t n2); void writeDebug(const char* text, int16_t n1, int16_t n2);
private: private:
uint8_t m_buffer[256U]; uint8_t m_buffer[256U];
uint8_t m_ptr; uint8_t m_ptr;
uint8_t m_len; uint8_t m_len;
uint8_t m_serial_buffer[128U]; int m_lastSerialAvail;
uint8_t m_serial_len; uint16_t m_lastSerialAvailCount;
bool m_debug; bool m_debug;
bool m_firstCal; bool m_firstCal;