以前に作ったWiiリモコンをFirefoxにつなげてイベントを取得したりするための拡張機能 WiiRemoComがFirefox3では動かなくなっていたのでFirefox3で動くように修正して、ヌンチャクをマウスとして使用できるようにしたり、いくつか機能を追加しました。
Firefox2用のものはWiiリモコンをFirefoxにつなげてイベントを取得したりするための拡張機能 WiiRemoComにあります(ただしXPCOMのインターフェイス等が異なります)。
FirefoxとWiiリモコンとを直接繋ぐことで、Wiiリモコンでの操作をjavascriptでハンドルすることができ、また逆にjavascriptでWiiリモコンを操作することもできるところが特徴です。現在Wiiリモコンの持つ以下の機能をFirefoxのjavascriptで処理することができます。
ほかのFirefox extensionやGreasemonkeyスクリプトからWiiRemoComのオブジェクトにアクセスすることでWiiリモコンを操作したり、Wiiリモコンから送られてくる操作に応じてFirefoxの動作を変えることができます。



十字キーの右でエントリ単位で移動、下で少しずつスクロール、Bボタン(リモコンの裏側にあるやつ)で次のフィードに移動していくかんじです。別ウインドウで開きたいときはAボタンを押すと別のタブで開くので、−と+でタブを移動して読み終わったらHOMEキーでタブを閉じます。
ピンを立てたい、とかあるとは思ったものの、キーボードに比べるとWiiリモコンの持ってるキーは少ないのでとりあえずこうしています。Greasemonkeyからキーの割当は変更することができるので、Greasemonkeyから変更したりしてみてください。
Greasemonkeyからキーの割当をかえるだけではなく、モーションセンサの値を利用してWiiリモコンをグッと振ったら一発クリップできるとか、そういうのも書くことができます。
WiiRemoComはGreasemonkeyスクリプトからはwindow.WiiRemoComオブジェクトを通してアクセスすることができます。モーションセンサの値を取得するにはstartObserve()でコールバック関数を登録します。ここで登録した関数の中でgetAcc()を呼び出してモーションセンサの値を取得します。
モーションセンサの値を受け取る準備ができたらsetMotionSensorEnabled(true)でモーションセンサを有効にします。
getAcc()で得られる値は32bitの符号なし整数値で、下位1バイト目にZ軸方向センサ値、2バイト目にY軸方向センサ値、3バイト目にX軸方向センサ値が入っています。これをビット演算で分解してある程度大きな変化(ここでは0x50)があったときにlivedoor Readerの一発クリップのショートカットキーiを生成して送っています。
window.WiiRemoCom.startObserve(window, 'acc-changed', function () {
var acc = window.WiiRemoCom.getAcc();
var x = ( acc >> 16) & 0xff;
var y = ( acc >> 8 ) & 0xff;
var z = ( acc >> 0 ) & 0xff;
if ( [x, y, z].some( function (n) {
return Math.abs(n - 0x80) > 0x50;
} ) ) {
var now = new Date();
if ( lastClippedAt == null || ( now - lastClippedAt >= 1000 ) ) {
var ev = document.createEvent("KeyEvents");
ev.initKeyEvent('keypress', true, true, window,
0, 0, 0, 0,
'i'.charCodeAt(0), 0
);
window.document.activeElement.dispatchEvent(ev);
lastClippedAt = now;
}
}
} );
window.WiiRemoCom.setMotionSensorEnabled(true);
ふつうのGreasemonkeyスクリプトと同じようにWiiリモコンを振ったときに何をするかを記述することができるので、livedoor Readerにキーボードイベントを生成して送るほかにも、GM_xmlHttpRequestを用いてほかのソーシャルブックマークサービスにブックマークすることもできます。
setTranslationTable()で変えることができます。Bボタンでpinを立ててAボタンで一気に開く、ようなキーバインドに変更したいときは、下のコードで変更することができます。
var name = window.WiiRemoCom.getCurrentTranslationMode();
var tbl = window.WiiRemoCom.getCurrentTranslationTable();
tbl.B = {charCode: 'p'.charCodeAt(0)};
tbl.A = {charCode: 'o'.charCodeAt(0)};
window.WiiRemoCom.setTranslationTable(name, tbl);
この例では現在のイベント変換モード名を取得してその名前でsetTranslationTable()を呼び出して上書きしていますが、もし上書きしたくないときはnameに好きな名前を指定すれば元のモードのキーバインドはそのままで新しいキーバインドを使うことができます。
キーコードを指定するほかに、コードを実行することもできます。以下はHOMEボタンを押したときに未読の数をtwitterにpostする例です。コマンドの場合、Wiiリモコンのキーが押されたときと離されたときに呼び出されるので、一回キーが押され(て離され)たときに一度だけ実行したいときには関数の引数に渡されるisDownをチェックして、押されたときだけ(もしくは離されたときだけ)実行するようにします。
tbl.HOME = {
command: function (isDown) {
if ( !isDown ) return;
window.setTimeout(function() {
if ( document.title.match(/\((\d+)\)/) ) {
var opts = {
url: "http://twitter.com/statuses/update.json",
method: "POST",
headers: {
"Content-Type":"application/x-www-form-urlencoded",
"Pragma":"no-cache",
},
data: "status=未読" + RegExp.$1 + "件",
};
GM_xmlhttpRequest( opts );
}
}, 0);
}
}
PRUint32 getKeyStatus();
PRUint32 getKeyStatusDiff();
PRUint32 getAcc();
PRUint32 getNunchukAcc();
PRUint32 getJoystickPoint();
PRUint32 getIRPoint();
boolean isExpansionPortAttached();
void setExpansionPortEnabled(in boolean enable);
void setLEDEnabled(in PRUint8 bits);
void setMotionSensorEnabled(in boolean enable);
void setForceFeedbackEnabled(in boolean enable);
void setIRSensorEnabled(in boolean enable);
void joyStickCalibData(in PRUint32 aLength,
[array, size_is(aLength), retval] out PRUint8 aBytes);
void accCalibData(in PRUint32 aLength,
[array, size_is(aLength), retval] out PRUint8 aBytes);
PRUint32 getMousePosition();
void setMousePosition(in PRUint32 x, in PRUint32 y);
キーボードでブラウザを操作するときには、どうしてもキーボードと手の長さ以上に離れることはできませんし、キーボードと自分の体とが平行になるようにしないとキーを操作しにくくなります。ワイヤレスのマウスを使っても操作するには平面がないと難しいですし、何度もクリックするのは何度もキーを押すのに比べてすぐ疲れてしまいます。
Wiiリモコンの場合、そういった制約がなく、うつぶせになったり、横になったり、自分が楽な姿勢になりながら片手で操作することができるので、Wiiを持っているけどまだWiiリモコンでウェブを見たことがないという方は、ぜひ一度WiiRemoComでなくてもWiiの実機でもPS3でもいいので、ワイヤレスのコントローラでウェブを見るのは身体的にとても楽なのをぜひご体験ください。
WiiもPS3もなくてもだいじょうぶ。ケータイをお持ちでしたら、寝ながらケータイを見るときに感じる画面の狭さや回線の遅さがなくなったようなもんだと思えばたぶんそんなに違いません。
トラックバック元エントリにこのエントリへのリンクがない場合はトラックバックを受け付けません。
http://labs.gmo.jp/mt/mt-tb.cgi/209
comments