Kıdemli Gömülü Sistemler Yazılım Mühendisi
 

Qt Linguist Kütüphanesi Tarzı Gömülü Yazılım Kütüphanesi

Qt kullananlar bilirler, Linguist adında bir kütüphanesi vardır ve çok kullanışlıdır. yazılan uygulamanın farklı dillerde çalışması istendiğinde kullanılır. PC uygulamalarında bolca metin yazısı olur, bunlar farklı dillerde gösterilmesi gerektiğinde her bir ui için ayrı ayrı bu dillere göre düzenleme yapmak hem uygulamanın boyutunu hem de verimini ciddi olarak etkileyecektir. PC gibi güçlü platformlarda çok sıkıntı yaşanmasa da kısıtlı kaynaklara sahip gömülü sistemlerde ciddi sıkıntılara neden olabilir.

Hele ki lcd sürdüğünüz bir gömülü sistem projesinde çok sınırlı olan kaynakları LCD’de gösterilecek her bir dil için ayrı ayrı fonksiyonlarda yazmak. Çok fazla RAM ve ROM kaybına neden olacaktır.

Geçenlerde yaptığım dot LCD kullanılan bir projede menü içinde farklı dil seçenekleri olması istendi. Son kullanıcı Türkçe veya İngilizce dillerinden istediğini seçebilmeliydi. M0 MCU için yani düşük hız, RAM ve ROM için bunu yapmanın yöntemini Linguist kütüphanesi gibi embedded kütüphane oluşturmakta buldum.

Linguist kütüphanesinde tr fonksiyonu vardır. Bu fonksiyon içindeki metinin hangi dile çevrilmek isteniyorsa ts dosyası içindeki (bir nevi veri tabanı) karşılığını döndürür.

Örneğin:

Qt kendi sayfasındaki linguist kütüphanesi kullanım klavuzuna bakarsanız (https://doc.qt.io/qt-5/linguist-translators.html)

Bu program ile çevrilmesini istediğiniz kelime veya cümleleri İngilizce karşılığını yazıp, kullanacağınız bütün kelime ve cümleleri tablo oluşturmanız gereklidir. sonrasında tr(“about”) yazdığınızda artık UI’nin ilgili kısmında “Info” şeklinde görürsünüz.

Gelelim gömülü yazılım için yaptığımız kütüphaneye, ben yukarıdaki program ile oluşturulan dosya yerine language.h adında bir dosya oluşturdum. Yani yukarıda Qt kendi programı ile oluşturulan tabloyu el ile language.h içine girdim.

#ifndef __LANG_H
#define __LANG_H
                             
#define MAX_LENGHT_OF_TR 137
char *language[MAX_LENGHT_OF_TR][2]={
            
{"Baslama Zamani :%d    "    ,"Starting Time:%d      "},
{"Yuk. Ger. Hatasi      "    ,"High Volt Err         "},
{"Yuk. Ger. Hatasi:%d   "    ,"High Volt Err:%d      "},
{"Dus. Ger. Hatasi      "    ,"Low Volt Err          "},
{"Dus. Ger. Hatasi:%d   "    ,"Low Volt Err:%d       "},
.
.
.
.
{"Fabrika Degerine Don  "    ,"Factory Default Reset "},
{"Turkce    (*)"             ,"Turkish (*)  "},
{"Ingilizce ( )"             ,"English ( )  "},
{"Turkce    ( )"             ,"Turkish ( )  "},
{"Ingilizce (*)"             ,"English (*)  "},
{"Menu Dilini Seciniz   "    ,"Select Menu Language  "},
{"Sifre : %.4d          "    ,"Password : %.4d       "},
{"Sifre Degistirme      "    ,"Change Password       "},
{"Zaman : %2d Dk.       "    ,"Time  : %2d Dk.       "},
{"Ekran Kapanma Zamani  "    ,"Screen Off Time       "},
{"%2d Sn.               "    ,"%2d Sc.               "},
{"%3d Sn.               "    ,"%3d Sc.               "},
{"%4d Sn.               "    ,"%4d Sc.               "}
};
#endif //__LANG_H

Sonrasında ise aşağıdaki küçük fonksiyonu yazıyoruz.

const char *tr(char *value){
	const char *val;
	if(langSelect==0) val=value;
	else if(langSelect==1){
		for(uint8_t i=0; i<MAX_LENGHT_OF_TR; i++){ 
			if(strcmp(value,language[i][0])==0) val=language[i][1];
		}
	}
	return val;
} 

Yukarıdaki fonksiyon anlaşılacağı üzere, language.h dosyası içindeki “language” char dizimizin içinde çevirisi yapılacak olan cümle veya kelimeyi arıyor. Bulursa ilgili konumun karşısındaki diğer dili döndürüyor. “langSelect” ifadesi benim cihaz menüsünde hangi dili seçmiş isem o dili göstermesini belirlediğim seçme değişkeni. burada Türkçe -> İngilizce çeviri özelliği konuldu, İstenilseydi onlarca dile çeviri yapılacak şeklinde de yapılabilirdi, bunun için language.h dosyası içindeki “char *language[MAX_LENGHT_OF_TR][2]” char dizimizin 2. matrisindeki değeri ne kadar dil eklenecekse o kadar arttırmak ve karşılığını yazmak gerekli. burada “*language[MAX_LENGHT_OF_TR][0]” Türkçe kelimeleri, “*language[MAX_LENGHT_OF_TR][1]” İngilizce kelimeleri içeriyor.

strcmp() performans noktasında vukuatlıdır. Neyse ki yeni nesil derleyiciler güçlü optimizasyon sağlar ve performans sıkıntısı yaşanmaz.

define kullanarak ilk harfler kontrol edilip, aynı ise strcmp() fonksiyonu çalıştır yoksa çalıştırma şeklinde performans arttırıcı yöntemler de var lakin iyi bir derleyici ve optimizasyon ile test etmemekle birlikte ihtiyaç da kalacağını düşünmüyorum.

TDK 3 fazlı dalgıç kontrol ünitesi
Üstteki cihazda böylece Aktif enerji yazan kısım Active Energy şeklinde görülmüş olacak.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site istenmeyenleri azaltmak için Akismet kullanır. Yorum verilerinizin nasıl işlendiğini öğrenin.