IoT むけ？ ラズパイ用 X window いらずのマウス入力ライブラリ libtmdrvr の紹介

# libtmdrvr - Tiny Mouse Driver without X window
　libtmdrvr.a は X window を必要としない Raspberry Pi (Raspbian)用の小さなマウスから入力を行うライブラリです。詳細は、GitHub [https://github.com/iigura/libtmdrvr](https://github.com/iigura/libtmdrvr) を参照して頂ければ、と思うのですが、今回は README.md を頑張って英語で書いてしまったため、こちらに日本語の説明を書いてみます。

# ライセンス
　MIT ライセンスです。

# 概要
　このライブラリを使うと、X window を必要とせず、CUI アプリケーションにてマウスからの入力 - マウスの移動距離＝マウスカーソルの位置や、ボタンの状況を取得できます。X window を必要としないので、プログラム製作の負担を下げることができます。例えば、main 関数内のループにて、マウスのボタンが押されているか否かを確認しつつ、ボタンが押されたら終了するーなどといったプログラムが作成できます。

　なお、このライブラリではマウスカーソルの表示はサポートしません。必要であれば、ユーザープログラム側でマウスカーソルの表示を行うようして下さい。ラズパイであれば、X window なしで OpenGL で画面表示もできますので、本ライブラリを活用すれば、簡単な情報端末（情報キオスク）なども作成できるのではないかと思っています。

# 使い方
　ユーザープログラム側で tmDriver.h をインクルードして下さい。あとは、提供されている各種関数（後ほど示します）を用いてコーディングして下さい。ビルド時には libtmdrvr.a をリンクするようにして下さい。本ライブラリは pthread を使用していますので、pthread ライブラリもリンクするようにして下さい。

　gcc を使う例は以下のようになります：

    gcc -std=gnu99 -Wextra -Wall -pthread test.c -L. -ltmdrvr -o test

詳しくは同梱の Makefile を御覧ください。

# インストール
　本ライブラリには特別なインストーラーは存在しません。インクルードパスやライブラリのサーチパスの対象となっている場所に適当に保存して下さい。パッケージには libtmdrvr.a は含まれていませんので、make （本当にこれだけ）を実行して、libtmdrvr.a を作成して下さい。

　make を実行すると、サンプルプログラム test もビルドされますので、動作確認などに活用して下さい（マウスの左ボタンと中ボタンの同時押しで終了します）。

# パッケージに同梱されているファイル
　Makefile, README.md 以外のものとしては、

* tmDriver.h --- libtmdrvr を使うためのヘッダファイル
* tmDriver.c --- libtmdrvr.a のソースコード
* test.c --- サンプルプログラム

# APIs
　本ライブラリで提供している関数には tmDrvr という接頭語がついています（例：tmDrvrInit）。

## 初期化と廃棄
　使用に際してはライブラリの初期化が必要です。初期化は、

    bool tmDrvrInit(int inMinX,int inMinY,int inMaxX,int inMaxY);

で行います。引数として指定するのはマウスカーソルの移動範囲で、マウスカーソルの位置 (X,Y) の移動範囲を inMiniX <= X < inMaxX, inMinY <= Y < inMaxY に設定します。

　関数の戻り値は、初期化に成功した場合は true を返し、そうでない場合は false を返します。

　ライブラリの使用をやめる場合は、

    bool tmDrvrDispose();

を呼び出します。この関数を呼出した後、最初期化も可能です（再び tmDrvrInit を呼び出すことも可能です）。

　この関数の戻り値も、破棄に成功した場合は true を返し、そうでない場合は false を返します。

## マウスカーソルの位置を取得する関数
　マウスカーソルの位置は、左上を原点 (0,0) とし、右方向を +X、下方向を +Y とする座標系で定義されています。

    // 現在のマウスカーソルの X 座標を返します。
    int tmDrvrGetX();

    // 現在のマウスカーソルの Y 座標を返します。
    int tmDrvrGetY();

　X 座標と Y 座標を同時に取得するには、次の関数を使用します：

    void tmDrvrGetXY(int *outMouseX,int *outMouseY);

マウスカーソルの位置は、引数として与えられる outMouseX および outMouseY が指す領域にそれぞれ X 座標、Y 座標の値が格納されます。

## マウスボタンの状態を取得する関数
　このライブラリは、左ボタン、中ボタン、右ボタンの 3 つのボタンに対応しています。それぞれのボタンの状態を個別に取得するには、以下の関数を使用します：

    // 左ボタンが押されていたら true を返します。
    bool tmDrvrIsLeftButtonPressed();
    
    // 中ボタンが押されていたら true を返します。
    bool tmDrvrIsMiddleButtonPressed();
    
    // 右ボタンが押されていたら true を返します。
    bool tmDrvrIsRightButtonPressed();

　複数のボタンの状態を取得するには、以下の関数を使用します：

    int tmDrvrGetButton();

この関数の戻り値には各ボタンが押されている状態が格納されており、tmDriver.h にて定義されている以下の定数とビット単位の AND を取ることにより、各ボタンの押下状態を取得できます。

    TMDRVR_LEFT_BUTTON_PRESSED,
    TMDRVR_MIDDLE_BUTTON_PRESSED,
    TMDRVR_RIGHT_BUTTON_PRESSED,

　例えば、左ボタンと右ボタンが押されており、かつ、中ボタンは押されていないことを確認するには、以下のようなコードが利用できます：

    int status=tmDrvrGetButton();
    if(  (status & TMDRVR_LEFT_BUTTON_PRESSED) !=0
      && (status & TMDRVR_RIGHT_BUTTON_PRESSED)!=0
      && (status & TMDRVR_MIDDLE_BUTTON_PRESSED)==0 ) {
        // do something
    } 

## その他の関数
　マウスカーソルの現在位置を設定するには、

    bool tmDrvrSetPosition(int inMouseX,int inMouseY);

が利用できます。この関数の呼び出すと、マウスカーソルの現在位置 (X,Y) は引数として与えられた inMouseX および inMouseY を用いて、 (X,Y) = (inMouseX,inMouseY) と設定されます。

　また、マウスカーソルの移動範囲を再設定するには、

    bool tmDrvrSetArea(int inMinX,int inMinY,int inMaxX,int inMaxY);

が利用できます。引数の意味は tmDrvrInit と同じです。

# システム構成図

    +-------------------------------------------+
    |    Tiny Mouse Driver <--- this library    |
    +-----------------------+---------+---------+
    | Linux Input Subsystem | inotify | pthread |
    +-----------------------+---------+---------+
    |                Linux Kernel               |
    +-------------------------------------------+
    |                Raspberry Pi               |
    +-------------------------------------------+

# 最後に
　誤り等ありましたら、コメントして頂ければ幸いです。