Mercurial > mplayer.hg
annotate input/joystick.c @ 16529:d320720fe74e
feel free to fix this as you see fit...
i want to be sure people will not take interest in this option and
look it up and try using it. just enough for those already know it
and still stubborn enough to use it.
author | ods15 |
---|---|
date | Mon, 19 Sep 2005 19:36:10 +0000 |
parents | 6180d7558f75 |
children | 5f83daf94eb2 |
rev | line source |
---|---|
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
1 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
2 #include "../config.h" |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
3 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
4 #ifdef HAVE_JOYSTICK |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
5 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
6 #include "joystick.h" |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
7 #include "input.h" |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
8 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
9 #include <stdlib.h> |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
10 #include <stdio.h> |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
11 #include <string.h> |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
12 #include <unistd.h> |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
13 #include <sys/types.h> |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
14 #include <sys/stat.h> |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
15 #include <fcntl.h> |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
16 #include <errno.h> |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
17 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
18 #ifndef JOY_AXIS_DELTA |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
19 #define JOY_AXIS_DELTA 500 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
20 #endif |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
21 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
22 #ifndef JS_DEV |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
23 #define JS_DEV "/dev/input/js0" |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
24 #endif |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
25 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
26 #ifdef TARGET_LINUX |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
27 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
28 #include <linux/joystick.h> |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
29 |
4589
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
30 int axis[10]; |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
31 int btns = 0; |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
32 |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
33 int mp_input_joystick_init(char* dev) { |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
34 int fd,l=0; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
35 int inited = 0; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
36 struct js_event ev; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
37 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
38 printf("Opening joystick device %s\n",dev ? dev : JS_DEV); |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
39 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
40 fd = open( dev ? dev : JS_DEV , O_RDONLY | O_NONBLOCK ); |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
41 if(fd < 0) { |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
42 printf("Can't open joystick device %s : %s\n",dev ? dev : JS_DEV,strerror(errno)); |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
43 return -1; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
44 } |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
45 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
46 while(! inited) { |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
47 l = 0; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
48 while((unsigned int)l < sizeof(struct js_event)) { |
6156 | 49 int r = read(fd,((char*)&ev)+l,sizeof(struct js_event)-l); |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
50 if(r < 0) { |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
51 if(errno == EINTR) |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
52 continue; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
53 else if(errno == EAGAIN) { |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
54 inited = 1; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
55 break; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
56 } |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
57 printf("Error while reading joystick device : %s\n",strerror(errno)); |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
58 close(fd); |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
59 return -1; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
60 } |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
61 l += r; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
62 } |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
63 if((unsigned int)l < sizeof(struct js_event)) { |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
64 if(l > 0) |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
65 printf("Joystick : we loose %d bytes of data\n",l); |
4524
01a0cf736e0d
Fix the bugs the previous version should fix (and those introduced
albeu
parents:
4518
diff
changeset
|
66 break; |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
67 } |
4589
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
68 ev.type &= ~JS_EVENT_INIT; |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
69 if(ev.type == JS_EVENT_BUTTON) |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
70 btns |= (ev.value << ev.number); |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
71 if(ev.type == JS_EVENT_AXIS) |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
72 axis[ev.number] = ev.value; |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
73 } |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
74 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
75 return fd; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
76 } |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
77 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
78 int mp_input_joystick_read(int fd) { |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
79 struct js_event ev; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
80 int l=0; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
81 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
82 while((unsigned int)l < sizeof(struct js_event)) { |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
83 int r = read(fd,&ev+l,sizeof(struct js_event)-l); |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
84 if(r <= 0) { |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
85 if(errno == EINTR) |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
86 continue; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
87 else if(errno == EAGAIN) |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
88 return MP_INPUT_NOTHING; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
89 if( r < 0) |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
90 printf("Joystick error while reading joystick device : %s\n",strerror(errno)); |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
91 else |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
92 printf("Joystick error while reading joystick device : EOF\n"); |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
93 return MP_INPUT_DEAD; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
94 } |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
95 l += r; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
96 } |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
97 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
98 if((unsigned int)l < sizeof(struct js_event)) { |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
99 if(l > 0) |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
100 printf("Joystick : we loose %d bytes of data\n",l); |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
101 return MP_INPUT_NOTHING; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
102 } |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
103 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
104 if(ev.type & JS_EVENT_INIT) { |
4524
01a0cf736e0d
Fix the bugs the previous version should fix (and those introduced
albeu
parents:
4518
diff
changeset
|
105 printf("Joystick : warning init event, we have lost sync with driver\n"); |
4589
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
106 ev.type &= ~JS_EVENT_INIT; |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
107 if(ev.type == JS_EVENT_BUTTON) { |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
108 int s = (btns >> ev.number) & 1; |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
109 if(s == ev.value) // State is the same : ignore |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
110 return MP_INPUT_NOTHING; |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
111 } |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
112 if(ev.type == JS_EVENT_AXIS) { |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
113 if( ( axis[ev.number] == 1 && ev.value > JOY_AXIS_DELTA) || |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
114 (axis[ev.number] == -1 && ev.value < -JOY_AXIS_DELTA) || |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
115 (axis[ev.number] == 0 && ev.value >= -JOY_AXIS_DELTA && ev.value <= JOY_AXIS_DELTA) |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
116 ) // State is the same : ignore |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
117 return MP_INPUT_NOTHING; |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
118 } |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
119 } |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
120 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
121 if(ev.type & JS_EVENT_BUTTON) { |
4589
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
122 btns &= ~(1 << ev.number); |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
123 btns |= (ev.value << ev.number); |
4524
01a0cf736e0d
Fix the bugs the previous version should fix (and those introduced
albeu
parents:
4518
diff
changeset
|
124 if(ev.value == 1) |
4589
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
125 return ((JOY_BTN0+ev.number) | MP_KEY_DOWN); |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
126 else |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
127 return (JOY_BTN0+ev.number); |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
128 } else if(ev.type & JS_EVENT_AXIS) { |
4589
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
129 if(ev.value < -JOY_AXIS_DELTA && axis[ev.number] != -1) { |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
130 axis[ev.number] = -1; |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
131 return (JOY_AXIS0_MINUS+(2*ev.number)) | MP_KEY_DOWN; |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
132 } else if(ev.value > JOY_AXIS_DELTA && axis[ev.number] != 1) { |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
133 axis[ev.number] = 1; |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
134 return (JOY_AXIS0_PLUS+(2*ev.number)) | MP_KEY_DOWN; |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
135 } else if(ev.value <= JOY_AXIS_DELTA && ev.value >= -JOY_AXIS_DELTA && axis[ev.number] != 0) { |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
136 int r = axis[ev.number] == 1 ? JOY_AXIS0_PLUS+(2*ev.number) : JOY_AXIS0_MINUS+(2*ev.number); |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
137 axis[ev.number] = 0; |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
138 return r; |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
139 } else |
4ce20c55a18a
Added support for key combination and mouse buttons key code
albeu
parents:
4524
diff
changeset
|
140 return MP_INPUT_NOTHING; |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
141 } else { |
10397 | 142 printf("Joystick warning unknown event type %d\n",ev.type); |
4418
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
143 return MP_INPUT_ERROR; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
144 } |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
145 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
146 return MP_INPUT_NOTHING; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
147 } |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
148 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
149 #else |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
150 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
151 // dummy function |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
152 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
153 int mp_input_joystick_init(char* dev) { |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
154 return -1; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
155 } |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
156 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
157 int mp_input_joystick_read(int fd) { |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
158 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
159 return MP_INPUT_NOTHING; |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
160 } |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
161 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
162 #endif |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
163 |
8141d2c399e4
A new configurable input system and joystick support for this system
albeu
parents:
diff
changeset
|
164 #endif |