1 /*---------------------------------------------------------------------------*
2   Project:     KPAD library
3   File:        kpad.h
4   Programmers: Keizo Ohta
5                HIRATSU Daisuke
6 
7   Copyright 2005 Nintendo.  All rights reserved.
8 
9   These coded instructions, statements, and computer programs contain
10   proprietary information of Nintendo of America Inc. and/or Nintendo
11   Company Ltd., and are protected by Federal copyright law.  They may
12   not be disclosed to third parties or copied or duplicated in any form,
13   in whole or in part, without the prior written consent of Nintendo.
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef __KPAD_H__
17 #define __KPAD_H__
18 
19 #include <revolution/wpad.h>
20 #include <revolution/types.h>
21 #include <revolution/mtx/GeoTypes.h>
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 
28 #define KPAD_BUTTON_LEFT    WPAD_BUTTON_LEFT
29 #define KPAD_BUTTON_RIGHT   WPAD_BUTTON_RIGHT
30 #define KPAD_BUTTON_DOWN    WPAD_BUTTON_DOWN
31 #define KPAD_BUTTON_UP      WPAD_BUTTON_UP
32 #define KPAD_BUTTON_A       WPAD_BUTTON_A
33 #define KPAD_BUTTON_B       WPAD_BUTTON_B
34 #define KPAD_BUTTON_HOME    WPAD_BUTTON_HOME
35 
36 #ifndef WPADEMU
37 #define KPAD_BUTTON_PLUS    WPAD_BUTTON_PLUS
38 #define KPAD_BUTTON_MINUS   WPAD_BUTTON_MINUS
39 #define KPAD_BUTTON_1       WPAD_BUTTON_1
40 #define KPAD_BUTTON_2       WPAD_BUTTON_2
41 #define KPAD_BUTTON_Z       WPAD_BUTTON_Z
42 #define KPAD_BUTTON_C       WPAD_BUTTON_C
43 #else
44 #define KPAD_BUTTON_START   WPAD_BUTTON_START
45 #define KPAD_BUTTON_SELECT  WPAD_BUTTON_SELECT
46 #define KPAD_BUTTON_SMALL_A WPAD_BUTTON_SMALL_A
47 #define KPAD_BUTTON_SMALL_B WPAD_BUTTON_SMALL_B
48 #define KPAD_BUTTON_Z1      WPAD_BUTTON_Z1
49 #define KPAD_BUTTON_Z2      WPAD_BUTTON_Z2
50 #endif  // end of WPADEMU
51 
52 #define KPAD_CL_BUTTON_UP       WPAD_CL_BUTTON_UP
53 #define KPAD_CL_BUTTON_LEFT     WPAD_CL_BUTTON_LEFT
54 #define KPAD_CL_TRIGGER_ZR      WPAD_CL_TRIGGER_ZR
55 #define KPAD_CL_BUTTON_X        WPAD_CL_BUTTON_X
56 #define KPAD_CL_BUTTON_A        WPAD_CL_BUTTON_A
57 #define KPAD_CL_BUTTON_Y        WPAD_CL_BUTTON_Y
58 #define KPAD_CL_BUTTON_B        WPAD_CL_BUTTON_B
59 #define KPAD_CL_TRIGGER_ZL      WPAD_CL_TRIGGER_ZL
60 #define KPAD_CL_RESERVED        WPAD_CL_RESERVED
61 #define KPAD_CL_TRIGGER_R       WPAD_CL_TRIGGER_R
62 #define KPAD_CL_BUTTON_PLUS     WPAD_CL_BUTTON_PLUS
63 #define KPAD_CL_BUTTON_HOME     WPAD_CL_BUTTON_HOME
64 #define KPAD_CL_BUTTON_MINUS    WPAD_CL_BUTTON_MINUS
65 #define KPAD_CL_TRIGGER_L       WPAD_CL_TRIGGER_L
66 #define KPAD_CL_BUTTON_DOWN     WPAD_CL_BUTTON_DOWN
67 #define KPAD_CL_BUTTON_RIGHT    WPAD_CL_BUTTON_RIGHT
68 
69 
70 #ifdef WPADEMU
71 #define KPAD_GC_BUTTON_LEFT     PAD_BUTTON_LEFT
72 #define KPAD_GC_BUTTON_RIGHT    PAD_BUTTON_RIGHT
73 #define KPAD_GC_BUTTON_DOWN     PAD_BUTTON_DOWN
74 #define KPAD_GC_BUTTON_UP       PAD_BUTTON_UP
75 #define KPAD_GC_TRIGGER_Z       PAD_TRIGGER_Z
76 #define KPAD_GC_TRIGGER_R       PAD_TRIGGER_R
77 #define KPAD_GC_TRIGGER_L       PAD_TRIGGER_L
78 #define KPAD_GC_BUTTON_Z        PAD_TRIGGER_Z
79 #define KPAD_GC_BUTTON_R        PAD_TRIGGER_R
80 #define KPAD_GC_BUTTON_L        PAD_TRIGGER_L
81 #define KPAD_GC_BUTTON_A        PAD_BUTTON_A
82 #define KPAD_GC_BUTTON_B        PAD_BUTTON_B
83 #define KPAD_GC_BUTTON_X        PAD_BUTTON_X
84 #define KPAD_GC_BUTTON_Y        PAD_BUTTON_Y
85 #define KPAD_GC_BUTTON_START    PAD_BUTTON_START
86 #endif  // end of WPADEMU
87 
88 #define KPAD_BUTTON_MASK    0x0000ffff
89 #define KPAD_BUTTON_RPT     0x80000000
90 
91 #define KPAD_RING_BUFS      12
92 #define KPAD_MAX_READ_BUFS  10
93 
94 
95 typedef struct Vec2{
96     f32 x;
97     f32 y;
98 } Vec2;
99 
100 typedef union KPADEXStatus{
101     struct {
102         Vec2    stick ;
103 
104         Vec     acc ;
105         f32     acc_value ;
106         f32     acc_speed ;
107     } fs ;
108 
109     struct {
110         u32     hold;
111         u32     trig;
112         u32     release;
113 
114         Vec2    lstick;
115         Vec2    rstick;
116 
117         f32     ltrigger;
118         f32     rtrigger;
119     } cl ;
120 
121     struct {
122         Vec2    stick ;
123         Vec2    substick ;
124 
125         f32     ltrigger ;
126         f32     rtrigger ;
127     } gc ;
128 } KPADEXStatus ;
129 
130 #ifdef  __MWERKS__
131 #pragma warn_padding off
132 #endif
133 typedef struct KPADStatus{
134     u32  hold ;
135     u32  trig ;
136     u32  release ;
137 
138     Vec  acc ;
139     f32  acc_value ;
140     f32  acc_speed ;
141 
142     Vec2 pos ;
143     Vec2 vec ;
144     f32  speed ;
145 
146     Vec2 horizon ;
147     Vec2 hori_vec ;
148     f32  hori_speed ;
149 
150     f32  dist ;
151     f32  dist_vec ;
152     f32  dist_speed ;
153 
154     Vec2 acc_vertical ;
155 
156     u32  dev_type ;
157 
158     KPADEXStatus    ex_status ;
159 
160     s8   dpd_valid_fg ;
161     s8   wpad_err ;
162     // 2 bytes padding
163 } KPADStatus ;
164 #ifdef  __MWERKS__
165 #pragma warn_padding reset
166 #endif
167 
168 
169 void KPADInit ( void ) ;
170 void KPADReset( void ) ;
171 s32  KPADRead ( s32 chan, KPADStatus samplingBufs[], u32 length ) ;
172 
173 void KPADSetPosParam ( s32 chan, f32 play_radius, f32 sensitivity ) ;
174 void KPADSetHoriParam( s32 chan, f32 play_radius, f32 sensitivity ) ;
175 void KPADSetDistParam( s32 chan, f32 play_radius, f32 sensitivity ) ;
176 void KPADSetAccParam ( s32 chan, f32 play_radius, f32 sensitivity ) ;
177 
178 void KPADSetBtnRepeat( s32 chan, f32 delay_sec, f32 pulse_sec ) ;
179 
180 void KPADSetObjInterval  ( f32 interval               ) ;
181 s32  KPADCalibrateDPD    ( s32 chan                   ) ;
182 void KPADSetSensorHeight ( s32 chan, f32 level        ) ;
183 void KPADGetCalibratedDPD( Vec2* dst, const Vec2* src ) ;
184 
185 WPADStatus   *KPADGetWPADRingBuffer  ( s32 chan ) ;
186 WPADFSStatus *KPADGetWPADFSRingBuffer( s32 chan ) ;
187 WPADCLStatus *KPADGetWPADCLRingBuffer( s32 chan ) ;
188 
189 void KPADSetFSStickClamp   ( s8 min, s8 max ) ;
190 
191 #ifdef WPADEMU
192 void KPADSetGCStickClamp   ( s8 min, s8 max ) ;
193 void KPADSetGCSubstickClamp( s8 min, s8 max ) ;
194 void KPADSetGCTriggerClamp ( u8 min, u8 max ) ;
195 #endif  // end of WPADEMU
196 
197 #ifdef __cplusplus
198 }
199 #endif
200 
201 #endif // __KPAD_H__
202