gpt4 book ai didi

c - 在基于 linux 的 hmi 屏幕中使用 uinput 的触摸事件模拟不起作用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:03 25 4
gpt4 key购买 nike

下面是我试图从用户空间向我们的 hmi 发送触摸事件的代码。明确检查所有 ioctl 调用和写入是否成功,但未注入(inject)事件。供应商 ID 和产品 ID 设备名称输入不正确。不确定它是否与输出相关。 (事件注入(inject)的三种方式都已经一一尝试过了)。它需要供应商 ID 产品 ID 和设备名称,然后我们将从基于 Linux 的嵌入式系统中的何处获取这些数据。

#include <linux/input.h>
#include <linux/uinput.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>

void injectEvent(int, int, int, int);

int main()
{
struct uinput_user_dev dev;
int i;
int err;
int fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
if(fd < 0) {
//perror("Failed to open: /dev/uinput");
printf("Failed to open: /dev/uinput\n");
return fd;
}

err = ioctl(fd, UI_SET_EVBIT, EV_KEY);
if (err)
goto err;

err = ioctl(fd, UI_SET_EVBIT, EV_ABS);
if (err)
goto err;

err = ioctl(fd, UI_SET_KEYBIT, BTN_TOUCH);
if (err)
goto err;

err = ioctl(fd, UI_SET_ABSBIT, ABS_MT_SLOT);
if (err)
goto err;

memset(&dev, 0, sizeof(dev));
snprintf(dev.name, sizeof(dev.name), "Test device");
printf("devname = %s\n",dev.name);
dev.id.bustype = BUS_SPI;

/* 10 touch inputs */
dev.absmax[ABS_MT_SLOT] = 10;

dev.absmax[ABS_X] = 4096;
dev.absmin[ABS_X] = 0;

dev.absmax[ABS_Y] = 4096;
dev.absmin[ABS_Y] = 0;

dev.absmax[ABS_PRESSURE] = 0xff;
dev.absmin[ABS_PRESSURE] = 0;

dev.absmax[ABS_MT_TOUCH_MAJOR] = 0xff;
dev.absmin[ABS_MT_TOUCH_MAJOR] = 0;

dev.absmax[ABS_MT_POSITION_X] = 4096;
dev.absmin[ABS_MT_POSITION_X] = 0;

dev.absmax[ABS_MT_POSITION_Y] = 4096;
dev.absmin[ABS_MT_POSITION_Y] = 0;

dev.absmax[ABS_MT_PRESSURE] = 4096;
dev.absmin[ABS_MT_PRESSURE] = 0;

err = write(fd, &dev, sizeof(dev));
if (err < 0)
goto err;

err = ioctl(fd, UI_DEV_CREATE);
if (err < 0)
goto err;

/* Event should be injected here.... */

/********************First Method***********************/
#if 1
struct input_event ev[2];

memset(ev, 0, sizeof(ev));

ev[0].type = EV_ABS;
ev[0].code = ABS_X;
ev[0].value = 1001;
ev[1].type = EV_ABS;
ev[1].code = ABS_Y;
ev[1].value = 2002;

if(write(fd, &ev, sizeof(ev)) < 0)
printf("Error::event injection failed\n");

#endif

/********************Second Method***********************/
#if 0
injectEvent( fd, EV_ABS, ABS_MT_TRACKING_ID, 0 );
injectEvent( fd, EV_ABS, ABS_MT_POSITION_X, 1001 );
injectEvent( fd, EV_ABS, ABS_MT_POSITION_Y, 2002 );
injectEvent( fd, EV_ABS, ABS_MT_TOUCH_MAJOR, 111 );
injectEvent( fd, EV_ABS, ABS_MT_PRESSURE, 3003 );
injectEvent( fd, EV_SYN, SYN_MT_REPORT, 0 );
injectEvent( fd, EV_SYN, SYN_REPORT, 0 );
injectEvent( fd, EV_SYN, SYN_MT_REPORT, 0 );
injectEvent( fd, EV_SYN, SYN_REPORT, 0 );

void injectEvent(int fd_ev,int type, int code, int value)
{
printf("(%s)==>> (%d,%d,%d,%d)\n",__func__, fd_ev, type, code, value);

struct uinput_event event;
int len;

if (fd_ev <= fileno(stderr))
return;

memset(&event, 0, sizeof(event));
event.type = type;
event.code = code;
event.value = value;

len = write( fd_ev, &event, sizeof(event) );

printf("(%s) done:%d\n",__func__,len);
}
#endif

/********************Third Method***********************/
#if 0
struct uinput_event event;
for (int i=0; i<30; i++)
{
memset(&event, 0, sizeof(event));

event.type=EV_ABS;
event.code=ABS_X;
event.value=1005;

if(write(fd, &event, sizeof(event)) < 0)
printf("Error::event injection failed\n");

sleep (5);
}
#endif

sleep (180);
/* start cleanup ... */
err = ioctl(fd, UI_DEV_DESTROY);
if (err < 0)
goto err;

close(fd);
return 0;
err:
//perror("Failed to initialise");
printf("(%s) Failed to initialise\n",__func__);
close(fd);
return err;
}

最佳答案

我不知道这是否是你的解决方案,但是 ABS_X 和 ABS_Y 不能与 ABS_MT_POSITION_X 和 *_Y 一起设置,它们不能共存,你必须激活一个或另一个。您可以在 linux 中使用“xinput list-props + device number”进行检查。希望对您有所帮助 ;)

关于c - 在基于 linux 的 hmi 屏幕中使用 uinput 的触摸事件模拟不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34923548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com