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 チュートリアル 目次

関連情報・リンク

Also available in: HTML TXT