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 }