Produkty Novinky Články Návody Kontakty

Embedded Linux a okýnka - 2. FLTK a nxlib

V minulém díle jsem na linuxovém modulu SAM9260 zprovoznil Nano-X. Alternativu ke grafickému prostředí X-Windows, která je svými nízkými nároky obzvláště vhodná pro embedded zařízení. ”Grafickou kartou” byl TFT displej INT070ATFT-TS připojený k modulu SAM9260 jako framebuferové zařízení. Nicméně psát GUI aplikace přímo nad Nano-X, resp. vůči knihovně libnano-X není to pravé ořechové. Poohlížel jsem se proto po nějaké GUI knihovně s pěknými widgety (grafické prvky - tlačítka, apod.). Zaujala mě knihovna FLTK. Dnešní díl bude proto o tom, jak zkompilovat a rozběhat GUI knihovnu FLTK nad grafickým prostředím Nano-X.

Něco málo o ...

Knihovna FLTK je GUI knihovna, která usnadňuje tvorbu grafického uživatelského prostředí aplikace. Její programátorské rozhraní (API) předpokládá použití jazyka C++, což může některé vývojáře v jazyce C odradit. To by ale byla škoda. Knihovna FLTK rozhodně stojí za vyzkoušení. Zájemcům mohu doporuči pěkný tutoriálek pro verzi 1.3.0.
FLTK je vyvíjeno v třech větvích. Větev 1.3.x je stabilní a vyzrálá. Větev 2.0.x přináší modernější API, vzhled atd. Výčet ukončíme verzí 3.0.x, která spojuje stabilitu větve 1.3.x a modernost 2.0.x a momentálně je ve stádiu alpha. Já si ovšem nemohl moc vybírat. Kvůli důvodům zmíněným níže jsem chtě nechtě šáhnul po léty ověřené větvi 1.3.x.
Ten důvod byl prostý - knihovna FLTK je navržena pro běh nad X-Windows, resp. nad knihovou xlib. Protože však rozhraní Nano-X, resp. knihovny libnano-X, není zcela kompatibilní s X-Windows, je nutné použít knihovnu nxlib (od autora Nano-X) jako mezivrstvu mezi knihovnou FLTK a Nano-X. Poslední dostupná verze knihovny nxlib podporuje pouze FLTK verze 1.3.x. Tolik k volbě verze knihovny FLTK.
Vedle knihovny samotné je vývojářům k dispozici i nástroj FLUID pro snadný a rychlý návrh GUI. Mám-li citovat webové stránky FLTK: ” Tvorba GUI vaší aplikace je záležitostí minut.”
Knihovna FLTK může být zkompilována jako statická, kdy se pak přilinkuje k aplikaci. Nebo může spokojeně fungovat jako dynamicky linkovaná knihovna. Záleží na vývojáři.
Výhodou knihovny FLTK jsou především její systémové nároky - má něco kolem 1.3MB (neořezaná). Mně osobně se libí i vzhled GUI prvků. Naopak jako nevýhodu vidím její cross-kompilaci. Vývojáře nějak nenapadlo oddělit kompilaci nástroje FLUID od kompilace knihovny samotné. Ovšem kdo z nás bude pouštět FLUID na embedded zařízení? Nikdo. Snad to bude opraveno v dalších verzích.
Zájemcům o bližší prozkoumání, jak se v FLTK vyvíjí, mohu doporučit pěkný tutoriál pro verzi FLTK 1.3.0, který je vhodný i pro úplné začátečníky.

Než začneme

  • Seznam potřebných nástrojů najdete v prvním díle tohoto seriálu, sekce Než začneme.
  • Zkompilované binárky knihoven, jejich hlavičkové soubory a další soubory budu instalovat do sysrootu (viz stejná sekce první díl), tj. do adresáře /home/emlin/devel/arm/sysroot/sam9260/local/ v mém virtuálním počítači.
  • Potřebné soubory si ze sysrootu zkopíruji do exportu, tj. adresáře /home/emlin/devel/arm/export/sam9260/roofts-fltk/. Tento adresář pak budu přes NFS připojovat k souborovém systému modulu SAM9260, jak kdyby byl jeho lokální součástí.
Abych zkrátil a zpřehlednil zápisy příkazů, definoval jsem si v BASHi (příkazový intepretr) tři proměnné prostředí, které budu dále v článku používat.
$ SRC="/home/emlin/devel/arm/sysroot/sam9260/src"
$ SYSROOT="/home/emlin/devel/arm/sysroot/sam9260/local"
$ EXPORT="/home/emlin/devel/arm/export/sam9260/rootfs-fltk"

Závislosti

Knihovna FLTK závisí podobně jako Nano-X na knihovnách libpng (+ zlib) a jpeg pro vykreslování obrázků. Tyto knihovny jsme už kompilovali v předchozím díle kvůli Nano-X, takže ti, kteří podle něj postupovali, mají už hotovo. Ti ostatní se mohou inspirovat prvním dílem, sekce Závislosti. To je mimochodem i důvod, proč nevyužívám zdrojových kódů ”obrázkových” knihoven, které jsou součástí zdrojových kódů knihovny FLTK. Nechci, aby se míchaly různé verze ”obrázkových” knihoven dohromady.
Součástí knihovny jsou sice i interní verze zmíněných knihoven, ale já jsem se je rozhodl nevyužít - vždyť tyto knihovny jsme kompilovali zvlášť už pro Nano-X (viz první díl, sekce Závislosti).
Hlavní závislostí knihovny FLTK je, jak už jsem se zmínil dříve, knihovna nxlib, která z pohledu knihovny FLTK nahrazuje knihovnu xlib a stará se o překlad API Nano-X na API X-Windows.
Knihovnu nxlib budeme kompilovat ze zdrojových kódů. Musíme si stáhnout verzi snapshot (poslední zveřejněnou), protože jen ta je kompatibilní s FLTK verze 1.3.x. Stažený archív rozbalíme, vznikne adresář nxlib/.
Knihovna nxlib se konfiguruje úpravou souboru Makefile v hlavním adresáři zdrojových kódů. Níže uvádím seznam proměnných a jejich nové upravené hodnoty, tak jak následují v Makefile za sebou.
### pridat:
SYSROOT=/home/emlin/devel/arm/sysroot/sam9260/local

### upravit:
MWIN_INCLUDE=$(SYSROOT)/include/microwin
MWIN_LIB=$(SYSROOT)/lib

X11_RGBTXT=/usr/local/share/X11/rgb.txt

LIBNAME=X11
INSTALL_DIR=$(SYSROOT)/lib

SHAREDLIB=Y
SOEXTRALIBS=-Wl,-rpath-link,$(MWIN_LIB) -L$(MWIN_LIB) -lnano-X

INCLUDE_XRM=N

CC = arm-none-linux-gnueabi-gcc

### pridat za "CFLAGS += -O3":
CFLAGS += -march=armv5te -mtune=arm926ej-s -mabi=aapcs-linux
Kompilaci a instalaci knihovny libX11.so (ano, kvůli FLTK se soubor knihovny nxlib musí jmenovat takto) zařídíme příkazy make a make install.
Vedle knihoven libpng, jpeg a nxlib je potřeba do sysrootu nakopírovat hlavičkové soubory grafického prostředí X-Windows, resp. knihovny xlib, a také soubor rgb.txt. Část hlavičkových souborů zkopírujeme ze zdrojových kódů knihovny nxlib. Zbytek hlavičkových souborů (autor nxlib to nějak nedomyslel) vezmeme z našeho linuxového stroje. Seznam souborů uvádím jako sled příkazů.
### zkopirujeme soubory z nxlib
$ cp -r $SRC/nxlib/X11 $SYSROOT/include
$ mkdir -p $SYSROOT/share/X11
$ cp $SRC/nxlib/fonts/rgb.txt -t $SYSROOT/share/X11

### zkopirujeme soubory X11 z naseho pocitace
$ cd /usr/include/X11
$ cp Xlocale.h Xmd.h cursorfont.h -t $SYSROOT/include/X11

Kompilace a instalace

Archiv se zdrojovými kódy knihovny FLTK 1.3.2 si stáhneme odsud. Archiv rozbalíme, čímž vznikne adresář fltk-1.3.2. Vstoupíme do něj a v souboru configh.in nastavíme hodnotu symbolické konstanty USE_COLORMAP na 0 (původně 1). Tím zajistíme, že FLTK bude podporovat pouze truecolor (16bitové) barvy. Ovladač TFT displeje stejně nic jiného neumí a zároveň ušetříme na velikosti binárek.
No a pak pokračujeme svatou trojkombinací: konfigurace, kompilace a instalace. Mezi konfigurací a kompilací však musíme vložit mezikrok - musíme upravit Makefile, vytvořený skriptem configure, tak aby se ne cross-kompiloval nástroj FLUID. Vše je ve výpise příkazů.
### konfigurace
$ ./configure --host=arm-none-linux-gnueabi \
  --disable-localzlib --disable-localpng --disable-localjpeg \
  --disable-xft --disable-xdbe --disable-xinerama --disable-gl \
  --disable-largefile --enable-shared --enable-threads \
  --prefix=$SYSROOT \
  --x-includes=$SYSROOT/include \
  --x-libraries=$SYSROOT/lib \
  CPPFLAGS=-I$SYSROOT/include \
  CFLAGS="-march=armv5te -mtune=arm926ej-s -mabi=aapcs-linux" \
  CXXFLAGS="-march=armv5te -mtune=arm926ej-s -mabi=aapcs-linux" \
  LDFLAGS="-Wl,-rpath-link,$SYSROOT/lib -L$SYSROOT/lib"

### uprava Makefile po konfiguraci kvuli FLUID a testum
### nahradit:
DIRS = $(IMAGEDIRS) src $(CAIRODIR) fluid test documentation
### timto:
DIRS = $(IMAGEDIRS) src $(CAIRODIR)

### kompilace a instalace
$ make
$ make install

Kompilace a instalace příkladů

Abychom měli čím otestovat, že nám spolupráce Nano-X a FLTK funguje, zkompilujeme si příklady, které jsou součástí zdrojových kódů knihovny FLTK. V adresáři fltk1.3.2/examples upravíme soubor Makefile.FLTK. Pak v tomto adresáři zavoláme příkaz make a výsledné binárky příkladů si zkopírujeme do sysrootu. Viz postup níže.
### uprava Makefile.FLTK:
FLTKCONFIG   = /home/emlin/devel/arm/sysroot/sam9260/local/bin/fltk-config
LINKFLTK_ALL = $(shell $(FLTKCONFIG) --use-images --ldflags)

### kompilace
$ make

### instalace vybranych prikladu
$ cp wizard-simple progress-simple -t $SYSROOT/bin/apps
Poznámka: GUI aplikace se vůči knihovně FLTK kompilují buď voláním skriptu fltk-config, který uchovává nastavení knihovny FLTK pro dané cílové zařízení, např. fltk-config --compile nazev_zdrojaku, nebo se pomocí voleb vytáhne ze skriptu fltk-config kompilátor, CFLAGS a další volby a ty se použijí dále v rámci Makefile dané GUI aplikace. Detaily viz online manuál FLTK.

Instalace do zařízení

Máme knihovnu, máme příklady, takže teď už jen zbývá přenést všechny potřebné soubory ze sysrootu do exportu (viz Než začneme) a pak export nasdílet přes NFS a v modulu SAM9260 připojit jako adresář /usr/local. Z pohledu modulu nebude možné poznat, že /usr/local není místní adresář. Nejprve uvedu seznam souborů jako posloupnost copy příkazů. Zkopírovat musíme všechno, co vyžaduje Nano-X, nxlib a FLTK.
### vytvorime si zakladni adresare
$ cd $EXPORT
$ mkdir bin lib share bin/apps

### kopirovani z bin/ (Nano-X + FLTK) 
$ cd $SYSROOT/bin
$ cp nano-X nanowm -t $EXPORT/bin
$ cp apps/progress-simple apps/wizard-simple -t $EXPORT/bin/apps

### kopirovani z lib/ (Nano-X + FLTK)
$ cd $SYSROOT/lib
$ cp -d libfreetype.s* libjpeg.s* libpng.so libpng12.s* libz.s* libnano-X.so \ 
  libX11.so libfltk.s* libfltk_*.s* -t $EXPORT/lib

### kopirovani share/
$ cp -r $SYSROOT/share/fonts/ $SYSROOT/share/X11/ -t $EXPORT/share/
Níže uvedené příkazy povolí sdílení exportu pro modul s IP 192.168.1.12 přes NFS. Sdílený adresář z mého počítače s IP 192.168.1.123 připojíme na modulu jako /usr/local. Pak aktualizujeme příkazem ldconfig cache s dostupnými dynamickými knihovnami.
### na pocitaci
$ echo "$EXPORT 192.168.1.12(rw,sync,no_subtree_check,no_root_squash)" |\
  sudo tee -a /etc/exports
$ sudo service nfs-kernel-server restart

### na modulu jako root
# mount -t nfs -o nolock \
  192.168.1.123://home/emlin/devel/arm/export/sam9260/rootfs-fltk \
  /usr/local
# ldconfig

Testování

Jestli máte k modulu SAM9260 připojenou USB klávesnici a myš a fungují vám pod Nano-X, tak můžeme přejít na testování FLTK. Vy ostatní se vraťte na první díl, sekce Testování.
V lokálním terminálu, tj. přes USB klávesnici, se přihlásíme na modul SAM9260. Samozřejmě musíme mít připojený sdílený adresář s exportovaným obsahem souborového systému s FLTK do adresáře /usr/local (viz předchozí sekce). V příkazové řádku lokálního terminálu zadáme nano-X. Plocha displeje se zbarví černě a objeví se pohyblivý kurzor myši.
Připojíme se přes sériový port nebo telnet a v tomto vzdáleném terminálu zadáme příkaz /usr/local/bin/apps/wizard-simple. Objeví se okno jednoduchého průvodce bez rámečku, titulku a křížku pro uzavření. Takhle tedy vypadá aplikace bez okenní manažera (viz obrázek).
Příklad wizard-simple bez okenního manažera
Pro srovnání pustíme tentýž příklad, ale s okenním manažerem: nanowm & /usr/local/bin/apps/wizard-simple - viz druhý obrázek.
Příklad wizard-simple s okenním manažerem