- _speak() z lockiem (blocking=False): druga odpowiedź nie odtwarza się,
gdy pierwsza wciąż gra (piper+pw-play)
- zapobiega nakładaniu się głosów dwóch odpowiedzi LLM
- _stop_recording_and_send nie woła już subprocess.run(whisper) na głównym watku
- transkrypcja w osobnym watku (_transcribe_and_send), wynik do _pending_send
- flight loop podnosi tekst i wywołuje send() na głównym watku (datarefy)
- gra nie zamiera podczas rozpoznawania mowy
- _dispatch ustawia streaming=True synchronicznie przed startem watku,
zamykajac okno, w ktorym drugie zdarzenie tez przechodzilo sprawdzenie
i uruchamialo druga odpowiedz LLM (glosy sie nakladaly)
- to tylko przypisanie flagi, nie blokuje; siec nadal w watku roboczym
- usunięto fazy powietrzne (Lift Off 23, Initial Climb 24, Landing 70, Flare 71)
ze zbioru LT_RUNWAY_OCCUPYING_PHASES
- teraz pas 'zajęty' tylko dla taxi/roll/rotate/touchdown/rollout/stopped
- po oderwaniu się samolotu wyzwalacz gaśnie, ATC nie powtarza 'hold short'
- kontekst lotu zawiera 'Selected runway X: clear/OCCUPIED by ...'
- prompt: ATC odmawia zgody na start/lądowanie gdy pas zajęty,
daje zgodę tylko gdy wolny (na zapytanie pilota)
- działa razem z proaktywnym wyzwalaczem 'pas zajęty'
- wyzwalacz 'pas zajęty' działa tylko w promieniu 15 nm od wybranego pasa
- dodano _pilot_latlon() i _dist_nm() (haversine)
- po odlocie ATC przestaje mówić o pasie EPWA
- ten sam powód (np. 'pas zajęty' przez ten sam samolot) nie jest
wysyłany ponownie, dopóki warunek nie zniknie i nie pojawi się na nowo
- zapobiega zapętlaniu się komunikatów co cooldown
- sekcja 'Pas' nie woła już _nearest_airport_icao() co klatkę (był pełny
skan bazy navaidów -> przycięcia co ~10s)
- _runway_icao ustawiane tylko przy 'Odśwież częstotliwości'
- _lt_enumerate() cache'owane 2s (wcześniej ~200 odczytów datarefów co sekundę)
- parser apt.dat czyta geometrię pasów (wiersze 100)
- ręczny wybór pasa w oknie (opcja A)
- _runway_occupants: wykrywa samoloty w fazie startu/lądowania/taxi
na wybranym pasie (prostokąt pasa + bufor 60m)
- wyzwalacz proaktywny 'runway occupied' gdy pas jest zajęty
- ac/key to indeks (0..num-1), po zapisie zwraca Mode-S hex
- _lt_enumerate() czyta phase/on_gnd/lat/lon/alt per samolot
- mapa LT_PHASE_NAMES (enum LTFlightPhase z LTAPI.h)
- wyświetla typy datarefów livetraffic/ac/* i bulk/*
- próbka ac/key (string/hex) i bulk/quick (binary)
- pomaga ustalić metodę odczytu: scalar+key vs bulk binary
- wykrywanie datarefów livetraffic/ac/* (num, phase, on_gnd, lat, lon, alt,
heading, speed, vsi, dist, bearing)
- sekcja debug w oknie konfiguracji: surowy podgląd każdego samolotu
- pomaga ustalić realne wartości phase/on_gnd przed napisaniem logiki pasa
- tryb Auto: odlot/przylot wyznaczany z planu lotu (start vs cel)
porównując z najbliższym lotniskiem
- przełącznik Auto/Odlot/Przylot (ręczny override nadal dostępny)
- monitor proaktywny NIE skanuje już bazy navaidów (tylko AGL + TCAS)
-> eliminuje potencjalne przycięcia w locie
- usunięto wyzwalacz 'nowe lotnisko' (był źródłem skanowania)
- monitor w flight loop (co 1s) sprawdza wyzwalacze
- wyzwalacze: zmiana fazy (start/lądowanie), bliski ruch <5nm, nowe lotnisko w przylocie
- cooldown konfigurowalny (domyślnie 30s) zapobiega spamowaniu
- ATC inicjuje wiadomość w aktualnej roli (bez wiadomości pilota)
- checkbox + slider w oknie konfiguracji
- przełącznik Odlot/Przylot determinuje handoff ATC
(odlot: Tower->Departure; przylot: Tower->Ground)
- osobne ścieżki handoffu dla odlotu i przylotu
- kierunek lotu dodany do kontekstu i promptu (DIRECTION)
- częstotliwości w osobnym przewijanym panelu (zawsze z suwakiem)
- apt.dat wczytywany w tle od startu (pierwszy klik działa od razu)
- poprawne czytanie częstotliwości (fallback cockpit2/radios/actuators)
- reset rozmowy przy zmianie służby ATC (Ground/Tower/...)
- zbieranie częstotliwości lotniska z apt.dat (Global Airports)
- handoff ATC z podaniem realnej częstotliwości następnej służby
- faza lotu (na ziemi / w powietrzu) z AGL
- wyświetlanie częstotliwości w oknie głównym (odświeżanie ręczne)
- fix menu Konfiguracja (refCon zamiast indeksu)