Mac OSX 10.5.6 Leopard+Python 2.5でHIDを使おうとしばらく頑張ってたけど、とりあえず失敗の歴史メモ。解決方法は書いていません。
PyUSB
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
SWIG+HID_Utilities
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
pyglet自体はマルチメディア関連のクロスプラットフォームフレームワークみたいなもの。
その中にdarwin_hid.pyというOSX用のHIDライブラリがある。
これはcocoaにctypesでアクセスしている模様。これが一番確率高いなー、とは思う。
実際、
import pyglet.input devices = pyglet.input.get_devices() dev = devices[1]
だけでHIDの一覧を取得可能。しかしこのデバイスにSetReportをしたいのだけどどうすればいいのか不明。元々キーボードやマウスやコントローラーに特化しているようで、深いことをしようとしたら自分で書く必要があるっぽい。まだ追いかける余地は結構あるけどなー…