-/***********************************************************
-* Artsoft Retro-Game Library *
-*----------------------------------------------------------*
-* (c) 1995-2002 Artsoft Entertainment *
-* Holger Schemel *
-* Detmolder Strasse 189 *
-* 33604 Bielefeld *
-* Germany *
-* e-mail: info@artsoft.org *
-*----------------------------------------------------------*
-* joystick.c *
-***********************************************************/
+// ============================================================================
+// Artsoft Retro-Game Library
+// ----------------------------------------------------------------------------
+// (c) 1995-2014 by Artsoft Entertainment
+// Holger Schemel
+// info@artsoft.org
+// http://www.artsoft.org/
+// ----------------------------------------------------------------------------
+// joystick.c
+// ============================================================================
#if defined(PLATFORM_FREEBSD)
#include <machine/joystick.h>
#include "misc.h"
+/* ========================================================================= */
+/* platform independent joystick functions */
+/* ========================================================================= */
+
#define TRANSLATE_JOYSYMBOL_TO_JOYNAME 0
#define TRANSLATE_JOYNAME_TO_JOYSYMBOL 1
-#if 0
-static int joystick_device = 0;
-char *joystick_device_name[MAX_PLAYERS] =
-{
- DEV_JOYSTICK_0,
- DEV_JOYSTICK_1,
- DEV_JOYSTICK_2,
- DEV_JOYSTICK_3
-};
-#endif
-
-
void translate_joyname(int *joysymbol, char **name, int mode)
{
static struct
{
*name = "[undefined]";
- for (i=0; i<6; i++)
+ for (i = 0; i < 6; i++)
{
if (*joysymbol == translate_joy[i].joysymbol)
{
{
*joysymbol = 0;
- for (i=0; i<6; i++)
+ for (i = 0; i < 6; i++)
{
- if (strcmp(*name, translate_joy[i].name) == 0)
+ if (strEqual(*name, translate_joy[i].name))
{
*joysymbol = translate_joy[i].joysymbol;
break;
joystick_device_name[joystick_nr] : "");
}
-#if !defined(PLATFORM_MSDOS)
-static int JoystickPosition(int middle, int margin, int actual)
+char *getFormattedJoystickName(const char *name_raw)
{
- long range, pos;
- int percentage;
+ static char name[MAX_JOYSTICK_NAME_LEN + 1];
+ boolean name_skip_space = TRUE;
+ int i, j;
- if (margin < middle && actual > middle)
- return 0;
- if (margin > middle && actual < middle)
- return 0;
-
- range = ABS(margin - middle);
- pos = ABS(actual - middle);
- percentage = (int)(pos * 100 / range);
-
- if (percentage > 100)
- percentage = 100;
-
- return percentage;
-}
-#endif
-
-#if defined(TARGET_SDL)
-
-static SDL_Joystick *sdl_joystick[MAX_PLAYERS] = { NULL, NULL, NULL, NULL };
-static int sdl_js_axis[MAX_PLAYERS][2] = { {0, 0}, {0, 0}, {0, 0}, {0, 0} };
-static int sdl_js_button[MAX_PLAYERS][2] = { {0, 0}, {0, 0}, {0, 0}, {0, 0} };
-
-SDL_Joystick *Get_SDL_Joystick(int nr)
-{
- return sdl_joystick[nr];
-}
-
-boolean Open_SDL_Joystick(int nr)
-{
- if (nr < 0 || nr > MAX_PLAYERS)
- return FALSE;
-
- return ((sdl_joystick[nr] = SDL_JoystickOpen(nr)) == NULL ? FALSE : TRUE);
-}
+ if (name_raw == NULL)
+ name_raw = "(unknown joystick)";
-void Close_SDL_Joystick(int nr)
-{
- if (nr < 0 || nr > MAX_PLAYERS)
- return;
-
- SDL_JoystickClose(sdl_joystick[nr]);
-}
-
-boolean Check_SDL_JoystickOpened(int nr)
-{
- if (nr < 0 || nr > MAX_PLAYERS)
- return FALSE;
-
- return (SDL_JoystickOpened(nr) ? TRUE : FALSE);
-}
-
-void HandleJoystickEvent(Event *event)
-{
- switch(event->type)
+ // copy joystick name, cutting leading and multiple spaces
+ for (i = 0, j = 0; i < strlen(name_raw) && i < MAX_JOYSTICK_NAME_LEN; i++)
{
- case SDL_JOYAXISMOTION:
- if (event->jaxis.axis < 2)
- {
- sdl_js_axis[event->jaxis.which][event->jaxis.axis]= event->jaxis.value;
-
-#if 0
- printf("js_%d %s-axis: %d\n",
- event->jaxis.which,
- (event->jaxis.axis == 0 ? "x" : "y"),
- event->jaxis.value);
-#endif
- }
- break;
-
- case SDL_JOYBUTTONDOWN:
- if (event->jbutton.button < 2)
- {
- sdl_js_button[event->jbutton.which][event->jbutton.button] = TRUE;
-
-#if 0
- printf("js_%d button %d: pressed\n",
- event->jbutton.which,
- event->jbutton.button);
-#endif
- }
- break;
-
- case SDL_JOYBUTTONUP:
- if (event->jbutton.button < 2)
- {
- sdl_js_button[event->jbutton.which][event->jbutton.button] = FALSE;
-
-#if 0
- printf("js_%d button %d: released\n",
- event->jbutton.which,
- event->jbutton.button);
-#endif
- }
- break;
-
- default:
- break;
+ if (name_raw[i] != ' ')
+ {
+ name[j++] = name_raw[i];
+ name_skip_space = FALSE;
+ }
+ else if (!name_skip_space)
+ {
+ name[j++] = name_raw[i];
+ name_skip_space = TRUE;
+ }
}
-}
-
-int Get_SDL_Joystick_Axis(int nr, int axis)
-{
- if (nr < 0 || nr > MAX_PLAYERS)
- return 0;
- if (axis < 0 || axis > 1)
- return 0;
+ // cut trailing space
+ if (j > 0 && name[j - 1] == ' ')
+ j--;
- return sdl_js_axis[nr][axis];
-}
+ name[j] = '\0';
-void CheckJoystickData()
-{
+ return name;
}
-int Joystick(int player_nr)
+static int JoystickPositionPercent(int center, int border, int actual)
{
-#if 0
- int joystick_nr = stored_player[player_nr].joystick_fd;
-#else
- int joystick_nr = joystick.fd[player_nr];
-#endif
- int js_x,js_y, js_b1,js_b2;
- int left, right, up, down;
- int result = 0;
+ int range, position;
+ int percent;
- if (joystick.status != JOYSTICK_ACTIVATED)
+ if (border < center && actual > center)
return 0;
-
- if (!setup.input[player_nr].use_joystick ||
- !Check_SDL_JoystickOpened(joystick_nr))
+ if (border > center && actual < center)
return 0;
- js_x = sdl_js_axis[joystick_nr][0];
- js_y = sdl_js_axis[joystick_nr][1];
-
- js_b1 = sdl_js_button[joystick_nr][0];
- js_b2 = sdl_js_button[joystick_nr][1];
-
-
-
-#if 0
- printf("JOYSTICK %d: js_x == %d, js_y == %d, js_b1 == %d, js_b2 == %d\n",
- joystick_nr, js_x, js_y, js_b1, js_b2);
-#endif
-
-
-
- left = JoystickPosition(setup.input[player_nr].joy.xmiddle,
- setup.input[player_nr].joy.xleft, js_x);
- right = JoystickPosition(setup.input[player_nr].joy.xmiddle,
- setup.input[player_nr].joy.xright, js_x);
- up = JoystickPosition(setup.input[player_nr].joy.ymiddle,
- setup.input[player_nr].joy.yupper, js_y);
- down = JoystickPosition(setup.input[player_nr].joy.ymiddle,
- setup.input[player_nr].joy.ylower, js_y);
-
- if (left > JOYSTICK_PERCENT)
- result |= JOY_LEFT;
- else if (right > JOYSTICK_PERCENT)
- result |= JOY_RIGHT;
- if (up > JOYSTICK_PERCENT)
- result |= JOY_UP;
- else if (down > JOYSTICK_PERCENT)
- result |= JOY_DOWN;
-
- if (js_b1)
- result |= JOY_BUTTON_1;
- if (js_b2)
- result |= JOY_BUTTON_2;
+ range = ABS(border - center);
+ position = ABS(actual - center);
+ percent = (int)(position * 100 / range);
+ if (percent > 100)
+ percent = 100;
-#if 0
- printf("result == 0x%08x\n", result);
-#endif
-
-
-
- return result;
+ return percent;
}
-#else /* !TARGET_SDL */
-
void CheckJoystickData()
{
int i;
int distance = 100;
- for(i=0; i<MAX_PLAYERS; i++)
+ for (i = 0; i < MAX_PLAYERS; i++)
{
- if (setup.input[i].joy.xmiddle <= distance)
- setup.input[i].joy.xmiddle = distance;
- if (setup.input[i].joy.ymiddle <= distance)
- setup.input[i].joy.ymiddle = distance;
-
if (setup.input[i].joy.xleft >= setup.input[i].joy.xmiddle)
setup.input[i].joy.xleft = setup.input[i].joy.xmiddle - distance;
if (setup.input[i].joy.xright <= setup.input[i].joy.xmiddle)
}
}
-#if defined(PLATFORM_UNIX)
-int Joystick(int player_nr)
+int JoystickExt(int player_nr, boolean use_as_joystick_nr)
{
-#if defined(PLATFORM_FREEBSD)
- struct joystick joy_ctrl;
-#else
- struct joystick_control
- {
- int buttons;
- int x;
- int y;
- } joy_ctrl;
-#endif
-
-#if 0
- int joystick_fd = stored_player[player_nr].joystick_fd;
-#else
- int joystick_fd = joystick.fd[player_nr];
-#endif
- int js_x,js_y, js_b1,js_b2;
+ int joystick_nr = joystick.nr[player_nr];
+ int js_x, js_y;
+ boolean js_b1, js_b2;
int left, right, up, down;
- int result = 0;
+ int result = JOY_NO_ACTION;
+
+ if (use_as_joystick_nr)
+ joystick_nr = player_nr;
if (joystick.status != JOYSTICK_ACTIVATED)
- return 0;
+ return JOY_NO_ACTION;
- if (joystick_fd < 0 || !setup.input[player_nr].use_joystick)
- return 0;
+ if (joystick_nr < 0)
+ return JOY_NO_ACTION;
- if (read(joystick_fd, &joy_ctrl, sizeof(joy_ctrl)) != sizeof(joy_ctrl))
+ if (!ReadJoystick(joystick_nr, &js_x, &js_y, &js_b1, &js_b2))
{
Error(ERR_WARN, "cannot read joystick device '%s'",
setup.input[player_nr].joy.device_name);
+
joystick.status = JOYSTICK_NOT_AVAILABLE;
- return 0;
+ return JOY_NO_ACTION;
}
- js_x = joy_ctrl.x;
- js_y = joy_ctrl.y;
-
-#if defined(PLATFORM_FREEBSD)
- js_b1 = joy_ctrl.b1;
- js_b2 = joy_ctrl.b2;
-#else
- js_b1 = joy_ctrl.buttons & 1;
- js_b2 = joy_ctrl.buttons & 2;
-#endif
-
- left = JoystickPosition(setup.input[player_nr].joy.xmiddle,
- setup.input[player_nr].joy.xleft, js_x);
- right = JoystickPosition(setup.input[player_nr].joy.xmiddle,
- setup.input[player_nr].joy.xright, js_x);
- up = JoystickPosition(setup.input[player_nr].joy.ymiddle,
- setup.input[player_nr].joy.yupper, js_y);
- down = JoystickPosition(setup.input[player_nr].joy.ymiddle,
- setup.input[player_nr].joy.ylower, js_y);
+ left = JoystickPositionPercent(setup.input[player_nr].joy.xmiddle,
+ setup.input[player_nr].joy.xleft, js_x);
+ right = JoystickPositionPercent(setup.input[player_nr].joy.xmiddle,
+ setup.input[player_nr].joy.xright, js_x);
+ up = JoystickPositionPercent(setup.input[player_nr].joy.ymiddle,
+ setup.input[player_nr].joy.yupper, js_y);
+ down = JoystickPositionPercent(setup.input[player_nr].joy.ymiddle,
+ setup.input[player_nr].joy.ylower, js_y);
if (left > JOYSTICK_PERCENT)
result |= JOY_LEFT;
return result;
}
-#else /* PLATFORM_MSDOS */
-
-/* allegro global variables for joystick control */
-extern int num_joysticks;
-extern JOYSTICK_INFO joy[];
-
int Joystick(int player_nr)
{
-#if 0
- int joystick_nr = stored_player[player_nr].joystick_fd;
-#else
- int joystick_nr = joystick.fd[player_nr];
-#endif
- int result = 0;
-
- if (joystick.status != JOYSTICK_ACTIVATED)
- return 0;
-
- if (joystick_nr < 0)
- return 0;
-
- /* the allegro global variable 'num_joysticks' contains the number
- of joysticks found at initialization under MS-DOS / Windows */
-
-#if 0
- if (joystick_nr >= num_joysticks || !setup.input[player_nr].use_joystick)
- return 0;
-#else
-
-#if 1
- /*
- if (joystick_nr >= num_joysticks ||
- (game_status == PLAYING && !setup.input[player_nr].use_joystick))
- return 0;
- */
-
- if (joystick_nr >= num_joysticks || !setup.input[player_nr].use_joystick)
- return 0;
-
-#else
- if (joystick_nr >= num_joysticks)
- return 0;
-#endif
-
-#endif
-
- poll_joystick();
-
- if (joy[joystick_nr].stick[0].axis[0].d1)
- result |= JOY_LEFT;
- else if (joy[joystick_nr].stick[0].axis[0].d2)
- result |= JOY_RIGHT;
- if (joy[joystick_nr].stick[0].axis[1].d1)
- result |= JOY_UP;
- else if (joy[joystick_nr].stick[0].axis[1].d2)
- result |= JOY_DOWN;
-
- if (joy[joystick_nr].button[0].b)
- result |= JOY_BUTTON_1;
- if (joy[joystick_nr].button[1].b)
- result |= JOY_BUTTON_2;
-
- return result;
+ return JoystickExt(player_nr, FALSE);
}
-#endif /* PLATFORM_MSDOS */
-#endif /* !TARGET_SDL */
-
-int JoystickButton(int player_nr)
+int JoystickButtonExt(int player_nr, boolean use_as_joystick_nr)
{
static int last_joy_button[MAX_PLAYERS] = { 0, 0, 0, 0 };
- int joy_button = (Joystick(player_nr) & JOY_BUTTON);
+ int joy_button = (JoystickExt(player_nr, use_as_joystick_nr) & JOY_BUTTON);
int result;
if (joy_button)
return result;
}
+int JoystickButton(int player_nr)
+{
+ return JoystickButtonExt(player_nr, FALSE);
+}
+
int AnyJoystick()
{
int i;
int result = 0;
- for (i=0; i<MAX_PLAYERS; i++)
- {
-
- /*
- if (!setup.input[i].use_joystick)
- continue;
- */
-
-
- result |= Joystick(i);
- }
+ for (i = 0; i < MAX_PLAYERS; i++)
+ result |= JoystickExt(i, TRUE);
return result;
}
int AnyJoystickButton()
{
int i;
- int result;
+ int result = JOY_BUTTON_NOT_PRESSED;
- for (i=0; i<MAX_PLAYERS; i++)
+ for (i = 0; i < MAX_PLAYERS; i++)
{
-
- /*
- if (!setup.input[i].use_joystick)
- continue;
- */
-
- /*
- result |= JoystickButton(i);
- */
-
- result = JoystickButton(i);
+ result = JoystickButtonExt(i, TRUE);
if (result != JOY_BUTTON_NOT_PRESSED)
break;
}
return result;
}
-void DeactivateJoystickForCalibration()
+void DeactivateJoystick()
{
/* Temporarily deactivate joystick. This is needed for calibration
screens, where the player has to select a joystick device that
joystick.status &= ~JOYSTICK_ACTIVE;
}
-void ActivateJoystickIfAvailable()
+void ActivateJoystick()
{
/* reactivate temporarily deactivated joystick */