Leap Motion ControllerをJavaScript(leapjs)で扱う時の話です(WebSocket経由で触るなら他の言語でも同じだろうと思います。SDKは知らない)。
Leapが接続されている時だけ専用の操作を有効化したい、というのは普通のことだと思います。
そこで、「今現在Leapが接続されているかどうか」を取得したくなるわけですが、実は、この為のAPIという物がありません。Leapが発火する幾つかのイベントを監視することで、自分で状態管理をすることになります。
まず、connect
イベント。
これはJavaScriptがLeapのWebSocketサーバーに接続した時に発火します。気を付けないといけないのは、 たとえLeapが接続されていなくても このイベントは発火する、ということです。
Leap自体が無くてもWebSocketサーバー自体はずっと上がってて、Leapの接続を待っているみたいです。
なのでconnect
ではなくてdeviceConnected
を見張っておけば、実際にLeapが接続した時が分かると思いきや、これもだめ。最初からLeapを繋いだ状態で、(leapjsを使う)アプリケーションを起動した時に発火しません。connect
は発火するのですが、その時にLeapが接続しているかどうかは分かりません。
ではどうすればいいのかというと、ready
を待ち受けます。ready
は、WebSocketサーバーに接続し、かつLeapが利用可能になった時に発火するので、後からLeapを繋げた時も、アプリ起動時に既に接続済みだった時も、どちらも検知することができます。
これを踏まえると、今現在、Leapが接続されているかどうかを知るには、次のように状態管理すればいいことになります。
- 初期状態では「未接続」とする
-
ready
になったら「接続済み」とする -
deviceDisconnected
になったら「未接続」とする -
deviceConnected
になったら「接続済み」とする -
disconnected
になったら「未接続」とする