#include "eyebot.h"以下のライブラリーはROM内にありC言語プログラミングで使うことができ、"gcc68"など(librobi.aを使って)が呼び出されるときに自動的にリンクされます。
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ページ
を参照してください。
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 (左から右)
または任意のキー
出力: なし
内容: 特定のキーが押されるまでウエイトします。
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リストから割込み関数を削除します。
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 開始アドレスとプログラム名を呼出します。
**) この関数はユーザープログラムで使用してはいけません!!!!
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ビット)
内容: マイクの入力値を取得します。
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センサーで
測定した生値を示します。
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 = エラー、間違ったハンドル
内容: スタート地点を定義するために走行距離計をリセットします。
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)
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コンバーター
を再び使えるようになります。
通信は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) 現在の無線通信のステータス
内容: 無線通信ユニットからの現在のステータス情報を
返します。
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);
#include "irtv.h" /* only required for HDT files */ #include "IRnokia.h"
/* 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)
内容: 指定した方法で生データをデコードします。