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