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) 2005-2011 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