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 2005-2008 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 <revolution/wpad.h> 26 #include <revolution/wpadTrain.h> 27 #include <revolution/wpadGuitar.h> 28 #include <revolution/wpadBalance.h> 29 #include <revolution/wbc.h> 30 #include <revolution/types.h> 31 #include <revolution/mtx/GeoTypes.h> 32 33 #ifdef __cplusplus 34 extern "C" { 35 #endif 36 37 38 #define KPAD_BUTTON_LEFT WPAD_BUTTON_LEFT 39 #define KPAD_BUTTON_RIGHT WPAD_BUTTON_RIGHT 40 #define KPAD_BUTTON_DOWN WPAD_BUTTON_DOWN 41 #define KPAD_BUTTON_UP WPAD_BUTTON_UP 42 #define KPAD_BUTTON_A WPAD_BUTTON_A 43 #define KPAD_BUTTON_B WPAD_BUTTON_B 44 #define KPAD_BUTTON_HOME WPAD_BUTTON_HOME 45 46 #define KPAD_BUTTON_PLUS WPAD_BUTTON_PLUS 47 #define KPAD_BUTTON_MINUS WPAD_BUTTON_MINUS 48 #define KPAD_BUTTON_1 WPAD_BUTTON_1 49 #define KPAD_BUTTON_2 WPAD_BUTTON_2 50 #define KPAD_BUTTON_Z WPAD_BUTTON_Z 51 #define KPAD_BUTTON_C WPAD_BUTTON_C 52 53 #define KPAD_CL_BUTTON_UP WPAD_CL_BUTTON_UP 54 #define KPAD_CL_BUTTON_LEFT WPAD_CL_BUTTON_LEFT 55 #define KPAD_CL_TRIGGER_ZR WPAD_CL_TRIGGER_ZR 56 #define KPAD_CL_BUTTON_X WPAD_CL_BUTTON_X 57 #define KPAD_CL_BUTTON_A WPAD_CL_BUTTON_A 58 #define KPAD_CL_BUTTON_Y WPAD_CL_BUTTON_Y 59 #define KPAD_CL_BUTTON_B WPAD_CL_BUTTON_B 60 #define KPAD_CL_TRIGGER_ZL WPAD_CL_TRIGGER_ZL 61 #define KPAD_CL_RESERVED WPAD_CL_RESERVED 62 #define KPAD_CL_TRIGGER_R WPAD_CL_TRIGGER_R 63 #define KPAD_CL_BUTTON_PLUS WPAD_CL_BUTTON_PLUS 64 #define KPAD_CL_BUTTON_HOME WPAD_CL_BUTTON_HOME 65 #define KPAD_CL_BUTTON_MINUS WPAD_CL_BUTTON_MINUS 66 #define KPAD_CL_TRIGGER_L WPAD_CL_TRIGGER_L 67 #define KPAD_CL_BUTTON_DOWN WPAD_CL_BUTTON_DOWN 68 #define KPAD_CL_BUTTON_RIGHT WPAD_CL_BUTTON_RIGHT 69 70 #define KPAD_BUTTON_MASK 0x0000ffff 71 #define KPAD_BUTTON_RPT 0x80000000 72 73 #define KPAD_RING_BUFS 16 74 #define KPAD_MAX_READ_BUFS KPAD_RING_BUFS 75 76 #define KPAD_READ_ERR_NONE 0 77 #define KPAD_READ_ERR_NO_DATA -1 78 #define KPAD_READ_ERR_NO_CONTROLLER -2 79 #define KPAD_READ_ERR_SETUP -3 80 #define KPAD_READ_ERR_LOCKED -4 81 #define KPAD_READ_ERR_INIT -5 82 83 #define KPAD_WBC_ERR_EXIST 1 84 #define KPAD_WBC_ERR_NONE 0 85 #define KPAD_WBC_ERR_NO_BATTERY -1 86 #define KPAD_WBC_ERR_SETUP -2 87 #define KPAD_WBC_ERR_WRONG_TEMP -3 88 #define KPAD_WBC_ERR_WRONG_ZERO -4 89 90 typedef enum KPADPlayMode { 91 KPAD_PLAY_MODE_LOOSE = 0, 92 KPAD_PLAY_MODE_TIGHT 93 } KPADPlayMode ; 94 95 typedef struct Vec2{ 96 f32 x; 97 f32 y; 98 } Vec2; 99 100 typedef struct Rect { 101 f32 left; 102 f32 top; 103 f32 right; 104 f32 bottom; 105 } Rect; 106 107 typedef union KPADEXStatus{ 108 struct { 109 Vec2 stick ; 110 111 Vec acc ; 112 f32 acc_value ; 113 f32 acc_speed ; 114 } fs ; 115 116 struct { 117 u32 hold ; 118 u32 trig ; 119 u32 release ; 120 121 Vec2 lstick ; 122 Vec2 rstick ; 123 124 f32 ltrigger ; 125 f32 rtrigger ; 126 } cl ; 127 128 struct { 129 double tgc_weight ; 130 double weight[ WPAD_PRESS_UNITS ] ; 131 double weight_ave[ WPAD_PRESS_UNITS ] ; 132 s32 weight_err ; 133 s32 tgc_weight_err ; 134 } bl ; 135 } KPADEXStatus ; 136 137 typedef struct KPADStatus{ 138 u32 hold ; 139 u32 trig ; 140 u32 release ; 141 142 Vec acc ; 143 f32 acc_value ; 144 f32 acc_speed ; 145 146 Vec2 pos ; 147 Vec2 vec ; 148 f32 speed ; 149 150 Vec2 horizon ; 151 Vec2 hori_vec ; 152 f32 hori_speed ; 153 154 f32 dist ; 155 f32 dist_vec ; 156 f32 dist_speed ; 157 158 Vec2 acc_vertical ; 159 160 u8 dev_type ; 161 s8 wpad_err ; 162 s8 dpd_valid_fg ; 163 u8 data_format ; 164 165 KPADEXStatus ex_status ; 166 } KPADStatus ; 167 168 typedef struct KPADUnifiedWpadStatus { 169 union { 170 WPADStatus core ; 171 WPADFSStatus fs ; 172 WPADCLStatus cl ; 173 WPADTRStatus tr ; 174 WPADBLStatus bl ; 175 } u ; 176 u8 fmt ; 177 u8 padding ; 178 } KPADUnifiedWpadStatus ; 179 180 void KPADInit ( void ) ; 181 void KPADInitEx ( KPADUnifiedWpadStatus uniRingBufs[], u32 length ) ; 182 void KPADShutdown( void ) ; 183 void KPADReset ( void ) ; 184 s32 KPADRead ( s32 chan, KPADStatus samplingBufs[], u32 length ) ; 185 s32 KPADReadEx ( s32 chan, KPADStatus samplingBufs[], u32 length, s32 *err ) ; 186 187 void KPADSetPosParam ( s32 chan, f32 play_radius, f32 sensitivity ) ; 188 void KPADSetHoriParam( s32 chan, f32 play_radius, f32 sensitivity ) ; 189 void KPADSetDistParam( s32 chan, f32 play_radius, f32 sensitivity ) ; 190 void KPADSetAccParam ( s32 chan, f32 play_radius, f32 sensitivity ) ; 191 192 void KPADGetPosParam ( s32 chan, f32 *play_radius, f32 *sensitivity ) ; 193 void KPADGetHoriParam( s32 chan, f32 *play_radius, f32 *sensitivity ) ; 194 void KPADGetDistParam( s32 chan, f32 *play_radius, f32 *sensitivity ) ; 195 void KPADGetAccParam ( s32 chan, f32 *play_radius, f32 *sensitivity ) ; 196 197 void KPADSetBtnRepeat( s32 chan, f32 delay_sec, f32 pulse_sec ) ; 198 199 void KPADSetObjInterval ( f32 interval ) ; 200 s32 KPADCalibrateDPD ( s32 chan ) ; 201 void KPADSetSensorHeight ( s32 chan, f32 level ) ; 202 203 // These APIs are not recommended. 204 // Please use KPADGetUnifiedWpadStatus() instead. 205 // These are provided for compatibility with KPADOld. But not 100% compatible. 206 207 // These APIs are obsolete in SDK3.2 or later 208 /* 209 WPADStatus *KPADGetWPADRingBuffer ( s32 chan ) ; 210 WPADFSStatus *KPADGetWPADFSRingBuffer( s32 chan ) ; 211 WPADCLStatus *KPADGetWPADCLRingBuffer( s32 chan ) ; 212 */ 213 214 void KPADSetFSStickClamp ( s8 min, s8 max ) ; 215 216 void KPADDisableDPD( s32 chan ) ; 217 void KPADEnableDPD ( s32 chan ) ; 218 219 #define KPAD_STATE_CTRL_DPD_START 0 220 #define KPAD_STATE_CTRL_DPD_FINISHED 1 221 222 typedef void ( *KPADControlDpdCallback )( s32 chan, s32 reason ) ; 223 224 void KPADSetControlDpdCallback( s32 chan, KPADControlDpdCallback callback ) ; 225 226 227 void KPADEnableAimingMode ( s32 chan ) ; 228 void KPADDisableAimingMode( s32 chan ) ; 229 230 void KPADGetProjectionPos( Vec2 *dst, const Vec2 *src, const Rect *projRect, f32 viRatio ) ; 231 232 void KPADGetUnifiedWpadStatus( s32 chan, KPADUnifiedWpadStatus *dst, u32 count ) ; 233 234 void KPADEnableStickCrossClamp ( void ) ; 235 void KPADDisableStickCrossClamp( void ) ; 236 237 WPADSamplingCallback KPADSetSamplingCallback( s32 chan, WPADSamplingCallback callback ) ; 238 WPADConnectCallback KPADSetConnectCallback ( s32 chan, WPADConnectCallback callback ) ; 239 240 void KPADSetReviseMode ( s32 chan, BOOL sw ) ; 241 f32 KPADReviseAcc ( Vec *acc ) ; 242 f32 KPADGetReviseAngle( void ) ; 243 244 void KPADSetPosPlayMode ( s32 chan, KPADPlayMode mode ) ; 245 void KPADSetHoriPlayMode( s32 chan, KPADPlayMode mode ) ; 246 void KPADSetDistPlayMode( s32 chan, KPADPlayMode mode ) ; 247 void KPADSetAccPlayMode ( s32 chan, KPADPlayMode mode ) ; 248 249 KPADPlayMode KPADGetPosPlayMode ( s32 chan ) ; 250 KPADPlayMode KPADGetHoriPlayMode( s32 chan ) ; 251 KPADPlayMode KPADGetDistPlayMode( s32 chan ) ; 252 KPADPlayMode KPADGetAccPlayMode ( s32 chan ) ; 253 254 #define KPAD_BUTTON_PROC_MODE_LOOSE 0 255 #define KPAD_BUTTON_PROC_MODE_TIGHT 1 256 257 void KPADSetButtonProcMode( s32 chan, u8 mode ) ; 258 u8 KPADGetButtonProcMode( s32 chan ) ; 259 260 void KPADResetWbcZeroPoint( void ) ; 261 void KPADResetWbcTgcWeight( void ) ; 262 263 #ifdef __cplusplus 264 } 265 #endif 266 267 #endif // __KPAD_H__ 268