<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>infodomus</title>
    <link>https://infodomus.foch.org.pl</link>
    <description>Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description.</description>
    <atom:link href="https://infodomus.foch.org.pl/feed.xml" rel="self" type="application/rss+xml" />
    <lastBuildDate>Tue, 07 Apr 2026 16:12:35 +0200</lastBuildDate>

    
    
    <item>
      <title>Nowa logika tworzenia ekranów MFD i system input keypad</title>
      <link>https://infodomus.foch.org.pl/fsapi-mfd/2025/12/22/T9-nowa-logikaMFD.html</link>
      <guid isPermaLink="true">https://infodomus.foch.org.pl/fsapi-mfd/2025/12/22/T9-nowa-logikaMFD.html</guid>
      <pubDate>Mon, 22 Dec 2025 19:02:40 +0100</pubDate>
      <description>Refactoring logiki ekranów i implementacja numerycznego keypada T9.</description>
      <content:encoded><![CDATA[<h2 id="problem">Problem</h2>

<p>Oryginalna logika tworzenia ekranów była sztywna i trudna do rozszerzania. Każdy nowy ekran wymagał modyfikacji głównego pliku. Dodatkowo, system input dla radia był zbyt prosty i nie pozwalał na naturalną pracę z numeryczną klawiaturą.</p>

<h2 id="nowa-architektura-ekranów">Nowa architektura ekranów</h2>

<p>Przeredagowałem system, aby każdy ekran był autonomicznym komponentem z własnymi metodami renderowania i obsługi inputu. System został uproszezony do przełączania się między ekranami za pomocą prostego mappingu. To umożliwia dodawanie nowych ekranów bez modyfikacji istniejącego kodu.</p>

<h2 id="system-keypad">System Keypad</h2>

<p>Zaimplementowałem obsługę numerycznej klawiatury ze standardem T9. Użytkownik może teraz naturalnie wprowadzać częstotliwości radia: naciśnie cyfrę, wynik pojawi się na ekranie, może go edytować (backspace), i zatwierdzić (enter).</p>

<h2 id="wyzwania">Wyzwania</h2>

<h3 id="1-zarządzanie-stanem-inputu">1. Zarządzanie stanem inputu</h3>

<p>Keypad musiał pamiętać co użytkownik wpisał, obsługiwać edycję i walidować dane przed wysłaniem do backendu. Potrzebowałem oddzielnego state managementu dla każdego rodzaju inputu.</p>

<h3 id="2-integracja-z-canvas">2. Integracja z Canvas</h3>

<p>Keypad wyświetlany jest na Canvas, ale obsługuje rzeczywiste zdarzenia klawiatury. Musiałem mapować zdarzenia klawiatury na wizualne elementy keypad-u i na odwrót.</p>

<h3 id="3-validacja-danych">3. Validacja danych</h3>

<p>Częstotliwości radia mają określone zakresy (COM: 118.00-136.975, NAV: 108.00-117.95). Keypad musiał walidować dane przed wysłaniem.</p>

<h2 id="wynik">Wynik</h2>

<p>System input jest teraz naturalny i intuicyjny. Logika ekranów jest czysta i łatwa do rozszerzania. Dodanie nowego ekranu zajmuje teraz ułamek czasu.</p>

<p>⌨️</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>MFD Interface - Canvas-based Multi-Function Display</title>
      <link>https://infodomus.foch.org.pl/fsapi-mfd/2025/12/07/MFD-interface.html</link>
      <guid isPermaLink="true">https://infodomus.foch.org.pl/fsapi-mfd/2025/12/07/MFD-interface.html</guid>
      <pubDate>Sun, 07 Dec 2025 17:48:27 +0100</pubDate>
      <description>Nowoczesny Multi-Function Display w Canvas z 60 FPS i wieloma ekranami.</description>
      <content:encoded><![CDATA[<h2 id="problem-do-rozwiązania">Problem do rozwiązania</h2>

<p>MFD musiał działać jak prawdziwy multi-function display w kabinie samolotu - wyświetlać rzeczywiste dane lotu w czasie rzeczywistym, reagować na kliknięcia przycisków OSB (Option Select Buttons) i obsługiwać wprowadzanie danych poprzez keypad. Wszystko musiało działać sprawnie z 60 FPS.</p>

<h2 id="architektura-mfd">Architektura MFD</h2>

<p>Stworzyłem system wieloekranowy, gdzie każdy ekran odpowiada za inną funkcjonalność: autopilot, radio, PFD, radar, plan lotu i systemy. Użytkownik może przełączać się między ekranami za pomocą menu.</p>

<h2 id="obsługiwane-ekrany">Obsługiwane ekrany</h2>

<ul>
  <li><strong>AUTOPILOT</strong> - wyświetla i pozwala kontrolować heading, altitude i speed bugi</li>
  <li><strong>RADIO</strong> - pełna kontrola COM1/COM2/NAV1/NAV2/XPDR z możliwością wpisywania częstotliwości</li>
  <li><strong>PFD</strong> - tradycyjny primary flight display ze wskaźnikami pitch, bank, altitude, vertical speed</li>
  <li><strong>RADAR</strong> - wyświetla pobliski ruch w zadanym zakresie</li>
  <li><strong>FPL</strong> - planowanie lotów z wyświetlaniem waypoints</li>
  <li><strong>SYSTEMS</strong> - parametry systemu: RPM, zużycie paliwa, temperatura</li>
</ul>

<h2 id="wyzwania">Wyzwania</h2>

<h3 id="1-wydajność---60-fps">1. Wydajność - 60 FPS</h3>

<p>Canvas miał służyć do efektywnego renderowania. Zwyczajne przerysowywanie całego ekranu co klatkę szybko prowadzi do spadku FPS. Musiałem zaimplementować caching wyrenderowanych elementów, batch rendering updateów i używać RequestAnimationFrame zamiast setInterval.</p>

<h3 id="2-interaktywność-z-canvas">2. Interaktywność z Canvas</h3>

<p>Canvas to bitmap, nie ma wbudowanej obsługi interaktywnych elementów. Musiałem ręcznie mapować kliknięcia myszy na pozycje przycisków OSB. Kliknięcia na lewej krawędzi ekranu to przyciski 1-5, na prawej to 6-10.</p>

<h3 id="3-real-time-data-updates">3. Real-time data updates</h3>

<p>MFD musiał być zawsze zsynchronizowany z rzeczywistymi danymi z symulatora. Zaimplementowałem polling co sekundę, co jest optymalnym balansem między świeżością danych a obciążeniem sieci.</p>

<h2 id="wynik">Wynik</h2>

<p>Uzyskałem płynny, responsywny interfejs MFD, który odwzorowuje rzeczywiste multi-function displayy. System jest modularny - każdy ekran jest niezależnym komponentem, co ułatwia dodawanie nowych funkcji.</p>

<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; margin: 1.5em 0;">
  <video style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;" controls="" preload="metadata">
    <source src="/assets/videos/fsapi-mfd-demo.mp4" type="video/mp4" />
    Twoja przeglądarka nie obsługuje odtwarzania wideo.
  </video>
</div>

<p>🖥️</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Aircraft Detection - automatyczna detekcja typów samolotów</title>
      <link>https://infodomus.foch.org.pl/fsapi-mfd/2025/12/06/aircraft-detection.html</link>
      <guid isPermaLink="true">https://infodomus.foch.org.pl/fsapi-mfd/2025/12/06/aircraft-detection.html</guid>
      <pubDate>Sat, 06 Dec 2025 06:05:38 +0100</pubDate>
      <description>System automatycznej detekcji typu samolotu i routingu komend dla PMDG, Fenix, Stock i innych.</description>
      <content:encoded><![CDATA[<h2 id="problem-do-rozwiązania">Problem do rozwiązania</h2>

<p>Każdy typ samolotu w MSFS potrzebuje innego zestawu poleceń do kontroli radia i autopilota. Stock aircraft (Cessna, Boeing) używają standardowych SimEvents, ale addon aircraft takie jak PMDG lub Fenix używają lokalnych zmiennych (L-Vars). Potrzebowałem elastycznego systemu, który automatycznie rozpozna typ samolotu i wyśle odpowiednie komendy.</p>

<h2 id="architektura-rozwiązania">Architektura rozwiązania</h2>

<p>System oparty jest na fabryce mapperów (<em>Factory Pattern</em>). Najpierw detektor analizuje dane z symulatora, aby określić typ samolotu, a następnie fabryka tworzy odpowiedni mapper, który wie jak komunikować się z tym konkretnym typem.</p>

<h2 id="obsługiwane-typy">Obsługiwane typy</h2>

<ul>
  <li><strong>Stock MSFS</strong> - Cessna, Boeing, Airbus - w pełni wspierane poprzez SimEvents</li>
  <li><strong>PMDG 737/777/747</strong> - aktualnie fallback do stock, czeka na implementację L-Vars</li>
  <li><strong>Fenix A320</strong> - aktualnie fallback do stock, czeka na implementację L-Vars</li>
  <li><strong>TBM 930</strong> - w pełni wspierane</li>
  <li><strong>QualityWings 787, Aerosoft CRJ</strong> - zaplanowane</li>
</ul>

<h2 id="wyzwania">Wyzwania</h2>

<h3 id="1-detekcja-typu-samolotu">1. Detekcja typu samolotu</h3>

<p>Istnieje wiele parametrów, które mogą wskazywać na typ samolotu - numer boczny, typ silnika, typ avioniki (G1000 vs modern glass cockpit), czy konfiguracja z pliku panel.cfg. Musiałem stworzyć heurystykę, która z rozsądnym stopniem pewności określi typ samolotu.</p>

<h3 id="2-l-vars---problem-bez-rozwiązania">2. L-Vars - Problem bez rozwiązania</h3>

<p>Addon aircraft takie jak PMDG czy Fenix przechowują swój stan w lokalnych zmiennych (L-Vars), do których SimConnect nie ma dostępu. Aby w pełni wspierać te samoloty, potrzebowałbym albo:</p>
<ul>
  <li>Modułu WASM napisanego w C++</li>
  <li>Integracji z FSUIPC</li>
  <li>Dostępu do dokumentacji od producenta</li>
</ul>

<p>Aktualnie jest to największe ograniczenie projektu.</p>

<h3 id="3-elastyczność-systemu">3. Elastyczność systemu</h3>

<p>Każdy nowy samolot wymaga nowego mappera. System musiał być zaprojektowany w taki sposób, aby dodawanie nowych typów było proste i nie wymagało zmiany istniejącego kodu.</p>

<h2 id="wynik">Wynik</h2>

<p>Wdrożyłem system oparty na interfejsach i polimorfizmie, który pozwala na łatwoe dodawanie nowych typów samolotów. Stock aircraft są w pełni wspierane, a addon aircraft działają w ograniczonym trybie do czasu, aż rozwiążę problem L-Vars.</p>

<p>✈️</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Batch processing eventów - jak kontrolować radio w MSFS</title>
      <link>https://infodomus.foch.org.pl/fsapi-mfd/2025/11/26/Radio-w-msfs.html</link>
      <guid isPermaLink="true">https://infodomus.foch.org.pl/fsapi-mfd/2025/11/26/Radio-w-msfs.html</guid>
      <pubDate>Wed, 26 Nov 2025 19:05:34 +0100</pubDate>
      <description>Rozwiązanie problemu ze zmianą częstotliwości radia w MSFS poprzez batch event processing.</description>
      <content:encoded><![CDATA[<h2 id="problem">Problem</h2>

<p>Microsoft Flight Simulator ma znane ograniczenie: funkcja <code class="language-plaintext highlighter-rouge">SetDataOnSimObject</code> nie działa dla częstotliwości standby radia. Oznacza to, że bezpośrednia zmiana wartości w pamięci symulatora jest niemożliwa. To był główny problem do rozwiązania.</p>

<h2 id="rozwiązanie-event-emulation">Rozwiązanie: Event Emulation</h2>

<p>Zamiast próbować zmienić bezpośrednio wartości, postanowiłem emulować naciskanie przycisków zwiększających/zmniejszających częstotliwość. Simulator przyjmuje rozkazy takie jak “zwiększ COM1” lub “zmniejsz NAV1”, które są wysyłane wielokrotnie.</p>

<h2 id="wyzwania-implementacji">Wyzwania implementacji</h2>

<h3 id="1-precyzja-frecji">1. Precyzja frecji</h3>

<p>Każda zmiana na jednym przycisku to krok o określoną wartość:</p>
<ul>
  <li>COM radios: 25 kHz</li>
  <li>NAV radios: 50 kHz</li>
</ul>

<p>Aby zmienić częstotliwość z 120.00 do 127.45 MHz, potrzebuję około 298 pojedynczych kliknięć. Wysłanie ich wszystkich naraz spowodowałoby, że simulator nie zdążyłby przetwarzać zdarzeń.</p>

<h3 id="2-timing-i-batch-processing">2. Timing i batch processing</h3>

<p>Symulator potrzebuje czasu na przetworzenie każdego zdarzenia. Wysyłanie zdarzeń w zbyt szybkim tempie powoduje ich ignorowanie lub przeskakiwanie. Rozwiązaniem jest wysyłanie zdarzeń w partiach po 10 sztuk z przerwą 50ms między partiami.</p>

<h3 id="3-transponder-bco16">3. Transponder BCO16</h3>

<p>Transponder używa innego formatu danych - BCO16 (4 bity na cyfrę). Wartość dziesiętna musi być skonwertowana na format heksadecymalny ze specjalnymi ograniczeniami (tylko cyfry oktalne 0-7).</p>

<h2 id="wynik">Wynik</h2>

<p>Implementacja batch processing pozwala na niezawodną zmianę częstotliwości radia. Choć zajmuje to około 1,5 sekundy dla pełnego zakresu, rezultat jest precyzyjny i nie wymaga dodatkowych modułów czy integracji zewnętrznych bibliotek.</p>

<p>📻</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>FSAPI MFD - REST API dla Flight Simulatora</title>
      <link>https://infodomus.foch.org.pl/fsapi-mfd/2025/11/25/Nowy-projekt-FSAPI-MFD.html</link>
      <guid isPermaLink="true">https://infodomus.foch.org.pl/fsapi-mfd/2025/11/25/Nowy-projekt-FSAPI-MFD.html</guid>
      <pubDate>Tue, 25 Nov 2025 18:30:41 +0100</pubDate>
      <description>REST API server dla Microsoft Flight Simulator i X-Plane z interfejsem MFD w przeglądarce.</description>
      <content:encoded><![CDATA[<p>Siedząc ze złamaną nogą rozpoczynam nowy projekt - <strong>FSAPI MFD</strong>. Jest to REST API server dla Microsoft Flight Simulator (MSFS) i X-Plane z nowoczesnym interfejsem Multi-Function Display działającym w przeglądarce.</p>

<h2 id="główne-cechy">Główne cechy</h2>

<ul>
  <li><strong>SimConnect Integration</strong> - bezpośrednie połączenie z MSFS</li>
  <li><strong>X-Plane Support</strong> - wsparcie poprzez UDP</li>
  <li><strong>Aircraft Detection</strong> - automatyczna detekcja typu samolotu</li>
  <li><strong>Radio Control</strong> - zarządzanie częstotliwościami COM/NAV/XPDR</li>
  <li><strong>Autopilot Control</strong> - sterowanie bugami HDG/ALT/SPD</li>
  <li><strong>MFD Web Interface</strong> - interfejs oparty na Canvas z 60 FPS</li>
  <li><strong>AI Traffic</strong> - śledzenie pobliskiego ruchu</li>
  <li><strong>Flight Planning</strong> - tworzenie planów lotów dla AI</li>
</ul>

<h2 id="architektura">Architektura</h2>

<p>Projekt dzieli się na trzy warstwy:</p>

<ol>
  <li><strong>Backend (.NET 8.0)</strong> - integracja z SimConnect i X-Plane, obsługa komend</li>
  <li><strong>API</strong> - REST endpoints dla radiów, autopilota, danych lotu</li>
  <li><strong>Frontend (JavaScript)</strong> - Canvas MFD z wieloma ekranami</li>
  <li><strong>Mockup</strong><img src="/assets/images/MFD-mockup.png" alt="FSAPI MFD - interfejs w przeglądarce" /></li>
</ol>

<p>Kod dostępny na GitHubie: <a href="https://github.com/m-lukaszewski/FSAPI_MFD">m-lukaszewski/FSAPI_MFD</a></p>

<p>Więcej szczegółów w kolejnych wpisach! ✈️</p>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
