Compare commits

...

1 Commits

Author SHA1 Message Date
Ricardo Guzman (Richonguzman) e6d44c1b7f replaced string for hash in 25segBuffer 2026-02-23 18:59:27 -03:00
4 changed files with 56 additions and 45 deletions
+1 -2
View File
@@ -37,8 +37,7 @@ namespace STATION_Utils {
void deleteNotHeard(); void deleteNotHeard();
void updateLastHeard(const String& station); void updateLastHeard(const String& station);
bool wasHeard(const String& station); bool wasHeard(const String& station);
void clean25SegBuffer(); bool isIn25SegHashBuffer(const String& station, const String& textMessage);
bool check25SegBuffer(const String& station, const String& textMessage);
void processOutputPacketBufferUltraEcoMode(); void processOutputPacketBufferUltraEcoMode();
void processOutputPacketBuffer(); void processOutputPacketBuffer();
void addToOutputPacketBuffer(const String& packet, bool flag = false); void addToOutputPacketBuffer(const String& packet, bool flag = false);
-1
View File
@@ -188,7 +188,6 @@ void loop() {
} }
if (Config.loramodule.txActive && (Config.digi.mode == 2 || Config.digi.mode == 3 || backupDigiMode)) { // If Digi enabled if (Config.loramodule.txActive && (Config.digi.mode == 2 || Config.digi.mode == 3 || backupDigiMode)) { // If Digi enabled
STATION_Utils::clean25SegBuffer();
DIGI_Utils::processLoRaPacket(packet); // Send received packet to Digi DIGI_Utils::processLoRaPacket(packet); // Send received packet to Digi
} }
+2 -2
View File
@@ -149,7 +149,8 @@ namespace DIGI_Utils {
if (Sender == stationCallsign) return; // Avoid listening to self packets 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 (!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))) { if (STATION_Utils::isIn25SegHashBuffer(Sender, temp.substring(temp.indexOf(":") + 2))) return;
STATION_Utils::updateLastHeard(Sender); STATION_Utils::updateLastHeard(Sender);
Utils::typeOfPacket(temp, 2); // Digi Utils::typeOfPacket(temp, 2); // Digi
bool queryMessage = false; bool queryMessage = false;
@@ -171,6 +172,5 @@ namespace DIGI_Utils {
lastScreenOn = millis(); lastScreenOn = millis();
} }
} }
}
} }
+24 -11
View File
@@ -45,12 +45,10 @@ std::vector<OutputPacketBuffer> outputPacketBuffer;
struct Packet25SegBuffer { struct Packet25SegBuffer {
uint32_t receivedTime; uint32_t receivedTime;
String station; uint32_t hash;
String payload;
}; };
std::vector<Packet25SegBuffer> packet25SegBuffer; std::vector<Packet25SegBuffer> packet25SegBuffer;
bool saveNewDigiEcoModeConfig = false; bool saveNewDigiEcoModeConfig = false;
bool packetIsBeacon = false; bool packetIsBeacon = false;
@@ -166,18 +164,33 @@ namespace STATION_Utils {
return false; return false;
} }
void clean25SegBuffer() { void clean25SegHashBuffer() {
if (!packet25SegBuffer.empty() && (millis() - packet25SegBuffer[0].receivedTime) > 25 * 1000) packet25SegBuffer.erase(packet25SegBuffer.begin()); uint32_t currentTime = millis();
for (int i = packet25SegBuffer.size() - 1; i >= 0; i--) {
if ((currentTime - packet25SegBuffer[i].receivedTime) > 25 * 1000) {
packet25SegBuffer.erase(packet25SegBuffer.begin() + i);
}
}
} }
bool check25SegBuffer(const String& station, const String& textMessage) { uint32_t makeHash(const String& station, const String& payload) { // DJB2 Hash
if (!packet25SegBuffer.empty()) { uint32_t h = 5381;
for (size_t i = 0; i < station.length(); i++)
h = ((h << 5) + h) + station[i];
for (size_t i = 0; i < payload.length(); i++)
h = ((h << 5) + h) + payload[i];
return h;
}
bool isIn25SegHashBuffer(const String& station, const String& textMessage) {
uint32_t newHash = makeHash(station, textMessage);
uint32_t currentTime = millis();
clean25SegHashBuffer();
for (int i = 0; i < packet25SegBuffer.size(); i++) { for (int i = 0; i < packet25SegBuffer.size(); i++) {
if (packet25SegBuffer[i].station == station && packet25SegBuffer[i].payload == textMessage) return false; if (packet25SegBuffer[i].hash == newHash) return true;
} }
} packet25SegBuffer.push_back({currentTime, newHash});
packet25SegBuffer.emplace_back(Packet25SegBuffer{millis(), station, textMessage}); return false;
return true;
} }
void processOutputPacketBufferUltraEcoMode() { void processOutputPacketBufferUltraEcoMode() {