#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);
}
}