comparison src/joystick/beos/SDL_bejoystick.cc @ 1662:782fd950bd46 SDL-1.3

Revamp of the video system in progress - adding support for multiple displays, multiple windows, and a full video mode selection API. WARNING: None of the video drivers have been updated for the new API yet! The API is still under design and very fluid. The code is now run through a consistent indent format: indent -i4 -nut -nsc -br -ce The headers are being converted to automatically generate doxygen documentation.
author Sam Lantinga <slouken@libsdl.org>
date Sun, 28 May 2006 13:04:16 +0000
parents 92947e3a18db
children 4da1ee79c9af
comparison
equal deleted inserted replaced
1661:281d3f4870e5 1662:782fd950bd46
26 /* This is the system specific header for the SDL joystick API */ 26 /* This is the system specific header for the SDL joystick API */
27 27
28 #include <be/support/String.h> 28 #include <be/support/String.h>
29 #include <be/device/Joystick.h> 29 #include <be/device/Joystick.h>
30 30
31 extern "C" { 31 extern "C"
32 {
32 33
33 #include "SDL_joystick.h" 34 #include "SDL_joystick.h"
34 #include "../SDL_sysjoystick.h" 35 #include "../SDL_sysjoystick.h"
35 #include "../SDL_joystick_c.h" 36 #include "../SDL_joystick_c.h"
36 37
37 38
38 /* The maximum number of joysticks we'll detect */ 39 /* The maximum number of joysticks we'll detect */
39 #define MAX_JOYSTICKS 16 40 #define MAX_JOYSTICKS 16
40 41
41 /* A list of available joysticks */ 42 /* A list of available joysticks */
42 static char *SDL_joyport[MAX_JOYSTICKS]; 43 static char *SDL_joyport[MAX_JOYSTICKS];
43 static char *SDL_joyname[MAX_JOYSTICKS]; 44 static char *SDL_joyname[MAX_JOYSTICKS];
44 45
45 /* The private structure used to keep track of a joystick */ 46 /* The private structure used to keep track of a joystick */
46 struct joystick_hwdata { 47 struct joystick_hwdata
47 BJoystick *stick; 48 {
48 uint8 *new_hats; 49 BJoystick *stick;
49 int16 *new_axes; 50 uint8 *new_hats;
50 }; 51 int16 *new_axes;
52 };
51 53
52 /* Function to scan the system for joysticks. 54 /* Function to scan the system for joysticks.
53 * This function should set SDL_numjoysticks to the number of available 55 * This function should set SDL_numjoysticks to the number of available
54 * joysticks. Joystick 0 should be the system default joystick. 56 * joysticks. Joystick 0 should be the system default joystick.
55 * It should return 0, or -1 on an unrecoverable fatal error. 57 * It should return 0, or -1 on an unrecoverable fatal error.
56 */ 58 */
57 int SDL_SYS_JoystickInit(void) 59 int SDL_SYS_JoystickInit (void)
58 { 60 {
59 BJoystick joystick; 61 BJoystick joystick;
60 int numjoysticks; 62 int numjoysticks;
61 int i; 63 int i;
62 int32 nports; 64 int32 nports;
63 char name[B_OS_NAME_LENGTH]; 65 char name[B_OS_NAME_LENGTH];
64 66
65 /* Search for attached joysticks */ 67 /* Search for attached joysticks */
66 nports = joystick.CountDevices(); 68 nports = joystick.CountDevices ();
67 numjoysticks = 0; 69 numjoysticks = 0;
68 SDL_memset(SDL_joyport, 0, (sizeof SDL_joyport)); 70 SDL_memset (SDL_joyport, 0, (sizeof SDL_joyport));
69 SDL_memset(SDL_joyname, 0, (sizeof SDL_joyname)); 71 SDL_memset (SDL_joyname, 0, (sizeof SDL_joyname));
70 for ( i=0; (SDL_numjoysticks < MAX_JOYSTICKS) && (i < nports); ++i ) { 72 for (i = 0; (SDL_numjoysticks < MAX_JOYSTICKS) && (i < nports); ++i)
71 if ( joystick.GetDeviceName(i, name) == B_OK ) { 73 {
72 if ( joystick.Open(name) != B_ERROR ) { 74 if (joystick.GetDeviceName (i, name) == B_OK) {
73 BString stick_name; 75 if (joystick.Open (name) != B_ERROR) {
74 joystick.GetControllerName(&stick_name); 76 BString stick_name;
75 SDL_joyport[numjoysticks] = strdup(name); 77 joystick.GetControllerName (&stick_name);
76 SDL_joyname[numjoysticks] = 78 SDL_joyport[numjoysticks] = strdup (name);
77 strdup(stick_name.String()); 79 SDL_joyname[numjoysticks] =
78 numjoysticks++; 80 strdup (stick_name.String ());
79 joystick.Close(); 81 numjoysticks++;
80 } 82 joystick.Close ();
81 } 83 }
82 } 84 }
83 return(numjoysticks); 85 }
84 } 86 return (numjoysticks);
87 }
85 88
86 /* Function to get the device-dependent name of a joystick */ 89 /* Function to get the device-dependent name of a joystick */
87 const char *SDL_SYS_JoystickName(int index) 90 const char *SDL_SYS_JoystickName (int index)
88 { 91 {
89 return SDL_joyname[index]; 92 return SDL_joyname[index];
90 } 93 }
91 94
92 /* Function to open a joystick for use. 95 /* Function to open a joystick for use.
93 The joystick to open is specified by the index field of the joystick. 96 The joystick to open is specified by the index field of the joystick.
94 This should fill the nbuttons and naxes fields of the joystick structure. 97 This should fill the nbuttons and naxes fields of the joystick structure.
95 It returns 0, or -1 if there is an error. 98 It returns 0, or -1 if there is an error.
96 */ 99 */
97 int SDL_SYS_JoystickOpen(SDL_Joystick *joystick) 100 int SDL_SYS_JoystickOpen (SDL_Joystick * joystick)
98 { 101 {
99 BJoystick *stick; 102 BJoystick *stick;
100 103
101 /* Create the joystick data structure */ 104 /* Create the joystick data structure */
102 joystick->hwdata = (struct joystick_hwdata *) 105 joystick->hwdata = (struct joystick_hwdata *)
103 SDL_malloc(sizeof(*joystick->hwdata)); 106 SDL_malloc (sizeof (*joystick->hwdata));
104 if ( joystick->hwdata == NULL ) { 107 if (joystick->hwdata == NULL) {
105 SDL_OutOfMemory(); 108 SDL_OutOfMemory ();
106 return(-1); 109 return (-1);
107 } 110 }
108 SDL_memset(joystick->hwdata, 0, sizeof(*joystick->hwdata)); 111 SDL_memset (joystick->hwdata, 0, sizeof (*joystick->hwdata));
109 stick = new BJoystick; 112 stick = new BJoystick;
110 joystick->hwdata->stick = stick; 113 joystick->hwdata->stick = stick;
111 114
112 /* Open the requested joystick for use */ 115 /* Open the requested joystick for use */
113 if ( stick->Open(SDL_joyport[joystick->index]) == B_ERROR ) { 116 if (stick->Open (SDL_joyport[joystick->index]) == B_ERROR) {
114 SDL_SetError("Unable to open joystick"); 117 SDL_SetError ("Unable to open joystick");
115 SDL_SYS_JoystickClose(joystick); 118 SDL_SYS_JoystickClose (joystick);
116 return(-1); 119 return (-1);
117 } 120 }
118 121
119 /* Set the joystick to calibrated mode */ 122 /* Set the joystick to calibrated mode */
120 stick->EnableCalibration(); 123 stick->EnableCalibration ();
121 124
122 /* Get the number of buttons, hats, and axes on the joystick */ 125 /* Get the number of buttons, hats, and axes on the joystick */
123 joystick->nbuttons = stick->CountButtons(); 126 joystick->nbuttons = stick->CountButtons ();
124 joystick->naxes = stick->CountAxes(); 127 joystick->naxes = stick->CountAxes ();
125 joystick->nhats = stick->CountHats(); 128 joystick->nhats = stick->CountHats ();
126 129
127 joystick->hwdata->new_axes = (int16 *) 130 joystick->hwdata->new_axes = (int16 *)
128 SDL_malloc(joystick->naxes*sizeof(int16)); 131 SDL_malloc (joystick->naxes * sizeof (int16));
129 joystick->hwdata->new_hats = (uint8 *) 132 joystick->hwdata->new_hats = (uint8 *)
130 SDL_malloc(joystick->nhats*sizeof(uint8)); 133 SDL_malloc (joystick->nhats * sizeof (uint8));
131 if ( ! joystick->hwdata->new_hats || ! joystick->hwdata->new_axes ) { 134 if (!joystick->hwdata->new_hats || !joystick->hwdata->new_axes) {
132 SDL_OutOfMemory(); 135 SDL_OutOfMemory ();
133 SDL_SYS_JoystickClose(joystick); 136 SDL_SYS_JoystickClose (joystick);
134 return(-1); 137 return (-1);
135 } 138 }
136 139
137 /* We're done! */ 140 /* We're done! */
138 return(0); 141 return (0);
139 } 142 }
140 143
141 /* Function to update the state of a joystick - called as a device poll. 144 /* Function to update the state of a joystick - called as a device poll.
142 * This function shouldn't update the joystick structure directly, 145 * This function shouldn't update the joystick structure directly,
143 * but instead should call SDL_PrivateJoystick*() to deliver events 146 * but instead should call SDL_PrivateJoystick*() to deliver events
144 * and update joystick device state. 147 * and update joystick device state.
145 */ 148 */
146 void SDL_SYS_JoystickUpdate(SDL_Joystick *joystick) 149 void SDL_SYS_JoystickUpdate (SDL_Joystick * joystick)
147 { 150 {
148 static const Uint8 hat_map[9] = { 151 static const Uint8 hat_map[9] = {
149 SDL_HAT_CENTERED, 152 SDL_HAT_CENTERED,
150 SDL_HAT_UP, 153 SDL_HAT_UP,
151 SDL_HAT_RIGHTUP, 154 SDL_HAT_RIGHTUP,
152 SDL_HAT_RIGHT, 155 SDL_HAT_RIGHT,
153 SDL_HAT_RIGHTDOWN, 156 SDL_HAT_RIGHTDOWN,
154 SDL_HAT_DOWN, 157 SDL_HAT_DOWN,
155 SDL_HAT_LEFTDOWN, 158 SDL_HAT_LEFTDOWN,
156 SDL_HAT_LEFT, 159 SDL_HAT_LEFT,
157 SDL_HAT_LEFTUP 160 SDL_HAT_LEFTUP
158 }; 161 };
159 const int JITTER = (32768/10); /* 10% jitter threshold (ok?) */ 162 const int JITTER = (32768 / 10); /* 10% jitter threshold (ok?) */
160 163
161 BJoystick *stick; 164 BJoystick *stick;
162 int i, change; 165 int i, change;
163 int16 *axes; 166 int16 *axes;
164 uint8 *hats; 167 uint8 *hats;
165 uint32 buttons; 168 uint32 buttons;
166 169
167 /* Set up data pointers */ 170 /* Set up data pointers */
168 stick = joystick->hwdata->stick; 171 stick = joystick->hwdata->stick;
169 axes = joystick->hwdata->new_axes; 172 axes = joystick->hwdata->new_axes;
170 hats = joystick->hwdata->new_hats; 173 hats = joystick->hwdata->new_hats;
171 174
172 /* Get the new joystick state */ 175 /* Get the new joystick state */
173 stick->Update(); 176 stick->Update ();
174 stick->GetAxisValues(axes); 177 stick->GetAxisValues (axes);
175 stick->GetHatValues(hats); 178 stick->GetHatValues (hats);
176 buttons = stick->ButtonValues(); 179 buttons = stick->ButtonValues ();
177 180
178 /* Generate axis motion events */ 181 /* Generate axis motion events */
179 for ( i=0; i<joystick->naxes; ++i ) { 182 for (i = 0; i < joystick->naxes; ++i) {
180 change = ((int32)axes[i] - joystick->axes[i]); 183 change = ((int32) axes[i] - joystick->axes[i]);
181 if ( (change > JITTER) || (change < -JITTER) ) { 184 if ((change > JITTER) || (change < -JITTER)) {
182 SDL_PrivateJoystickAxis(joystick, i, axes[i]); 185 SDL_PrivateJoystickAxis (joystick, i, axes[i]);
183 } 186 }
184 } 187 }
185 188
186 /* Generate hat change events */ 189 /* Generate hat change events */
187 for ( i=0; i<joystick->nhats; ++i ) { 190 for (i = 0; i < joystick->nhats; ++i) {
188 if ( hats[i] != joystick->hats[i] ) { 191 if (hats[i] != joystick->hats[i]) {
189 SDL_PrivateJoystickHat(joystick, i, hat_map[hats[i]]); 192 SDL_PrivateJoystickHat (joystick, i, hat_map[hats[i]]);
190 } 193 }
191 } 194 }
192 195
193 /* Generate button events */ 196 /* Generate button events */
194 for ( i=0; i<joystick->nbuttons; ++i ) { 197 for (i = 0; i < joystick->nbuttons; ++i) {
195 if ( (buttons&0x01) != joystick->buttons[i] ) { 198 if ((buttons & 0x01) != joystick->buttons[i]) {
196 SDL_PrivateJoystickButton(joystick, i, (buttons&0x01)); 199 SDL_PrivateJoystickButton (joystick, i, (buttons & 0x01));
197 } 200 }
198 buttons >>= 1; 201 buttons >>= 1;
199 } 202 }
200 } 203 }
201 204
202 /* Function to close a joystick after use */ 205 /* Function to close a joystick after use */
203 void SDL_SYS_JoystickClose(SDL_Joystick *joystick) 206 void SDL_SYS_JoystickClose (SDL_Joystick * joystick)
204 { 207 {
205 if ( joystick->hwdata ) { 208 if (joystick->hwdata) {
206 joystick->hwdata->stick->Close(); 209 joystick->hwdata->stick->Close ();
207 delete joystick->hwdata->stick; 210 delete joystick->hwdata->stick;
208 if ( joystick->hwdata->new_hats ) { 211 if (joystick->hwdata->new_hats) {
209 SDL_free(joystick->hwdata->new_hats); 212 SDL_free (joystick->hwdata->new_hats);
210 } 213 }
211 if ( joystick->hwdata->new_axes ) { 214 if (joystick->hwdata->new_axes) {
212 SDL_free(joystick->hwdata->new_axes); 215 SDL_free (joystick->hwdata->new_axes);
213 } 216 }
214 SDL_free(joystick->hwdata); 217 SDL_free (joystick->hwdata);
215 joystick->hwdata = NULL; 218 joystick->hwdata = NULL;
216 } 219 }
217 } 220 }
218 221
219 /* Function to perform any system-specific joystick related cleanup */ 222 /* Function to perform any system-specific joystick related cleanup */
220 void SDL_SYS_JoystickQuit(void) 223 void SDL_SYS_JoystickQuit (void)
221 { 224 {
222 int i; 225 int i;
223 226
224 for ( i=0; SDL_joyport[i]; ++i ) { 227 for (i = 0; SDL_joyport[i]; ++i) {
225 SDL_free(SDL_joyport[i]); 228 SDL_free (SDL_joyport[i]);
226 } 229 }
227 SDL_joyport[0] = NULL; 230 SDL_joyport[0] = NULL;
228 231
229 for ( i=0; SDL_joyname[i]; ++i ) { 232 for (i = 0; SDL_joyname[i]; ++i) {
230 SDL_free(SDL_joyname[i]); 233 SDL_free (SDL_joyname[i]);
231 } 234 }
232 SDL_joyname[0] = NULL; 235 SDL_joyname[0] = NULL;
233 } 236 }
234 237
235 }; // extern "C" 238 }; // extern "C"
236 239
237 #endif /* SDL_JOYSTICK_BEOS */ 240 #endif /* SDL_JOYSTICK_BEOS */
241 /* vi: set ts=4 sw=4 expandtab: */