Mac OSX 10.5.6 Leopard+Python 2.5でHIDを使おうとしばらく頑張ってたけど、とりあえず失敗の歴史メモ。解決方法は書いていません。
libusbのラッパー。これが動けば一番楽なのだけど…
libusbはkernalにHIDを取られてしまうのでOSXで動かないとどこかに書いてあった。一応.kextファイルを作成することで動くようになるらしいのだけど、今回rootでの処理が必要なものは使えなかったので諦め。
ちなみに良質なコードのサンプルはpyMissileにある。
これも。日本語。Python/PyUSB – SasadaLabWiki
あと、便利なドキュメントはこちら。wiki:projects:python:pyusb:pydoc [wiki.erazor-zone.de]
それとlibusb用の.kextファイルの作り方はこちら。
Re: device not opened for exclusive access?: msg#00058 lib.libusb.devel.general
ちなみに何が失敗するかというと、こんな感じ。
>>> import usb
>>> bus = usb.busses()
>>> dev = bus[4].devices[1]
>>> handle = dev.open()
>>> handle.detachKernelDriver(0)
>>> handle.detachKernelDriver(1)
>>> conf = dev.configurations[0]
>>> handle.setConfiguration(conf)
>>> intf = conf.interfaces[0][0]
>>> intf
<usb.Interface object at 0x11398>
>>> handle.claimInterface(intf)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
usb.USBError: usb_claim_interface: couldn't claim interface
>>> handle.setAltInterface(intf)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
usb.USBError: usb_set_altinterface: could not set alternate interface
Control USBIO module from Python on MacOSX
基本的には、上記サイトに書いてある通り。
はまった場所はHID_Utilities_External.hのvoid *をchar *に書き換えておかないといけないこと。これはdylibをビルドしたあとならHID_Utilities_External.hの修正だけでOK。ビルド前なら一緒にHID_Queue_Utilities.cの当該部分も変更しておく必要あり。あとキャスト必要かも。
SetReportは成功して、デバイスにコマンドを処理させることはできた。
ただ、SWIGにはコールバックでPythonのメソッドを呼ばせる方法がないらしく頓挫。まぁ、なくても変数には入るらしくて、それを監視すればいいだけの話なのだけれど、それがうまくいかなくて結局頓挫。一応その方法の説明は以下のあたり。%constantディレクティブを使えばいいらしい。
SWIG Basics Pointers to functions and callbacks
Users guide for fd2python ←コールバックあるような気も?
もうひとつ頓挫の理由として、HIDGetReportの結果が目的の結果にならないこと。データを読み出すコマンドをHIDSetReportで送った後には、確かに値が変化するのだけど、どうも正しいデータにならない…原因つかめず。あと、iSerialNumberの取得もデータが化けてうまくいかず。
pyglet自体はマルチメディア関連のクロスプラットフォームフレームワークみたいなもの。
その中にdarwin_hid.pyというOSX用のHIDライブラリがある。
これはcocoaにctypesでアクセスしている模様。これが一番確率高いなー、とは思う。
実際、
import pyglet.input
devices = pyglet.input.get_devices()
dev = devices[1]
だけでHIDの一覧を取得可能。しかしこのデバイスにSetReportをしたいのだけどどうすればいいのか不明。元々キーボードやマウスやコントローラーに特化しているようで、深いことをしようとしたら自分で書く必要があるっぽい。まだ追いかける余地は結構あるけどなー…