#ifndef _PAD_H_ #define _PAD_H_ typedef struct _KPADData { unsigned int btns_h; unsigned int btns_d; unsigned int btns_r; unsigned int unused_1[5]; float pos_x; float pos_y; unsigned int unused_2[3]; float angle_x; float angle_y; unsigned int unused_3[8]; unsigned char device_type; unsigned char wpad_error; unsigned char pos_valid; unsigned char unused_4[1]; union { struct { float stick_x; float stick_y; } nunchuck; struct { unsigned int btns_h; unsigned int btns_d; unsigned int btns_r; float lstick_x; float lstick_y; float rstick_x; float rstick_y; float ltrigger; float rtrigger; } classic; unsigned int unused_6[20]; }; unsigned int unused_7[16]; } KPADData; #define WPAD_BUTTON_LEFT 0x0001 #define WPAD_BUTTON_RIGHT 0x0002 #define WPAD_BUTTON_DOWN 0x0004 #define WPAD_BUTTON_UP 0x0008 #define WPAD_BUTTON_PLUS 0x0010 #define WPAD_BUTTON_2 0x0100 #define WPAD_BUTTON_1 0x0200 #define WPAD_BUTTON_B 0x0400 #define WPAD_BUTTON_A 0x0800 #define WPAD_BUTTON_MINUS 0x1000 #define WPAD_BUTTON_Z 0x2000 #define WPAD_BUTTON_C 0x4000 #define WPAD_BUTTON_HOME 0x8000 #define WPAD_CLASSIC_BUTTON_UP 0x0001 #define WPAD_CLASSIC_BUTTON_LEFT 0x0002 #define WPAD_CLASSIC_BUTTON_ZR 0x0004 #define WPAD_CLASSIC_BUTTON_X 0x0008 #define WPAD_CLASSIC_BUTTON_A 0x0010 #define WPAD_CLASSIC_BUTTON_Y 0x0020 #define WPAD_CLASSIC_BUTTON_B 0x0040 #define WPAD_CLASSIC_BUTTON_ZL 0x0080 #define WPAD_CLASSIC_BUTTON_R 0x0200 #define WPAD_CLASSIC_BUTTON_PLUS 0x0400 #define WPAD_CLASSIC_BUTTON_HOME 0x0800 #define WPAD_CLASSIC_BUTTON_MINUS 0x1000 #define WPAD_CLASSIC_BUTTON_L 0x2000 #define WPAD_CLASSIC_BUTTON_DOWN 0x4000 #define WPAD_CLASSIC_BUTTON_RIGHT 0x8000 typedef struct { float x,y; } Vec2D; typedef struct { uint16_t x, y; /* Touch coordinates */ uint16_t touched; /* 1 = Touched, 0 = Not touched */ uint16_t invalid; /* 0 = All valid, 1 = X invalid, 2 = Y invalid, 3 = Both invalid? */ } VPADTPData; typedef struct { uint32_t btns_h; /* Held buttons */ uint32_t btns_d; /* Buttons that are pressed at that instant */ uint32_t btns_r; /* Released buttons */ Vec2D lstick, rstick; /* Each contains 4-byte X and Y components */ char unknown1c[0x52 - 0x1c]; /* Contains accelerometer and gyroscope data somewhere */ VPADTPData tpdata; /* Normal touchscreen data */ VPADTPData tpdata1; /* Modified touchscreen data 1 */ VPADTPData tpdata2; /* Modified touchscreen data 2 */ char unknown6a[0xa0 - 0x6a]; uint8_t volume; uint8_t battery; /* 0 to 6 */ uint8_t unk_volume; /* One less than volume */ char unknowna4[0xac - 0xa4]; } VPADData; #define VPAD_BUTTON_A 0x8000 #define VPAD_BUTTON_B 0x4000 #define VPAD_BUTTON_X 0x2000 #define VPAD_BUTTON_Y 0x1000 #define VPAD_BUTTON_LEFT 0x0800 #define VPAD_BUTTON_RIGHT 0x0400 #define VPAD_BUTTON_UP 0x0200 #define VPAD_BUTTON_DOWN 0x0100 #define VPAD_BUTTON_ZL 0x0080 #define VPAD_BUTTON_ZR 0x0040 #define VPAD_BUTTON_L 0x0020 #define VPAD_BUTTON_R 0x0010 #define VPAD_BUTTON_PLUS 0x0008 #define VPAD_BUTTON_MINUS 0x0004 #define VPAD_BUTTON_HOME 0x0002 #define VPAD_BUTTON_SYNC 0x0001 #endif