mirror of
https://github.com/richonguzman/LoRa_APRS_iGate.git
synced 2026-07-16 14:47:29 +02:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e6d44c1b7f |
@@ -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);
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user