TODO.md: porządek — zrobione vs do zrobienia, aktualne pułapki

This commit is contained in:
pali112 committed 2026-10-21 20:20:50 +02:00
1 parent 1789073d23
commit fb7086154c
1 file changed
+38 -44
+38 -44
View File
@@ -1,60 +1,54 @@
# XSayATC — stan prac i plan (nota do kontynuacji)
# 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 jest w repo** (gitignore)
- **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
- **Zależności:** llama.cpp (localhost:8081), whisper (STT), piper (TTS)
## Co jest zrobione (działa)
## Zrobione i działa
1. **Rola ATC wg częstotliwości** — czyta `sim/atc/com1_tuned_facility` → Delivery/Ground/Tower/Approach/Center. LLM przyjmuje właściwą rolę.
2. **Czytanie radia z fallbackiem** `cockpit2/radios/actuators` (dla Toliss/Zibo/Garmin).
3. **Reset rozmowy** przy zmianie służby ATC (żeby role się nie mieszały).
4. **Handoff ATC** — kontroler podaje realną częstotliwość następnej służby (z `apt.dat`).
### 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.
6. **Częstotliwości lotniska** w oknie głównym (ręczny przycisk „Odśwież częstotliwości").
7. **Proaktywny ATC** — sam się odzywa (zmiana fazy: start/lądowanie; bliski ruch <5 nm w powietrzu). Cooldown 30 s.
8. **Integracja LiveTraffic** — enumeracja po indeksie `livetraffic/ac/key` (0..num-1), odczyt `phase`, `on_gnd`, `lat`, `lon`, `alt`, `heading`, `speed`, `vsi`. Mapa nazw faz `LT_PHASE_NAMES`.
9. **Wybór pasa (opcja A)** — ręcznie w oknie, z listy pasów z `apt.dat` (wiersze `100`).
10. **Wykrywanie „pas zajęty"** — samolot w fazie startu/lądowania/taxi **i** w prostokącie pasa (+ bufor 60 m) → wyzwalacz `runway occupied`.
## Co trzeba dokończyć / przetestować
### Dane lotniska / plan lotu
6. **Częstotliwości lotniska** w oknie (przycisk „Odśwież (czestotliwosci + pasy)").
7. **Geometria pasów** z `apt.dat` (wiersze `100`) + ręczny **wybór pasa**.
8. **Plan lotu** z natywnego FMS/GPS oraz pliku fallback (`flightplan_file`).
1. **Przetestować „pas zajęty"** (wersja `e72f4b4`):
- zrestartować X-Plane / przeładować plugin,
- kliknąć „Odśwież częstotliwości" (wczyta pasy),
- wybrać pas (np. `33`),
- sprawdzić, czy ATC reaguje, gdy ktoś jest na pasie.
- Jeśli za dużo/za mało „zajęty" → dostroić `RUNWAY_BUFFER_M` (teraz 60 m) lub progi.
### Ruch / bezpieczeństwo
9. **Integracja LiveTraffic** — enumeracja po indeksie `livetraffic/ac/key`, odczyt `phase`/`on_gnd`/`lat`/`lon`/`alt`/`heading`/`speed`/`vsi`.
10. **Wykrywanie „pas zajęty"** — samolot w fazie na-pasie **i** w prostokącie pasa (+ bufor 60 m). Tylko w promieniu 15 nm od pasa.
11. **Status pasa w kontekście** — ATC odmawia zgody na start/lądowanie, gdy pas zajęty (reguła `RUNWAY STATUS`).
12. **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.
2. **Dodać „traffic on final"** (następny krok):
- wykrywać samolot w fazach `50 Descend / 60 Approach / 61 Final`, `on_gnd=0`, blisko progu pasa (~2 nm), nisko, kierunek zgodny z osią pasa.
- To dopełni obraz: teraz ATC ostrzega dopiero **po** dotknięciu pasa, nie o samolocie na podejściu.
### Wydajność / stabilność
13. **Transkrypcja whisper w tle** — nie zamraża gry przy PTT (wynik przez `_pending_send` do flight loopa).
14. **TTS z lockiem** — tylko jedna odpowiedź głosowa naraz (kolejna pomijana, nie nakłada się).
15. **Flaga `streaming` ustawiana synchronicznie** — brak równoległych żądań do LLM.
16. **Cache enumeracji LiveTraffic (2 s)** + **cache najbliższego lotniska (10 s)** — bez przycięć.
3. **Opcjonalnie: auto-wybór pasa** (zamiast ręcznego) — po kierunku wiatru / pozycji / kursie.
## Do zrobienia (kolejność)
4. **Parser SimBrief XML (SID/STAR + ograniczenia)** — przyszły etap:
- `.fms` już działa (rozwinięta trasa z wysokościami, czytana przez `_collect_flight_plan`).
- GPX nie wnosi nic ponad `.fms` (te same punkty+wysokości, bez nazw procedur).
- SimBrief XML zawiera **nazwy SID/STAR + ograniczenia** („cross at 3000 ft", „at 250 kt") — tego wtyczka jeszcze nie czyta.
- Cel: ATC zna procedury po nazwie i ograniczenia wysokości/prędkości, zamiast statycznych plików `procedures/`.
- Format źródłowy: SimBrief XML (darmowy eksport) albo Navigraph CIFP (ARINC 424, najpełniejsze ale skomplikowane).
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`).
5. **Drobne:** naprawić ostrzeżenie Gitea o przekierowaniu URL (stary `xSayATC--Xplane12-.git` → nowy `xSayATC_Xplane12`) — zaktualizować `origin`.
## Pułapki / uwagi (ważne)
## Pułapki / uwagi (ważne!)
- **`config.json` nadpisuje `system_prompt`** — po zmianach w `DEFAULT_CONFIG` trzeba ręcznie zsynchronizować też `config.json` i `config.example.json`, inaczej nowe reguły promptu (np. HANDOFF RULE) nie wejdą.
- **`_nearest_airport_icao()` skanuje całą bazę navaidów** — ma cache 10 s, ale **nie wołać w pętlach** (flight loop / rysowanie okna). To była przyczyna przycięć.
- **LiveTraffic `ac/key` to indeks, nie hex** — po zapisie LiveTraffic zwraca Mode-S hex (np. `4196734`), ale enumeracja idzie po indeksie 0..num-1.
- **apt.dat** (363 MB) parsowany w tle przy starcie (~4 s), stąd pierwsze „Odśwież" może wymagać chwili.
- Pierwszy slot LiveTraffic bywa pusty (`phase=0, lat=0.0`) — pomijany, bo faza `0=Unknown` nie wchodzi do logiki.
## Najbliższy konkretny krok na start dnia
1. Odpal X-Plane z pluginem, przetestuj „pas zajęty".
2. Wklej mi wynik (czy wykrywa poprawnie).
3. Jak OK → implementuję „traffic on final".
- **`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`).