Morphy USB-IOをJavaアプリケーションで制御するためのクラスライブラリを作りました。ここでは、このクラスライブラリを紹介します。
ひとことで言うと、私は最近、Javaしか使っていないから、でしょう。以前は、CやC++も使っていましたが、Javaで書き流すのになれてしまうと、いちいちメモリ (オブジェクト) を解放するのが面倒で、C++を使う気がしません。
なので、Morphy USB-IOを使うアプリケーションも当然Javaで書きたかったというわけです。
初めに、例を使って、クラスライブラリの概要を説明します。
この例は、USB-IOにLEDを一個だけ接続し、それを点滅させるものです。LEDはPort #1のビット0に接続します。具体的な回路図は以下の通りです。
プログラムは以下です。
import xyzzy.hardware.UsbIo; class Led { public static void main ( String[] argv ) { try { final UsbIo.Device usbio = UsbIo.getDevice(); try { int bits = 0xFF; for ( int count = 25; count > 0; --count ) { bits ^= 0x01; usbio.invoke( UsbIo.WRITE1, bits ); Thread.sleep( 200 ); } } finally { usbio.invoke( UsbIo.WRITE1, 0xFF ); usbio.close(); } } catch ( Throwable e ) { /* Show any Error/Exception. */ e.printStackTrace(); } } }
以下、順に、何をやっているのか説明します。
先頭で import している xyzzy.hardwre.UsbIo
が、USBIO 制御クラスライブラリの主要なクラスです。このクラスと、その内部クラスである UsbIo.Device
とを用いて、USBIO を制御します。
最初に、USBIO を表すオブジェクトを取得します。USBIO デバイスオブジェクトは、UsbIo.Device
クラスの (実際には、このクラスのサブクラスの) インスタンスです。上の例では、UsbIo.getDevice()
というスタティックメソッドを呼ぶことにより、USBIO デバイスオブジェクトを取得しています。
この UsbIo.getDevice()
は、USBIO が接続されていないと、null
を返します。(上の例ではやっていませんが、本来はチェックするべきです。) 複数接続されている場合には、その中の一つが適当に選ばれます。複数の USBIO が接続されている状況で、2 台以上を区別して扱いたい場合には、UsbIo.allDevices()
というメソッド (USBIO デバイスオブジェクトのエニュメレーションを返す) を使います。
USBIO にコマンドを送って、USBIO の入出力ポートを操作するには、UsbIo.Device.invoke(int cmd, int arg)
メソッドを使います。cmd
には、USBIO へ送るコマンドのコマンドコードを指定します。arg
には、コマンドのパラメタを指定します。この例では、WRITE PORT #1
コマンドを使って、LED が接続されたポートの値を変えながらループすることで、LED を点滅させています。
USBIO デバイスオブジェクトの使用が終わったら、必ず UsbIo.Device.close()
メソッドを呼び出して、内部で使用している資源を解放しなければなりません。この操作が自動的行われることはありません。close
を呼び出さないまま参照がなくなってガベジコレクトされると、システムの資源がリークします。(これが、頭痛の種になることは分かっていますが、それが Java というものです。) 上の例では、close
の呼び出しを確実にするために、try - finally を使っています。USBIO クラスライブラリのメソッドは、ときどき unchecked exception を throw しますので、try - finally の使用は、事実上義務であると思った方がいいでしょう。
このサイトのダウンロードのページからダウンロードしましょう。転載などは一切制限していませんし、連絡もいただいていませんので、他にもダウンロードできるところがあるかも知れません。このサイトからうまく落とせないときには、検索エンジン等で探すと、他にもみつかるかもしれません。
注: このページが1か月ほどアクセスできなくなっていた時期に、「実際に他のサイトからダウンロードしようとして、検索エンジンを駆使して探したがみつからなかった」旨のメールをいただきました。著者としてはありがたい限りですが、上の記述は冗談のつもりでした。この程度のソフトウェアを、頼まれたわけでもないのにわざわざミラーしようという人はいないでしょう。混乱させるようなことを書いて、申し訳ありませんでした。
このサイトからの配布は、バイナリ配布とソース配布の 2 種類の形で行っています。このうちバイナリ配布は、現在のところ、プラットフォーム共通のクラスファイル (.jar ファイル) と、プラットフォームに依存するネイティブコードに分かれています。
(現在のところ、Java には、USB の機能に直接アクセスインターフェースが含まれていないため、ネイティブコードの利用は不可欠です。)
バイナリ配布は、実行する OS と Java 実行環境 (VM) の種類によって、ダウンロードすべきファイルが異なります。現在サポートしているプラットフォームと、必要なファイルの一覧を、以下に示します。この他の実行環境の場合には、ソース配布を入手し (必要ならば適当な改造を行ったあとで) 再コンパイルが必要です。
OS | CPU | JavaVM | 必要なファイル |
---|---|---|---|
Windows | Any | MicrosoftのVM | usbio.jar |
Windows | x86 | Sun MicrosystemsのJDK, Sun MicrosystemsのJRE, その他のVM | usbio.jar usbio.dll |
FreeBSD | x86 | FreeBSD版JDK, FreeBSD版JRE | usbio.jar libusbio.so |
いずれの場合にも、適当なディレクトリを用意して、配布物一式を (まとめて) 格納すればいいでしょう。アプリケーションも同じディレクトリに格納します。起動は、ファイルを格納したディレクトリをカレントディレクトリとした状態で、以下のように行います。(usbapps.jar
に格納されている Led
を起動するとします。)
jview /cp:p usbio.jar;usbapps.jar Led
jre -cp usbio.jar;usbapps.jar Led
java -cp usbio.jar;usbapps.jar Led
jre -cp usbio.jar:usbapps.jar Led
なお、FreeBSD の場合は (おそらく、大抵の現代的な posix 互換 OS では) 予め、LD_LIBRARY_PATH
環境変数に .
を追加するなどして、ダイナミックリンカに libusbio.so
が見つかるようにしておく必要があります。
ソースプログラムは、jar 互換の .zip ファイルとして配布しています。jar
など、適当なツールを用いてソースファイルを展開して、コンパイルして下さい。
添付の Makefile は、Windows 上で Cygwin の環境を用いることを前提に書かれています。Java ソースのコンパイルには jikes を用いるようになっています。(ただし、他の一般的な Java コンパイラでも、コンパイルできると思います。) ネイティブコード関係については、以下のようになっています。