全てのページ
GitBook提供
1 / 9

コールバック関数

コールバック関数

アプリケーションの記述を行うコールバック関数です。コールバックはシステム(ライブラリ)から呼び出されるという意味です。ユーザがいくつかのコールバック関数を定義することでシステムの振る舞いを記述します。

以下のコールバック関数は必須定義です。

  • setup()

  • loop()

それ以外の関数は定義しない場合は、何も実行しない空の関数が替わりにリンクされます。

通常のコールバック呼び出し順序

init_coldboot()
  ↓ (TWENET内部処理:初期化1)
setup()
  ↓(TWENET内部処理:初期化2)
begin() --- 初回のみ
  ↓
loop() <--+
  ↓       |イベント処理、ビヘイビア処理
CPU DOZE -+

正確なふるまいを参照したい方はソースコードmwx_appcore.cppを参照してください。

スリープ復帰時のコールバック呼び出し順序

the_twelite.sleep()
  ↓ sleeping...
 
 
init_warmboot()
  ↓ (TWENET内部処理:初期化3)
wakeup()
  ↓(TWENET内部処理:初期化4)
loop() <--+
  ↓       |イベント処理、ビヘイビア処理
CPU DOZE -+

正確なふるまいを参照したい方はソースコードmwx_appcore.cppを参照してください。

setup()

setup()

コード実行の初期に呼び出され、初期化コードを記述します。

TWENETの初期化は setup() 関数が終了した後にも実行されます。多くの処理はTWENETが終了した後に実行するようになっているため、ここでは初期化以外の処理を行わないようにしてください。

注意すべき事項を以下に列挙します。

  • スリープthe_twenet.sleep()の実行はできません。初期化後速やかにスリープしたいときはbegin()関数内に最初のスリープ処理を記述してください。

  • delay()関数は後述の処理*に置き換えられます。この場合、パラメータのmsはミリ秒を指定するものではありません。\

* delay()の代替処理

static inline void delay(uint32_t ms) {
		volatile uint32_t ct = ms * 4096;
		while (ct > 0) {
			--ct;
		}
}

begin()

begin()

loop()関数の初回コールの手前で一度だけ呼び出されます。TWENET の初期化は終了しているのでsetup()のような制約を考慮する必要はありません。

主な使い方は、

  • 始動メッセージの表示

  • テスト用のコードを記述

  • 始動直後のスリープ遷移

  • setup()で不都合がある処理(無線パケット処理・タイマー動作など)

このコールバック関数定義は省略可能です。

loop()

loop()

アプリケーションのメインループです。ループ終了後はCPUがDOZEモードに遷移し低消費電流で次の割り込みを待ちます。

アクトの記述では、ほとんどの処理がこのループ内に記述されます。

バック関数定義は省略可能です。

wakeup()

wakeup()

スリープから起床したときにloop()に移行する前に呼ばれ、スリープ復帰後の初期化処理や復帰状態によって処理を分岐するための手続きを含めます。

センサーの読み出しなどの処理のみでloop()での処理がないときは、この関数内で再びスリープを実行できます。

このコールバック関数定義は省略可能です。

init_coldboot()

init_coldboot()

通常は使用しません。

ペリフェラルAPIも初期化もされていない、コード実行の再初期に呼び出されます。

このコールバック関数定義は省略可能です。

init_warmboot()

init_warmboot()

通常は使用しません。

スリープ復帰後、ペリフェラルAPIが初期化されない再初期に呼び出されます。

この関数では割り込み要因の検出を行うことができます。

このコールバック関数定義は省略可能です。

on_rx_packet()

on_rx_packet()

受信パケットを受け取ります。

void on_rx_packet(mwx::packet_rx& pkt, bool_t &b_handled) 

無線パケットを受信したときにpacket_rxとして pkt にデータが格納された状態で、本関数が MWX ライブラリ内から呼び出されます。アプリケーション中で本関数が定義されない場合は何もしない weak 関数がリンクされます。

本関数中で b_handled に true をセットすると、MWX ライブラリに受信パケットがアプリケーション内で処理されたことを伝達します。処理済みとした場合、不要な処理を抑制します。(the_twelite.receiver の処理を行わない)

ビヘイビアを用いる場合は、ビヘイビア中のコールバック関数を用いてください。

the_twelite.receiverは推奨されません。

従来loop()内での記述を意図して the_twelite.receiver による処理を行っていましたが、キューによる遅延処理である点で原理的に取りこぼしが発生し、また記述も煩雑になりがちである点から on_rx_packet() を追加しました。

on_tx_comp()

on_tx_comp()

送信完了時に呼び出されます。

void on_tx_comp(mwx::packet_ev_tx& ev, bool_t &b_handled) 

無線パケットの送信が終了したときにpacket_ev_txとして ev にデータが格納された状態で、本関数が MWX ライブラリ内から呼び出されます。アプリケーション中で本関数が定義されない場合は何もしない weak 関数がリンクされます。

ev.u8CbIdは送信時のID、ev.bStatusは送信の成功(1)または失敗(0)を示すフラグです。

本関数中で b_handled に true をセットすると、MWX ライブラリに受信パケットがアプリケーション内で処理されたことを伝達します。処理済みとした場合、不要な処理を抑制します。(the_twelite.app, .board, .settings に対してはイベントコールバック関数を呼び出さない)