ひつじのにっき

mhidakaのにっきです。たまに長文、気が向いたとき更新。

mozilla Open Web Day in Tokyoにいってきたよ

Mozilla Open Web Day in Tokyo

ということで行ってきました。"Mozilla に関係する東西さまざまなコミュニティや研究プロジェクトが集結し、その成果の展示・発表を行う収穫祭的なイベント"らしく、文化祭のような雰囲気。懇親会まであり、たのしかった。

会場も体育館で文化祭っぽかったです。KDDIさんのOpen Web Boardが展示されていたり、大学の研究プロジェクトが展示されていたりと個人や企業だけじゃなくて公的な組織もおおくて意外にアカデミックな側面も。

展示では、Webとハードウェア割り込みをつなげてみたよ

Floppy Bird的なゲームとハードウェアデバイスをくっつけた"Balloon Jamp"の展示をしてきました。

大きなボタンの効果もあり、沢山の人があそんでくれた。よかった。利用デバイスはRaspberry Piとわりとスタンダードなものを選んだのですが、ソフトウェア的には随分とキメラな構成になりました。

このデモでは、巨大なスイッチをGPIO経由で接続、GPIOの割り込みを検出してブラウザにイベントを(なるべく遅延ないように)送ってます。

OSとGPIO制御

OSはRaspbian(2014-09-09-wheezy-raspbian.img)を使用。ほんとはFirefox OSにしたかったのだけど、Raspberry PiはFirefox OSのサポートレベルであるTiar 1〜4(数字が小さいほどパワーをかけてサポートされている)のいずれにも該当せず、完全に野良デバイス。

Raspberry Pi向けのビルドコンフィグはあったのだけどHDMI出力で失敗してました。ざんねん。

./config.sh rpi
./build.sh

ちなみに、ターゲットボードをpandaboardにかえたら起動までは可能。ただし、こちらもやや条件があって、Firefox OS v2.0のブランチをつかってビルドしないといけなかったです。Issueにあるとおり画面(rotation)を90度傾ける問題があったり、マウスポインタが出ないなど実用上の問題があるので、手でpatchをあてます(自動でマージできないぐらいまでソースが進んでる)。

とりあえず今回はRaspbianつかったけど、https://wiki.mozilla.org/Foxberry_Pi_Demo のようにFirefox OSをRaspiむけに移植しようという動きがあるのでしばらくまってるとまともに動くようになるのかもしれません(しかし期待薄)。

Raspbianで、GPIOを制御しようとすると /sys/class/gpioあたりにぶら下がってるのでそのあたりをいじります。

echo  "7"  > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio7/direction
echo "1" > /sys/class/gpio/gpio7/value
echo "0" > /sys/class/gpio/gpio7/value

LEDのような単純なデバイスなら、コマンドラインから直感的に点灯/消灯を制御できます。以下のサイトがおもしろい。

あと、こういう直接的な手段以外に、GPIOを制御するためのコマンドもあるよ。

このあたり。インストールすると"gpio"コマンドが生えて、適当に制御できます。今回は未使用でした。

GPIOの割り込み通知

  1. LuaJITでGPIOの状態監視デーモンつくる
  2. GPIOの立ち下り、立ち上がり割り込みを監視
  3. 割り込みで起動したらスイッチイベントを作る
  4. 適当なキーイベントを作成して、LinuxのInput Sub Systemに投げつける
  5. キーイベントとしてブラウザが受け取る

キーイベントは日本語キーにない適当なものを仮想キー扱いでつくったよ。Raspbianのinputイベントは"/dev/input/event0"でした。

./input_key > /dev/input/event0

Cのプログラムでinput eventをゴリゴリつくります。コマンドとして投げます。このあたり興味あれば以下が面白いです。

- http://www.tatapa.org/~takuo/input_subsystem/input_subsystem.html

"Balloon Jamp"では、ブラウザにイベントを届ける、という作業が当初考えていたより手間がかかりました。たぶんもろもろがイレギュラー感あるシーケンスで無理やり達成した感じ。途中思ったのはイベント通知をWebSocket化できればよかった、ということなんだけど、画面更新しまくってブラウザをぶん回しているRaspberry Piさんは、CPU負荷が100%にはりついてしぬほど重い。WebSocketにした瞬間、ゲーム性もろとも死ぬとゴーストが囁いてた。

キーイベントなら取りこぼしもなく、ちゃんと伝わる。すごい(Linuxの歴史を感じる)。

JavaScriptからGPIOを読み取るライブラリはいくつかあったのだけど、ポーリングのような仕組みしか作れず、押してる瞬間に読み取れるとも限らないのでスイッチには対応しきれない感じ。このあたり良いライブラリがあれば良かったのだけど(見落としてなければ)。

非力なCPUや環境でブラウザにハードウェア的なイベントを送るには、という観点で頑張ったら、わりと面白い構成になったので制作記的にのこしておくことにしました。