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


applemtp.sysのブルースクリーンの解決方法

隣の席の人がMacBookにBootCampでインストールしたWindows XPで、ブルースクリーン(BSOD)に悩まされてたので解決メモ。applemtp.sysのエラーで、タッチパッドのドライバらしい。XPとVistaで頻発するとか。

Apple – Support – Downloads

まぁ、つまり、アップデートしろ、と。

自分で試したわけではないので、何ら保証はできませんが。

一応このエラーだけを修正するアップデートは

Multi-Touch Trackpad Update for Windows XP & Vista

これなんだけど、普通のBoot Camp Updateを当てればOKなのかな?

訂正:

逆らしい。

graっちぇgraっちぇ: Trackpad patch v 2.1.2.100はスルーの方向で。(泣)

2.1.2.100のパッチを当てた人がエラー起きてるらしい。隣の人はBoot Camp Update 2.1を当てたらエラーが起きなくなったと言っていたが…

バージョンが戻って安定するようになったのか、もしくは気のせいか。

追伸:

やっぱ安定してないらしい。

とりあえず古いapplemtp.sysを持ってきて差し替えたらいいんじゃないでしょうかね。


pygletのHIDモジュールを使う

Mac OSXのPythonでHIDを使う系の話の流れで、Python2.5+SWIG+libHIDUtilities.dylibを追っていたのだけど、ここに来て問題発覚。

SWIG Basics

SWIGってコールバック呼べないのね…コールバック関数の結果を変数として得ることはできるみたいだけど。HIDの入力イベントを通知とかはできないみたい。一応、フラグをずっと監視とかしたらできそうだけど。

しょうがないので、アプローチを変更。HID関係のメソッド名で検索をかけていたらpygletなるものを発見。クロスプラットフォームのマルチメディアライブラリ。OpenGLから動画の再生から色々できるらしい。日本語のドキュメントもあり。結構メジャーなのかな。

pyglet プログラミングガイド

HID部分だけ引っ張り出して使えそうな雰囲気なので、これで試してみる。

ちなみにさっくりHIDのデバイスリストを列挙するテストをしてみた。

>>> import pyglet.input
>>> pyglet.input.get_devices()
[DarwinHIDDevice(name=Apple IR), DarwinHIDDevice(name=***)]

マーヴェラス。


Python対話モードでのコード補完

Pythonの対話モードでコード補完を使えるということを知った。

環境はMac OSX Leopard+Python2.5.4(Ports)

インタラクティブモードで補完とかヒストリの読み書きとか – Seeking for my unique color.

readlineモジュールがインストールされていなかったので、Portsでインストール。

$ sudo port install py25-readline

これで

>>> import rlcompleter, readline
>>> readline.parse_and_bind("tab: complete")

で補完がばっちり効く。これは便利。

毎回打ち込むのは忘れそうなので、インタラクティブシェルが起動したときに自動で実行されるようにしたい。どうやらsitecustomize.pyというものを書けばいいらしい。

$ vi /Library/Python/2.5/site-packages/sitecustomize.py

import rlcompleter, readline
readline.parse_and_bind("tab: complete")

でいいかなと思ったらどうやら違うらしい。sitecustomize.pyはどこに置けばいいんだろう…


OSXのlocateデータベースを更新する

Mac OSX 10.5 Leopardでlocateコマンドのデータベースを更新する方法のメモ。

$ sudo sh /etc/periodic/weekly/310.locate

で、おk。


applemtp.sysのブルースクリーンの解決方法

隣の席の人がMacBookにBootCampでインストールしたWindows XPで、ブルースクリーン(BSOD)に悩まされてたので解決メモ。applemtp.sysのエラーで、タッチパッドのドライバらしい。XPとVistaで頻発するとか。

Apple – Support – Downloads

まぁ、つまり、アップデートしろ、と。

自分で試したわけではないので、何ら保証はできませんが。

一応このエラーだけを修正するアップデートは

Multi-Touch Trackpad Update for Windows XP & Vista

これなんだけど、普通のBoot Camp Updateを当てればOKなのかな?

訂正:

逆らしい。

graっちぇgraっちぇ: Trackpad patch v 2.1.2.100はスルーの方向で。(泣)

2.1.2.100のパッチを当てた人がエラー起きてるらしい。隣の人はBoot Camp Update 2.1を当てたらエラーが起きなくなったと言っていたが…

バージョンが戻って安定するようになったのか、もしくは気のせいか。

追伸:

やっぱ安定してないらしい。

とりあえず古いapplemtp.sysを持ってきて差し替えたらいいんじゃないでしょうかね。


Mac OSX 10.5のXcodeで.pbprojが開けなくて困ったメモ

LeopardのXcodeでHID Utilities Sourceをビルドしようとして、ダウンロードして展開してみたものの、HID Utilities Slib.pbprojがただのディレクトリにしか見えないので、非常に困った。

これをダブルクリックで開いてビルドするとか書いてあるのだけれども…?

結局ディレクトリの拡張子を.xcodeprojに変更することで開けるようになりました。ちなみにdmgだと変更できないのでzipでね。


Adobe AIRを多重起動する方法

インストールしたひとつのAIRプログラムを同時に複数実行する方法を探していて、見つけた方法。

基本的にAIRは同じプログラムが多重起動しないようになっています。ディレクトリをコピーして、別のディレクトリにしてもダメ。

が、コピーしたディレクトリの中のMETA-INFAIRapplication.xmlを開いて、<id>~</id>の中身を適当に書き換えてやると…意外にもあっさり起動。

なので、インストールしたディレクトリをまるごとユーザ領域にでもコピーして書き換えてしまいましょう。それでも普通に起動します。

副作用とかあるかどうかは未検証。


Pythonを使ってUSBデバイスの接続検知をする

というのを色々調べてMSDN見て構造体の定義を書いたりして、RegisterDeviceNotificationを使ってwxPythonのトップウィンドウにWM_DEVICECHANGEを送るところまで成功して、それをSpy++で確認中にOSが落ちたり色々あったけど、じゃあそれをWndProcで処理する方法を調べようかなと思って「WM_DEVICECHANGE Python」で検索をかけたところ、カナダのサイトに行きついた末、そこからのリンクでwxPythonのwikiに”そのものずばり”なサンプルコードが載っていることを発見してやるせなくなったところが、今です。

前置き長すぎたけど、やり方はこちら。

MonitoringWindowsUsb – wxPyWiki

あー。

あー…。


Python 2.5+wxPythonでDeprecationWarningが出ないようにする

py2exeで実行ファイルにする関係上、DeprecationWarningが出ると終了時にダイアログが出てしまうので対策した。

wxPythonをimportするだけで、以下の警告が出る。

hoge.py:19: DeprecationWarning: The wxPython compatibility package is no longer automatically generated or act
ively maintained.  Please switch to the wx package as soon as possible.
  from wxPython.wx import *

Python 2.6 をインストールすると Mercurial で警告が出るのを回避する – kwatchの日記

こちらの記事を参考に、wxPythonのimport前に、以下の行を追加。

import warnings
warnings.filterwarnings('ignore', category=DeprecationWarning, message=r'The wxPython')

多分ログ出さないようにする方法もあるんだと思うんだけど。DeprecationWarningの解決策を探していたら、出さないようにするってのが見つかったので、とりあえずこれで対処。