PAL_MOT-single
このアクトではスリープ復帰後に数サンプル加速度データを取得しそのデータを送ります。
のアクトには以下が含まれます。
無線パケットの送受信
インタラクティブモードによる設定 - <STG_STD>
ステートマシンによる状態遷移制御 - <SM_SIMPLE>
アクトの解説
起床→加速度センサーの取得開始→加速度センサーのFIFO割り込み待ち→加速度センサーのデータの取り出し→無線送信→スリープという流れになります。
宣言部
インクルード
#include <TWELITE> // MWXライブラリ基本
#include <NWK_SIMPLE> // ネットワーク
#include <SM_SIMPLE> // ステートマシン(状態遷移)
#include <STG_STD> // インタラクティブモード
/*** board selection (choose one) */
#define USE_PAL_MOT
//#define USE_CUE
// board dependend definitions.
#if defined(USE_PAL_MOT)
#define BRDN PAL_MOT
#define BRDC <PAL_MOT>
#elif defined(USE_CUE)
#define BRDN CUE
#define BRDC <CUE>
#endif
// include board support
#include BRDCMOT PALまたはTWELITE CUEに対応するため、インクルード部分はマクロになっています。USE_PAL_MOTまたは、USE_CUEのいずれかを定義します。
USE_PAL_MOT が定義されている場合は動作センサーパルのボードビヘイビア<PAL_MOT>をインクルードしています。
状態定義
loop()中の順次処理を行うために状態を定義し、またステートマシンstepを宣言します。
センサーデータ格納
センサーデータを格納するためのデータ構造です。
setup()
ボード、設定、ネットワークの各ビヘイビアオブジェクトの登録を行います。
インタラクティブモード
インタラクティブモードの初期化を行います。
まず、設定項目の調整を行います。ここでは、メニュー項目で表示されるタイトル名SETTINGS::appname、アプリケーションIDのデフォルト値の設定SETTINGS::appid_default、チャネルのデフォルトSETTINGS::ch_default、論理デバイスIDのデフォルトSETTINGS::lid_default、非表示項目の設定.hide_items()を行います。
このサンプルでは起動時にSETピンがLOである場合にインタラクティブモードに遷移します。digitalRead(brd.PIN_SET)によりピンがLOであることを確認できた場合は、SETTINGS::open_at_start()を指定します。この指定によりsetup()を抜けた後に速やかにインタラクティブモード画面が表示されます。画面が表示されてもbegin()やloop()が実行されます。このサンプルでは状態STATE::INTERACTIVEとしてloop()中ではスリープなどの動作はせず何もしないようにします。
続いて設定値を読み出します。設定値を読むには必ず.reload()を実行します。このサンプルではオプションビット設定.u32opt1()を読み出します。
the_twelite
the_tweliteは、システムの基本的な振る舞いを管理するクラスオブジェクトです。このオブジェクトは、setup()内でアプリケーションIDやチャネルなど様々な初期化を行います。
ここではインタラクティブモードの設定値の一部を反映しています。
NWK_SIMPLEオブジェクト
ネットワークビヘイビアオブジェクトに対しても設定を行います。インタラクティブモードの論理デバイスID(LID)と再送設定が反映されます。
その他、ハードウェアの初期化など
LEDのブリンク設定などを行います。
begin()
setup()を終了した後に呼ばれます。ここでは初回スリープを実行しています。ただしインタラクティブモードの画面が表示される場合はスリープしません。
wakeup()
起床後は状態変数eStateを初期状態INITにセットしています。この後loop()が実行されます。
loop()
loop() の基本構造は<SM_STATE>ステートマシンstateを用いswitch ... case節での制御です。初期状態はSTATE::INITまたはSTATE::INTERACTIVEです。
STATE::INTERACTIVE
インタラクティブモード画面が表示されているときの状態です。何もしません。この画面ではSerialの入出力はインタラクティブモードが利用します。
STATE::INIT
初期状態のINITです。
状態INITでは、初期化(結果格納用のキューのクリア)や結果格納用のデータ構造の初期化を行います。STATE::START_CAPTUREに遷移します。この遷移設定後、もう一度whileループが実行されます。
STATE::CAPTURE
状態START_CAPTUREでは、MC3630センサーのFIFO取得を開始します。ここでは400Hzで4サンプル取得できた時点でFIFO割り込みが発生する設定にしています。
例外処理のためのタイムアウトの設定と、次の状態STATE::WAIT_CAPTUREに遷移します。
STATE::WAIT_CAPTURE
状態WAIT_CAPTUREでは、FIFO割り込みを待ちます。割り込みが発生し結果格納用のキューにデータが格納されるとsns_MC3630.available()がtrueになります。sns_MC3630.end()を呼び出し処理を終了します。
サンプル数とサンプルのシーケンス番号を取得します。
すべてのサンプルデータに対して読み出し、平均値をとる処理をします。
ここでは取得されたサンプルに対して、各軸に対応するイテレータを用い最大・最小を得ています。
.sns_MC3630.get_que().clear()を呼び出し、キューにあるデータをクリアします。これを呼び出さないと続くサンプル取得ができません。その後STATE::REQUEST_TX状態に遷移します。
.is_timeout()はタイムアウトをチェックします。タイムアウト時は異常としてSTATE::EXIT_FATALに遷移します。
STATE::REQUEST_TX
状態REQUEST_TXではローカル定義関数TxReq()を呼び出し、得られたセンサーデータの処理と送信パケットの生成・送信を行います。送信要求は送信キューの状態などで失敗することがあります。送信要求が成功した場合、TxReq()はtrueとして戻りますが、まだ送信は行われません。送信完了はon_tx_comp()コールバックが呼び出されます。
また.clear_flag()により送信完了を知らせるためのフラグをクリアしておきます。同時にタイムアウトも設定します。
E_SATE::WAIT_TX
状態STATE::WAIT_TXでは、無線パケットの送信完了を待ちます。フラグはon_tx_comp()コールバック関数でセットされ、セット後に.is_flag_ready()がtrueになります。
E_SATE::EXIT_NORMAL, FATAL
一連の動作が完了したときは状態STATE::EXIT_NORMALに遷移しローカル定義の関数sleepNow()を呼び出しスリープを実行します。またエラーを検出した場合は状態STATE::EXIT_FATALに遷移し、システムリセットを行います。
MWX_APIRET TxReq()
最期にパケットの生成と送信を要求を行います。パケットには続き番号、サンプル数、XYZの平均値、XYZの最小サンプル値、XYZの最大サンプル値を含めます。
sleepNow()
スリープの手続きです。
シリアルポートはスリープ前に
Serial.flush()を呼び出してすべて出力しておきます。<SM_SIMPLE>ステートマシンはon_sleep()を行う必要があります。
最終更新