TODO.md: porządek — zrobione vs do zrobienia, aktualne pułapki
This commit is contained in:
1 parent
1789073d23
commit
fb7086154c
1 file changed
+38
-44
@@ -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`).
|
||||
Reference in new issue
Block a user