src/joystick/SDL_sysjoystick.h
author Sam Lantinga
Tue, 03 Jan 2017 23:39:28 -0800
changeset 10745 7461fcef6ae2
parent 10737 3406a0f8b041
child 10752 c9d3ff50dfcf
permissions -rw-r--r--
Fixed binding the D-pad on some Super NES style controllers
Fixed a case where partial trigger pull could be bound to another button

There is a fundamental problem not resolved by this commit:

Some controllers have axes (triggers, pedals, etc.) that don't start at zero, but we're guaranteed that if we get a value that it's correct. For these controllers, the current code works, where we take the first value we get and use that as the zero point and generate axis motion starting from that point on.

Other controllers have digital axes (D-pad) that assume a zero starting point, and the first value we get is the min or max axis value when the D-pad is moved. For these controllers, the current code thinks that the zero point is the axis value after the D-pad motion and this doesn't work.

My hypothesis is that the first class of devices is more common and that we should solve for that, and add an exception to SDL_JoystickAxesCenteredAtZero() as needed for the second class of devices.
slouken@0
     1
/*
slouken@5535
     2
  Simple DirectMedia Layer
slouken@10737
     3
  Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
slouken@0
     4
slouken@5535
     5
  This software is provided 'as-is', without any express or implied
slouken@5535
     6
  warranty.  In no event will the authors be held liable for any damages
slouken@5535
     7
  arising from the use of this software.
slouken@0
     8
slouken@5535
     9
  Permission is granted to anyone to use this software for any purpose,
slouken@5535
    10
  including commercial applications, and to alter it and redistribute it
slouken@5535
    11
  freely, subject to the following restrictions:
slouken@0
    12
slouken@5535
    13
  1. The origin of this software must not be misrepresented; you must not
slouken@5535
    14
     claim that you wrote the original software. If you use this software
slouken@5535
    15
     in a product, an acknowledgment in the product documentation would be
slouken@5535
    16
     appreciated but is not required.
slouken@5535
    17
  2. Altered source versions must be plainly marked as such, and must not be
slouken@5535
    18
     misrepresented as being the original software.
slouken@5535
    19
  3. This notice may not be removed or altered from any source distribution.
slouken@0
    20
*/
icculus@8093
    21
#include "../SDL_internal.h"
slouken@0
    22
slouken@10638
    23
#ifndef SDL_sysjoystick_h_
slouken@10638
    24
#define SDL_sysjoystick_h_
slouken@8972
    25
slouken@0
    26
/* This is the system specific header for the SDL joystick API */
slouken@0
    27
slouken@0
    28
#include "SDL_joystick.h"
slouken@6690
    29
#include "SDL_joystick_c.h"
slouken@0
    30
slouken@0
    31
/* The SDL joystick structure */
slouken@10713
    32
typedef struct _SDL_JoystickAxisInfo
slouken@10713
    33
{
slouken@10745
    34
    Sint16 value;               /* Current axis states */
slouken@10745
    35
    Sint16 zero;                /* Zero point on the axis (-32768 for triggers) */
slouken@10745
    36
    SDL_bool has_initial_value; /* Whether we've seen a value on the axis yet */
slouken@10745
    37
    SDL_bool sent_initial_value; /* Whether we've sent the initial axis value */
slouken@10713
    38
} SDL_JoystickAxisInfo;
slouken@10713
    39
slouken@1895
    40
struct _SDL_Joystick
slouken@1895
    41
{
slouken@6949
    42
    SDL_JoystickID instance_id; /* Device instance, monotonically increasing from 0 */
slouken@6949
    43
    char *name;                 /* Joystick name - system dependent */
slouken@0
    44
slouken@1895
    45
    int naxes;                  /* Number of axis controls on the joystick */
slouken@10713
    46
    SDL_JoystickAxisInfo *axes;
slouken@1895
    47
slouken@1895
    48
    int nhats;                  /* Number of hats on the joystick */
slouken@1895
    49
    Uint8 *hats;                /* Current hat states */
slouken@0
    50
slouken@1895
    51
    int nballs;                 /* Number of trackballs on the joystick */
slouken@6949
    52
    struct balldelta {
slouken@1895
    53
        int dx;
slouken@1895
    54
        int dy;
slouken@1895
    55
    } *balls;                   /* Current ball motion deltas */
slouken@0
    56
slouken@1895
    57
    int nbuttons;               /* Number of buttons on the joystick */
slouken@1895
    58
    Uint8 *buttons;             /* Current button states */
slouken@1895
    59
slouken@1895
    60
    struct joystick_hwdata *hwdata;     /* Driver dependent information */
slouken@1895
    61
slouken@1895
    62
    int ref_count;              /* Reference count for multiple opens */
slouken@6949
    63
icculus@9433
    64
    SDL_bool force_recentering; /* SDL_TRUE if this device needs to have its state reset to 0 */
slouken@9884
    65
    SDL_JoystickPowerLevel epowerlevel; /* power level of this joystick, SDL_JOYSTICK_POWER_UNKNOWN if not supported */
slouken@6949
    66
    struct _SDL_Joystick *next; /* pointer to next joystick we have allocated */
slouken@0
    67
};
slouken@0
    68
slouken@0
    69
/* Function to scan the system for joysticks.
slouken@0
    70
 * Joystick 0 should be the system default joystick.
slouken@0
    71
 * This function should return the number of available joysticks, or -1
slouken@0
    72
 * on an unrecoverable fatal error.
slouken@0
    73
 */
slouken@0
    74
extern int SDL_SYS_JoystickInit(void);
slouken@0
    75
slouken@6707
    76
/* Function to return the number of joystick devices plugged in right now */
slouken@10609
    77
extern int SDL_SYS_NumJoysticks(void);
slouken@6707
    78
slouken@6707
    79
/* Function to cause any queued joystick insertions to be processed */
slouken@10609
    80
extern void SDL_SYS_JoystickDetect(void);
slouken@6707
    81
slouken@0
    82
/* Function to get the device-dependent name of a joystick */
slouken@6707
    83
extern const char *SDL_SYS_JoystickNameForDeviceIndex(int device_index);
slouken@6690
    84
slouken@6690
    85
/* Function to get the current instance id of the joystick located at device_index */
slouken@6707
    86
extern SDL_JoystickID SDL_SYS_GetInstanceIdOfDeviceIndex(int device_index);
slouken@0
    87
slouken@0
    88
/* Function to open a joystick for use.
philipp@9380
    89
   The joystick to open is specified by the device index.
slouken@0
    90
   This should fill the nbuttons and naxes fields of the joystick structure.
slouken@0
    91
   It returns 0, or -1 if there is an error.
slouken@0
    92
 */
slouken@6707
    93
extern int SDL_SYS_JoystickOpen(SDL_Joystick * joystick, int device_index);
slouken@6707
    94
slouken@6707
    95
/* Function to query if the joystick is currently attached
philipp@9380
    96
 * It returns SDL_TRUE if attached, SDL_FALSE otherwise.
slouken@6707
    97
 */
slouken@6707
    98
extern SDL_bool SDL_SYS_JoystickAttached(SDL_Joystick * joystick);
slouken@0
    99
slouken@0
   100
/* Function to update the state of a joystick - called as a device poll.
slouken@0
   101
 * This function shouldn't update the joystick structure directly,
slouken@0
   102
 * but instead should call SDL_PrivateJoystick*() to deliver events
slouken@0
   103
 * and update joystick device state.
slouken@0
   104
 */
slouken@1895
   105
extern void SDL_SYS_JoystickUpdate(SDL_Joystick * joystick);
slouken@0
   106
slouken@0
   107
/* Function to close a joystick after use */
slouken@1895
   108
extern void SDL_SYS_JoystickClose(SDL_Joystick * joystick);
slouken@0
   109
slouken@0
   110
/* Function to perform any system-specific joystick related cleanup */
slouken@0
   111
extern void SDL_SYS_JoystickQuit(void);
slouken@1978
   112
slouken@6707
   113
/* Function to return the stable GUID for a plugged in device */
slouken@6738
   114
extern SDL_JoystickGUID SDL_SYS_JoystickGetDeviceGUID(int device_index);
slouken@6690
   115
slouken@6707
   116
/* Function to return the stable GUID for a opened joystick */
slouken@6738
   117
extern SDL_JoystickGUID SDL_SYS_JoystickGetGUID(SDL_Joystick * joystick);
slouken@6690
   118
slouken@8985
   119
#if SDL_JOYSTICK_XINPUT
slouken@8920
   120
/* Function returns SDL_TRUE if this device is an XInput gamepad */
slouken@8972
   121
extern SDL_bool SDL_SYS_IsXInputGamepad_DeviceIndex(int device_index);
slouken@8985
   122
#endif
slouken@8972
   123
slouken@10638
   124
#endif /* SDL_sysjoystick_h_ */
slouken@6707
   125
slouken@1895
   126
/* vi: set ts=4 sw=4 expandtab: */