Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
パケット種別ごとの定義
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
パケットオブジェクト
パケットデータは種別によってデータ構造が違いますが、様々な種類のパケットを一元管理するための基底クラスです。
spTwePacket
はメモリ管理のためのスマートポインタです。std::shared_ptr
を用いています。
TwePacketクラスは、パケットデータのパケット種別の管理を行います。また、パケットデータの解釈を行うための仮想関数parse()メソッドを定義しています。パケット特有のデータ構造に基づく解釈やデータの保存等の取り扱いは、派生クラスに実装します。
デフォルトでは、未解釈状態として E_PKT::PKT_ERROR
で初期化します。
パケットの種別をE_PKT
型で返します。
パケットデータのバイト列を与えて、パケットデータを解釈する。
派生クラスで、そのパケットに対応するデータ構造を解釈するための実装を行います。
戻り値は E_PKT
型 で、成功時は解釈されたパケット種別を、エラー時に E_PKT::PKT_ERROR
を返します。
アスキー形式のパーサー
アスキー書式の解釈を行うパーサーですが、TWESYS::TimeOut
クラスをベースクラスに持つことで、タイムアウト処理を行っています。
パーサーオブジェクトを生成します。
生成時のパラメータにmaxbuffsiz
を与えると、maxbuffsiz
をバッファサイズとして動的にメモリ確保して、パーサーを初期化します。
あらかじめ生成されたSmplBuf_Byte
配列bobj
を参照して、パーサーを初期化することもできます。
アスキー書式の解釈アルゴリズムを実装します。バイトの入力のたびにタイムアウトのチェックを行います。
書式出力を行います。s_Output()
メソッドを呼び出します。
vPutByte()
は、ストリームに対して与えられたバイトu8byte
をアスキー2文字で出力します。例えば0x9Aであれば"9A"という2バイト文字になります。
s_vOutput()
は、ストリームに対して、与えられたバイト配列SmplBuf_Byte
のバイト列をアスキー形式で出力します。
書式パーサー
書式パーサーは、IParserを基底クラスとして、書式ごとに派生クラスを実装します。
パーサーは、シリアルポートのように1バイトずつ入力されるデバイスを想定し、1バイト単位での解釈を行い、都度状態を遷移する状態遷移マシンとして実装されます。
パケット定義
書式を解釈して得られたデータ列は、受信したパケット情報が含まれます。ここでは、このデータ列のことをパケットデータと呼びます。
パケットデータはTwePacket
クラスで表現されます。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
型はスマートポインタですので、オブジェクトのコピー渡しによる記述を行うことで、コピーのオーバーヘッドを最小にしつつ、メモリーの管理を自動化できます。以下の例はパケットの履歴を管理する単純なクラスです。
パーサーの基底クラス
パーサーオブジェクトに1バイトずつ電文を投入することで、電文系列を解釈する状態遷移マシンです。
パーサーに1バイト入力します。入力のたびにパーサーの状態が変化し、パーサーの解釈が完了するとstate()
がE_TWESERCMD_COMPLETE
に変化し解釈完了状態となります。
パーサーの状態を取得します。
パーサーの状態がE_TWESERCMD_COMPLETE
の場合true
になります。
パーサーで解釈済みのバイト列のデータ長を返します。
パーサーの解釈済みのバイト列にアクセスします。
パーサーの解釈済みのバイト列を格納した配列クラスSmplBuf_Byte
を参照します。
パーサーの解釈途中の内容を破棄し、新たな解釈を始めます。
IStreamOutをベースクラスにもつストリームオブジェクトに、書式出力します。
1バイト入力して解釈を進める仮想関数です。派生クラスにより実装されます。
バイト配列bobj
に格納されるバイト列に対応する書式をストリームp
に出力する仮想関数です。派生クラスにより実装されます。
パケット種別定義
以下のパケットに対応します。
TWELITE PALのパケット
TwePacketPal
クラスは、TWELITE PALのパケットデータを解釈したものです。このクラスはTWELITE PAL(センサーデータなど上り方向)共通に取り扱います。
PAL共通データはに定義されています。
PALの各センサー基板特有のデータを取り出すためのジェネレータ関数を用意しています。
spTwePacket
オブジェクトからTwePacketPal
オブジェクトを参照します。spTwePacket
にTwePacketPal
以外が格納されている場合は、未解釈のオブジェクトを戻します。
センサーPALの各種データを取り出すためのジェネレータ関数です。
パケット種別判定
パケットデータのバイト列を入力として、パケットの種別を判定します。また既に生成済みのオブジェクトの種別を返します。戻り値はです。
パケットデータの解釈とオブジェクト生成
パケットデータのバイト列を入力として、パケット種別の判定と、種別に応じたオブジェクトを生成します。
事前にを用いてパケットの種別が特定できている場合はeType
を与えます。
戻り値はです。
spTwePacketオブジェクトの参照
本関数はオブジェクトをとして参照します。
この関数は、->
演算子や*
演算子を極力使用しない方針でライブラリを設定しているため、スマートポインタの参照を行うために用意しています。
上記の判定式を(pkt && pkt->get_type() == E_PKT::PKT_TWELITE)
と記述しても同じ判定が得られます。
App_Twelite データ
TwePacketTwelite
のデータ部分。
開閉センサーパルのデータを取り出します。
環境センサーパルのデータを取り出します。
動作センサーパルのデータを取り出します。
状態名
値
状態
E_TWESERCMD_EMPTY
0
解釈前で、まだ系列のヘッダも認識できていない
1..0x7F
解釈中
E_TWESERCMD_COMPLETE
0x80
系列が正しく解釈できた
E_TWESERCMD_ERROR
0x81
系列の解釈にエラーがあった
E_TWESERCMD_CHECKSUM_ERROR
0x82
系列は得られたがチェックサムエラーだった
名前
解説
PKT_ERROR
パケット解釈前やパケット種別が特定できないなど、TwePacketには意味のあるデータが格納されていない
PKT_TWELITE
標準アプリ App_Twelite の 0x81 コマンドを解釈したもの
PKT_PAL
TWELITE PALのシリアル形式を解釈したもの
開閉センサーパル(MAG)のセンサーデータ
PAL共通データ
PALは接続されるセンサーなどによってパケットデータ構造が異なりますが、DataPal
では共通部のデータ構造を保持します。
PALのパケットデータ構造は大まかに2つのブロックからなり、全てのPAL共通部と個別のデータ部になります。個別のデータ部は、パケットの解釈を行わずそのまま格納しています。取り扱いを単純化するため32バイトを超えるデータは動的に確保するuptr_snsdata
に格納します。
個別のデータ部は、PalBaseをベースクラスに持つ構造体に格納されます。この構造体は、TwePacketPalに定義されるジェネレータ関数により生成されます。
PALセンサー共通データ
PALの各センサーのデータ構造体はすべてPalBase
を継承します。センサーデータの格納状況u32StoredMask
とモジュール電源電圧u16Volt
の情報が含まれます。
派生構造体に定義されるSTORE_COMP_MASK
とu32StoreMask
が一致すれば、全てのセンサーのデータが適切に解釈され、格納されていることになります。
動作センサーパル(MOT)のセンサーデータ
※ 各サンプルの連続性を確認するには、パケットのシーケンス番号の抜けが無いことを確認してください。
環境センサーパル(AMB)のセンサーデータ
PAL基板種別
下記のPAL基板に対応します。
名前
解説
NOPCB
基板未接続、エラー
MAG
マグネットセンサー付きのMAG (開閉センサーパル)
AMB
温湿度センサー、照度センサー付きのAMB (環境センサーパル)
MOT
加速度センサー付きのMOT (動作センサーパル)