Armadilloフォーラム

gpio-keysのスイッチ状態の確認方法について

salt_009

2023年10月17日 8時55分

チャタリングに対処するためにgpio-keysを用いて、
スイッチの入力検知するプログラムを作成しています。

スイッチの一つを起動時にONになっているか
OFFになっているのかを確認したいのですが、
ON/OFFの変化を待たずに現在のスイッチの状態を
確認する方法はございますか?

コメント

at_dominique.m…

2023年10月17日 9時13分

salt_009さん、

お世話になっています、
マルティネです。

> スイッチの一つを起動時にONになっているか
> OFFになっているのかを確認したいのですが、
> ON/OFFの変化を待たずに現在のスイッチの状態を
> 確認する方法はございますか?

EVIOCGKEY の ioctl で確認すればできます。

ご使用のアプリケーション言語が分かりませんので、C 言語のコードになりますが、Armadillo Base OS で用意している buttond の場合はこういうふうに確認しています。

https://github.com/atmark-techno/buttond/blob/main/input.c#L57

        unsigned char key_states[KEY_MAX/8 + 1] = { 0 };
        int max;
        max = ioctl(fd, EVIOCGKEY(sizeof(key_states)), key_states);
        xassert(max >= 0, "EVIOCGKEY failed: %m");
        max = max * 8;
 
        for (int i = 0; i < state->key_count; i++) {
                struct key *key = &state->keys[i];
                if (key->code > max)
                        continue;
                if (is_bit_set(key_states, key->code)) {
                        if (debug) {
                                printf("key %s (%d) was up on open\n",
                                        keyname_by_code(key->code), key->code);
                        }
                        arm_key_press(key, true);
                }
        }

python 等、他の言語の場合は evdev ライブラリを使って確認も可能なはずです。

よろしくお願いします。