diff --git a/.gitignore b/.gitignore index 14ab1c8..ae5746a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ Release x64 MMDVMHost RemoteCommand +Images *.o *.opendb *.bak @@ -15,5 +16,6 @@ RemoteCommand *.user *.VC.db .vs +.vscode *.ambe GitVersion.h diff --git a/DStarHeader.cpp b/DStarHeader.cpp index 2eacc4e..a74c36c 100644 --- a/DStarHeader.cpp +++ b/DStarHeader.cpp @@ -27,20 +27,15 @@ #include CDStarHeader::CDStarHeader(const unsigned char* header) : -m_header(nullptr) +m_header() { assert(header != nullptr); - - m_header = new unsigned char[DSTAR_HEADER_LENGTH_BYTES]; - ::memcpy(m_header, header, DSTAR_HEADER_LENGTH_BYTES); } CDStarHeader::CDStarHeader() : -m_header(nullptr) +m_header() { - m_header = new unsigned char[DSTAR_HEADER_LENGTH_BYTES]; - ::memset(m_header, ' ', DSTAR_HEADER_LENGTH_BYTES); m_header[0U] = 0x00U; @@ -50,7 +45,6 @@ m_header(nullptr) CDStarHeader::~CDStarHeader() { - delete[] m_header; } CDStarHeader& CDStarHeader::operator=(const CDStarHeader& header) diff --git a/DStarHeader.h b/DStarHeader.h index 2f85079..ce63ba9 100644 --- a/DStarHeader.h +++ b/DStarHeader.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016,2023 by Jonathan Naylor G4KLX +* Copyright (C) 2016,2023,2026 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,6 +23,8 @@ #if defined(USE_DSTAR) +#include "DStarDefines.h" + class CDStarHeader { public: CDStarHeader(const unsigned char* header); @@ -56,7 +58,7 @@ public: CDStarHeader& operator=(const CDStarHeader& header); private: - unsigned char* m_header; + unsigned char m_header[DSTAR_HEADER_LENGTH_BYTES]; }; #endif diff --git a/Modem.cpp b/Modem.cpp index 78011b7..efc896d 100644 --- a/Modem.cpp +++ b/Modem.cpp @@ -311,7 +311,8 @@ m_fmMaxDevLevel(90.0F), m_fmExtEnable(false), #endif m_capabilities1(0x00U), -m_capabilities2(0x00U) +m_capabilities2(0x00U), +m_serialDataLen(0U) { m_buffer = new unsigned char[BUFFER_LENGTH]; } @@ -988,6 +989,48 @@ void CModem::clock(unsigned int ms) 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 58b7037..33004d6 100644 --- a/Modem.h +++ b/Modem.h @@ -403,6 +403,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 diff --git a/Version.h b/Version.h index 0e0fbe8..18b215a 100644 --- a/Version.h +++ b/Version.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2025 by Jonathan Naylor G4KLX + * Copyright (C) 2015-2026 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20250828"; +const char* VERSION = "20260218"; #endif