Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
パケット種別ごとの定義
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
汎用クラス・関数
基本クラス、関数
Loading...
Loading...
ユーティリティ関数
Loading...
Loading...
Loading...
書式パーサー
書式パーサーは、IParserを基底クラスとして、書式ごとに派生クラスを実装します。
パーサーは、シリアルポートのように1バイトずつ入力されるデバイスを想定し、1バイト単位での解釈を行い、都度状態を遷移する状態遷移マシンとして実装されます。
パケット種別定義
以下のパケットに対応します。
名前
解説
PKT_ERROR
パケット解釈前やパケット種別が特定できないなど、TwePacketには意味のあるデータが格納されていない
PKT_TWELITE
標準アプリ App_Twelite の 0x81 コマンドを解釈したもの
PKT_PAL
TWELITE PALのシリアル形式を解釈したもの
パケット種別判定
パケットデータのバイト列を入力として、パケットの種別を判定します。また既に生成済みのspTwePacket
オブジェクトの種別を返します。戻り値はE_PKTです。
シリアル電文パーサー
パーサーは、シリアルポートからの電文を解釈し、その内容を読み取ります。
- 電文形式を解釈します
- 解釈した電文の内容を読み取ります
パーサーの基底クラス
パーサーオブジェクトに1バイトずつ電文を投入することで、電文系列を解釈する状態遷移マシンです。
パーサーに1バイト入力します。入力のたびにパーサーの状態が変化し、パーサーの解釈が完了するとstate()
がE_TWESERCMD_COMPLETE
に変化し解釈完了状態となります。
パーサーの状態を取得します。
パーサーの状態がE_TWESERCMD_COMPLETE
の場合true
になります。
パーサーで解釈済みのバイト列のデータ長を返します。
パーサーの解釈済みのバイト列にアクセスします。
パーサーの解釈済みのバイト列を格納した配列クラスSmplBuf_Byte
を参照します。
パーサーの解釈途中の内容を破棄し、新たな解釈を始めます。
IStreamOutをベースクラスにもつストリームオブジェクトに、書式出力します。
1バイト入力して解釈を進める仮想関数です。派生クラスにより実装されます。
バイト配列bobj
に格納されるバイト列に対応する書式をストリームp
に出力する仮想関数です。派生クラスにより実装されます。
パケットオブジェクト
パケットデータは種別によってデータ構造が違いますが、様々な種類のパケットを一元管理するための基底クラスです。
spTwePacket
はメモリ管理のためのスマートポインタです。std::shared_ptr
を用いています。
TwePacketクラスは、パケットデータのパケット種別の管理を行います。また、パケットデータの解釈を行うための仮想関数parse()メソッドを定義しています。パケット特有のデータ構造に基づく解釈やデータの保存等の取り扱いは、派生クラスに実装します。
デフォルトでは、未解釈状態として E_PKT::PKT_ERROR
で初期化します。
パケットデータのバイト列を与えて、パケットデータを解釈する。
派生クラスで、そのパケットに対応するデータ構造を解釈するための実装を行います。
パケットデータの解釈とオブジェクト生成
パケットデータのバイト列を入力として、パケット種別の判定と、種別に応じたオブジェクトを生成します。
事前にを用いてパケットの種別が特定できている場合はeType
を与えます。
戻り値はです。
アスキー形式のパーサー
アスキー書式の解釈を行うパーサーですが、TWESYS::TimeOut
クラスをベースクラスに持つことで、タイムアウト処理を行っています。
パーサーオブジェクトを生成します。
生成時のパラメータにmaxbuffsiz
を与えると、maxbuffsiz
をバッファサイズとして動的にメモリ確保して、パーサーを初期化します。
あらかじめ生成されたSmplBuf_Byte
配列bobj
を参照して、パーサーを初期化することもできます。
アスキー書式の解釈アルゴリズムを実装します。バイトの入力のたびにタイムアウトのチェックを行います。
書式出力を行います。s_Output()
メソッドを呼び出します。
vPutByte()
は、ストリームに対して与えられたバイトu8byte
をアスキー2文字で出力します。例えば0x9Aであれば"9A"という2バイト文字になります。
s_vOutput()
は、ストリームに対して、与えられたバイト配列SmplBuf_Byte
のバイト列をアスキー形式で出力します。
パケット定義
書式を解釈して得られたデータ列は、受信したパケット情報が含まれます。ここでは、このデータ列のことをパケットデータと呼びます。
パケットデータはクラスで表現されます。TwePacket
クラスのデータを解釈することで、その種別を判定し、各アプリケーションや接続ハードウェアに応じたデータ構造となります。TwePacket
クラスは基底クラスでさらにパケット種別ごとの派生クラスとなります。
このオブジェクトは無線パケットのデータ量に準じたメモリ領域を消費し、また、アプリケーションでは多数のパケットを保持することも考えられます。メモリ管理を簡略化するためTwePacket
をスマートポインタstd:shared_ptr<TwePacket>
にて管理します。このスマートポインタをspTwePacket
にtypedef
しています。
以下に、TWELITE PALのパケットデータの場合のクラス関係を示します。TwePacketPal
の基底クラスの一つDataPal
はTWELITE PAL特有のデータを格納しています。TWELITE PALには、さらに接続されるセンサーパルによって格納すべきデータが異なります。TwePacketPal
からさらにPalAmb
やPalMot
を生成します。例えばPalAmb
には温室センサーの値や照度センサーの値が格納されます。このTwePacketPal
をスマートポインタspTwePacket
という形に生成するのがnewTwePacket()
です。
spTwePacket
型はスマートポインタですので、オブジェクトのコピー渡しによる記述を行うことで、コピーのオーバーヘッドを最小にしつつ、メモリーの管理を自動化できます。以下の例はパケットの履歴を管理する単純なクラスです。
パケットの種別を型で返します。
戻り値は 型 で、成功時は解釈されたパケット種別を、エラー時に E_PKT::PKT_ERROR
を返します。
状態名 | 値 | 状態 |
| 0 | 解釈前で、まだ系列のヘッダも認識できていない |
1..0x7F | 解釈中 |
| 0x80 | 系列が正しく解釈できた |
| 0x81 | 系列の解釈にエラーがあった |
| 0x82 | 系列は得られたがチェックサムエラーだった |
spTwePacketオブジェクトの参照
本関数はspTwePacket
オブジェクトをTwePacket&
として参照します。
この関数は、->
演算子や*
演算子を極力使用しない方針でライブラリを設定しているため、スマートポインタの参照を行うために用意しています。
上記の判定式を(pkt && pkt->get_type() == E_PKT::PKT_TWELITE)
と記述しても同じ判定が得られます。
PAL共通データ
PALは接続されるセンサーなどによってパケットデータ構造が異なりますが、DataPal
では共通部のデータ構造を保持します。
PALのパケットデータ構造は大まかに2つのブロックからなり、全てのPAL共通部と個別のデータ部になります。個別のデータ部は、パケットの解釈を行わずそのまま格納しています。取り扱いを単純化するため32バイトを超えるデータは動的に確保するuptr_snsdata
に格納します。
個別のデータ部は、PalBaseをベースクラスに持つ構造体に格納されます。この構造体は、TwePacketPalに定義されるジェネレータ関数により生成されます。
App_Twelite データ
TwePacketTwelite
のデータ部分。
ターミナル(コンソール)
本ライブラリのターミナル(コンソール)は、文字列ベースの画面を構成することを目的としてます。
以下に設計時の考慮事項を記載します。
固定幅の画面構成を行うこと
日本語の表示が可能であること
ソースコード中に直接日本語文字列を含められるようにすること
UTF-8でソースコードを記述する前提とする
内部処理をUnicodeとすること
UTF-8デコードが出来るようにすること
旧来のキャラクター型のインタフェースを実装できるよう、いくつかのエスケープシーケンスを実装しておくこと
ただしANSIエスケープシーケンスの完全な互換性を目的とはしない
文字色、背景色、太字といった表示属性に対応すること
カーソルを表示・非表示にできること
画面の順方向のスクロールに対応すること
カラム数を超えて文字列を出力した場合は、折り返しを行えること
右端カラムへの文字出力を行った場合、その時点では折り返しを行わないようにすること
上記を実装は、折り返し処理の実装より優先すること
複数のターミナル表示を画面上に同時に表示できること
毎回全画面書き換えといったような描画パフォーマンスの悪い実装でないこと
変更がある行のみを書き換える行単位の描画を行うようにした
フォントを選択できること
配布可能なフォントをライブラリ内に同梱しておくこと
より大きな文字を表示するため、倍角表示に対応すること
本ライブラリのターミナルは、大まかに分けて2要素から構成されます。
ターミナル(コンソール)
namesace TWETERM
はターミナル(コンソール)画面を実装するためのクラスや関数などをまとめています。
基本的なクラス構造は以下のようになっています。クラスITerm
ではターミナルの文字列バッファとその処理、TWETerm_M5_Console
クラスはITermの文字列描画部分を実装したものです。IStreamOutはITerm派生クラスオブジェクトが文字列をターミナルに投入するための基本的な手続きを提供しています。
環境センサーパル(AMB)のセンサーデータ
TWELITE PALのパケット
TwePacketPal
クラスは、TWELITE PALのパケットデータを解釈したものです。このクラスはTWELITE PAL(センサーデータなど上り方向)共通に取り扱います。
PAL共通データはDataPal
に定義されています。
PALの各センサー基板特有のデータを取り出すためのジェネレータ関数を用意しています。
spTwePacket
オブジェクトからTwePacketPal
オブジェクトを参照します。spTwePacket
にTwePacketPal
以外が格納されている場合は、未解釈のオブジェクトを戻します。
センサーPALの各種データを取り出すためのジェネレータ関数です。
開閉センサーパルのデータPalMag
を取り出します。
環境センサーパルのデータPalAmb
を取り出します。
動作センサーパルのデータPalMot
を取り出します。
TwePacketTwelite
クラスは、標準アプリApp_Tweliteの0x81コマンドを解釈したものです。
パケットデータ内の諸情報はparse()
実行後にDataTwelite
に格納されます。
spTwePacket
オブジェクトからTwePacketTwelite
オブジェクトを参照します。spTwePacket
にTwePacketTwelite
以外が格納されている場合は、未解釈のオブジェクトを戻します。
動作センサーパル(MOT)のセンサーデータ
※ 各サンプルの連続性を確認するには、パケットのシーケンス番号の抜けが無いことを確認してください。
フォント定義クラス
フォント定義と関連する手続きをまとめたクラスです。
このクラスオブジェクトはフォントジェネレータcreateFont???()
によりライブラリ内部で生成・管理され、ユーザがコンストラクタを用いて直接オブジェクトを生成することはありません。
パラメータを省略した場合は、フォントのシングル幅文字の幅を返します。この値にはフォント生成時に指定した文字間スペースも含まれます。
wc
を指定した場合は、Unicode wc
に対応するフォントの幅を返します。日本語などダブル幅のフォントの場合は、シングル幅の2倍の値が戻ります。
フォントの高さを返します。この値にはフォント生成時に指定した行間スペースも含まれます。
デフォルトフォントのオブジェクトである場合 true
を返します。
デフォルトフォントのオブジェクトはcreateFont???()
やqueryFont()
のエラー時など例外時にも利用されます。
フォントIDを取得します。
Unicode c
に対応する、ダブル幅フォント定義配列インデックスを検索します。
戻り値は、字形データが存在する場合は、インデックス配列のインデックス(データ配列のインデックスが計算できる)、存在しない場合は-1
を返します。
フォント定義は、インデックス配列、データ配列の2つから構成されます。インデックス配列の各値は昇順に並んだ Unicode になっていて、データ配列のインデックスに対応しています。
以下の例ではインデックス配列の IDX=829 が U+5a2f で "娯" という文字です。データ配列の対応する番地を参照すれば、この字形データが格納されています。
インデックス配列内の値は昇順に並ぶよう構成した目的は、本関数で実装されている二分探索を利用するためです。
フォントクラスオブジェクトの取得
createFont???()
によりフォント生成したクラスオブジェクトを参照します。
idにはフォント生成時に指定したフォントIDを指定します。
戻り値は FontDef&
で、ライブラリ内のフォント管理配列内に格納されたオブジェクトへの参照です。
idに0を指定すると、フォントID=0のデフォルトフォントを戻します。存在しないIDを指定した場合も、どうようにデフォルトフォントを戻します。FontDef
オブジェクトがデフォルトフォントかどうかはメソッド.is_default()
により判定できます。
M5Stack用のLcd描画ターミナル
M5Stack の 320x240 LCD 用のターミナルの実装です。ITerm
を実装しています。
本クラスはnamespace TWEARD
内に定義されます。
ITerm
のコンストラクタに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形式の色コードを生成します。
フォント定義や描画
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 文字)のフォントデータと、全収録(東雲フォントのみ、一部未収録字形があります)を用意した
12,14,16ドット版をライブラリに含めています。
常用漢字のみのジェネレータ (createFontShinonome12()
, createFontShinonome12()
, createFontShinonome16()
)または、全収録のジェネレータ (createFontShinonome12_full()
) ,createFontShinonome14_full()
,createFontShinonome16_full()
)を呼び出します。
全収録版は字形データが多いためより多くのROM容量が必要です。同じフォントサイズのデータで常用版と全収録版の両方を登録する意味はありません。常用漢字版の字形データは全収録版に包含されるためです。
ジェネレータ createFontMP10()
または createFontMP12()
を呼び出します。
ジェネレータ createFontLcd8x6()
を呼び出します。
latin拡張文字や日本語フォントは含まれません。
このフォントはいずれかのジェネレータ関数createFont???()
が呼び出されたときに、デフォルトとしてフォントID=0に登録されます。
フォントIDは作成したフォントごとに割り当てられます。
IDは 0..32 の値を指定可能ですが、ユーザが登録できるのは 1..32 で最大7フォント登録できます。
ID=0 のフォントは 8x6 LCD フォントに割り当てられます。
フォント情報にアクセスするためには、queryFont()
によりFontDef
オブジェクトを取得し、諸情報を得ます。
ターミナルにフォントを指定するには、フォントの生成を行い、フォントIDをターミナルオブジェクトに指定します。フォント指定後はforce_refresh()
メソッドによる再描画を行います。
ターミナルのフォント変更は、set_font()
によりフォントを指定し、その後、clear_screen()
とforce_refresh()
を呼び出します。
drawChar()
関数を用いて描画することができます。
printfmt, fPrintf(), snPrintf()
printf, sprintfに対応する処理を行います。
本ライブラリではMacro Poland氏のprintf,sprintfライブラリを利用しています。 https://github.com/mpaland/printf
ストリームIStreamOut
オブジェクトに対して<<
演算子の右オペランドとして利用します。
printfmt
クラスのコストラクタのパラメータの1番目fmt
に書式を指定します。以降のパラメータはC++テンプレートのパラメータパックで実装されており可変数引数となっています。printfのように書式に対応した引数を指定します。printfと違い引数の数は最大4つに制限されます。
ストリームIStreamOut
オブジェクトを出力先としてfprintfと同じ処理を行います。
1番目の引数がストリームオブジェクトとなる点を除きfprintfと同じ使い方です。
snprintfの処理を行います。
フォントの描画
フォントをスクリーン上に描画します。
以下の例では、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()
PALセンサー共通データ
PALの各センサーのデータ構造体はすべてPalBase
を継承します。センサーデータの格納状況u32StoredMask
とモジュール電源電圧u16Volt
の情報が含まれます。
派生構造体に定義されるSTORE_COMP_MASK
とu32StoreMask
が一致すれば、全てのセンサーのデータが適切に解釈され、格納されていることになります。
開閉センサーパル(MAG)のセンサーデータ
ターミナル用文字バッファ管理クラス
ターミナル(コンソール)の基底クラスで、画面上の文字列を管理する。このクラスは、実際の画面描画についての手続きは含まれず、このクラスを継承したサブクラスによって画面描画を実装します。
カラム数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)
が呼び出されます。
日本語文字セットを表示するためのフォントの取り扱いについてはTWEFONT::FontDefを参照してください。
ターミナルの行数、カラム数を返す。
<<
演算子を用いてターミナルに文字列を書き出します。
本クラスは namespace TWE
内に定義されています。
出力ストリームの基底クラスで、以下のメソッドが定義されており、1バイトの出力、改行文字など特殊クラスを受け付けるためのメソッドが定義されています。
operator ()
はchar_t
型の1文字を出力するための仮想関数です。write_w()
はwchar_t
型の出力に対応します。
ストリームへの出力は<<
演算子を用います。最終的には上記の出力用の関数が呼び出されます。
以下の例はITermクラスでの実装例です。
operator << の右オペランドとして以下の型に対応します。
曖昧性の解決のため、派生クラスで明示的なオーバーライドが必要になる場合があります。
特殊な文字列などを指定するためのオブジェクトを定義するための基底クラスです。
派生クラスとして CR LF (0x0d 0x0a) を出力する IStream_endl が定義されています。
オブジェクトcrlf
は以下のように使用します。
PAL基板種別
下記のPAL基板に対応します。
エスケープシーケンス
エスケープシーケンスは ESC 文字 '\033' で始まり何文字かで完結する制御コードです。
本ライブラリが動作するプログラム上や、シリアルポートの先にあるマイコンから制御文字をターミナルに投入することで、様々な画面制御(画面のクリア、カーソルの移動、色などの表示属性の変更)を行うことが出来ます。
以下に対応するエスケープシーケンスを記述します。表中の ESC はエスケープ文字 '\033'、イタリックの n や m は数字の入力です。
ITerm
で対応するエスケープシーケンスは、ANSIターミナル互換を目的としたものではありません。解釈や仕様には違いがあります。
フォントジェネレータ関数
フォントジェネレータ関数は、収録フォントごとに定義されています。関数パラメータは共通で、以下のようになります。
上記は東雲フォント16ドット版(常用漢字収録)のジェネレータの例です。
id
は、ユーザが指定するフォントID。
line_space
はフォントの行間スペースをピクセル数で指定します。
char_space
は文字間スペースでピクセルで指定します。文字間スペースはシングル幅のフォントの指定です。ダブル幅のフォントの場合は倍になります。
u32Opt
は、フォントのオプションを指定します。オプションはU32_OPT_FONT_TATEBAI
とU32_OPT_FONT_YOKOBAI
があり、論理和で指定します。
フォントジェネレータの戻り値はFontDef&
になっています。この戻り値はライブラリ内部のフォント管理テーブルに生成されたオブジェクトへの参照です。既に登録済みのIDであるばあいは、そのIDに対して上書きを行います。登録できなかった場合は.is_default()
メソッドがtrue
になるデフォルトフォントが返されます。
固定バッファ長の配列クラス
可変長の配列ですが、最大長は固定の配列クラスです。
配列のメモリは、外部の固定バッファを参照する方法と、内部にコストラクタで確保する方法の2種類があります。
外部のバッファを参照する場合、参照先のメモリを安全に利用できるようユーザプログラムで管理しなければなりません。
パラメータなしのコンストラクタは、バッファ未登録として初期化します。バッファが未登録の場合はlength_max()
が0になります。このオブジェクトを配列として利用するにはattach()
メソッドにより改めてバッファを登録する必要があります。
外部のバッファを参照する場合は、バッファへのポインタp
、配列の初期長u16len
、配列の最大長u16maxlen
を指定します。
メモリを動的確保するにはu16maxlen
のみを指定するコンストラクタを呼び出します。
コピー元が、外部メモリ参照の場合は、コピー元の参照先をそのままコピーします。
コピー元が、内部にメモリ確保している場合は、コピー元のメモリ領域をそのまま利用します。新たにメモリのコピーを作成するわけではありません。本クラスでの内部確保したメモリは、スマートポインタshared_ptr
で管理されます。コピー先とコピー元すべてのオブジェクトが破棄された時点で、メモリ領域を破棄します。
配列の参照先を再設定します。
内部メモリ確保のオブジェクトの場合、内部メモリのスマートポインタを破棄しません。
一時的に部分配列として取り扱うといった使い方を想定します。以下の例では、128バイトの長さのbuf
を生成した後に、先頭17バイト目から末尾までの部分配列buf_sub
を生成しています。
配列の先頭ポインタ、末尾+1のアドレスのポインタを返します。STLのアルゴリズムや範囲for文などで利用されます。
配列バッファの先頭ポインタを得るときにbegin()
を用います。
⇒push_back()
配列の末尾に要素を追加します。要素が追加できないときはfalseが戻ります。
⇒size(), capacity()
size()
は配列の長さ、capacity()
は配列の最大長を返します。
⇒reserve()
配列の長さを変更します。現在の長さより大きくなる場合は要素型T
のデフォルトの初期化方法T{}
にて初期化されます。数値型なら0です。
配列へのアクセス手段を提供します。
インデックスi
は、負の値の場合は配列の末尾からのインデックスとなります。-1
が末尾になります。
固定長キュー
std::queueは、ブロック単位でのメモリ確保を行い動的にキューのサイズを拡張していきますが、本クラスではメモリサイズを抑制し固定長のキューを実装します。
本クラスはstd::queue
を継承しています。
GCCの場合はバッファのブロックサイズを定義することができます。
本ライブラリでの利用を想定し以下のように64バイトにしています。
size
を最大値としてキューを生成します。
キューに要素を追加します。キューが一杯になると何もせずfalse
を返します。
キューから要素を削除します。
要素にアクセスします。
キューが空の場合true
を返します。
名前
解説
NOPCB
基板未接続、エラー
MAG
マグネットセンサー付きのMAG (開閉センサーパル)
AMB
温湿度センサー、照度センサー付きのAMB (環境センサーパル)
MOT
加速度センサー付きのMOT (動作センサーパル)
設定
意味
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
白
エスケープシーケンス
意味
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 → 属性抹消
パラメータ
意味
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()
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になります。
右オペランドの型
解説
char_t
1バイト出力する
const char *
文字列を出力する
wchar_t
ワイド文字を出力する(派生クラスで対応がある場合)
IStreamSpecial&
特殊文字列を出力する
printfmt
printf()に相当する出力を行う
const int
printf("%d", n)に相当する出力を行う
double
printf("%.3%, n)に相当する出力を行う