mirror of
https://github.com/zeldaret/ss
synced 2026-05-27 08:08:07 -04:00
26af4db82d
* update from dtk-template and start work towards using clangd * include <a> -> "a" * Update build.yml * remove/add non-trivial class in union warning
629 lines
23 KiB
C
629 lines
23 KiB
C
#ifndef RVL_SDK_WPAD_H
|
|
#define RVL_SDK_WPAD_H
|
|
|
|
// From
|
|
// https://github.com/muff1n1634/wpad_11dec2009/blob/3c3aa5416d15ccc5867517d9ed4aaf6d25a70e9c/include/revolution/WPAD/WPAD.h
|
|
|
|
#include "common.h"
|
|
#include "rvl/SC/scsystem.h"
|
|
#include "rvl/WPAD/WUD.h"
|
|
|
|
|
|
/*******************************************************************************
|
|
* macros
|
|
*/
|
|
|
|
#define WPAD_MAX_DPD_OBJECTS 4
|
|
|
|
#define WPAD_MIN_DPD_SENS 1
|
|
#define WPAD_MAX_DPD_SENS 5
|
|
|
|
/*******************************************************************************
|
|
* types
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
// for ease of use in ternaries
|
|
typedef s32 WPADResult;
|
|
enum WPADResult_et {
|
|
WPAD_ERR_OK = 0,
|
|
|
|
WPAD_ERR_NO_CONTROLLER = -1, /* name known from asserts */
|
|
WPAD_ERR_COMMUNICATION_ERROR = -2, // [RT3P54] has this as WPAD_ERR_BUSY
|
|
WPAD_ERR_3 = -3, // [RT3P54] has this as WPAD_ERR_TRANSFER
|
|
WPAD_ERR_INVALID = -4, /* name comes from [R89JEL] */
|
|
// WPAD_ERR_5 = -5, /* unknown */
|
|
// WPAD_ERR_6 = -6, /* unknown */
|
|
WPAD_ERR_CORRUPTED = -7, /* name comes from [R89JEL] */
|
|
|
|
#define WPAD_ESUCCESS WPAD_ERR_OK
|
|
#define WPAD_ENODEV WPAD_ERR_NO_CONTROLLER
|
|
#define WPAD_ECOMM WPAD_ERR_COMMUNICATION_ERROR
|
|
// #define WPAD_E3
|
|
#define WPAD_EINVAL WPAD_ERR_INVALID
|
|
|
|
/* maybe? i was scouring the internet for explanation and usage of this error
|
|
* macro, and it seems close enough
|
|
*
|
|
* it's not ENODATA, that's more like if you got no data, but here it's that we
|
|
* did get the data but it wasn't good
|
|
*/
|
|
#define WPAD_EBADE WPAD_ERR_CORRUPTED
|
|
|
|
// apparently enum vs literal is a thing. cool
|
|
#define WPAD_CESUCCESS (WPAD_ESUCCESS + 0)
|
|
#define WPAD_CENODEV (WPAD_ENODEV + 0)
|
|
#define WPAD_CECOMM (WPAD_ECOMM + 0)
|
|
#define WPAD_CERR_3 (WPAD_ERR_3 + 0)
|
|
#define WPAD_CEINVAL (WPAD_EINVAL + 0)
|
|
#define WPAD_CEBADE (WPAD_EBADE + 0)
|
|
};
|
|
|
|
typedef WUDLibStatus WPADLibStatus;
|
|
enum WPADLibStatus_et {
|
|
WPAD_LIB_STATUS_0 = WUD_LIB_STATUS_0,
|
|
WPAD_LIB_STATUS_1 = WUD_LIB_STATUS_1,
|
|
WPAD_LIB_STATUS_2 = WUD_LIB_STATUS_2,
|
|
WPAD_LIB_STATUS_3 = WUD_LIB_STATUS_3,
|
|
WPAD_LIB_STATUS_4 = WUD_LIB_STATUS_4,
|
|
};
|
|
|
|
// for ease of use in for loops
|
|
typedef s32 WPADChannel;
|
|
enum WPADChannel_et {
|
|
WPAD_CHAN0,
|
|
WPAD_CHAN1,
|
|
WPAD_CHAN2,
|
|
WPAD_CHAN3, /* name known from asserts */
|
|
|
|
WPAD_MAX_CONTROLLERS, /* name known from asserts */
|
|
WPAD_CHAN_INVALID = -1,
|
|
};
|
|
|
|
typedef s32 WPADDeviceType;
|
|
enum WPADDeviceType_et {
|
|
WPAD_DEV_CORE = 0,
|
|
WPAD_DEV_FS = 1,
|
|
WPAD_DEV_CLASSIC = 2, /* name known from asserts, but not value */
|
|
WPAD_DEV_BALANCE_CHECKER = 3,
|
|
WPAD_DEV_VSM = 4,
|
|
|
|
WPAD_DEV_MOTION_PLUS = 5,
|
|
WPAD_DEV_MPLS_PT_FS = 6,
|
|
WPAD_DEV_MPLS_PT_CLASSIC = 7,
|
|
|
|
WPAD_DEV_TRAIN = 16,
|
|
WPAD_DEV_GUITAR = 17,
|
|
WPAD_DEV_DRUM = 18,
|
|
WPAD_DEV_TAIKO = 19,
|
|
WPAD_DEV_TURNTABLE = 20,
|
|
|
|
// seems to be like maybe general purpose non-specific device types
|
|
// maybe this was for testing or something? idk
|
|
WPAD_DEV_BULK_1 = 21,
|
|
WPAD_DEV_BULK_2 = 22,
|
|
WPAD_DEV_BULK_3 = 23,
|
|
WPAD_DEV_BULK_4 = 24,
|
|
WPAD_DEV_BULK_5 = 25,
|
|
WPAD_DEV_BULK_6 = 26,
|
|
WPAD_DEV_BULK_7 = 27,
|
|
WPAD_DEV_BULK_8 = 28,
|
|
|
|
WPAD_DEV_MPLS_PT_UNKNOWN = 250,
|
|
|
|
WPAD_DEV_251 = 251,
|
|
WPAD_DEV_252 = 252, // invalid device mode?
|
|
WPAD_DEV_NONE =
|
|
253, // sort of like WPAD_ENODEV (see __wpadAbortInitExtension in WPADHIDParser.c)
|
|
// WPAD_DEV_254 = 254, /* unknown, doesn't seem to be used anywhere */
|
|
WPAD_DEV_INITIALIZING = 255, // see __a1_20_status_report
|
|
};
|
|
|
|
typedef u32 WPADDataFormat;
|
|
enum WPADDataFormat_et {
|
|
// see WPADiSendSetReportType and __wpadFmt2Size
|
|
WPAD_FMT_CORE_BTN = 0,
|
|
WPAD_FMT_CORE_BTN_ACC = 1,
|
|
WPAD_FMT_CORE_BTN_ACC_DPD = 2,
|
|
|
|
WPAD_FMT_FS_BTN = 3,
|
|
WPAD_FMT_FS_BTN_ACC = 4,
|
|
WPAD_FMT_FS_BTN_ACC_DPD = 5,
|
|
|
|
WPAD_FMT_CLASSIC_BTN = 6,
|
|
WPAD_FMT_CLASSIC_BTN_ACC = 7,
|
|
WPAD_FMT_CLASSIC_BTN_ACC_DPD = 8,
|
|
|
|
WPAD_FMT_BTN_ACC_DPD_EXTENDED = 9,
|
|
|
|
// extensions
|
|
WPAD_FMT_TRAIN = 10, /* name known from asserts */
|
|
WPAD_FMT_GUITAR = 11, /* name known from asserts */
|
|
WPAD_FMT_BALANCE_CHECKER = 12, /* name known from asserts */
|
|
WPAD_FMT_VSM = 13, /* name known from asserts */
|
|
// WPAD_FMT_14 = 14, /* unknown */
|
|
WPAD_FMT_DRUM = 15, /* name known from asserts */
|
|
WPAD_FMT_MOTION_PLUS = 16, // see __wpadFmt2Size
|
|
WPAD_FMT_TAIKO = 17, /* name known from asserts */
|
|
WPAD_FMT_TURNTABLE = 18, /* name known from asserts */
|
|
WPAD_FMT_BULK = 19, /* name known from asserts */
|
|
};
|
|
|
|
typedef s32 WPADDeviceMode;
|
|
enum WPADDeviceMode_et {
|
|
WPAD_DEV_MODE_NORMAL = 0,
|
|
|
|
WPAD_DEV_MODE_CLASSIC_REDUCED = 1,
|
|
WPAD_DEV_MODE_CLASSIC_EXTENDED = 2,
|
|
WPAD_DEV_MODE_CLASSIC_STANDARD = 3,
|
|
|
|
WPAD_DEV_MODE_MPLS_PT_MAIN = 4,
|
|
WPAD_DEV_MODE_MPLS_PT_FS = 5,
|
|
// WPAD_DEV_MODE_6 = 6, /* unknown */
|
|
WPAD_DEV_MODE_MPLS_PT_CLASSIC = 7,
|
|
};
|
|
|
|
// names from wiiuse/wpad.h
|
|
typedef u16 WPADButton;
|
|
enum WPADButton_et {
|
|
// H..-AB12 ...+^v><
|
|
/* NOTE: the bytes from the report are swapped when being placed into this
|
|
* format (see MAKE_BUTTON in WPADHIDParser.c)
|
|
*/
|
|
WPAD_BUTTON_LEFT = (1 << 0),
|
|
WPAD_BUTTON_RIGHT = (1 << 1),
|
|
WPAD_BUTTON_DOWN = (1 << 2),
|
|
WPAD_BUTTON_UP = (1 << 3),
|
|
WPAD_BUTTON_PLUS = (1 << 4),
|
|
// (1 << 5),
|
|
// (1 << 6),
|
|
// (1 << 7),
|
|
WPAD_BUTTON_2 = (1 << 8),
|
|
WPAD_BUTTON_1 = (1 << 9),
|
|
WPAD_BUTTON_B = (1 << 10),
|
|
WPAD_BUTTON_A = (1 << 11),
|
|
WPAD_BUTTON_MINUS = (1 << 12),
|
|
// (1 << 13), // WPAD_BUTTON_FS_Z
|
|
// (1 << 14), // WPAD_BUTTON_FS_C
|
|
WPAD_BUTTON_HOME = (1 << 15),
|
|
|
|
WPAD_BUTTON_ALL = 0x9f1f
|
|
};
|
|
|
|
// names from wiiuse/wpad.h
|
|
typedef u16 WPADExtButton;
|
|
enum WPADExtButton_et {
|
|
// Nunchuk (fight stick?)
|
|
// .CZ..... ........
|
|
/* NOTE: these bits are actually in the normal button variable, but are
|
|
* enumerated here because they are buttons for an extension
|
|
*/
|
|
WPAD_BUTTON_FS_Z = (1 << 13),
|
|
WPAD_BUTTON_FS_C = (1 << 14),
|
|
|
|
WPAD_BUTTON_FS_ALL = 0x6000,
|
|
|
|
// Classic Controller
|
|
// >vL-H+R. lBYAXr<^
|
|
WPAD_BUTTON_CL_UP = (1 << 0),
|
|
WPAD_BUTTON_CL_LEFT = (1 << 1),
|
|
WPAD_BUTTON_CL_ZR = (1 << 2),
|
|
WPAD_BUTTON_CL_X = (1 << 3),
|
|
WPAD_BUTTON_CL_A = (1 << 4),
|
|
WPAD_BUTTON_CL_Y = (1 << 5),
|
|
WPAD_BUTTON_CL_B = (1 << 6),
|
|
WPAD_BUTTON_CL_ZL = (1 << 7),
|
|
// (1 << 8),
|
|
WPAD_BUTTON_CL_FULL_R = (1 << 9),
|
|
WPAD_BUTTON_CL_PLUS = (1 << 10),
|
|
WPAD_BUTTON_CL_HOME = (1 << 11),
|
|
WPAD_BUTTON_CL_MINUS = (1 << 12),
|
|
WPAD_BUTTON_CL_FULL_L = (1 << 13),
|
|
WPAD_BUTTON_CL_DOWN = (1 << 14),
|
|
WPAD_BUTTON_CL_RIGHT = (1 << 15),
|
|
|
|
WPAD_BUTTON_CL_ALL = 0xfeff,
|
|
|
|
// Shinkansen train controller
|
|
// shares the same format as the Classic Controller
|
|
// (see WPADiExcludeButton)
|
|
WPAD_BUTTON_TR_UP = WPAD_BUTTON_CL_UP,
|
|
WPAD_BUTTON_TR_LEFT = WPAD_BUTTON_CL_LEFT,
|
|
WPAD_BUTTON_TR_ZR = WPAD_BUTTON_CL_ZR,
|
|
WPAD_BUTTON_TR_X = WPAD_BUTTON_CL_X,
|
|
WPAD_BUTTON_TR_A = WPAD_BUTTON_CL_A,
|
|
WPAD_BUTTON_TR_Y = WPAD_BUTTON_CL_Y,
|
|
WPAD_BUTTON_TR_B = WPAD_BUTTON_CL_B,
|
|
WPAD_BUTTON_TR_ZL = WPAD_BUTTON_CL_ZL,
|
|
// = WPAD_BUTTON_CL_8,
|
|
WPAD_BUTTON_TR_FULL_R = WPAD_BUTTON_CL_FULL_R,
|
|
WPAD_BUTTON_TR_PLUS = WPAD_BUTTON_CL_PLUS,
|
|
WPAD_BUTTON_TR_HOME = WPAD_BUTTON_CL_HOME,
|
|
WPAD_BUTTON_TR_MINUS = WPAD_BUTTON_CL_MINUS,
|
|
WPAD_BUTTON_TR_FULL_L = WPAD_BUTTON_CL_FULL_L,
|
|
WPAD_BUTTON_TR_DOWN = WPAD_BUTTON_CL_DOWN,
|
|
WPAD_BUTTON_TR_RIGHT = WPAD_BUTTON_CL_RIGHT,
|
|
|
|
WPAD_BUTTON_TR_ALL = WPAD_BUTTON_CL_ALL,
|
|
};
|
|
|
|
// WPADControlMotor
|
|
typedef u32 WPADMotorCommand;
|
|
enum WPADMotorCommand_et {
|
|
WPAD_MOTOR_STOP = 0, /* name known from asserts */
|
|
WPAD_MOTOR_RUMBLE = 1, /* name known from asserts */
|
|
};
|
|
|
|
// WPADControlSpeaker
|
|
typedef u32 WPADSpeakerCommand;
|
|
enum WPADSpeakerCommand_et {
|
|
WPAD_SPEAKER_DISABLE = 0,
|
|
WPAD_SPEAKER_ENABLE = 1, // might be ON? see HBMRemoteSpk.cpp
|
|
WPAD_SPEAKER_MUTE = 2,
|
|
WPAD_SPEAKER_UNMUTE = 3,
|
|
WPAD_SPEAKER_PLAY = 4, // figured out from HBM usage
|
|
|
|
// does the same thing as ENABLE? unless i'm missing something
|
|
// not used so i don't know the context
|
|
WPAD_SPEAKER_CMD_05 = 5,
|
|
};
|
|
|
|
// WPADControlDpd
|
|
typedef u32 WPADDpdCommand;
|
|
enum WPADDpdCommand_et {
|
|
WPAD_DPD_DISABLE = 0x00,
|
|
|
|
// the command here is actually the data format
|
|
WPAD_DPD_BASIC = 0x01,
|
|
WPAD_DPD_STANDARD = 0x03,
|
|
WPAD_DPD_EXTENDED = 0x05,
|
|
};
|
|
|
|
// WPADControlBLC
|
|
typedef u8 WPADBLCCommand;
|
|
enum WPADBLCCommand_et {
|
|
WPAD_BLC_DISABLE = 0x00,
|
|
WPAD_BLC_CMD_55 = 0x55,
|
|
|
|
/* NOTE: maybe? the code on this case in WPADControlBLC seems to follow what
|
|
* WiiBrew describes as the initialization sequence after the generic one
|
|
* (https://wiibrew.org/wiki/Wii_Balance_Board#Wii_Initialisation_Sequence).
|
|
*/
|
|
WPAD_BLC_ENABLE = 0xaa,
|
|
};
|
|
|
|
// WPADMPStatus::stat
|
|
typedef u8 WPADMPStatusFlags;
|
|
enum WPADMPStatusFlags_et {
|
|
WPAD_MPLS_STATUS_DATA_VALID = (1 << 7),
|
|
WPAD_MPLS_STATUS_EXTENSION_DATA_VALID = (1 << 6),
|
|
|
|
WPAD_MPLS_STATUS_YAW_SLOW_MODE = (1 << 3),
|
|
WPAD_MPLS_STATUS_PITCH_SLOW_MODE = (1 << 2),
|
|
WPAD_MPLS_STATUS_ROLL_SLOW_MODE = (1 << 1),
|
|
WPAD_MPLS_STATUS_EXTENSION_CONNECTED = (1 << 0), // just that it's present; not that it's actually being used
|
|
};
|
|
|
|
// WPADGetAccGravityUnit
|
|
typedef u32 WPADAccGravityUnitType;
|
|
enum WPADAccGravityUnitType_et {
|
|
WPAD_ACC_GRAVITY_UNIT_CORE,
|
|
WPAD_ACC_GRAVITY_UNIT_FS,
|
|
};
|
|
|
|
typedef WUDAllocFunc WPADAllocFunc;
|
|
typedef WUDFreeFunc WPADFreeFunc;
|
|
|
|
typedef void WPADInitFunc(void); // see __wpadInitSub in WPAD.c
|
|
|
|
typedef void WPADCallback(WPADChannel chan, WPADResult result);
|
|
|
|
typedef void WPADSamplingCallback(WPADChannel chan);
|
|
typedef void WPADConnectCallback(WPADChannel chan, s32 result);
|
|
typedef void WPADExtensionCallback(WPADChannel chan, WPADDeviceType devType);
|
|
|
|
typedef WUDSyncDeviceCallback WPADSimpleSyncCallback;
|
|
|
|
// [SGLEA4]/GormitiDebug.elf:.debug_info::0x79f49
|
|
typedef struct DPDObject {
|
|
s16 x; // size 0x02, offset 0x00
|
|
s16 y; // size 0x02, offset 0x02
|
|
u16 size; // size 0x02, offset 0x04
|
|
u8 traceId; // size 0x01, offset 0x06
|
|
// 1 byte padding
|
|
} DPDObject; // size 0x08
|
|
|
|
// TODO: get a specific source (name, game id)
|
|
// TODO: check library version of game that has this
|
|
// dwarfv1_megadump.txt:21551-21559
|
|
typedef struct DPDObjEx {
|
|
s16 range_x1; // size 0x02, offset 0x00
|
|
s16 range_y1; // size 0x02, offset 0x02
|
|
s16 range_x2; // size 0x02, offset 0x04
|
|
s16 range_y2; // size 0x02, offset 0x06
|
|
u16 pixel; // size 0x02, offset 0x08
|
|
s8 radius; // size 0x01, offset 0x0a
|
|
// 1 byte padding
|
|
} DPDObjEx; // size 0x0c
|
|
|
|
// [SPQE7T]/ISpyD.elf:.debug_info::0xd675b
|
|
typedef struct WPADInfo {
|
|
BOOL dpd; // size 0x04, offset 0x00
|
|
BOOL speaker; // size 0x04, offset 0x04
|
|
BOOL attach; // size 0x04, offset 0x08
|
|
BOOL lowBat; // size 0x04, offset 0x0c
|
|
BOOL nearempty; // size 0x04, offset 0x10
|
|
u8 battery; // size 0x01, offset 0x14
|
|
u8 led; // size 0x01, offset 0x15
|
|
u8 protocol; // size 0x01, offset 0x16
|
|
u8 firmware; // size 0x01, offset 0x17
|
|
} WPADInfo; // size 0x18
|
|
|
|
// [SGLEA4]/GormitiDebug.elf:.debug_info::0x7ab19
|
|
typedef struct WPADStatus {
|
|
WPADButton button; // size 0x02, offset 0x00
|
|
s16 accX; // size 0x02, offset 0x02
|
|
s16 accY; // size 0x02, offset 0x04
|
|
s16 accZ; // size 0x02, offset 0x06
|
|
DPDObject obj[WPAD_MAX_DPD_OBJECTS]; // size 0x20, offset 0x08
|
|
u8 dev; // size 0x01, offset 0x28
|
|
s8 err; // size 0x01, offset 0x29
|
|
} WPADStatus; // size 0x2a
|
|
|
|
/* The following take their initial members from WPADStatus instead of including
|
|
* an instance of it. For ease of use?
|
|
*/
|
|
|
|
// TODO: get a specific source (name, game id)
|
|
// TODO: check library version of game that has this
|
|
// dwarfv1_megadump.txt:21560-21570
|
|
typedef struct WPADStatusEx {
|
|
WPADButton button; // size 0x02, offset 0x00
|
|
s16 accX; // size 0x02, offset 0x02
|
|
s16 accY; // size 0x02, offset 0x04
|
|
s16 accZ; // size 0x02, offset 0x06
|
|
DPDObject obj[WPAD_MAX_DPD_OBJECTS]; // size 0x20, offset 0x08
|
|
u8 dev; // size 0x01, offset 0x28
|
|
s8 err; // size 0x01, offset 0x29
|
|
|
|
DPDObjEx exp[WPAD_MAX_DPD_OBJECTS]; // size 0x30, offset 0x2a
|
|
} WPADStatusEx; // size 0x5a
|
|
|
|
// [SGLEA4]/GormitiDebug.elf:.debug_info::0x79e65
|
|
typedef struct WPADFSStatus {
|
|
WPADButton button; // size 0x02, offset 0x00
|
|
s16 accX; // size 0x02, offset 0x02
|
|
s16 accY; // size 0x02, offset 0x04
|
|
s16 accZ; // size 0x02, offset 0x06
|
|
DPDObject obj[WPAD_MAX_DPD_OBJECTS]; // size 0x20, offset 0x08
|
|
u8 dev; // size 0x01, offset 0x28
|
|
s8 err; // size 0x01, offset 0x29
|
|
|
|
s16 fsAccX; // size 0x02, offset 0x2a
|
|
s16 fsAccY; // size 0x02, offset 0x2c
|
|
s16 fsAccZ; // size 0x02, offset 0x2e
|
|
s8 fsStickX; // size 0x01, offset 0x30
|
|
s8 fsStickY; // size 0x01, offset 0x31
|
|
} WPADFSStatus; // size 0x32
|
|
|
|
// [SGLEA4]/GormitiDebug.elf:.debug_info::0x7aba2
|
|
typedef struct WPADCLStatus {
|
|
WPADButton button; // size 0x02, offset 0x00
|
|
s16 accX; // size 0x02, offset 0x02
|
|
s16 accY; // size 0x02, offset 0x04
|
|
s16 accZ; // size 0x02, offset 0x06
|
|
DPDObject obj[WPAD_MAX_DPD_OBJECTS]; // size 0x20, offset 0x08
|
|
u8 dev; // size 0x01, offset 0x28
|
|
s8 err; // size 0x01, offset 0x29
|
|
|
|
WPADExtButton clButton; // size 0x02, offset 0x2a
|
|
s16 clLStickX; // size 0x02, offset 0x2c
|
|
s16 clLStickY; // size 0x02, offset 0x2e
|
|
s16 clRStickX; // size 0x02, offset 0x30
|
|
s16 clRStickY; // size 0x02, offset 0x32
|
|
u8 clTriggerL; // size 0x01, offset 0x34
|
|
u8 clTriggerR; // size 0x01, offset 0x35
|
|
} WPADCLStatus; // size 0x36
|
|
|
|
// [SGLEA4]/GormitiDebug.elf:.debug_info::0x7acba
|
|
typedef struct WPADTRStatus {
|
|
WPADButton button; // size 0x02, offset 0x00
|
|
s16 accX; // size 0x02, offset 0x02
|
|
s16 accY; // size 0x02, offset 0x04
|
|
s16 accZ; // size 0x02, offset 0x06
|
|
DPDObject obj[WPAD_MAX_DPD_OBJECTS]; // size 0x20, offset 0x08
|
|
u8 dev; // size 0x01, offset 0x28
|
|
s8 err; // size 0x01, offset 0x29
|
|
|
|
WPADExtButton trButton; // size 0x02, offset 0x2a
|
|
u8 brake; // size 0x01, offset 0x2c
|
|
u8 mascon; // size 0x01, offset 0x2d
|
|
} WPADTRStatus; // size 0x2e
|
|
|
|
// [SGLEA4]/GormitiDebug.elf:.debug_info::0x7ad79
|
|
typedef struct WPADBLStatus {
|
|
WPADButton button; // size 0x02, offset 0x00
|
|
s16 accX; // size 0x02, offset 0x02
|
|
s16 accY; // size 0x02, offset 0x04
|
|
s16 accZ; // size 0x02, offset 0x06
|
|
DPDObject obj[WPAD_MAX_DPD_OBJECTS]; // size 0x20, offset 0x08
|
|
u8 dev; // size 0x01, offset 0x28
|
|
s8 err; // size 0x01, offset 0x29
|
|
|
|
u16 press[4]; // size 0x08, offset 0x2a
|
|
s8 temp; // size 0x01, offset 0x32
|
|
u8 battery; // size 0x01, offset 0x33
|
|
} WPADBLStatus; // size 0x34
|
|
|
|
// [SGLEA4]/GormitiDebug.elf:.debug_info::0x7ae44
|
|
typedef struct WPADMPStatus {
|
|
WPADButton button; // size 0x02, offset 0x00
|
|
s16 accX; // size 0x02, offset 0x02
|
|
s16 accY; // size 0x02, offset 0x04
|
|
s16 accZ; // size 0x02, offset 0x06
|
|
DPDObject obj[WPAD_MAX_DPD_OBJECTS]; // size 0x20, offset 0x08
|
|
u8 dev; // size 0x01, offset 0x28
|
|
s8 err; // size 0x01, offset 0x29
|
|
|
|
// [SGLEA4]/GormitiDebug.elf:.debug_info::0x7af2c
|
|
union /* explicitly untagged */
|
|
{
|
|
// Takes its members from WPADFSStatus
|
|
// [SGLEA4]/GormitiDebug.elf:.debug_info::0x7af54
|
|
struct /* explicitly untagged */
|
|
{
|
|
s16 fsAccX; // size 0x02, offset 0x00
|
|
s16 fsAccY; // size 0x02, offset 0x02
|
|
s16 fsAccZ; // size 0x02, offset 0x04
|
|
s8 fsStickX; // size 0x01, offset 0x06
|
|
s8 fsStickY; // size 0x01, offset 0x07
|
|
} fs; // size 0x08
|
|
|
|
// Takes its members from WPADCLStatus
|
|
// [SGLEA4]/GormitiDebug.elf:.debug_info::0x7afbb
|
|
struct /* explicitly untagged */
|
|
{
|
|
WPADExtButton clButton; // size 0x02, offset 0x00
|
|
s16 clLStickX; // size 0x02, offset 0x02
|
|
s16 clLStickY; // size 0x02, offset 0x04
|
|
s16 clRStickX; // size 0x02, offset 0x06
|
|
s16 clRStickY; // size 0x02, offset 0x08
|
|
u8 clTriggerL; // size 0x01, offset 0x0a
|
|
u8 clTriggerR; // size 0x01, offset 0x0b
|
|
} cl; // size 0x0c
|
|
} ext; // size 0x0c, offset 0x2a
|
|
|
|
WPADMPStatusFlags stat; // size 0x01, offset 0x36
|
|
u8 reserved; // size 0x01, offset 0x37
|
|
|
|
s16 pitch; // size 0x02, offset 0x38
|
|
s16 yaw; // size 0x02, offset 0x3a
|
|
s16 roll; // size 0x02, offset 0x3c
|
|
} WPADMPStatus; // size 0x3e
|
|
|
|
// [SGLEA4]/GormitiDebug.elf:.debug_info::0x7b056
|
|
typedef struct WPADBKStatus {
|
|
WPADButton button; // size 0x02, offset 0x00
|
|
s16 accX; // size 0x02, offset 0x02
|
|
s16 accY; // size 0x02, offset 0x04
|
|
s16 accZ; // size 0x02, offset 0x06
|
|
DPDObject obj[WPAD_MAX_DPD_OBJECTS]; // size 0x20, offset 0x08
|
|
u8 dev; // size 0x01, offset 0x28
|
|
s8 err; // size 0x01, offset 0x29
|
|
|
|
byte_t bulk[21]; // size 0x15, offset 0x2a
|
|
byte_t padding[1]; // size 0x01, offset 0x3f
|
|
} WPADBKStatus; // size 0x40
|
|
|
|
typedef struct WPADVSStatus {
|
|
WPADButton button; // size 0x02, offset 0x00
|
|
s16 accX; // size 0x02, offset 0x02
|
|
s16 accY; // size 0x02, offset 0x04
|
|
s16 accZ; // size 0x02, offset 0x06
|
|
DPDObject obj[WPAD_MAX_DPD_OBJECTS]; // size 0x20, offset 0x08
|
|
u8 dev; // size 0x01, offset 0x28
|
|
s8 err; // size 0x01, offset 0x29
|
|
|
|
u16 at_0x2a[5]; // size 0x0a, offset 0x2a
|
|
u8 at_0x34; // size 0x02, offset 0x34
|
|
// 1 byte padding (alignment? probably)
|
|
u16 at_0x36[5]; // size 0x0a, offset 0x36
|
|
u8 at_0x40; // size 0x02, offset 0x40
|
|
// 1 byte padding (alignment? probably)
|
|
u16 at_0x42; // size 0x02, offset 0x42
|
|
u8 at_0x44; // size 0x01, offset 0x44
|
|
// 1 byte padding (alignment? probably)
|
|
} WPADVSStatus; // size 0x46 (see __wpadFmt2Size)
|
|
|
|
typedef struct WPADAccGravityUnit {
|
|
// probably maybe
|
|
s16 x; // size 0x02, offset 0x00
|
|
s16 y; // size 0x02, offset 0x02
|
|
s16 z; // size 0x02, offset 0x04
|
|
} WPADAccGravityUnit; // size 0x06
|
|
|
|
/*******************************************************************************
|
|
* functions
|
|
*/
|
|
|
|
BOOL WPADIsEnabledVSM(void);
|
|
BOOL WPADIsEnabledTRN(void);
|
|
BOOL WPADIsEnabledGTR(void);
|
|
BOOL WPADIsEnabledDRM(void);
|
|
BOOL WPADIsEnabledTKO(void);
|
|
BOOL WPADIsEnabledTBL(void);
|
|
BOOL WPADIsEnabledBLK(void);
|
|
|
|
// Likely overridden by a WBC-specific library
|
|
__attribute__((weak)) WPADResult WBCSetupCalibration(void);
|
|
__attribute__((weak)) signed WBCGetCalibrationStatus(void);
|
|
__attribute__((weak)) signed WBCGetBatteryLevel(u8);
|
|
__attribute__((weak)) WPADResult WBCRead(WPADBLStatus *, f64 *, int);
|
|
__attribute__((weak)) WPADResult WBCSetZEROPoint(f64 *, int);
|
|
__attribute__((weak)) WPADResult WBCGetTGCWeight(f64, f64 *, WPADBLStatus *);
|
|
|
|
void WPADInit(void);
|
|
void WPADShutdown(void);
|
|
|
|
BOOL WPADStartFastSimpleSync(void);
|
|
BOOL WPADStopSimpleSync(void);
|
|
BOOL WPADCancelSyncDevice(void);
|
|
WPADSimpleSyncCallback *WPADSetSimpleSyncCallback(WPADSimpleSyncCallback *cb);
|
|
void WPADRegisterAllocator(WPADAllocFunc *alloc, WPADFreeFunc *free);
|
|
WPADLibStatus WPADGetStatus(void);
|
|
u8 WPADGetRadioSensitivity(WPADChannel chan);
|
|
void WPADGetAddress(WPADChannel chan, BD_ADDR_PTR addr);
|
|
u8 WPADGetSensorBarPosition(void);
|
|
|
|
void WPADGetAccGravityUnit(WPADChannel chan, WPADAccGravityUnitType type, WPADAccGravityUnit *acc);
|
|
|
|
void WPADDisconnect(WPADChannel chan);
|
|
WPADResult WPADProbe(WPADChannel chan, WPADDeviceType *devTypeOut);
|
|
WPADSamplingCallback *WPADSetSamplingCallback(WPADChannel chan, WPADSamplingCallback *cb);
|
|
WPADConnectCallback *WPADSetConnectCallback(WPADChannel chan, WPADConnectCallback *cb);
|
|
WPADExtensionCallback *WPADSetExtensionCallback(WPADChannel chan, WPADExtensionCallback *cb);
|
|
WPADDataFormat WPADGetDataFormat(WPADChannel chan);
|
|
WPADResult WPADSetDataFormat(WPADChannel chan, WPADDataFormat fmt);
|
|
|
|
WPADResult WPADGetInfoAsync(WPADChannel chan, WPADInfo *info, WPADCallback *cb);
|
|
void WPADControlMotor(WPADChannel chan, WPADMotorCommand command);
|
|
void WPADEnableMotor(BOOL enabled);
|
|
BOOL WPADIsMotorEnabled(void);
|
|
WPADResult WPADControlLed(WPADChannel chan, u8 ledFlags, WPADCallback cb);
|
|
BOOL WPADSaveConfig(SCFlushCallback *cb);
|
|
|
|
/* NOTE: status should match the WPADStatus type for the channel; a check
|
|
* against the currently assigned device type is made to know how much to copy
|
|
*
|
|
* for example, if devType[chan] == WPAD_DEV_CLASSIC, status should be a
|
|
* pointer to WPADCLStatus cast to a pointer to WPADStatus
|
|
*/
|
|
void WPADRead(WPADChannel chan, WPADStatus *status);
|
|
void WPADSetAutoSamplingBuf(WPADChannel chan, void *buf, u32 length);
|
|
|
|
BOOL WPADIsSpeakerEnabled(WPADChannel chan);
|
|
WPADResult WPADControlSpeaker(WPADChannel chan, WPADSpeakerCommand command, WPADCallback *cb);
|
|
u8 WPADGetSpeakerVolume(void);
|
|
void WPADSetSpeakerVolume(u8 vol);
|
|
|
|
BOOL WPADCanSendStreamData(WPADChannel chan);
|
|
WPADResult WPADSendStreamData(WPADChannel chan, void *p_buf, u16 len);
|
|
u8 WPADGetDpdSensitivity(void);
|
|
BOOL WPADIsDpdEnabled(WPADChannel chan);
|
|
|
|
WPADResult WPADControlDpd(WPADChannel chan, WPADDpdCommand command, WPADCallback *cb);
|
|
WPADResult WPADControlBLC(WPADChannel chan, WPADBLCCommand command, WPADCallback *cb);
|
|
|
|
void WPADRecalibrate(WPADChannel chan);
|
|
BOOL WPADIsUsedCallbackByKPAD(void);
|
|
void WPADSetCallbackByKPAD(BOOL isKPAD);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // RVL_SDK_WPAD_H
|