1 /*
2  * OpenBOR - http://www.LavaLit.com
3  * -----------------------------------------------------------------------
4  * Licensed under the BSD license, see LICENSE in OpenBOR root for details.
5  *
6  * Copyright (c) 2004 - 2011 OpenBOR Team
7  */
8 
9 #include <stdio.h>		// kbhit, getch
10 #include "control.h"
11 #include "xboxport.h"
12 
13 static int usejoy;
14 
15 #define	PAD_START 1
16 #define	PAD_END   (16*4)
17 
18 static const char *padnames[PAD_END+1+1] = {
19 	"...",
20 #define CONTROLNAMES(x) \
21 	x" Up",             \
22 	x" Right",          \
23 	x" Down",           \
24 	x" Left",           \
25 	x" A",              \
26 	x" B",              \
27 	x" X",              \
28 	x" Y",              \
29 	x" Black",          \
30 	x" White",          \
31 	x" Start",          \
32 	x" Back",           \
33 	x" L-Trigger",      \
34 	x" R-Trigger",      \
35 	x" L-Thumb",        \
36 	x" R-Thumb",
37 	CONTROLNAMES("Joy 1")
38 	CONTROLNAMES("Joy 2")
39 	CONTROLNAMES("Joy 3")
40 	CONTROLNAMES("Joy 4")
41 	"undefined"
42 };
43 
flag_to_index(unsigned long flag)44 static int flag_to_index(unsigned long flag){
45 	int index = 0;
46 	unsigned long bit = 1;
47 
48 	while(!((bit<<index)&flag) && index<31) ++index;
49 	return index;
50 }
51 
control_exit()52 void control_exit(){}
53 
control_init(int joy_enable)54 void control_init(int joy_enable){
55 	usejoy = 1 ;
56 }
57 
control_usejoy(int enable)58 int control_usejoy(int enable){
59 	return 1 ;
60 }
61 
control_getjoyenabled()62 int control_getjoyenabled(){
63 	return usejoy;
64 }
65 
control_setkey(s_playercontrols * pcontrols,unsigned int flag,int key)66 void control_setkey(s_playercontrols * pcontrols, unsigned int flag, int key){
67 	if(!pcontrols) return;
68 	pcontrols->settings[flag_to_index(flag)] = key;
69 	pcontrols->keyflags = pcontrols->newkeyflags = 0;
70 }
71 
72 // Scan input for newly-pressed keys.
73 // Return value:
74 // 0  = no key was pressed
75 // >0 = key code for pressed key
76 // <0 = error
control_scankey()77 int control_scankey(){
78 	static unsigned ready = 0;
79 	unsigned k=0;
80 	unsigned port0=xbox_get_playerinput(0);
81 	unsigned port1=xbox_get_playerinput(1);
82 	unsigned port2=xbox_get_playerinput(2);
83 	unsigned port3=xbox_get_playerinput(3);
84 
85 		 if(port0) k = 1 + 0*16 + flag_to_index(port0);
86 	else if(port1) k = 1 + 1*16 + flag_to_index(port1);
87 	else if(port2) k = 1 + 2*16 + flag_to_index(port2);
88 	else if(port3) k = 1 + 3*16 + flag_to_index(port3);
89 
90 	if(ready && k) {
91 		ready = 0;
92 		return k;
93 	}
94 	ready = (!k);
95 	return 0;
96 }
97 
control_getkeyname(unsigned keycode)98 char * control_getkeyname(unsigned keycode){
99 
100 	if(keycode >= PAD_START && keycode <= PAD_END) return (char*)padnames[keycode];
101 	return "...";
102 }
103 
control_update(s_playercontrols ** playercontrols,int numplayers)104 void control_update(s_playercontrols ** playercontrols, int numplayers){
105 
106 	unsigned long k;
107 	unsigned long i;
108 	int player;
109 	int t;
110 	s_playercontrols * pcontrols;
111 	unsigned port[4];
112 	xbox_check_events();
113 	port[0]=xbox_get_playerinput(0);
114 	port[1]=xbox_get_playerinput(1);
115 	port[2]=xbox_get_playerinput(2);
116 	port[3]=xbox_get_playerinput(3);
117 	for(player=0; player<numplayers; player++){
118 		pcontrols = playercontrols[player];
119 		k = 0;
120 		for(i=0; i<32; i++){
121 			t = pcontrols->settings[i];
122 			if(t >= PAD_START && t <= PAD_END){
123 				int portnum = (t-1) / 16;
124 				int shiftby = (t-1) % 16;
125 				if(portnum >= 0 && portnum <= 3){
126 					if((port[portnum] >> shiftby) & 1) k |= (1<<i);
127 				}
128 			}
129 		}
130 		pcontrols->kb_break = 0;
131 		pcontrols->newkeyflags = k & (~pcontrols->keyflags);
132 		pcontrols->keyflags = k;
133 	}
134 }
135 
control_rumble(int port,int msec)136 void control_rumble(int port, int msec)
137 {
138 }
139