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;
}