Reformat kpad.h

This commit is contained in:
James Benton 2018-06-18 10:04:47 +01:00
parent 71c6521a38
commit 75038273b5

View File

@ -12,75 +12,137 @@
extern "C" { extern "C" {
#endif #endif
typedef WPADVec2D KPADVec2D; typedef enum WPADChan KPADChan;
typedef enum WPADDataFormat KPADDataFormat;
typedef enum WPADExtensionType KPADExtensionType;
typedef struct _KPADStatus typedef struct KPADStatus KPADStatus;
{ typedef struct KPADVec2D KPADVec2D;
//! Indicates what KPADButtons are held down
uint32_t hold;
//! Indicates what KPADButtons have been pressed since last sample typedef enum KPADError
uint32_t trigger; {
KPAD_ERROR_OK = 0,
} KPADError;
//! Indicates what KPADButtons have been released since last sample struct KPADVec2D
uint32_t release; {
float x;
uint32_t unused_1[5]; float y;
KPADVec2D pos; };
uint32_t unused_2[3]; CHECK_OFFSET(KPADVec2D, 0x00, x);
KPADVec2D angle; CHECK_OFFSET(KPADVec2D, 0x04, y);
uint32_t unused_3[8]; CHECK_SIZE(KPADVec2D, 0x08);
uint8_t device_type;
uint8_t wpad_error;
uint8_t pos_valid;
uint8_t format;
union struct KPADStatus
{ {
struct //! Indicates what KPADButtons are held down
{ uint32_t hold;
KPADVec2D stick;
} nunchuck;
struct //! Indicates what KPADButtons have been pressed since last sample
{ uint32_t trigger;
uint32_t btns_h;
uint32_t btns_d;
uint32_t btns_r;
KPADVec2D leftStick;
KPADVec2D rightStick;
float leftTrigger;
float rightTrigger;
} classic;
struct //! Indicates what KPADButtons have been released since last sample
{ uint32_t release;
uint32_t hold;
uint32_t trigger;
uint32_t release;
KPADVec2D leftStick;
KPADVec2D rightStick;
int32_t charging;
int32_t wired;
} pro;
uint32_t unused_6[20]; UNKNOWN(5 * 4);
};
uint32_t unused_7[16];
} KPADStatus;
KPADVec2D pos;
UNKNOWN(3 * 4);
KPADVec2D angle;
UNKNOWN(8 * 4);
//! Value from KPADExtensionType
uint8_t extensionType;
//! Value from KPADError
int8_t error;
uint8_t posValid;
//! Value from KPADDataFormat
uint8_t format;
// Extension data, check with extensionType to see what is valid to read
union
{
// For WPAD_EXT_NUNCHUK
struct
{
KPADVec2D stick;
} nunchuck;
// For WPAD_EXT_CLASSIC
struct
{
uint32_t hold;
uint32_t trigger;
uint32_t release;
KPADVec2D leftStick;
KPADVec2D rightStick;
float leftTrigger;
float rightTrigger;
} classic;
// For WPAD_EXT_PRO_CONTROLLER
struct
{
uint32_t hold;
uint32_t trigger;
uint32_t release;
KPADVec2D leftStick;
KPADVec2D rightStick;
int32_t charging;
int32_t wired;
} pro;
UNKNOWN(20 * 4);
};
UNKNOWN(16 * 4);
};
CHECK_OFFSET(KPADStatus, 0x00, hold);
CHECK_OFFSET(KPADStatus, 0x04, trigger);
CHECK_OFFSET(KPADStatus, 0x08, release);
CHECK_OFFSET(KPADStatus, 0x20, pos);
CHECK_OFFSET(KPADStatus, 0x34, angle);
CHECK_OFFSET(KPADStatus, 0x5C, extensionType);
CHECK_OFFSET(KPADStatus, 0x5D, error);
CHECK_OFFSET(KPADStatus, 0x5E, posValid);
CHECK_OFFSET(KPADStatus, 0x5F, format);
// For WPAD_EXT_NUNCHUK
CHECK_OFFSET(KPADStatus, 0x60, nunchuck.stick);
// For WPAD_EXT_CLASSIC
CHECK_OFFSET(KPADStatus, 0x60, classic.hold);
CHECK_OFFSET(KPADStatus, 0x64, classic.trigger);
CHECK_OFFSET(KPADStatus, 0x68, classic.release);
CHECK_OFFSET(KPADStatus, 0x6C, classic.leftStick);
CHECK_OFFSET(KPADStatus, 0x74, classic.rightStick);
CHECK_OFFSET(KPADStatus, 0x7C, classic.leftTrigger);
CHECK_OFFSET(KPADStatus, 0x80, classic.rightTrigger);
// For WPAD_EXT_PRO_CONTROLLER
CHECK_OFFSET(KPADStatus, 0x60, pro.hold);
CHECK_OFFSET(KPADStatus, 0x64, pro.trigger);
CHECK_OFFSET(KPADStatus, 0x68, pro.release);
CHECK_OFFSET(KPADStatus, 0x6C, pro.leftStick);
CHECK_OFFSET(KPADStatus, 0x74, pro.rightStick);
CHECK_OFFSET(KPADStatus, 0x7C, pro.charging);
CHECK_OFFSET(KPADStatus, 0x80, pro.wired);
CHECK_SIZE(KPADStatus, 0xF0);
void void
KPADInit (void); KPADInit();
int32_t int32_t
KPADRead(int32_t chan, KPADRead(KPADChan chan,
void * data, KPADStatus *data,
uint32_t size); uint32_t size);
int32_t int32_t
KPADReadEx(int32_t chan, KPADReadEx(KPADChan chan,
KPADStatus * data, KPADStatus *data,
uint32_t size, uint32_t size,
int32_t *error); int32_t *error);