キーボードの作り方(2) の最後に書いたように、 赤外線ポートを使って通信していると電源OFF で 通信できなくなってしまいます。 この状態をプログラム中から識別できないために、 赤外線接続の場合は コネクションレスでどこでも気軽に使えるキーボードとして 少々問題がありました。
そこであれこれ考えまして、電源OFF 状態を識別する方法を思いつきました。 実装してみたらうまくいったので NetKeySip v1.20 / ppckeyClient v1.20 を公開します。 使用中に電源を切っても、再び電源を入れればそのまま継続して使えます。
考えた方法は非常に単純で、任意のタイミングで GetSystemTime() と GetTickCount() を取得し それぞれ前回の値との差分を取ります。 この差分が両者で一定以上ずれたとき電源が OFF になっていたとみなします。
SystemTime (内蔵時計) は電源が OFF でも常に進んでいますが、 GetTickCount() は電源が ON の間しか進みません。 よって電源を切っている時間が長ければ長いほど差が開いていくというわけです。 しかもこの方法だと電源 OFF 方法や状態、OS バージョンなど環境に依存しない という利点があります。
今回この値を 2秒に設定したので、あまりに電源 OFF → 電源 ON の間隔が 短すぎると取りこぼす可能性があります。 通常の使い方では問題ないと思いますが、 このあたりは使ってみて要調整でしょうか。
実装例
int CheckPowerOFF()
{
static DWORD time_start= 0;
static DWORD tick_start= 0;
DWORD tick_msec= GetTickCount();
SYSTEMTIME systemtime;
GetSystemTime( &systemtime );
DWORD time_msec= 0
+systemtime.wHour *1000*60*60
+systemtime.wMinute*1000*60
+systemtime.wSecond*1000
+systemtime.wMilliseconds;
DWORD time_diff= time_msec - time_start;
DWORD tick_diff= tick_msec - tick_start;
DWORD diff= time_diff > tick_diff ?
time_diff - tick_diff : tick_diff- time_diff;
time_start= time_msec;
tick_start= tick_msec;
if( diff >= 2000 ){ // power off
return TRUE;
}
return FALSE;
} |
とりあえず キーボードの作り方(1) の最初で書きました「Jornada720 を PocketPC の外部キーボードにしてみる」 目的は達成しました。 電源 ON のあと、接続とか面倒な操作無しにそのままキーが打てます。 しばらくこれで使ってみようと思います。
iPAQ h3630 (PocketPC 2002) と Jornada720 が赤外線接続で
外部キーボードになっている様子。液晶部分が少々じゃまです。
位置取りを考えなくてすむよう 無線 LAN 同士というのもありかもしれません。 (機材が無いので試せないのですが)
| [メニューに戻る] | [ZAURUS総合] | [Direct3D] | [Ko-Window] | [Win32] | [WinCE] | [携帯電話] | [その他] |
| フルパワー全開 | Hyperでんち |