1 /*---------------------------------------------------------------------------*
2   Project:     KPAD library
3   File:        kpadold.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 __KPAD_H__
19 #error KPADOld (kpadOld.h) cannot be used with KPAD version 2 (kpad.h)
20 #endif
21 
22 #ifndef __KPADOLD_H__
23 #define __KPADOLD_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 #ifndef WPADEMU
43 #define KPAD_BUTTON_PLUS    WPAD_BUTTON_PLUS
44 #define KPAD_BUTTON_MINUS   WPAD_BUTTON_MINUS
45 #define KPAD_BUTTON_1       WPAD_BUTTON_1
46 #define KPAD_BUTTON_2       WPAD_BUTTON_2
47 #define KPAD_BUTTON_Z       WPAD_BUTTON_Z
48 #define KPAD_BUTTON_C       WPAD_BUTTON_C
49 #else
50 #define KPAD_BUTTON_START   WPAD_BUTTON_START
51 #define KPAD_BUTTON_SELECT  WPAD_BUTTON_SELECT
52 #define KPAD_BUTTON_SMALL_A WPAD_BUTTON_SMALL_A
53 #define KPAD_BUTTON_SMALL_B WPAD_BUTTON_SMALL_B
54 #define KPAD_BUTTON_Z1      WPAD_BUTTON_Z1
55 #define KPAD_BUTTON_Z2      WPAD_BUTTON_Z2
56 #endif  // end of WPADEMU
57 
58 #define KPAD_CL_BUTTON_UP       WPAD_CL_BUTTON_UP
59 #define KPAD_CL_BUTTON_LEFT     WPAD_CL_BUTTON_LEFT
60 #define KPAD_CL_TRIGGER_ZR      WPAD_CL_TRIGGER_ZR
61 #define KPAD_CL_BUTTON_X        WPAD_CL_BUTTON_X
62 #define KPAD_CL_BUTTON_A        WPAD_CL_BUTTON_A
63 #define KPAD_CL_BUTTON_Y        WPAD_CL_BUTTON_Y
64 #define KPAD_CL_BUTTON_B        WPAD_CL_BUTTON_B
65 #define KPAD_CL_TRIGGER_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_PLUS     WPAD_CL_BUTTON_PLUS
69 #define KPAD_CL_BUTTON_HOME     WPAD_CL_BUTTON_HOME
70 #define KPAD_CL_BUTTON_MINUS    WPAD_CL_BUTTON_MINUS
71 #define KPAD_CL_TRIGGER_L       WPAD_CL_TRIGGER_L
72 #define KPAD_CL_BUTTON_DOWN     WPAD_CL_BUTTON_DOWN
73 #define KPAD_CL_BUTTON_RIGHT    WPAD_CL_BUTTON_RIGHT
74 
75 
76 #ifdef WPADEMU
77 #define KPAD_GC_BUTTON_LEFT     PAD_BUTTON_LEFT
78 #define KPAD_GC_BUTTON_RIGHT    PAD_BUTTON_RIGHT
79 #define KPAD_GC_BUTTON_DOWN     PAD_BUTTON_DOWN
80 #define KPAD_GC_BUTTON_UP       PAD_BUTTON_UP
81 #define KPAD_GC_TRIGGER_Z       PAD_TRIGGER_Z
82 #define KPAD_GC_TRIGGER_R       PAD_TRIGGER_R
83 #define KPAD_GC_TRIGGER_L       PAD_TRIGGER_L
84 #define KPAD_GC_BUTTON_Z        PAD_TRIGGER_Z
85 #define KPAD_GC_BUTTON_R        PAD_TRIGGER_R
86 #define KPAD_GC_BUTTON_L        PAD_TRIGGER_L
87 #define KPAD_GC_BUTTON_A        PAD_BUTTON_A
88 #define KPAD_GC_BUTTON_B        PAD_BUTTON_B
89 #define KPAD_GC_BUTTON_X        PAD_BUTTON_X
90 #define KPAD_GC_BUTTON_Y        PAD_BUTTON_Y
91 #define KPAD_GC_BUTTON_START    PAD_BUTTON_START
92 #endif  // end of WPADEMU
93 
94 #define KPAD_BUTTON_MASK    0x0000ffff
95 #define KPAD_BUTTON_RPT     0x80000000
96 
97 #define KPAD_RING_BUFS      12
98 #define KPAD_MAX_READ_BUFS  10
99 
100 
101 typedef struct Vec2{
102     f32 x;
103     f32 y;
104 } Vec2;
105 
106 typedef struct Rect {
107     f32 left;
108     f32 top;
109     f32 right;
110     f32 bottom;
111 } Rect;
112 
113 typedef union KPADEXStatus{
114     struct {
115         Vec2    stick ;
116 
117         Vec     acc ;
118         f32     acc_value ;
119         f32     acc_speed ;
120     } fs ;
121 
122     struct {
123         u32     hold;
124         u32     trig;
125         u32     release;
126 
127         Vec2    lstick;
128         Vec2    rstick;
129 
130         f32     ltrigger;
131         f32     rtrigger;
132     } cl ;
133 
134     struct {
135         Vec2    stick ;
136         Vec2    substick ;
137 
138         f32     ltrigger ;
139         f32     rtrigger ;
140     } gc ;
141 } KPADEXStatus ;
142 
143 #ifdef  __MWERKS__
144 #pragma warn_padding off
145 #endif
146 typedef struct KPADStatus{
147     u32  hold ;
148     u32  trig ;
149     u32  release ;
150 
151     Vec  acc ;
152     f32  acc_value ;
153     f32  acc_speed ;
154 
155     Vec2 pos ;
156     Vec2 vec ;
157     f32  speed ;
158 
159     Vec2 horizon ;
160     Vec2 hori_vec ;
161     f32  hori_speed ;
162 
163     f32  dist ;
164     f32  dist_vec ;
165     f32  dist_speed ;
166 
167     Vec2 acc_vertical ;
168 
169     u32  dev_type ;
170 
171     KPADEXStatus    ex_status ;
172 
173     s8   dpd_valid_fg ;
174     s8   wpad_err ;
175     // 2 bytes padding
176 } KPADStatus ;
177 #ifdef  __MWERKS__
178 #pragma warn_padding reset
179 #endif
180 
181 
182 void KPADInit ( void ) ;
183 void KPADReset( void ) ;
184 s32  KPADRead ( s32 chan, KPADStatus samplingBufs[], u32 length ) ;
185 
186 void KPADSetPosParam ( s32 chan, f32 play_radius, f32 sensitivity ) ;
187 void KPADSetHoriParam( s32 chan, f32 play_radius, f32 sensitivity ) ;
188 void KPADSetDistParam( s32 chan, f32 play_radius, f32 sensitivity ) ;
189 void KPADSetAccParam ( s32 chan, f32 play_radius, f32 sensitivity ) ;
190 
191 void KPADSetBtnRepeat( s32 chan, f32 delay_sec, f32 pulse_sec ) ;
192 
193 void KPADSetObjInterval  ( f32 interval               ) ;
194 s32  KPADCalibrateDPD    ( s32 chan                   ) ;
195 void KPADSetSensorHeight ( s32 chan, f32 level        ) ;
196 
197 WPADStatus   *KPADGetWPADRingBuffer  ( s32 chan ) ;
198 WPADFSStatus *KPADGetWPADFSRingBuffer( s32 chan ) ;
199 WPADCLStatus *KPADGetWPADCLRingBuffer( s32 chan ) ;
200 
201 void KPADSetFSStickClamp   ( s8 min, s8 max ) ;
202 
203 void KPADDisableDPD( s32 chan );
204 void KPADEnableDPD ( s32 chan );
205 
206 #define KPAD_STATE_CTRL_DPD_START       0
207 #define KPAD_STATE_CTRL_DPD_FINISHED    1
208 
209 typedef void ( *KPADControlDpdCallback )( s32 chan, s32 reason );
210 
211 void KPADSetControlDpdCallback( s32 chan, KPADControlDpdCallback callback );
212 
213 
214 void KPADEnableAimingMode ( s32 chan );
215 void KPADDisableAimingMode( s32 chan );
216 
217 void KPADGetProjectionPos( Vec2 *dst, const Vec2 *src, const Rect *projRect, f32 viRatio );
218 
219 #ifdef WPADEMU
220 void KPADSetGCStickClamp   ( s8 min, s8 max ) ;
221 void KPADSetGCSubstickClamp( s8 min, s8 max ) ;
222 void KPADSetGCTriggerClamp ( u8 min, u8 max ) ;
223 #endif  // end of WPADEMU
224 
225 
226 
227 
228 #ifdef __cplusplus
229 }
230 #endif
231 
232 #endif // __KPADOLD_H__
233