Advertisement
Guest User

Untitled

a guest
Feb 26th, 2012
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.08 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <ctime>
  6. #include <fcntl.h>
  7. #include <sys/stat.h>
  8. #include <linux/joystick.h>
  9. #include <linux/uinput.h>
  10. #include <linux/input.h>
  11. #include <linux/types.h>
  12. #include <errno.h>
  13. using namespace std;
  14. #define die(a) printf(a); exit(1)
  15. void ex(){
  16.     int                    fd;
  17.     struct uinput_user_dev uidev;
  18.     struct input_event     ev;
  19.     int                    dx, dy;
  20.     int                    i;
  21.     //mknod( "/dev/input/event0", S_IFCHR, makedev(13,1) );
  22.  
  23.     fd = open("/dev/input/js0", O_WRONLY | O_NONBLOCK);
  24.     if(fd < 0){
  25.       printf("err: %d\n",errno);
  26.         //die("error: open");
  27.     }
  28. /*
  29.     if(ioctl(fd, UI_SET_EVBIT, EV_KEY) < 0)
  30.         die("error: ioctl");
  31.     if(ioctl(fd, UI_SET_KEYBIT, BTN_LEFT) < 0)
  32.         die("error: ioctl");
  33.  
  34.     if(ioctl(fd, UI_SET_EVBIT, EV_REL) < 0)
  35.         die("error: ioctl");
  36.     if(ioctl(fd, UI_SET_RELBIT, REL_X) < 0)
  37.         die("error: ioctl");
  38.     if(ioctl(fd, UI_SET_RELBIT, REL_Y) < 0)
  39.         die("error: ioctl");
  40. */
  41.     memset(&uidev, 0, sizeof(uidev));
  42.     snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-sample");
  43.     uidev.id.bustype = BUS_USB;
  44.     uidev.id.vendor  = 0x1;
  45.     uidev.id.product = 0x1;
  46.     uidev.id.version = 1;
  47.  
  48.     if(write(fd, &uidev, sizeof(uidev)) < 0)
  49.         die("error: write");
  50.  
  51.     if(ioctl(fd, UI_DEV_CREATE) < 0)
  52.         die("error: ioctl");
  53.  
  54.     sleep(2);
  55.  
  56.     srand(time(NULL));
  57.  
  58.     while(1) {
  59.         switch(rand() % 4) {
  60.         case 0:
  61.             dx = -10;
  62.             dy = -1;
  63.             break;
  64.         case 1:
  65.             dx = 10;
  66.             dy = 1;
  67.             break;
  68.         case 2:
  69.             dx = -1;
  70.             dy = 10;
  71.             break;
  72.         case 3:
  73.             dx = 1;
  74.             dy = -10;
  75.             break;
  76.         }
  77.  
  78.         for(i = 0; i < 20; i++) {
  79.             memset(&ev, 0, sizeof(struct input_event));
  80.             ev.type = EV_REL;
  81.             ev.code = REL_X;
  82.             ev.value = dx;
  83.             if(write(fd, &ev, sizeof(struct input_event)) < 0)
  84.                 die("error: write");
  85.  
  86.             memset(&ev, 0, sizeof(struct input_event));
  87.             ev.type = EV_REL;
  88.             ev.code = REL_Y;
  89.             ev.value = dy;
  90.             if(write(fd, &ev, sizeof(struct input_event)) < 0)
  91.                 die("error: write");
  92.  
  93.             memset(&ev, 0, sizeof(struct input_event));
  94.             ev.type = EV_SYN;
  95.             ev.code = 0;
  96.             ev.value = 0;
  97.             if(write(fd, &ev, sizeof(struct input_event)) < 0)
  98.                 die("error: write");
  99.  
  100.             usleep(15000);
  101.         }
  102.  
  103.         sleep(5);
  104.     }
  105.  
  106.     sleep(2);
  107.  
  108.     if(ioctl(fd, UI_DEV_DESTROY) < 0)
  109.         die("error: ioctl");
  110.  
  111.     close(fd);
  112.  
  113.     exit(0);
  114. }
  115.  
  116. void simulate(){
  117.   //ex();
  118.   int timer=20;
  119.   int ret=0;
  120.   int dev=0;
  121.   printf("Error before: %d\n", errno);
  122.   dev=mknod( "/dev/input/js0", S_IFCHR, makedev(4,1) );
  123.   printf("Error mknod: %d\n", errno);
  124.   //FILE *f=fopen("/dev/input/js0", "wb");
  125.   int fd= open("/dev/input/js0", O_WRONLY | O_NONBLOCK);
  126.   printf("Error: %d\n", errno);
  127.   printf("Created, dev=%d; fd=%d\n", dev, fd);
  128.   //ret = ioctl(fd, UI_SET_EVBIT, EV_KEY);
  129.   printf("Set, ret=%d\n", ret);
  130.   int val=1;
  131.   printf("Error: %d\n", errno);
  132.  
  133.   struct uinput_user_dev uidev;
  134.   memset(&uidev, 0, sizeof(uidev));
  135.   //snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "AndroPad");
  136.   uidev.id.bustype = BUS_USB;
  137.   uidev.id.vendor  = 0x1234;
  138.   uidev.id.product = 0xfedc;
  139.   uidev.id.version = 1;
  140.   //ret = write(fd, &uidev, sizeof(uidev));
  141.   //printf("creating ret=%d\n", ret);
  142.   //ret = ioctl(fd, UI_DEV_CREATE);
  143.   //printf("created ret=%d\n", ret);
  144.   struct js_event ev;
  145.   while(timer--){
  146.     ev.time=time(NULL);
  147.     ev.value=(val==1?val--:val++);
  148.     ev.type=JS_EVENT_BUTTON;
  149.     ev.number=0;
  150.     //fwrite(&ev, sizeof(ev), 1, f);
  151.     ret = write(fd, &ev, sizeof(ev));
  152.     printf("event %d ret=%d; err=%d\n", val, ret, errno);
  153.     sleep(1);
  154.   }
  155.   ret = ioctl(fd, UI_DEV_DESTROY);
  156.   printf("destroy ret=%d\n", ret);
  157.   exit(0);
  158. }
  159.  
  160. int main() {
  161.   simulate();
  162.   FILE *in=fopen("/dev/input/js0", "rwb");
  163.   if(in==NULL){
  164.     printf("error\n");
  165.     exit(0);
  166.   }
  167.   union Data{
  168.     int i;
  169.     char str[4];
  170.   };
  171.   Data data1, data2;
  172.   int a=0;
  173.   char str[40];
  174.   int last=0;
  175.   while(!feof(in)){
  176.     fread(data1.str, 4, 1, in);
  177.     fread(data2.str, 4, 1, in);
  178.     //fscanf(in, "%d", &data.i);
  179.     switch(data2.str[2]){
  180.       case 1: //button
  181.     switch(data2.str[0]){
  182.       case 1: printf("%8x  PRESS %d\n",data1.i, data2.str[3]); break;
  183.       case 0: printf("%8x RELEASE %d\n",data1.i, data2.str[3]); break;
  184.       default:
  185.         printf("%8x : %8x\n", data1.i, data2.i);
  186.     }; break;
  187.       case 2: //d-pad
  188.     printf("%8x MOVE %d TO %03.1f\n",data1.i, data2.str[3], 2*((float)data2.str[1]*0xff + data2.str[0])/0xffff);
  189.     break;
  190.       default:
  191.     printf("%8x : %8x\n", data1.i, data2.i);
  192.     };
  193.     //printf("%08x %08x : %.3f\n", data1.i, data2.i,
  194.     //   ((float)data2.str[1]*0xff + data2.str[0])/0xffff
  195.       //);
  196.   }
  197.  return 0;
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement