Subversion Repositories Projects

Rev

Rev 140 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 140 Rev 483
Line 1... Line 1...
1
#include "evdev_handler.h"
1
#include "evdev_handler.h"
-
 
2
#include "config.h"
Line 2... Line -...
2
 
-
 
3
int evdev_fd;
-
 
4
int evdev_out_fd;
3
 
5
int retval;
4
int retval;
6
size_t read_bytes;  /* how many bytes were read */
5
size_t read_bytes;  /* how many bytes were read */
7
struct input_event ev[64]; /* the events (up to 64 at once) */
6
struct input_event ev[64]; /* the events (up to 64 at once) */
Line 8... Line -...
8
struct input_event led_event;
-
 
9
 
-
 
10
 
-
 
11
 
7
struct input_event led_event;
Line -... Line 8...
-
 
8
 
12
int  *evdev_rel_axis=NULL;
9
 
13
char *evdev_button=NULL;
10
 
14
 
-
 
15
int counter;
-
 
Line 16... Line 11...
16
 
11
int counter;
17
int connect_evdev(char* input_evdev_name)
12
 
18
{
13
int evdevs_count=0;
19
  evdev_rel_axis = (int *) calloc( 100, sizeof( int ) );
-
 
20
  evdev_button = (char *)calloc( 100, sizeof( char ) );
14
int file_select(struct direct   *entry)
21
 
15
{
22
  struct input_devinfo {
-
 
-
 
16
 
Line 23... Line 17...
23
    uint16_t bustype;
17
  if ((strncmp(entry->d_name, "event",5))==0)
24
    uint16_t vendor;
18
    return (TRUE);
25
    uint16_t product;
-
 
Line 26... Line 19...
26
    uint16_t version;
19
  else
Line 27... Line 20...
27
  };
20
    return(FALSE);
28
  struct input_devinfo device_info;
-
 
29
 
21
}
30
  if ((evdev_out_fd = open(input_evdev_name, O_WRONLY)) < 0)
-
 
31
    {
-
 
Line 32... Line 22...
32
      printf(" cant open %s for writing\n",input_evdev_name);
22
 
Line 33... Line 23...
33
     
23
 
34
    }
24
void collect_evdev_devices()
35
 
25
{
Line -... Line 26...
-
 
26
 
-
 
27
  char event_dev_path[]="/dev/input/";
-
 
28
 
Line -... Line 29...
-
 
29
  struct direct **files;
-
 
30
  evdevs_count = scandir(event_dev_path, &files, file_select, NULL);
36
  if ((evdev_fd = open(input_evdev_name, O_RDONLY)) < 0)
31
 
Line -... Line 32...
-
 
32
  printf("%d inputs found in %s\n" , evdevs_count,event_dev_path);
-
 
33
 
-
 
34
  int i=0;
37
    {
35
  for (i=1;i<evdevs_count+1;++i)
38
      printf(" cant open %s for reading!",input_evdev_name);
36
    {
39
      return 0;
37
 
Line 40... Line 38...
40
    }
38
      printf("%s",files[i-1]->d_name);
-
 
39
      sprintf(evdevs[i].fname,"%s%s",event_dev_path,files[i-1]->d_name);
-
 
40
      int act_fd;
-
 
41
 
Line 41... Line -...
41
 
-
 
42
  ioctl(evdev_fd,EVIOCGID,&device_info);
-
 
43
   
-
 
44
  printf("vendor 0x%04hx product 0x%04hx version 0x%04hx \n",
-
 
45
         device_info.vendor, device_info.product,
42
      if ((act_fd = open(evdevs[i].fname, O_RDONLY)) < 0)
-
 
43
        {
Line -... Line 44...
-
 
44
          printf(" cant open %s for reading!",evdevs[i].name);
-
 
45
         
Line -... Line 46...
-
 
46
        }
-
 
47
      else
46
         device_info.version);
48
        {
-
 
49
          if(ioctl(act_fd , EVIOCGNAME(sizeof(evdevs[i].name)), evdevs[i].name) < 0) {
-
 
50
            perror("evdev ioctl");
-
 
51
          }
-
 
52
         
-
 
53
          printf("EVDEV reports name: %s\n", evdevs[i].name);
-
 
54
          close(act_fd);
Line -... Line 55...
-
 
55
        }
47
 
56
 
48
 
57
 
-
 
58
      /*
Line -... Line 59...
-
 
59
      FILE *fp=NULL ;
49
  char name[256]= "Unknown";
60
 
-
 
61
      sprintf(evdevs[i].fname,"/sys/class/input/%s/name",files[i-1]->d_name);
Line 50... Line 62...
50
 
62
      fp = fopen ( evdevs[i].fname, "r") ;
51
  if(ioctl(evdev_fd, EVIOCGNAME(sizeof(name)), name) < 0) {
-
 
52
    perror("evdev ioctl");
-
 
53
  }
-
 
-
 
63
 
-
 
64
      if (fp==NULL)
-
 
65
        {
54
 
66
          printf("cannot read %s\n",evdevs[i].fname);
-
 
67
          //  exit(1);
55
  printf("EVDEV reports name: %s\n", name);
68
        }
56
 
69
      int ch=-2;
57
  /* this macro is used to tell if "bit" is set in "array"
70
      int str_pos=0;
58
   * it selects a byte from the array, and does a boolean AND
71
      while ( (ch!=-1) && (ch!='\n') )
59
   * operation with a byte that only has the relevant bit set.
72
        {
60
   * eg. to check for the 12th bit, we do (array[1] & 1<<4)
73
 
61
   */
74
          ch = fgetc ( fp ) ;
62
 
75
          if ((ch!=13)&&(ch!=10))evdevs[i].name[str_pos++]=ch;
63
 
76
          printf("%c",ch);
64
    uint8_t evtype_bitmask[EV_MAX/8 + 1];
77
        }
65
 
78
 
66
    if(ioctl(evdev_fd, EVIOCGBIT(0, sizeof(evtype_bitmask)), evtype_bitmask) < 0)
79
      fclose(fp);
67
      perror("evdev ioctl");
80
      evdevs[i].name[str_pos++]=0;
68
 
81
      */
69
     printf("Supported event types:\n");
82
 
70
 
83
    }
71
     int i;
84
}
72
     for (i = 0; i < EV_MAX; i++) {
85
 
73
       if (test_bit(i, evtype_bitmask)) {
86
 
74
         /* this means that the bit is set in the event types list */
87
void print_event_str(int id)
75
         printf("  Event type 0x%02x ", i);
88
{
76
         switch ( i)
89
  switch ( id)
77
           {
90
    {
78
           case EV_KEY :
91
    case EV_KEY :
79
             printf(" (Keys or Buttons)\n");
92
      printf("Keys or Button\n");
80
             break;
93
      break;
-
 
94
    case EV_ABS :
-
 
95
      printf("Absolute Axis\n");
-
 
96
      break;
-
 
97
    case EV_LED :
-
 
98
      printf("LED(s)\n");
-
 
99
      break;
-
 
100
    case EV_REP :
-
 
101
      printf("Repeat\n");
-
 
102
      break;
-
 
103
    case EV_SYN :
-
 
104
      printf("Sync?\n");
-
 
105
      break;
-
 
106
    case EV_REL :
-
 
107
      printf("Relative Axis\n");
-
 
108
      break;
-
 
109
    case EV_MSC :
-
 
110
      printf("Misc\n");
-
 
111
      break;
-
 
112
    default:
-
 
113
      printf("Unknown event type ( 0x%04hx)\n", id);
-
 
114
    }
-
 
115
 
-
 
116
  return "";
-
 
117
}
-
 
118
 
-
 
119
int connect_evdev()
-
 
120
{
-
 
121
 
-
 
122
 
-
 
123
  struct input_devinfo {
-
 
124
    uint16_t bustype;
-
 
125
    uint16_t vendor;
-
 
126
    uint16_t product;
-
 
127
    uint16_t version;
-
 
128
  };
-
 
129
  struct input_devinfo device_info;
-
 
130
 
-
 
131
  int i;
-
 
132
  for ( i =0 ; i< input_count;i++)
-
 
133
    {
-
 
134
      inputs[i].evdev_rel_axis = (int *) calloc( 100, sizeof( int ) );
-
 
135
      inputs[i].evdev_button = (char *)calloc( 500, sizeof( char ) );
-
 
136
 
-
 
137
      if ((inputs[i].evdev_out_fd = open(inputs[i].fname, O_WRONLY)) < 0)
-
 
138
        {
-
 
139
          printf(" cant open %s for writing\n",inputs[i].fname);
-
 
140
         
-
 
141
        }
-
 
142
 
-
 
143
      if ((inputs[i].evdev_in_fd = open(inputs[i].fname, O_RDONLY)) < 0)
-
 
144
        {
-
 
145
          printf(" cant open %s for reading!",inputs[i].fname);
-
 
146
          return 0;
Line -... Line 147...
-
 
147
        }
-
 
148
 
-
 
149
      ioctl(inputs[i].evdev_in_fd ,EVIOCGID,&device_info);
81
           case EV_ABS :
150
   
82
             printf(" (Absolute Axes)\n");
151
      printf("vendor 0x%04hx product 0x%04hx version 0x%04hx \n",
Line -... Line 152...
-
 
152
             device_info.vendor, device_info.product,
83
             break;
153
             device_info.version);
84
           case EV_LED :
154
 
85
             printf(" (LEDs)\n");
155
 
86
             break;
156
      uint8_t evtype_bitmask[EV_MAX/8 + 1];
87
           case EV_REP :
157
     
Line 125... Line 195...
125
     
195
     
126
      retval = write(evdev_out_fd, &led_event, sizeof(struct input_event));
196
      retval = write(evdev_out_fd, &led_event, sizeof(struct input_event));
127
    }
197
    }
128
  return 1;
198
  return 1;
-
 
199
}
Line 129... Line 200...
129
}
200
*/
130
 
201
 
Line -... Line 202...
-
 
202
int poll_evdev()
-
 
203
{
-
 
204
 
-
 
205
  printf("polling evdev\n");
131
int poll_evdev()
206
  int i;
Line 132... Line 207...
132
{
207
  for ( i =0 ; i< input_count;i++)
133
 
208
    {
134
  struct timeval tv;
209
      struct timeval tv = {0,5};
-
 
210
     
Line 135... Line -...
135
 
-
 
136
  fd_set rfds;
-
 
Line 137... Line 211...
137
  FD_ZERO(&rfds);
211
      fd_set rfds;
Line 138... Line 212...
138
  FD_SET(evdev_fd,&rfds);
212
      FD_ZERO(&rfds);
139
 
213
      FD_SET(inputs[i].evdev_in_fd,&rfds);
140
  tv.tv_sec = 0;
214
 
141
  tv.tv_usec = 5;
215
     
142
 
216
     
Line 143... Line 217...
143
  retval = select(evdev_fd+1, &rfds, NULL, NULL, &tv);
217
      retval = select(inputs[i].evdev_in_fd+1, &rfds, NULL, NULL, &tv);
144
 
218
 
145
  if (retval==-1)
219
      if (retval==-1)
-
 
220
        printf("error in select!!!!!!!!\n");
146
    printf("error in select!!!!!!!!\n");
221
      else if (retval)
Line 147... Line 222...
147
  else if (retval)
222
        {
148
    {
223
          read_bytes = read(inputs[i].evdev_in_fd, ev, sizeof(struct input_event) * 64);
149
      read_bytes = read(evdev_fd, ev, sizeof(struct input_event) * 64);
-
 
-
 
224
     
150
     
225
          if (read_bytes < (int) sizeof(struct input_event)) {
Line 151... Line 226...
151
      if (read_bytes < (int) sizeof(struct input_event)) {
226
            perror("evtest: short read");
152
        perror("evtest: short read");
227
            exit (1);
153
        exit (1);
228
         
154
      }
229
}
155
     
230
         
Line 156... Line 231...
156
      for (counter = 0; counter < (int) (read_bytes / sizeof(struct input_event)); counter++)
231
          for (counter = 0; counter < (int) (read_bytes / sizeof(struct input_event)); counter++)
157
        {
232
            {
158
         
233
              //print_event_str(ev[counter].type); 
Line 159... Line 234...
159
          printf("%d type:%d code:%d val:%d \n",counter,ev[counter].type,ev[counter].code,ev[counter].value);
234
              //              printf(" code:%d val:%d \n",ev[counter].code,ev[counter].value);
160
 
235
             
161
          //      if (ev[counter].type==EV_REL) evdev_rel_axis[ ev[counter].code]= ev[counter].value;
236
              //          if (ev[counter].type==EV_REL) evdev_rel_axis[ ev[counter].code]= ev[counter].value;
162
          // for logitech problem
237
              // for logitech problem
163
          if (ev[counter].type==EV_REL) evdev_rel_axis[ ev[counter].code]= ev[counter].value;
238
              if (ev[counter].type==EV_REL) inputs[i].evdev_rel_axis[ ev[counter].code]= ev[counter].value;
164
          if (ev[counter].type==EV_KEY) evdev_button[ ev[counter].code-256]= ev[counter].value;
239
              if (ev[counter].type==EV_KEY) inputs[i].evdev_button[ ev[counter].code]= ev[counter].value;
165
        }
240
            }
166
     
241
         
167
     
242