[Japanese|English]

USB-IO制御クラスライブラリ

Morphy USB-IOをJavaアプリケーションで制御するためのクラスライブラリを作りました。ここでは、このクラスライブラリを紹介します。

開発の動機

ひとことで言うと、私は最近、Javaしか使っていないから、でしょう。以前は、CやC++も使っていましたが、Javaで書き流すのになれてしまうと、いちいちメモリ (オブジェクト) を解放するのが面倒で、C++を使う気がしません。

なので、Morphy USB-IOを使うアプリケーションも当然Javaで書きたかったというわけです。

クラスライブラリの概要

初めに、例を使って、クラスライブラリの概要を説明します。

LED の点滅の例

この例は、USB-IOにLEDを一個だけ接続し、それを点滅させるものです。LEDはPort #1のビット0に接続します。具体的な回路図は以下の通りです。

schematics

プログラムは以下です。

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();
        }
    }
}

以下、順に、何をやっているのか説明します。

USBIO 制御クラス

先頭で import している xyzzy.hardwre.UsbIo が、USBIO 制御クラスライブラリの主要なクラスです。このクラスと、その内部クラスである UsbIo.Device とを用いて、USBIO を制御します。

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 デバイスオブジェクトの使用が終わったら、必ず UsbIo.Device.close() メソッドを呼び出して、内部で使用している資源を解放しなければなりません。この操作が自動的行われることはありません。close を呼び出さないまま参照がなくなってガベジコレクトされると、システムの資源がリークします。(これが、頭痛の種になることは分かっていますが、それが Java というものです。) 上の例では、close の呼び出しを確実にするために、try - finally を使っています。USBIO クラスライブラリのメソッドは、ときどき unchecked exception を throw しますので、try - finally の使用は、事実上義務であると思った方がいいでしょう。

入手とインストールの方法

入手方法

このサイトのダウンロードのページからダウンロードしましょう。転載などは一切制限していませんし、連絡もいただいていませんので、他にもダウンロードできるところがあるかも知れません。このサイトからうまく落とせないときには、検索エンジン等で探すと、他にもみつかるかもしれません。

注: このページが1か月ほどアクセスできなくなっていた時期に、「実際に他のサイトからダウンロードしようとして、検索エンジンを駆使して探したがみつからなかった」旨のメールをいただきました。著者としてはありがたい限りですが、上の記述は冗談のつもりでした。この程度のソフトウェアを、頼まれたわけでもないのにわざわざミラーしようという人はいないでしょう。混乱させるようなことを書いて、申し訳ありませんでした。

このサイトからの配布は、バイナリ配布とソース配布の 2 種類の形で行っています。このうちバイナリ配布は、現在のところ、プラットフォーム共通のクラスファイル (.jar ファイル) と、プラットフォームに依存するネイティブコードに分かれています。

(現在のところ、Java には、USB の機能に直接アクセスインターフェースが含まれていないため、ネイティブコードの利用は不可欠です。)

バイナリ配布のインストール

バイナリ配布は、実行する OS と Java 実行環境 (VM) の種類によって、ダウンロードすべきファイルが異なります。現在サポートしているプラットフォームと、必要なファイルの一覧を、以下に示します。この他の実行環境の場合には、ソース配布を入手し (必要ならば適当な改造を行ったあとで) 再コンパイルが必要です。

プラットフォームと必要なファイル
OSCPUJavaVM必要なファイル
WindowsAnyMicrosoftのVMusbio.jar
Windowsx86Sun MicrosystemsのJDK,
Sun MicrosystemsのJRE,
その他のVM
usbio.jar
usbio.dll
FreeBSDx86FreeBSD版JDK,
FreeBSD版JRE
usbio.jar
libusbio.so

いずれの場合にも、適当なディレクトリを用意して、配布物一式を (まとめて) 格納すればいいでしょう。アプリケーションも同じディレクトリに格納します。起動は、ファイルを格納したディレクトリをカレントディレクトリとした状態で、以下のように行います。(usbapps.jar に格納されている Led を起動するとします。)

Windows + Microsoft VM
jview /cp:p usbio.jar;usbapps.jar Led
Windows + Sun Microsystems' JDK/JRE (ver. 1.1.x)
jre -cp usbio.jar;usbapps.jar Led
Windows + Sun Microsystems' JDK/JRE (Java 2)
java -cp usbio.jar;usbapps.jar Led
FreeBSD + ported JDK/JRE (ver. 1.1.x)
jre -cp usbio.jar:usbapps.jar Led

なお、FreeBSD の場合は (おそらく、大抵の現代的な posix 互換 OS では) 予め、LD_LIBRARY_PATH 環境変数に . を追加するなどして、ダイナミックリンカに libusbio.so が見つかるようにしておく必要があります。

ソースの再コンパイル方法

ソースプログラムは、jar 互換の .zip ファイルとして配布しています。jar など、適当なツールを用いてソースファイルを展開して、コンパイルして下さい。

添付の Makefile は、Windows 上で Cygwin の環境を用いることを前提に書かれています。Java ソースのコンパイルには jikes を用いるようになっています。(ただし、他の一般的な Java コンパイラでも、コンパイルできると思います。) ネイティブコード関係については、以下のようになっています。