Armadilloフォーラム

ユーザースイッチのON/OFF状態取得

kuriha27

2016年7月21日 16時51分

栗原と申します。
いつもお世話になっております。

Armadillo-IoT-G2の側面に搭載されているユーザースイッチのON/OFFを、
単純に1か0の戻り値として取得する方法をご教授願えませんでしょうか。

マニュアルに記載されているevtestを実行して、スイッチのON/OFFの状態を
コンソールに表示することはできたのですが、スイッチのON/OFFの状態を
デバイスファイルなどから取得する方法が分かりませんでした。

以上、よろしくお願い致します。

コメント

y.nakamura

2016年7月21日 22時44分

中村です。

> Armadillo-IoT-G2の側面に搭載されているユーザースイッチのON/OFFを、
> 単純に1か0の戻り値として取得する方法をご教授願えませんでしょうか。

http://baruch.siach.name/blog/posts/linux_input_keys_status/
これを参考に書いて動かしてみました。
ほとんどそのままです。

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdint.h>
#include <linux/input.h>
 
char *devices[] = {
#if 1
    "/dev/input/by-path/platform-gpio-keys-event",
    "/dev/input/by-path/platform-gpio-keys-polled-event",
#else
    "/dev/input/event0",
    "/dev/input/event1",
#endif
};
 
int show_key_status(const char *device)
{
    printf("%s\n", device);
 
    int fd = open(device, O_RDONLY);
    if (fd < 0) {
        perror("open");
        return 0;
    }
 
    uint8_t keys[16];
 
    if (ioctl(fd, EVIOCGKEY(sizeof keys), &keys) < 0) {
        perror("ioctl");
        close(fd);
        return 0;
    }
 
    close(fd);
 
    int count = 0;
 
    for (int i = 0; i < sizeof keys; i++) {
        for (int j = 0; j < 8; j++) {
            if (keys[i] & (1 << j)) {
                count++;
                printf ("  key code %d\n", (i*8) + j);
            }
        }
    }
    if (count == 0) {
        printf("  no key\n");
    }
 
    return 1;
}
 
int main(int argc, char **argv)
{
    for (int i = 0; i < sizeof devices / sizeof devices[0]; i++) {
        if (!show_key_status(devices[i])) {
            return 1;
        }
    }
 
    return 0;
}

実行すると次のようになります。

SWを押していないとき:
/dev/input/by-path/platform-gpio-keys-event
  no key
/dev/input/by-path/platform-gpio-keys-polled-event
  no key
 
SW1を押しているとき:
/dev/input/by-path/platform-gpio-keys-event
  key code 2
/dev/input/by-path/platform-gpio-keys-polled-event
  no key
 
SW1とSW2を同時に押しているとき:
/dev/input/by-path/platform-gpio-keys-event
  key code 2
/dev/input/by-path/platform-gpio-keys-polled-event
  key code 3
 
SW2とSW3を同時に押しているとき:
/dev/input/by-path/platform-gpio-keys-event
  no key
/dev/input/by-path/platform-gpio-keys-polled-event
  key code 3
  key code 4

--
なかむら

kuriha27

2016年7月22日 11時02分

いつもお世話になっております。
栗原です。

上記内容にて、ユーザスイッチのON/OFFを取得することが
確認できました。

ありがとうございました。