1 /*---------------------------------------------------------------------------* 2 Project: KPAD library version 2 3 File: kpad.h 4 Programmers: Keizo Ohta 5 HIRATSU Daisuke 6 Tojo Haruki 7 Tetsuya Sasaki 8 9 Copyright (C) Nintendo. All rights reserved. 10 11 These coded instructions, statements, and computer programs contain 12 proprietary information of Nintendo of America Inc. and/or Nintendo 13 Company Ltd., and are protected by Federal copyright law. They may 14 not be disclosed to third parties or copied or duplicated in any form, 15 in whole or in part, without the prior written consent of Nintendo. 16 *---------------------------------------------------------------------------*/ 17 18 #ifdef __KPADOLD_H__ 19 #error KPAD version 2 (kpad.h) cannot be used with KPADOld (kpadOld.h) 20 #endif 21 22 #ifndef __KPAD_H__ 23 #define __KPAD_H__ 24 25 #include <cafe/pads/wpad/wpad.h> 26 #include <cafe/pads/wpad/wpadTrain.h> 27 #include <cafe/pads/wpad/wpadGuitar.h> 28 #include <cafe/pads/wpad/wpadDrum.h> 29 #include <cafe/pads/wpad/wpadTaiko.h> 30 #include <cafe/pads/wpad/wpadBalance.h> 31 #include <cafe/pads/wbc/wbc.h> 32 #include <cafe/pads/wpad/wpadBulk.h> 33 #include <types.h> 34 #include <cafe/mtx/mtxGeoTypes.h> 35 36 #ifdef __cplusplus 37 extern "C" { 38 #endif 39 40 41 #define KPAD_BUTTON_LEFT WPAD_BUTTON_LEFT 42 #define KPAD_BUTTON_RIGHT WPAD_BUTTON_RIGHT 43 #define KPAD_BUTTON_DOWN WPAD_BUTTON_DOWN 44 #define KPAD_BUTTON_UP WPAD_BUTTON_UP 45 #define KPAD_BUTTON_A WPAD_BUTTON_A 46 #define KPAD_BUTTON_B WPAD_BUTTON_B 47 #define KPAD_BUTTON_HOME WPAD_BUTTON_HOME 48 49 #define KPAD_BUTTON_PLUS WPAD_BUTTON_PLUS 50 #define KPAD_BUTTON_MINUS WPAD_BUTTON_MINUS 51 #define KPAD_BUTTON_1 WPAD_BUTTON_1 52 #define KPAD_BUTTON_2 WPAD_BUTTON_2 53 #define KPAD_BUTTON_Z WPAD_BUTTON_Z 54 #define KPAD_BUTTON_C WPAD_BUTTON_C 55 56 #define KPAD_CL_BUTTON_UP WPAD_CL_BUTTON_UP 57 #define KPAD_CL_BUTTON_LEFT WPAD_CL_BUTTON_LEFT 58 #define KPAD_CL_TRIGGER_ZR WPAD_CL_TRIGGER_ZR 59 #define KPAD_CL_BUTTON_ZR WPAD_CL_TRIGGER_ZR 60 #define KPAD_CL_BUTTON_X WPAD_CL_BUTTON_X 61 #define KPAD_CL_BUTTON_A WPAD_CL_BUTTON_A 62 #define KPAD_CL_BUTTON_Y WPAD_CL_BUTTON_Y 63 #define KPAD_CL_BUTTON_B WPAD_CL_BUTTON_B 64 #define KPAD_CL_TRIGGER_ZL WPAD_CL_TRIGGER_ZL 65 #define KPAD_CL_BUTTON_ZL WPAD_CL_TRIGGER_ZL 66 #define KPAD_CL_RESERVED WPAD_CL_RESERVED 67 #define KPAD_CL_TRIGGER_R WPAD_CL_TRIGGER_R 68 #define KPAD_CL_BUTTON_R WPAD_CL_TRIGGER_R 69 #define KPAD_CL_BUTTON_PLUS WPAD_CL_BUTTON_PLUS 70 #define KPAD_CL_BUTTON_HOME WPAD_CL_BUTTON_HOME 71 #define KPAD_CL_BUTTON_MINUS WPAD_CL_BUTTON_MINUS 72 #define KPAD_CL_TRIGGER_L WPAD_CL_TRIGGER_L 73 #define KPAD_CL_BUTTON_L WPAD_CL_TRIGGER_L 74 #define KPAD_CL_BUTTON_DOWN WPAD_CL_BUTTON_DOWN 75 #define KPAD_CL_BUTTON_RIGHT WPAD_CL_BUTTON_RIGHT 76 77 #define KPAD_UC_BUTTON_UP WPAD_UC_BUTTON_UP 78 #define KPAD_UC_BUTTON_LEFT WPAD_UC_BUTTON_LEFT 79 #define KPAD_UC_TRIGGER_ZR WPAD_UC_TRIGGER_ZR 80 #define KPAD_UC_BUTTON_ZR WPAD_UC_TRIGGER_ZR 81 #define KPAD_UC_BUTTON_X WPAD_UC_BUTTON_X 82 #define KPAD_UC_BUTTON_A WPAD_UC_BUTTON_A 83 #define KPAD_UC_BUTTON_Y WPAD_UC_BUTTON_Y 84 #define KPAD_UC_BUTTON_B WPAD_UC_BUTTON_B 85 #define KPAD_UC_TRIGGER_ZL WPAD_UC_TRIGGER_ZL 86 #define KPAD_UC_BUTTON_ZL WPAD_UC_TRIGGER_ZL 87 #define KPAD_UC_RESERVED WPAD_UC_RESERVED 88 #define KPAD_UC_TRIGGER_R WPAD_UC_TRIGGER_R 89 #define KPAD_UC_BUTTON_R WPAD_UC_TRIGGER_R 90 #define KPAD_UC_BUTTON_PLUS WPAD_UC_BUTTON_PLUS 91 #define KPAD_UC_BUTTON_HOME WPAD_UC_BUTTON_HOME 92 #define KPAD_UC_BUTTON_MINUS WPAD_UC_BUTTON_MINUS 93 #define KPAD_UC_TRIGGER_L WPAD_UC_TRIGGER_L 94 #define KPAD_UC_BUTTON_L WPAD_UC_TRIGGER_L 95 #define KPAD_UC_BUTTON_DOWN WPAD_UC_BUTTON_DOWN 96 #define KPAD_UC_BUTTON_RIGHT WPAD_UC_BUTTON_RIGHT 97 #define KPAD_UC_BUTTON_STICK_L WPAD_UC_BUTTON_STICK_L 98 #define KPAD_UC_BUTTON_STICK_R WPAD_UC_BUTTON_STICK_R 99 100 // For emulating cross stick 101 #define KPAD_FS_BUTTON_STICK_EMULATION_LEFT 0x00000001 102 #define KPAD_FS_BUTTON_STICK_EMULATION_RIGHT 0x00000002 103 #define KPAD_FS_BUTTON_STICK_EMULATION_DOWN 0x00000004 104 #define KPAD_FS_BUTTON_STICK_EMULATION_UP 0x00000008 105 106 #define KPAD_CL_BUTTON_STICK_L_EMULATION_LEFT 0x00010000 107 #define KPAD_CL_BUTTON_STICK_L_EMULATION_RIGHT 0x00020000 108 #define KPAD_CL_BUTTON_STICK_L_EMULATION_DOWN 0x00040000 109 #define KPAD_CL_BUTTON_STICK_L_EMULATION_UP 0x00080000 110 #define KPAD_CL_BUTTON_STICK_R_EMULATION_LEFT 0x00100000 111 #define KPAD_CL_BUTTON_STICK_R_EMULATION_RIGHT 0x00200000 112 #define KPAD_CL_BUTTON_STICK_R_EMULATION_DOWN 0x00400000 113 #define KPAD_CL_BUTTON_STICK_R_EMULATION_UP 0x00800000 114 115 #define KPAD_UC_BUTTON_STICK_L_EMULATION_LEFT 0x00040000 116 #define KPAD_UC_BUTTON_STICK_L_EMULATION_RIGHT 0x00080000 117 #define KPAD_UC_BUTTON_STICK_L_EMULATION_DOWN 0x00100000 118 #define KPAD_UC_BUTTON_STICK_L_EMULATION_UP 0x00200000 119 #define KPAD_UC_BUTTON_STICK_R_EMULATION_LEFT 0x00400000 120 #define KPAD_UC_BUTTON_STICK_R_EMULATION_RIGHT 0x00800000 121 #define KPAD_UC_BUTTON_STICK_R_EMULATION_DOWN 0x01000000 122 #define KPAD_UC_BUTTON_STICK_R_EMULATION_UP 0x02000000 123 124 #define KPAD_BUTTON_MASK 0x00ffffff 125 #define KPAD_URCC_BUTTON_MASK 0x03ffffff 126 #define KPAD_BUTTON_RPT 0x80000000 127 128 #define KPAD_RING_BUFS 16 129 #define KPAD_MAX_READ_BUFS KPAD_RING_BUFS 130 131 #define KPAD_READ_ERR_NONE 0 132 #define KPAD_READ_ERR_NO_DATA -1 133 #define KPAD_READ_ERR_NO_CONTROLLER -2 134 #define KPAD_READ_ERR_SETUP -3 135 #define KPAD_READ_ERR_LOCKED -4 136 #define KPAD_READ_ERR_INIT -5 137 138 #define KPAD_WBC_ERR_EXIST 1 139 #define KPAD_WBC_ERR_NONE 0 140 #define KPAD_WBC_ERR_NO_BATTERY -1 141 #define KPAD_WBC_ERR_SETUP -2 142 #define KPAD_WBC_ERR_WRONG_TEMP -3 143 #define KPAD_WBC_ERR_WRONG_ZERO -4 144 #define KPAD_WBC_ERR_WEIGHT_OVER -5 145 #define KPAD_WBC_ERR_CALIBRATION -6 146 #define KPAD_WBC_ERR_NO_ZEROPOINT -7 147 #define KPAD_WBC_ERR_ZEROPOINT -8 148 149 #define KPAD_WBC_ERR_TGC_READY 1 150 #define KPAD_WBC_ERR_TGC_NONE 0 151 #define KPAD_WBC_ERR_TGC_UNSTABLE -1 152 #define KPAD_WBC_ERR_TGC_UNKNOWN -2 153 #define KPAD_WBC_ERR_TGC_TIMEOUT -3 154 #define KPAD_WBC_ERR_TGC_BUSY -4 155 156 typedef enum KPADPlayMode { 157 KPAD_PLAY_MODE_LOOSE = 0, 158 KPAD_PLAY_MODE_TIGHT 159 } KPADPlayMode ; 160 161 typedef struct Rect { 162 f32 left; 163 f32 top; 164 f32 right; 165 f32 bottom; 166 } Rect; 167 168 typedef union KPADEXStatus{ 169 struct { 170 Vec2 stick ; 171 172 Vec acc ; 173 f32 acc_value ; 174 f32 acc_speed ; 175 176 u32 hold ; 177 u32 trig ; 178 u32 release ; 179 } fs ; 180 181 struct { 182 u32 hold ; 183 u32 trig ; 184 u32 release ; 185 186 Vec2 lstick ; 187 Vec2 rstick ; 188 189 f32 ltrigger ; 190 f32 rtrigger ; 191 } cl ; 192 193 struct { 194 u32 hold ; 195 u32 trig ; 196 u32 release ; 197 198 Vec2 lstick ; 199 Vec2 rstick ; 200 201 BOOL charge ; 202 BOOL cable ; 203 } uc ; 204 205 struct { 206 double tgc_weight ; 207 double weight[ WPAD_PRESS_UNITS ] ; 208 double weight_ave[ WPAD_PRESS_UNITS ] ; 209 s32 weight_err ; 210 s32 tgc_weight_err ; 211 } bl ; 212 213 struct { 214 u32 hold ; 215 u32 trig ; 216 u32 release ; 217 } cm ; 218 219 } KPADEXStatus ; 220 221 typedef struct KPADMPDir{ 222 Vec X ; 223 Vec Y ; 224 Vec Z ; 225 } KPADMPDir ; 226 227 typedef struct KPADMPStatus{ 228 Vec mpls ; 229 Vec angle ; 230 KPADMPDir dir ; 231 } KPADMPStatus ; 232 233 typedef struct KPADStatus{ 234 u32 hold ; 235 u32 trig ; 236 u32 release ; 237 238 Vec acc ; 239 f32 acc_value ; 240 f32 acc_speed ; 241 242 Vec2 pos ; 243 Vec2 vec ; 244 f32 speed ; 245 246 Vec2 horizon ; 247 Vec2 hori_vec ; 248 f32 hori_speed ; 249 250 f32 dist ; 251 f32 dist_vec ; 252 f32 dist_speed ; 253 254 Vec2 acc_vertical ; 255 256 u8 dev_type ; 257 s8 wpad_err ; 258 s8 dpd_valid_fg ; 259 u8 data_format ; 260 261 KPADEXStatus ex_status ; 262 263 KPADMPStatus mpls ; 264 265 u8 __paddings__[ 4 ] ; 266 267 } KPADStatus ; 268 269 typedef struct KPADUnifiedWpadStatus { 270 union { 271 WPADStatus core ; 272 WPADFSStatus fs ; 273 WPADCLStatus cl ; 274 WPADTRStatus tr ; 275 WPADBLStatus bl ; 276 WPADMPStatus mp ; 277 WPADBKStatus bk ; 278 WPADUCStatus uc ; 279 WPADCMStatus cm ; 280 } u ; 281 u8 fmt ; 282 u8 padding ; 283 } KPADUnifiedWpadStatus ; 284 285 void KPADInit ( void ) ; 286 void KPADInitEx ( KPADUnifiedWpadStatus uniRingBufs[], u32 length ) ; 287 void KPADShutdown( void ) ; 288 void KPADReset ( void ) ; 289 s32 KPADRead ( s32 chan, KPADStatus samplingBufs[], u32 length ) ; 290 s32 KPADReadEx ( s32 chan, KPADStatus samplingBufs[], u32 length, s32 *err ) ; 291 292 void KPADSetPosParam ( s32 chan, f32 play_radius, f32 sensitivity ) ; 293 void KPADSetHoriParam( s32 chan, f32 play_radius, f32 sensitivity ) ; 294 void KPADSetDistParam( s32 chan, f32 play_radius, f32 sensitivity ) ; 295 void KPADSetAccParam ( s32 chan, f32 play_radius, f32 sensitivity ) ; 296 void KPADSetCrossStickEmulationParamsL( s32 chan, f32 rot_deg, f32 xy_deg, f32 radius ); 297 void KPADSetCrossStickEmulationParamsR( s32 chan, f32 rot_deg, f32 xy_deg, f32 radius ); 298 299 void KPADGetPosParam ( s32 chan, f32 *play_radius, f32 *sensitivity ) ; 300 void KPADGetHoriParam( s32 chan, f32 *play_radius, f32 *sensitivity ) ; 301 void KPADGetDistParam( s32 chan, f32 *play_radius, f32 *sensitivity ) ; 302 void KPADGetAccParam ( s32 chan, f32 *play_radius, f32 *sensitivity ) ; 303 void KPADGetCrossStickEmulationParamsL( s32 chan, f32 *rot_deg, f32 *xy_deg, f32 *radius ); 304 void KPADGetCrossStickEmulationParamsR( s32 chan, f32 *rot_deg, f32 *xy_deg, f32 *radius ); 305 306 void KPADSetBtnRepeat( s32 chan, f32 delay_sec, f32 pulse_sec ) ; 307 308 void KPADSetObjInterval ( f32 interval ) ; 309 s32 KPADCalibrateDPD ( s32 chan ) ; 310 void KPADSetSensorHeight ( s32 chan, f32 level ) ; 311 f32 KPADGetSensorHeight ( s32 chan ) ; 312 313 // These APIs are not recommended. 314 // Instead, use KPADGetUnifiedWpadStatus(). 315 // These are provided for compatibility with KPADOld. But not 100% compatible. 316 317 // These APIs are obsolete in SDK3.2 or later 318 /* 319 WPADStatus *KPADGetWPADRingBuffer ( s32 chan ) ; 320 WPADFSStatus *KPADGetWPADFSRingBuffer( s32 chan ) ; 321 WPADCLStatus *KPADGetWPADCLRingBuffer( s32 chan ) ; 322 */ 323 324 void KPADSetFSStickClamp ( s8 min, s8 max ) ; 325 326 void KPADDisableDPD( s32 chan ) ; 327 void KPADEnableDPD ( s32 chan ) ; 328 329 #define KPAD_STATE_CTRL_DPD_START 0 330 #define KPAD_STATE_CTRL_DPD_FINISHED 1 331 332 typedef void ( *KPADControlDpdCallback )( s32 chan, s32 reason ) ; 333 334 void KPADSetControlDpdCallback( s32 chan, KPADControlDpdCallback callback ) ; 335 336 337 void KPADEnableAimingMode ( s32 chan ) ; 338 void KPADDisableAimingMode ( s32 chan ) ; 339 u8 KPADIsEnableAimingMode( s32 chan ) ; 340 341 void KPADGetProjectionPos( Vec2 *dst, const Vec2 *src, const Rect *projRect, f32 viRatio ) ; 342 343 void KPADGetUnifiedWpadStatus( s32 chan, KPADUnifiedWpadStatus *dst, u32 count ) ; 344 345 void KPADEnableStickCrossClamp ( void ) ; 346 void KPADDisableStickCrossClamp( void ) ; 347 348 WPADSamplingCallback KPADSetSamplingCallback( s32 chan, WPADSamplingCallback callback ) ; 349 WPADConnectCallback KPADSetConnectCallback ( s32 chan, WPADConnectCallback callback ) ; 350 351 void KPADSetReviseMode ( s32 chan, BOOL sw ) ; 352 f32 KPADReviseAcc ( Vec *acc ) ; 353 f32 KPADGetReviseAngle( void ) ; 354 355 void KPADSetPosPlayMode ( s32 chan, KPADPlayMode mode ) ; 356 void KPADSetHoriPlayMode( s32 chan, KPADPlayMode mode ) ; 357 void KPADSetDistPlayMode( s32 chan, KPADPlayMode mode ) ; 358 void KPADSetAccPlayMode ( s32 chan, KPADPlayMode mode ) ; 359 360 KPADPlayMode KPADGetPosPlayMode ( s32 chan ) ; 361 KPADPlayMode KPADGetHoriPlayMode( s32 chan ) ; 362 KPADPlayMode KPADGetDistPlayMode( s32 chan ) ; 363 KPADPlayMode KPADGetAccPlayMode ( s32 chan ) ; 364 365 #define KPAD_BUTTON_PROC_MODE_LOOSE 0 366 #define KPAD_BUTTON_PROC_MODE_TIGHT 1 367 368 void KPADSetButtonProcMode( s32 chan, u8 mode ) ; 369 u8 KPADGetButtonProcMode( s32 chan ) ; 370 371 void KPADResetWbcZeroPoint( void ) ; 372 void KPADResetWbcTgcWeight( void ) ; 373 374 void KPADDisableMpls( s32 chan ) ; 375 void KPADEnableMpls ( s32 chan, u8 mode ) ; 376 377 u8 KPADGetMplsStatus( s32 chan ) ; 378 379 #define KPAD_STATE_CTRL_MPLS_FAILED_CL -3 380 #define KPAD_STATE_CTRL_MPLS_FAILED_FS -2 381 #define KPAD_STATE_CTRL_MPLS_FAILED_EXP -2 382 #define KPAD_STATE_CTRL_MPLS_FAILED_STD -1 383 #define KPAD_STATE_CTRL_MPLS_START 0 384 #define KPAD_STATE_CTRL_MPLS_FINISHED 1 385 386 typedef void ( *KPADControlMplsCallback )( s32 chan, s32 reason ) ; 387 388 void KPADSetControlMplsCallback( s32 chan, KPADControlMplsCallback callback ) ; 389 390 u32 KPADGetMplsWorkSize ( void ) ; 391 void KPADSetMplsWorkarea ( void *ptr ) ; 392 void KPADResetMpls ( s32 chan ) ; 393 void KPADSetMplsAngle ( s32 chan, f32 ax, f32 ay, f32 az ) ; 394 void KPADSetMplsDirection ( s32 chan, KPADMPDir *dir ) ; 395 void KPADStartMplsCalibration ( s32 chan ) ; 396 f32 KPADWorkMplsCalibration ( s32 chan ) ; 397 void KPADStopMplsCalibration ( s32 chan ) ; 398 void KPADSetMplsDirectionMag ( s32 chan, f32 mag ) ; 399 400 void KPADEnableMplsZeroPlay ( s32 chan ) ; 401 void KPADEnableMplsDirRevise( s32 chan ) ; 402 void KPADEnableMplsAccRevise( s32 chan ) ; 403 void KPADEnableMplsDpdRevise( s32 chan ) ; 404 405 void KPADDisableMplsZeroPlay ( s32 chan ) ; 406 void KPADDisableMplsDirRevise( s32 chan ) ; 407 void KPADDisableMplsAccRevise( s32 chan ) ; 408 void KPADDisableMplsDpdRevise( s32 chan ) ; 409 410 f32 KPADIsEnableMplsZeroPlay ( s32 chan ) ; 411 f32 KPADIsEnableMplsZeroDrift( s32 chan ) ; 412 f32 KPADIsEnableMplsDirRevise( s32 chan ) ; 413 f32 KPADIsEnableMplsAccRevise( s32 chan ) ; 414 f32 KPADIsEnableMplsDpdRevise( s32 chan ) ; 415 416 void KPADSetMplsZeroPlayParam ( s32 chan, f32 radius ) ; 417 void KPADSetMplsDirReviseParam( s32 chan, f32 revise_pw ) ; 418 void KPADSetMplsAccReviseParam( s32 chan, f32 revise_pw, f32 revise_range ) ; 419 void KPADSetMplsDpdReviseParam( s32 chan, f32 revise_pw ) ; 420 void KPADSetMplsDirReviseBase ( s32 chan, KPADMPDir *base ) ; 421 422 void KPADGetMplsZeroPlayParam ( s32 chan, f32 *radius ) ; 423 void KPADGetMplsDirReviseParam( s32 chan, f32 *revise_pw ) ; 424 void KPADGetMplsAccReviseParam( s32 chan, f32 *revise_pw, f32 *revise_range ) ; 425 void KPADGetMplsDpdReviseParam( s32 chan, f32 *revise_pw ) ; 426 427 void KPADInitMplsZeroPlayParam ( s32 chan ) ; 428 void KPADInitMplsDirReviseParam( s32 chan ) ; 429 void KPADInitMplsAccReviseParam( s32 chan ) ; 430 void KPADInitMplsDpdReviseParam( s32 chan ) ; 431 432 typedef enum KPADMplsZeroDriftMode { 433 KPAD_MPLS_ZERODRIFT_LOOSE = 0, 434 KPAD_MPLS_ZERODRIFT_STANDARD, 435 KPAD_MPLS_ZERODRIFT_TIGHT 436 } KPADMplsZeroDriftMode ; 437 438 void KPADInitMplsZeroDriftMode( s32 chan ) ; 439 void KPADSetMplsZeroDriftMode ( s32 chan, KPADMplsZeroDriftMode mode ) ; 440 void KPADGetMplsZeroDriftMode ( s32 chan, KPADMplsZeroDriftMode *mode ) ; 441 442 void KPADSetMplsMagnification ( s32 chan, f32 pitch, f32 yaw, f32 roll ) ; 443 444 #define KPAD_DPD_DEFAULT 0 445 #define KPAD_DPD_DOWNWARD 1 446 void KPADSetDpdDetection ( u8 mode ) ; 447 u8 KPADGetDpdDetection ( void ) ; 448 449 #ifdef __cplusplus 450 } 451 #endif 452 453 #endif // __KPAD_H__ 454