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 Joystick(int player_nr)
164 int joystick_fd = joystick.fd[player_nr];
166 boolean js_b1, js_b2;
167 int left, right, up, down;
168 int result = JOY_NO_ACTION;
170 if (joystick.status != JOYSTICK_ACTIVATED)
171 return JOY_NO_ACTION;
173 if (joystick_fd < 0 || !setup.input[player_nr].use_joystick)
174 return JOY_NO_ACTION;
176 if (!ReadJoystick(joystick_fd, &js_x, &js_y, &js_b1, &js_b2))
178 Error(ERR_WARN, "cannot read joystick device '%s'",
179 setup.input[player_nr].joy.device_name);
181 joystick.status = JOYSTICK_NOT_AVAILABLE;
182 return JOY_NO_ACTION;
185 left = JoystickPositionPercent(setup.input[player_nr].joy.xmiddle,
186 setup.input[player_nr].joy.xleft, js_x);
187 right = JoystickPositionPercent(setup.input[player_nr].joy.xmiddle,
188 setup.input[player_nr].joy.xright, js_x);
189 up = JoystickPositionPercent(setup.input[player_nr].joy.ymiddle,
190 setup.input[player_nr].joy.yupper, js_y);
191 down = JoystickPositionPercent(setup.input[player_nr].joy.ymiddle,
192 setup.input[player_nr].joy.ylower, js_y);
194 if (left > JOYSTICK_PERCENT)
196 else if (right > JOYSTICK_PERCENT)
198 if (up > JOYSTICK_PERCENT)
200 else if (down > JOYSTICK_PERCENT)
204 result |= JOY_BUTTON_1;
206 result |= JOY_BUTTON_2;
211 int JoystickButton(int player_nr)
213 static int last_joy_button[MAX_PLAYERS] = { 0, 0, 0, 0 };
214 int joy_button = (Joystick(player_nr) & JOY_BUTTON);
219 if (last_joy_button[player_nr])
220 result = JOY_BUTTON_PRESSED;
222 result = JOY_BUTTON_NEW_PRESSED;
226 if (last_joy_button[player_nr])
227 result = JOY_BUTTON_NEW_RELEASED;
229 result = JOY_BUTTON_NOT_PRESSED;
232 last_joy_button[player_nr] = joy_button;
241 for (i = 0; i < MAX_PLAYERS; i++)
242 result |= Joystick(i);
247 int AnyJoystickButton()
250 int result = JOY_BUTTON_NOT_PRESSED;
252 for (i = 0; i < MAX_PLAYERS; i++)
254 result = JoystickButton(i);
255 if (result != JOY_BUTTON_NOT_PRESSED)
262 void DeactivateJoystick()
264 /* Temporarily deactivate joystick. This is needed for calibration
265 screens, where the player has to select a joystick device that
266 should be calibrated. If there is a totally uncalibrated joystick
267 active, it may be impossible (due to messed up input from joystick)
268 to select the joystick device to calibrate even when trying to use
269 the mouse or keyboard to select the device. */
271 if (joystick.status & JOYSTICK_AVAILABLE)
272 joystick.status &= ~JOYSTICK_ACTIVE;
275 void ActivateJoystick()
277 /* reactivate temporarily deactivated joystick */
279 if (joystick.status & JOYSTICK_AVAILABLE)
280 joystick.status |= JOYSTICK_ACTIVE;