114 lines
2.8 KiB
C++
114 lines
2.8 KiB
C++
#include "airline_filter.h"
|
|
#include "config.h"
|
|
#include "sd_mutex.h"
|
|
#include "sd_storage.h"
|
|
#include <SD.h>
|
|
#include <cstring>
|
|
#include <cctype>
|
|
|
|
namespace AirlineFilter {
|
|
|
|
namespace {
|
|
constexpr const char* HIDDEN_FILE = "/Flightradar_cyd/hidden_airlines.txt";
|
|
|
|
char hidden[MAX_HIDDEN][4] = {{0}};
|
|
uint8_t hiddenCount = 0;
|
|
|
|
void extractPrefix(const char* callsign, char* out) {
|
|
int i = 0;
|
|
for (; i < 3 && callsign[i] && isalpha((unsigned char)callsign[i]); i++) {
|
|
out[i] = (char)toupper((unsigned char)callsign[i]);
|
|
}
|
|
out[i] = '\0';
|
|
}
|
|
|
|
void saveToSd() {
|
|
if (!SdStorage::isMounted()) return;
|
|
SdMutex::Guard guard;
|
|
|
|
File f = SD.open(HIDDEN_FILE, FILE_WRITE);
|
|
if (!f) return;
|
|
for (uint8_t i = 0; i < hiddenCount; i++) {
|
|
f.println(hidden[i]);
|
|
}
|
|
f.close();
|
|
}
|
|
|
|
void loadFromSd() {
|
|
hiddenCount = 0;
|
|
if (!SdStorage::isMounted()) return;
|
|
SdMutex::Guard guard;
|
|
|
|
if (!SD.exists(HIDDEN_FILE)) return;
|
|
File f = SD.open(HIDDEN_FILE, FILE_READ);
|
|
if (!f) return;
|
|
|
|
while (f.available() && hiddenCount < MAX_HIDDEN) {
|
|
String line = f.readStringUntil('\n');
|
|
line.trim();
|
|
if (line.length() == 0) continue;
|
|
strncpy(hidden[hiddenCount], line.c_str(), 3);
|
|
hidden[hiddenCount][3] = 0;
|
|
hiddenCount++;
|
|
}
|
|
f.close();
|
|
}
|
|
}
|
|
|
|
void init() {
|
|
loadFromSd();
|
|
}
|
|
|
|
uint8_t count() { return hiddenCount; }
|
|
|
|
String icaoAt(uint8_t index) {
|
|
if (index >= hiddenCount) return String();
|
|
return String(hidden[index]);
|
|
}
|
|
|
|
bool addHidden(const char* icaoPrefix) {
|
|
if (hiddenCount >= MAX_HIDDEN) return false;
|
|
if (!icaoPrefix || !icaoPrefix[0]) return false;
|
|
|
|
char normalized[4] = {0};
|
|
uint8_t i = 0;
|
|
for (; i < 3 && icaoPrefix[i]; i++) {
|
|
normalized[i] = (char)toupper((unsigned char)icaoPrefix[i]);
|
|
}
|
|
normalized[i] = 0;
|
|
if (i == 0) return false;
|
|
|
|
for (uint8_t j = 0; j < hiddenCount; j++) {
|
|
if (strcmp(hidden[j], normalized) == 0) return true;
|
|
}
|
|
|
|
strncpy(hidden[hiddenCount], normalized, 3);
|
|
hidden[hiddenCount][3] = 0;
|
|
hiddenCount++;
|
|
saveToSd();
|
|
return true;
|
|
}
|
|
|
|
void removeHidden(uint8_t index) {
|
|
if (index >= hiddenCount) return;
|
|
for (uint8_t i = index; i < hiddenCount - 1; i++) {
|
|
strncpy(hidden[i], hidden[i + 1], 4);
|
|
}
|
|
hiddenCount--;
|
|
hidden[hiddenCount][0] = 0;
|
|
saveToSd();
|
|
}
|
|
|
|
bool isHidden(const char* callsign) {
|
|
if (hiddenCount == 0) return false;
|
|
char prefix[4];
|
|
extractPrefix(callsign, prefix);
|
|
if (!prefix[0]) return false;
|
|
|
|
for (uint8_t i = 0; i < hiddenCount; i++) {
|
|
if (strcmp(hidden[i], prefix) == 0) return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
} |