LeopardでHIDを使おうとした失敗のメモ

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をしたいのだけどどうすればいいのか不明。元々キーボードやマウスやコントローラーに特化しているようで、深いことをしようとしたら自分で書く必要があるっぽい。まだ追いかける余地は結構あるけどなー…


新しく会社作りました!

コメントをどうぞ