PHS経由でネットに接続できるEthernetアダプタのファームウェアをハック・後編 ―― 画像付きメールを利用した遠隔監視システムの製作事例
● SilentCを拡張してカメラを制御できるようにする
SilentCは,ユーザが自由に機能を拡張できるように考慮されています.リセット時にUserDriver.binというファイルが存在していれば,その内容をユーザ・ドライバ領域にプログラムします.こうしてインストールされたドライバは,SilentCと連携して動作します.この方法は,いろいろなセンサ・デバイスなどを接続してSilentCで利用する際にも便利です.
インストールされたユーザ・ドライバにアクセスするには,SilentCのUserDriver関数を利用します.書式は表2の通りです.
関 数 | int UserDriver(char vector, int arg); |
パラメータ | vector=ベクタ番号 arg=ドライバに渡す引き数 |
戻り値 | ユーザ・ドライバからリターンする際のDレジスタの値を返す |
サンプル | char *ptr=MemoryAlloc(128); // 128バイトのメモリを確保する UserDriver(0,ptr); // そのポインタを0xf400から始まるユーザ・ドライバに渡す PrNum(UserDriver(1,0)); // 0xf403から始まるユーザ・ドライバを呼び出し, //戻り値を表示する |
vectorは,ドライバの先頭から何番目のドライバを呼び出すかを指定します.ユーザ・ドライバを作成する際に先頭番地(0xf400)から3バイトずつJMP命令を並べておき,例えばvectorに0を指定すると,SilentCはJSR 0xf400を実行します.同じようにvectorに1を指定すると,JSR 0xf403を実行します.複数のドライバを作成してそれらへのジャンプ・テーブルを参照し,呼び出す仕組みです.
argにはユーザがドライバに渡したい値を指定します.例えば,MemoryAllocで確保した領域をSilentCでユーザ・ドライバに渡してその領域にデータをセットしてもらい,その結果をSilentCが利用するという使い方になります.戻り値はユーザ・ドライバから戻る際のDレジスタの値をそのまま返します.デバイスのタイムアウトなどの判定に利用できます.
http://www.silentsystem.jp/download.htmからJPEGカメラ用のドライバを入手してOS-1に一度インストールしておけば,その後は表3で説明する機能がSilentCから利用可能になります.これらの機能を利用して,SilentCでカメラ画像をメールに添付して返信する機能を実現します.
関 数 | char *UserDriver(0, char *buf); |
処理内容 | カメラ・ドライバを初期化する |
パラメータ | buf=カメラからのシリアル入力のためのバッファへのポインタを与える. バッファ・サイズは128バイト固定長.bufに0を与えると,カメラをクローズする(終了処理) |
戻り値 | 初期化に成功すると0を返す.bufに0を与えた場合は使用していたシリアル・バッファのポインタを返すので,必ずこのポインタでMemoryFreeを呼び出してバッファを解放すること |
関 数 | void UserDriver(1, char res); |
処理内容 | カメラのシャッタを切る |
パラメータ | res=画像の解像度を指定する 0= 80× 64 1=160×128 2=320×240(QVGA) 3=640×480(VGA) |
戻り値 | なし |
関 数 | int UserDriver(2, char *jpegbuf); |
処理内容 | JPEGデータを受け取るバッファをセットする |
パラメータ | jpegbuf=JPEGデータを受け取るためのバッファへのポインタを与える.バッファ・サイズは,BASE64モードの場合は90バイト,バイナリ・モードの場合は60バイト確保する必要あり.0を与えると,設定されたJPEGデータ・バッファのポインタを返す |
戻り値 | 成功すると0を返す.jpegbufに0を与えた場合は使用していたJPEGバッファのポインタを返すので,必ずこのポインタでMemoryFreeを呼び出してJPEGバッファを解放すること |
関 数 | int UserDriver(2, 1); |
処理内容 | JPEGデータの受信を開始する |
パラメータ | なし |
戻り値 | JPEGデータの総バイト数を返す |
関 数 | int UserDriver(2, 2); |
処理内容 | 受信したJPEGデータをバッファにセットする(バイナリ・モード). 60バイトずつのパケット単位でセットされる |
パラメータ | なし |
戻り値 | セットされたバイト数を返す.通常は1パケット・サイズである60が返る. 60以下の場合は,最後のデータ・パケットを意味する. 0の場合は,直前のパケットが最終パケットだったということを意味する |
関 数 | int UserDriver(2, 3); |
処理内容 | 受信したJPEGデータをBASE64エンコードしてバッファにセットする(BASE64モード). 80バイト+CR+LF単位でセットされる.メールで添付ファイルを送る際に利用する |
パラメータ | なし |
戻り値 | エンコードされたバイト数を返す.BASE64文字列の長さではないことに注意. 通常は1パケット・サイズである60が返る.60以下の場合は,最後のデータ・パケットを意味する.0の場合は,直前のパケットが最終パケットだったということを意味する |
関 数 | int UserDriver(2, 4); |
処理内容 | JPEGデータの受信を終了する |
パラメータ | なし |
戻り値 | 必ず0を返す.パケット受信終了後に必ず呼び出すこと |
関 数 | void UserDriver(3,0); |
処理内容 | シリアル・ブリッジ・モードへ移行する(カメラのシリアルとOSIO-1のシリアルをブリッジする).スピードは57,600bpsとなる |
パラメータ | なし |
戻り値 | なし |