From 8ede848199690075d8a1e573b154f48f718fadce Mon Sep 17 00:00:00 2001 From: richonguzman Date: Tue, 25 Feb 2025 13:54:36 -0300 Subject: [PATCH] ready for testing --- include/station_utils.h | 1 + src/LoRa_APRS_iGate.cpp | 2 +- src/aprs_is_utils.cpp | 20 +++++--------------- src/lora_utils.cpp | 4 ++-- src/station_utils.cpp | 40 ++++++++++++++++++++++++++++------------ 5 files changed, 37 insertions(+), 30 deletions(-) diff --git a/include/station_utils.h b/include/station_utils.h index 604110c..d84d32d 100644 --- a/include/station_utils.h +++ b/include/station_utils.h @@ -20,6 +20,7 @@ namespace STATION_Utils { void loadBlackList(); bool checkBlackList(const String& callsign); + bool checkObjectTime(const String& packet); void deleteNotHeard(); void updateLastHeard(const String& station); bool wasHeard(const String& station); diff --git a/src/LoRa_APRS_iGate.cpp b/src/LoRa_APRS_iGate.cpp index 7bace5b..df4cf96 100644 --- a/src/LoRa_APRS_iGate.cpp +++ b/src/LoRa_APRS_iGate.cpp @@ -48,7 +48,7 @@ ___________________________________________________________________*/ #include "A7670_utils.h" #endif -String versionDate = "2025.02.24"; +String versionDate = "2025.02.25"; Configuration Config; WiFiClient espClient; #ifdef HAS_GPS diff --git a/src/aprs_is_utils.cpp b/src/aprs_is_utils.cpp index 63250ed..e03b60a 100644 --- a/src/aprs_is_utils.cpp +++ b/src/aprs_is_utils.cpp @@ -211,16 +211,6 @@ namespace APRS_IS_Utils { } } - bool checkObjectPacketToReject(const String packet) { // to filter out some objects - if (packet.indexOf("APDG01") != -1) return true; - - int objectIDIndex = packet.indexOf(":;"); - String payload = packet.substring(objectIDIndex + 2); - if (payload.indexOf("EL-") == 0) return true; - - return false; - } - String buildPacketToTx(const String& aprsisPacket, uint8_t packetType) { String packet = aprsisPacket; packet.trim(); @@ -308,7 +298,7 @@ namespace APRS_IS_Utils { receivedMessage = AddresseeAndMessage.substring(AddresseeAndMessage.indexOf(":") + 1); } if (receivedMessage.indexOf("?") == 0) { - Utils::println("Received Query APRS-IS : " + packet); + Utils::println("Rx Query (APRS-IS) : " + packet); String queryAnswer = QUERY_Utils::process(receivedMessage, Sender, true, false); //Serial.println("---> QUERY Answer : " + queryAnswer.substring(0,queryAnswer.indexOf("\n"))); if (!Config.display.alwaysOn && Config.display.timeout != 0) { @@ -333,7 +323,7 @@ namespace APRS_IS_Utils { seventhLine += receivedMessage; } } else { - Utils::print("Received Message from APRS-IS : " + packet); + Utils::print("Rx Message (APRS-IS): " + packet); if (STATION_Utils::wasHeard(Addressee) && packet.indexOf("EQNS.") == -1 && packet.indexOf("UNIT.") == -1 && packet.indexOf("PARM.") == -1) { STATION_Utils::addToOutputPacketBuffer(buildPacketToTx(packet, 1)); displayToggle(true); @@ -343,15 +333,15 @@ namespace APRS_IS_Utils { } displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine, 0); } else if (Config.aprs_is.objectsToRF && packet.indexOf(":;") > 0) { - Utils::print("Received Object from APRS-IS : " + packet); - if (!checkObjectPacketToReject(packet)) { + Utils::print("Rx Object (APRS-IS) : " + packet); + if (STATION_Utils::checkObjectTime(packet)) { STATION_Utils::addToOutputPacketBuffer(buildPacketToTx(packet, 5)); displayToggle(true); lastScreenOn = millis(); Utils::typeOfPacket(packet, 1); // APRS-LoRa Serial.println(); } else { - Serial.println(" ---> Object Rej (Not Tx)"); + Serial.println(" ---> Rejected (Time): No Tx"); } } } diff --git a/src/lora_utils.cpp b/src/lora_utils.cpp index a4d9d05..e446ed7 100644 --- a/src/lora_utils.cpp +++ b/src/lora_utils.cpp @@ -139,7 +139,7 @@ namespace LoRa_Utils { if (Config.syslog.active && WiFi.status() == WL_CONNECTED) { SYSLOG_Utils::log(3, newPacket, 0, 0.0, 0); // TX } - Utils::print("---> LoRa Packet Tx : "); + Utils::print("---> LoRa Packet Tx : "); Utils::println(newPacket); } else { Utils::print(F("failed, code ")); @@ -185,7 +185,7 @@ namespace LoRa_Utils { rssi = radio.getRSSI(); snr = radio.getSNR(); freqError = radio.getFrequencyError(); - Utils::println("<--- LoRa Packet Rx : " + packet.substring(3)); + Utils::println("<--- LoRa Packet Rx : " + packet.substring(3)); Utils::println("(RSSI:" + String(rssi) + " / SNR:" + String(snr) + " / FreqErr:" + String(freqError) + ")"); if (!Config.lowPowerMode && !Config.digi.ecoMode) { diff --git a/src/station_utils.cpp b/src/station_utils.cpp index 4608ea4..36aee29 100644 --- a/src/station_utils.cpp +++ b/src/station_utils.cpp @@ -17,6 +17,7 @@ std::vector lastHeardStations; std::vector outputPacketBuffer; std::vector packet25SegBuffer; std::vector blackList; +std::vector lastHeardObjects; bool saveNewDigiEcoModeConfig = false; @@ -50,7 +51,30 @@ namespace STATION_Utils { return false; } + void cleanObjectHeard() { + for (auto it = lastHeardObjects.begin(); it != lastHeardObjects.end(); ) { + if (millis() - it->lastHeardTime >= 9.75 * 60 * 1000) { // 9.75 = 9min 45secs + it = lastHeardObjects.erase(it); // erase() returns the next valid iterator + } else { + ++it; // Only increment if not erasing + } + } + } + bool checkObjectTime(const String& packet) { + cleanObjectHeard(); + + int objectIDIndex = packet.indexOf(":;"); + String object = packet.substring(objectIDIndex + 2, objectIDIndex + 11); + object.trim(); + + for (int i = 0; i < lastHeardObjects.size(); i++) { // Check if i should Tx object + if (lastHeardObjects[i].station == object) return false; + } + lastHeardObjects.emplace_back(LastHeardStation{millis(), object}); // Add new object and Tx + return true; + } + void deleteNotHeard() { std::vector lastHeardStation_temp; for (int i = 0; i < lastHeardStations.size(); i++) { @@ -72,14 +96,10 @@ namespace STATION_Utils { if (lastHeardStations[i].station == station) { lastHeardStations[i].lastHeardTime = millis(); stationHeard = true; + break; } } - if (!stationHeard) { - LastHeardStation lastStation; - lastStation.lastHeardTime = millis(); - lastStation.station = station; - lastHeardStations.push_back(lastStation); - } + if (!stationHeard) lastHeardStations.emplace_back(LastHeardStation{millis(), station}); Utils::activeStations(); } @@ -91,7 +111,7 @@ namespace STATION_Utils { return true; } } - Utils::println(" ---> Station not Heard for last 30 min (Not Tx)\n"); + Utils::println(" ---> Station not Heard in " + String(Config.rememberStationTime) + " min: No Tx\n"); return false; } @@ -105,11 +125,7 @@ namespace STATION_Utils { if (packet25SegBuffer[i].station == station && packet25SegBuffer[i].payload == textMessage) return false; } } - Packet25SegBuffer packet; - packet.receivedTime = millis(); - packet.station = station; - packet.payload = textMessage; - packet25SegBuffer.push_back(packet); + packet25SegBuffer.emplace_back(Packet25SegBuffer{millis(), station, textMessage}); return true; }