実用ライブラリシリーズ: Anchor (小型GUIフレームワーク)
.
工事中
この文書は現在編集中です。 完成まで今暫くお待ち下さい。
背景
小さなマイコンシステムにおいて、美しいユーザインターフェースが欲しくなる事があります。
しかし、それらに多くの時間を割きたいわけではありません。
そこで、小さなGUIフレームワークを設計実装してみました。
基本コンセプト
- シンプル
- 小さなフットプリント
- 使用、追加、変更が容易
- 美しい出力
- パワフルな機能 (ちょっとだけ!)
- C++ベース
スクリーンショット
96x64ドットのディスプレイに描画した例です。
デフォルトで簡単なコンポーネントが付いてきます。
よくある質問
どうやって使うの?
実際に使用する表示器に合わせて表示用クラスの実装が必要です。
後は画面を構成するクラスを追加するだけでアプリケーションを構成することができます。
例えば2つの画面を持つアプリケーションを実現する場合、main関数は以下のようにシンプルに構成することができます。 <<code title="main.cpp">>
- include "mbed.h"
- include "Anchor.h"
- include "MyDesktopDefines.h"
- include "MyDisplayOLED.h"
- include "MyDesktop1.h"
- include "MyDesktop2.h"
- include "MyInputRotaryEncoder.h"
- include "MyOutputLED.h"
MyDisplayOLED display(p5, p6, p7, p21, p22, p23); AApplication app(&display); MyInputRotaryEncoder input_re("Encoder", p17, p18); MyOutputLED output_led("LED");
MyDesktop1 desktop1(DESKTOP_1, "Desktop No.1", 96, 64); MyDesktop2 desktop2(DESKTOP_2, "Desktop No.2", 96, 64);
int main() { app.addInput(&input_re); app.addOutput(&output_led); app.addDesktop(&desktop1); app.addDesktop(&desktop2); app.loop(); } <</code>>
MyDesktop, MyDisplayOLED, MyDesktop1, MyDesktop2, MyInputRotaryEncoder, MyOutputLEDはそれぞれあるクラスを継承したクラスです。
アプリケーションを構成する上で一番重要なのはDesktopクラスです。
このクラスが各GUI画面の下地を提供します。
Desktopにオブジェクトを追加していくことでユーザインターフェースを構成することができる仕組みになっています。
InputとOutputに関しては後述します。
Desktopはどんな風に実装するの?
ADesktopを継承して実装します。
例えば先ほどのMyDesktop1クラスのヘッダは以下のようになっています。
<<code title="MyDesktop1.h">>
- ifndef MY_DESKTOP1_H
- define MY_DESKTOP1_H
- include "Anchor.h"
- include <mbed.h>
class MyDesktop1 : public ADesktop { public: MyDesktop1(const char *name, char *text, int width = 0, int height = 0); virtual MyDesktop1(); virtual void tick(AContext *context); private: MyDesktop1(); LocalFileSystem fs; AImageBmpFile bmpimg; };
- endif <</code>>
MyDesktop1.hに対応する実装MyDesktop1.cppは以下のようになっています。
tick関数は一定間隔で呼ばれます。
この中に色々な処理を記述することができるようになっています。
<<code title="MyDesktop1.cpp">>
- include "MyDesktop1.h"
- include "MyDesktopDefines.h"
MyDesktop1::MyDesktop1(const char *name, char *text, int width, int height) : ADesktop(name, text, width, height), fs("local"), bmpimg("AImageBmpFile.1", "/local/test.bmp", 96, 64) { add(&bmpimg, 0, 0); }
MyDesktop1::MyDesktop1() { }
void MyDesktop1::tick(AContext *context) { static int cnt = 0; switch (cnt) { case 0: /*
- To update the display.
- / break; case 1: /*
- Block the application control.
- Page translation.
- / wait(5); context->select(DESKTOP_2); break; } cnt++;
/*
- Give the tick to the child.
- / tickChild(context); } <</code>>
main.cpp内ではAApplicationクラスのaddDesktop関数を使って独自のDesktopクラスを追加しました。
tick関数に渡されたコンテキストクラスのselect関数を使うことでデスクトップを切り替える事ができるようになっています。
上記の例ではMyDesktopDefines.hで定義された名称DESKTOP_2を渡しています。
キー入力とかはどうするんだい?
何かを出力したい場合はどうするんだい?
構造
基本構造を成すオブジェクト群
AObject
- AObjectは特別なオブジェクトを除いた全てのAnchorオブジェクトの親です。
- このオブジェクトは直接インスタンスを生成することはできません。
<here is="" the="" draw="">
ADisplay
- ADisplayはGUIの出力する為のディスプレイの親です。
- このオブジェクトは直接インスタンスを生成することはできません。
- お持ちのディスプレイデバイスにあわせてディスプレイオブジェクトを設計することができます。
<here is="" the="" draw="">
AFrameBuffer
- AFrameBufferはADisplayに表示を行う内容を保持するフレームバッファです。
- このオブジェクトは直接インスタンスを生成することはできません。
- お持ちのディスプレイデバイスにあわせてフレームバッファオブジェクトを設計することができます。
<here is="" the="" draw="">
ウィジェット群
ウィジェットがGUIの世界を創ります。
AWidget
- AWidgetは全てのウィジェットの親です。
- このオブジェクトは直接インスタンスを生成することはできません。
- GUIアプリケーションにあわせて独自のウィジェットオブジェクトを設計することができます。
ACheckBox
ADeskTop
AImage
ALabel
AProgressBar
AWindow
独自アプリケーション構築の為に
ADesktopManager
AApplication
AInputDevice
AOutputDevice
AInputDeviceManager
AOutputDeviceManager
ライセンス
mbed上で使用する場合
- ライブラリコードのライセンスはMITライセンスです。
- 使用、追加、変更は自由にできます。
その他のプラットフォーム(mbed以外)で使用する場合
- ライブラリコードのライセンスはMITライセンスです。
- 以下の情報を私に報告して下さい。これは私の個人的な興味のためです。
- 国名
- 可能であれば社名
- 可能であれば製品名
- 使用、追加、変更は自由にできます。
ライセンス文章
<<code>> /**
- =============================================================================
- Anchor - A tiny GUI framework for embedded system.
- =============================================================================
- Copyright (c) 2010 Shinichiro Nakamura (CuBeatSystems)
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- =============================================================================
- / <</code>>
Please log in to post comments.