Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <ctime>
- #include <fcntl.h>
- #include <sys/stat.h>
- #include <linux/joystick.h>
- #include <linux/uinput.h>
- #include <linux/input.h>
- #include <linux/types.h>
- #include <errno.h>
- using namespace std;
- #define die(a) printf(a); exit(1)
- void ex(){
- int fd;
- struct uinput_user_dev uidev;
- struct input_event ev;
- int dx, dy;
- int i;
- //mknod( "/dev/input/event0", S_IFCHR, makedev(13,1) );
- fd = open("/dev/input/js0", O_WRONLY | O_NONBLOCK);
- if(fd < 0){
- printf("err: %d\n",errno);
- //die("error: open");
- }
- /*
- if(ioctl(fd, UI_SET_EVBIT, EV_KEY) < 0)
- die("error: ioctl");
- if(ioctl(fd, UI_SET_KEYBIT, BTN_LEFT) < 0)
- die("error: ioctl");
- if(ioctl(fd, UI_SET_EVBIT, EV_REL) < 0)
- die("error: ioctl");
- if(ioctl(fd, UI_SET_RELBIT, REL_X) < 0)
- die("error: ioctl");
- if(ioctl(fd, UI_SET_RELBIT, REL_Y) < 0)
- die("error: ioctl");
- */
- memset(&uidev, 0, sizeof(uidev));
- snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-sample");
- uidev.id.bustype = BUS_USB;
- uidev.id.vendor = 0x1;
- uidev.id.product = 0x1;
- uidev.id.version = 1;
- if(write(fd, &uidev, sizeof(uidev)) < 0)
- die("error: write");
- if(ioctl(fd, UI_DEV_CREATE) < 0)
- die("error: ioctl");
- sleep(2);
- srand(time(NULL));
- while(1) {
- switch(rand() % 4) {
- case 0:
- dx = -10;
- dy = -1;
- break;
- case 1:
- dx = 10;
- dy = 1;
- break;
- case 2:
- dx = -1;
- dy = 10;
- break;
- case 3:
- dx = 1;
- dy = -10;
- break;
- }
- for(i = 0; i < 20; i++) {
- memset(&ev, 0, sizeof(struct input_event));
- ev.type = EV_REL;
- ev.code = REL_X;
- ev.value = dx;
- if(write(fd, &ev, sizeof(struct input_event)) < 0)
- die("error: write");
- memset(&ev, 0, sizeof(struct input_event));
- ev.type = EV_REL;
- ev.code = REL_Y;
- ev.value = dy;
- if(write(fd, &ev, sizeof(struct input_event)) < 0)
- die("error: write");
- memset(&ev, 0, sizeof(struct input_event));
- ev.type = EV_SYN;
- ev.code = 0;
- ev.value = 0;
- if(write(fd, &ev, sizeof(struct input_event)) < 0)
- die("error: write");
- usleep(15000);
- }
- sleep(5);
- }
- sleep(2);
- if(ioctl(fd, UI_DEV_DESTROY) < 0)
- die("error: ioctl");
- close(fd);
- exit(0);
- }
- void simulate(){
- //ex();
- int timer=20;
- int ret=0;
- int dev=0;
- printf("Error before: %d\n", errno);
- dev=mknod( "/dev/input/js0", S_IFCHR, makedev(4,1) );
- printf("Error mknod: %d\n", errno);
- //FILE *f=fopen("/dev/input/js0", "wb");
- int fd= open("/dev/input/js0", O_WRONLY | O_NONBLOCK);
- printf("Error: %d\n", errno);
- printf("Created, dev=%d; fd=%d\n", dev, fd);
- //ret = ioctl(fd, UI_SET_EVBIT, EV_KEY);
- printf("Set, ret=%d\n", ret);
- int val=1;
- printf("Error: %d\n", errno);
- struct uinput_user_dev uidev;
- memset(&uidev, 0, sizeof(uidev));
- //snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "AndroPad");
- uidev.id.bustype = BUS_USB;
- uidev.id.vendor = 0x1234;
- uidev.id.product = 0xfedc;
- uidev.id.version = 1;
- //ret = write(fd, &uidev, sizeof(uidev));
- //printf("creating ret=%d\n", ret);
- //ret = ioctl(fd, UI_DEV_CREATE);
- //printf("created ret=%d\n", ret);
- struct js_event ev;
- while(timer--){
- ev.time=time(NULL);
- ev.value=(val==1?val--:val++);
- ev.type=JS_EVENT_BUTTON;
- ev.number=0;
- //fwrite(&ev, sizeof(ev), 1, f);
- ret = write(fd, &ev, sizeof(ev));
- printf("event %d ret=%d; err=%d\n", val, ret, errno);
- sleep(1);
- }
- ret = ioctl(fd, UI_DEV_DESTROY);
- printf("destroy ret=%d\n", ret);
- exit(0);
- }
- int main() {
- simulate();
- FILE *in=fopen("/dev/input/js0", "rwb");
- if(in==NULL){
- printf("error\n");
- exit(0);
- }
- union Data{
- int i;
- char str[4];
- };
- Data data1, data2;
- int a=0;
- char str[40];
- int last=0;
- while(!feof(in)){
- fread(data1.str, 4, 1, in);
- fread(data2.str, 4, 1, in);
- //fscanf(in, "%d", &data.i);
- switch(data2.str[2]){
- case 1: //button
- switch(data2.str[0]){
- case 1: printf("%8x PRESS %d\n",data1.i, data2.str[3]); break;
- case 0: printf("%8x RELEASE %d\n",data1.i, data2.str[3]); break;
- default:
- printf("%8x : %8x\n", data1.i, data2.i);
- }; break;
- case 2: //d-pad
- printf("%8x MOVE %d TO %03.1f\n",data1.i, data2.str[3], 2*((float)data2.str[1]*0xff + data2.str[0])/0xffff);
- break;
- default:
- printf("%8x : %8x\n", data1.i, data2.i);
- };
- //printf("%08x %08x : %.3f\n", data1.i, data2.i,
- // ((float)data2.str[1]*0xff + data2.str[0])/0xffff
- //);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement