Files
flyradar/src/net_task.cpp

85 lines
2.5 KiB
C++

#include "net_task.h"
#include "config.h"
#include "wifi_manager.h"
#include "location_manager.h"
#include "adsb_client.h"
#include "aircraft_table.h"
#include "aircraft.h"
#include "settings_store.h"
#include "aircraft_details.h"
#include "flight_logbook.h"
#include "led_alert.h"
#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <cstring>
namespace NetTask {
namespace {
TaskHandle_t taskHandle = nullptr;
uint32_t lastFetchMs = 0;
Aircraft tempTable[Config::MAX_TRACKED_AIRCRAFT];
void taskFunc(void*) {
for (;;) {
WifiMgr::update();
LocationManager::update();
AircraftDetails::update();
if (millis() - lastFetchMs >= Config::FETCH_INTERVAL_MS) {
lastFetchMs = millis();
if (WifiMgr::getState() == WifiMgr::State::Connected) {
LocationManager::requestIpLookupIfNeeded();
double lat = 0, lon = 0;
LocationManager::getHomeLocation(lat, lon);
float rangeKm = Config::RANGE_STEPS_KM[SettingsStore::rangeIndex()];
auto result = AdsbClient::fetch(lat, lon, rangeKm,
tempTable, Config::MAX_TRACKED_AIRCRAFT);
if (result.ok) {
AircraftTable::lock();
memcpy(AircraftTable::raw(), tempTable,
sizeof(Aircraft) * Config::MAX_TRACKED_AIRCRAFT);
AircraftTable::postFetchUpdate(lat, lon);
AircraftTable::unlock();
FlightLogbook::update();
// Kurzer gruener LED-Blitz als "Herzschlag" - zeigt,
// dass gerade eine Abfrage gelaufen ist. Wird von
// LedAlert::update() automatisch ignoriert, solange
// ein Naeherungs-/Notfall-Alarm aktiv ist.
if (SettingsStore::ledHeartbeatEnabled()) {
LedAlert::pulseHeartbeat(millis());
}
} else {
Serial.printf("[NetTask] Abfrage fehlgeschlagen (HTTP %d)\n", result.httpCode);
}
}
}
vTaskDelay(pdMS_TO_TICKS(50));
}
}
}
void begin() {
xTaskCreatePinnedToCore(
taskFunc,
"NetTask",
20480,
nullptr,
1,
&taskHandle,
0
);
}
}