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

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

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

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

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

リターンコード

特別な説明がない限り、すべての関数は実行に成功すると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バイトの数字)
        出力:           なし
        内容:           現在のカーソル位置に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: 画面表示のときにカーソルが右下(最終行)に
                           行くと、1行スクロールし新しい行の初めにカーソルを
                           移動して表示します。
                        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に表示するメニュー
                        有効な設定値:
                          - 最大4つの文字列。現在のメニューを消去し新たに
                            表示されます。
                          - "" : 現在のメニューをそのまま表示します。
                          - " " : 現在のメニューを消去します。
        出力:           なし
        内容:           指定した登録内容でメニュー行を表示します。

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

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) 画素情報
                        有効な数:   画素が表示のときに1
                                     画素が非表示のときに0
        内容:           指定した位置の画素の状態を返します。

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 = エラー (カメラが未初期化)
        内容:           1画素3バイトRGBのフルカラー画像を読み込みます。
                        (例えば、82x62*3, 176x144*3, 320x240*3)
                        この大きさはカメラモジュールによります。

int CAMGetFrameBayer (BYTE *buf);
        注意:           この関数はEyeCamについてのみ使用できます。
        入力:           (buf) フルサイズの画像バッファーのポインター
                              (CAMGetで使用)
        出力:           (return code) 0 = 成功
                                     -1 = エラー (カメラが未初期化)
        内容:           1画素4バイトの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(スレッド制御ブロック)の
ポインターを示し、現在の実行されているスレッドは0で表すことができます。

セマフォ

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) 刻み値
        内容:           システム時間を示します。1秒は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を使って1文字送信します。

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


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

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) >0 : 現在FIFOで有効な文字数
                                      <0 : 0xffffff02 受信時ステータスエラー 
                                            (有効な文字がない)
                                           0xffffff0a 不正インターフェースエラー
        内容:           ある大きさのパッケージを読み出すときに使います。

int OSCheckOutRS232(int interface);
        入力:           (interface) シリアルインターフェース
                           有効な設定値: SERIAL1-3
        出力:           (return code) >0 : FIFOに入力されている文字数
                                      <0 : 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センサーの初期化を行います。
                        最大で8つの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
        内容:           指定したデコーダーの初期化をします(最大で8個まで)。

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ドライバーを初期化します。(1つだけ
                        初期化できます!) 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駆動コマンド中に少なくとも1つのモーターが
                             行き詰まり
        内容:           少なくとも一つのロボットのモーターが現在行き詰って
                        いるかどうかを確認します。

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

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

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)    出力を0にするための論理積用マスク
                        (inverse!)
                        (value)   出力を1にするための論理和用マスク
        出力:           指定したラッチの以前の出力状態
        内容:           指定した出力用ラッチの状態を変えて、出力状態を
                        維持します。
                         例: 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);
        入力:           なし
        出力:           5つのステータス端子のステータス
        内容:           5つのステータス端子のステータスを読み取ります。
                        (ハイでアクティブ)
                        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)

A/Dコンバーター

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

int OSOffAD(int mode);
        入力:           (mode) 0 = 完全パワーダウン
                               1 = 高速パワーダウン
        出力:           なし
        内容:           2つの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)では
                        1回測定を行い、モジュールをスリープモードに戻します。

int COMPASSCheck();
        入力:           なし
        出力:           (return code) 1 = 結果の出力準備完了
                                      0 = 結果の出力準備未完了y
        内容:           もし1回測定の場合にこの関数は結果の出力準備が
                        できているかどうかを調べます。もし繰り返し測定
                        モードの場合には'使用中'が常に表示されるため、
                        この関数は使用されません。通常、ユーザーは結果
                        を待つためにループを使います。:
                          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 = エラー
        内容:           この関数には2つの機能があります。mode=0でコンパス
                        モジュールの較正データをリセットします。mode=1で通常
                        の較正を実施します。関数を2度呼び出す必要があります
                        (最初はある方向に、2度目は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の代わりに使用することが
                        できます。デフォルトモードでは、コードが有効になる
                        前に少なくとも連続した2つの同一コード列が受信され
                        なければなりません。簡略モードを使用する場合には、
                        エラーチェックは実施されず、直ちに有効になります。
                        この関数はキーを押す時間の反応の遅れを減少させます。
                        特別な反復コードによってリモコンを使うには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はコード列の1番目のパルスを示します。
                                   bits[1]のビット番号0はコード列の1番目のスペースを示します。
                                   bits[0]のビット番号1はコード列の2番目のパルスを示します。
                                   bits[1]のビット番号1はコード列の2番目のスペースを示します。
                                   ...
                                   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