Mercurial > sdl-ios-xcode
comparison src/joystick/mint/SDL_sysjoystick.c @ 4174:3370c734fd49 SDL-1.2
Add Teamtap autodetection, to avoid generating ghost events if it is not present
author | Patrice Mandin <patmandin@gmail.com> |
---|---|
date | Fri, 24 Apr 2009 19:04:02 +0000 |
parents | a1b03ba2fcd0 |
children |
comparison
equal
deleted
inserted
replaced
4173:34068be6aa0b | 4174:3370c734fd49 |
---|---|
110 #define PORT_JS_LEFT (1<<1) | 110 #define PORT_JS_LEFT (1<<1) |
111 #define PORT_JS_DOWN (1<<2) | 111 #define PORT_JS_DOWN (1<<2) |
112 #define PORT_JS_UP (1<<3) | 112 #define PORT_JS_UP (1<<3) |
113 #define PORT_JS_FIRE (1<<4) | 113 #define PORT_JS_FIRE (1<<4) |
114 | 114 |
115 enum { | |
116 TEAMTAP_MAYBE=0, | |
117 TEAMTAP_YES, | |
118 TEAMTAP_NO | |
119 }; | |
120 | |
121 /* Teamtap detection values */ | |
122 static const Uint32 teamtap_ghosts[20][4]={ | |
123 {1<<JP_UP, /* for this event on joypad 0, port X */ | |
124 (1<<JP_UP)|(1<<JP_KP0), /* we get this on joypad 1 */ | |
125 (1<<JP_UP)|(1<<JP_KPNUM)|(1<<JP_KP0), /* this on joypad 2 */ | |
126 (1<<JP_KPMULT)|(1<<JP_KP0)}, /* this on joypad 3 */ | |
127 {1<<JP_DOWN, | |
128 (1<<JP_DOWN)|(1<<JP_KP8), | |
129 (1<<JP_DOWN)|(1<<JP_KP9)|(1<<JP_KP8), | |
130 (1<<JP_KP7)|(1<<JP_KP8)}, | |
131 {1<<JP_LEFT, | |
132 (1<<JP_LEFT)|(1<<JP_KP5), | |
133 (1<<JP_LEFT)|(1<<JP_KP6)|(1<<JP_KP5), | |
134 (1<<JP_KP4)|(1<<JP_KP5)}, | |
135 {1<<JP_RIGHT, | |
136 (1<<JP_RIGHT)|(1<<JP_KP2), | |
137 (1<<JP_RIGHT)|(1<<JP_KP3)|(1<<JP_KP2), | |
138 (1<<JP_KP1)|(1<<JP_KP2)}, | |
139 {1<<JP_OPTION, | |
140 (1<<JP_OPTION)|(1<<JP_FIRE1)|(1<<JP_FIRE2), | |
141 (1<<JP_FIRE0)|(1<<JP_FIRE1)|(1<<JP_FIRE2), | |
142 0}, | |
143 {1<<JP_FIRE0, | |
144 (1<<JP_FIRE2)|(1<<JP_FIRE0), | |
145 (1<<JP_FIRE0)|(1<<JP_OPTION)|(1<<JP_FIRE2), | |
146 (1<<JP_FIRE1)|(1<<JP_FIRE2)}, | |
147 {1<<JP_FIRE1, | |
148 (1<<JP_FIRE0), | |
149 (1<<JP_OPTION)|(1<<JP_FIRE0)|(1<<JP_FIRE1), | |
150 (1<<JP_FIRE0)|(1<<JP_FIRE2)}, | |
151 {1<<JP_FIRE2, | |
152 (1<<JP_OPTION)|(1<<JP_FIRE0)|(1<<JP_FIRE1)|(1<<JP_FIRE2), | |
153 (1<<JP_OPTION), | |
154 (1<<JP_FIRE0)|(1<<JP_FIRE1)}, | |
155 {1<<JP_KP1, | |
156 (1<<JP_RIGHT)|(1<<JP_KP1), | |
157 (1<<JP_RIGHT)|(1<<JP_KP1)|(1<<JP_KP3), | |
158 (1<<JP_RIGHT)|(1<<JP_KP2)}, | |
159 {1<<JP_KP2, | |
160 (1<<JP_RIGHT)|(1<<JP_KP1)|(1<<JP_KP2)|(1<<JP_KP3), | |
161 (1<<JP_KP3), | |
162 (1<<JP_RIGHT)|(1<<JP_KP1)}, | |
163 {1<<JP_KP3, | |
164 (1<<JP_RIGHT)|(1<<JP_KP1)|(1<<JP_KP2)|(1<<JP_KP3), | |
165 (1<<JP_RIGHT)|(1<<JP_KP1)|(1<<JP_KP2), | |
166 0}, | |
167 {1<<JP_KP4, | |
168 (1<<JP_LEFT)|(1<<JP_KP4), | |
169 (1<<JP_LEFT)|(1<<JP_KP4)|(1<<JP_KP6), | |
170 (1<<JP_LEFT)|(1<<JP_KP5)}, | |
171 {1<<JP_KP5, | |
172 (1<<JP_LEFT)|(1<<JP_KP4)|(1<<JP_KP5)|(1<<JP_KP6), | |
173 (1<<JP_KP6), | |
174 (1<<JP_LEFT)|(1<<JP_KP4)}, | |
175 {1<<JP_KP6, | |
176 (1<<JP_LEFT)|(1<<JP_KP4)|(1<<JP_KP5)|(1<<JP_KP6), | |
177 (1<<JP_LEFT)|(1<<JP_KP4)|(1<<JP_KP5), | |
178 0}, | |
179 {1<<JP_KP7, | |
180 (1<<JP_DOWN)|(1<<JP_KP7), | |
181 (1<<JP_DOWN)|(1<<JP_KP7)|(1<<JP_KP9), | |
182 (1<<JP_DOWN)|(1<<JP_KP8)}, | |
183 {1<<JP_KP8, | |
184 (1<<JP_DOWN)|(1<<JP_KP7)|(1<<JP_KP8)|(1<<JP_KP9), | |
185 (1<<JP_KP9), | |
186 (1<<JP_DOWN)|(1<<JP_KP7)}, | |
187 {1<<JP_KP9, | |
188 (1<<JP_DOWN)|(1<<JP_KP7)|(1<<JP_KP8)|(1<<JP_KP9), | |
189 (1<<JP_DOWN)|(1<<JP_KP7)|(1<<JP_KP8), | |
190 0}, | |
191 {1<<JP_KPMULT, | |
192 (1<<JP_UP)|(1<<JP_KPMULT), | |
193 (1<<JP_UP)|(1<<JP_KPNUM), | |
194 (1<<JP_UP)|(1<<JP_KP0)}, | |
195 {1<<JP_KP0, | |
196 (1<<JP_UP)|(1<<JP_KPNUM)|(1<<JP_KPMULT)|(1<<JP_KP0), | |
197 1<<JP_KPNUM, | |
198 (1<<JP_UP)|(1<<JP_KPMULT)}, | |
199 {1<<JP_KPNUM, | |
200 (1<<JP_UP)|(1<<JP_KPNUM)|(1<<JP_KPMULT)|(1<<JP_KP0), | |
201 (1<<JP_UP)|(1<<JP_KPMULT)|(1<<JP_KP0), | |
202 0}, | |
203 }; | |
204 | |
115 /*--- Types ---*/ | 205 /*--- Types ---*/ |
116 | 206 |
117 typedef struct { | 207 typedef struct { |
118 SDL_bool enabled; | 208 SDL_bool enabled; |
119 unsigned char *name; | 209 unsigned char *name; |
153 JP_KP5, JP_KP6, JP_KP7, JP_KP8, | 243 JP_KP5, JP_KP6, JP_KP7, JP_KP8, |
154 JP_KP9 | 244 JP_KP9 |
155 }; | 245 }; |
156 | 246 |
157 static SDL_bool joypad_ports_enabled=SDL_FALSE; | 247 static SDL_bool joypad_ports_enabled=SDL_FALSE; |
248 static int has_teamtap[2]={TEAMTAP_MAYBE,TEAMTAP_MAYBE}; | |
158 | 249 |
159 /* Updated joypad ports */ | 250 /* Updated joypad ports */ |
160 static Uint16 jp_paddles[4]; | 251 static Uint16 jp_paddles[4]; |
161 static Uint16 jp_lightpens[2]; | 252 static Uint16 jp_lightpens[2]; |
162 static Uint16 jp_directions; | 253 static Uint16 jp_directions; |
189 cookie_mch = MCH_ST << 16; | 280 cookie_mch = MCH_ST << 16; |
190 } | 281 } |
191 | 282 |
192 /* Enable some default joysticks */ | 283 /* Enable some default joysticks */ |
193 if ((cookie_mch == MCH_ST<<16) || ((cookie_mch>>16) == MCH_STE) || | 284 if ((cookie_mch == MCH_ST<<16) || ((cookie_mch>>16) == MCH_STE) || |
194 (cookie_mch == MCH_TT<<16) || (cookie_mch == MCH_F30<<16) || | 285 (cookie_mch == MCH_TT<<16) || (cookie_mch == MCH_F30<<16) || |
195 (cookie_mch == MCH_ARANYM<<16)) { | 286 (cookie_mch == MCH_ARANYM<<16)) |
287 { | |
196 atarijoysticks[IKBD_JOY1].enabled=(SDL_AtariIkbd_enabled!=0); | 288 atarijoysticks[IKBD_JOY1].enabled=(SDL_AtariIkbd_enabled!=0); |
197 } | 289 } |
198 if ((cookie_mch == MCH_STE<<16) || (cookie_mch == MCH_F30<<16)) { | 290 if ((cookie_mch == MCH_STE<<16) || (cookie_mch == MCH_F30<<16) || |
291 (cookie_mch == MCH_ARANYM<<16)) | |
292 { | |
199 atarijoysticks[PORTA_PAD0].enabled = | 293 atarijoysticks[PORTA_PAD0].enabled = |
200 atarijoysticks[PORTA_PAD1].enabled = | 294 atarijoysticks[PORTA_PAD1].enabled = |
201 atarijoysticks[PORTA_PAD2].enabled = | 295 atarijoysticks[PORTA_PAD2].enabled = |
202 atarijoysticks[PORTA_PAD3].enabled = | 296 atarijoysticks[PORTA_PAD3].enabled = |
203 atarijoysticks[PORTB_PAD0].enabled = | 297 atarijoysticks[PORTB_PAD0].enabled = |
349 } | 443 } |
350 | 444 |
351 return(0); | 445 return(0); |
352 } | 446 } |
353 | 447 |
448 /* Detect Teamtap using ghost events */ | |
449 static void detect_teamtap(int num_port) | |
450 { | |
451 int i,j; | |
452 | |
453 /* Check if joypad 1,2,3 triggered but not 0 */ | |
454 for (i=1; i<4; i++) { | |
455 if (jp_joypads[num_port*4+i] && (jp_joypads[num_port*4]==0)) { | |
456 has_teamtap[num_port] = TEAMTAP_YES; | |
457 return; | |
458 } | |
459 } | |
460 | |
461 /* Check if joypad 0 on a given port triggered ghost events for | |
462 * other joypads | |
463 */ | |
464 for (i=0; i<20; i++) { | |
465 int with_teamtap=1; | |
466 | |
467 if (jp_joypads[num_port*4]!=teamtap_ghosts[i][0]) | |
468 continue; | |
469 | |
470 /* If any button on first joypad pressed, check other pads */ | |
471 for (j=1; j<4; j++) { | |
472 if ((jp_joypads[num_port*4+j] & teamtap_ghosts[i][j]) | |
473 ==teamtap_ghosts[i][j]) | |
474 { | |
475 with_teamtap = 0; | |
476 } | |
477 } | |
478 | |
479 has_teamtap[num_port] = (with_teamtap ? TEAMTAP_YES : TEAMTAP_NO); | |
480 break; | |
481 } | |
482 } | |
483 | |
354 void SDL_SYS_JoystickUpdate(SDL_Joystick *joystick) | 484 void SDL_SYS_JoystickUpdate(SDL_Joystick *joystick) |
355 { | 485 { |
356 int numjoystick; | 486 int numjoystick; |
357 Uint8 hatstate; | 487 Uint8 hatstate; |
358 Uint32 curstate,prevstate; | 488 Uint32 curstate,prevstate; |
414 case PORTB_PAD0: | 544 case PORTB_PAD0: |
415 case PORTB_PAD1: | 545 case PORTB_PAD1: |
416 case PORTB_PAD2: | 546 case PORTB_PAD2: |
417 case PORTB_PAD3: | 547 case PORTB_PAD3: |
418 { | 548 { |
419 int numjoypad,i; | 549 int numjoypad,i,numport; |
420 | 550 |
421 numjoypad = 0; | 551 numjoypad = numport = 0; |
422 switch(numjoystick) { | 552 switch(numjoystick) { |
423 case PORTA_PAD0: | 553 case PORTA_PAD0: |
424 numjoypad = 0; break; | 554 numjoypad = 0; break; |
425 case PORTA_PAD1: | 555 case PORTA_PAD1: |
426 numjoypad = 1; break; | 556 numjoypad = 1; break; |
427 case PORTA_PAD2: | 557 case PORTA_PAD2: |
428 numjoypad = 2; break; | 558 numjoypad = 2; break; |
429 case PORTA_PAD3: | 559 case PORTA_PAD3: |
430 numjoypad = 3; break; | 560 numjoypad = 3; break; |
431 case PORTB_PAD0: | 561 case PORTB_PAD0: |
432 numjoypad = 4; break; | 562 numjoypad = 4; numport = 1; break; |
433 case PORTB_PAD1: | 563 case PORTB_PAD1: |
434 numjoypad = 5; break; | 564 numjoypad = 5; numport = 1; break; |
435 case PORTB_PAD2: | 565 case PORTB_PAD2: |
436 numjoypad = 6; break; | 566 numjoypad = 6; numport = 1; break; |
437 case PORTB_PAD3: | 567 case PORTB_PAD3: |
438 numjoypad = 7; break; | 568 numjoypad = 7; numport = 1; break; |
439 } | 569 } |
440 | 570 |
441 curstate=jp_joypads[numjoypad] & 0xabffff; | 571 jp_joypads[numjoypad] &= 0xabffff; |
572 | |
573 if (has_teamtap[numport]==TEAMTAP_MAYBE) { | |
574 detect_teamtap(numport); | |
575 } | |
576 /* No events for PORTX_PAD[1,2,3] if no teamtap detected */ | |
577 if (has_teamtap[numport] == TEAMTAP_NO) { | |
578 if ((numjoypad & 3)!=0) { | |
579 return; | |
580 } | |
581 } | |
582 | |
583 curstate=jp_joypads[numjoypad]; | |
442 if (curstate!=prevstate) { | 584 if (curstate!=prevstate) { |
443 hatstate = SDL_HAT_CENTERED; | 585 hatstate = SDL_HAT_CENTERED; |
444 if (curstate & (1<<JP_LEFT)) { | 586 if (curstate & (1<<JP_LEFT)) { |
445 hatstate |= SDL_HAT_LEFT; | 587 hatstate |= SDL_HAT_LEFT; |
446 } | 588 } |