WatchOS: Mikrodenetleyiciler İçin Mini İşletim Sistemi

İşletim sistemleri 1940’lı yıllardaki ilk elektronik dijital sistemlerin hiçbirinde bulunmuyordu bunun yerine ilkel talimatları yerine getiren mekanik anahtarlar, delikli kartlar kullanılıyordu, programlanabilir genel amaçlı bilgisayarlar icat edildikten sonra elektronik tasarımlarıyla birlikte işletim sistemleri de ortaya çıkmaya ve hızla gelişmeye başladı.
Kullanım alanlarına göre ve ihtiyaçlara göre farklı türde işletim sistemleri geliştirildi. Gerçek zamanlı, Çoklu-Tekli kullanıcılı, Dağıtılmış sistemler olduğu gibi PDA’lar, cep telefonları, kol saatleri vb. elektronik sistemler için işlem hızı, bellek kapasitesi, güç tüketimi göz önüne alınarak gömülü işletim sistemleri de icat edildi.

Bu makalede ise son yıllarda eğitim amaçlı ve hobi elektroniğinde kullanımı yaygınlaşan, hızlı prototipleme ve programlama konularında sahip olduğu geniş ekosistemi sayesinde de sıkça tercih edilen Arduino platformu için ihtiyaç duyduğum ve GitHub’da repository’sini oluşturduğum  C++ tabanlı bir projeyi tanıtacağım.

Önceki makalelerimde bahsettiğim kol saati projem için elektronik tasarımı tamamlamış ancak yazılım tarafını eksik bırakmıştım. Fırsat bulduğum zamanlarda kolayca menüler ve ekranlar oluşturabileceğim farklı projelere de kolayca entegre edeceğim bir grafik arayüzü için çalışmalar yapıyorum. WatchOS adını verdiğim bu kütüphane aslında doğrudan Arduino’ya bağlı değil. Test edilmemekle beraber SPI arayüzü olan AVR ve ARM mimarisindeki tüm mikrodenetleyicilerde çalışabilir.

Kütüphaneyi tasarlarken nihayi amacım ekran sürücüsünü ve giriş cihazlarını da sistemden soyutlayıp uygulama alanını genişletmekti nitekim şu an ST7789 LCD ekranı için sıkça kullanılan Adafruit_ST7789 kütüpanesine doğrudan bağlı durumda. Örnek projede giriş yöntemi olarak 4×3 keypad kullanıldı ve bunu da WatchOS’a doğrudan bağlamamak için kütüphanenin dışında bıraktım. İleriki aşamalarda SD1306, ST7735S ve dokunmatik ekranların KeyPad, Encoder, Button gibi giriş yöntemlerinin de desteklenmesini hedefliyorum. Bundan da sonraki aşamada WatchOS’a özel uygulamaların yazılması için onu gerçek bir işletim sistemi haline getirebilmek. Bu sayede hesap makinesi, takvim, dönüştürücü, oyunlar gibi uygulamalar bir plugin olarak sisteme tanıtılabilecek.

Şu an için kütüphanede iki ana özellik var. Birincisi menü sistemi ikincisi ekran (screen) sistemi. Yani kendi menülerinizi derinlik önemli olmadan oluşturabilir ve menu item’lara ekranları atayarak ilgili ekranın render edilmesini sağlayabilirsiniz.

WatchOS:

class WatchOS {
  //TFT Driver Definition
  //Menu Definitions
  //Screen Definitions
  //Custom Delegates Definitions
  public:
     void Init() {}
     void Update() {}
     void Up() {}     
     void Down() {}
     void Back() {}
     void Select() {}
}

WatchOS class’ının genel yapısı yukarıdaki gibidir. Menüler ve ekranlar tanımlanır ardından ana uygulamada Init() metoduyla initialize edilir. Sistemin varsayılan olarak sağladığı Up, Down, Back, Select adında 4 adet Api metodu vardır bunlar adından anlaşılacağı üzere 4 adet butonun girişini sağlar. Bunun dışında birazdan göstereceğim üzere custom  api metotları oluşturabilir bunları delegate olarak kullanıp ekranlar içinden parametreli olarak çağırabilirsiniz.

Menu

Menu *mainMenu = new Menu("Main Menu"); 
Menu *settingsMenu = new Menu("Settings"); 
Menu *applicationsMenu = new Menu("Apps");

Örnek menü tanımı yukarıdaki gibidir.

Screen

Screen *timesetscreen;
timesetscreen = new TimeSetScreen("Clock Set", TFT, fnUpdatedTime, this, &WatchOS::Back);

Yukarıda da örnek bir ekran tanımı gösterilmiştir. Title bilgisi, ekran sürücüsü, zaman bilgisi güncellendiğinde tetiklenecek metot pointer’ı, WatchOS objesi ve ekran açıkken geri tuşuna basıldığında tetiklenecek metot pointer’ı.

Menü hiyerarşisi aşağıdaki gibi oluşturulur.

Menu *mainMenu = new Menu("Main Menu"); 
timesetscreen = new TimeSetScreen("Clock Set", TFT, fnUpdatedTime, this, &WatchOS::Back); 
mainMenu->AddItem(new Menu::MenuItem("saat ayarları", 1, timesetscreen, NULL)); 
mainMenu->AddItem(new Menu::MenuItem("uygulamalar", 1, applicationsMenu, NULL)); 
mainMenu->AddItem(new Menu::MenuItem("mesajlar", 0, NULL, NULL));

Ekran modelini tasarlarken olabildiğinde modüler olmasını tüm işleri kendi içerisinde yapmasını ve dışarı ile sadece kendisine verilen delegate’ler ile iletişim kurmasını sağladım. Bu şekilde yeni ekranlar eklendiğinde sistemin tümü hakkında bilgi sahip olmadan sadece ekran üzerinde çalışılabiliyor.

Ekranlar ile ilgili bir diğer özellik benzer görevler için yeni ekran class’ları tanımlanmasının önüne geçmek için belli ekran tiplerinin implementasyonunu sağlamak için base class’lar oluşturdum. Örneğin NumberSetScreen kendisine verilen short tipindeki bir değeri artırıp azaltır ve Select butonuna basıldığında değeri parametre alan bir event fırlatır. Aynı şekilde TimeSetScreen de bir saat bilgisini set etmeyi sağlar. Bunların dışında bir metin değeri almak için ya da radio button benzeri option’lar seçmek için ekranlar tasarlanabilir

Projenin kaynak kodlarına https://github.com/tyetis/WatchOS adresinden ulabilirsiniz.

0.0 Ort. (0% puan) - 0 oy

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir