5 * Michael Laforest < para >
6 * Email: < thepara (--AT--) g m a i l [--DOT--] com >
10 * This file is part of wiiuse.
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 3 of the License, or
15 * (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program. If not, see <http://www.gnu.org/licenses/>.
25 * $Header: /lvm/shared/ds/ds/cvs/devkitpro-cvsbackup/libogc/wiiuse/wiiuse_internal.h,v 1.8 2008-12-10 16:16:40 shagkur Exp $
31 * @brief General internal wiiuse stuff.
33 * Since Wiiuse is a library, wiiuse.h is a duplicate
36 * The code that would normally go in that file, but
37 * which is not needed by third party developers,
40 * So wiiuse_internal.h is included by other files
41 * internally, wiiuse.h is included only here.
44 #ifndef WIIUSE_INTERNAL_H_INCLUDED
45 #define WIIUSE_INTERNAL_H_INCLUDED
48 #include <arpa/inet.h> /* htons() */
49 #include <bluetooth/bluetooth.h>
52 #include "definitions.h"
55 #define WIIUSE_VERSION "0.12"
59 * Wiimote internal codes
63 /* Communication channels */
64 #define WM_OUTPUT_CHANNEL 0x11
65 #define WM_INPUT_CHANNEL 0x13
67 #define WM_SET_REPORT 0x50
70 #define WM_CMD_RUMBLE 0x10
71 #define WM_CMD_LED 0x11
72 #define WM_CMD_REPORT_TYPE 0x12
73 #define WM_CMD_IR 0x13
74 #define WM_CMD_SPEAKER_ENABLE 0x14
75 #define WM_CMD_CTRL_STATUS 0x15
76 #define WM_CMD_WRITE_DATA 0x16
77 #define WM_CMD_READ_DATA 0x17
78 #define WM_CMD_STREAM_DATA 0x18
79 #define WM_CMD_SPEAKER_MUTE 0x19
80 #define WM_CMD_IR_2 0x1A
82 /* input report ids */
83 #define WM_RPT_CTRL_STATUS 0x20
84 #define WM_RPT_READ 0x21
85 #define WM_RPT_WRITE 0x22
86 #define WM_RPT_BTN 0x30
87 #define WM_RPT_BTN_ACC 0x31
88 #define WM_RPT_BTN_ACC_IR 0x33
89 #define WM_RPT_BTN_EXP 0x34
90 #define WM_RPT_BTN_ACC_EXP 0x35
91 #define WM_RPT_BTN_IR_EXP 0x36
92 #define WM_RPT_BTN_ACC_IR_EXP 0x37
94 #define WM_BT_INPUT 0x01
95 #define WM_BT_OUTPUT 0x02
97 /* Identify the wiimote device by its class */
98 #define WM_DEV_CLASS_0 0x04
99 #define WM_DEV_CLASS_1 0x25
100 #define WM_DEV_CLASS_2 0x00
101 #define WM_VENDOR_ID 0x057E
102 #define WM_PRODUCT_ID 0x0306
104 /* controller status stuff */
105 #define WM_MAX_BATTERY_CODE 0xC8
107 /* offsets in wiimote memory */
108 #define WM_MEM_OFFSET_CALIBRATION 0x16
109 #define WM_EXP_MEM_BASE 0x04A40000
110 #define WM_EXP_MEM_ENABLE1 0x04A400F0
111 #define WM_EXP_MEM_ENABLE2 0x04A400FB
112 #define WM_EXP_MEM_KEY 0x04A40040
113 #define WM_EXP_MEM_CALIBR 0x04A40020
115 #define WM_REG_IR 0x04B00030
116 #define WM_REG_IR_BLOCK1 0x04B00000
117 #define WM_REG_IR_BLOCK2 0x04B0001A
118 #define WM_REG_IR_MODENUM 0x04B00033
121 #define WM_IR_BLOCK1_LEVEL1 "\x02\x00\x00\x71\x01\x00\x64\x00\xfe"
122 #define WM_IR_BLOCK2_LEVEL1 "\xfd\x05"
123 #define WM_IR_BLOCK1_LEVEL2 "\x02\x00\x00\x71\x01\x00\x96\x00\xb4"
124 #define WM_IR_BLOCK2_LEVEL2 "\xb3\x04"
125 #define WM_IR_BLOCK1_LEVEL3 "\x02\x00\x00\x71\x01\x00\xaa\x00\x64"
126 #define WM_IR_BLOCK2_LEVEL3 "\x63\x03"
127 #define WM_IR_BLOCK1_LEVEL4 "\x02\x00\x00\x71\x01\x00\xc8\x00\x36"
128 #define WM_IR_BLOCK2_LEVEL4 "\x35\x03"
129 #define WM_IR_BLOCK1_LEVEL5 "\x07\x00\x00\x71\x01\x00\x72\x00\x20"
130 #define WM_IR_BLOCK2_LEVEL5 "\x1f\x03"
132 #define WM_IR_TYPE_BASIC 0x01
133 #define WM_IR_TYPE_EXTENDED 0x03
134 #define WM_IR_TYPE_FULL 0x05
136 /* controller status flags for the first message byte */
137 /* bit 1 is unknown */
138 #define WM_CTRL_STATUS_BYTE1_ATTACHMENT 0x02
139 #define WM_CTRL_STATUS_BYTE1_SPEAKER_ENABLED 0x04
140 #define WM_CTRL_STATUS_BYTE1_IR_ENABLED 0x08
141 #define WM_CTRL_STATUS_BYTE1_LED_1 0x10
142 #define WM_CTRL_STATUS_BYTE1_LED_2 0x20
143 #define WM_CTRL_STATUS_BYTE1_LED_3 0x40
144 #define WM_CTRL_STATUS_BYTE1_LED_4 0x80
147 #define WM_ASPECT_16_9_X 660
148 #define WM_ASPECT_16_9_Y 370
149 #define WM_ASPECT_4_3_X 560
150 #define WM_ASPECT_4_3_Y 420
157 /* encrypted expansion id codes (located at 0x04A400FC) */
158 #define EXP_ID_CODE_NUNCHUK 0xa4200000
159 #define EXP_ID_CODE_CLASSIC_CONTROLLER 0xa4200101
160 #define EXP_ID_CODE_GUITAR 0xa4200103
161 #define EXP_ID_CODE_WIIBOARD 0xa4200402
163 #define EXP_HANDSHAKE_LEN 224
165 /********************
167 * End Wiimote internal codes
169 ********************/
171 /* wiimote state flags - (some duplicated in wiiuse.h)*/
172 #define WIIMOTE_STATE_DEV_FOUND 0x00001
173 //#define WIIMOTE_STATE_DEV_REGISTER 0x00002
174 #define WIIMOTE_STATE_HANDSHAKE 0x00004 /* actual connection exists but no handshake yet */
175 #define WIIMOTE_STATE_HANDSHAKE_COMPLETE 0x00008 /* actual connection exists but no handshake yet */
176 #define WIIMOTE_STATE_CONNECTED 0x00010
177 #define WIIMOTE_STATE_EXP_HANDSHAKE 0x00020 /* actual connection exists but no handshake yet */
178 #define WIIMOTE_STATE_EXP_FAILED 0x00040 /* actual connection exists but no handshake yet */
179 #define WIIMOTE_STATE_RUMBLE 0x00080
180 #define WIIMOTE_STATE_ACC 0x00100
181 #define WIIMOTE_STATE_EXP 0x00200
182 #define WIIMOTE_STATE_IR 0x00400
183 #define WIIMOTE_STATE_SPEAKER 0x00800
184 #define WIIMOTE_STATE_IR_SENS_LVL1 0x01000
185 #define WIIMOTE_STATE_IR_SENS_LVL2 0x02000
186 #define WIIMOTE_STATE_IR_SENS_LVL3 0x04000
187 #define WIIMOTE_STATE_IR_SENS_LVL4 0x08000
188 #define WIIMOTE_STATE_IR_SENS_LVL5 0x10000
189 #define WIIMOTE_STATE_IR_INIT 0x20000
191 #define WIIMOTE_INIT_STATES (WIIMOTE_STATE_IR_SENS_LVL3)
193 /* macro to manage states */
194 #define WIIMOTE_IS_SET(wm, s) ((wm->state & (s)) == (s))
195 #define WIIMOTE_ENABLE_STATE(wm, s) (wm->state |= (s))
196 #define WIIMOTE_DISABLE_STATE(wm, s) (wm->state &= ~(s))
197 #define WIIMOTE_TOGGLE_STATE(wm, s) ((wm->state & (s)) ? WIIMOTE_DISABLE_STATE(wm, s) : WIIMOTE_ENABLE_STATE(wm, s))
199 #define WIIMOTE_IS_FLAG_SET(wm, s) ((wm->flags & (s)) == (s))
200 #define WIIMOTE_ENABLE_FLAG(wm, s) (wm->flags |= (s))
201 #define WIIMOTE_DISABLE_FLAG(wm, s) (wm->flags &= ~(s))
202 #define WIIMOTE_TOGGLE_FLAG(wm, s) ((wm->flags & (s)) ? WIIMOTE_DISABLE_FLAG(wm, s) : WIIMOTE_ENABLE_FLAG(wm, s))
204 #define NUNCHUK_IS_FLAG_SET(wm, s) ((*(wm->flags) & (s)) == (s))
207 #define WIIMOTE_ID(wm) (wm->unid)
208 #define WIIMOTE_IS_CONNECTED(wm) (WIIMOTE_IS_SET(wm, WIIMOTE_STATE_CONNECTED))
211 * Smooth tilt calculations are computed with the
212 * exponential moving average formula:
213 * St = St_last + (alpha * (tilt - St_last))
214 * alpha is between 0 and 1
216 #define WIIUSE_DEFAULT_SMOOTH_ALPHA 0.3f
218 #define SMOOTH_ROLL 0x01
219 #define SMOOTH_PITCH 0x02
221 #include <wiiuse/wiiuse.h>
240 ubyte __data
[MAX_PAYLOAD
];
245 } __attribute__((packed
));
247 /* not part of the api */
248 void wiiuse_init_cmd_queue(struct wiimote_t
*wm
);
249 void wiiuse_send_next_command(struct wiimote_t
*wm
);
250 int wiiuse_set_report_type(struct wiimote_t
* wm
,cmd_blk_cb cb
);
251 int wiiuse_sendcmd(struct wiimote_t
*wm
,ubyte report_type
,ubyte
*msg
,int len
,cmd_blk_cb cb
);
257 #endif /* WIIUSE_INTERNAL_H_INCLUDED */