Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在基于linux的hmi屏幕中使用uinput进行触摸事件模拟不起作用?_C_Linux_Embedded_Uinput - Fatal编程技术网

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

C 在基于linux的hmi屏幕中使用uinput进行触摸事件模拟不起作用?,c,linux,embedded,uinput,C,Linux,Embedded,Uinput,下面是我试图从用户空间将触摸事件发送到hmi的代码。所有ioctl调用和写入都被显式检查为成功,但未注入事件。未正确输入供应商id和产品id设备名称。不确定它是否与输出相关。(所有三种事件注入方法都已逐一试用)。It供应商id需要产品id和设备名称,然后在基于Linux的嵌入式系统中从何处获取这些数据 #include <linux/input.h> #include <linux/uinput.h> #include <unistd.h> #include

下面是我试图从用户空间将触摸事件发送到hmi的代码。所有ioctl调用和写入都被显式检查为成功,但未注入事件。未正确输入供应商id和产品id设备名称。不确定它是否与输出相关。(所有三种事件注入方法都已逐一试用)。It供应商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;
}
#包括
#包括
#包括
#包括
#包括
#包括
无效事件(int,int,int,int);
int main()
{
结构输入用户开发;
int i;
INTERR;
int fd=打开(“/dev/uinput”,O_WRONLY | O_NONBLOCK);
如果(fd<0){
//perror(“打开失败:/dev/uinput”);
printf(“打开失败:/dev/uinput\n”);
返回fd;
}
err=ioctl(fd、UI\U SET\U EVBIT、EV\U KEY);
如果(错误)
后悔莫及;
err=ioctl(fd、UI\U SET\U EVBIT、EV\U ABS);
如果(错误)
后悔莫及;
err=ioctl(fd、用户界面设置键位、BTN键位);
如果(错误)
后悔莫及;
err=ioctl(fd、UI\U SET\U ABSBIT、ABS\U MT\U插槽);
如果(错误)
后悔莫及;
memset(&dev,0,sizeof(dev));
snprintf(dev.name,sizeof(dev.name),“测试设备”);
printf(“devname=%s\n”,dev.name);
dev.id.bustype=BUS_SPI;
/*10触式输入*/
dev.absmax[ABS\u MT\u插槽]=10;
dev.absmax[ABS_X]=4096;
dev.absmin[ABS_X]=0;
dev.absmax[ABS_Y]=4096;
dev.absmin[ABS_Y]=0;
dev.absmax[ABS_压力]=0xff;
dev.absmin[ABS_压力]=0;
dev.absmax[ABS\u MT\u TOUCH\u MAJOR]=0xff;
dev.absmin[ABS\u MT\u TOUCH\u MAJOR]=0;
dev.absmax[ABS\u MT\u POSITION\u X]=4096;
dev.absmin[ABS\u MT\u POSITION\u X]=0;
dev.absmax[ABS\u MT\u POSITION\u Y]=4096;
dev.absmin[ABS\u MT\u POSITION\u Y]=0;
dev.absmax[ABS\u MT\u压力]=4096;
dev.absmin[ABS\u MT\u PRESSURE]=0;
err=write(fd,&dev,sizeof(dev));
如果(误差<0)
后悔莫及;
err=ioctl(fd,UI\u DEV\u CREATE);
如果(误差<0)
后悔莫及;
/*事件应该在这里被注入*/
/********************第一种方法***********************/
#如果1
结构输入事件ev[2];
memset(ev,0,sizeof(ev));
ev[0]。类型=ev_ABS;
ev[0]。代码=ABS\ux;
ev[0]。值=1001;
电动汽车[1]。类型=电动汽车防抱死制动系统;
ev[1]。代码=ABS_Y;
ev[1],价值=2002;
如果(写入(fd,&ev,sizeof(ev))<0)
printf(“错误::事件注入失败\n”);
#恩迪夫
/********************第二种方法***********************/
#如果0
注入事件(fd、EV\U ABS、ABS\U MT\U跟踪ID,0);
注入事件(fd、EV\U ABS、ABS\U MT\U位置,1001);
事件(fd、EV、ABS、ABS、MT、Y位置,2002年);
事件(fd、EV、ABS、ABS、MT、TOUCH、111);
注入事件(fd、EV\U ABS、ABS\U MT\U压力,3003);
注入事件(fd、EV\U SYN、SYN\U MT\U报告,0);
注入事件(fd、EV_SYN、SYN报告,0);
注入事件(fd、EV\U SYN、SYN\U MT\U报告,0);
注入事件(fd、EV_SYN、SYN报告,0);
无效事件(int fd_ev,int类型,int代码,int值)
{
printf((%s)==>>(%d,%d,%d,%d)\n“,\uu函数,fd\u ev,类型,代码,值);
结构输出事件;
内伦;

如果(fd_ev我不知道这是否是您的解决方案,但ABS_X和ABS_Y不能与ABS_mtu位置和*_X一起设置,它们不能共存,您必须激活其中一个。您可以在linux中使用“xinput list props+device number”来检查此问题。希望对您有所帮助;)

我不知道这是否是您的解决方案,但ABS\u X和ABS\u Y不能与ABS\u MT\u POSITION\u X和*\u Y一起设置,它们不能共存,您必须激活其中一个。您可以在linux中使用“xinput list props+device number”来检查这一点。希望对您有所帮助;)