void putmsg(ITerm& trm, const char *msg) {
trm << TermAttr(TERM_COLOR_FG_RED | TERM_BOLD);
trm << msg;
trm << TermAttr(TERM_ATTR_OFF);
}TermAttr(GChar::tAttr attr = 0)文字色のいずれか
背景色のいずれか
マゼンタ
TERM_COLOR_FG_CYAN
シアン
TERM_COLOR_FG_WHITE
白
マゼンタ
TERM_COLOR_BG_CYAN
シアン
TERM_COLOR_BG_WHITE
白
設定
意味
TERM_ATTR_OFF = 0x0
すべての属性をクリアする
TERM_BOLD
文字を太字にする
TERM_REVERSE
背景色と文字色を反転表示する
設定
意味
TERM_COLOR_FG_BLACK
黒
TERM_COLOR_FG_RED
赤
TERM_COLOR_FG_GREEN
緑
TERM_COLOR_FG_YELLOW
黄
TERM_COLOR_FG_BLUE
青
設定
意味
TERM_COLOR_BG_BLACK
黒
TERM_COLOR_BG_RED
赤
TERM_COLOR_BG_GREEN
緑
TERM_COLOR_BG_YELLOW
黄
TERM_COLOR_BG_BLUE
青
TERM_COLOR_FG_MAGENTA
TERM_COLOR_BG_MAGENTA
M5Stack用のLcd描画ターミナル
M5Stack の 320x240 LCD 用のターミナルの実装です。ITermを実装しています。
本クラスはnamespace TWEARD内に定義されます。
にdrawAreaと_M5のパラメータが追加されています。
drawAreaは、LCD内のターミナル描画エリアを決めます。Rect構造体で指定しx,y,w,hを指定します。(x,y)は領域の左上の座標、(w,h)は領域の幅と高さです。
_M5は、M5Stackのグローバルインスタンス M5を指定します。
カラム最大値を64、行数の最大値を20、左上座標を (0, 16)、領域サイズを (320, 192) として the_screen オブジェクトを構築します。
ITerm::refresh()の実装です。この関数により画面の描画を行います。loop()関数内で定期的に呼び出します。
本実装では、パフォーマンスの向上のため、原則として描画変更の必要にある行のみを上書きします。画面全領域を再描画したい場合はforce_refresh()メソッドを呼び出します。
以下の例では32msごとに描画を行います。
フォントを指定します。
u8idはフォントIDを指定します。
u8col_requestは、設定したいカラム数を指定します。指定した数値が領域サイズに対して大きい場合は指定領域に入るように値が丸められます。0を指定した場合は、領域サイズから計算できる最大のカラム数に設定されます。
u8row_requestは、設定したい行数を指定します。指定した数値が領域サイズに対して大きい場合は指定領域に入るように値が丸められます。0を指定した場合は、領域サイズから計算できる最大の行数に設定されます。
font_id()は、指定したフォントのIDを返します。
font_width()は、指定したフォントの幅をピクセル数で返します。ダブル幅のピクセル数は、この値の2倍になります。
font_height()は、指定したフォントの高さをピクセル数で返します。
ターミナルの文字色と背景色を指定します。
colorは文字色を指定します。
bgcolorは背景色を指定します。
白色は ALMOST_WHITE で指定します。color565(255,255,255) または WHITE を指定すると描画が崩れます。
ターミナルで使用できる8色のテーブルを指定します。ptblはuint16_t型の配列で8つの要素が必要です。
上記の例では青とマゼンダの色調を変えたテーブルを指定し、ターミナルオブジェクト the_screenに指定しています。
r, g, b を指定して、565形式の色コードを生成します。
TWETerm_M5_Console(
uint8_t u8c, uint8_t u8l,
Rect drawArea, M5Stack& _M5)
TWETerm_M5_Console(
uint8_t u8c, uint8_t u8l,
TWETERM::SimpBuf_GChar* pAryLines, TWETERM::GChar* pBuff,
Rect drawArea, M5Stack& _M5)TWETerm_M5_Console the_screen(64, 20, { 0, 16, 320, 192 }, M5);void loop() {
static uint32_t u32mills;
uint32_t u32now = millis();
if (u32now - u32mills > 32) {
the_screen.refresh();
u32mills = u32now;
}
}void set_font(uint8_t u8id, uint8_t u8col_request = 0, uint8_t u8row_request = 0)uint8_t font_id()
uint8_t font_width()
uint8_t font_height()void set_color(uint16_t color, uint16_t bgcolor = 0)uint16_t c = color565(255, 127, 0); // R:255, G:127, B:0void set_color_table(const uint16_t* ptbl)static const uint16_t COLTBL_MAIN[8] = {
BLACK,
RED,
GREEN,
YELLOW,
color565(127, 127, 255), // BLUE,
color565(255, 0, 142), // MAGENTA,
CYAN,
ALMOST_WHITE
};
the_screen.set_color_table(COLTBL_MAIN);constexpr uint16_t color565(uint8_t r, uint8_t g, uint8_t b)エスケープシーケンス
エスケープシーケンスは ESC 文字 '\033' で始まり何文字かで完結する制御コードです。
本ライブラリが動作するプログラム上や、シリアルポートの先にあるマイコンから制御文字をターミナルに投入することで、様々な画面制御(画面のクリア、カーソルの移動、色などの表示属性の変更)を行うことが出来ます。
以下に対応するエスケープシーケンスを記述します。表中の ESC はエスケープ文字 '\033'、イタリックの n や m は数字の入力です。
エスケープシーケンス
意味
ESC [ n A
カーソルをn行上に移動する。(n省略時は1行)
ESC [ n B
カーソルをn行下に移動する。(n省略時は1行)
ITermで対応するエスケープシーケンスは、ANSIターミナル互換を目的としたものではありません。解釈や仕様には違いがあります。
ESC [ n C
カーソルをn列右に移動する。(n省略時は1列)
ESC [ n D
カーソルをn列左に移動する。(n省略時は1列)
ESC [ n G
カーソルのカラムnの位置に移動する (n省略時は1カラム目=行頭)
ESC [ n ; m H
カーソル位置を行n列mに移動する。先頭位置の場合は1を指定します。n;mを省略した場合は左上ホームポジションにカーソルを移動します。
ESC [ n ; m f
ESC [ n ; m Hに同じ。
ESC [ 2 J
画面をクリアしてカーソルをホームポジションに移動する。
ESC [ n K
n=0 または省略 カーソル行より後ろを削除する
n=1 カーソル行より前を削除する
n=2 行全体を削除する
ESC [ n1 ; n2 ; ...; n4 m
描画属性の設定を行う。n1 .. n4 は任意数指定できる。
1 → 太字
7 → 反転
30 .. 37 → 文字色
40 .. 47 → 背景色
0 → 属性抹消
ターミナル(コンソール)
namesace TWETERMはターミナル(コンソール)画面を実装するためのクラスや関数などをまとめています。
基本的なクラス構造は以下のようになっています。クラスITermではターミナルの文字列バッファとその処理、TWETerm_M5_ConsoleクラスはITermの文字列描画部分を実装したものです。IStreamOutはITerm派生クラスオブジェクトが文字列をターミナルに投入するための基本的な手続きを提供しています。
[IStreamOut]
↑
[ITerm]
↑
[TWETerm_M5_Console]ターミナル用文字バッファ管理クラス
ターミナル(コンソール)の基底クラスで、画面上の文字列を管理する。このクラスは、実際の画面描画についての手続きは含まれず、このクラスを継承したサブクラスによって画面描画を実装します。
カラム数u8cと行数u8lを指定して、ターミナルを構築する。カラム数と行数はターミナルで管理できる最大の値を指定する。ターミナルのサイズ変更を行った場合でも各々の最大の値を超える変更は行われない。
pAryLinesとpBuffを指定する場合は、ITerm内でのメモリ確保は行われず、外部で確保済みの配列を利用する。
動的にメモリを確保した場合は、そのメモリ領域を破棄します。
clear()は画面バッファのクリア、home()はカーソル位置をホームポジションに移動、clear_screen()は両者を実行します。
サブクラスにより実装される画面更新描画のためのメソッドです。描画方法は2種類あり、メンバー変数u32Dirtyに定義されるビットマスクに対応した行のみを再描画するものと、force_refresh()メソッドによる画面全体を再描画するものがあります。
画面全体の再描画では、いったん背景を背景色で塗りつぶしてから再描画します。初回の描画ではforce_refresh()を行うようにしてください。
ターミナルに1文字書き出します。カーソル位置に文字を書き出します。16bit wchar_t型のUnicodeを渡します。
char_t (char) 型のパラメータを渡した場合は、入力をUTF-8として取り扱います。例えば0x7F までのASCII文字はそのままwrite(wchar_t)が呼び出され、3バイトのUTF-8エンコードされた日本語文字は、連続して3バイトを投入した時点でwrite(wchar_t)が呼び出されます。
ターミナルの行数、カラム数を返す。
<<演算子を用いてターミナルに文字列を書き出します。
ITerm(uint8_t u8c, uint8_t u8l)
ITerm(uint8_t u8c, uint8_t u8l, SimpBuf_GChar* pAryLines, GChar* pBuff)文字属性を設定します
パラメータ
意味
const char *s
文字列 s をターミナルに書き出す (UTF-8のデコードを行います)
IStreamSpecial& sc
crlf (改行)など特殊文字を出力する
char_t c
文字 c をターミナルに書き出す (UTF-8のでコードを行います)
wchar_t c
文字 c (Unicode)をターミナルに書き出す
int i
printf("%d", i) に該当する出力を行います
メソッド名
解説
post_refresh()
サブクラスでのrefresh()実装で、最後に呼び出す必要があります。必要な変数の初期化を行います。
resize_screen()
指定されたカラム数・行数に従い、バッファを再構成します。コンストラクタ指定の初期値を超えた指定はできません。
column_idx_to_vis()
uint16_t column_idx_to_vis(int16_t idx , int16_t lin)
Unicodeで管理されている画面バッファー上の行位置・カラム位置(ともに0が先頭位置)から、画面上のカラム位置を計算します。日本語文字のような2文字幅文字を2カラムとして計算します。 "abcあいう"という文字列が格納された行のカラム位置4は"い"の文字が格納されますが、本関数で画面上のカラム位置を計算すると5になります。
column_vis_to_idx()
column_vis_to_idx(int16_t c_vis, int16_t lin)
画面上の行位置、カラム位置(ともに0が先頭位置)から、画面バッファー上のカラム位置を計算します。日本語文字のような2文字幅文字を2カラムとして計算します。 "abcあいう"という文字列が格納された行の画面上のカラム位置5または6は"い"の文字が格納されますが、本関数で画面バッファー上のカラム位置を計算すると4になります。
TermAttr a
// 静的メモリ確保例
const uint8_t U8COL = 64;
const uint8_t U8LINE = 20;
static TWETERM::GChar screen_buf[U8COL * U8LINE]; // pBuff
static TWETERM::SimpBuf_GChar screen_lines[U8LINE]; // pAryLinesvirtual ~ITerm()void clear()
void home()
void clear_screen()virtual void refresh() = 0
void force_refresh()ITerm& write(wchar_t c)
ITerm& write(char_t c)uint8_t get_height() // 行数
uint8_t get_width() // カラム数ITerm& operator << (const char *s)
TWE::IStreamOut& operator << (TWE::IStreamSpecial& sc)
TWE::IStreamOut& operator << (ITerm& t, char_t c)
TWE::IStreamOut& operator << (ITerm& t, wchar_t c)
TWE::IStreamOut& operator << (ITerm& t, int i)
TWE::IStreamOut& operator << (ITerm& t, TermAttr a)
TWE::IStreamOut& operator << (TWE::IStreamOut& t, TermAttr a)