diff --git a/src/LoRa_APRS_iGate.cpp b/src/LoRa_APRS_iGate.cpp index 3182f47..49dd12d 100644 --- a/src/LoRa_APRS_iGate.cpp +++ b/src/LoRa_APRS_iGate.cpp @@ -38,7 +38,7 @@ ________________________________________________________________________________ #include "A7670_utils.h" #endif -String versionDate = "2024.09.02"; +String versionDate = "2024.09.10"; Configuration Config; WiFiClient espClient; diff --git a/src/query_utils.cpp b/src/query_utils.cpp index 2a83be0..b04fd5f 100644 --- a/src/query_utils.cpp +++ b/src/query_utils.cpp @@ -1,13 +1,14 @@ #include "configuration.h" +#include "station_utils.h" #include "query_utils.h" #include "lora_utils.h" -extern Configuration Config; -extern std::vector lastHeardStation; -extern String versionDate; -extern int rssi; -extern float snr; -extern int freqError; +extern Configuration Config; +extern std::vector lastHeardStations; +extern String versionDate; +extern int rssi; +extern float snr; +extern int freqError; namespace QUERY_Utils { @@ -27,13 +28,13 @@ namespace QUERY_Utils { answer.concat(" "); answer.concat(String(Config.beacon.longitude,3)); } else if (queryQuestion == "?APRSL") { - if (lastHeardStation.size() == 0) { + if (lastHeardStations.size() == 0) { char answerArray[50]; snprintf(answerArray, sizeof(answerArray), "No Station Listened in the last %d min.", Config.rememberStationTime); answer.concat(answerArray); } else { - for (int i=0; i lastHeardStation; +std::vector lastHeardStations; std::vector outputPacketBuffer; -std::vector packet25SegBuffer; +std::vector packet25SegBuffer; namespace STATION_Utils { void deleteNotHeard() { - std::vector lastHeardStation_temp; - for (int i = 0; i < lastHeardStation.size(); i++) { - String deltaTimeString = lastHeardStation[i].substring(lastHeardStation[i].indexOf(",") + 1); - uint32_t deltaTime = deltaTimeString.toInt(); - if ((millis() - deltaTime) < Config.rememberStationTime * 60 * 1000) { - lastHeardStation_temp.push_back(lastHeardStation[i]); + std::vector lastHeardStation_temp; + for (int i = 0; i < lastHeardStations.size(); i++) { + if (millis() - lastHeardStations[i].lastHeardTime < Config.rememberStationTime * 60 * 1000) { + lastHeardStation_temp.push_back(lastHeardStations[i]); } } - lastHeardStation.clear(); + lastHeardStations.clear(); for (int j = 0; j < lastHeardStation_temp.size(); j++) { - lastHeardStation.push_back(lastHeardStation_temp[j]); + lastHeardStations.push_back(lastHeardStation_temp[j]); } lastHeardStation_temp.clear(); } @@ -38,29 +36,32 @@ namespace STATION_Utils { void updateLastHeard(const String& station) { deleteNotHeard(); bool stationHeard = false; - for (int i = 0; i < lastHeardStation.size(); i++) { - if (lastHeardStation[i].substring(0, lastHeardStation[i].indexOf(",")) == station) { - lastHeardStation[i] = station + "," + String(millis()); + for (int i = 0; i < lastHeardStations.size(); i++) { + if (lastHeardStations[i].station == station) { + lastHeardStations[i].lastHeardTime = millis(); stationHeard = true; } } if (!stationHeard) { - lastHeardStation.push_back(station + "," + String(millis())); + LastHeardStation lastStation; + lastStation.lastHeardTime = millis(); + lastStation.station = station; + lastHeardStations.push_back(lastStation); } fourthLine = "Stations ("; fourthLine += String(Config.rememberStationTime); fourthLine += "min) = "; - if (lastHeardStation.size() < 10) { + if (lastHeardStations.size() < 10) { fourthLine += " "; } - fourthLine += String(lastHeardStation.size()); + fourthLine += String(lastHeardStations.size()); } bool wasHeard(const String& station) { deleteNotHeard(); - for (int i = 0; i < lastHeardStation.size(); i++) { - if (lastHeardStation[i].substring(0, lastHeardStation[i].indexOf(",")) == station) { + for (int i = 0; i < lastHeardStations.size(); i++) { + if (lastHeardStations[i].station == station) { Utils::println(" ---> Listened Station"); return true; } @@ -71,35 +72,31 @@ namespace STATION_Utils { void clean25SegBuffer() { if (!packet25SegBuffer.empty()) { - String deltaTimeString = packet25SegBuffer[0].substring(0, packet25SegBuffer[0].indexOf(",")); - uint32_t deltaTime = deltaTimeString.toInt(); - if ((millis() - deltaTime) > 25 * 1000) { + if ((millis() - packet25SegBuffer[0].receivedTime) > 25 * 1000) { packet25SegBuffer.erase(packet25SegBuffer.begin()); } } } bool check25SegBuffer(const String& station, const String& textMessage) { + bool shouldBeIgnored = false; if (!packet25SegBuffer.empty()) { - bool shouldBeIgnored = false; for (int i = 0; i < packet25SegBuffer.size(); i++) { - const String& temp = packet25SegBuffer[i].substring(packet25SegBuffer[i].indexOf(",") + 1); - const String& bufferStation = temp.substring(0, temp.indexOf(",")); - const String& bufferMessage = temp.substring(temp.indexOf(",") + 1); - if (bufferStation == station && bufferMessage == textMessage) { + if (packet25SegBuffer[i].station == station && packet25SegBuffer[i].payload == textMessage) { shouldBeIgnored = true; } } - if (shouldBeIgnored) { - return false; - } else { - packet25SegBuffer.push_back(String(millis()) + "," + station + "," + textMessage); - return true; - } + } + if (shouldBeIgnored) { + return false; } else { - packet25SegBuffer.push_back(String(millis()) + "," + station + "," + textMessage); + Packet25SegBuffer packet; + packet.receivedTime = millis(); + packet.station = station; + packet.payload = textMessage; + packet25SegBuffer.push_back(packet); return true; - } + } } void processOutputPacketBuffer() { diff --git a/src/station_utils.h b/src/station_utils.h index a4228a3..8fae0d6 100644 --- a/src/station_utils.h +++ b/src/station_utils.h @@ -1,9 +1,22 @@ #ifndef STATION_UTILS_H_ #define STATION_UTILS_H_ + #include +struct Packet25SegBuffer { + uint32_t receivedTime; + String station; + String payload; +}; + +struct LastHeardStation { + uint32_t lastHeardTime; + String station; +}; + + namespace STATION_Utils { void deleteNotHeard(); diff --git a/src/utils.cpp b/src/utils.cpp index 6132b91..82d138e 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -25,7 +25,6 @@ extern String sixthLine; extern String seventhLine; extern String iGateBeaconPacket; extern String iGateLoRaBeaconPacket; -extern std::vector lastHeardStation; extern int rssi; extern float snr; extern int freqError; @@ -36,6 +35,8 @@ extern bool backUpDigiMode; extern bool shouldSleepLowVoltage; extern bool transmitFlag; +extern std::vector lastHeardStations; + bool statusAfterBoot = true; bool beaconUpdate = true; uint32_t lastBeaconTx = 0; @@ -96,10 +97,10 @@ namespace Utils { fourthLine = "Stations ("; fourthLine.concat(String(Config.rememberStationTime)); fourthLine.concat("min) = "); - if (lastHeardStation.size() < 10) { + if (lastHeardStations.size() < 10) { fourthLine += " "; } - fourthLine.concat(String(lastHeardStation.size())); + fourthLine.concat(String(lastHeardStations.size())); } void checkBeaconInterval() {