twe_twelite.network
に NWK_LAYERED
、 twe_twelite.network2
に NWK_SIMPLE
を動作させることで、レイヤーツリーネット (TWELITE PAL, ARIAなど)のパケットを含む、さまざまな種類のパケットを受信、解釈できます。setup()
, loop()
、受信パケットのコールバック関数 on_rx_packet()
を記述しています。pkt_handler.cpp
で宣言され setup()
中でpnew()
により初期化されます。主にパケットのペイロード(データ)を解釈します。the_twelite.network
にNWK_LAYERED
にします。loop()
の処理で重要なのは約1秒おきに行っている .refresh()
処理です。g_pkt_apptwelite().refresh()
のみ重複チェッカのタイムアウト処理を行っています。それ以外のオブジェクトは何もしません。auto type = rx.get_network_type();
によりパケットの種別を判定しています。mwx::NETWORK::LAYERED
: NWK_LAYERED
レイヤーツリーネットのケットmwx::NETWORK::SIMPLE
: NWK_SIMPLE
のパケットmwx::NETWORK::NONE
: ネットワークなし(App_Tweliteなど)mwx::NETWORK::NONE
の場合は、再送などで複数送信されうる同一パケットの重複チェッカ等の処理は MWX ライブラリ内部で行われません。これらの対応を記述する必要があります。本サンプルでは dup_checker.hpp
, dup_checker.cpp
を用意しています。tsRxDataApp*
をラップした packet_rx&
オブジェクトを参照します。packet_rx
クラス自体は特別な機能はなく、get_psRxDataApp()
を用いてtsRxDataApp*
から得られる一部の情報へのアクセス手段を定義しているのみです。analyze()
: パケットのペイロードを解釈する。display()
: パケット情報を表示する。refresh()
: 1秒おきの処理を記述します。self()
: 派生クラスD
にキャストします。pkt_handler_apptwelite
)には、メンバーオブジェクトの pkt
が含まれます。実際のパケットの解釈部分は、pkt_???.cpp
にある各々の analyze()
の実装を参照してください。analyze()
と、データ構造 data
が定義されています。メンバーdata
は、構造体ですがPktDataCommon
の共通構造体を継承しています。この共通部を用いてパケットのデータのシリアル出力のコードを簡潔に記述しています。_vect_pal_sensors
: _pal_sensor
オブジェクトのプール。このオブジェクトは instusive map で使用するための専用クラスです。_map_pal_sensors
: センサーデータを効率よく検索するための intrusive map 構造。_vect_pal_sensors
にエントリを確保して値を格納します。パケット中のすべてのデータを解釈した時点でセンサータイプをキーとした_map_pal_sensors
を構築します。MODE
: MODE_REJECT_SAME_SEQ
を指定すると、同じシーケンス番号のパケットを除外します。パケット順が並び変わるような場合に使用します。MODE_REJECT_OLDER_SEQ
はより新しい番号を採用します。TIMEOUT_ms
: 重複データベースの初期化を行う間隔です。1000
と指定すると1秒経過したデータは抹消されます。直前では除外されていたパケットも、重複データベースの初期化されると再び採用されることになります。N_ENTRIES
: データ構造に最大確保される要素数です。N_BUCKET_HASH
: ハッシュ値の最大数です。素数を指定します。受信される無線ノードの種類をもとに決めます。_mmap_entries
: intrusive ハッシュ マルチ マップ構造です。検索キーは無線ノードのシリアル番号です。_vect_pool
: マップ構造で用いられる要素を固定数(N_ENTRIES
)を確保します。_ring_vecant_idx
: _mmap_entries
に利用されていない_vect_pool
の要素を配列インデックス番号で管理します。リングバッファの構造で、要素を追加するときはリングバッファから値を一つ取り出し、削除するときはリングバッファに値を返します。.equal_range()
を呼び出します。得られた r
はイテレータで、同一のシリアル番号の要素を列挙します。_dup_checker_entry
)にはタイムスタンプやシーケンス番号が記録されています。この値に従い重複を確認します。