Difference between revisions of "Uinput"

From Ilianko
Line 1: Line 1:
 
<code><pre>
 
<code><pre>
−
 
 
#include <stdio.h>
 
#include <stdio.h>
 
#include <stdlib.h>
 
#include <stdlib.h>
Line 10: Line 9:
 
#include <linux/uinput.h>
 
#include <linux/uinput.h>
  
 +
#define die(str, args...) do { \
 +
        perror(str); \
 +
        exit(EXIT_FAILURE); \
 +
    } while(0)
  
−
int main(void)
+
int
 +
main(void)
 
{
 
{
−
     int                    fd, kb_fd;
+
     int                    fd;
 
     struct uinput_user_dev uidev;
 
     struct uinput_user_dev uidev;
−
     struct input_event    ev, kb_ev;
+
     struct input_event    ev;
 
     int                    dx, dy;
 
     int                    dx, dy;
−
      
+
     int                    i;
  
 
     fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
 
     fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
−
   
+
     if(fd < 0)
−
     if (fd == -1) {
+
        die("error: open");
−
      puts("Can't open file");
+
 
−
    return 1;
+
     if(ioctl(fd, UI_SET_EVBIT, EV_KEY) < 0)
−
    }
+
        die("error: ioctl");
−
   
+
     if(ioctl(fd, UI_SET_KEYBIT, BTN_LEFT) < 0)
−
   
+
        die("error: ioctl");
−
     ioctl(fd, UI_SET_EVBIT, EV_KEY);
+
 
−
     ioctl(fd, UI_SET_KEYBIT, BTN_LEFT);
+
     if(ioctl(fd, UI_SET_EVBIT, EV_REL) < 0)
−
     ioctl(fd, UI_SET_EVBIT, EV_REL) ;
+
        die("error: ioctl");
−
     ioctl(fd, UI_SET_RELBIT, REL_X);
+
     if(ioctl(fd, UI_SET_RELBIT, REL_X) < 0)
−
     ioctl(fd, UI_SET_RELBIT, REL_Y);
+
        die("error: ioctl");
−
 
+
     if(ioctl(fd, UI_SET_RELBIT, REL_Y) < 0)
 +
        die("error: ioctl");
 +
 
 
     memset(&uidev, 0, sizeof(uidev));
 
     memset(&uidev, 0, sizeof(uidev));
−
    snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-sample");
+
  snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-sample");
 
     uidev.id.bustype = BUS_USB;
 
     uidev.id.bustype = BUS_USB;
 
     uidev.id.vendor  = 0x1;
 
     uidev.id.vendor  = 0x1;
Line 41: Line 47:
  
 
     if(write(fd, &uidev, sizeof(uidev)) < 0)
 
     if(write(fd, &uidev, sizeof(uidev)) < 0)
−
         {
+
         die("error: write");
−
      puts("Can't open file");
+
 
−
     return 1;
+
    if(ioctl(fd, UI_DEV_CREATE) < 0)
−
    }
+
        die("error: ioctl");
 +
 
 +
     sleep(20);
 +
 
 
      
 
      
−
if(ioctl(fd, UI_DEV_CREATE) < 0)
+
 
−
      {
+
            dx = -100;
−
      puts("Can't open file");
+
            dy = -10;
−
    return 1;
+
         
−
    }
+
     
 +
            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");
  
−
    kb_fd = open("/dev/input/event3", O_RDWR);
+
            memset(&ev, 0, sizeof(struct input_event));
−
    if (kb_fd < 0)
+
            ev.type = EV_REL;
−
    { 
+
            ev.code = REL_Y;
−
puts("cant open kb");
+
            ev.value = dy;
−
return 1;
+
            if(write(fd, &ev, sizeof(struct input_event)) < 0)
−
    }
+
                die("error: write");
−
   
+
 
−
    while (1)
+
            memset(&ev, 0, sizeof(struct input_event));
−
    {
+
            ev.type = EV_SYN;
−
+
            ev.code = 0;
−
    read(kb_fd, &kb_ev, sizeof(struct input_event));
+
            ev.value = 0;
 +
            if(write(fd, &ev, sizeof(struct input_event)) < 0)
 +
                die("error: write");
 +
 
 +
            usleep(15000);
 +
     
 +
 
 +
    if(ioctl(fd, UI_DEV_DESTROY) < 0)
 +
        die("error: ioctl");
  
−
     if( kb_ev.type == 1 && (kb_ev.value == 2 || kb_ev.value == 1))
+
     close(fd);
−
    {
 
−
 
−
memset(&ev, 0, sizeof(ev));
 
−
    gettimeofday(&ev.time, NULL);
 
−
    usleep(100);
 
−
switch (kb_ev.code)
 
−
  {
 
−
    case 105:
 
−
      ev.type = EV_REL;
 
−
          ev.code = REL_X;
 
−
          ev.value = -5;
 
−
    break;
 
−
   
 
−
    case 106:
 
−
      ev.type = EV_REL;
 
−
          ev.code = REL_X;
 
−
          ev.value = 5;
 
−
    break;
 
−
   
 
−
    case 103:
 
−
      ev.type = EV_REL;
 
−
          ev.code = REL_Y;
 
−
          ev.value = -5;
 
−
    break;
 
−
   
 
−
    case 108:
 
−
      ev.type = EV_REL;
 
−
          ev.code = REL_Y;
 
−
          ev.value = 5;
 
−
    break;
 
−
   
 
−
        default:
 
−
          ev.type = EV_REL;
 
−
          ev.code = REL_X;
 
−
          ev.value = -5;
 
−
      }
 
−
 
−
    write(fd, &ev, sizeof(ev));
 
−
    usleep(100);
 
−
   
 
−
    gettimeofday(&ev.time, NULL);
 
−
    ev.type = 0;
 
−
    ev.code = 0;
 
−
    ev.value = 0;
 
−
    write(fd, &ev, sizeof(ev));
 
−
    }
 
−
  } 
 
−
   
 
−
   
 
  
−
  close(fd);
+
    return 0;
−
  return 0;
 
 
}
 
}
 +
 
</pre></code>
 
</pre></code>
  
 
[[Category:Компютърна периферия]]
 
[[Category:Компютърна периферия]]

Revision as of 19:47, 13 April 2011

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/input.h>
#include <linux/uinput.h>

#define die(str, args...) do { \
        perror(str); \
        exit(EXIT_FAILURE); \
    } while(0)

int
main(void)
{
    int                    fd;
    struct uinput_user_dev uidev;
    struct input_event     ev;
    int                    dx, dy;
    int                    i;

    fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
    if(fd < 0)
        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(20);

    
  
            dx = -100;
            dy = -10;
          
       
            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);
      

    if(ioctl(fd, UI_DEV_DESTROY) < 0)
        die("error: ioctl");

    close(fd);

    return 0;
}