Lines 1-5
Link Here
|
1 |
--- src/joystick/bsd/SDL_sysjoystick.c.orig 2012-01-19 07:30:06.000000000 +0100 |
1 |
--- SDL_sysjoystick.c.orig 2012-01-19 15:30:06.000000000 +0900 |
2 |
+++ src/joystick/bsd/SDL_sysjoystick.c 2012-07-21 10:09:16.000000000 +0200 |
2 |
+++ SDL_sysjoystick.c 2015-05-06 22:52:50.648504057 +0900 |
3 |
@@ -82,7 +82,9 @@ |
3 |
@@ -82,7 +82,9 @@ |
4 |
#define MAX_JOYS (MAX_UHID_JOYS + MAX_JOY_JOYS) |
4 |
#define MAX_JOYS (MAX_UHID_JOYS + MAX_JOY_JOYS) |
5 |
|
5 |
|
Lines 23-29
Link Here
|
23 |
#elif (defined(__FREEBSD__) && (__FreeBSD_kernel_version > 800063)) |
23 |
#elif (defined(__FREEBSD__) && (__FreeBSD_kernel_version > 800063)) |
24 |
#define REP_BUF_DATA(rep) ((rep)->buf->ugd_data) |
24 |
#define REP_BUF_DATA(rep) ((rep)->buf->ugd_data) |
25 |
#else |
25 |
#else |
26 |
@@ -582,8 +586,12 @@ |
26 |
@@ -411,47 +415,47 @@ |
|
|
27 |
struct joystick gameport; |
28 |
|
29 |
if (joy->hwdata->type == BSDJOY_JOY) { |
30 |
- if (read(joy->hwdata->fd, &gameport, sizeof gameport) != sizeof gameport) |
31 |
- return; |
32 |
- if (abs(joy->hwdata->x - gameport.x) > 8) { |
33 |
- joy->hwdata->x = gameport.x; |
34 |
- if (joy->hwdata->x < joy->hwdata->xmin) { |
35 |
- joy->hwdata->xmin = joy->hwdata->x; |
36 |
- } |
37 |
- if (joy->hwdata->x > joy->hwdata->xmax) { |
38 |
- joy->hwdata->xmax = joy->hwdata->x; |
39 |
- } |
40 |
- if (joy->hwdata->xmin == joy->hwdata->xmax) { |
41 |
- joy->hwdata->xmin--; |
42 |
- joy->hwdata->xmax++; |
43 |
- } |
44 |
- v = (Sint32)joy->hwdata->x; |
45 |
- v -= (joy->hwdata->xmax + joy->hwdata->xmin + 1)/2; |
46 |
- v *= 32768/((joy->hwdata->xmax - joy->hwdata->xmin + 1)/2); |
47 |
- SDL_PrivateJoystickAxis(joy, 0, v); |
48 |
- } |
49 |
- if (abs(joy->hwdata->y - gameport.y) > 8) { |
50 |
- joy->hwdata->y = gameport.y; |
51 |
- if (joy->hwdata->y < joy->hwdata->ymin) { |
52 |
- joy->hwdata->ymin = joy->hwdata->y; |
53 |
+ while (read(joy->hwdata->fd, &gameport, sizeof gameport) == sizeof gameport) { |
54 |
+ if (abs(joy->hwdata->x - gameport.x) > 8) { |
55 |
+ joy->hwdata->x = gameport.x; |
56 |
+ if (joy->hwdata->x < joy->hwdata->xmin) { |
57 |
+ joy->hwdata->xmin = joy->hwdata->x; |
58 |
+ } |
59 |
+ if (joy->hwdata->x > joy->hwdata->xmax) { |
60 |
+ joy->hwdata->xmax = joy->hwdata->x; |
61 |
+ } |
62 |
+ if (joy->hwdata->xmin == joy->hwdata->xmax) { |
63 |
+ joy->hwdata->xmin--; |
64 |
+ joy->hwdata->xmax++; |
65 |
+ } |
66 |
+ v = (Sint32)joy->hwdata->x; |
67 |
+ v -= (joy->hwdata->xmax + joy->hwdata->xmin + 1)/2; |
68 |
+ v *= 32768/((joy->hwdata->xmax - joy->hwdata->xmin + 1)/2); |
69 |
+ SDL_PrivateJoystickAxis(joy, 0, v); |
70 |
+ } |
71 |
+ if (abs(joy->hwdata->y - gameport.y) > 8) { |
72 |
+ joy->hwdata->y = gameport.y; |
73 |
+ if (joy->hwdata->y < joy->hwdata->ymin) { |
74 |
+ joy->hwdata->ymin = joy->hwdata->y; |
75 |
+ } |
76 |
+ if (joy->hwdata->y > joy->hwdata->ymax) { |
77 |
+ joy->hwdata->ymax = joy->hwdata->y; |
78 |
+ } |
79 |
+ if (joy->hwdata->ymin == joy->hwdata->ymax) { |
80 |
+ joy->hwdata->ymin--; |
81 |
+ joy->hwdata->ymax++; |
82 |
+ } |
83 |
+ v = (Sint32)joy->hwdata->y; |
84 |
+ v -= (joy->hwdata->ymax + joy->hwdata->ymin + 1)/2; |
85 |
+ v *= 32768/((joy->hwdata->ymax - joy->hwdata->ymin + 1)/2); |
86 |
+ SDL_PrivateJoystickAxis(joy, 1, v); |
87 |
} |
88 |
- if (joy->hwdata->y > joy->hwdata->ymax) { |
89 |
- joy->hwdata->ymax = joy->hwdata->y; |
90 |
+ if (gameport.b1 != joy->buttons[0]) { |
91 |
+ SDL_PrivateJoystickButton(joy, 0, gameport.b1); |
92 |
} |
93 |
- if (joy->hwdata->ymin == joy->hwdata->ymax) { |
94 |
- joy->hwdata->ymin--; |
95 |
- joy->hwdata->ymax++; |
96 |
+ if (gameport.b2 != joy->buttons[1]) { |
97 |
+ SDL_PrivateJoystickButton(joy, 1, gameport.b2); |
98 |
} |
99 |
- v = (Sint32)joy->hwdata->y; |
100 |
- v -= (joy->hwdata->ymax + joy->hwdata->ymin + 1)/2; |
101 |
- v *= 32768/((joy->hwdata->ymax - joy->hwdata->ymin + 1)/2); |
102 |
- SDL_PrivateJoystickAxis(joy, 1, v); |
103 |
- } |
104 |
- if (gameport.b1 != joy->buttons[0]) { |
105 |
- SDL_PrivateJoystickButton(joy, 0, gameport.b1); |
106 |
- } |
107 |
- if (gameport.b2 != joy->buttons[1]) { |
108 |
- SDL_PrivateJoystickButton(joy, 1, gameport.b2); |
109 |
} |
110 |
return; |
111 |
} |
112 |
@@ -459,65 +463,61 @@ |
113 |
|
114 |
rep = &joy->hwdata->inreport; |
115 |
|
116 |
- if (read(joy->hwdata->fd, REP_BUF_DATA(rep), rep->size) != rep->size) { |
117 |
- return; |
118 |
- } |
119 |
+ while (read(joy->hwdata->fd, REP_BUF_DATA(rep), rep->size) == rep->size) { |
120 |
#if defined(USBHID_NEW) || (defined(__FREEBSD__) && __FreeBSD_kernel_version >= 500111) || defined(__FreeBSD_kernel__) |
121 |
- hdata = hid_start_parse(joy->hwdata->repdesc, 1 << hid_input, rep->rid); |
122 |
+ hdata = hid_start_parse(joy->hwdata->repdesc, 1 << hid_input, rep->rid); |
123 |
#else |
124 |
- hdata = hid_start_parse(joy->hwdata->repdesc, 1 << hid_input); |
125 |
+ hdata = hid_start_parse(joy->hwdata->repdesc, 1 << hid_input); |
126 |
#endif |
127 |
- if (hdata == NULL) { |
128 |
- fprintf(stderr, "%s: Cannot start HID parser\n", |
129 |
- joy->hwdata->path); |
130 |
- return; |
131 |
- } |
132 |
+ if (hdata == NULL) { |
133 |
+ /*fprintf(stderr, "%s: Cannot start HID parser\n", joy->hwdata->path);*/ |
134 |
+ continue; |
135 |
+ } |
136 |
|
137 |
- for (nbutton = 0; hid_get_item(hdata, &hitem) > 0;) { |
138 |
- switch (hitem.kind) { |
139 |
- case hid_input: |
140 |
- switch (HID_PAGE(hitem.usage)) { |
141 |
- case HUP_GENERIC_DESKTOP: { |
142 |
- unsigned usage = HID_USAGE(hitem.usage); |
143 |
- int joyaxe = usage_to_joyaxe(usage); |
144 |
- if (joyaxe >= 0) { |
145 |
- naxe = joy->hwdata->axis_map[joyaxe]; |
146 |
- /* scaleaxe */ |
147 |
- v = (Sint32)hid_get_data(REP_BUF_DATA(rep), |
148 |
- &hitem); |
149 |
- v -= (hitem.logical_maximum + hitem.logical_minimum + 1)/2; |
150 |
- v *= 32768/((hitem.logical_maximum - hitem.logical_minimum + 1)/2); |
151 |
- if (v != joy->axes[naxe]) { |
152 |
- SDL_PrivateJoystickAxis(joy, naxe, v); |
153 |
+ for (nbutton = 0; hid_get_item(hdata, &hitem) > 0;) { |
154 |
+ switch (hitem.kind) { |
155 |
+ case hid_input: |
156 |
+ switch (HID_PAGE(hitem.usage)) { |
157 |
+ case HUP_GENERIC_DESKTOP: { |
158 |
+ unsigned usage = HID_USAGE(hitem.usage); |
159 |
+ int joyaxe = usage_to_joyaxe(usage); |
160 |
+ if (joyaxe >= 0) { |
161 |
+ naxe = joy->hwdata->axis_map[joyaxe]; |
162 |
+ /* scaleaxe */ |
163 |
+ v = (Sint32)hid_get_data(REP_BUF_DATA(rep), |
164 |
+ &hitem); |
165 |
+ v -= (hitem.logical_maximum + hitem.logical_minimum + 1)/2; |
166 |
+ v *= 32768/((hitem.logical_maximum - hitem.logical_minimum + 1)/2); |
167 |
+ if (v != joy->axes[naxe]) { |
168 |
+ SDL_PrivateJoystickAxis(joy, naxe, v); |
169 |
+ } |
170 |
+ } else if (usage == HUG_HAT_SWITCH) { |
171 |
+ v = (Sint32)hid_get_data(REP_BUF_DATA(rep), |
172 |
+ &hitem); |
173 |
+ SDL_PrivateJoystickHat(joy, 0, |
174 |
+ hatval_to_sdl(v)-hitem.logical_minimum); |
175 |
+ } |
176 |
+ break; |
177 |
} |
178 |
- } else if (usage == HUG_HAT_SWITCH) { |
179 |
- v = (Sint32)hid_get_data(REP_BUF_DATA(rep), |
180 |
- &hitem); |
181 |
- SDL_PrivateJoystickHat(joy, 0, |
182 |
- hatval_to_sdl(v)-hitem.logical_minimum); |
183 |
- } |
184 |
- break; |
185 |
- } |
186 |
- case HUP_BUTTON: |
187 |
- v = (Sint32)hid_get_data(REP_BUF_DATA(rep), |
188 |
- &hitem); |
189 |
- if (joy->buttons[nbutton] != v) { |
190 |
- SDL_PrivateJoystickButton(joy, |
191 |
- nbutton, v); |
192 |
+ case HUP_BUTTON: |
193 |
+ v = (Sint32)hid_get_data(REP_BUF_DATA(rep), |
194 |
+ &hitem); |
195 |
+ if (joy->buttons[nbutton] != v) { |
196 |
+ SDL_PrivateJoystickButton(joy, |
197 |
+ nbutton, v); |
198 |
+ } |
199 |
+ nbutton++; |
200 |
+ break; |
201 |
+ default: |
202 |
+ continue; |
203 |
} |
204 |
- nbutton++; |
205 |
break; |
206 |
default: |
207 |
- continue; |
208 |
+ break; |
209 |
} |
210 |
- break; |
211 |
- default: |
212 |
- break; |
213 |
} |
214 |
+ hid_end_parse(hdata); |
215 |
} |
216 |
- hid_end_parse(hdata); |
217 |
- |
218 |
- return; |
219 |
} |
220 |
|
221 |
/* Function to close a joystick after use */ |
222 |
@@ -582,8 +582,12 @@ |
27 |
r->size = len; |
223 |
r->size = len; |
28 |
|
224 |
|
29 |
if (r->size > 0) { |
225 |
if (r->size > 0) { |