You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

107 lines
2.6 KiB

#ifndef _gamepads_h__
#define _gamepads_h__
#undef PAD_DATA_HAS_RAW
#define PAD_TYPE_NONE 0
#define PAD_TYPE_N64 4
#define PAD_TYPE_GAMECUBE 5
#define PAD_TYPE_GC_KB 6
#define N64_RAW_SIZE 4
#define GC_RAW_SIZE 8
typedef struct _n64_pad_data {
unsigned char pad_type; // PAD_TYPE_N64
char x,y;
unsigned short buttons;
#ifdef PAD_DATA_HAS_RAW
unsigned char raw_data[N64_RAW_SIZE];
#endif
} n64_pad_data;
#define N64_BTN_A 0x8000
#define N64_BTN_B 0x4000
#define N64_BTN_Z 0x2000
#define N64_BTN_START 0x1000
#define N64_BTN_DPAD_UP 0x0800
#define N64_BTN_DPAD_DOWN 0x0400
#define N64_BTN_DPAD_LEFT 0x0200
#define N64_BTN_DPAD_RIGHT 0x0100
#define N64_BTN_RSVD_LOW1 0x0080
#define N64_BTN_RSVD_LOW2 0x0040
#define N64_BTN_L 0x0020
#define N64_BTN_R 0x0010
#define N64_BTN_C_UP 0x0008
#define N64_BTN_C_DOWN 0x0004
#define N64_BTN_C_LEFT 0x0002
#define N64_BTN_C_RIGHT 0x0001
typedef struct _gc_pad_data {
unsigned char pad_type; // PAD_TYPE_GAMECUBE
char x,y,cx,cy;
unsigned char lt,rt;
unsigned short buttons;
#ifdef PAD_DATA_HAS_RAW
unsigned char raw_data[GC_RAW_SIZE];
#endif
} gc_pad_data;
#define GC_BTN_A 0x0001
#define GC_BTN_B 0x0002
#define GC_BTN_X 0x0004
#define GC_BTN_Y 0x0008
#define GC_BTN_START 0x0010
#define GC_BTN_RSVD0 0x0020
#define GC_BTN_RSVD1 0x0040
#define GC_BTN_RSVD2 0x0080
#define GC_BTN_DPAD_LEFT 0x0100
#define GC_BTN_DPAD_RIGHT 0x0200
#define GC_BTN_DPAD_DOWN 0x0400
#define GC_BTN_DPAD_UP 0x0800
#define GC_BTN_Z 0x1000
#define GC_BTN_R 0x2000
#define GC_BTN_L 0x4000
#define GC_BTN_RSVD3 0x8000
#define GC_ALL_BUTTONS (GC_BTN_START|GC_BTN_Y|GC_BTN_X|GC_BTN_B|GC_BTN_A|GC_BTN_L|GC_BTN_R|GC_BTN_Z|GC_BTN_DPAD_UP|GC_BTN_DPAD_DOWN|GC_BTN_DPAD_RIGHT|GC_BTN_DPAD_LEFT)
typedef struct _gc_keyboard_data {
unsigned char pad_type;
unsigned char keys[3];
} gc_keyboard_data;
typedef struct _gamepad_data {
union {
unsigned char pad_type; // PAD_TYPE_*
n64_pad_data n64;
gc_pad_data gc;
gc_keyboard_data gckb;
};
} gamepad_data;
#define GAMEPAD_MAX_CHANNELS 2
typedef struct {
void (*init)(unsigned char chn);
char (*update)(unsigned char chn);
char (*changed)(unsigned char chn);
void (*hotplug)(unsigned char chn);
void (*getReport)(unsigned char chn, gamepad_data *dst);
void (*setVibration)(unsigned char chn, char enable);
char (*probe)(unsigned char chn); /* return true if found */
} Gamepad;
/* What was most recently read from the controller */
extern gamepad_data last_built_report[GAMEPAD_MAX_CHANNELS];
/* What was most recently sent to the host */
extern gamepad_data last_sent_report[GAMEPAD_MAX_CHANNELS];
#endif // _gamepads_h__