uinput模拟一个ubuntu支持的触摸板设备

1 篇文章 0 订阅

#include "VirtualTpYfcf.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include "./uinput.h"
#include <unistd.h>
#include <string.h>
#include <errno.h>
//#define YFCF_ABS_VAL_MIN 0
//#define YFCF_ABS_VAL_MAX 65535
VirtualTpYfcf::VirtualTpYfcf(int32_t w,int32_t h)
{
   
    mFd = open("/dev/uinput",O_WRONLY | O_NONBLOCK);
    if(mFd == -1){
        LOGE(TAG,"err construct vtp:%s %d",strerror(errno),mFd);
    }
    struct uinput_user_dev uidev;
    memset(&uidev, 0, sizeof(struct uinput_user_dev));  
    snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "vTpYfcf");  
    uidev.id.bustype = BUS_USB;
    uidev.id.vendor  = 0x1;
    uidev.id.product = 0x1;
    uidev.id.version = 1;
    int fd = mFd;
    if(mFd == -1){
        goto err;
    }
    
    #if 0
    struct uinput_setup lSetup;
    lSetup = 
    {
        .id = {
            .bustype = BUS_VIRTUAL,
            .vendor = 0x123,
            .product = 0x456,
            .version = 0x789,
        },
        .name = {'v','T','p','Y','f','c','f'},
    };
    ioctl(mFd, UI_SET_EVBIT, EV_SYN);
    if(ioctl(mFd,UI_SET_EVBIT,EV_MSC) == -1){
        goto err;
    }
    if(ioctl(mFd,UI_SET_MSCBIT, MSC_TIMESTAMP) == -1)
        goto err;
    if(ioctl(mFd,UI_SET_EVBIT,EV_KEY) == -1){
        goto err;
    }
    if(ioctl(mFd,UI_SET_KEYBIT,BTN_TOUCH) == -1)
        goto err;
    if(ioctl(mFd,UI_SET_EVBIT,EV_ABS) == -1){
        goto err;
    }
    
    if(setup_abs(ABS_X,YFCF_ABS_VAL_MIN,max)!=0)
        goto err;
    if(setup_abs(ABS_Y,YFCF_ABS_VAL_MIN,min)!=0)
        goto err;
    if(setup_abs(ABS_MT_POSITION_X,YFCF_ABS_VAL_MIN,max)!=0)
        goto err;
    if(setup_abs(ABS_MT_POSITION_Y,YFCF_ABS_VAL_MIN,min)!=0)
        goto err;
    if(setup_abs(ABS_MT_TRACKING_ID,-1,5)!=0)
        goto err;
    
    if(ioctl(mFd,UI_DEV_SETUP,&lSetup) == -1 || ioctl(mFd,UI_SET_PHYS,"vTpYfcf") == -1){
        goto err;
    }
    #else
    
    ioctl(fd, UI_SET_EVBIT, EV_ABS);
    ioctl(fd, UI_SET_ABSBIT, ABS_X);
    ioctl(fd, UI_SET_ABSBIT, ABS_Y);
    ioctl(fd, UI_SET_ABSBIT, ABS_MT_SLOT);
    ioctl(fd, UI_SET_ABSBIT, ABS_MT_POSITION_X);
    ioctl(fd, UI_SET_ABSBIT, ABS_MT_POSITION_Y);
    ioctl(fd, UI_SET_ABSBIT, ABS_MT_TRACKING_ID);
    ioctl(fd, UI_SET_EVBIT, EV_KEY);
    ioctl(fd, UI_SET_KEYBIT, BTN_TOUCH);
    ioctl(fd, UI_SET_PROPBIT, INPUT_PROP_DIRECT);
    ioctl(fd, UI_SET_EVBIT, EV_MSC);
    ioctl(fd, UI_SET_MSCBIT, MSC_TIMESTAMP);

    // Set minimum and maximum values for ABS_X
    uidev.absmin[ABS_X] = 0;
    uidev.absmax[ABS_X] = w;
    uidev.absmin[ABS_Y] = 0;
    uidev.absmax[ABS_Y] = h;
    uidev.absmin[ABS_MT_POSITION_X] = 0;
    uidev.absmax[ABS_MT_POSITION_X] = w;
    uidev.absmin[ABS_MT_POSITION_Y] = 0;
    uidev.absmax[ABS_MT_POSITION_Y] = h;
    uidev.absmin[ABS_MT_TRACKING_ID] = 0;
    uidev.absmax[ABS_MT_TRACKING_ID] = 65535;

    write(fd, &uidev, sizeof(uidev));
    
    #endif

    if(ioctl(mFd,UI_DEV_CREATE,0) == -1)
        goto err;
    #if 0
    sleep(1);
    struct input_event ev;
    memset(&ev, 0, sizeof(ev));
    ev.type = EV_ABS;
    ev.code = ABS_MT_TRACKING_ID;
    ev.value = 0;
    write(fd, &ev, sizeof(ev));
    ev.code = ABS_MT_POSITION_X;
    ev.value = 100;
    write(fd, &ev, sizeof(ev));
    ev.code = ABS_MT_POSITION_Y;
    ev.value = 300;
    write(fd, &ev, sizeof(ev));
    ev.type = EV_KEY;
    ev.code = BTN_TOUCH;
    ev.value = 1;
    write(fd, &ev, sizeof(ev));
    ev.type = EV_ABS;
    ev.code = ABS_X;
    ev.value = 100;
    write(fd, &ev, sizeof(ev));
    ev.code = ABS_Y;
    ev.value = 300;
    write(fd, &ev, sizeof(ev));

    ev.type = EV_MSC;
    ev.code = MSC_TIMESTAMP;
    ev.value = 0;
    write(fd, &ev, sizeof(ev));

    ev.type = EV_SYN;
    ev.code = SYN_REPORT;
    ev.value = 0;
    write(fd, &ev, sizeof(ev));

   // sleep(1);
    memset(&ev, 0, sizeof(ev));
    ev.type = EV_ABS;
    ev.code = ABS_MT_TRACKING_ID;
    ev.value = -1;
    write(fd, &ev, sizeof(ev));
   
    ev.type = EV_KEY;
    ev.code = BTN_TOUCH;
    ev.value = 0;
    write(fd, &ev, sizeof(ev));

    ev.type = EV_MSC;
    ev.code = MSC_TIMESTAMP;
    ev.value = 0;
    write(fd, &ev, sizeof(ev));

    ev.type = EV_SYN;
    ev.code = SYN_REPORT;
    ev.value = 0;
    write(fd, &ev, sizeof(ev));
    ioctl(fd, UI_DEV_DESTROY);
    close(fd);
    mFd = -1;
    #endif
    return ;
err:
    if(mFd != -1 ){
        close(mFd);
        mFd = -1;
        
    }
    LOGE(TAG,"err construct tp:%s",strerror(errno));
}
//toDO free
VirtualTpYfcf::~VirtualTpYfcf()
{
    if(mFd!=-1){
        ioctl(mFd,UI_DEV_DESTROY,0);
        close(mFd);
    }
}

const修饰全局变量与局部变量的区别

c++揭秘,诡异的const局部变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无v邪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值