Files
ss/include/rvl/WPAD/WPAD.h
T
Elijah Thomas 26af4db82d update from dtk-template - clangd :) (#66)
* update from dtk-template and start work towards using clangd

* include <a> -> "a"

* Update build.yml

* remove/add non-trivial class in union warning
2024-10-16 15:36:02 -04:00

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