Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
ターミナル(コンソール)
namesace TWETERM
はターミナル(コンソール)画面を実装するためのクラスや関数などをまとめています。
基本的なクラス構造は以下のようになっています。クラスITerm
ではターミナルの文字列バッファとその処理、TWETerm_M5_Console
クラスはITermの文字列描画部分を実装したものです。IStreamOutはITerm派生クラスオブジェクトが文字列をターミナルに投入するための基本的な手続きを提供しています。
ターミナル(コンソール)
本ライブラリのターミナル(コンソール)は、文字列ベースの画面を構成することを目的としてます。
以下に設計時の考慮事項を記載します。
固定幅の画面構成を行うこと
日本語の表示が可能であること
ソースコード中に直接日本語文字列を含められるようにすること
UTF-8でソースコードを記述する前提とする
内部処理をUnicodeとすること
UTF-8デコードが出来るようにすること
旧来のキャラクター型のインタフェースを実装できるよう、いくつかのエスケープシーケンスを実装しておくこと
ただしANSIエスケープシーケンスの完全な互換性を目的とはしない
文字色、背景色、太字といった表示属性に対応すること
カーソルを表示・非表示にできること
画面の順方向のスクロールに対応すること
カラム数を超えて文字列を出力した場合は、折り返しを行えること
右端カラムへの文字出力を行った場合、その時点では折り返しを行わないようにすること
上記を実装は、折り返し処理の実装より優先すること
複数のターミナル表示を画面上に同時に表示できること
毎回全画面書き換えといったような描画パフォーマンスの悪い実装でないこと
変更がある行のみを書き換える行単位の描画を行うようにした
フォントを選択できること
配布可能なフォントをライブラリ内に同梱しておくこと
より大きな文字を表示するため、倍角表示に対応すること
本ライブラリのターミナルは、大まかに分けて2要素から構成されます。
M5Stack用のLcd描画ターミナル
M5Stack の 320x240 LCD 用のターミナルの実装です。を実装しています。
本クラスは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
は背景色を指定します。
色は565形式の16bit値です。TWEARD::color565()
関数で計算します。
白色は ALMOST_WHITE
で指定します。color565(255,255,255) または WHITE を指定すると描画が崩れます。
ターミナルで使用できる8色のテーブルを指定します。ptbl
はuint16_t
型の配列で8つの要素が必要です。
上記の例では青とマゼンダの色調を変えたテーブルを指定し、ターミナルオブジェクト the_screen
に指定しています。
r, g, b
を指定して、565形式の色コードを生成します。
ターミナル用文字バッファ管理クラス
ターミナル(コンソール)の基底クラスで、画面上の文字列を管理する。このクラスは、実際の画面描画についての手続きは含まれず、このクラスを継承したサブクラスによって画面描画を実装します。
カラム数u8c
と行数u8l
を指定して、ターミナルを構築する。カラム数と行数はターミナルで管理できる最大の値を指定する。ターミナルのサイズ変更を行った場合でも各々の最大の値を超える変更は行われない。
pAryLines
とpBuff
を指定する場合は、ITerm内でのメモリ確保は行われず、外部で確保済みの配列を利用する。
動的にメモリを確保した場合は、そのメモリ領域を破棄します。
clear()
は画面バッファのクリア、home()
はカーソル位置をホームポジションに移動、clear_screen()
は両者を実行します。
指定行をクリアする。fill_blank
をtrue
にすると指定行を空白で埋める。
サブクラスにより実装される画面更新描画のためのメソッドです。描画方法は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&
(自身)で続けて出力メソッドなどを記述できる。
<<
演算子を用いてターミナルに文字列を書き出します。
フォントジェネレータ関数
フォントジェネレータ関数は、収録フォントごとに定義されています。関数パラメータは共通で、以下のようになります。
上記は東雲フォント16ドット版(常用漢字収録)のジェネレータの例です。
id
は、ユーザが指定するフォントID。
line_space
はフォントの行間スペースをピクセル数で指定します。
char_space
は文字間スペースでピクセルで指定します。文字間スペースはシングル幅のフォントの指定です。ダブル幅のフォントの場合は倍になります。
u32Opt
は、フォントのオプションを指定します。オプションはU32_OPT_FONT_TATEBAI
とU32_OPT_FONT_YOKOBAI
があり、論理和で指定します。
フォントジェネレータの戻り値はFontDef&
になっています。この戻り値はライブラリ内部のフォント管理テーブルに生成されたオブジェクトへの参照です。既に登録済みのIDであるばあいは、そのIDに対して上書きを行います。登録できなかった場合は.is_default()
メソッドがtrue
になるデフォルトフォントが返されます。
フォントの描画
フォントをスクリーン上に描画します。
以下の例では、Bボタンを押すたびに、事前に生成したフォントID=10のフォントを用いて固定の文字列を描画します。
font
を用い、左上座標(x
,y
)に、文字色fg
、背景色bg
、オプションopt
で文字を描画します。
uint16_t c
をパラメターとして与えた場合は、Unicode c
に対応する文字を1文字描画します。
const char *s
をパラメータとして与えた場合は、s
をUTF-8としてデコードし、文字列として出力します。
const uint16_t* s
をパラメータとして与えた場合は、Unicode文字列として描画します。
opt
はオプションのビットマップです。以下の指定が可能です。
0x01
- 太字指定
0x02
- カーソルの描画
戻り値は、描画が行われればX(幅)方向に描画したピクセル数を返し、エラーなどが発生したときは0を返します。
実装時では以下のM5StackのAPIを利用しています。
M5.Lcd.startWrite()
M5.Lcd.setWindow()
M5.Lcd.endWrite()
tft_Write_16()
フォント定義や描画
namespace TWEFONT
には、フォントの定義やフォント描画のための手続きをまとめています。
このフォントライブラリは M5Stack 標準のライブラリのフォントには準じていないため M5Stackでのフォント描画APIなどで使用することが出来ません。
フォントはFontDef
クラスにより管理されます。フォントごとに用意されるFontDef
クラスオブジェクトのジェネレータ関数により生成され、ライブラリ内部で生成時に指定したフォントIDと紐づけて管理されます。フォントは最大7つまで定義できます。フォント作成時に字間・行間・倍角を指定することができます。同じフォントに対して複数のフォントIDの登録が可能です。
下記の例では、フォントID 10 に16ドットの東雲フォント(縦倍角・横倍角指定)を、フォントIDを11に同じフォントですが倍角指定なし、行間を1ピクセルとしたフォント定義を行います。
コンパイル時に、ジェネレータ関数createFont???()
を呼び出されたフォントのデータがリンクされます。
フォントの登録した種類だけROM容量が必要になります。最小限のフォントを選択するようにしてください。
本ライブラリには、作者が事実上パブリックドメイン(著作権等取扱はソースヘッダに含まれるクレジットを参照ください)を宣言しているフォントをいくつか含めています。
本ライブラリに含めるにあたって、以下の調整を行っています。
大本がBDF形式を変換し、描画ルーチンに適したデータ構造とした
これらフォントをUnicodeとして取り扱うための参照テーブルを用意した
latin1補助文字 U+00A0~u+00FFについて、フォント定義があるものについては収録した
JIS X201 半角カナ U+FF61~U+FF9F について、フォント定義があるものについては収録した
常用漢字(2645 文字)のフォントデータと、全収録(東雲フォントのみ、一部未収録字形があります)を用意した
ジェネレータ関数createFont???()には収録文字数に応じて3種類のジェネレータを用意しています。文字セットの生成は{MWM5ライブラリ}/fontsフォルダにあるスクリプトによって行います。
全収録版(_full
)は字形データが多いためより多くのROM容量が必要です。同じフォントサイズのデータで常用版と全収録版の両方を登録する意味はありません。常用漢字版の字形データは全収録版に包含されるためです。
12,14,16ドット版をライブラリに含めています。
常用漢字のみのジェネレータ (createFontShinonome12???()
, createFontShinonome14???()
, createFontShinonome16???()
)を呼び出します。
ジェネレータ createFontMP10???()
または createFontMP12???()
を呼び出します。
ジェネレータ createFontLcd8x6()
を呼び出します。
latin拡張文字や日本語フォントは含まれません。
このフォントはいずれかのジェネレータ関数createFont???()
が呼び出されたときに、デフォルトとしてフォントID=0に登録されます。
フォントIDは作成したフォントごとに割り当てられます。
IDは 0..32 の値を指定可能ですが、ユーザが登録できるのは 1..32 で最大7フォント登録できます。
ID=0 のフォントは 8x6 LCD フォントに割り当てられます。
エスケープシーケンス
エスケープシーケンスは ESC 文字 '\033' で始まり何文字かで完結する制御コードです。
本ライブラリが動作するプログラム上や、シリアルポートの先にあるマイコンから制御文字をターミナルに投入することで、様々な画面制御(画面のクリア、カーソルの移動、色などの表示属性の変更)を行うことが出来ます。
以下に対応するエスケープシーケンスを記述します。表中の ESC はエスケープ文字 '\033'、イタリックの n や m は数字の入力です。
ITerm
で対応するエスケープシーケンスは、ANSIターミナル互換を目的としたものではありません。解釈や仕様には違いがあります。
フォント定義クラス
フォント定義と関連する手続きをまとめたクラスです。
このクラスオブジェクトはフォントジェネレータによりライブラリ内部で生成・管理され、ユーザがコンストラクタを用いて直接オブジェクトを生成することはありません。
パラメータを省略した場合は、フォントのシングル幅文字の幅を返します。この値にはフォント生成時に指定した文字間スペースも含まれます。
wc
を指定した場合は、Unicode wc
に対応するフォントの幅を返します。日本語などダブル幅のフォントの場合は、シングル幅の2倍の値が戻ります。
フォントの高さを返します。この値にはフォント生成時に指定した行間スペースも含まれます。
デフォルトフォントのオブジェクトである場合 true
を返します。
フォントIDを取得します。
Unicode c
に対応する、ダブル幅フォント定義配列インデックスを検索します。
戻り値は、字形データが存在する場合は、インデックス配列のインデックス(データ配列のインデックスが計算できる)、存在しない場合は-1
を返します。
フォント定義は、インデックス配列、データ配列の2つから構成されます。インデックス配列の各値は昇順に並んだ Unicode になっていて、データ配列のインデックスに対応しています。
以下の例ではインデックス配列の IDX=829 が U+5a2f で "娯" という文字です。データ配列の対応する番地を参照すれば、この字形データが格納されています。
インデックス配列内の値は昇順に並ぶよう構成した目的は、本関数で実装されている二分探索を利用するためです。
ターミナル画面上の文字列を管理するクラスや関数をまとめた
フォントの管理と描画に関連するクラスや関数をまとめた
日本語文字セットを表示するためのフォントの取り扱いについてはを参照してください。
フォント情報にアクセスするためには、によりオブジェクトを取得し、諸情報を得ます。
ターミナルにフォントを指定するには、フォントの生成を行い、フォントIDをターミナルオブジェクトに指定します。フォント指定後はメソッドによる再描画を行います。
ターミナルのフォント変更は、によりフォントを指定し、その後、とを呼び出します。
関数を用いて描画することができます。
デフォルトフォントのオブジェクトはやのエラー時など例外時にも利用されます。
設定
意味
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_FG_MAGENTA
マゼンタ
TERM_COLOR_FG_CYAN
シアン
TERM_COLOR_FG_WHITE
白
設定
意味
TERM_COLOR_BG_BLACK
黒
TERM_COLOR_BG_RED
赤
TERM_COLOR_BG_GREEN
緑
TERM_COLOR_BG_YELLOW
黄
TERM_COLOR_BG_BLUE
青
TERM_COLOR_BG_MAGENTA
マゼンタ
TERM_COLOR_BG_CYAN
シアン
TERM_COLOR_BG_WHITE
白
パラメータ | 意味 |
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) に該当する出力を行います |
TermAttr a | 文字属性を設定します |
メソッド名 | 解説 |
post_refresh() | サブクラスでのrefresh()実装で、最後に呼び出す必要があります。必要な変数の初期化を行います。 |
resize_screen() | 指定されたカラム数・行数に従い、バッファを再構成します。コンストラクタ指定の初期値を超えた指定はできません。 |
column_idx_to_vis() |
|
column_vis_to_idx() |
画面上の行位置、カラム位置(ともに0が先頭位置)から、画面バッファー上のカラム位置を計算します。日本語文字のような2文字幅文字を2カラムとして計算します。 "abcあいう"という文字列が格納された行の画面上のカラム位置5または6は"い"の文字が格納されますが、本関数で画面バッファー上のカラム位置を計算すると4になります。 |
ジェネレータ | ワイド幅 文字数 | 収録 |
| 576 | ASCII, latin1拡張, JIS-X201(半角カナ:0xA1-DF), かな,カナ,記号(選別), 漢字(選別:MWM5ソース中に出現する文字をスクリプトにより抽出・追加), スクリプト指定文字 |
| 2645 | ASCII, latin1拡張, JIS-X201(半角カナ:0xA1-DF), かな,カナ,記号,常用漢字,スクリプト指定文字 |
| 6867 | ASCII, latin1拡張, JIS-X201(半角カナ:0xA1-DF), かな,カナ,記号,漢字,スクリプト指定文字 |
エスケープシーケンス | 意味 |
ESC [ n A | カーソルをn行上に移動する。(n省略時は1行) |
ESC [ n B | カーソルをn行下に移動する。(n省略時は1行) |
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 → 属性抹消 |
フォントクラスオブジェクトの取得
createFont???()
によりフォント生成したクラスオブジェクトを参照します。
idにはフォント生成時に指定したフォントIDを指定します。
戻り値は FontDef&
で、ライブラリ内のフォント管理配列内に格納されたオブジェクトへの参照です。
idに0を指定すると、フォントID=0のデフォルトフォントを戻します。存在しないIDを指定した場合も、どうようにデフォルトフォントを戻します。FontDef
オブジェクトがデフォルトフォントかどうかはメソッド.is_default()
により判定できます。