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