Önce riski, sonra arayüzü çözmek
Bu proje İHAMER'de yaptığım 6 haftalık staj boyunca yazıldı. Amaç bir flight controller'a gerçek bir yer kontrol istasyonu (GCS) kurmaktı: donanımdan canlı telemetri okuyan, motor testi ve kalibrasyon gibi komutlar gönderebilen bir web paneli.
İlk işim güzel bir dashboard tasarlamak değildi. Projedeki en büyük risk arayüz değil, bilgisayarın flight controller ile sağlıklı konuşup konuşamayacağıydı. Bu yüzden ilk zamanımı sadece pyserial ile COM port'u bulup ham byte akışını okumaya ayırdım; anlamlı bir telemetri henüz yoktu ama en kritik şey kanıtlanmıştı.
MSP protokolünü katman katman çözmek
Flight controller Betaflight'ın kullandığı MSP (MultiWii Serial Protocol) ile konuşuyor. Bunu sıfırdan çözmem gerekti: frame yapısı, checksum, command ID, request/response eşleştirme. Parser'ı bilinçli olarak bir güven kapısı gibi tasarladım; kendisine "bu komut şu" denilse bile ham frame'i kendi başına doğruluyor, çünkü bozuk byte ya da gecikmiş cevap gerçekten yaşanabiliyor.
Proje büyüdükçe ilk mimarinin sınırları görünmeye başladı: ikinci bir paket zaman aşımına uğradığında ana telemetri akışı da etkilenebiliyordu. Bunun üzerine backend'i yeniden düzenledim: MspEngine tek seri giriş/çıkış sahibi olup öncelikli kuyruk, zaman aşımı ve geç gelen cevapları karantinaya alma işini üstlendi; MspScheduler ise hangi paketin ne zaman okunacağına aktif ekrana göre karar verir oldu. Böylece dashboard ve motors ekranları sadece ihtiyaç duydukları paketleri okutuyor.
Telemetriyi de tek bir bağlı/değil durumuna indirgemedim. Her paket kendi known/stale/consecutiveErrors bilgisini taşıyor; sistem flight controller'a bağlı olsa bile aktif paketlerden biri cevap vermiyorsa degraded olarak işaretleniyor. Bu, endüstriyel sistemlerdeki gerçek duruma çok daha yakın bir model.
Donanımdan tarayıcıya güvenli bir hat
Motor komutları ayrı bir dikkat gerektirdi. Kalibrasyon ve motor testi gibi komutları frontend'de bir butona bağlamak yeterli değildi; backend'de de bağlantı durumu, link sağlığı ve flight controller'ın arm edilmemiş olması gibi koşulları kontrol eden bir güvenlik kapısı kurdum. Motor test tarafında ayrıca bir watchdog ve heartbeat çifti var: frontend her 100ms'de "hâlâ buradayım" sinyali gönderiyor, backend bu sinyali 500ms'den fazla duymazsa motorları otomatik olarak durduruyor. Kullanıcı sekmeyi kapatsa ya da bağlantı kopsa bile motor sonsuza kadar dönmeye devam edemiyor.
En zorlandığım kısım motor sıralamasını flight controller'a kalıcı şekilde yazmaktı; bu, Betaflight'ın MSP2_MOTOR_OUTPUT_REORDERING komutunu, dolayısıyla MSPv1'den farklı bir binary çerçeveleme olan MSPv2'yi gerektiriyordu. Wire formatını Betaflight'ın kendi kaynak kodundan doğrulayarak çıkardım.
Gerçek donanım, gerçek düzeltmeler
Bazı varsayımlar plan aşamasında değil, gerçek donanımla test ederken düzeldi; kağıt üzerinde doğru görünen birkaç sabit ve akış, flight controller'a gerçekten bağlanınca beklendiği gibi çalışmadı.
6 haftanın sonunda ortaya çıkan sistem, flight controller'dan farklı MSP paketlerini okuyabilen, bunları paket sağlığıyla birlikte state'e dönüştüren, frontend'e canlı yayınlayan ve motor/kalibrasyon komutlarını güvenlik kapısıyla gönderebilen modüler bir telemetri altyapısı.
Plan dosyaları yazıp uygulamak ilk versiyonu getiriyor, ama gerçek donanımla test etmek o versiyondaki varsayımların bazılarının yanlış olduğunu ortaya çıkarıyor.