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