Todays date: 07-Feb-2003
This is RoBiOS version 5.2a

# RoBiOSに内蔵されているライブラリー関数

以下ではRoBIOSオペレーティングシステムのライブラリー関数について説明しています。
RoBIOSの新しいバージョンは、以下で説明する機能とは異なるかもしれません。 最新のソフトウェアー説明書をご覧ください。また、RoBIOS関数のタイミング情報も参照してください。

#### アプリケーションプログラムには下記の行を記入してください。：

    #include "eyebot.h"

以下のライブラリーはROM内にありC言語プログラミングで使うことができ、"gcc68"など（librobi.aを使って）が呼び出されるときに自動的にリンクされます。
注意：ここのリストで紹介してない多くのライブラリー関数もあります。これらはROM内にはありませんが、配布されています（例えば、精巧な画像処理）。アプリケーションプログラムとリンクして使うことができ、提供されているデモプログラムの中で紹介されています。

- 画像処理
- キー入力
- LCD画面出力
- カメラ
- システム関数
- マルチタスク
- セマフォ
- タイマー
- ダウンロードとRS-232
- オーディオ
- PSDセンサー
- サーボとDCモーター
- VW駆動インターフェース
- バンパー / 赤外線センサー
- ラッチ
- パラレルポート
- A/Dコンバーター
- 無線通信
- コンパス
- TV用赤外線リモコン

### リターンコード

特別な説明がない限り、すべての関数は実行に成功すると0を返します。また、エラーが発生したときには0以外の値を返します。ごく一部の関数だけは複数のコードを返します。

### 画像処理

基本画像処理関数 (robios関数):

    Data Types:
            /* 80x60の画像で1画素の境界線をもつ */
            #define imagecolumns 82
            #define imagerows 62

            typedef BYTE image[imagerows][imagecolumns];
            typedef BYTE colimage[imagerows][imagecoulmns][3];

    int IPLaplace (image *src, image *dest);
            入力:           (src) 元の白黒画像
            出力:           (dest) 目的の白黒画像
            内容:           元の画像に対してラプラス演算を行い、結果を
                            目的の画像に書き込みます。

    int IPSobel (image *src, image *dest);
            入力:           (src) 元の白黒画像
            出力:           (dest) 目的の白黒画像
            内容:           元の画像に対してソーベル演算を行い、結果を
                            目的の画像に書き込みます。

    int IPDither (image *src, image *dest);
            入力:           (src) 元の白黒画像
            出力:           (dest) 目的の白黒画像
            内容:           元の画像に対して2x2の領域のデザリング演算を行い、
                            結果を目的の画像に書き込みます。

    int IPDiffer (image *current, image *last, image *dest);
            入力:           (current) 現在の白黒画像
                            (last) 最後に見た白黒画像
            出力:           (dest) 目的の白黒画像
            内容:           現在と最後に見た白黒画像の間で各ピクセルごとに
                            グレースケールレベルの差を計算し、目的の画像に
                            書き込みます。

    int IPColor2Grey (colimage *src, image *dest);
            入力:           (src) 現在の白黒画像
            出力:           (dest) 目的の白黒画像
            内容:           8ビットRGBカラー画像データをグレースケールに変換し、
                            結果を目的の画像に書き込みます。

上級画像処理関数がimprocライブラリーにあります。詳細については ImprovのWebページ を参照してください。

### キー入力

標準的なUnixの"libc"ライブラリーによって、標準的なC言語で"キーボード"から"文字"キーを読むときに使う"scanf"コマンドを利用することができます。

    int KEYGetBuf (char *buf);
            入力:           (buf) バッファー示すポインター
            出力:           (buf) バッファーにキーコードを書き込みます。
                            有効なキーコードは KEY1,KEY2,KEY3,KEY4 (左から右)
            内容:           キー入力があるまでウエイトし、キーコードをバッファーに
                            書き込みます。

    int KEYGet (void);
            入力:           なし
            出力:           (リターンコード) 押されたキーのキーコードを返します。
                            有効なキーコードは KEY1,KEY2,KEY3,KEY4 (左から右)
            内容:           キー入力があるまでウエイトし、キーコードを返します。

    int KEYRead (void);
            入力:           なし
            出力:           (リターンコード) 押されたキーのキーコードを返すか、
                            何も押されていないときには0を返します。
                            有効なキーコードは KEY1,KEY2,KEY3,KEY4 (左から右)
                            または0
            内容:           キーコードを読み、その値を返します。ウエイトしません。

    int KEYWait (int excode);
            入力:           (excode) 押される予定のキーコード
                            有効なキーコードは KEY1,KEY2,KEY3,KEY4 (左から右)
                            または任意のキー
            出力:           なし
            内容:           特定のキーが押されるまでウエイトします。

### LCD画面出力

標準的なUnixの"libc"ライブラリーによって、標準的なC言語でLCD"画面"に例えば"hello, world"を表示するときに使う"printf"コマンドを利用することができます。：

    printf("Hello, World!\n");

下記の関数はある特定の出力関数として使うことができます。

    int LCDPrintf(const char format[], ...);
            入力:           文字やパラメータ
            出力:           なし
            内容:           LCD画面に文字や数字を表示します。
                            これは単純にClibの"printf"と同じ機能をもちます。

    int LCDClear(void);
            入力:           なし
            出力:           なし
            内容:           LCD画面を消去します。

    int LCDPutChar (char char);
            入力:           (char) 表示する文字
            出力:           なし
            内容:           現在のカーソル位置に文字を表示し、文字列の最後に
                            カーソルを移動します。

    int LCDSetChar (int row,int column,char char);
            入力:           (char) 表示する文字
                            (column) 列番号
                            有効な数： 0-15
                            (row) 行番号
                            有効な数： 0-6
            出力:           なし
            内容:           指定した位置に文字を表示します。

    int LCDPutString (char *string);
            入力:           (string) 表示する文字列
            出力:           なし
            内容:           現在のカーソル位置に文字列を表示し、文字列の最後に
                            カーソルを移動します。

    int LCDSetString (int row,int column,char *string);
            入力:           (string) 表示する文字列
                            (column) 列番号
                            有効な数： 0-15
                            (row) 行番号
                            有効な数： 0-6
            出力:           なし
            内容:           指定した位置に文字列を表示します。

    int LCDPutHex (int val);
            入力:           (val) 表示する数字
            出力:           なし
            内容:           現在のカーソル位置に16進数で数字を表示します。

    int LCDPutHex1 (int val);
            入力:           (val) 表示する数字 (0〜255の１バイトの数字)
            出力:           なし
            内容:           現在のカーソル位置に1バイトの16進数を表示します。

    int LCDPutInt (int val);
            入力:           (val) 表示する数字
            出力:           なし
            内容:           現在のカーソル位置に10進数で数字を表示します。

    int LCDPutIntS (int val, int spaces);
            入力:           (val)    表示する数字
                            (spaces) 最小表示桁数
            出力:           なし
            内容:           現在のカーソル位置に10進数で数字を表示します。
                            必要に応じて数字の前にスペースが挿入されます。

    int LCDPutFloat (float val);
            入力:           (val) 表示する数字
            出力:           なし
            内容:           現在のカーソル位置に数字を移動小数で表示します。

    int LCDPutFloatS (float val, int spaces, int decimals);
            入力:           (val)      表示する数字
                            (spaces)   最小表示桁数
                            (decimals) 少数点以下の桁数
            出力:           なし
            内容:           現在のカーソル位置に数字を移動小数で表示します。
                            必要に応じて数字の前にスペースが挿入され、指定し
                            た少数桁を表示します。

    int LCDMode (int mode);
            入力:           (mode) 表示モード
                            有効な設定値： (NON)SCROLLING|(NO)CURSOR
            出力:           なし
            内容:           表示モードを設定します。
                            SCROLLING: 画面表示のときにカーソルが右下（最終行）に
                               行くと、１行スクロールし新しい行の初めにカーソルを
                               移動して表示します。
                            NONSCROLLING: 画面表示のときにカーソルが右下（最終行）
                               に行くと、画面表示をそのままにしてカーソルを左上に
                               移動して表示します。
                            NOCURSOR: カーソルを非表示にします。
                            CURSOR: カーソルを現在の位置に表示します。

    int LCDSetPos (int row, int column);
            入力:           (column) 列番号
                            有効な数： 0-15
                            (row) 行番号
                            有効な数： 0-6
            出力:           なし
            内容:           カーソルを指定した位置に移動します。

    int LCDGetPos (int *row, int *column);
            入力:           (column) 現在の列の位置を出力するポインター
                            (row) 現在の行の位置を出力するポインター
            出力:           (*column) 現在の列番号
                            有効な数： 0-15
                            (row) 現在の行番号
                            有効な数： 0-6
            内容:           現在のカーソル位置を返します。

    int LCDPutGraphic (image *buf);
            入力:           (buf) グレースケール画像(80*60画素)のポインター
            出力:           なし
            内容:           指定した画像を白黒でLCD画面の左上から表示します。
                            このとき、メニュー行を消さないように80x54画素の領
                            域についてのみ表示します。

    int LCDPutColorGraphic (colimage *buf);
            入力:           (buf) カラー画像(80*60画素)のポインター
            出力:           なし
            内容:           指定した画像を白黒でLCD画面の左上から表示します。
                            このとき、メニュー行を消さないように80x54画素の領
                            域についてのみ表示します。注意：これを実行すると
    　　　　　　　　　　　　現在の画像内容を破壊します。

    int LCDPutImage (BYTE *buf);
            入力:           (buf) 白黒画像(128*64画素)のポインター
            出力:           なし
            内容:           指定した白黒画像を画面いっぱいに表示します。

    int LCDMenu (char *string1, char *string2, char *string3,char *string4);
            入力:           (string1) キー1に表示するメニュー
                            (string2) キー2に表示するメニュー
                            (string3) キー3に表示するメニュー
                            (string4) キー4に表示するメニュー
                            有効な設定値：
                              - 最大４つの文字列。現在のメニューを消去し新たに
                                表示されます。
                              - "" : 現在のメニューをそのまま表示します。
                              - " " : 現在のメニューを消去します。
            出力:           なし
            内容:           指定した登録内容でメニュー行を表示します。

    int LCDMenuI (int pos, char *string);
            入力:           (pos) 変更するメニュー番号(1〜4)
                            (string) 上記のposで指定した位置に表示するメニュー。
                                     最大４文字。
            出力:           なし
            内容:           指定したメニューを与えた文字列で上書きします。

    int LCDSetPixel (int row, int col, int val);
            入力:           (val) 画素操作コード
                            有効な数：  0 = 画素を消去
                                        1 = 画素を表示
                                        2 = 画素を反転
                            (column) 列番号
                            有効な数： 0-127
                            (row) 行番号
                            有効な数： 0-63
            出力:           なし
            内容:           指定した位置の画素に画素操作を行います。
                            LCDSetPixel(row, col, 2)はLCDInvertPixel(row, col)
                            と同じ操作になります。

    int LCDInvertPixel (int row, int col);
            入力:           (column) 列番号
                            有効な数： 0-127
                            (row) 行番号
                            有効な数： 0-63
            出力:           なし
            内容:           指定した位置の画素を反転します。
                            LCDInvertPixel(row, col)はLCDSetPixel(row, col, 2)
                            と同じ操作になります。

    int LCDGetPixel (int row, int col);
            入力:           (column) 列番号
                            有効な数： 0-127
                            (row) 行番号
                            有効な数： 0-63
            出力:           (return code) 画素情報
                            有効な数：   画素が表示のときに１
                                         画素が非表示のときに０
            内容:           指定した位置の画素の状態を返します。

    int LCDLine(int x1, int y1, int x2, int y2, int col)
            入力:           座標(x1,y1)、(x2,y2)と色
            出力:           なし
            内容:           Bresenhamアルゴリズムによって(x1,y1)から(x2,y2)
                            に線を描画します。
                            左上座標値   0, 0
                            右下座標値 127,63
                            色: 0 白
                                1 黒
                                2 反転

    int LCDArea(int x1, int y1, int x2, int y2, int col)
            入力:           座標(x1,y1)、(x2,y2)と色
            出力:           なし
            内容:           (x1,y1)から(x2,y2)の領域に四角形を描画します。
                            設定条件： x1 < x2 かつ y1 < y2
                            左上座標値   0, 0
                            右下座標値 127,63
                            色: 0 白
                                1 黒
                                2 反転

### カメラ

下記の関数は白黒またはカラーカメラの初期化や取込画像の処理を行います：

    int CAMInit (int mode);
            入力:           (mode) カメラの初期化モード
                            有効な設定値： NORMAL
            出力:           (return code) カメラのバージョンまたはエラーコード
                            有効な数： 255   = カメラ未接続
                                       254   = カメラの初期化エラー
                                       0     = QuickCam V1 白黒カメラ
                                       16    = QuickCam V2 カラーカメラ
                                       17    = EyeCam-1 (6300)カメラ
                                       18    = EyeCam-2 (7620)カメラ
                                       19    = EyeCam-3 (6620)カメラ
            内容:           接続したカメラのリセットと初期化を行います。
            注意:           [以前にQuickcamの拡大率を表示するのに使用: WIDE,NORMAL,TELE]

    int CAMRelease (void);
            入力:           なし
            出力:           (return code) 0 = 成功
                                         -1 = エラー
            内容:           CAMInit()を使って割当てたすべてのリソースを解除します。

    int CAMGetFrame (image *buf);
            入力:           (buf) グレースケール（白黒）画像のポインター
            出力:           NONE
            内容:           白黒カメラから62x82の画像を取り込み、0 (黒)〜 255 (白)
                            の8ビットの値を返します。

    int CAMGetColFrame (colimage *buf, int convert);
            入力:           (buf) カラー画像のポインター
                            (convert) 8ビットのグレースケール画像にデータを縮小
                                      するかどうかのフラグ
                                      0 = 2ビットカラー画像
                                      1 = 8ビットグレースケール（白黒）画像
            出力:           なし
            内容:           カラーカメラから82x62の画像を読み込み、必要があれば
                            データを縮小します。
            注意:           - 'image'型のバッファーが必要です。
                            - 以下のように指定します。:
                                    image buffer;
                                    CAMGetColFrame((colimage*)&buffer, 1);

    int CAMGetFrameMono (BYTE *buf);
            注意:           この関数はEyeCamについてのみ使用できます。
            入力:           (buf) フルサイズの画像バッファーのポインター
                                  (CAMGetで使用)
            出力:           (return code) 0 = 成功
                                         -1 = エラー (カメラが未初期化)
            内容:           フルスケールのグレースケール画像を読み込みます。
                            (例えば、82x62, 176x144, 320x240)この大きさは
                            カメラモジュールによります。

    int CAMGetFrameRGB (BYTE *buf);
            注意:           この関数はEyeCamについてのみ使用できます。
            入力:           (buf) フルサイズの画像バッファーのポインター
                                  (CAMGetで使用)
            出力:           (return code) 0 = 成功
                                         -1 = エラー (カメラが未初期化)
            内容:           １画素３バイトRGBのフルカラー画像を読み込みます。
                            (例えば、82x62*3, 176x144*3, 320x240*3)
                            この大きさはカメラモジュールによります。

    int CAMGetFrameBayer (BYTE *buf);
            注意:           この関数はEyeCamについてのみ使用できます。
            入力:           (buf) フルサイズの画像バッファーのポインター
                                  (CAMGetで使用)
            出力:           (return code) 0 = 成功
                                         -1 = エラー (カメラが未初期化)
            内容:           １画素４バイトのBayer形式のフルカラー画像を読み
                             込みます。(例えば、82x62*4, 88x72*4, 160x120*4)
                            この大きさはカメラモジュールによります。

    int CAMSet (int para1, int para2, int para3);
            注意:           パラメータはカメラの種類によって異なります。
            入力:QuickCam   (para1) 輝度
                            (para2) オフセット(白黒カメラ) / 色相(カラーカメラ)
                            (para3) コントラスト(白黒カメラ) / 飽和率(カラーカメラ)
                            有効な値: 0-255
                  ---------------------------------------------------
                  EyeCam    (para1) フレーム速度（フレーム／秒）
                            (para2) 未使用
                            (para3) 未使用
                            有効な設定値: FPS60, FPS30, FPS15,
                             FPS7_5, FPS3_75, FPS1_875, FPS0_9375, and FPS0_46875
                             　VV6300/VV6301ではデフォルトはFPS7_5
                             　OV6620ではデフォルトはFPS1_875
                             　OV7620ではデフォルトはFPS0_48375
            出力:           なし
            内容:           カメラのパラメーターを設定します。

    int CAMGet (int *para1, int *para2 ,int *para3);
            注意:           パラメータはカメラの種類によって異なります。
            入力:QuickCam   (para1) 輝度
                            (para2) オフセット(白黒カメラ) / 色相(カラーカメラ)
                            (para3) コントラスト(白黒カメラ) / 飽和率(カラーカメラ)
                            有効な値: 0-255
                  ---------------------------------------------------
                  EyeCam    (para1) フレーム速度（フレーム／秒）
                            (para2) フル画像の幅
                            (para3) フル画像の高さ
            出力:           なし
            内容:           カメラの設定値を知るのに使います。

    int CAMMode (int mode);
            入力:           (mode) 設定するカメラモード
                            有効な設定値: (NO)AUTOBRIGHTNESS
            出力:           なし
            内容:           ディスプレイの表示モードを設定します。
                            AUTOBRIGHTNESS: カメラの輝度を自動的に調整します。
                            NOAUTOBRIGHTNESS: カメラの輝度を自動的に調整しません。
                            この関数はFIFO対応のEyeCamドライバーでは利用できません。

### システム関数

    misc:
    -----
    char *OSVersion(void);
            入力:           なし
            出力:           OSのバージョン
            内容:           現在使われているRoBIOSのバージョンを返します。
            例:             "3.1b"

    int OSError(char *msg,int number,BOOL dead);
            入力:           (msg) メッセージのポインター
                            (number) 整数値
                            (dead) 強制終了またはキー入力待ちの選択スイッチ
                            有効な数:       0 = 強制終了しない
                                            1 = 強制終了する
            出力:           なし
            内容:           画面にメッセージと数字を表示し、プロセッサーを
                            強制終了またはキー入力待ち状態にします。

    int OSMachineType(void);
            入力:           なし
            出力:           装置の名前
                            有効な設定値: VEHICLE, PLATFORM, WALKER
            内容:           ユーザーにプログラムを実行している環境について
                            情報を提供します。

    int OSMachineSpeed(void);
            入力:           なし
            出力:           実際のCPU周波数（Hz）
            内容:           ユーザーにCPU速度について情報を提供します。

    char* OSMachineName(void);
            入力:           なし
            出力:           Eyebotの名前
            内容:           Eyebotにつけられた名前(HDTで設定)について情報を
                            提供します。

    unsigned char OSMachineID(void);
            入力:           なし
            出力:           EyebotのID番号
            内容:           EyebotにつけられたID番号(HDTで設定)について情報を
                            提供します。

    割込み:
    -----------
    int OSEnable (void);
            入力:           なし
            出力:           なし
            内容:           割込みを有効にします。

    int OSDisable (void);
            入力:           NONE
            出力:           NONE
            内容:           割込みを無効にします。

    TPU-RAMに保存する変数:
    ------------------------
    int OSGetVar(int num);
    *)
            入力:           (num) TPU-RAMの保存位置に関する番号
                            有効な設定値:       SAVEVAR1-4（ワード単位保存）
                                                SAVEVAR1a-4a/1b-4b（バイト単位保存）
            出力:           (return code) 保存されている値
                            有効な数:           0-65535（ワード単位保存）
                                                0-255（バイト単位保存）
            内容:           指定した場所に保存された値を示します。

    int OSPutVar(int num, int value);
    *)
            入力:           (num) TPU-RAMの保存位置に関する番号
                            有効な設定値:       SAVEVAR1-4（ワード単位保存）
                                                SAVEVAR1a-4a/1b-4b（バイト単位保存）
                            (value) 保存する値
                            有効な数:           0-65535（ワード単位保存）
                                                0-255（バイト単位保存）

            出力:           なし
            内容:           指定した場所に値を保存します。

    *) SAVEVAR1-3はRoBiOSによって既に使われています。

### マルチタスク

    int OSMTInit(BYTE mode);
            入力:           (mode) 実行モード
                            有効な設定値: COOP=デフォルト、PREEMPT
            出力:           なし
            内容:           マルチタスク環境を初期化します。

    struct tcb *OSSpawn (char *name, void (*code)(void), int stksiz, int pri, int uid)
            入力:           (name) スレッド名のポインター
                            (code) スレッドの開始アドレス
                            (stksize) スレッドスタックのサイズ
                            (pri) スレッドの優先度
                            有効な設定値: MINPRI-MAXPRI
                            (uid) スレッドのユーザーID
            出力:           (return code) 初期化されたスレッドのの制御ブロック
                            のポインター
            内容:           新しいスレッドを初期化します。tcb（タスク制御ブロック）
                            が初期化され、スケジュールキューに挿入されます。ただし
                            READYには設定されません。

    int OSMTStatus(void);
            入力:           なし
            出力:           PREEMPT、COOP、NOTASK
            内容:           実際のマルチタスクのモードを返します。(preemptive、
                            cooperative、sequentialモード)

    int OSReady(struct tcb *thread);
            入力:           (thread) スレッド制御ブロックのポインター
            出力:           なしE
            内容:           指定したスレッドをREADYに設定します。

    int OSSuspend(struct tcb *thread);
            入力:           (thread) スレッド制御ブロックのポインター
            出力:           なし
            内容:           指定したスレッドをSUSPENDに設定します。

    int OSReschedule(void);
            入力:           なし
            出力:           なし
            内容:           現在の実行スレッドを新たに指定します。

    int OSYield(void);
            入力:           なし
            出力:           なし
            内容:           現在の実行スレッドを停止し、再スケジュールします。

    int OSRun(struct tcb *thread);
            入力:           (thread) スレッド制御ブロックのポインター
            出力:           なし
            内容:           指定したスレッドをREADYにし、再スケジュールします。

    int OSGetUID(thread);
            入力:           (thread) スレッド制御ブロックのポインター
                                     (tcb *)0は現在の実行スレッドを示します。
            出力:           (return code) スレッドのユーザーID
            内容:           指定したスレッドのユーザーIDを示します。

    int OSKill(struct tcb *thread);
            入力:           (thread) スレッド制御ブロックのポインター
            出力:           なし
            内容:           指定したスレッドを削除し、再スケジュールします。

    int OSExit(int code);
            入力:           (code) 終了コード
            出力:           なし
            内容:           指定した現在の実行スレッドを強制終了し、設定した
                            終了コードとメッセージを表示します。

    int OSPanic(char *msg);
            入力:           (msg) メッセージ文字列のポインター
            出力:           なし
            内容:           エラーの出たマルチタスクスレッドを強制終了し、
                            画面にメッセージを表示して、プロセッサーを停止します。

    int OSSleep(int n)
            入力:           (n) スリープ時間表す1/100秒単位の数
            出力:           なし
            内容:           現在の実行スレッドを少なくともn*1/100秒の間スリー
                            プさせます。マルチスレッドモードでは別のスレッドが
                            スケジュールされます。マルチスレッドでない場合には
                            OSWait()関数が呼び出されます。

    int OSForbid(void)
            入力:           なし
            出力:           なし
            内容:           preemtiveモードにおいてスレッドの切替を無効にします。

    int OSPermit(void)
            入力:           なし
            出力:           なし
            内容:           preemtiveモードにおいてスレッドの切替を有効にします。

    上記の関数では、"thread"パラメーターは常にtcb（スレッド制御ブロック）の
    ポインターを示し、現在の実行されているスレッドは０で表すことができます。

### セマフォ

    int OSSemInit(struct sem *sem,int val);
            入力:           (sem) セマフォのポインター
                            (val) 開始値
            出力:           なし
            内容:           指定した開始値でセマフォを初期化します。

    int OSSemP(struct sem *sem);
            入力:           (sem) セマフォのポインター
            出力:           なし
            内容:           セマフォに対してP (down)操作を行います。

    int OSSemV(struct sem *sem);
            入力:           (sem) セマフォのポインター
            出力:           なし
            内容:           セマフォに対してV (up)操作を行います。

### タイマー

    int OSSetTime(int hrs,int mins,int secs);
            入力:           (hrs) 時間の値
                            (mins) 分の値
                            (secs) 秒の値
            出力:           なし
            内容:           指定した値をシステムクロックに設定します。

    int OSGetTime(int *hrs,int *mins,int *secs,int *ticks);
            入力:           (hrs) 時間の値のポインター
                            (mins) 分の値のポインター
                            (secs) 秒の値のポインター
                            (ticks) 刻み値のポインター
            出力:           (hrs) 時間の値
                            (mins) 分の値
                            (secs) 秒の値
                            (ticks) 刻み値
            内容:           システム時間を示します。１秒は100刻み値です。

    int OSShowTime(void);
            入力:           なし
            出力:           なし
            内容:           システム時間を画面表示します。

    int OSGetCount(void);
            入力:           なし
            出力:           (return code) リセットされてからの1/100秒で表した
                            時間数
            内容:           (return code) リセットされてからの1/100秒で表した
                            時間数を示します。32ビットの整数値で248日の表示が
                            できます。

    int OSWait (int n);
            入力:           (n) ウエイトの時間
            出力:           なし
            内容:           n*1/100秒間のウエイトルーチンを実行します。

    タイマーIRQ:
    ----------
    TimerHandle OSAttachTimer(int scale, TimerFnc function);
            入力:           (scale) 100Hzタイマー用のプリスケール値(1以上)
                            (TimerFnc) 周期的に呼び出す関数
            出力:           (TimerHandle) handle to referrence the IRQスロットを
                                          参照するためのハンドル
                                          0はリストがいっぱいであることを示すエラー
                                          (最大16)
            内容:           割込み要求関数(void function(void))をIRQリストに登録
                            します。scaleパラメーターは、指定した関数を多くの異な
                            ったアプリケーションで使えるように、関数呼出し周波数
                            を設定します(100/scale Hz)。
            注意:           設定する関数の実行時間（全関数に必要な合計時間）は10ms
                            以下にしなければなりません。そうでないと、割込みが遅
                            れてモーター／センサーのタイミングに狂いが生じます。

    int OSDetachTimer(TimerHandle handle)
            入力:           (handle) 先に設定したタイマーIRQのハンドル
            出力:           0 = ハンドルが無効
                            1 = タイマーIRQリストからの削除に成功
            内容:           IRQリストから割込み関数を削除します。

### ダウンロードとRS-232

    int OSDownload(char *name,int *bytes,int baud,int handshake,int interface); **)
            入力:           (name) プログラム名配列のポインター
                            (bytes) 転送される整数バイトのポインター
                            (baud) 転送速度
                            有効な設定値: SER4800,SER9600,SER19200,SER38400,SER57600,
                            SER115200(SERIAL2-3のみ。SERIAL1はCPU周波数に依存)
                            (handshake) 転送方式
                            有効な設定値: NONE, RTSCTS, IRDA (IRDAはSERIAL2/3のみ)
                            (interface): シリアルインターフェース
                            有効な設定値: SERIAL1-3
            出力:           (return code)
                             0 = エラーなし、ダウンロード成功 -再度呼び出し
                            99 = ダウンロード成功
                             1 = 受信時タイムアウトエラー
                             2 = 受信時ステータスエラー
                             3 = 送信時タイムアウトエラー
                             5 = SREチェックサムエラー
                             6 = ユーザーキャンセルエラー
                             7 = 未知のSREコードエラー
                             8 = 不正転送速度エラー
                             9 = 不正転送開始アドレスエラー
                            10 = 不正インターフェースエラー

            内容:           指定したシリアル設定とプログラム名によりユーザープロ
                            グラムをロードします。この関数はリターンコードがO以外
                            のときに繰り返しループで呼ぶ必要があります。現在何バイ
                            トのデータまで転送されたかを、この関数がループの中で何
                            バイト転送したかということから算出することができます。

    int OSInitRS232(int baud,int handshake,int interface);
            入力:           (baud) 転送速度
                              有効な設定値:
                              SER4800,SER9600,SER19200,SER38400,SER57600,SER115200
                            (handshake) 転送方式
                              有効な設定値: NONE,RTSCTS, IRDA (IRDAはSERIAL2/3のみ)
                            (interface) シリアルインターフェース
                              有効な設定値: SERIAL1-3
            出力:           (return code)
                             0 = 成功
                             8 = 不正転送速度エラー
                            10 = 不正インターフェースエラー
            内容:           指定した設定値でRS232を初期化します。

    int OSSendCharRS232(char chr,int interface);
            入力:           (chr) 送信する文字
                            (interface) シリアルインターフェース
                              有効な設定値: SERIAL1-3
            出力:           (return code)
                             0 = 成功
                             3 = 送信時タイムアウトエラー
                            10 = 不正インターフェースエラー
            内容:           RS232を使って１文字送信します。

    int OSSendRS232(char *chr,int interface);
            入力:           (chr) 送信する文字のポインター
                            (interface) シリアルインターフェース
                              有効な設定値: SERIAL1-3
            出力:           (return code)
                             0 = 成功
                             3 = 送信時タイムアウトエラー
                            10 = 不正インターフェースエラー
            内容:           RS232を使って１文字送信します。OSSendCharRS232()関数
                            の代わりに使用します。この関数は将来的に削除されます。

    int OSRecvRS232(char *buf,int interface);
            入力:           (buf) 文字配列のポインター
                            (interface) シリアルインターフェース
                               有効な設定値: SERIAL1-3
            出力:           (return code)
                             0 = 成功
                             1 = 受信時タイムアウトエラー
                             2 = 受信時ステータスエラー
                            10 = 不正インターフェースエラー
            内容:           RS232を使って１文字受信します。

    int OSFlushInRS232(int interface);
            入力:           (interface) シリアルインターフェース
                               有効な設定値: SERIAL1-3
            出力:           (return code)
                             0 = 成功
                            10 = 不正インターフェースエラー
            内容:           受取側のステータスをリセットし、そのFIFOに書き込みます。
                            NOHANDSHAKEモードのときに、ある決められた条件で受信開始
                            前にFIFOに書き込むときにとても役に立ちます。

    int OSFlushOutRS232(int interface);
            入力:           (interface) シリアルインターフェース
                               有効な設定値: SERIAL1-3
            出力:           (return code)
                             0 = 成功
                            10 = 不正インターフェースエラー
            内容:           送信側のFIFOに書き込みます。現在のホストへの転送を中断
                            するとき（例えば、ホストが反応しなくなった場合）にとても
                            役に立ちます。

    int OSCheckInRS232(int interface);
            入力:           (interface) シリアルインターフェース
                               有効な設定値: SERIAL1-3
            出力:           (return code) ＞０ : 現在FIFOで有効な文字数
                                          ＜０ : 0xffffff02 受信時ステータスエラー
                                                (有効な文字がない)
                                               0xffffff0a 不正インターフェースエラー
            内容:           ある大きさのパッケージを読み出すときに使います。

    int OSCheckOutRS232(int interface);
            入力:           (interface) シリアルインターフェース
                               有効な設定値: SERIAL1-3
            出力:           (return code) ＞０ : FIFOに入力されている文字数
                                          ＜０ : 0xffffff0a 不正インターフェースエラー
            内容:           ホストがデータを適切に受信しているかどうかやどのぐらいの
                            通信速度までパッケージを転送できるかなどを調べるときに使
                            います。

    int USRStart(void);                                                         **)
            入力:           なし
            出力:           なし
            内容:           ロードしたプログラムを実行します。

    int USRResident(char *name, BOOL mode);                                     **)
            入力:           (name) 名前を示す配列のポインター
                            (mode) モード
                            有効な設定値: SET、GET
            出力:           なし
            内容:           ロードしたプログラムの場所をリセットします。
                            SET     開始アドレスとプログラム名を保存します。
                            GET     開始アドレスとプログラム名を呼出します。

    **) この関数はユーザープログラムで使用してはいけません！！！！

### オーディオ

サンプル形式: WAVまたはAU/SND (8bit、pwm、mulaw)
サンプル速度: 5461, 6553, 8192, 10922, 16384, 32768 (Hz)
音階範囲: 65 Hz 〜 21000 Hz
音　　長: 1 msec 〜 65535 msecs

    int AUPlaySample(char* sample);
            入力:           (sample) サンプルデータのポインター
            出力:           (return code) 指定したサンプルの再生周波数
                                         サンプル形式がサポートされていないときは0
            内容:           指定されたサンプルを再生します（ブロックされていない時）。
                            サポートしている形式：
                            WAV または AU/SND  (8bit、pwm、mulaw)
                            5461, 6553, 8192, 10922, 16384, 32768 (Hz)

    int AUCheckSample(void);
            入力:           なし
            出力:           サンプルが演奏されているときにはFALSE
            内容:           サンプルの演奏が終わっているかどうかをブロックしないで
                            確認します。

    int AUTone(int freq, int msec);
            入力:           (freq) 音階周波数
                            (msecs) 音長
            出力:           なし
            内容:           指定した音階と音長で音を出力します（ブロックされていな
                            い時）。
                            サポートされている形式:
                            freq = 65 Hz 〜 21000 Hz
                            msecs = 1 msec 〜 65535 msecs

    int AUCheckTone(void);
            入力:           なし
            出力:           音を出力しているときにFALSE
            内容:           音の出力が終わっているかどうかをブロックしないで確認
                            します。

    int AUBeep(void);
            入力:           なし
            出力:           なし
            内容:           ビープ音を鳴らします！

    int AURecordSample(BYTE* buf, long len, long freq);
            入力:           (buf) バッファーのポインター
                            (len) サンプルと28バイトのヘッダーを足したバイト数
                            (freq) 望ましいサンプル周波数
            出力:           (return code) 実際のサンプル周波数
            内容:           指定されたバッファーに設定した周波数でマイクから
                            入力を録音します（ブロックされていないとき）。
                            録音形式: AU/SND (pwm)、符号なし8ビットサンプル

    int AUCheckRecord(void);
            入力:           なし
            出力:           録音中にFALSE
            内容:           録音が終わっているかどうかをブロックしないで確認します。

    int AUCaptureMic(void);
            入力:           なし
            出力:           (return code) マイクの入力値 (10ビット)
            内容:           マイクの入力値を取得します。

### PSDセンサー

距離検出器(PSD)は距離を測定するために赤外線を使用します。 センサーによって精度が異なっているので、正しい距離を得るため にHDTを使って補正する必要があります。

    PSDHandle PSDInit(DeviceSemantics semantics);
            入力:           (semantics) 使用するPSDセンサーの名前 (hdt.hを参照)
            出力:           (return code) 今後の操作で使用するハンドル
            内容:           semanticsで指定したPSDセンサーの初期化を行います。
                            最大で８つのPSDセンサーの初期化をすることができます。

    int PSDRelease(void);
            入力:           なし
            出力:           なし
            内容:           測定を中止し、すべての初期化されたPSDセンサーを
                            開放します。

    int PSDStart(PSDHandle bitmask, BOOL cycle);

            入力:           (bitmask) 並列に測定したいPSDの指定ビットあるいは
                                      全ハンドル
                            (cycle)   TRUE  = 連続測定
                                      FALSE = 単一測定
            出力:           (return code) 開始要求にたいするステータス
                                      -1 = エラー (ハンドルがない)
                                       0 = OK
                                       1 = 使用中 (他の測定で使用中)
            内容:           PSDセンサーの連続／単一測定を開始します。
                            連続測定は60msごとに行われます。

    int PSDStop(void);
            入力:           なし
            出力:           なし
            内容:           現在のショット終了時にPSDセンサーの連続測定を
                            停止します。

    BOOL PSDCheck(void);
            入力:           なし
            出力:           (return code) 妥当な結果が得られたときにTRUE
            内容:           妥当なPSD結果が得られているかどうかのブロック
                            しないで確認します。

    int PSDGet(PSDHandle handle);
            入力:           (handle) 使用するPSDセンサーのハンドル
                                     現在実測中のセンサーは0で指定
            出力:           (return code) 実際の距離(mm単位、HDTで変換済み）
            内容:           実際のタイムスタップまたはPSDセンサーで測定した距離値
                            を示します。もしも生データが測定範囲を超えたときには
                            PSD_OUT_OF_RANGE(=9999)を返します。

    int PSDGetRaw(PSDHandle handle);
            入力:           (handle) 使用するPSDセンサーのハンドル
                                     現在実測中のセンサーは0で指定
            出力:           (return code) 実際の生データ（変換前）
            内容:           実際のタイムスタップまたは選択されたPSDセンサーで
                            測定した生値を示します。

### サーボとDCモーター

    ServoHandle SERVOInit(DeviceSemantics semantics);
            入力:           (semantics) 使用するサーボの名前 (hdt.hを参照)
            出力:           (return code) サーボのハンドル
            内容:           指定したサーボを初期化します。

    int SERVORelease (ServoHandle handle)
            入力:           (handle) 開放したいサーボの設定ビットあるいは
                                     全ハンドル
            出力:           (return code) 0 = ok
                                       エラー (開放されない):
                                        0x11110000 = 全体的に間違っているハンドル
                                        0x0000xxxx = 開放可能なTPUチャンネルに接続
                                                     されたままのビットを表示した
                                                     ハンドル
            内容:           指定したサーボを開放します。

    int SERVOSet (ServoHandle handle,int angle);
            入力:           (handle) 並列に接続したいサーボの設定ビットあるいは
                                     全ハンドル
                            (angle)  サーボの角度
                                     有効な値: 0-255
            出力:           (return code) 0 = ok
                                         -1 = エラー、間違えたハンドル
            内容:           指定したサーボを設定した角度にします。

    MotorHandle MOTORInit(DeviceSemantics semantics);
            入力:           (semantics) 使用するDCモーターの名前 (hdt.hを参照)
            出力:           (return code) DCモーターのハンドル
            内容:           指定したDCモーターを初期化します。

    int MOTORRelease (MotorHandle handle)
            入力:           (handle) 開放したいDCモーターの論理的あるいは全ハンドル
            出力:           (return code) 0 = ok
                                         エラー (開放されない):
                                          0x11110000 = 全体的に間違っているハンドル
                                          0x0000xxxx = 開放可能なTPUチャンネルに接続
                                                     されたままのビットを表示した
                                                     ハンドル
            内容:           指定したDCモーターを開放します。

    int MOTORDrive (MotorHandle handle,int speed);
            入力:           (handle) 駆動したいDCモーターの論理的あるいは全ハンドル
                            (speed) ％表示したモーターの回転速度
                            有効な値:     -100 〜 100 (反転最大〜正転最大)
                                           0 完全停止
            出力:           (return code)  0 = ok
                                          -1 = エラー、間違えたハンドル
            内容:           指定したDCモーターを設定した回転速度で駆動します。

    QuadHandle QUADInit(DeviceSemantics semantics);
            入力:           (semantics) 使用するデコーダーの名前
            出力:           (return code) デコーダーのハンドル
                                          エラー時に0
            内容:           指定したデコーダーの初期化をします（最大で８個まで）。

    int QUADRelease(QuadHandle handle);
            入力:           (handle) 開放したいデコーダーの論理的あるいは全ハンドル
            出力:            0 = ok
                            -1 = エラー、間違えたハンドル
            内容:           一つあるいは複数のデコーダーを開放します。

    int QUADReset(QuadHandle handle);
            入力:           (handle) リセットしたいデコーダーの論理的あるいは
                                     全ハンドル
            出力:            0 = ok
                            -1 = エラー、間違えたハンドル
            内容:           一つあるいは複数のデコーダーをリセットします。

    int QUADRead(QuadHandle handle);
            入力:           (handle) 一つのデコーダーのハンドル
            出力:           32変換値 (-2^31 〜 2^31-1)
            内容:           実際のデコーダーカウンターの値を読み取ります。
                            初期値はゼロです。
                            注意: 間違えてハンドルを指定してもゼロになります!!

    DeviceSemantics QUADGetMotor(DeviceSemantics semantics);
            入力:           (handle) 一つのデコーダーのハンドル
            出力:           対応しているDCモーターの名前
                            0 = 間違ったハンドル
            内容:           対応したモーターの名前を示します。

    float QUADODORead(QuadHandle handle);
            入力:           (handle) 一つのデコーダーのハンドル
            出力:           最後に走行距離計をリセットしてからの距離(m)
            内容:           DCモーターの最後にリセットしてから走行距離を示します。
                            この値は、モーターがリセット後に駆動された走行全長では
                            なくて、スタート地点からの距離になります。

    int QUADODOReset(QuadHandle handle);
            入力:           (handle) リセットしたいデコーダーの論理的あるいは
                                     全ハンドル
            出力:            0 = ok
                            -1 = エラー、間違ったハンドル
            内容:           スタート地点を定義するために走行距離計をリセットします。

### VW駆動インターフェース

これは、モーターとエンコーダーを使ってロボットを駆動するための ハイレベルな車輪制御用APIです。

    Data Types:
            typedef float meterPerSec;
            typedef float radPerSec;
            typedef float meter;
            typedef float radians;

            typedef struct
            { meter x;
              meter y;
              radians phi;
            } PositionType;

            typedef struct
            { meterPerSec v;
              radPerSec w;
            } SpeedType;

    VWHandle VWInit(DeviceSemantics semantics, int Timescale);
            入力:           (semantics) デバイスの名前
                            (Timescale) 100HzIRQ用のプリスケール値(1以上)
            出力:           (return code) VWハンドルまたはエラーで0
            内容:           指定したVWドライバーを初期化します。(１つだけ
                            初期化できます！) DCモーターとエンコーダーは自
                            動的に予約されます！！　Timescalによって処理を
                            精度重視(Timescale=1に設定し100Hzで更新)から
                            速度重視(Timescale>1に設定しで100/Timescale Hz
                            で更新)までの範囲に設定することができます。

    int VWRelease(VWHandle handle);
            入力:           (handle) 開放するVWハンドル
            出力:            0 = ok
                            -1 = エラー、間違ったハンドル
            内容:           VWドライバーを解放し、DCモーターの回転を停止します。

    int VWSetSpeed(VWHandle handle, meterPerSec v, radPerSec w);
            入力:           (handle) 一つのVWハンドル
                            (v) 新しい直進速度
                            (w) 新しい回転速度
            出力:            0 = ok
                            -1 = エラー、間違ったハンドル
            内容:           新しい速度を設定します。: v(m/s)とw(rad/s、°/sでは
                            ありません)。

    int VWGetSpeed(VWHandle handle, SpeedType* vw);
            入力:           (handle) 一つのVWハンドル
                            (vw) 実際のvとwの値を記録するためのポインター
            出力:            0 = ok
                            -1 = エラー、間違ったハンドル
            内容:           実際の速度を示します。: v(m/s)と(rad/s、°/sでは
                            ありません。)

    int VWSetPosition(VWHandle handle, meter x, meter y, radians phi);
            入力:           (handle) 一つのVWハンドル
                            (x) 新しいx座標
                            (y) 新しいy座標
                            (phi) 新しい角度
            出力:            0 = ok
                            -1 = エラー、間違ったハンドル
            内容:           新しい位置を設定します。: x(m), y(m) phi(rad、°では
                            ありません。)

    int VWGetPosition(VWHandle handle, PositionType* pos);
            入力:           (handle) 一つのVWハンドル
                            (pos) 実際の位置を記録するためのポインター(x,y,phi)
            出力:            0 = ok
                            -1 = エラー、間違ったハンドル
            内容:           実際の位置を示します。: x(m), y(m) phi(rad、°では
                            ありません。)

    int VWStartControl(VWHandle handle, float Vv, float Tv, float Vw, float Tw);
            入力:           (handle) 一つのVWハンドル
                            (Vv) vの制御用の比例定数
                            (Tv) vの制御用の積分定数
                            (Vw) wの制御用の比例定数
                            (Tw) wの制御用の積分定数
            出力:            0 = ok
                            -1 = エラー、間違ったハンドル
            内容:           vwインターフェースのPI制御を可能にし、そのパラメータ
    　　　　　　　　　　　　を設定します。デフォルトでは、vwインターフェースが初期化
                            されるときにPI制御は有効になっていません。制御器は取り付
                            けられているモーターに供給される電力を調整し、要求される
                            速度(VWSetSpeedで設定)を維持しようとします。制御器に設定
                            する注意深く決める必要があります！

                            制御器用の式:
                                                        t
                            new(t) = V*(diff(t) + 1/T * [diff(t)dt )
                                                        0
                            推奨設定:  VWStartControl(vw, 7.0, 0.3, 7.0, 0.1);
                            V: 一般的に7.0に近い値
                            T: 一般的に0〜1.0の値
                            制御器を有効にした後で最後に速度が安定するように
                            速度(VWSetSpeed)を設定します。

    int VWStopControl(VWHandle handle);
            入力:           (handle) 一つのVWハンドル
            出力:            0 = ok
                            -1 = エラー、間違ったハンドル
            内容:           制御器を直ちに無効にします。vwインターフェースは
                            通常、最後に設定した速度を維持します。

    int VWDriveStraight(VWHandle handle, meter delta, meterpersec v)
            入力:           (handle) 一つのVWハンドル
                            (delta)  駆動する距離 (m単位。正値 -> 前進)
                                                         (負値 -> 後退)
                            (v)      駆動速度 (常に正値!)
            出力:            0 = ok
                            -1 = エラー、間違ったハンドル
            内容:           "delta"で指定した距離を速度vで直進します(前進または
                            後退)。もし実行中でVWDriveStraight、VWDriveTurn、
                            VWDriveCurve、VWSetSpeed関数が呼び出されると途中で
                            直ちに割込みます。

    int VWDriveTurn(VWHandle handle, radians delta, radPerSec w)
            入力:           (handle) 一つのVWハンドル
                            (delta)  回転角度 (rad単位。正値 -> 反時計回転)
                                                       (負値 -> 時計回転)
                            (w)      回転速度 (常に正値!)
            出力:            0 = ok
                            -1 = エラー、間違ったハンドル
            内容:           "delta"で指定した角度を速度wで回転します(時計回転また
                            反時計回転)。もし実行中でVWDriveStraight、VWDriveTurn、
                            VWDriveCurve、VWSetSpeed関数が呼び出されると途中で
                            直ちに割込みます。

    int VWDriveCurve(VWHandle handle, meter delta_l, radians delta_phi, meterpersec v)
            入力:           (handle) 一つのVWハンドル
                            (delta_l) 回転駆動距離 (m単位。正値 -> 前進)
                                                          (負値 -> 後退)
                            (delta_phi) 回転角度 (rad単位。正値 -> 反時計回転)
                                                          (負値 -> 時計回転)
                            (v)         駆動速度 (常に正値!)
            出力:            0 = ok
                            -1 = エラー、間違ったハンドル
            内容:           "delta_l"で指定した回転駆動距離を移動ロボット全体で
                            "delta_phi"の角度、速度vで曲進します(前進または後退、
                            時計回転または反時計回転)。もし実行中でVWDriveStraight、
                            VWDriveTurn、VWDriveCurve、VWSetSpeed関数が呼び出される
                            と途中で直ちに割込みます。

    float VWDriveRemain(VWHandle handle)
            入力:           (handle) 一つのVWハンドル
            出力:            0.     = 以前のVWDriveXコマンドが完了
                             その他 = 目的地までの距離
            内容:           VWDriveStraightとVWDriveTurn関数で設定した値
                            のうち目的地まで残りの距離を示します。
                            (VWDriveCurveではdelta_lで設定した残り距離のみを
                            示します。）

    int VWDriveDone(VWHandle handle)
            入力:           (handle) 一つのVWハンドル
            出力:           -1 = エラー、間違ったハンドル
                             0 = ロボットはまだ移動中
                             1 = 以前のVWDriveXコマンドが完了
            内容:           以前のVWDriveX()コマンドが完了しているかどうかを
                            調べます。

    int VWDriveWait(VWHandle handle)
            入力:           (handle) 一つのVWハンドル
            出力:           -1 = エラー、間違ったハンドル
                             0 = 以前のVWDriveXコマンドが完了
            内容:           以前のVWDriveX()コマンドが完了するまで次のコマンド
                            をブロックします。

    int VWStalled(VWHandle handle)
            入力:           (handle) 一つのVWハンドル
            出力:           -1 = エラー、間違ったハンドル
                             0 = ロボットはまだ移動中か移動コマンドが無効
                             1 = VW駆動コマンド中に少なくとも１つのモーターが
                                 行き詰まり
            内容:           少なくとも一つのロボットのモーターが現在行き詰って
                            いるかどうかを確認します。

### バンパー / 赤外線センサー

ここでは、古いロボットモデルにおける旧式のセンサーを有効にします。

    BumpHandle BUMPInit(DeviceSemantics semantics);
            入力:           (semantics) センサーの名前
            出力:           (return code) バンパーハンドルまたはエラーで0
            内容:           指定したバンパーを初期化します (最大16個のバンパーを
                            設定できます)。

    int BUMPRelease(BumpHandle handle);
            入力:           (handle) 開放したいバンパーの論理的あるいは全ハンドル
            出力:           (return code)
                            0 = ok
                           エラー (開放されない):
                             0x11110000 = 全体的に間違っているハンドル
                             0x0000xxxx = 開放可能なTPUチャンネルに接続
                                          されたままのビットを表示した
                                          ハンドル
            内容:           一つまたはそれ以上のバンパーを開放します。

    int BUMPCheck(BumpHandle handle, int* timestamp);
            入力:           (handle) 一つのバンパーハンドル
                            (timestamp) タイムスタンプを示すポインター
            出力:           (return code)
                             0 = 衝突                      *タイムスタンプが有効
                            -1 = 未衝突または違うハンドル  *タイムスタンプを消去
            内容:           一つのバンパーで衝突が起こっているかを確認して
                            タイムスタンプ(TPU)を返します。最初の衝突を記録し
                            BUMPCheck関数が呼び出されるまで、それを維持します。
    IRHandle IRInit(DeviceSemantics semantics);
            入力:           (semantics)   センサーの名前
            出力:           (return code) 赤外線センサーハンドルまたはエラーで0
            内容:           指定した赤外線センサーを初期化します (最大16個の
                            バンパーを設定できます)。

    int IRRelease(IRHandle handle);
            入力:           (handle) 開放したい赤外線センサーの論理的あるいは
                                     全ハンドル
            出力:           (return code)
                            0 = ok
                           エラー (開放されない):
                             0x11110000 = 全体的に間違っているハンドル
                             0x0000xxxx = 開放可能なTPUチャンネルに接続
                                          されたままのビットを表示した
                                          ハンドル
            内容:           一つまたはそれ以上の赤外線センサーを開放します。

    int IRRead(IRHandle handle);
            入力:           (handle) 一つの赤外線センサーハンドル
            出力:           (return code) 0/1 = TPUチャンネル端子の状態の
                                          -1  = 間違ったハンドル
            内容:           赤外線センサーの実際の状態を読み取ります。

### ラッチ

ラッチはローレベルの入出力用バッファーです。

    BYTE OSReadInLatch(int latchnr);
            入力:           (latchnr) 指定する入力用ラッチの番号 (範囲: 0〜3)
            出力:           指定したラッチの状態
            内容:           指定したラッチの入力状態を読み取ります。

    BYTE OSWriteOutLatch(int latchnr, BYTE mask, BYTE value);
            入力:           (latchnr) 指定する出力用ラッチの番号 (範囲: 0〜3)
                            (mask)    出力を０にするための論理積用マスク
                            (inverse!)
                            (value)   出力を１にするための論理和用マスク
            出力:           指定したラッチの以前の出力状態
            内容:           指定した出力用ラッチの状態を変えて、出力状態を
                            維持します。
                            　例: OSWriteOutLatch(0, 0xF7, 0x08); ビット4を1にする
                            　例: OSWriteOutLatch(0, 0xF7, 0x00); ビット4を0にする

    BYTE OSReadOutLatch(int latchnr);
            入力:           (latchnr) 指定する出力用ラッチの番号 (範囲: 0〜3)
            出力:           指定したラッチの出力状態
            内容:           指定したラッチの出力状態を読み取ります。

### パラレルポート

    BYTE OSReadParData(void);
            入力:           なし
            出力:           8ビットのパラレルポートの値
            内容:           パラレルポートからデータを読み取ります。(ハイで
                            アクティブ)

    void OSWriteParData(BYTE value);
            入力:           (value) 新しい出力データ
            出力:           なし
            内容:           パラレルポートに新しいデータを出力します。(ハイで
                            アクティブ)

    BYTE OSReadParSR(void);
            入力:           なし
            出力:           ５つのステータス端子のステータス
            内容:           ５つのステータス端子のステータスを読み取ります。
                            (ハイでアクティブ)
                            BUSY(4), ACK(3), PE(2), SLCT(1), ERROR(0)

    void OSWriteParCTRL(BYTE value);
            入力:           (value) 制御端子の新しい出力データ (4ビット)
            出力:           なし
            内容:           制御端子に新しいデータを出力します。
                            (ハイでアクティブ)
                            SLCTIN(3), INT(2), AUTOFDXT(1), STROBE(0)

    BYTE OSReadParCTRL(void);
            入力:           なし
            出力:           4つの制御端子のステータス
            内容:           4つの制御端子からステータスを読み取ります。
                            (ハイでアクティブ)
                            SLCTIN(3), INT(2), AUTOFDXT(1), STROBE(0)

### Ａ／Ｄコンバーター

    int OSGetAD(int channel);
            入力:           (channel)使用するA/Dコンバーターのチャンネル番号
                                      範囲: 0〜15
            出力:           (return code) 10ビットの測定値
            内容:           指定したA/Dコンバーターのチャンネル10ビットの測定値
                            を読み取ります。32ビットの値の下位ビットにデータが
                            入ります。

    int OSOffAD(int mode);
            入力:           (mode) 0 = 完全パワーダウン
                                   1 = 高速パワーダウン
            出力:           なし
            内容:           ２つのA/Dコンバーターをパワーダウンします(省エネ
                            ルギー)。OSGetAD関数を呼び出すによってA/Dコンバーター
                            を再び使えるようになります。

### 無線通信

"EyeNet" は任意の数のEyeBotとパソコンで構成されるネットワークです。 一つのネットマスターは自律的に協調し、新しいEyeBotは"wildcard"メッセ ージによって自動的にネットワークに登録されます。EyeBotの電源が切れる とネットワークから削除されます。このネットワークはRS232インターフェー スを使用し、ケーブルあるいは無線接続によって利用することができます。

通信は8ビットで行われ、すべてのパケットは転送エラーを検出するため にチェックサムを加えて送信されます。通信は信頼性が高くなく、エラーが 生じても再転送されませんし、パケット転送の保障もされていません。

    int RADIOInit(void);
            入力:           なし
            出力:           (return code) 0 = OK
            内容:           無線通信モジュールを初期化し利用を開始します。

    int RADIOTerm(void);
            入力:           なし
            出力:           (return code) 0 = OK
            内容:           ネットワーク操作を終了します。

    int RADIOSend(BYTE id, int byteCount, BYTE* buffer);
            入力:           (id)        メッセージ送り先のEyeBotのID番号
                            (byteCount) メッセージの長さ
                            (buffer)    メッセージの内容
            出力:           (return code) 0 = OK
                                          1 = 送信バッファーが満杯または
                                              メッセージが長すぎ
            内容:           他のEyeBotにメッセージを送信します。
                            送信にはバッファーを用い、バックグランドでメッ
                            セージが送信されている間も送信プロセスは継続する
                            ことができます。メッセージの長さはMSGMAXLEN以下で
                            でないといけません。メッセージはBROADCASTという特別
                            IDを送信することでブロードキャストされます。

    int RADIOCheck(void);
            入力:           なし
            出力:           バッファー中のユーザーメッセージの数
            内容:           バッファーに入っているメッセージの数を返します。
                            もしブロックされないようにするには、この関数を
                            受信の前に呼び出すようにします。。

    int RADIORecv(BYTE* id, int* bytesReceived, BYTE* buffer);
            入力:           なし
            出力:           (id) メッセージ源のEyeBotのID番号
                            (bytesReceived) メッセージの長さ
                            (buffer)        メッセージ内容
            内容:           バッファーに入っている次のメッセージを返します。
                            メッセージは受信した順番に読み出されます。もし
                            次のメッセージが入力されるまで受信するメッセージ
                            がないときは、このプロセスの呼び出しをブロックし
                            ます。使用するバッファーの容量はMSGMAXLENバイト
                            のデータを入れる大きさが必要です。

    Data Types:
            struct RadioIOParameters {
              int interface;      /* SERIAL1, SERIAL2, SERIAL3 */
              int speed;          /* SER4800,SER9600,SER19200,SER38400,SER57600,SER115200 */
              int id;             /* ロボットのid */
              int remoteOn;       /* 遠隔操作が有効なときはゼロ以外 */
              int imageTransfer;  /* もし遠隔操作が有効なら: 0 オフ, 2 フル, 1 容量縮小 */
              int debug;          /* 0 オフ, 1〜100 デバッグ実行レベル */
            };

            struct RadioStatus {
              BYTE master;        /* EyeBotのID */
              BOOL active[MAXEYE];/* 現在有効なEyeBot */
            };

    void RADIOGetIoctl(RadioIOParameters* radioParams);
            入力:           なし
            出力:           (radioParams) 現在の無線パラメーターの設定値
            内容:           現在の無線パラメーターの設定値を読み出します。

    void RADIOSetIoctl(RadioIOParameters* radioParams);
            入力:           (radioParams) 新しい無線パラメーターの設定値
            出力:           なし
            内容:           無線パラメーターの設定値を変更します。これは
                            RADIOInit()関数が呼び出される前に実行する必要
                            があります。

    int RADIOGetStatus(RadioStatus *status);
            入力:           なし
            出力:           (status) 現在の無線通信のステータス
            内容:           無線通信ユニットからの現在のステータス情報を
                            返します。

### コンパス

これらの関数はデジタルコンパスに対してインターフェースを提供します。

#### HDT設定の例

    compass_type compass = {0,13,(void*)OutBase, 5,(void*)OutBase, 6, (BYTE*)InBase, 5};

    HDT_entry_type HDT[] =
    { ...
      {COMPASS,COMPASS,"COMPAS",(void *)&compass},
      ...
    };

#### 関数

    int COMPASSInit(DeviceSemantics semantics);
            入力:           使用するコンパスのID (hdt.hを参照)
            出力:           (return code) 0 = OK
                                          1 = エラー
            内容:           デジタルコンパス装置の初期化をします。

    int COMPASSStart(BOOL cycle);
            入力:           (cycle) 1 for 繰り返し測定モード
                                    0 for 単一測定モード
            出力:           (return code) 1 = モジュールは既に実行中
                                          0 = OK
            内容:           実際の測定データを示します。cycleパラメータはコンパス
    　　　　　　　　　　　　モジュールの操作モードを指定します。
                            繰り返し測定モード(1)では, 一時停止するいことなく
                            できるだけ速くデータを返します。単一測定モード(0)では
                            １回測定を行い、モジュールをスリープモードに戻します。

    int COMPASSCheck();
            入力:           なし
            出力:           (return code) 1 = 結果の出力準備完了
                                          0 = 結果の出力準備未完了y
            内容:           もし１回測定の場合にこの関数は結果の出力準備が
                            できているかどうかを調べます。もし繰り返し測定
                            モードの場合には'使用中'が常に表示されるため、
                            この関数は使用されません。通常、ユーザーは結果
                            を待つためにループを使います。:
                              int heading;
                              COMPASSStart(FALSE);
                              while(!COMPASSCheck());  //In single tasking! Otherwise yield to other tasks
                              heading = COMPASSGet();

    int COMPASSStop();
            入力:           なし
            出力:           (return code) 0 = OK
                                          1 = エラー
            内容:           初期化された繰り返し測定を停止するために、現在実行
                            している測定が終わるのを待ち、モジュールを停止します。
                            そのため、この関数は少なくとも100m秒後にリターンするか
                            EyeBotにコンパスが接続されていない場合には無効にします。

    int COMPASSRelease();
            入力:           なし
            出力:           (return code) 0 = OK
                                          1 = エラー
            内容:           ドライバーをシャットダウンし、実行している測定を直接
                            中止します。

    int COMPASSGet();
            入力:           なし
            出力:           (return code) コンパスの方位データ: [0〜359]
                                          -1 = 方位データはまだ未算出
                                               (初期化後にウエイト)
            内容:           実際のコンパスの方位データを示します。

    int COMPASSCalibrate(int mode);
            入力:           (mode) 0 コンパスモジュール較正データをリセット
                                      (約0.8s必要)
                                   1 通常の較正を実施
            出力:           (return code) 0 = OK
                                          1 = エラー
            内容:           この関数には２つの機能があります。mode=0でコンパス
                            モジュールの較正データをリセットします。mode=1で通常
                            の較正を実施します。関数を２度呼び出す必要があります
                            (最初はある方向に、２度目は180°方向を変えます)。
                            通常、下記のように実施します。：
                              COMPASSCalibrate(1);
                              VWDriveTurn(VWHandle handle, M_PI, speed);  // turn EyeBot 180deg in place
                              COMPASSCalibrate(1);

### TV用赤外線リモコン

これらの関数を使うとTV用リモコンからEyeBotにコマンドを送ることができるようになります。

#### Include

    #include "irtv.h"  /* only required for HDT files */
    #include "IRnokia.h"

#### HDT設定の例

    /* infraread remote control on Servo S10 (TPU11)*/
    irtv_type irtv = {1, 11, TPU_HIGH_PRIO, REMOTE_ON, SPACE_CODE, 15,
    0x0000, 0x03FF, DEFAULT_MODE, 1, -1, RC_RED, RC_GREEN, RC_YELLOW,
    RC_BLUE};

    HDT_entry_type HDT[] =
    { ...
      {IRTV,IRTV,"IRTV",(void *)&irtv},
      ...
    };

#### 関数

    int IRTVInitHDT(DeviceSemantics semantics);
            入力:           (semantics) 使用するIRTVの型番 (hdt.hを参照)
            出力:           (return code) 0 = ok
                                          1 = 無効な型番またはモード
                                               (HDTの中のIRTV登録)
                                          2 = 不正または不明な"IRTV" HDT登録
            内容:           IRTVInit()関数を呼び出し関係するHDT登録情報を使
                            って赤外線リモコンデコーダーを初期化します。
                            この関数を使うとHDTにパラメーターが定義されている
                            ためにアプリケーションは使用するリモコンに依存しな
                            くなります。

    int IRTVInit(int type, int length, int tog_mask, int inv_mask, int mode, int bufsize, int delay);
            入力:           (type)    使用するコード形式
                                       有効な設定値:
                                       SPACE_CODE, PULSE_CODE, MANCHESTER_CODE, RAW_CODE
                            (length)   コード長 (ビットの数)
                            (tog_mask) "toggle bits"で選択するビットマスク
                                       (同じキーが繰り返し押されるときに変化するビット)
                            (inv_mask) 反転するビットを選択するビットマスク
                                       (交互性のあるコードを使って遠隔操作するため)
                            (mode)     操作モード
                                       有効な設定値: DEFAULT_MODE, SLOPPY_MODE, REPCODE_MODE
                            (bufsize)  内部コードバッファーの大きさ
                            有効な数: 1〜4
                            (delay)    反復キー操作のディレイ
                                       >0: 1/100秒の数 (20より大きくする必要がある)
                                       -1: 反復なし
            出力:           (return code) 0 = ok
                                          1 = 無効な形式またはモード
                                          2 = 不正または不明な"IRTV" HDT登録
            内容:           赤外線リモコンデコーダーを初期化します。
                            "type"、"length"、"tog_mask"、"inv_mask"、"mode"
                             パラメーターの正しい値を見つけ出すためには赤外線
                             リモコン解析プログラム(IRCA)を使用します。
                            SLOPPY_MODEはDEFAULT_MODEの代わりに使用することが
                            できます。デフォルトモードでは、コードが有効になる
                            前に少なくとも連続した２つの同一コード列が受信され
                            なければなりません。簡略モードを使用する場合には、
                            エラーチェックは実施されず、直ちに有効になります。
                            この関数はキーを押す時間の反応の遅れを減少させます。
                            特別な反復コードによってリモコンを使うにはREPCODE_MODE
                            を使用しなければなりません(解析プログラムで指定される
                            ように)。

                           典型的なパラメーター| ノキア (VCN 620)         | RC5 (フィリップス)
                            -------------------+--------------------------+----------------
                            type               | SPACE_CODE               | MANCHESTER_CODE
                            length             | 15                       | 14
                            tog_mask           | 0                        | 0x800
                            inv_mask           | 0x3FF                    | 0
                            mode               | DEFAULT_MODE/SLOPPY_MODE | DEFAULT_MODE/SLOPPY_MODE

                            RAW_CODEの設定形式はコード解析でだけ使用されます。
                            RAW_CODEを指定するならば、他のパラメーターをすべて
                            0に設定する必要があります。生のコードはIRTVGetRaw関数
                            とIRTVDecodeRawを使って処理する必要があります。

    void IRTVTerm(void);
            入力:           なし
            出力:           なし
            内容:           リモコンデコーダーを終了し、使用しているTPUチャンネルを
                            開放します。

    int IRTVPressed(void);
            入力:           なし
            出力:           (return code) 現在押されているリモートキーのコード
                                          0 = キーは押されていません
            内容:           現在のリモートキーのコードを直接読み取ります。
                            コードバッファーは操作しません。ウエイトしません。

    int IRTVRead(void);
            入力:           なし
            出力:           (return code) バッファーの次のコード
                                          0 = キーは押されていません
            内容:           コードバッファーから次のキーコード読み取りさ削除します。
                            ウエイトしません。

    int IRTVGet(void);
            入力:           なし
            出力:           (return code) バッファーの次のコード (!=0)
            内容:           コードバッファーから次のキーコードを読み取り削除します。
                            もしバッファーが空の時、この関数は次のキーが押されるまで
                            ウエイトします。

    void IRTVFlush(void);
            入力:           なし
            出力:           なし
            内容:           コードバッファーを空にします。

    void IRTVGetRaw(int bits[2], int *count, int *duration, int *id, int *clock);
            入力:           なし
            出力:           (bits)     生のコードの内容
                                       bits[0]のビット番号0はコード列の１番目のパルスを示します。
                                       bits[1]のビット番号0はコード列の１番目のスペースを示します。
                                       bits[0]のビット番号1はコード列の２番目のパルスを示します。
                                       bits[1]のビット番号1はコード列の２番目のスペースを示します。
                                       ...
                                       0が設定されたビットは短い信号を意味し、1が
                                       設定されたビットは長い信号を意味します。
                            (count)    受信した信号の数 (= パルス数 + スペース数)
                            (duration) コード列の論理的持続時間
                                       持続時間 = (短い信号の数) + 2*(長い信号の数)
                            (id)       現在のコードのID (1ずつ増加)
                            (clock)    コードを受信したときの時間
            内容:           最新の生の受信データに関する情報を返します。
                            RAW_CODEが設定されているときのみ機能します。

    int IRTVDecodeRaw(const int bits[2], int count, int type);
            入力:           (bits)  デコードするための生のコード(IRTVGetRawを参照)
                            (count) 生のコード中の信号の数 (= パルス + スペース)
                            (type)  デコード方法
                                    有効な設定値: SPACE_CODE, PULSE_CODE, MANCHESTER_CODE
            出力:           (return code) デコードされた値 (不正なManchesterコードの場合は0)
            内容:           指定した方法で生データをデコードします。

Thomas Bräunl, Klaus Schmitt, Thomas Lampart, Petter Reinholdtsen, Michael Kapp, 1998-2003