[Armadillo:06489] Re: Armadillo-420のSW1について。

mizo email@hidden
2011年 1月 7日 (金) 15:39:59 JST


溝渕です。

TFC 小林 wrote:
> お世話になります。小林です。
> 引き続き、Armadillo-420のSW1について教えてください。
> 
> 下記、プログラムを作成したのですが、ボタンを押してもイベントが発生しないの
> か、
> 「No Event」と、「Value = 00」が1秒ごとずっと表示され続けます。

このプログラムだとそのように動くのが正しい動作だと思います。ちなみに、
「XXXのような動作をさせたいが、YYYのようになってしまう。」など期待する動
作も書いてもらえると回答しやすいです。

printf("Value = %02x\n", data);
を通るのを、イベント発生後のみにしたい場合は、
printf("No Event\n");
の後に
continue;
すると良いと思います。

data == 1
にならないのは、close()しているからですね。open()/close()をwhileの外に出
せば、「Value = 01」が表示されると思います。

> Open時に、「|O_NONBLOCK」を指定しないと、
> Readコマンドで止まってしまうのか、ボタンを押すたびに、
> 「On Event」と、「Value = 01」が表示されます。

O_NONBLOCKを指定してopen()したファイルに対する操作は、ブロックされませ
ん。O_NONBLOCKを指定しない場合、何らかのイベントが発生するまでブロックし
ます。

きっと、タクトスイッチを押した状態でプログラムを起動し、タクトスイッチを
離した場合は、「On Event」と、「Value = 00」が表示されると思います。

以上です。

> 希望としては、SW1の状態表示と、他の処理を行いたいのですが、
> どのようにすればいいのか教えてください。
> 
> #define DEV_NAME_PSW1 "/dev/input/event0"
> 
> int fd,ret;
> char val;
> int data;
> struct input_event event;
> 
> while(1){
> 
>   data = 0;
> 
>   fd = open(DEV_NAME_PSW1, O_RDONLY | O_NONBLOCK);
>   ret = read(fd, &event, sizeof(event));
>   if (ret != sizeof(event)) {
>     printf("No Event\n");
>   }else{
>     printf("On Event\n");
>   }
> 
>   if ((event.type == EV_KEY) && (event.code == KEY_ENTER) && (event.value !=
> 0)){
>     data = 1;
>   }
> 
>   close(fd);
> 
>   // シリアル受信など、別処理を行う。
>   printf("Value = %02x\n", data);
>   sleep(1);
> 
> }




armadillo メーリングリストの案内