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     reserved ;
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 void KPADSetSamplingCallback( s32 chan, WPADSamplingCallback callback ) ;
238 void 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 
262 #ifdef __cplusplus
263 }
264 #endif
265 
266 #endif // __KPAD_H__
267