JNIBチュートリアル ― 第1章 チュートリアル用の例題 ―
1.1. はじめに (Getting Started)
JNIBのJava開発を始めるためには、aJileソフトウェア・ツールキットをインストールする必要があります。これ以降の説明では、aJileツールは %AJILE_HOME% ディレクトリ(通常 %AJILE_HOME%=c:\ajile )にインストールされており、かつ、 Java Development Kit 1.4.x がインストールされていると仮定します。
サンプルのソースコードは、「 %AJILE_HOME%\tutorial\src 」ディレクトリでみつけられます。
このサンプルは JNIBシステム・ドライバ(jnibsystem) と キャラクター・デスプレー・ドライバー(chardisp) が いかにして キー押下イベントをキャッチし、表示を更新し、LEDの点滅をさせるのに利用されるのかをデモします。 メイン・スレッドは LEDの点滅に使われます。 キーの押下が キャラクター・デスプレー と 標準出力へレポートされるようにするために、イベント・ハンドラはシステム・スレッドへあてがわれます。 ソースコードの各部については以下で詳細に説明します。
//============================================================ // Copyright (c) 2006 aJile Systems // All Rights Reserved //============================================================ import com.ajile.drivers.DriverException; import com.ajile.drivers.characterDisplay.CharacterDisplay; import com.ajile.drivers.jnib.JNibSystem; import com.ajile.drivers.jnib.JNibEventHandler; import com.ajile.jem.rawJEM; /** * Tutorial example for the JNIB. * */ public class Tutorial implements JNibEventHandler { /** System Controller */ public JNibSystem mSys; /** Character display */ public CharacterDisplay mDisp; private static final String KEY_NAME[] = {"", "Exit ", "Value DN", "Value UP", "Select ", "Go ", "Item DN ", "Item UP ", "Menu "};
図1-1: Tutorial.java - クラス変数と定数
チュートリアル・クラス は JNibEventHandler インターフェース を implements しています。 (このインターフェースは、キーが押された または 放された ことを検知する JNIBシステム・スレッドと呼ばれる handleJNibEvent ハンドラーであることを指定します。
このハンドラの実装は「図1-4 Tutorial.java - Event handler and main.」で示されています。 JNIBシステム・スレッド (JNibSystem) と キャラクター・デスプレー(CharacterDisplay) のクラスは KEY_NAME 文字列とともに定義されています。
/** * Constructor */ public Tutorial() { // show the FPGA version int ver = rawJEM.getInt( 0x00c00004 ); System.out.println( "FPGA - version 0x" + Integer.toHexString( ver ) ); // get the system (also fires up the system thread) mSys = JNibSystem.get(); if ( mSys == null ) { // something went wrong throw new RuntimeException( "No JNIB System Available!" ); } // Intendify event handler "handleJNibEvent" mSys.registerEventHandler( this ); // get the configured display mDisp = CharacterDisplay.get(); if ( mDisp == null ) { // something went wrong throw new RuntimeException( "No Character Display Available!" ); } // Initialize character display mDisp.clearDisplay(); mDisp.setLines( 2 ); mDisp.setFont( 0 ); // Startup message mDisp.write( " JNIB Tutorial " ); mDisp.setCursorPos( 1,0 ); mDisp.write( "Press any button" ); }
図1-2: Tutorial.java - コンストラクタ
Tutorialクラスのコンストラクターでは、いかに rawJEM クラスが FPGAバージョン・ナンバーが入っている特定のアドレスをアクセスするのに使われているか、を示しています。 JNIBシステムで、mSysオブジェクトを使って システム・スレッドを開始するインスタンスが作成されています。 イベント・ハンドラもシステム・タスクに登録されていることに注意してください。
同様に、キャラクター・デスプレーでも インスタンスを作成し初期化されています。 そして、初期値としてのテキストがディスプレーに表示されています。
/** * Simple LED blinking. */ public void blinkLED() { // Loop forever to cycle the 4 programmable LEDs int led = 0; while ( true ) { // Turn on off LED mSys.enableLed( led, false ); // Advance to the next LED led = (led + 1) % 4; // Turn on off LED mSys.enableLed( led, true ); // Wait for 1/8 sec try { Thread.sleep( 125 ); } catch ( Exception e ) { } } }
図1-3: Tutorial.java - blinkLED メソッド
blinkLEDメソッドは main により起動され、無限ループの中で処理を続けます。 4つのプログラマブル LED(Error, CF, COM1, COM2)は、カンウンター変数 led を4で剰余演算することにより、オンとオフが繰り返されます。 このスレッドは、点滅するために、125ミリ秒の間隔でスリープすることに注意してください。
/** * Handles a JNIB Event. * * <strong>Do Not Block!</strong> * * @param event MJ Event (JNibEvent_xxxx) * @param val Value associated with Event (keycode, dip value) */ public void handleJNibEvent( int event, int val ) { if ( event == JNIBEVENT_KEYDOWN ) { // send out a beep to annoy nearby people mSys.beep(); } // Update the character display with the key pressed. mDisp.setCursorPos( 1,0 ); mDisp.write( "Key ID: "); mDisp.setCursorPos( 1,8 ); mDisp.write( KEY_NAME[ val ] ); // Echo the event and value to system out. System.out.print( "Event ID = " ); System.out.print( event ); System.out.print( ", Value = " ); System.out.println( val ); } /** * Program main entry. * * @param args Command line args */ public static void main( String[] args ) { System.out.println( "JNIB Tutorial" ); Tutorial tut = new Tutorial(); tut.blinkLED(); System.out.println( "JNIB Tutorial Finished!" ); } }
図1-4: Tutorial.java - イベントハンドラ と main
イベント・ハンドラ handleJNibEvent は、キーが押された または 放された 時はいつでもJNIBシステム・スレッドにより呼び出されます。 キーが押されたことが検出された場合はいつも、スピーカーからビープ音がなります。 キャラクター・デスプレーのカーソル位置がセットされます。
「Event ID」と「Value」も システム・アウトにエコーされます。 表示を整えるために、プリント・ラインが利用されているのに注意してください。
mainメソッドは テスト用のメッセージを出力、Tutorialクラスのインスタンスを作成、 および、blinkLEDメソッドの起動を行っています。 blinkLEDメソッドから、戻ってくることがないので、実は最後のメッセージの出力処理は実行されることはないことに注意してください。
JNIB チュートリアル 目次
- 第1章 チュートリアル 例題 (Tutorial Example)
- 第2章 JEM Builder による アプリケーションの構築 (Building Applications with JEM Builder)
- 2.1. JEM Builder の実行 (Running JEM Builder)
- 2.2. 新しいプロジェクトの作成 (Creating a New Project)
- 2.3. JVMの作成 (Creating the JVM)
- 2.4. CLDC 1.1 ランタイム・クラスのセットアップ (Setting up CLDC 1.1 runtime classes)
- 2.5. CDC 1.1 ランタイム・クラスのセットアップ (Setting up CDC 1.1 runtime classes)
- 2.6. プロジェクトの保存 (Saving the Project)
- 2.7. アプリケーションの構築 (Building the Application)
- 第3章 シャレードを使ってのアプリケーションのロード (Loading Applications using Charade)
関連情報・リンク
- 当サイトの管理人: 四元輝博のブログ「 シリコンバレー 24時 」