From 64b51fea7297a8988d3be75d835a463bf27a75f6 Mon Sep 17 00:00:00 2001 From: richonguzman Date: Thu, 20 Jun 2024 14:06:14 -0400 Subject: [PATCH] first test with new 3rdParty --- src/aprs_is_utils.cpp | 23 +++++---- src/aprs_is_utils.h | 1 + src/digi_utils.cpp | 116 ++++++++++++++++++++++++++---------------- src/digi_utils.h | 3 +- 4 files changed, 86 insertions(+), 57 deletions(-) diff --git a/src/aprs_is_utils.cpp b/src/aprs_is_utils.cpp index d67d4f7..9db391b 100644 --- a/src/aprs_is_utils.cpp +++ b/src/aprs_is_utils.cpp @@ -106,11 +106,16 @@ namespace APRS_IS_Utils { secondLine += aprsisState; } - String buildPacketToUpload(const String& packet) { - String payload = packet.substring(packet.indexOf(":")); - if (payload.indexOf("\x3c\xff\x01") != -1) { - payload = payload.substring(0, payload.indexOf("\x3c\xff\x01")); + String checkForStartingBytes(const String& packet) { + if (packet.indexOf("\x3c\xff\x01") != -1) { + return packet.substring(0, packet.indexOf("\x3c\xff\x01")); + } else { + return packet; } + } + + String buildPacketToUpload(const String& packet) { + String payload = checkForStartingBytes(packet.substring(packet.indexOf(":"))); if (!(Config.aprs_is.active && Config.digi.mode == 0)) { // Check if NOT only IGate return packet.substring(3, packet.indexOf(":")) + ",qAR," + Config.callsign + payload; } else { @@ -128,7 +133,7 @@ namespace APRS_IS_Utils { outputPacket += Config.beacon.path; } outputPacket += ":}"; - outputPacket += packet.substring(0, packet.indexOf(",")); //packetCallsign>packetTocall + outputPacket += packet.substring(0, packet.indexOf(",")); // Callsign>Tocall outputPacket.concat(",TCPIP,"); outputPacket.concat(Config.callsign); outputPacket.concat("*"); @@ -185,7 +190,6 @@ namespace APRS_IS_Utils { receivedMessage = packet.substring(packet.indexOf(":") + 1); } if (receivedMessage.indexOf("?") == 0) { - delay(2000); if (!Config.display.alwaysOn && Config.display.timeout != 0) { display_toggle(true); } @@ -204,7 +208,7 @@ namespace APRS_IS_Utils { bool queryMessage = false; String aprsPacket, Sender, AddresseeAndMessage, Addressee; if (packet != "") { - if ((packet.substring(0, 3) == "\x3c\xff\x01") && (packet.indexOf("TCPIP") == -1) && (packet.indexOf("NOGATE") == -1) && (packet.indexOf("RFONLY") == -1)) { + if ((packet.substring(0, 3) == "\x3c\xff\x01") && (packet.indexOf("}") == -1 && packet.indexOf("TCPIP") == -1) && (packet.indexOf("NOGATE") == -1) && (packet.indexOf("RFONLY") == -1)) { Sender = packet.substring(3, packet.indexOf(">")); if (Sender != Config.callsign && Utils::checkValidCallsign(Sender)) { STATION_Utils::updateLastHeard(Sender); @@ -213,10 +217,7 @@ namespace APRS_IS_Utils { Addressee = AddresseeAndMessage.substring(0, AddresseeAndMessage.indexOf(":")); Addressee.trim(); if (packet.indexOf("::") > 10 && Addressee == Config.callsign) { // its a message for me! - if (AddresseeAndMessage.indexOf("\x3c\xff\x01") != -1) { - AddresseeAndMessage = AddresseeAndMessage.substring(0, AddresseeAndMessage.indexOf("\x3c\xff\x01")); - } - queryMessage = processReceivedLoRaMessage(Sender, AddresseeAndMessage); + queryMessage = processReceivedLoRaMessage(Sender, checkForStartingBytes(AddresseeAndMessage)); } if (!queryMessage) { aprsPacket = buildPacketToUpload(packet); diff --git a/src/aprs_is_utils.h b/src/aprs_is_utils.h index a9e48cf..7f906ca 100644 --- a/src/aprs_is_utils.h +++ b/src/aprs_is_utils.h @@ -9,6 +9,7 @@ namespace APRS_IS_Utils { void upload(const String& line); void connect(); void checkStatus(); + String checkForStartingBytes(const String& packet); String buildPacketToUpload(const String& packet); String buildPacketToTx(const String& aprsisPacket, uint8_t packetType); bool processReceivedLoRaMessage(const String& sender, const String& packet); diff --git a/src/digi_utils.cpp b/src/digi_utils.cpp index 9cfd0b5..9db9cff 100644 --- a/src/digi_utils.cpp +++ b/src/digi_utils.cpp @@ -24,35 +24,32 @@ extern bool backUpDigiMode; namespace DIGI_Utils { - String generateDigiRepeatedPacket(const String& packet){ - String temp0, path; - temp0 = packet.substring(packet.indexOf(">") + 1, packet.indexOf(":")); - if (temp0.indexOf(",") > 2) { - path = temp0.substring(temp0.indexOf(",") + 1, temp0.indexOf(":")); - if (path.indexOf("WIDE1-") >= 0) { - String hop = path.substring(path.indexOf("WIDE1-") + 6, path.indexOf("WIDE1-") + 7); - if (hop.toInt() >= 1 && hop.toInt() <= 7) { - if (hop.toInt() == 1) { - path.replace("WIDE1-1", Config.callsign + "*"); - } else { - path.replace("WIDE1-" + hop, Config.callsign + "*,WIDE1-" + String(hop.toInt() - 1)); - } + String buildPacket(const String& path, const String& packet, bool thirdParty) { + String packetToRepeat = packet.substring(0, packet.indexOf(",") + 1); + String tempPath = path; + tempPath.replace(Config.beacon.path, Config.callsign + "*"); + packetToRepeat += tempPath; + if (thirdParty) { + packetToRepeat += APRS_IS_Utils::checkForStartingBytes(packet.substring(packet.indexOf(":}"))); + } else { + packetToRepeat += APRS_IS_Utils::checkForStartingBytes(packet.substring(packet.indexOf(":"))); + } + return packetToRepeat; + } - String repeatedPacket = packet.substring(0, packet.indexOf(">")); // sender - repeatedPacket += ">"; - repeatedPacket += temp0.substring(0, temp0.indexOf(",")); // tocall - repeatedPacket += ","; - repeatedPacket += path; - String payload = packet.substring(packet.indexOf(":")); - if (payload.indexOf("\x3c\xff\x01") != -1) { - payload = payload.substring(0, payload.indexOf("\x3c\xff\x01")); - } - repeatedPacket += payload; - return repeatedPacket; - } else { - return ""; - } + String generateDigiRepeatedPacket(const String& packet, bool thirdParty){ + String temp, path; + if (thirdParty) { // only header is used + String header = packet.substring(0, packet.indexOf(":}")); + temp = header.substring(header.indexOf(">") + 1); + } else { + temp = packet.substring(packet.indexOf(">") + 1, packet.indexOf(":")); + } + if (temp.indexOf(",") > 2) { // checks for path + path = temp.substring(temp.indexOf(",") + 1); + if (path.indexOf(Config.beacon.path) != -1) { + return buildPacket(path, packet, thirdParty); } else { return ""; } @@ -66,27 +63,56 @@ namespace DIGI_Utils { String loraPacket, Sender, AddresseeAndMessage, Addressee; if (packet != "") { if ((packet.substring(0, 3) == "\x3c\xff\x01") && (packet.indexOf("NOGATE") == -1)) { - Sender = packet.substring(3, packet.indexOf(">")); - if (Sender != Config.callsign && Utils::checkValidCallsign(Sender)) { - if (STATION_Utils::check25SegBuffer(Sender, packet.substring(packet.indexOf(":") + 2))) { - STATION_Utils::updateLastHeard(Sender); - Utils::typeOfPacket(packet.substring(3), 2); // Digi - AddresseeAndMessage = packet.substring(packet.indexOf("::") + 2); - Addressee = AddresseeAndMessage.substring(0, AddresseeAndMessage.indexOf(":")); - Addressee.trim(); - if (packet.indexOf("::") > 10 && Addressee == Config.callsign) { // its a message for me! - queryMessage = APRS_IS_Utils::processReceivedLoRaMessage(Sender, AddresseeAndMessage); - } - if (!queryMessage && packet.indexOf("WIDE1-") > 10 && (Config.digi.mode == 2 || backUpDigiMode)) { // If should repeat packet (WIDE1 Digi) - loraPacket = generateDigiRepeatedPacket(packet.substring(3)); - if (loraPacket != "") { - STATION_Utils::addToOutputPacketBuffer(loraPacket); - display_toggle(true); - lastScreenOn = millis(); + if (packet.indexOf("}") > 0 && packet.indexOf("TCPIP") > 0) { // 3rd Party + String noHeaderPacket = packet.substring(packet.indexOf(":}") + 2); + Sender = noHeaderPacket.substring(0, noHeaderPacket.indexOf(">")); + if (Sender != Config.callsign) { // avoid processing own packets + if (STATION_Utils::check25SegBuffer(Sender, noHeaderPacket.substring(noHeaderPacket.indexOf(":") + 2))) { + STATION_Utils::updateLastHeard(Sender); + Utils::typeOfPacket(noHeaderPacket, 2); // Digi + if (noHeaderPacket.indexOf("::") > 10) { // it's a message + AddresseeAndMessage = noHeaderPacket.substring(noHeaderPacket.indexOf("::") + 2); + Addressee = AddresseeAndMessage.substring(0, AddresseeAndMessage.indexOf(":")); + Addressee.trim(); + if (Addressee == Config.callsign) { // it's a message for me! + queryMessage = APRS_IS_Utils::processReceivedLoRaMessage(Sender, AddresseeAndMessage); + } + } + if (!queryMessage) { + loraPacket = generateDigiRepeatedPacket(packet.substring(3), true); + if (loraPacket != "") { + STATION_Utils::addToOutputPacketBuffer(loraPacket); + display_toggle(true); + lastScreenOn = millis(); + } } } } - } + } else { + Sender = packet.substring(3, packet.indexOf(">")); + if (Sender != Config.callsign && Utils::checkValidCallsign(Sender)) { + if (STATION_Utils::check25SegBuffer(Sender, packet.substring(packet.indexOf(":") + 2))) { + STATION_Utils::updateLastHeard(Sender); + Utils::typeOfPacket(packet.substring(3), 2); // Digi + if (packet.indexOf("::") > 10) { // it's a message + AddresseeAndMessage = packet.substring(packet.indexOf("::") + 2); + Addressee = AddresseeAndMessage.substring(0, AddresseeAndMessage.indexOf(":")); + Addressee.trim(); + if (Addressee == Config.callsign) { // its a message for me! + queryMessage = APRS_IS_Utils::processReceivedLoRaMessage(Sender, AddresseeAndMessage); + } + } + if (!queryMessage) { + loraPacket = generateDigiRepeatedPacket(packet.substring(3), false); + if (loraPacket != "") { + STATION_Utils::addToOutputPacketBuffer(loraPacket); + display_toggle(true); + lastScreenOn = millis(); + } + } + } + } + } } } } diff --git a/src/digi_utils.h b/src/digi_utils.h index 4255513..eb5e13d 100644 --- a/src/digi_utils.h +++ b/src/digi_utils.h @@ -6,7 +6,8 @@ namespace DIGI_Utils { - String generateDigiRepeatedPacket(const String& packet); + String buildPacket(const String& path, const String& packet, bool thirdParty); + String generateDigiRepeatedPacket(const String& packet, bool thirdParty); void processLoRaPacket(const String& packet); }