«前の日記(2006年12月27日) 最新 次の日記(2007年01月01日)» 編集

ema log


2006年12月28日 [長年日記]

_ [Wiiリモコン] Caps の取得

興味ない人ごめんなさい。遊んでないで、研究しろって人にもごめんなさい。寝付けないのもあって、夜更かししていて寝坊した ema です。こんにちは。

昨日は、HID デバイスをオープンして、Vendor ID と Product ID を取得するところまででした。今日は、まず、Caps を取得してみます。Google Code Search で見つけたコードからコピペしてきただけですね。本当にありがとうございました。

実行結果は、以下の通り。

Device Caps
------------------------------------
Reserved    : 00875EC2
Usage       : 5
UsagePage   : 1

Input Bytes             : 22
NumberInputButtonCaps   : 14
NumberInputDataIndices  : 14
NumberInputValueCaps    : 0

Feature Bytes           : 0
NumberFeatureButtonCaps : 0
NumberFeatureDataIndices: 0
NumberFeatureValueCaps  : 0

Output Bytes            : 22
NumberOutputButtonCaps  : 11
NumberOutputDataIndices : 11
NumberOutputValueCaps   : 0

WiiLi にかかれているのと数が一致しない気がしますが、はて…

_ [Wiiリモコン] データの受信、非同期IOによる入出力

結論だけ先に書くと、基本的にイベント発生時にしか通信が発生しない仕組みになっているようです。当然といえば当然ですが。よって、非同期IOでブロックされない read / write にする必要があります。とまぁ、こんな感じでしょうか。コンパイルして実行できるサンプルコードを置いておきます→(要DDK)。実行すると

30 8 0 7e 74 99 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
30 0 0 7e 74 99 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
30 8 0 7e 74 99 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
30 0 0 7e 74 99 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
30 4 0 7e 74 99 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
30 0 0 7e 74 99 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
30 4 0 7e 74 99 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
30 0 0 7e 74 99 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
30 1 0 7e 74 99 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
30 0 0 7e 74 99 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
30 2 0 7e 74 99 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
30 0 0 7e 74 99 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
30 1 0 7e 74 99 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
30 0 0 7e 74 99 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
30 2 0 7e 74 99 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
30 0 0 7e 74 99 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
30 0 4 7e 74 99 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
30 0 0 7e 74 99 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
30 0 8 7e 74 99 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
30 0 0 7e 74 99 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0

こんな感じの出力がとれます。ちなみに、↑はコナミコマンドを入れている様子です。加速度センサーの状態はとれていないようですが、もう一息ですね。

_ [Wiiリモコン] 三軸センサー入力

WiiLi眺めてたら簡単そうだったので、WiinRemote のソースを頼りに三軸センサーの値もとれるようになりました。受信前にリクエストを送れば良いだけでした。Overlapped IO で書き込むのってこういう感じで良いのだろうか。書き込みバイト数を caps.OutputReportByteLength にしないといけないのは WiinRemote のおかげでわかりました。実行すると

31 40 60 88 87 78 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 40 40 8a 89 78 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 60 20 8a 88 78 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 0 60 8b 89 77 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 0 40 8c 8c 75 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 0 60 8e 8e 74 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 60 20 91 8f 70 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 0 20 97 8e 6b ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 40 40 9e 8f 67 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 0 20 a9 90 64 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 20 40 b5 8f 62 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 20 0 bd 90 66 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 60 20 bd 92 73 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 40 60 b6 95 86 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 40 40 ae 97 97 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 60 0 a6 95 a3 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 20 20 9f 8f a4 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 20 40 98 8b 9a ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 60 20 92 8a 8d ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 60 20 8d 89 85 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 0 20 88 89 87 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 20 0 80 8c 92 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 60 40 76 8d 9e ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 40 40 68 8c a8 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 60 20 5a 88 ac ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 40 20 51 86 a7 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 20 0 4d 85 9d ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 60 0 49 82 94 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 40 0 46 80 92 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 60 0 44 80 95 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 20 20 46 80 9a ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 20 20 49 80 9c ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 40 0 4d 81 9b ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 40 40 50 81 99 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 20 40 52 81 98 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 60 40 52 81 97 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 20 40 51 80 98 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 60 40 4d 7f 99 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0
31 40 40 4c 7f 99 ff ff ff ff ff ff ff ff ff ff ff ff 0 0 0 0

みたいな感じで、4,5,6 バイト目に三軸センサーの値が入ってきてるのがわかります。順に x, y, z だそうです。

2,3 バイト目が 0 じゃないのは、「Z Acceleration, bit 6 (report 3E) or bit 2 (report 3F)」などの意味があるようですが・・・まぁ明日以降に調べますw。後、WiinRemote のソース見たらいろいろ送ってるんだよなぁ。

なお、1 バイト目は Report ID らしく、0x30 Buttons only、0x31 は Buttons | Motion Sensing Report ということで上手くいってますね!

References
WiiLi.org Wii Linux - Wiimote [wiili.org]
loader/usbdl.cpp [Google Code Search]
StepMania-3.9-rc2a-src/src/archutils/Win32/USB.cpp [Google Code Search]