UNTESTED on device!
[pandora-libraries.git] / lib / pnd_io_gpio.c
1
2 #if defined (_PANDORA) || !defined (EMULATOR)
3
4 /* cribbed from pnd_keytypes.h so as to make it unnecessary */
5   #define BITS_PER_LONG (sizeof(long) * 8)
6   #define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1)
7   #include <string.h>
8   #include <fcntl.h>
9   #include <unistd.h>
10   #include <stdio.h>
11 /* back to reality */
12
13 #include <stdlib.h> /* abs() */
14 #include <linux/input.h> /* struct input_event */
15
16 #include "pnd_io_gpio.h"
17 //#include "pnd_keytype.h"
18
19 unsigned char GLES2D_Pad [ pke_pad_max ];
20
21 char event_name[30];
22 int fd_usbk, fd_usbm, fd_gpio, fd_pndk, fd_nub1, fd_nub2, fd_ts, rd, i, j, k;
23 struct input_event ev[64];
24 int version;
25 unsigned short id[4];
26 unsigned long bit[EV_MAX][NBITS(KEY_MAX)];
27 char dev_name[256] = "Unknown";
28 int absolute[5];
29
30 char pnd_nub1[9]  = "vsense66";
31 char pnd_nub2[9]  = "vsense67";
32 char pnd_key[19]  = "omap_twl4030keypad";
33 char pnd_gpio[10] = "gpio-keys";
34
35 #define DEV_NUB1 0
36 #define DEV_NUB2 1
37 #define DEV_PNDK 2
38 #define DEV_GPIO 3
39
40 #define NUB1_CUTOFF 100
41 #define NUB2_CUTOFF 100
42 #define NUB2_SCALE  10
43
44 void PND_Setup_Controls ( void ) {
45   //printf( "Setting up Pandora Controls\n" );
46
47   // Static Controls
48   // Pandora keyboard
49   fd_pndk = PND_OpenEventDeviceByName(pnd_key);
50   // Pandora buttons
51   fd_gpio = PND_OpenEventDeviceByName(pnd_gpio);
52   // Pandora analog nub's
53   fd_nub1 = PND_OpenEventDeviceByName(pnd_nub1);
54   fd_nub2 = PND_OpenEventDeviceByName(pnd_nub2);
55
56 }
57
58 void PND_Close_Controls ( void ) {
59   //printf( "Closing Pandora Controls\n" );
60
61   if( fd_pndk > 0 )
62     close(fd_pndk );
63   if( fd_gpio > 0 )
64     close(fd_gpio );
65   if( fd_nub1 > 0 )
66     close(fd_nub1 );
67   if( fd_nub2 > 0 )
68     close(fd_nub2 );
69
70 }
71
72 void PND_SendKeyEvents ( void ) {
73   PND_ReadEvents( fd_pndk, DEV_PNDK );
74   PND_ReadEvents( fd_gpio, DEV_GPIO );
75   PND_ReadEvents( fd_nub1, DEV_NUB1 );
76   PND_ReadEvents( fd_nub2, DEV_NUB2 );
77 }
78
79 void PND_ReadEvents ( int fd, int device ) {
80
81   if ( fd != 0 ) {
82
83     rd = read ( fd, ev, sizeof(struct input_event) * 64 );
84
85     if ( rd > (int) sizeof(struct input_event) ) {
86       for (i = 0; i < rd / sizeof(struct input_event); i++) {
87         PND_CheckEvent ( &ev[i], device );
88       }
89     }
90   
91   } // got fd?
92
93   return;
94 }
95
96 void PND_CheckEvent ( struct input_event *event, int device ) {
97   int value;
98
99   // printf( "Device %d Type %d Code %d Value %d\n", device, event->type, event->code, event->value );
100
101   value = event->value;
102
103   switch( event->type ) {
104
105   case EV_KEY:
106
107     switch( event->code ) {
108
109     case KEY_UP:
110       if ( event->value ) {     
111         GLES2D_Pad[pke_pad_up] = 1;
112       } else {
113         GLES2D_Pad[pke_pad_up] = 0;
114       }
115       break;
116
117     case KEY_DOWN:
118       if ( event->value ) {     
119         GLES2D_Pad[pke_pad_down] = 1;
120       } else {
121         GLES2D_Pad[pke_pad_down] = 0;
122       }
123       break;
124
125     case KEY_LEFT:
126       if ( event->value ) {     
127         GLES2D_Pad[pke_pad_left] = 1;
128       } else {
129         GLES2D_Pad[pke_pad_left] = 0;
130       }
131       break;
132
133     case KEY_RIGHT:
134       if ( event->value ) {     
135         GLES2D_Pad[pke_pad_right] = 1;
136       } else {
137         GLES2D_Pad[pke_pad_right] = 0;
138       }
139       break;
140
141     case KEY_MENU:
142       if ( event->value ) {     
143         GLES2D_Pad[pke_pad_menu] = 1;
144       } else {
145         GLES2D_Pad[pke_pad_menu] = 0;
146       }
147       break;
148
149     case BTN_START:
150       if ( event->value ) printf("START\n");
151       break;
152
153     case BTN_SELECT:
154       if ( event->value ) printf("SELECT\n");
155       break;
156
157     case BTN_X:
158       if ( event->value ) {     
159         GLES2D_Pad[pke_pad_x] = 1;
160       } else {
161         GLES2D_Pad[pke_pad_x] = 0;
162       }
163       break;
164
165     case BTN_Y:
166       if ( event->value ) {     
167         GLES2D_Pad[pke_pad_y] = 1;
168       } else {
169         GLES2D_Pad[pke_pad_y] = 0;
170       }
171       break;
172
173     case BTN_A:
174       if ( event->value ) {     
175         GLES2D_Pad[pke_pad_a] = 1;
176       } else {
177         GLES2D_Pad[pke_pad_a] = 0;
178       }
179       break;
180
181     case BTN_B:
182       if ( event->value ) {     
183         GLES2D_Pad[pke_pad_b] = 1;
184       } else {
185         GLES2D_Pad[pke_pad_b] = 0;
186       }
187       break;
188
189     case BTN_TL:
190       if ( event->value ) {     
191         GLES2D_Pad[pke_pad_l] = 1;
192       } else {
193         GLES2D_Pad[pke_pad_l] = 0;
194       }
195       break;
196
197     case BTN_TR:
198       if ( event->value ) {     
199         GLES2D_Pad[pke_pad_r] = 1;
200       } else {
201         GLES2D_Pad[pke_pad_r] = 0;
202       }
203       break;
204
205     default:
206       break;
207     }
208     break;
209     
210   case EV_ABS:
211
212     switch ( device ) {
213
214     case DEV_NUB1:
215       if ( event->code == ABS_X ) {
216         //printf( "nub1 x %3d\n", value );
217         if( abs(value) > NUB1_CUTOFF ) {
218           if( value > 0 ) {
219             value = 1;
220           } else if( value < 0 ) {
221             value = 1;                                              
222           }
223         } else {
224         }
225       }
226         
227       if( event->code == ABS_Y ) {
228         //printf( "nub1 y %3d\n", value );
229         if( abs(value) > NUB1_CUTOFF ) {
230           if( value > 0 ) {
231             value = 1;
232           } else if( value < 0 ) {
233             value = 1;
234           }
235         } else {
236         }
237       }
238       break;
239
240     case DEV_NUB2:
241       if(event->code == ABS_X) {
242         //printf( "nub2 x %3d\n", value );
243         if( abs(value) > NUB2_CUTOFF ) {
244           if( value > 0 ) {
245             value = 1;
246           } else if( value < 0 ) {
247             value = 1;                                              
248           }
249         } else {
250         }
251       }
252         
253       if(event->code == ABS_Y) {
254         //printf( "nub2 y %3d\n", value );
255         if( abs(value) > NUB2_CUTOFF ) {
256           if( value > 0 ) {
257             value = 1;
258           } else if( value < 0 ) {
259             value = 1;
260           }
261         } else {
262         }
263       }
264       break;
265
266     }
267     break;
268   }
269
270   return;
271 }
272
273 int PND_OpenEventDeviceByID ( int event_id ) {
274   int fd;
275
276   snprintf( event_name, sizeof(event_name), "/dev/input/event%d", event_id );
277   printf( "Device: %s\n", event_name );
278   if ((fd = open(event_name, O_RDONLY |  O_NDELAY)) < 0) {
279     perror("ERROR: Could not open device");
280     return 0;
281   }
282
283   if (ioctl(fd, EVIOCGVERSION, &version)) {
284     perror("evtest: can't get version");
285     return 0;
286   }
287
288   printf("Input driver version is %d.%d.%d\n",
289          version >> 16, (version >> 8) & 0xff, version & 0xff);
290
291   ioctl(fd, EVIOCGID, id);
292   printf("Input device ID: bus 0x%x vendor 0x%x product 0x%x version 0x%x\n",
293          id[ID_BUS], id[ID_VENDOR], id[ID_PRODUCT], id[ID_VERSION]);
294
295   ioctl(fd, EVIOCGNAME(sizeof(dev_name)), dev_name);
296   printf("Input device name: \"%s\"\n", dev_name);
297
298   return fd;
299 }
300
301 int PND_OpenEventDeviceByName ( char device_name[] ) {
302   int fd;
303
304   for (i = 0; 1; i++) {
305
306     snprintf( event_name, sizeof(event_name), "/dev/input/event%d", i );
307     printf( "Device: %s\n", event_name );
308     if ((fd = open(event_name, O_RDONLY |  O_NDELAY)) < 0) {
309       perror("ERROR: Could not open device");
310       return 0;
311     }
312
313     if (fd < 0) break; /* no more devices */
314
315     ioctl(fd, EVIOCGNAME(sizeof(dev_name)), dev_name);
316     if (strcmp(dev_name, device_name) == 0) {
317
318       if (ioctl(fd, EVIOCGVERSION, &version)) {
319         perror("evtest: can't get version");
320         return 0;
321       }
322
323       printf("Input driver version is %d.%d.%d\n",
324              version >> 16, (version >> 8) & 0xff, version & 0xff);
325
326       ioctl(fd, EVIOCGID, id);
327       printf("Input device ID: bus 0x%x vendor 0x%x product 0x%x version 0x%x\n",
328              id[ID_BUS], id[ID_VENDOR], id[ID_PRODUCT], id[ID_VERSION]);
329
330       ioctl(fd, EVIOCGNAME(sizeof(dev_name)), dev_name);
331       printf("Input device name: \"%s\"\n", dev_name);
332                   
333       return fd;
334     }
335
336     close(fd); /* we don't need this device */
337   }
338
339   return 0;
340 }
341
342 int PND_Pad_RecentlyPressed ( pnd_keytype_e num ) {
343   static int GLES2D_Pad_old [ pke_pad_max ];
344
345   if ( !GLES2D_Pad_old[num] && GLES2D_Pad[num] ) {
346     GLES2D_Pad_old[num] = GLES2D_Pad[num];
347     return 1;
348   }
349
350   GLES2D_Pad_old[num] = GLES2D_Pad[num];
351
352   return 0;
353 }
354
355 #endif