Subversion Repositories Projects

Rev

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