1 // ============================================================================
2 // Artsoft Retro-Game Library
3 // ----------------------------------------------------------------------------
4 // (c) 1995-2014 by Artsoft Entertainment
7 // http://www.artsoft.org/
8 // ----------------------------------------------------------------------------
10 // ============================================================================
12 #if defined(PLATFORM_FREEBSD)
13 #include <machine/joystick.h>
20 /* ========================================================================= */
21 /* platform independent joystick functions */
22 /* ========================================================================= */
24 #define TRANSLATE_JOYSYMBOL_TO_JOYNAME 0
25 #define TRANSLATE_JOYNAME_TO_JOYSYMBOL 1
27 void translate_joyname(int *joysymbol, char **name, int mode)
35 { JOY_LEFT, "joystick_left" },
36 { JOY_RIGHT, "joystick_right" },
37 { JOY_UP, "joystick_up" },
38 { JOY_DOWN, "joystick_down" },
39 { JOY_BUTTON_1, "joystick_button_1" },
40 { JOY_BUTTON_2, "joystick_button_2" },
45 if (mode == TRANSLATE_JOYSYMBOL_TO_JOYNAME)
47 *name = "[undefined]";
49 for (i = 0; i < 6; i++)
51 if (*joysymbol == translate_joy[i].joysymbol)
53 *name = translate_joy[i].name;
58 else if (mode == TRANSLATE_JOYNAME_TO_JOYSYMBOL)
62 for (i = 0; i < 6; i++)
64 if (strEqual(*name, translate_joy[i].name))
66 *joysymbol = translate_joy[i].joysymbol;
73 char *getJoyNameFromJoySymbol(int joysymbol)
77 translate_joyname(&joysymbol, &name, TRANSLATE_JOYSYMBOL_TO_JOYNAME);
81 int getJoySymbolFromJoyName(char *name)
85 translate_joyname(&joysymbol, &name, TRANSLATE_JOYNAME_TO_JOYSYMBOL);
89 int getJoystickNrFromDeviceName(char *device_name)
94 if (device_name == NULL || device_name[0] == '\0')
97 c = device_name[strlen(device_name) - 1];
99 if (c >= '0' && c <= '9')
100 joystick_nr = (int)(c - '0');
102 if (joystick_nr < 0 || joystick_nr >= MAX_PLAYERS)
108 char *getDeviceNameFromJoystickNr(int joystick_nr)
110 static char *joystick_device_name[MAX_PLAYERS] =
118 return (joystick_nr >= 0 && joystick_nr <= 3 ?
119 joystick_device_name[joystick_nr] : "");
122 static int JoystickPositionPercent(int center, int border, int actual)
127 if (border < center && actual > center)
129 if (border > center && actual < center)
132 range = ABS(border - center);
133 position = ABS(actual - center);
135 percent = (int)(position * 100 / range);
143 void CheckJoystickData()
148 for (i = 0; i < MAX_PLAYERS; i++)
150 if (setup.input[i].joy.xleft >= setup.input[i].joy.xmiddle)
151 setup.input[i].joy.xleft = setup.input[i].joy.xmiddle - distance;
152 if (setup.input[i].joy.xright <= setup.input[i].joy.xmiddle)
153 setup.input[i].joy.xright = setup.input[i].joy.xmiddle + distance;
155 if (setup.input[i].joy.yupper >= setup.input[i].joy.ymiddle)
156 setup.input[i].joy.yupper = setup.input[i].joy.ymiddle - distance;
157 if (setup.input[i].joy.ylower <= setup.input[i].joy.ymiddle)
158 setup.input[i].joy.ylower = setup.input[i].joy.ymiddle + distance;
162 int JoystickExt(int player_nr, boolean use_as_joystick_nr)
164 int joystick_nr = joystick.nr[player_nr];
166 boolean js_b1, js_b2;
167 int left, right, up, down;
168 int result = JOY_NO_ACTION;
170 if (use_as_joystick_nr)
171 joystick_nr = player_nr;
173 if (joystick.status != JOYSTICK_ACTIVATED)
174 return JOY_NO_ACTION;
177 return JOY_NO_ACTION;
179 if (!ReadJoystick(joystick_nr, &js_x, &js_y, &js_b1, &js_b2))
181 Error(ERR_WARN, "cannot read joystick device '%s'",
182 setup.input[player_nr].joy.device_name);
184 joystick.status = JOYSTICK_NOT_AVAILABLE;
185 return JOY_NO_ACTION;
188 left = JoystickPositionPercent(setup.input[player_nr].joy.xmiddle,
189 setup.input[player_nr].joy.xleft, js_x);
190 right = JoystickPositionPercent(setup.input[player_nr].joy.xmiddle,
191 setup.input[player_nr].joy.xright, js_x);
192 up = JoystickPositionPercent(setup.input[player_nr].joy.ymiddle,
193 setup.input[player_nr].joy.yupper, js_y);
194 down = JoystickPositionPercent(setup.input[player_nr].joy.ymiddle,
195 setup.input[player_nr].joy.ylower, js_y);
197 if (left > JOYSTICK_PERCENT)
199 else if (right > JOYSTICK_PERCENT)
201 if (up > JOYSTICK_PERCENT)
203 else if (down > JOYSTICK_PERCENT)
207 result |= JOY_BUTTON_1;
209 result |= JOY_BUTTON_2;
214 int Joystick(int player_nr)
216 return JoystickExt(player_nr, FALSE);
219 int JoystickButtonExt(int player_nr, boolean use_as_joystick_nr)
221 static int last_joy_button[MAX_PLAYERS] = { 0, 0, 0, 0 };
222 int joy_button = (JoystickExt(player_nr, use_as_joystick_nr) & JOY_BUTTON);
227 if (last_joy_button[player_nr])
228 result = JOY_BUTTON_PRESSED;
230 result = JOY_BUTTON_NEW_PRESSED;
234 if (last_joy_button[player_nr])
235 result = JOY_BUTTON_NEW_RELEASED;
237 result = JOY_BUTTON_NOT_PRESSED;
240 last_joy_button[player_nr] = joy_button;
244 int JoystickButton(int player_nr)
246 return JoystickButtonExt(player_nr, FALSE);
254 for (i = 0; i < MAX_PLAYERS; i++)
255 result |= JoystickExt(i, TRUE);
260 int AnyJoystickButton()
263 int result = JOY_BUTTON_NOT_PRESSED;
265 for (i = 0; i < MAX_PLAYERS; i++)
267 result = JoystickButtonExt(i, TRUE);
268 if (result != JOY_BUTTON_NOT_PRESSED)
275 void DeactivateJoystick()
277 /* Temporarily deactivate joystick. This is needed for calibration
278 screens, where the player has to select a joystick device that
279 should be calibrated. If there is a totally uncalibrated joystick
280 active, it may be impossible (due to messed up input from joystick)
281 to select the joystick device to calibrate even when trying to use
282 the mouse or keyboard to select the device. */
284 if (joystick.status & JOYSTICK_AVAILABLE)
285 joystick.status &= ~JOYSTICK_ACTIVE;
288 void ActivateJoystick()
290 /* reactivate temporarily deactivated joystick */
292 if (joystick.status & JOYSTICK_AVAILABLE)
293 joystick.status |= JOYSTICK_ACTIVE;