From 025273844f6debff7509752dc3974f12bce7651b Mon Sep 17 00:00:00 2001 From: Andy Taylor Date: Wed, 24 Sep 2025 12:01:31 +0100 Subject: [PATCH] MMDVMHost Nextion Commands --- .gitignore | 1 + Modem.cpp | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++- Modem.h | 4 ++++ 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 14ab1c8..4009b5a 100644 --- a/.gitignore +++ b/.gitignore @@ -15,5 +15,6 @@ RemoteCommand *.user *.VC.db .vs +.vscode *.ambe GitVersion.h diff --git a/Modem.cpp b/Modem.cpp index 5e5aaa6..5838c5c 100644 --- a/Modem.cpp +++ b/Modem.cpp @@ -227,7 +227,8 @@ m_fmExtAudioBoost(1U), m_fmMaxDevLevel(90.0F), m_fmExtEnable(false), m_capabilities1(0x00U), -m_capabilities2(0x00U) +m_capabilities2(0x00U), +m_serialDataLen(0U) { m_buffer = new unsigned char[BUFFER_LENGTH]; } @@ -783,10 +784,61 @@ void CModem::clock(unsigned int ms) printDebug(); break; + //case MMDVM_SERIAL_DATA: + // 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; + + // Code changed to bring the Nextion Button Pushes back to life case MMDVM_SERIAL_DATA: if (m_trace) CUtils::dump(1U, "RX Serial Data", m_buffer, m_length); + + // Original: Add to serial data buffer m_rxSerialData.addData(m_buffer + m_offset, m_length - m_offset); + + // NEW: Buffer serial data and forward complete commands as transparent data + { + // Add received bytes to our accumulation buffer + for (unsigned int i = 0; i < (m_length - m_offset); i++) { + if (m_serialDataLen < 256) { + m_serialDataBuffer[m_serialDataLen++] = m_buffer[m_offset + i]; + + // Check for Nextion command terminator (0xFF 0xFF 0xFF) + if (m_serialDataLen >= 3 && + m_serialDataBuffer[m_serialDataLen - 3] == 0xFF && + m_serialDataBuffer[m_serialDataLen - 2] == 0xFF && + m_serialDataBuffer[m_serialDataLen - 1] == 0xFF) { + + // We have a complete command + // Add it to the RX transparent data queue so it will be forwarded to NextionDriver + // With sendFrameType=1, we need to include the frame type byte + + // Create a buffer with frame type byte + command data + unsigned char frameBuffer[260]; + frameBuffer[0] = 0x90; // Frame type: transparent data + ::memcpy(frameBuffer + 1, m_serialDataBuffer, m_serialDataLen); + + // Add length byte and data with frame type to RX queue + unsigned char len = m_serialDataLen + 1U; // +1 for frame type byte + m_rxTransparentData.addData(&len, 1U); + m_rxTransparentData.addData(frameBuffer, len); + + if (m_trace) { + CUtils::dump(1U, "Adding button command with frame type to RX Transparent queue", frameBuffer, len); + } + + // Reset buffer for next command + m_serialDataLen = 0U; + } + } else { + // Buffer overflow, reset + LogWarning("Serial data buffer overflow, resetting"); + m_serialDataLen = 0U; + } + } + } break; default: diff --git a/Modem.h b/Modem.h index 24cd4b2..0e7e95a 100644 --- a/Modem.h +++ b/Modem.h @@ -267,6 +267,10 @@ private: void printDebug(); RESP_TYPE_MMDVM getResponse(); + + // Added these for buffering serial data from display: + unsigned char m_serialDataBuffer[256]; + unsigned int m_serialDataLen; }; #endif