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-2009 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/wpadDrum.h>
29 #include <revolution/wpadTaiko.h>
30 #include <revolution/wpadBalance.h>
31 #include <revolution/wbc.h>
32 #include <revolution/wpadBulk.h>
33 #include <revolution/types.h>
34 #include <revolution/mtx/GeoTypes.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_X        WPAD_CL_BUTTON_X
60 #define KPAD_CL_BUTTON_A        WPAD_CL_BUTTON_A
61 #define KPAD_CL_BUTTON_Y        WPAD_CL_BUTTON_Y
62 #define KPAD_CL_BUTTON_B        WPAD_CL_BUTTON_B
63 #define KPAD_CL_TRIGGER_ZL      WPAD_CL_TRIGGER_ZL
64 #define KPAD_CL_RESERVED        WPAD_CL_RESERVED
65 #define KPAD_CL_TRIGGER_R       WPAD_CL_TRIGGER_R
66 #define KPAD_CL_BUTTON_PLUS     WPAD_CL_BUTTON_PLUS
67 #define KPAD_CL_BUTTON_HOME     WPAD_CL_BUTTON_HOME
68 #define KPAD_CL_BUTTON_MINUS    WPAD_CL_BUTTON_MINUS
69 #define KPAD_CL_TRIGGER_L       WPAD_CL_TRIGGER_L
70 #define KPAD_CL_BUTTON_DOWN     WPAD_CL_BUTTON_DOWN
71 #define KPAD_CL_BUTTON_RIGHT    WPAD_CL_BUTTON_RIGHT
72 
73 #define KPAD_BUTTON_MASK        0x0000ffff
74 #define KPAD_BUTTON_RPT         0x80000000
75 
76 #define KPAD_RING_BUFS          16
77 #define KPAD_MAX_READ_BUFS      KPAD_RING_BUFS
78 
79 #define KPAD_READ_ERR_NONE           0
80 #define KPAD_READ_ERR_NO_DATA       -1
81 #define KPAD_READ_ERR_NO_CONTROLLER -2
82 #define KPAD_READ_ERR_SETUP         -3
83 #define KPAD_READ_ERR_LOCKED        -4
84 #define KPAD_READ_ERR_INIT          -5
85 
86 #define KPAD_WBC_ERR_EXIST           1
87 #define KPAD_WBC_ERR_NONE            0
88 #define KPAD_WBC_ERR_NO_BATTERY     -1
89 #define KPAD_WBC_ERR_SETUP          -2
90 #define KPAD_WBC_ERR_WRONG_TEMP     -3
91 #define KPAD_WBC_ERR_WRONG_ZERO     -4
92 #define KPAD_WBC_ERR_WEIGHT_OVER    -5
93 #define KPAD_WBC_ERR_CALIBRATION    -6
94 #define KPAD_WBC_ERR_NO_ZEROPOINT   -7
95 #define KPAD_WBC_ERR_ZEROPOINT      -8
96 
97 #define KPAD_WBC_ERR_TGC_READY       1
98 #define KPAD_WBC_ERR_TGC_NONE        0
99 #define KPAD_WBC_ERR_TGC_UNSTABLE   -1
100 #define KPAD_WBC_ERR_TGC_UNKNOWN    -2
101 #define KPAD_WBC_ERR_TGC_TIMEOUT    -3
102 #define KPAD_WBC_ERR_TGC_BUSY       -4
103 
104 typedef enum KPADPlayMode {
105     KPAD_PLAY_MODE_LOOSE = 0,
106     KPAD_PLAY_MODE_TIGHT
107 } KPADPlayMode ;
108 
109 typedef struct Vec2{
110     f32 x;
111     f32 y;
112 } Vec2;
113 
114 typedef struct Rect {
115     f32 left;
116     f32 top;
117     f32 right;
118     f32 bottom;
119 } Rect;
120 
121 typedef union KPADEXStatus{
122     struct {
123         Vec2    stick ;
124 
125         Vec     acc ;
126         f32     acc_value ;
127         f32     acc_speed ;
128     } fs ;
129 
130     struct {
131         u32     hold ;
132         u32     trig ;
133         u32     release ;
134 
135         Vec2    lstick ;
136         Vec2    rstick ;
137 
138         f32     ltrigger ;
139         f32     rtrigger ;
140     } cl ;
141 
142     struct {
143         double  tgc_weight ;
144         double  weight[ WPAD_PRESS_UNITS ] ;
145         double  weight_ave[ WPAD_PRESS_UNITS ] ;
146         s32     weight_err ;
147         s32     tgc_weight_err ;
148     } bl ;
149 } KPADEXStatus ;
150 
151 typedef struct KPADMPDir{
152     Vec  X ;
153     Vec  Y ;
154     Vec  Z ;
155 } KPADMPDir ;
156 
157 typedef struct KPADMPStatus{
158     Vec       mpls  ;
159     Vec       angle ;
160     KPADMPDir dir ;
161 } KPADMPStatus ;
162 
163 typedef struct KPADStatus{
164     u32  hold ;
165     u32  trig ;
166     u32  release ;
167 
168     Vec  acc ;
169     f32  acc_value ;
170     f32  acc_speed ;
171 
172     Vec2 pos ;
173     Vec2 vec ;
174     f32  speed ;
175 
176     Vec2 horizon ;
177     Vec2 hori_vec ;
178     f32  hori_speed ;
179 
180     f32  dist ;
181     f32  dist_vec ;
182     f32  dist_speed ;
183 
184     Vec2 acc_vertical ;
185 
186     u8   dev_type ;
187     s8   wpad_err ;
188     s8   dpd_valid_fg ;
189     u8   data_format ;
190 
191     KPADEXStatus ex_status ;
192 
193     KPADMPStatus mpls ;
194 
195     u8   __paddings__[ 4 ] ;
196 
197 } KPADStatus ;
198 
199 typedef struct KPADUnifiedWpadStatus {
200     union {
201         WPADStatus      core ;
202         WPADFSStatus    fs ;
203         WPADCLStatus    cl ;
204         WPADTRStatus    tr ;
205         WPADBLStatus    bl ;
206         WPADMPStatus    mp ;
207         WPADBKStatus    bk ;
208     } u ;
209     u8     fmt ;
210     u8     padding ;
211 } KPADUnifiedWpadStatus ;
212 
213 void KPADInit    ( void ) ;
214 void KPADInitEx  ( KPADUnifiedWpadStatus uniRingBufs[], u32 length ) ;
215 void KPADShutdown( void ) ;
216 void KPADReset   ( void ) ;
217 s32  KPADRead    ( s32 chan, KPADStatus samplingBufs[], u32 length ) ;
218 s32  KPADReadEx  ( s32 chan, KPADStatus samplingBufs[], u32 length, s32 *err ) ;
219 
220 void KPADSetPosParam ( s32 chan, f32 play_radius, f32 sensitivity ) ;
221 void KPADSetHoriParam( s32 chan, f32 play_radius, f32 sensitivity ) ;
222 void KPADSetDistParam( s32 chan, f32 play_radius, f32 sensitivity ) ;
223 void KPADSetAccParam ( s32 chan, f32 play_radius, f32 sensitivity ) ;
224 
225 void KPADGetPosParam ( s32 chan, f32 *play_radius, f32 *sensitivity ) ;
226 void KPADGetHoriParam( s32 chan, f32 *play_radius, f32 *sensitivity ) ;
227 void KPADGetDistParam( s32 chan, f32 *play_radius, f32 *sensitivity ) ;
228 void KPADGetAccParam ( s32 chan, f32 *play_radius, f32 *sensitivity ) ;
229 
230 void KPADSetBtnRepeat( s32 chan, f32 delay_sec, f32 pulse_sec ) ;
231 
232 void KPADSetObjInterval  ( f32 interval               ) ;
233 s32  KPADCalibrateDPD    ( s32 chan                   ) ;
234 void KPADSetSensorHeight ( s32 chan, f32 level        ) ;
235 f32  KPADGetSensorHeight ( s32 chan ) ;
236 
237 // These APIs are not recommended.
238 // Please use KPADGetUnifiedWpadStatus() instead.
239 // These are provided for compatibility with KPADOld. But not 100% compatible.
240 
241 // These APIs are obsolete in SDK3.2 or later
242 /*
243 WPADStatus   *KPADGetWPADRingBuffer  ( s32 chan ) ;
244 WPADFSStatus *KPADGetWPADFSRingBuffer( s32 chan ) ;
245 WPADCLStatus *KPADGetWPADCLRingBuffer( s32 chan ) ;
246 */
247 
248 void KPADSetFSStickClamp   ( s8 min, s8 max ) ;
249 
250 void KPADDisableDPD( s32 chan ) ;
251 void KPADEnableDPD ( s32 chan ) ;
252 
253 #define KPAD_STATE_CTRL_DPD_START       0
254 #define KPAD_STATE_CTRL_DPD_FINISHED    1
255 
256 typedef void ( *KPADControlDpdCallback )( s32 chan, s32 reason ) ;
257 
258 void KPADSetControlDpdCallback( s32 chan, KPADControlDpdCallback callback ) ;
259 
260 
261 void KPADEnableAimingMode  ( s32 chan ) ;
262 void KPADDisableAimingMode ( s32 chan ) ;
263 u8   KPADIsEnableAimingMode( s32 chan ) ;
264 
265 void KPADGetProjectionPos( Vec2 *dst, const Vec2 *src, const Rect *projRect, f32 viRatio ) ;
266 
267 void KPADGetUnifiedWpadStatus( s32 chan, KPADUnifiedWpadStatus *dst, u32 count ) ;
268 
269 void KPADEnableStickCrossClamp ( void ) ;
270 void KPADDisableStickCrossClamp( void ) ;
271 
272 WPADSamplingCallback KPADSetSamplingCallback( s32 chan, WPADSamplingCallback callback ) ;
273 WPADConnectCallback  KPADSetConnectCallback ( s32 chan, WPADConnectCallback  callback ) ;
274 
275 void KPADSetReviseMode ( s32 chan, BOOL sw ) ;
276 f32  KPADReviseAcc     ( Vec *acc ) ;
277 f32  KPADGetReviseAngle( void ) ;
278 
279 void KPADSetPosPlayMode ( s32 chan, KPADPlayMode mode ) ;
280 void KPADSetHoriPlayMode( s32 chan, KPADPlayMode mode ) ;
281 void KPADSetDistPlayMode( s32 chan, KPADPlayMode mode ) ;
282 void KPADSetAccPlayMode ( s32 chan, KPADPlayMode mode ) ;
283 
284 KPADPlayMode KPADGetPosPlayMode ( s32 chan ) ;
285 KPADPlayMode KPADGetHoriPlayMode( s32 chan ) ;
286 KPADPlayMode KPADGetDistPlayMode( s32 chan ) ;
287 KPADPlayMode KPADGetAccPlayMode ( s32 chan ) ;
288 
289 #define KPAD_BUTTON_PROC_MODE_LOOSE     0
290 #define KPAD_BUTTON_PROC_MODE_TIGHT     1
291 
292 void KPADSetButtonProcMode( s32 chan, u8 mode ) ;
293 u8   KPADGetButtonProcMode( s32 chan ) ;
294 
295 void KPADResetWbcZeroPoint( void ) ;
296 void KPADResetWbcTgcWeight( void ) ;
297 
298 void KPADDisableMpls( s32 chan ) ;
299 void KPADEnableMpls ( s32 chan, u8 mode ) ;
300 
301 u8   KPADGetMplsStatus( s32 chan ) ;
302 
303 #define KPAD_STATE_CTRL_MPLS_FAILED_CL  -3
304 #define KPAD_STATE_CTRL_MPLS_FAILED_FS  -2
305 #define KPAD_STATE_CTRL_MPLS_FAILED_EXP -2
306 #define KPAD_STATE_CTRL_MPLS_FAILED_STD -1
307 #define KPAD_STATE_CTRL_MPLS_START       0
308 #define KPAD_STATE_CTRL_MPLS_FINISHED    1
309 
310 typedef void ( *KPADControlMplsCallback )( s32 chan, s32 reason ) ;
311 
312 void KPADSetControlMplsCallback( s32 chan, KPADControlMplsCallback callback ) ;
313 
314 u32  KPADGetMplsWorkSize        ( void ) ;
315 void KPADSetMplsWorkarea        ( void *ptr ) ;
316 void KPADResetMpls              ( s32 chan ) ;
317 void KPADSetMplsAngle           ( s32 chan, f32 ax, f32 ay, f32 az ) ;
318 void KPADSetMplsDirection       ( s32 chan, KPADMPDir *dir ) ;
319 void KPADStartMplsCalibration   ( s32 chan ) ;
320 f32  KPADWorkMplsCalibration    ( s32 chan ) ;
321 void KPADStopMplsCalibration    ( s32 chan ) ;
322 void KPADSetMplsDirectionMag    ( s32 chan, f32 mag ) ;
323 
324 void KPADEnableMplsZeroPlay ( s32 chan ) ;
325 void KPADEnableMplsDirRevise( s32 chan ) ;
326 void KPADEnableMplsAccRevise( s32 chan ) ;
327 void KPADEnableMplsDpdRevise( s32 chan ) ;
328 
329 void KPADDisableMplsZeroPlay ( s32 chan ) ;
330 void KPADDisableMplsDirRevise( s32 chan ) ;
331 void KPADDisableMplsAccRevise( s32 chan ) ;
332 void KPADDisableMplsDpdRevise( s32 chan ) ;
333 
334 f32  KPADIsEnableMplsZeroPlay ( s32 chan ) ;
335 f32  KPADIsEnableMplsZeroDrift( s32 chan ) ;
336 f32  KPADIsEnableMplsDirRevise( s32 chan ) ;
337 f32  KPADIsEnableMplsAccRevise( s32 chan ) ;
338 f32  KPADIsEnableMplsDpdRevise( s32 chan ) ;
339 
340 void KPADSetMplsZeroPlayParam ( s32 chan, f32 radius ) ;
341 void KPADSetMplsDirReviseParam( s32 chan, f32 revise_pw ) ;
342 void KPADSetMplsAccReviseParam( s32 chan, f32 revise_pw, f32 revise_range ) ;
343 void KPADSetMplsDpdReviseParam( s32 chan, f32 revise_pw ) ;
344 void KPADSetMplsDirReviseBase ( s32 chan, KPADMPDir *base ) ;
345 
346 void KPADGetMplsZeroPlayParam ( s32 chan, f32 *radius ) ;
347 void KPADGetMplsDirReviseParam( s32 chan, f32 *revise_pw ) ;
348 void KPADGetMplsAccReviseParam( s32 chan, f32 *revise_pw, f32 *revise_range ) ;
349 void KPADGetMplsDpdReviseParam( s32 chan, f32 *revise_pw ) ;
350 
351 void KPADInitMplsZeroPlayParam ( s32 chan ) ;
352 void KPADInitMplsDirReviseParam( s32 chan ) ;
353 void KPADInitMplsAccReviseParam( s32 chan ) ;
354 void KPADInitMplsDpdReviseParam( s32 chan ) ;
355 
356 typedef enum KPADMplsZeroDriftMode {
357     KPAD_MPLS_ZERODRIFT_LOOSE = 0,
358     KPAD_MPLS_ZERODRIFT_STANDARD,
359     KPAD_MPLS_ZERODRIFT_TIGHT
360 } KPADMplsZeroDriftMode ;
361 
362 void KPADInitMplsZeroDriftMode( s32 chan ) ;
363 void KPADSetMplsZeroDriftMode ( s32 chan, KPADMplsZeroDriftMode  mode ) ;
364 void KPADGetMplsZeroDriftMode ( s32 chan, KPADMplsZeroDriftMode *mode ) ;
365 
366 void KPADSetMplsMagnification ( s32 chan, f32 pitch, f32 yaw, f32 roll ) ;
367 
368 #ifdef __cplusplus
369 }
370 #endif
371 
372 #endif // __KPAD_H__
373