[Armadillo:06491] Re: Armadillo-420のSW1について。
Takenoshita Koyo
email@hidden
2011年 1月 7日 (金) 16:49:18 JST
竹之下です。
> 希望としては、SW1の状態表示と、他の処理を行いたいのですが、
> どのようにすればいいのか教えてください。
mizoが指摘してくれているように、デバイスファイルをO_NONBLOCKでオープンして、
read()でブロックさせないという方法もあるのですが、
別の方法として、ブロックされないときだけread()するやり方もあります。
イメージとしては、次のようなコードになります。
==== 擬似コードここから ====
int fd;
struct input_event event;
fd = open(DEV_NAME_SW1, O_RDONLY); /* O_NONBLOCKはつけない */
while(1) {
if (ブロックせずにread()可能) {
read(fd, &event);
if (eventがSW1のもの) {
SW1の状態表示();
}
} else {
他の処理();
}
}
/* ここは実行されない */
close(fd);
==== 擬似コードここまで ====
「ブロックせずにread()可能」かどうかを調べるには、select()システムコールを使います。
簡単なサンプルコードを添付しますので、よろしければ参考にしてください。
なお、select()の詳しい使い方は、「man 3 select」コマンドで参照できます。
TFC 小林 さんは書きました:
> お世話になります。小林です。
> 引き続き、Armadillo-420のSW1について教えてください。
>
> 下記、プログラムを作成したのですが、ボタンを押してもイベントが発生しないの
> か、
> 「No Event」と、「Value = 00」が1秒ごとずっと表示され続けます。
>
> Open時に、「|O_NONBLOCK」を指定しないと、
> Readコマンドで止まってしまうのか、ボタンを押すたびに、
> 「On Event」と、「Value = 01」が表示されます。
>
> 希望としては、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 mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
>
--
Koyo Takenoshita
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: swtest.c
型: text/x-csrc
サイズ: 1836 バイト
説明: 無し
URL: <http://lists.atmark-techno.com/pipermail/armadillo/attachments/20110107/ad029f9a/attachment.c>
armadillo メーリングリストの案内