improved virtual buttons for touch devices (Android)
[rocksndiamonds.git] / src / libgame / joystick.c
index 4bca889366acfa85edcd7e25305693a288587fb0..92eec0e352e9f13e84115756556f818d1b0fe2eb 100644 (file)
@@ -1,15 +1,13 @@
-/***********************************************************
-* 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
@@ -56,7 +46,7 @@ void translate_joyname(int *joysymbol, char **name, int mode)
   {
     *name = "[undefined]";
 
-    for (i=0; i<6; i++)
+    for (i = 0; i < 6; i++)
     {
       if (*joysymbol == translate_joy[i].joysymbol)
       {
@@ -69,9 +59,9 @@ void translate_joyname(int *joysymbol, char **name, int mode)
   {
     *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;
@@ -129,208 +119,34 @@ char *getDeviceNameFromJoystickNr(int joystick_nr)
          joystick_device_name[joystick_nr] : "");
 }
 
-#if !defined(PLATFORM_MSDOS)
-static int JoystickPosition(int middle, int margin, int actual)
+static int JoystickPositionPercent(int center, int border, int actual)
 {
-  long range, pos;
-  int percentage;
+  int range, position;
+  int percent;
 
-  if (margin < middle && actual > middle)
+  if (border < center && actual > center)
     return 0;
-  if (margin > middle && actual < middle)
+  if (border > center && actual < center)
     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);
-}
-
-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)
-  {
-    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;
-  }
-}
-
-int Get_SDL_Joystick_Axis(int nr, int axis)
-{
-  if (nr < 0 || nr > MAX_PLAYERS)
-    return 0;
-
-  if (axis < 0 || axis > 1)
-    return 0;
-
-  return sdl_js_axis[nr][axis];
-}
-
-void CheckJoystickData()
-{
-}
-
-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 js_x,js_y, js_b1,js_b2;
-  int left, right, up, down;
-  int result = 0;
-
-  if (joystick.status != JOYSTICK_ACTIVATED)
-    return 0;
-
-  if (!setup.input[player_nr].use_joystick ||
-      !Check_SDL_JoystickOpened(joystick_nr))
-    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);
+  range = ABS(border - center);
+  position = ABS(actual - center);
 
-  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;
+  percent = (int)(position * 100 / range);
 
-  if (js_b1)
-    result |= JOY_BUTTON_1;
-  if (js_b2)
-    result |= JOY_BUTTON_2;
-
-
-
-#if 0
-  printf("result == 0x%08x\n", result);
-#endif
+  if (percent > 100)
+    percent = 100;
 
-
-
-  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)
@@ -343,62 +159,37 @@ void CheckJoystickData()
   }
 }
 
-#if defined(PLATFORM_UNIX)
 int Joystick(int player_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 js_x, js_y;
+  boolean js_b1, js_b2;
   int left, right, up, down;
-  int result = 0;
+  int result = JOY_NO_ACTION;
 
   if (joystick.status != JOYSTICK_ACTIVATED)
-    return 0;
+    return JOY_NO_ACTION;
 
   if (joystick_fd < 0 || !setup.input[player_nr].use_joystick)
-    return 0;
+    return JOY_NO_ACTION;
 
-  if (read(joystick_fd, &joy_ctrl, sizeof(joy_ctrl)) != sizeof(joy_ctrl))
+  if (!ReadJoystick(joystick_fd, &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;
@@ -417,74 +208,6 @@ int Joystick(int player_nr)
   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;
-}
-#endif /* PLATFORM_MSDOS */
-
-#endif /* !TARGET_SDL */
-
 int JoystickButton(int player_nr)
 {
   static int last_joy_button[MAX_PLAYERS] = { 0, 0, 0, 0 };
@@ -515,17 +238,8 @@ int AnyJoystick()
   int i;
   int result = 0;
 
-  for (i=0; i<MAX_PLAYERS; i++)
-  {
-
-    /*
-    if (!setup.input[i].use_joystick)
-      continue;
-      */
-
-
+  for (i = 0; i < MAX_PLAYERS; i++)
     result |= Joystick(i);
-  }
 
   return result;
 }
@@ -533,20 +247,10 @@ int AnyJoystick()
 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);
     if (result != JOY_BUTTON_NOT_PRESSED)
       break;
@@ -555,7 +259,7 @@ int AnyJoystickButton()
   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
@@ -568,7 +272,7 @@ void DeactivateJoystickForCalibration()
     joystick.status &= ~JOYSTICK_ACTIVE;
 }
 
-void ActivateJoystickIfAvailable()
+void ActivateJoystick()
 {
   /* reactivate temporarily deactivated joystick */