マイクロコントローラと組み込みシステム用のGUIライブラリは多数ありますが、それらの多くは機能が制限され、使用と統合が複雑で、外部RAMを使用する必要があり、プロジェクト全体よりもコストがかかります。 これらの理由および他の多くの理由により、独自のライブラリを作成することが決定されました。
私は彼女を牧瀬uiと呼んだ。
開発を始める前に、目標を設定しました。
- 最終開発のシンプルさ。 インターフェイスの作成は、WindowsFormsなどを使用するよりも難しくありません。
- 簡単な統合。 アプリケーションへのインターフェイスの埋め込みと実行は、ハードウェアまたはソフトウェアで可能な限りシンプルにする必要があります。
- ピュアC gnu-c99のみが使用され、ライブラリからはstdlibのみが使用されました
- 最小RAM消費。 外部メモリなしで中程度のマイクロコントローラーで使用する機能(320x240のカラーディスプレイで約40kb)。
- 快適な開発のための十分な数のグラフィック要素。 新しいものの簡単な追加。
- 商用プロジェクトでもオープンソースライセンスと無料使用
説明のない例。
ライブラリの機能と使用例を示すために、これらの目的のために特別に作成されたプロジェクトを使用できます: https : //github.com/SL-RU/MakiseSDLTest
レンダリングと入力にSDL2を使用し、システムのすべての要素とほぼすべての機能を使用する例があります。 コンパイルして、任意のLinuxディストリビューションで実行できます。 Windowsでも、理論上のみ-私は自分で試していない。
仕事のビデオ:
構造
ライブラリは、明確に分離された3つの部分で構成されています。
1)コア。 カーネルは、ドライバーへのインターフェース、ドライバーへのレンダリング機能、およびバッファーへのプリミティブのレンダリング機能で構成されています。
2)ドライバー。 ドライバーはハードウェアおよびソフトウェアとのすべての通信を提供するため、通常、各タスクについて、すべてのポイント(DMA、割り込みなど)を考慮するために独自のコードを作成する必要があります。 ドライバは、イメージがバッファからハードウェアに転送されることのみを保証し、イメージバッファをクリアします。 例として、プロジェクトには、ili9340上のディスプレイ用のドライバーと、コンピューター上のライブラリーをデバッグするためのSDL2があります。 カーネルとドライバーは、GUIなしで別々に動作できます。
3)GUI自体。 システムの大部分を占め、インターフェースの操作に必要なすべての機能がここに組み込まれています:コンテナ、要素、レンダリング、フォーカス、入力、イベント処理、その他のシステム。
GUI
グラフィカルインターフェイスの開発は、最終的なプログラミングを最大限に簡素化するために、オブジェクト指向に可能な限り近づけます。 これにより、素晴らしい機能がいくつかあります。
画面上にボタンを作成する最も簡単な例:
MHost host; // , root-, . // void click(MButton *b) { printf("Button was clicked"); // b->text = "Clicked!"; // } MButton button; //, void create_gui() { // m_create_button(&button, // host->host, //, . MHost'a mp_rel(20, 20, // 90, 30), //, "Click me", // // &click, // 0, // , 0, // &ts_button // ); } void main() { // MakiseGui, , MakiseBuffer MHost. . create_gui(); while(1) { // // // } }
合計すると、この例では、クリックすると画面にボタンが作成され、標準出力ストリームに「ボタンがクリックされました」という碑文が表示され、ボタンのテキストが変更されます。
初期化
初期化には、ドライバの起動、サイズの設定、および要素構造とバッファ用のメモリの割り当てのみが含まれます。 純粋に正式な操作。 システムを初期化する方法については、 https : //github.com/SL-RU/MakiseSDLTest/blob/master/src/main.cのstart_m()メソッドで確認できます。
GUIの使用を開始するには、makise_config.hを作成して構成する必要があります。 このファイルでは、システム定義が設定され、必要なディスプレイドライバーが選択されます。 https://github.com/SL-RU/MakiseSDLTest/blob/master/makise_config.h
入る
入力は、マルチスレッドアプリケーションで動作するように適合されています-makise_gui_input_perform(ホスト)を呼び出すときにインターフェイスに送信されるイベントのキューがあります。
入力イベントはすべてMInputData構造で表されます。
ボタン(makise_gui_input.h MInputKeyEnumの標準ボタンのリスト)、文字(他の場所では使用されない)、およびカーソル入力(タッチスクリーンまたはマウス)を入力できます。 SDLの例では、キーボード入力とマウス入力を使用しています。
コンテナ
MContainer-コンテナ構造。
コンテナには、アイテムのリンクリストが含まれています。 コンテナから、アイテムを削除または追加し、アイテムを移動して、他の操作を実行できます。
コンテナ内の要素の位置は、レンダリングと入力キューに直接影響します。
リンクリストは、MElementリストの最初と最後の要素へのポインターを使用して実装され、MElement構造には次と前の要素へのポインターがあります。
要素
すべての要素はMElement構造の形式で表されます。MElement構造には、要素に関する情報、要素の描画、入力、フォーカスなどの機能へのポインタ、およびそのコンテンツへのポインタが含まれます。
現時点では、次の要素があります。
- MButton-ボタン。 クリックするとイベントを送信するテキストを表示する
- MCanvasは、要素のみを含む最も単純なコンテナです。
- MLable-最も単純なテキストフィールド
- MTextField-ワードラップとハイフネーションをサポートするテキストフィールド
- MSlider-スライダー
- MToggle-2つの状態を持つボタン。
- MSListはリストです。 リスト、ラジオボタン、チェックボックスのいずれかです。 通常のリストと動的リンクをサポートします。
- MTabs-タブ。 いくつかの切り替え可能なコンテナ。
例は最良のドキュメントであるため、各要素には独自の使用例があります。 複雑でシンプル。
アイテムの数は時間とともに補充されます。 はい、グラフィックス、画像など、多くの必要な機能はありません。 しかし、私の目的ではまだ必要ありませんが、すぐに必要になる場合は、ライブラリに追加して公開します。 また、自由に追加したり、既存のものを編集したりしてください! プルリクエストは大歓迎です。
スタイル
要素のスタイルによって外観が決まります。 スタイルは、特定の状態の要素の色を設定します。 MakiseStyleおよびMakiseStyleTheme構造がこれを担当します。 MakiseStyleには、特定の状態のいくつかのMakiseStyleThemeとフォント設定が含まれています。
ボタンの場合、スタイルは次のようになります。
MakiseStyle ts_button = { MC_White, // . &F_Arial24,// 0, // // | {MC_Black, MC_Gray, MC_Gray, 0 }, // {MC_Black, MC_White, MC_White, 0 }, // {MC_White, MC_Green, MC_White, 0 }, // {MC_Green, MC_White, MC_White, 0 }, // };
フォーカス
フォーカスは、入力がどの要素に行くかを決定します。 次の機能は、フォーカス制御に使用できます。
MFocusEnum makise_g_focus(MElement *el, MFocusEnum event); // MFocusEnum makise_g_host_focus_next(MHost *host);// MFocusEnum makise_g_host_focus_prev(MHost *host);//
マイクロコントローラーでの作業の例
STM32マイクロコントローラ用のサンプルライブラリも作成されました。 180 MHzのクロック周波数とSTM32f437VGT6 MKを使用し、ILI9341コントローラー上に2.2インチの230x320ピクセルを表示しました。UARTを介したコンピューターのキーボードからの制御。
サンプルコード: https : //github.com/SL-RU/MakiseILI9341Test
サンプル動画:
リポジトリには小さなドキュメントがあります。 しかし、すべての主要なドキュメントは関数のコメントと例にあります。 質問してください! それらに基づいて、ドキュメントを追加します。 多くの点が記事で取り上げられなかった、または通過中に触れられなかった。 この記事が人気を博した場合、たとえば、このGUI用にFSMCを介して接続されたSTM32 + tftディスプレイ用のドライバーの作成について、もう少しお伝えします。
ライブラリには改善が必要な点が多くあり、開発には多くの方法があります。 しかし、現時点では、ライブラリは完全に機能し、安定しています。
プロジェクトライセンスはMITです。 ライブラリとソースコードは好きな場所で好きな場所で使用でき、商用プロジェクトでも問題なく使用できますが、同時にライブラリが機能することを保証するものではありません-すべてがそのままです。
コード内の何かを変更したい場合は、見つかったバグやエラーを修正してから、リポジトリで発行するか、プルリクエストを投げます。
ご質問やご提案をお待ちしております!