at_shinya.matsumoto
2025年10月6日 7時20分
Armadillo Base OSでC言語でキーイベントを検出する方法を紹介します。
実施方法
VScode(ABOSDE)の使用方法は製品マニュアルを基に進めて下さい。
まず下記ブログでキーイベントコードを確認しておきます。
Armadillo Base OS:キーイベント(key event)を確認する方法
次に、ABOSDEでC言語プロジェクトを作成し、ソースファイルを下記のように修正します。
ここではA9Eを例としている為、キーイベントコードは148としています。
また、以下はキーイベント発生時にコンテナを終了する様になっていますので適宜処理を追加して下さい。
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <linux/input.h>
#include <sys/ioctl.h>
int main(void) {
setvbuf(stdout, NULL, _IONBF, 0); // ディスプレイ表示(主にデバッグ用)
setvbuf(stderr, NULL, _IONBF, 0); // ディスプレイ表示(主にデバッグ用)
const char *device = "/dev/input/by-path/platform-gpio-keys-event";
unsigned char key_bits[(KEY_MAX + 7) / 8];
int value, key = 148;
int fd = open(device, O_RDONLY);
if (fd < 0) {
perror("open");
return 1;
}
while(1){
if (ioctl(fd, EVIOCGKEY(sizeof(key_bits)), key_bits) < 0) {
perror("ioctl EVIOCGKEY");
close(fd);
return 1;
}
value = (key_bits[key / 8] >> (key % 8)) & 1;
if(value == 1) {
//ここに処理を追加
printf("SW1=ON\n");
break;
}
sleep(1); //この場合最大1秒間押し続けないと検出できない
}
close(fd);
return 0;
}
Makefileも下記のように書き換えます。
srcs := main.c
objdir := ../build/
main := $(objdir)main
objs := $(srcs:%.c=%.o)
deps := $(objs:.o=.d)
CFLAGS += -Wall -Wextra -MMD -MP
all: clean $(main)
$(main): $(objs)
$(CC) $(LDFLAGS) $(TARGET_ARCH) $^ -o $@
%.o:%.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) $< -o $@
.PHONY: clean
clean:
$(RM) $(objs) $(deps) $(main)
-include $(deps)
app.confに下記を追記し、コンテナにアクセス権限を与えます。(記載順序は不問)
add_devices /dev/input/by-path/platform-gpio-keys-event
最後にpackages_alpine.txtにパッケージを追加します。
キーイベント検出でlinux/input.hを使用する為、ビルド用コンテナ側にlinux-headersを追加します。
※以下はalpineコンテナで実行する例
# --- always use ---
#jansson
# --- use only for build ---
[build]
alpine-sdk
linux-headers
以上で、ビルド実行するとキーイベント発生時に処理を行うことができます。