キーボードの作り方(3)

2004/12/05 (最終更新:2005/08/28 15:27)

◎ 電源 OFF を識別する方法

キーボードの作り方(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;
}
この例では最初の一回は初期化のためのダミー呼び出しとなります。 Millisecond で取得していますが、実際は SystemTime の精度は秒単位のようです。

◎ 目的達成?

とりあえず キーボードの作り方(1) の最初で書きました「Jornada720 を PocketPC の外部キーボードにしてみる」 目的は達成しました。 電源 ON のあと、接続とか面倒な操作無しにそのままキーが打てます。 しばらくこれで使ってみようと思います。

iPAQ h3630 (PocketPC 2002) と Jornada720 が赤外線接続で 外部キーボードになっている様子。液晶部分が少々じゃまです。

位置取りを考えなくてすむよう 無線 LAN 同士というのもありかもしれません。 (機材が無いので試せないのですが)

[戻る]
[メニューに戻る] [ZAURUS総合] [Direct3D] [Ko-Window] [Win32] [WinCE] [携帯電話] [その他]
フルパワー全開 Hyperでんち

Hiroyuki Ogasawara <ho>