Files

3.6 KiB

XSayATC — stan prac i plan

Gdzie co leży

  • Plugin: /mnt/nvme_data/SteamLibrary/steamapps/common/X-Plane 12/Resources/plugins/PythonPlugins/PI_XSayATC.py
  • Konfiguracja lokalna: config.json (obok pliku .py) — nie w repo (gitignore)
  • Wzór konfiguracji: config.example.json
  • Repo git: /home/pali112/XSayATC (remote: gitea.myftp.org/pali112/xSayATC_Xplane12)
  • Zależności: llama.cpp (localhost:8081), whisper (STT), piper (TTS)

Zrobione i działa

ATC / frazeologia

  1. Rola ATC wg częstotliwości — sim/atc/com1_tuned_facility → Delivery/Ground/Tower/Approach/Center.
  2. Czytanie radia z fallbackiem cockpit2/radios/actuators (Toliss/Zibo/Garmin).
  3. Reset rozmowy przy zmianie służby ATC.
  4. Handoff ATC — podaje realną częstotliwość następnej służby (z apt.dat).
  5. Kierunek lotu Odlot/Przylot — tryb Auto (z planu lotu) + ręczny override.

Dane lotniska / plan lotu

  1. Częstotliwości lotniska w oknie (przycisk „Odśwież (czestotliwosci + pasy)").
  2. Geometria pasów z apt.dat (wiersze 100) + ręczny wybór pasa.
  3. Plan lotu z natywnego FMS/GPS oraz pliku fallback (flightplan_file).

Ruch / bezpieczeństwo

  1. Integracja LiveTraffic — enumeracja po indeksie livetraffic/ac/key, odczyt phase/on_gnd/lat/lon/alt/heading/speed/vsi.
  2. Wykrywanie „pas zajęty" — samolot w fazie na-pasie i w prostokącie pasa (+ bufor 60 m). Tylko w promieniu 15 nm od pasa.
  3. Status pasa w kontekście — ATC odmawia zgody na start/lądowanie, gdy pas zajęty (reguła RUNWAY STATUS).
  4. Proaktywny ATC — sam się odzywa: zmiana fazy (start/lądowanie), bliski ruch <5 nm (tylko w powietrzu), pas zajęty. Z dedupem powodu i cooldownem 30 s.

Wydajność / stabilność

  1. Transkrypcja whisper w tle — nie zamraża gry przy PTT (wynik przez _pending_send do flight loopa).
  2. TTS z lockiem — tylko jedna odpowiedź głosowa naraz (kolejna pomijana, nie nakłada się).
  3. Flaga streaming ustawiana synchronicznie — brak równoległych żądań do LLM.
  4. Cache enumeracji LiveTraffic (2 s) + cache najbliższego lotniska (10 s) — bez przycięć.

Do zrobienia (kolejność)

  1. „Traffic on final" — wykrywać samolot na podejściu (fazy 50/60/61, on_gnd=0, blisko progu ~2 nm, nisko, kierunek zgodny z osią pasa). Teraz ATC ostrzega dopiero po dotknięciu pasa.
  2. Auto-wybór pasa — po wietrze / pozycji / kursie (zamiast ręcznego).
  3. Parser SimBrief XML (SID/STAR + ograniczenia):
    • .fms już działa (trasa + wysokości).
    • SimBrief XML ma nazwy SID/STAR + ograniczenia („cross at 3000 ft") — wtyczka tego nie czyta.
    • Cel: ATC zna procedury po nazwie zamiast statycznych plików procedures/.
    • Źródło: SimBrief XML (darmowy) albo Navigraph CIFP (ARINC 424).
  4. Drobne: naprawić ostrzeżenie Gitea o przekierowaniu URL (stary → nowy origin).

Pułapki / uwagi (ważne)

  • config.json nadpisuje system_prompt — po zmianie w DEFAULT_CONFIG zsynchronizuj też config.json i config.example.json, inaczej nowe reguły promptu nie wejdą.
  • _nearest_airport_icao() skanuje całą bazę navaidów — cache 10 s, ale nie wołać w pętlach (flight loop / rysowanie okna). To była przyczyna przycięć.
  • LiveTraffic ac/key to indeks (0..num-1), nie hex; po zapisie zwraca Mode-S hex.
  • apt.dat (363 MB) parsowany w tle (~4 s) — pierwsze „Odśwież" może chwilę potrwać.
  • Pierwszy slot LiveTraffic bywa pusty (phase=0, lat=0.0) — pomijany (faza 0=Unknown).