7.LCDの使用
TOP
9.タスクについて

8.ボタンの操作

最初でも述べたようにbrickOSには純正ファームウェアに比べ最小限度の機能しかありません。 その反面、自由に制御できる部分も増えました。そのうちの1つがこのRCX上のボタンです。この章では、ボタン操作の利用方法について説明していきます。

1.ボタンのイベント

ボタンには二つの状態があります。それはボタンが押されているとき(ON)と、押されていないとき(OFF)です。今回はボタンがON⇒OFFとOFF⇒ONに移り変わったタイミングを検出することにしましょう。
次のプログラムを作成してください。ここでは作成ファイル名をbutton1.cとします。
作成したプログラムbutton1.c
#include<conio.h> // button function is included
#include<unistd.h>

int main(int argc, char **argv) {
	sleep(1);
	wait_event(&dkey_pressed,KEY_ANY); // wait for button pressed
	cputs("pres");
	wait_event(&dkey_released,KEY_ANY); // wait for button released
	cputs("rele");
	sleep(1);
	cls();
	return 0;
}
ボタンに関する関数は『dkey.h』に記述されています。ただし、『conio.h』内で『dkey.h』が読み込まれているので、インクルード文には『dkey.h』ではなく『conio.h』となっています。そのなかで、すでに用意されているウェイクアップ関数が二つあります。それが『dkey_pressed()』、『dkey_released()』です。名前からわかる通り、OFF⇒ON、ON⇒OFFに移り変わったときにウェイクアップします。この関数は引数としてボタンを指定する必要があります。今回は引数に『KEY_ANY』(すべてのボタン)として与えてありますが、その他に『KEY_ONOFF』『KEY_RUN』『KEY_VIEW』『KEY_PRGM』があります。どれがどのボタンを指しているかは名前から判ると思います。
 また、On-Offボタン、Runボタンについてはカーネルのほうが優先権を持っているようなので、上記のような単純なプログラム内で引数として指定しても、うまくいかないと思います。(マルチタスクプログラムを実行中にRunボタン、On-Offボタンが効かなくなる場合がありますが、そのようなとき、ユーザープログラム内にプログラムのストップするためにこれらのボタンを引数として指定することもあります。)

2.押されたボタンを検出する

ボタンが押されたときにウェイクアップすることはできました。では次に押されたボタンが何であるのかを判別することにしましょう。
次のプログラムを作成してください。ここでは作成ファイル名をbutton2.cとします。
作成したプログラムbutton2.c
#include<conio.h> // button function is included
#include<unistd.h>

int main(int argc, char **argv) {
	int key_data;
	while(1){
		key_data=getchar(); // wait for button pressed
		if(key_data==KEY_VIEW){
			cputs("view");
		}
		if(key_data==KEY_PRGM){
			cputs("prgm");
		}
	}
	return 0;
}

ここで使われている関数『getchar()』は普通のC言語で使われているものと良く似ています。これは何かボタンが押されるまで待ち、押されたボタンを返すという動作をします。ただし、返すのはchar型でなく、int型です。『dkey.h』に記述されていますが、さきほども出てきた『KEY_ONOFF』等のボタンを表す変数は数値として定義してあります。詳しくは『dkey.h』を見てください。このプログラムでは『getchar』によって返された値を比較して、どのボタンが押されたのかを検出しています。(On-Offボタン、Runボタンは判別できませんが)

3.ボタンのコンビネーション

ボタンは計4つありますから、もちろんボタンを組み合わせて押すことも可能です。ここでは組み合わされて押されたボタンを判別することにしましょう。
次のプログラムを作成してください。ここでは作成ファイル名をbutton3.cとします。
作成したプログラムbutton3.c
#include<conio.h> // button function is included
#include<unistd.h>

int main(int argc, char **argv) {
	do{
		cputs("wait");
		wait_event(&dkey_pressed,KEY_ANY); // wait for button pressed
	}while(dkey_multi!=KEY_VIEW+KEY_PRGM);
	cputs("ok");
	sleep(1);
	cls();
	return 0;
}
ウェイクアップ関数はbutton1.cのものと同様です。新しいところといえば、while文の中に『dkey_multi』という変数が出てきています。これは『dkey.h』内に記述されている変数で、2つ以上のボタンが組み合わせて押されたときにそれらの値を逐一格納しているものです。ここでは見てわかるようにViewボタンとPrgmボタンを組み合わせて押したときにdo-whileループを抜けるようになっています。また、一つのボタンが押されたときにその値を格納する変数『dkey』も用意されています。これらは押されたボタンに対応した値を格納する点では同じですが、ボタンの組み合わせが判別できるか、1つのボタンのみしか対応していないのかで異なります。正確に使い分けないと思うようにボタンを認識してくれません。(試しにこのプログラム内の『dkey_multi』を『dkey』に変更してみてくださいうまく動かなくなるはずです。)
 なお、さきほどbutton2.c内で用いた『getchar』関数ですが、これも一つのボタンにしか対応していないので2つ以上のボタンの組み合わせには反応しません。また、ボタンの組み合わせに対応した『getchar』のような関数は用意されていません。

4.まとめ

 この章ではボタンの制御方法について学びました。これにより、標準ファームウェアではできなかったボタンの使い方ができるはずです。これにより、またロボット創造の幅が広がるでしょう。
7.LCDの使用
TOP
9.タスクについて