libevdev를 사용하여 절대 이벤트(EV_ABS)를 보내는 방법에 대한 몇 가지 예를 온라인에서 찾았습니다.
장치를 만들고 일부 키 입력을 보낼 수 있지만 절대 이벤트에는 행운이 없습니다.
장치가 표시되지만 sudo libinput list-devices
이벤트를 기록하려고 하면 sudo evemu-record
아무 것도 표시되지 않습니다.
이것은 내 테스트 코드입니다.
#include <iostream>
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <linux/input.h>
#include <linux/uinput.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <libevdev-1.0/libevdev/libevdev-uinput.h>
#include <unistd.h>
int main() {
int err;
struct libevdev *dev;
struct libevdev_uinput *uidev;
struct input_absinfo absinfo{
.value = 0,
.minimum = 0,
.maximum = 12372,
.fuzz = 0,
.flat = 0,
.resolution = 40
};
dev = libevdev_new();
libevdev_set_name(dev, "eye tracker pointer");
libevdev_enable_event_type(dev, EV_ABS);
libevdev_enable_event_code(dev, EV_ABS, ABS_X, &absinfo);
libevdev_enable_event_code(dev, EV_ABS, ABS_Y, &absinfo);
err = libevdev_uinput_create_from_device(dev, LIBEVDEV_UINPUT_OPEN_MANAGED, &uidev);
if (err != 0) return err;
usleep(10000000UL);//s
libevdev_uinput_write_event(uidev, EV_ABS, ABS_X, 100);
libevdev_uinput_write_event(uidev, EV_ABS, ABS_Y, 100);
libevdev_uinput_write_event(uidev, EV_ABS, SYN_REPORT, 0);
libevdev_uinput_write_event(uidev, EV_ABS, ABS_X, 200);
libevdev_uinput_write_event(uidev, EV_ABS, ABS_Y, 200);
libevdev_uinput_write_event(uidev, EV_ABS, SYN_REPORT, 0);
usleep(2000000UL);
libevdev_uinput_destroy(uidev);
return 0;
어쩌면 input_absinfo를 초기화할 때 뭔가 잘못한 것일까요?
저는 페도라 36을 사용하고 있습니다
답변1
오류는 동기화(EV_SYN)를 올바른 방식으로 호출하지 않았기 때문에 발생합니다. 깨닫는 데 몇 시간이 걸렸습니다.
코드는 다음과 같아야 합니다.
libevdev_uinput_write_event(uidev, EV_ABS, ABS_X, 100);
libevdev_uinput_write_event(uidev, EV_ABS, ABS_Y, 100);
libevdev_uinput_write_event(uidev, EV_SYN, SYN_REPORT, 0);
libevdev_uinput_write_event(uidev, EV_ABS, ABS_X, 200);
libevdev_uinput_write_event(uidev, EV_ABS, ABS_Y, 200);
libevdev_uinput_write_event(uidev, EV_SYN, SYN_REPORT, 0);