micro:bitのmbed、MicrobitEventなるものでメッセージをオブジェクト間で送り合うように設計されている。例えば、ボタンが押された時のコールバック、シリアル通信が来た時のコールバック、センサーの値が一定以上になった時のコールバックなどなど。そうすると、カスタムでMicrbitEventを実装したくなるのだが、公式リファレンスにはなぜかそれに関する言及が無かったので調べて実装した。
参考資料
- 公式
- MicrobitEventに関するリンク
MicrobitEventの仕様
Eventの発行元ID、Valueの2つがあればよい。Eventの発行元IDは9000番台以降ならデフォルトのID(Buttonなど)と被らない模様*1。Valueはuint16_tで自由に使って良い。下記一行だけですぐEventは発行される。
MicroBitEvent evt(uint16_t 発行元ID, uint16_t value);
Eventのコールバック先の指定もボタンなどと一緒。Valueに0をいれると、その発行元からのすべてのEventを受け取る。今回は数字を送るのに利用してみた。
uBit.messageBus.listen(uint16_t 発行元ID, uint16_t value, コールバック先の関数名);
サンプル
Aボタンを押すとランダムで0-9までの数字を表示する。Aボタンを押した時にランダムで数字を生成し、EventのValueにして発行、イベントハンドラーで受け取って表示。
#include "MicroBit.h" MicroBit uBit; const int CUSTOM_EVENT_HANDLER = 9001; void onCustomEvent(MicroBitEvent e) { uBit.display.printAsync(e.value); } void onButtonA(MicroBitEvent) { uint16_t ev = uBit.random(9); MicroBitEvent evt(CUSTOM_EVENT_HANDLER, ev); } void onButtonB(MicroBitEvent) { uBit.display.clear(); } int main() { uBit.init(); uBit.messageBus.listen(MICROBIT_ID_BUTTON_A, MICROBIT_BUTTON_EVT_CLICK, onButtonA); uBit.messageBus.listen(MICROBIT_ID_BUTTON_B, MICROBIT_BUTTON_EVT_CLICK, onButtonB); uBit.messageBus.listen(CUSTOM_EVENT_HANDLER, 0, onCustomEvent); uBit.display.printAsync("Q"); release_fiber(); }
- 出版社/メーカー: スイッチエデュケーション
- メディア: おもちゃ&ホビー
- この商品を含むブログを見る
*1:詳しく調べてはないです