libXHRPad.js


FlashAirのパッド情報を10fpsくらいの速度(その環境における最高速度)で取得するライブラリです。
非同期で動作するため、メインの処理に遅延の影響を与えません。
また、接続をタイムアウトさせることで、Flashairの応答が遅れた時はさっさと諦め再取得を続けます。
これにより、パッドの状態を高速に取得し続けます。

注意: 動作のためには、最低でもCONFIGにてIFMODE=1の設定が必要です。
 さらに推奨される設定については、FlashAir同人誌3を御覧ください。

動作デモツールも付属しているので、Airio Playや、MFT2016おまけ基板の動作確認にも使えます。
主要なパラメータのほか、キーの押下状態を確認できます。
こちらのデモはスマートフォン向けに最適化された表示になっています(iPhone 5sで動作確認)
アイコンによるわかりやすいエラー表示も完備しています。

SDカードエラー時(既にSDホストからアクセスされているためIOポートが使用できない)

IFMODEエラー(CONFIGが設定されていないためIOポートが使用できない)
通信エラー(通信が切断されたことを検出した。再接続すると復帰する)

開発向けのシンプルなデモもあります。


・更新履歴
v0.10 XHRPad作成
v0.11 ライブラリ化
v0.12 パッド情報をオブジェクト化
v0.13 SD・CONFIGエラーを取得可能に
v0.14 パッド変化・Anyを実装
v0.15 setAddDelayを追加
v0.16 ドキュメント作成・公開
v0.17 キー押下時のコールバックを実装。ライセンスを変更(MIT→BSD-3)
URLの生成時に日付情報を付加する方法が誤ってムダに長いURLになっていたのを修正。
平均応答時間の算出方法を変更。エラーを平均に含まないように変更。
v0.17.1 コールバック関数のエラーを握りつぶしてしまう不具合を修正。(コンソールへ出すように)
v0.17.2 複数回startされても1回きりになるように調整。
v0.17.3 stopを実装
v0.18 demo.htmlを追加。説明書をHTML化
v0.19 demo.htmlにIEのススメを追記。PCだと200msを超えることが多いので600msに設定
   性能としては劣化するため、各自ゲーム内においてxhrPad.setTimeout()を適当に設定してください。


・使いかた
<script src="libXHRPad.js"></script>で読み込ませます。

xhrPad.start();で取得が始まります。
注意!:大量のリクエストを投げるため、ゲームのロード前に開始すると
 ゲームのデータが読み込めなくなる場合があります。ロード後(game.start()のあとなど)に開始してください。
 散発的にデータを受信する必要がある場合は、setAddDelayを大きめに設定してください。

注意2: 非同期のため、パッドの情報が取得できなくてもフレームが進みます。
 不公平感を解消するためには、getContinuousErrorCount()が0以外の時にはフレームを進めないようにすると、
 同期処理と同等になります。

各関数の説明は、下の定義部分を確認してください。

接続URLを相対参照にしているため、IPアドレスの場合、http://flashair/の場合どちらでも使えます。

ライセンスについてはソースコードに記載されています。
Seg_faul

・トラブルシューティング
Q. 累計通信エラーがどんどん増えていくんですが
A. 多少の通信エラーはつきものですので、気にしない方がいいです。

Q. 頻繁に継続エラーカウントが上がって操作不能になるんですが
A. ボタン押した瞬間になったりしませんか?
 たいてい、電源やSDカード端子の接触が悪いと起きます。
 microUSB給電の場合、USBコネクタを抑えながら操作するとマシになります。

Q. 勝手にドンドン上がってくカウンタ何?
A. javascriptが止まってないかどうか確認するためのカウントで、
 それ以外特に意味はありません。

・リファレンス
通信処理および状態取得

xhrPad.start();
タイマーを起動し、非同期取得処理を開始します。

xhrPad.stop();
非同期取得処理を停止します。

xhrPad.isSDErr();
ホスト機器に刺さっている場合のFlashAirでのエラー情報を確認できます。
ゲーム中で注意喚起をする場合などで使えます。

xhrPad.isConfigErr();
IFMODEが1ではない場合のFlashAirでのエラー情報を確認できます。
ゲーム中で注意喚起をする場合などで使えます。

xhrPad.getAverageTimeMs();
読み込みにかかった平均時間を取得します。
v0.17より、ローパスフィルタ方式にしました。これにより長時間の際に異常値にならずに済むはずですが、
代わりに開始から十秒ほどは信頼出来ない値を吐きます。
基本、PC(Chrome)の場合で80ms、iPadで50ms、IE9で35msほどでした。
FlashAirへの接続台数*20 + 80と考えるといいようです。

xhrPad.getErrorCount();
通信エラーの積算回数を取得します。
割と増えますが、基本的に問題ありません。

xhrPad.getContinuousErrorCount();
連続したエラー回数を取得します。
これが3を超えると不安定、50を超えると確実に切断されています。
接続が落ちた際のゲームの中断などに。

xhrPad.setTimeout();
タイムアウト時間を設定します。
基本的に600msですが、回線状態が悪い場合は長くすると安定します。
短くするとたまにの応答ロスの場合のロス時間が減ります。

xhrPad.setAddDelay();
追加ディレイ時間を設定します。
通常だとFlashAirがリクエストに溺れて、IO以外のコンテンツが処理できなくなるため
動的にコンテンツを読み込む場合などはsetAddDelay(500)などしてあげると溺れなくなります。
ただしボタンに対する応答速度が悪くなります。


パッド情報

xhrPad.read();
現在のパッドの情報をオブジェクトで返却します。
var key = read_pad();のように受け取り、
key.a、key.b、key.up、key.down、key.left、key.rightとboolで取り出せます。

xhrPad.readRaw();
パッドの生情報を取得します。
DATA項目まんまです。互換性のために用意していますが、
基本的には上記のreadを利用することをおすすめします。

xhrPad.isAnyKey();
何らかのキーが押されているかどうかboolで返却します。

xhrPad.readChanged();
パッドの情報の変化をオブジェクトで返却します。
範囲は、前回readPadChangedを呼び出した時から、次にreadPadChangedを呼び出すまでの間です。
立ち上がり、あるいは、立ち下がりを検出した場合に各キーがtrueになります。
チョン押しを検出したい場合にどうぞ。

xhrPad.isChanged();
パッドの情報の変化をbool値で返します。
範囲は、前回isPadChangedを呼び出した時から、次にisPadChangedを呼び出すまでの間です。
立ち上がり、あるいは、立ち下がりを検出した場合に各キーがtrueになります。

xhrPad.setKeyPressedCallback(func);
ボタンが押された時にコールバックする関数を指定します。
funcには、1つの文字列引数を受け取る関数をセットしてください。
文字列には、押されたキー名(up,down,left,right,a,b)が渡されます。
複数のキーが同時に押された場合は、保証されない順序で、それぞれのキーごとに呼び出します。

リンク
Airio Play配布元ページ(yone2.net様) ← ゲームのサンプルが配布されています。

※Windows DefenderがZip圧縮されたjsファイルを誤検出してトロイの木馬扱いしますが、
 他のウィルス対策ソフト及び、オンラインマルチスキャンではウィルスを検出しないことを確認しています。
 Windows Defenderをお使いの方は、解凍し、SDカード上にコピーするまで、一時的に無効にして使用してください。
 (解凍後は誤検出は発生しないようです)


右下のをクリックしてダウンロード [ Click right side  icon to download.]
ċ
libXHRPad.zip
(23k)
GPS_NMEA _JP,
2017/02/22 4:04
Comments