/*---------------------------------------------------------------------------* Project: KPAD library version 2 File: kpad.h Programmers: Keizo Ohta HIRATSU Daisuke Tojo Haruki Tetsuya Sasaki Copyright (C) Nintendo. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. *---------------------------------------------------------------------------*/ #ifdef __KPADOLD_H__ #error KPAD version 2 (kpad.h) cannot be used with KPADOld (kpadOld.h) #endif #ifndef __KPAD_H__ #define __KPAD_H__ #include #include #include #include #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif #define KPAD_BUTTON_LEFT WPAD_BUTTON_LEFT #define KPAD_BUTTON_RIGHT WPAD_BUTTON_RIGHT #define KPAD_BUTTON_DOWN WPAD_BUTTON_DOWN #define KPAD_BUTTON_UP WPAD_BUTTON_UP #define KPAD_BUTTON_A WPAD_BUTTON_A #define KPAD_BUTTON_B WPAD_BUTTON_B #define KPAD_BUTTON_HOME WPAD_BUTTON_HOME #define KPAD_BUTTON_PLUS WPAD_BUTTON_PLUS #define KPAD_BUTTON_MINUS WPAD_BUTTON_MINUS #define KPAD_BUTTON_1 WPAD_BUTTON_1 #define KPAD_BUTTON_2 WPAD_BUTTON_2 #define KPAD_BUTTON_Z WPAD_BUTTON_Z #define KPAD_BUTTON_C WPAD_BUTTON_C #define KPAD_CL_BUTTON_UP WPAD_CL_BUTTON_UP #define KPAD_CL_BUTTON_LEFT WPAD_CL_BUTTON_LEFT #define KPAD_CL_TRIGGER_ZR WPAD_CL_TRIGGER_ZR #define KPAD_CL_BUTTON_ZR WPAD_CL_TRIGGER_ZR #define KPAD_CL_BUTTON_X WPAD_CL_BUTTON_X #define KPAD_CL_BUTTON_A WPAD_CL_BUTTON_A #define KPAD_CL_BUTTON_Y WPAD_CL_BUTTON_Y #define KPAD_CL_BUTTON_B WPAD_CL_BUTTON_B #define KPAD_CL_TRIGGER_ZL WPAD_CL_TRIGGER_ZL #define KPAD_CL_BUTTON_ZL WPAD_CL_TRIGGER_ZL #define KPAD_CL_RESERVED WPAD_CL_RESERVED #define KPAD_CL_TRIGGER_R WPAD_CL_TRIGGER_R #define KPAD_CL_BUTTON_R WPAD_CL_TRIGGER_R #define KPAD_CL_BUTTON_PLUS WPAD_CL_BUTTON_PLUS #define KPAD_CL_BUTTON_HOME WPAD_CL_BUTTON_HOME #define KPAD_CL_BUTTON_MINUS WPAD_CL_BUTTON_MINUS #define KPAD_CL_TRIGGER_L WPAD_CL_TRIGGER_L #define KPAD_CL_BUTTON_L WPAD_CL_TRIGGER_L #define KPAD_CL_BUTTON_DOWN WPAD_CL_BUTTON_DOWN #define KPAD_CL_BUTTON_RIGHT WPAD_CL_BUTTON_RIGHT #define KPAD_UC_BUTTON_UP WPAD_UC_BUTTON_UP #define KPAD_UC_BUTTON_LEFT WPAD_UC_BUTTON_LEFT #define KPAD_UC_TRIGGER_ZR WPAD_UC_TRIGGER_ZR #define KPAD_UC_BUTTON_ZR WPAD_UC_TRIGGER_ZR #define KPAD_UC_BUTTON_X WPAD_UC_BUTTON_X #define KPAD_UC_BUTTON_A WPAD_UC_BUTTON_A #define KPAD_UC_BUTTON_Y WPAD_UC_BUTTON_Y #define KPAD_UC_BUTTON_B WPAD_UC_BUTTON_B #define KPAD_UC_TRIGGER_ZL WPAD_UC_TRIGGER_ZL #define KPAD_UC_BUTTON_ZL WPAD_UC_TRIGGER_ZL #define KPAD_UC_RESERVED WPAD_UC_RESERVED #define KPAD_UC_TRIGGER_R WPAD_UC_TRIGGER_R #define KPAD_UC_BUTTON_R WPAD_UC_TRIGGER_R #define KPAD_UC_BUTTON_PLUS WPAD_UC_BUTTON_PLUS #define KPAD_UC_BUTTON_HOME WPAD_UC_BUTTON_HOME #define KPAD_UC_BUTTON_MINUS WPAD_UC_BUTTON_MINUS #define KPAD_UC_TRIGGER_L WPAD_UC_TRIGGER_L #define KPAD_UC_BUTTON_L WPAD_UC_TRIGGER_L #define KPAD_UC_BUTTON_DOWN WPAD_UC_BUTTON_DOWN #define KPAD_UC_BUTTON_RIGHT WPAD_UC_BUTTON_RIGHT #define KPAD_UC_BUTTON_STICK_L WPAD_UC_BUTTON_STICK_L #define KPAD_UC_BUTTON_STICK_R WPAD_UC_BUTTON_STICK_R // For emulating cross stick #define KPAD_FS_BUTTON_STICK_EMULATION_LEFT 0x00000001 #define KPAD_FS_BUTTON_STICK_EMULATION_RIGHT 0x00000002 #define KPAD_FS_BUTTON_STICK_EMULATION_DOWN 0x00000004 #define KPAD_FS_BUTTON_STICK_EMULATION_UP 0x00000008 #define KPAD_CL_BUTTON_STICK_L_EMULATION_LEFT 0x00010000 #define KPAD_CL_BUTTON_STICK_L_EMULATION_RIGHT 0x00020000 #define KPAD_CL_BUTTON_STICK_L_EMULATION_DOWN 0x00040000 #define KPAD_CL_BUTTON_STICK_L_EMULATION_UP 0x00080000 #define KPAD_CL_BUTTON_STICK_R_EMULATION_LEFT 0x00100000 #define KPAD_CL_BUTTON_STICK_R_EMULATION_RIGHT 0x00200000 #define KPAD_CL_BUTTON_STICK_R_EMULATION_DOWN 0x00400000 #define KPAD_CL_BUTTON_STICK_R_EMULATION_UP 0x00800000 #define KPAD_UC_BUTTON_STICK_L_EMULATION_LEFT 0x00040000 #define KPAD_UC_BUTTON_STICK_L_EMULATION_RIGHT 0x00080000 #define KPAD_UC_BUTTON_STICK_L_EMULATION_DOWN 0x00100000 #define KPAD_UC_BUTTON_STICK_L_EMULATION_UP 0x00200000 #define KPAD_UC_BUTTON_STICK_R_EMULATION_LEFT 0x00400000 #define KPAD_UC_BUTTON_STICK_R_EMULATION_RIGHT 0x00800000 #define KPAD_UC_BUTTON_STICK_R_EMULATION_DOWN 0x01000000 #define KPAD_UC_BUTTON_STICK_R_EMULATION_UP 0x02000000 #define KPAD_BUTTON_MASK 0x00ffffff #define KPAD_URCC_BUTTON_MASK 0x03ffffff #define KPAD_BUTTON_RPT 0x80000000 #define KPAD_RING_BUFS 16 #define KPAD_MAX_READ_BUFS KPAD_RING_BUFS #define KPAD_READ_ERR_NONE 0 #define KPAD_READ_ERR_NO_DATA -1 #define KPAD_READ_ERR_NO_CONTROLLER -2 #define KPAD_READ_ERR_SETUP -3 #define KPAD_READ_ERR_LOCKED -4 #define KPAD_READ_ERR_INIT -5 #define KPAD_WBC_ERR_EXIST 1 #define KPAD_WBC_ERR_NONE 0 #define KPAD_WBC_ERR_NO_BATTERY -1 #define KPAD_WBC_ERR_SETUP -2 #define KPAD_WBC_ERR_WRONG_TEMP -3 #define KPAD_WBC_ERR_WRONG_ZERO -4 #define KPAD_WBC_ERR_WEIGHT_OVER -5 #define KPAD_WBC_ERR_CALIBRATION -6 #define KPAD_WBC_ERR_NO_ZEROPOINT -7 #define KPAD_WBC_ERR_ZEROPOINT -8 #define KPAD_WBC_ERR_TGC_READY 1 #define KPAD_WBC_ERR_TGC_NONE 0 #define KPAD_WBC_ERR_TGC_UNSTABLE -1 #define KPAD_WBC_ERR_TGC_UNKNOWN -2 #define KPAD_WBC_ERR_TGC_TIMEOUT -3 #define KPAD_WBC_ERR_TGC_BUSY -4 typedef enum KPADPlayMode { KPAD_PLAY_MODE_LOOSE = 0, KPAD_PLAY_MODE_TIGHT } KPADPlayMode ; typedef struct Rect { f32 left; f32 top; f32 right; f32 bottom; } Rect; typedef union KPADEXStatus{ struct { Vec2 stick ; Vec acc ; f32 acc_value ; f32 acc_speed ; u32 hold ; u32 trig ; u32 release ; } fs ; struct { u32 hold ; u32 trig ; u32 release ; Vec2 lstick ; Vec2 rstick ; f32 ltrigger ; f32 rtrigger ; } cl ; struct { u32 hold ; u32 trig ; u32 release ; Vec2 lstick ; Vec2 rstick ; BOOL charge ; BOOL cable ; } uc ; struct { double tgc_weight ; double weight[ WPAD_PRESS_UNITS ] ; double weight_ave[ WPAD_PRESS_UNITS ] ; s32 weight_err ; s32 tgc_weight_err ; } bl ; struct { u32 hold ; u32 trig ; u32 release ; } cm ; } KPADEXStatus ; typedef struct KPADMPDir{ Vec X ; Vec Y ; Vec Z ; } KPADMPDir ; typedef struct KPADMPStatus{ Vec mpls ; Vec angle ; KPADMPDir dir ; } KPADMPStatus ; typedef struct KPADStatus{ u32 hold ; u32 trig ; u32 release ; Vec acc ; f32 acc_value ; f32 acc_speed ; Vec2 pos ; Vec2 vec ; f32 speed ; Vec2 horizon ; Vec2 hori_vec ; f32 hori_speed ; f32 dist ; f32 dist_vec ; f32 dist_speed ; Vec2 acc_vertical ; u8 dev_type ; s8 wpad_err ; s8 dpd_valid_fg ; u8 data_format ; KPADEXStatus ex_status ; KPADMPStatus mpls ; u8 __paddings__[ 4 ] ; } KPADStatus ; typedef struct KPADUnifiedWpadStatus { union { WPADStatus core ; WPADFSStatus fs ; WPADCLStatus cl ; WPADTRStatus tr ; WPADBLStatus bl ; WPADMPStatus mp ; WPADBKStatus bk ; WPADUCStatus uc ; WPADCMStatus cm ; } u ; u8 fmt ; u8 padding ; } KPADUnifiedWpadStatus ; void KPADInit ( void ) ; void KPADInitEx ( KPADUnifiedWpadStatus uniRingBufs[], u32 length ) ; void KPADShutdown( void ) ; void KPADReset ( void ) ; s32 KPADRead ( s32 chan, KPADStatus samplingBufs[], u32 length ) ; s32 KPADReadEx ( s32 chan, KPADStatus samplingBufs[], u32 length, s32 *err ) ; void KPADSetPosParam ( s32 chan, f32 play_radius, f32 sensitivity ) ; void KPADSetHoriParam( s32 chan, f32 play_radius, f32 sensitivity ) ; void KPADSetDistParam( s32 chan, f32 play_radius, f32 sensitivity ) ; void KPADSetAccParam ( s32 chan, f32 play_radius, f32 sensitivity ) ; void KPADSetCrossStickEmulationParamsL( s32 chan, f32 rot_deg, f32 xy_deg, f32 radius ); void KPADSetCrossStickEmulationParamsR( s32 chan, f32 rot_deg, f32 xy_deg, f32 radius ); void KPADGetPosParam ( s32 chan, f32 *play_radius, f32 *sensitivity ) ; void KPADGetHoriParam( s32 chan, f32 *play_radius, f32 *sensitivity ) ; void KPADGetDistParam( s32 chan, f32 *play_radius, f32 *sensitivity ) ; void KPADGetAccParam ( s32 chan, f32 *play_radius, f32 *sensitivity ) ; void KPADGetCrossStickEmulationParamsL( s32 chan, f32 *rot_deg, f32 *xy_deg, f32 *radius ); void KPADGetCrossStickEmulationParamsR( s32 chan, f32 *rot_deg, f32 *xy_deg, f32 *radius ); void KPADSetBtnRepeat( s32 chan, f32 delay_sec, f32 pulse_sec ) ; void KPADSetObjInterval ( f32 interval ) ; s32 KPADCalibrateDPD ( s32 chan ) ; void KPADSetSensorHeight ( s32 chan, f32 level ) ; f32 KPADGetSensorHeight ( s32 chan ) ; // These APIs are not recommended. // Instead, use KPADGetUnifiedWpadStatus(). // These are provided for compatibility with KPADOld. But not 100% compatible. // These APIs are obsolete in SDK3.2 or later /* WPADStatus *KPADGetWPADRingBuffer ( s32 chan ) ; WPADFSStatus *KPADGetWPADFSRingBuffer( s32 chan ) ; WPADCLStatus *KPADGetWPADCLRingBuffer( s32 chan ) ; */ void KPADSetFSStickClamp ( s8 min, s8 max ) ; void KPADDisableDPD( s32 chan ) ; void KPADEnableDPD ( s32 chan ) ; #define KPAD_STATE_CTRL_DPD_START 0 #define KPAD_STATE_CTRL_DPD_FINISHED 1 typedef void ( *KPADControlDpdCallback )( s32 chan, s32 reason ) ; void KPADSetControlDpdCallback( s32 chan, KPADControlDpdCallback callback ) ; void KPADEnableAimingMode ( s32 chan ) ; void KPADDisableAimingMode ( s32 chan ) ; u8 KPADIsEnableAimingMode( s32 chan ) ; void KPADGetProjectionPos( Vec2 *dst, const Vec2 *src, const Rect *projRect, f32 viRatio ) ; void KPADGetUnifiedWpadStatus( s32 chan, KPADUnifiedWpadStatus *dst, u32 count ) ; void KPADEnableStickCrossClamp ( void ) ; void KPADDisableStickCrossClamp( void ) ; WPADSamplingCallback KPADSetSamplingCallback( s32 chan, WPADSamplingCallback callback ) ; WPADConnectCallback KPADSetConnectCallback ( s32 chan, WPADConnectCallback callback ) ; void KPADSetReviseMode ( s32 chan, BOOL sw ) ; f32 KPADReviseAcc ( Vec *acc ) ; f32 KPADGetReviseAngle( void ) ; void KPADSetPosPlayMode ( s32 chan, KPADPlayMode mode ) ; void KPADSetHoriPlayMode( s32 chan, KPADPlayMode mode ) ; void KPADSetDistPlayMode( s32 chan, KPADPlayMode mode ) ; void KPADSetAccPlayMode ( s32 chan, KPADPlayMode mode ) ; KPADPlayMode KPADGetPosPlayMode ( s32 chan ) ; KPADPlayMode KPADGetHoriPlayMode( s32 chan ) ; KPADPlayMode KPADGetDistPlayMode( s32 chan ) ; KPADPlayMode KPADGetAccPlayMode ( s32 chan ) ; #define KPAD_BUTTON_PROC_MODE_LOOSE 0 #define KPAD_BUTTON_PROC_MODE_TIGHT 1 void KPADSetButtonProcMode( s32 chan, u8 mode ) ; u8 KPADGetButtonProcMode( s32 chan ) ; void KPADResetWbcZeroPoint( void ) ; void KPADResetWbcTgcWeight( void ) ; void KPADDisableMpls( s32 chan ) ; void KPADEnableMpls ( s32 chan, u8 mode ) ; u8 KPADGetMplsStatus( s32 chan ) ; #define KPAD_STATE_CTRL_MPLS_FAILED_CL -3 #define KPAD_STATE_CTRL_MPLS_FAILED_FS -2 #define KPAD_STATE_CTRL_MPLS_FAILED_EXP -2 #define KPAD_STATE_CTRL_MPLS_FAILED_STD -1 #define KPAD_STATE_CTRL_MPLS_START 0 #define KPAD_STATE_CTRL_MPLS_FINISHED 1 typedef void ( *KPADControlMplsCallback )( s32 chan, s32 reason ) ; void KPADSetControlMplsCallback( s32 chan, KPADControlMplsCallback callback ) ; u32 KPADGetMplsWorkSize ( void ) ; void KPADSetMplsWorkarea ( void *ptr ) ; void KPADResetMpls ( s32 chan ) ; void KPADSetMplsAngle ( s32 chan, f32 ax, f32 ay, f32 az ) ; void KPADSetMplsDirection ( s32 chan, KPADMPDir *dir ) ; void KPADStartMplsCalibration ( s32 chan ) ; f32 KPADWorkMplsCalibration ( s32 chan ) ; void KPADStopMplsCalibration ( s32 chan ) ; void KPADSetMplsDirectionMag ( s32 chan, f32 mag ) ; void KPADEnableMplsZeroPlay ( s32 chan ) ; void KPADEnableMplsDirRevise( s32 chan ) ; void KPADEnableMplsAccRevise( s32 chan ) ; void KPADEnableMplsDpdRevise( s32 chan ) ; void KPADDisableMplsZeroPlay ( s32 chan ) ; void KPADDisableMplsDirRevise( s32 chan ) ; void KPADDisableMplsAccRevise( s32 chan ) ; void KPADDisableMplsDpdRevise( s32 chan ) ; f32 KPADIsEnableMplsZeroPlay ( s32 chan ) ; f32 KPADIsEnableMplsZeroDrift( s32 chan ) ; f32 KPADIsEnableMplsDirRevise( s32 chan ) ; f32 KPADIsEnableMplsAccRevise( s32 chan ) ; f32 KPADIsEnableMplsDpdRevise( s32 chan ) ; void KPADSetMplsZeroPlayParam ( s32 chan, f32 radius ) ; void KPADSetMplsDirReviseParam( s32 chan, f32 revise_pw ) ; void KPADSetMplsAccReviseParam( s32 chan, f32 revise_pw, f32 revise_range ) ; void KPADSetMplsDpdReviseParam( s32 chan, f32 revise_pw ) ; void KPADSetMplsDirReviseBase ( s32 chan, KPADMPDir *base ) ; void KPADGetMplsZeroPlayParam ( s32 chan, f32 *radius ) ; void KPADGetMplsDirReviseParam( s32 chan, f32 *revise_pw ) ; void KPADGetMplsAccReviseParam( s32 chan, f32 *revise_pw, f32 *revise_range ) ; void KPADGetMplsDpdReviseParam( s32 chan, f32 *revise_pw ) ; void KPADInitMplsZeroPlayParam ( s32 chan ) ; void KPADInitMplsDirReviseParam( s32 chan ) ; void KPADInitMplsAccReviseParam( s32 chan ) ; void KPADInitMplsDpdReviseParam( s32 chan ) ; typedef enum KPADMplsZeroDriftMode { KPAD_MPLS_ZERODRIFT_LOOSE = 0, KPAD_MPLS_ZERODRIFT_STANDARD, KPAD_MPLS_ZERODRIFT_TIGHT } KPADMplsZeroDriftMode ; void KPADInitMplsZeroDriftMode( s32 chan ) ; void KPADSetMplsZeroDriftMode ( s32 chan, KPADMplsZeroDriftMode mode ) ; void KPADGetMplsZeroDriftMode ( s32 chan, KPADMplsZeroDriftMode *mode ) ; void KPADSetMplsMagnification ( s32 chan, f32 pitch, f32 yaw, f32 roll ) ; #define KPAD_DPD_DEFAULT 0 #define KPAD_DPD_DOWNWARD 1 void KPADSetDpdDetection ( u8 mode ) ; u8 KPADGetDpdDetection ( void ) ; #ifdef __cplusplus } #endif #endif // __KPAD_H__