ASCIIコードのキー入力(矢印、スペース、エンター)でCUI(BIOS的な?)を動かす
#include "ASCII_CUI.hpp"
// 事前に設定したい変数を定義
bool myBool = false;
float myFloat = 1.0f;
uint8_t myUint8t = 1;
uint16_t myUint16t = 2;
// 画面のレイアウトを定義
ASCII_CUI::Layout main_layout, sub_layout, subsub_layout;
// main_layoutを初期状態でUI作成
ASCII_CUI::UI UI(&main_layout);
// 変更時に呼び出される関数を作成
void on_bool_change(void) {
if (myBool) {
UI << "myBool is true" << std::endl;
} else {
UI << "myBool is false" << std::endl;
}
}
void setup() {
main_layout = ASCII_CUI::Layout({
{"myBool", "BOOLのテスト", ASCII_CUI::Variable(&myBool), &on_bool_change},
{"sub設定", "-> sub", &sub_layout}},
"これはメイン画面表示中のタイトル"
);
sub_layout = ASCII_CUI::Layout({
{"戻る", "-> main", &main_layout}, // mainに戻る用を追加
{"myFloat", "FLOATのテスト", ASCII_CUI::Variable(&myFloat)},
{"subsub設定", "-> subsub", &subsub_layout}},
"main -> sub"
);
subsub_layout = ASCII_CUI::Layout({
{"戻る", "-> sub", &sub_layout}, // subに戻る用を追加
{"myUint8t", "UINT8_Tのテスト", ASCII_CUI::Variable(&myUint8t)},
{"myUint16t", "UINT16_Tのテスト", ASCII_CUI::Variable(&myUint16t)}},
"main -> sub -> subsub"
);
}
int main() {
setup();
while (true) {
UI.print(); // 画面更新
int c = getchar();
if (c == 'w') {
UI.up(); // 上
} else if (c == 's') {
UI.down(); // 下
} else if (c == 'e') {
UI.enter(); // 確定
}
}
return 0;
}
| 値 | 説明 |
|---|---|
| Black | 黒 |
| Red | 赤 |
| Green | 緑 |
| Yellow | 黄 |
| Blue | 青 |
| Magenta | マゼンタ |
| Cyan | シアン |
| White | 白 |
| Normal | 通常 |
- Labelに対して設定します
- 文字色、背景色に設定できます
- (WIP) RGB指定
| 値 | 説明 |
|---|---|
| Reset | リセット |
| Bold | 太字 |
| Underline | 下線 |
| Blink | 点滅 |
| Reverse | 反転 |
| Invisible | 不可視 |
- Labelに対して設定します
| メンバ変数 | 型 | 説明 |
|---|---|---|
| title | std::string | ラベルのタイトル |
| text | std::string | ラベルのテキスト |
| next | ASCII_CUI::Layout* | 次のレイアウトへのポインタ |
| color | ASCII_CUI::Color | ラベルの色 |
| bgcolor | ASCII_CUI::Color | ラベルの背景色 |
| style | ASCII_CUI::Style | ラベルのスタイル |
| selected_color | ASCII_CUI::Color | 選択時のラベルの色 |
| selected_bgcolor | ASCII_CUI::Color | 選択時のラベルの背景色 |
| selected_style | ASCII_CUI::Style | 選択時のラベルのスタイル |
| variable | ASCII_CUI::Variable | ラベルに関連付けられた変数 |
| callback | void (*)(void) | ラベルが決定されたときのコールバック関数 |
| メンバ関数 | 説明 |
|---|---|
| select() | ラベルを選択したときの処理 |
| print() | ラベルを表示 |
| printSelected() | 選択されたラベルを表示 |
- ASCII_CUI::Color,Styleを指定したいときは
Label.color = ASCII_CUI::Color::Normal;のように書きます - variableを設定するときは、
ASCII_CUI::vSet(&変数)でASCII_CUI::Variableに変換して渡します - callback関数は変数の変更後に呼び出されます
- callbackはvoid関数のアドレスを指定してください
- メンバ関数は内部で使用するのでユーザーは無視してください(おい!)
| メンバ関数 | 説明 |
|---|---|
| operator | インデックスでラベルにアクセス |
| size() | レイアウトのサイズを取得 |
| at() | インデックスでラベルにアクセス |
- LayoutはLabelのvectorのようなものです
- [], atでLabelにアクセスできます
| メンバ変数 | 型 | 説明 |
|---|---|---|
| debug_log_length | int | デバッグログの長さ |
| debug_log_place | int | デバッグログの表示位置 |
| メンバ関数 | 説明 |
|---|---|
| print() | レイアウトを表示 |
| popup() | ポップアップを表示 |
| up() | 選択を上に移動 |
| down() | 選択を下に移動 |
| enter() | 選択を確定 |
| operator<<() | デバッグログを出力 |
- Layoutを表示するためのものです
- 同時に仕様することは想定していません
UI << "Hello World!" << std::endl;でデバッグログを出力できます- 使用するインターフェイス(マイコンのUARTやROS2 keyboard topicなど)に応じてup,down,enterを実行してください
#include "ASCII_CUI.hpp"
// 事前に設定したい変数を定義
bool EMG_RQ=0, OVA_EMG_EN=0, UVA_EMG_EN=0, OIA_EMG_EN=0;
float V_LIMIT_HIGH=4.2f;
// 画面のレイアウトを定義
ASCII_CUI::Layout main_layout, drive_power_layout, EX_EMG_TRG_layout;
// main_layoutを初期状態でUI作成
ASCII_CUI::UI UI(&main_layout);
// 変更時に呼び出される関数を作成
void on_emg_change(void) {
if (EMG_RQ) {
UI << "EMG_RQがONになりました" << std::endl;
} else {
UI << "EMG_RQがOFFになりました" << std::endl;
}
}
void setup() {
main_layout = {
{"駆動電源基板設定", "-> drive_power", &drive_power_layout},
{"制御電源基板設定", "-> control_power"},
{"ロボマス制御基板設定", "-> robomas"}
};
drive_power_layout = ASCII_CUI::Layout({
{"戻る", "-> main", &main_layout}, // mainに戻る用を追加
{"EX_EMG_TRG","自動非常停止設定", &EX_EMG_TRG_layout},
{"EMG_RQ","非常停止要求", ASCII_CUI::Variable(&EMG_RQ), &on_emg_change}, // 関数の登録
{"V_LIMIT_HIGH","セル当たりの最大電圧アラート", ASCII_CUI::Variable(&V_LIMIT_HIGH)}},
"main -> drive_power"
);
EX_EMG_TRG_layout = ASCII_CUI::Layout({
{"戻る", "-> drive_power", &drive_power_layout}, // 戻る用
{"OVA_EMG_EN", "過電圧アラート時", ASCII_CUI::Variable(&OVA_EMG_EN)},
{"UVA_EMG_EN", "低電圧アラート時", ASCII_CUI::Variable(&UVA_EMG_EN)},
{"OIA_EMG_EN", "過電流アラート時", ASCII_CUI::Variable(&OIA_EMG_EN)}},
"main -> drive_power -> EX_EMG_TRG"
);
}
int main() {
setup();
while (true) {
UI.print(); // 画面更新
int c = getchar();
if (c == 'w') {
UI.up(); // 上
} else if (c == 's') {
UI.down(); // 下
} else if (c == 'e') {
UI.enter(); // 確定
}
}
return 0;
}