From f26ded5b5c730bc9c18c68e33afc55e3a7f84279 Mon Sep 17 00:00:00 2001 From: "Ricardo Guzman (Richonguzman)" Date: Fri, 20 Feb 2026 17:36:26 -0300 Subject: [PATCH] less memory fixes too --- src/LoRa_APRS_iGate.cpp | 18 ++++++++-------- src/digi_utils.cpp | 46 +++++++++++++++++++++-------------------- 2 files changed, 33 insertions(+), 31 deletions(-) diff --git a/src/LoRa_APRS_iGate.cpp b/src/LoRa_APRS_iGate.cpp index a8f6ec9..ec9c0d9 100644 --- a/src/LoRa_APRS_iGate.cpp +++ b/src/LoRa_APRS_iGate.cpp @@ -1,17 +1,17 @@ /* Copyright (C) 2025 Ricardo Guzman - CA2RXU - * + * * This file is part of LoRa APRS iGate. - * + * * LoRa APRS iGate is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or + * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * + * * LoRa APRS iGate is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with LoRa APRS iGate. If not, see . */ @@ -24,7 +24,7 @@ ██║ ██║ ██║██╔══██╗██╔══██║ ██╔══██║██╔═══╝ ██╔══██╗╚════██║ ███████╗╚██████╔╝██║ ██║██║ ██║ ██║ ██║██║ ██║ ██║███████║ ╚══════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝╚══════╝ - + ██╗ ██████╗ █████╗ ████████╗███████╗ ██║██╔════╝ ██╔══██╗╚══██╔══╝██╔════╝ ██║██║ ███╗███████║ ██║ █████╗ @@ -67,7 +67,7 @@ ___________________________________________________________________*/ #endif -String versionDate = "2026-02-16"; +String versionDate = "2026-02-20"; String versionNumber = "3.2"; Configuration Config; WiFiClient aprsIsClient; @@ -138,7 +138,7 @@ void loop() { ElegantOTA.loop(); return; // Don't process IGate and Digi during OTA update } - + #ifdef HAS_GPS if (Config.beacon.gpsActive) { if (millis() - gpsSatelliteTime > 5000) { @@ -174,7 +174,7 @@ void loop() { Utils::checkDisplayInterval(); Utils::checkBeaconInterval(); - + APRS_IS_Utils::checkStatus(); // Need that to update display, maybe split this and send APRSIS status to display func? String packet = ""; diff --git a/src/digi_utils.cpp b/src/digi_utils.cpp index 944c7ff..283e0ad 100644 --- a/src/digi_utils.cpp +++ b/src/digi_utils.cpp @@ -44,37 +44,38 @@ extern bool backupDigiMode; namespace DIGI_Utils { String buildPacket(const String& path, const String& packet, bool thirdParty, bool crossFreq) { + String stationCallsign = (Config.tacticalCallsign == "" ? Config.callsign : Config.tacticalCallsign); if (!crossFreq) { String packetToRepeat = packet.substring(0, packet.indexOf(",") + 1); String tempPath = path; + int digiMode = Config.digi.mode; - if (path.indexOf("WIDE1-1") != -1 && (Config.digi.mode == 2 || Config.digi.mode == 3)) { - tempPath.replace("WIDE1-1", (Config.tacticalCallsign == "" ? Config.callsign : Config.tacticalCallsign) + "*"); - } else if (path.indexOf("WIDE2-") != -1 && Config.digi.mode == 3) { - if (path.indexOf(",WIDE1*") != -1) { - tempPath.remove(path.indexOf(",WIDE1*"), 7); + if (path.indexOf("WIDE1-1") != -1 && (digiMode == 2 || digiMode == 3)) { + tempPath.replace("WIDE1-1", stationCallsign + "*"); + } else if (path.indexOf("WIDE2-") != -1 && digiMode == 3) { + int wide1AsteriskIndex = path.indexOf(",WIDE1*"); // less memory than: tempPath.replace(",WIDE1*", ""); + if (wide1AsteriskIndex != -1) { + tempPath.remove(wide1AsteriskIndex, 7); } - if (path.indexOf("*") != -1) { - tempPath.remove(path.indexOf("*"), 1); + int asteriskIndex = path.indexOf("*"); // less memory than: tempPath.replace("*", ""); + if (asteriskIndex != -1) { + tempPath.remove(asteriskIndex, 1); } if (path.indexOf("WIDE2-1") != -1) { - tempPath.replace("WIDE2-1", (Config.tacticalCallsign == "" ? Config.callsign : Config.tacticalCallsign) + "*"); + tempPath.replace("WIDE2-1", stationCallsign + "*"); } else if (path.indexOf("WIDE2-2") != -1) { - tempPath.replace("WIDE2-2", (Config.tacticalCallsign == "" ? Config.callsign : Config.tacticalCallsign) + "*,WIDE2-1"); + tempPath.replace("WIDE2-2", stationCallsign + "*,WIDE2-1"); } else { return ""; } } packetToRepeat += tempPath; - if (thirdParty) { - packetToRepeat += APRS_IS_Utils::checkForStartingBytes(packet.substring(packet.indexOf(":}"))); - } else { - packetToRepeat += APRS_IS_Utils::checkForStartingBytes(packet.substring(packet.indexOf(":"))); - } + packetToRepeat += APRS_IS_Utils::checkForStartingBytes(packet.substring(packet.indexOf(thirdParty ? ":}" : ":"))); return packetToRepeat; } else { // CrossFreq Digipeater - String suffix = thirdParty ? ":}" : ":"; - String packetToRepeat = packet.substring(0, packet.indexOf(suffix)); + String suffix = thirdParty ? ":}" : ":"; + int suffixIndex = packet.indexOf(suffix); + String packetToRepeat = packet.substring(0, suffixIndex); String terms[] = {",WIDE1*", ",WIDE2*", "*"}; for (String term : terms) { @@ -84,9 +85,9 @@ namespace DIGI_Utils { } } packetToRepeat += ","; - packetToRepeat += (Config.tacticalCallsign == "" ? Config.callsign : Config.tacticalCallsign); + packetToRepeat += stationCallsign; packetToRepeat += "*"; - packetToRepeat += APRS_IS_Utils::checkForStartingBytes(packet.substring(packet.indexOf(suffix))); + packetToRepeat += APRS_IS_Utils::checkForStartingBytes(packet.substring(suffixIndex)); return packetToRepeat; } } @@ -149,19 +150,20 @@ namespace DIGI_Utils { Sender = packet.substring(3, packet.indexOf(">")); } - if (Sender == (Config.tacticalCallsign == "" ? Config.callsign : Config.tacticalCallsign)) return; // Avoid listening to self packets + String stationCallsign = Config.tacticalCallsign == "" ? Config.callsign : Config.tacticalCallsign; + if (Sender == stationCallsign) return; // Avoid listening to self packets if (!thirdPartyPacket && Config.tacticalCallsign == "" && !Utils::callsignIsValid(Sender)) return; // No thirdParty + no tactical y no valid callsign if (STATION_Utils::check25SegBuffer(Sender, temp.substring(temp.indexOf(":") + 2))) { STATION_Utils::updateLastHeard(Sender); - Utils::typeOfPacket(temp, 2); // Digi + Utils::typeOfPacket(temp, 2); // Digi bool queryMessage = false; int doubleColonIndex = temp.indexOf("::"); - if (doubleColonIndex > 10) { // it's a message + if (doubleColonIndex > 10) { // it's a message String AddresseeAndMessage = temp.substring(doubleColonIndex + 2); String Addressee = AddresseeAndMessage.substring(0, AddresseeAndMessage.indexOf(":")); Addressee.trim(); - if (Addressee == (Config.tacticalCallsign == "" ? Config.callsign : Config.tacticalCallsign)) { // it's a message for me! + if (Addressee == stationCallsign) { // it's a message for me! queryMessage = APRS_IS_Utils::processReceivedLoRaMessage(Sender, AddresseeAndMessage, thirdPartyPacket); } }