Autopilot to nie tylko sprzęt i jego oprogramowanie zwane potocznie firmware, ale też oprogramowanie sterujące autopilotem z ziemi. Bez niego sprzęt jest praktycznie bezużyteczny. W rozwoju sprzętu doszedłem już do etapu, gdzie oprogramowanie NSK jest już konieczne, aby móc iść dalej. Na przykład trudno sobie wyobrazić konfigurację PID-ów, czy w ogólności wprowadzanie dużej ilości liczb przy użyciu samego ekranu dotykowego. Kolejną rzeczą może nie użytkową, ale rozwojową jest możliwość narysowania wykresów on-line, czy prezentacji zarejestrowanych logów, po to aby móc diagnozować bieżące problemy.

Na samym początku rozwoju projektu jeszcze pracując z płytką prototypową Nucleo, napisałem szkielet protokołu komunikacyjnego zarówno dla komunikacji po porcie szeregowym, jak i po TCP/IP. Głównie po to aby sprawdzić, czy to da się zrobić. Później powstały jeszcze fragmenty do wykonania zdjęcia kamerą i przesłania go do programu, a jeszcze trochę później pojawiła się konieczność przygotowania i wgrania do pamięci autopilota komunikatów głosowych. Przez długi czas to było wszystko. Teraz gdy uruchomiłem w sprzęcie telemetrię, pojawiła się potrzeba obsłużenia tego z drugiej strony, czyli konfiguracji tego, co i kiedy ma być przesyłane oraz rysowania wykresów z przychodzących danych.

Pierwszą wersję obsługi telemetrii zacząłem budować, wykorzystując okno "Widok klasy" ze standardowego szablonu aplikacji MDI. Zamiast drzewa klas stworzyłem drzewo roju, w którym znajdują się kolejne drony albo wrony ja to lepiej brzmi po polsku. Wyświetliłem tam listę telemetrii jako jeden z parametrów wrona i zacząłem robić jego konfigurację, ale to jest mało wygodne, więc do konfiguracji telemetrii zrobiłem osobne okno, gdzie wyświetla się lista wszystkich zmiennych telemetrycznych i do każdej z nich można przypisać określoną częstotliwość wysyłania od 100Hz do 0,02Hz oraz całkowicie wyłączyć wysyłanie danych. W APL2 dane telemetryczne schodziły paczkami danego typu, np. paczka danych barometrycznych, danych z akcelerometrami, magnetometrami itp. Tutaj zastosowałem inną technikę. Jest jeden typ ramki telemetrycznej, wysyłanej wtedy, gdy licznik odmierzający czas jej wysyłania dojdzie do zera. By móc zidentyfikować te dane, każda zmienna ma przypisany jeden bit dosyć długiego słowa kontrolnego. Wydaje mi się że taka metoda jest efektywniejsza, bo np. analizując regulację kąta nachylenia mogę wysłać tylko te dane, które są mi potrzebne, a nie całą paczkę je zawierającą. W jednej ramce może zmieścić się ok. 120 różnych danych, a można zaadresować około 200. Więcej zwykle się nie wysyła, ze względu na ograniczoną przepustowość łącza UART. Sama przepustowość jest też liczona z uwzględnieniem narzutu protokołu komunikacyjnego i wyświetlana w oknie.

W APL2 zacząłem tworzyć wykresy na bazie doświadczeń z oprogramowaniem SkyAssistanta. To co zrobiłem było dosyć toporne, ale wspomógł mnie, a w zasadzie zrobił to od początku Remigiusz i tamte wykresy to była "żyleta", w szczególności wykresy 3D. Jednak po 10 latach przerwy nie jestem w stanie skompilować jego kodu, więc bazując na ogólnej idei Remigiusza dotworzyłem przynajmniej część 2D tamtych wykresów, bazując na mechanizmie Direct X i wektorze jako kontenerze dla danych. Wygląda to, tak jak na obrazku poniżej, gdzie są 3 wykresy, jeden ze wspólną skalą i dwa z osobną. Pokazane są dane z postawienia autopilota na obu bokach, gdzie zmieniają się zmienne Y i Z. Zmiana w X widoczna na wspólnym wykresie jest symboliczna, spowodowana nierównością montażu autopilota w pudełku testowo-transportowym. Na pierwszym wykresie o wspólnej skali nierówności te są wyświetlone proporcjonalnie do osi Y, a na drugim wykresie o osobnej skali widać, że są rozciągnięte tak, aby dopasować zmienność danych do szerokości okna (skala po prawej stronie). Można kliknąć w obrazek, aby go powiększyć.

Kliknięcie prawym klawiszem myszy w pole wykresu uruchamia menu kontekstowe, gdzie jednym z poleceń jest konfiguracja wykresów. W oknie wyświetla się lista dostępnych w danej chwili danych telemetrycznych. Chciałbym, aby tam też pojawiały się dane wczytane z logu, ale na razie nie potrafię przebić się z danymi, z klasy dokumentu do klasy okna konfiguracji. Na razie jestem w stanie narysować sztywno wybrany wykres z logu, więc to ma szansę działać, trzeba tylko dostać się z okna konfiguracji do tych danych. To jest do zrobienia, trzeba tylko doczytać i popróbować. Po prawej stronie okna buduje się wykresy. W APL2 były aż 4 rodzaje wykresów, tutaj na razie mam 2: ze wspólną skalą, gdzie można porównywać dane tego samego typu oraz z osobnymi skalami wyświetlanymi dla dwóch pierwszych wykresów. Pozostałe wykresy są tylko rysowane w maksymalnym powiększeniu, bez skali. Dzięki temu można na jednym wykresie wyświetlić np. wysokość lotu i kąt pochylenia. Dodawanie i usuwanie grup wykresów jest zrobione przy użyciu menu kontekstowego, a wykresy dodaje się przeciągając je listy do grupy wykresów. Jeszcze nie rozgryzłem działania mechanizmu drag & drop, ale działa jego namiastka. Do każdego wykresu można przypisać kolor. W APL2 było jeszcze tworzenie schematów wykresów, po to aby móc zapisać i wczytać przygotowany wcześniej układ wykresów i kolorów, aby nie budować tego od początku za każdym razem. Tego na razie nie potrafię zrobić.

Pokażę jeszcze okno regulatorów PID. Na razie nie ma tu nic specjalnego, ale dane z okna aplikacji już idą do rdzenia Cortex 7, skąd są przesyłane do Cortex 4, gdyż w tym rdzeniu działają regulatory i tam są zapisywane w pamięci FRAM. Odczyt danych analogicznie przechodzi przez oba rdzenie, przy użyciu kolejki wymiany danych między rdzeniami. Niby banał, ale wymaga trochę gimnastyki. Przesyłanie konfiguracji w obie strony już wstępnie działa, chociaż regulatory nie są jeszcze w pełni uruchomione. Będą trochę rozbudowane względem tego, co było w APL2.

Następna w kolejności pójdzie konfiguracja miksera. To było dobrze zrobione wcześniej, więc teraz będzie tylko przepisane.

Chwilę później okno miksera wygląda tak jak na obrazku niżej. Zawiera kilka przykładowych konfiguracji, na bazie których można utworzyć własną i zapisać ją do pamięci APL.