小さく高速な組込み向けGUIツール「GUIX」の基礎を解説【その3】

つぶつぶコラム

前々回記事小さく高速な組込み向けGUIツール「GUIX」の基礎を解説【その1】

前回記事小さく高速な組込み向けGUIツール「GUIX」の基礎を解説【その2】

Display(LCD)ドライバI/F

DisplayドライバI/FはGUIXを使用する上で必須となります。

DisplayドライバI/Fには最低限、以下の機能が必要になります。

・LCDコントローラの初期化機能

・画面更新機能

LCDコントローラの初期化機能では、実際の表示が行えるようにLCDコントローラを初期化します。また、GUIXの持つDisplayドライバに関する初期化を行い、画面更新の際にGUIXから呼び出すToggle Function関数の登録を行います。(ここで言う「GUIXの持つDisplayドライバ」とは、GUIXが持つ描画機能です。グラフィックアクセラレータを使用しない場合はGUIXの持つソフトウェア描画機能を使用します。)

画面更新機能とは、GUIXが描画した情報を実際に表示するための機能です。GUIXはキャンバスと呼ばれるメモリ領域に描画を行います。画面の表示を更新するタイミングで初期化時に登録したToggle Function関数が呼び出されますので、キャンバスメモリのコピーなどを行います。

Displayドライバに関してはMS社のサイトにも記載がありますのでご確認ください。

グラフィックスアクセラレータについて

GUIXの描画は、デフォルトではすべてCPUで行うようになっており、そのための処理がすべて含まれています。

ですが、使用する環境によってはグラフィックスアクセラレータが使用できるものもあると思います。

グラフィックスアクセラレータを使用する場合、GUIXの初期化時にCPUによる描画関数ではなくグラフィックスアクセラレータを使う関数に切り替える必要があります。この関数はGUIXには含まれていない為、別途作成する必要があります。この関数は機能ごとに用意する必要があり、例えば線を描画する関数、円を描画する関数といったように分かれています。また、該当する機能が無い場合はCPUによる描画関数を使用することもできます。

この機能に関しては弊社でも実施したことは無いですが、Renesas Synergyプラットフォームでは採用されているようです。

タイマ

GUIXでもタイマ機能が使用できます。GUIXのタイマはOSのタイマをカウントすることで実現しているのでタイマの時間単位はOSに依存します。例えばOSのタイマが10ms精度の場合は、GUIXのタイマ精度も10msが限界になります。

タイマは開始/停止のAPIが用意されており、一度開始すると停止するまで設定された時間間隔でタイマイベントが発生します。タイマイベントはタイマ開始時に登録したWidgetのイベントハンドラに直接通知されます。

タイマはGUIXのアニメーションなどでも使用されています。

描画について

GUIXは画面の更新を行う際、必要なWidgetのみを描画するような仕組みになっています。

また、画面の更新は必要なタイミング(イベントドリブン)で行われるため、VSYNCなどのように定期的なトリガによる更新ではありません。そのためイベントが発生しないときはGUIXのシステムスレッドは動作しません。

GUIXの更新はWidget単位で行われます。更新の必要なWidgetがある場合、Widgetの親子関係をさかのぼり、描画の必要な親Widgetから描画を行います。例えばポップアップ画面のような表示を消す際も、親Widgetの隠れていた領域を再描画する必要があります。他のGUIツールのように隠れていた表示状態をメモリに保存し、ポップアップ画面が消える際に書き戻すようなことは行いません。

GUIXが更新を行った後、ToggleFunctionが呼び出されます。

ToggleFunctionはGUIXの初期化時にユーザーから指定し登録します。ToggleFunctionにはGUIXが更新を行ったキャンバスと呼ばれるメモリポインタと、更新を行った矩形情報が渡されます。ToggleFunction内ではこの情報をもとにLCDコントローラが参照するメモリにコピーを行います。ToggleFunction内の実装は各LCDコントローラに合わせた実装(ポーティング)が必要になります。メモリコピーもCPUで行うこともできますし、DMAを使う実装も考えられます。システムに依ってはダブルバッファなどを使ってチラツキを抑えるようなことも必要かもしれません。

カスタムWidgetについて

GUIツールを使っていて、少し慣れてくると欲しくなるのが自作したGUI部品をツールに登録して画面設計を行う機能かと思います。

残念ながらGUIX Studioには現時点(2023/2/21)ではカスタムWidgetを登録して使うようなことはできません。ですがWidgetを自作してソースコードとして再利用することはできます。ただし、GUIX Studioを使用して座標を決めたり、プロパティを設定することはできません。すべて実行時に動作するようにコードで記述する必要があります。

マウスポインタ

入力機器がタッチパネルではなくマウスの場合、ポインタの現在位置を表示する必要があります。
GUIXはマウスポインタをサポートしていますが、有効にするためにはGX_MOUSE_SUPPORTと言うコンパイルスイッチを有効にする必要があります。そのあと、マウス用に用意されているAPIを使用することで任意の形状のポインタを画面上に表示します。
GUIXがサポートするマウスの機能は表示のみなので、マウスドライバと、マウスドライバからGUIXへの移動、クリックなどのイベントを発行する部分は実装する必要があります。この時、タッチパネルとは異なりポインタの移動をGUIXに通知するイベントが必要になりますが、このイベントコードはGUIXで定義されています。
GUIXで使用できるポインタはピクセルマップで定義する必要があるため、GUIX Studioを用いて画像を取り込みます。

アニメーションについて

GUIを設計していくと欲しい機能としてアニメーションが出てくると思います。動きのある絵を表示したり、画面遷移時にスライドさせたりと言った使い方が考えられます。
GUIXはアニメーションにも対応しています。動きのある絵については、「パラパラ漫画」の様に複数の絵を用意し経過時間で表示を変えることで実現しています。画面遷移についてもいくつかの表示パターンが用意されています。
アニメーションについては、GUIXのサンプルにある”demo_guix_sprite”や ”demo_guix_smart_watch”が参考にできます。

GUIXのサンプルについて

GUIXにはいくつかのサンプルアプリケーションと、学習の為のチュートリアルがあります。
サンプルアプリケーションは、例えば洗濯機の操作画面を想定した物や、車のナビゲーションを想定したものなど、複雑な構成のサンプルがあります。(簡単な構成の物もあります。)
実際にアプリケーションを作成する際の実装の参考にできるものが多いです。
チュートリアルには、単機能のサンプルがほとんどになります。ですので、各Widgetの使い方を知りたいときに参考にできます。
どちらのサンプルも、Microsoft社のVisualStudioを使ってWindows上で動作を確認することが出来ます。(そのためのプロジェクトファイルも入っています。)

Windowsシミュレータについて

前章でも記載しましたが、GUIXはMicrosoft社のVisualStudioを使ってWindows上で動作を確認することが出来る機能が含まれています。AzureRTOS ThreadXのWindows版のライブラリもあり、動作の再現性は高く、CPUの速度やメモリ等を除けば、組込み環境と同じような表示や動作を確認できます。
ですので、組込み環境独自のI/O操作などをコンパイルスイッチで切り分ければ、同一のソースコードでWindowsシミュレータと実機に使い分けることが出来ます。
Windowsシミュレータでは、タッチ操作の代わりにマウスを使用し、文字列入力などはキーボードが使えます。
このシミュレータ機能を使用することで、例えば、プレゼンの際に画面操作などの動作の情報共有を行う事も出来ます。
また、GUIでは動作不良などの質問を行うときは言葉での説明では伝わりきらない場合が多く、このような場合もシミュレータ環境で再現出来れば意思伝達がしやすくなります。


3回に渡り、GUIXの基礎的な解説を行ってきましたが如何でしたでしょうか。
GUIXは比較的性能の低いマイコンでも動作する様に作成されていますので、これまでGUIの搭載が難しかったようなシステムへの適応も検討出来るかと思います。
弊社ではGUIXに限らず、Azure RTOS関連の受託もお受けしておりますので、気軽にお問い合わせください。

AzureRTOSの製品情報はこちら

2023年、Microsoft は Azure RTOS テクノロジを Eclipse Foundation に提供しました。
Eclipse Foundation を新しい拠点として、Azure RTOS は Eclipse ThreadX になりました。