sync with linuxport @ 18013
[xbmc:xbmc-antiquated.git] / tools / EventClients / Clients / WiiRemote / wiiuse_v0.12 / src / wiiuse_internal.h
1 /*
2  *      wiiuse
3  *
4  *      Written By:
5  *              Michael Laforest        < para >
6  *              Email: < thepara (--AT--) g m a i l [--DOT--] com >
7  *
8  *      Copyright 2006-2007
9  *
10  *      This file is part of wiiuse.
11  *
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.
16  *
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.
21  *
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/>.
24  *
25  *      $Header$
26  *
27  */
28
29 /**
30  *      @file
31  *      @brief General internal wiiuse stuff.
32  *
33  *      Since Wiiuse is a library, wiiuse.h is a duplicate
34  *      of the API header.
35  *
36  *      The code that would normally go in that file, but
37  *      which is not needed by third party developers,
38  *      is put here.
39  *
40  *      So wiiuse_internal.h is included by other files
41  *      internally, wiiuse.h is included only here.
42  */
43
44 #ifndef WIIUSE_INTERNAL_H_INCLUDED
45 #define WIIUSE_INTERNAL_H_INCLUDED
46
47 #ifndef WIN32
48         #include <arpa/inet.h>                          /* htons() */
49         #include <bluetooth/bluetooth.h>
50 #endif
51
52 #include "definitions.h"
53
54 /* wiiuse version */
55 #define WIIUSE_VERSION                                  "0.12"
56
57 /********************
58  *
59  *      Wiimote internal codes
60  *
61  ********************/
62
63 /* Communication channels */
64 #define WM_OUTPUT_CHANNEL                       0x11
65 #define WM_INPUT_CHANNEL                        0x13
66
67 #define WM_SET_REPORT                           0x50
68
69 /* commands */
70 #define WM_CMD_LED                                      0x11
71 #define WM_CMD_REPORT_TYPE                      0x12
72 #define WM_CMD_RUMBLE                           0x13
73 #define WM_CMD_IR                                       0x13
74 #define WM_CMD_CTRL_STATUS                      0x15
75 #define WM_CMD_WRITE_DATA                       0x16
76 #define WM_CMD_READ_DATA                        0x17
77 #define WM_CMD_IR_2                                     0x1A
78
79 /* input report ids */
80 #define WM_RPT_CTRL_STATUS                      0x20
81 #define WM_RPT_READ                                     0x21
82 #define WM_RPT_WRITE                            0x22
83 #define WM_RPT_BTN                                      0x30
84 #define WM_RPT_BTN_ACC                          0x31
85 #define WM_RPT_BTN_ACC_IR                       0x33
86 #define WM_RPT_BTN_EXP                          0x34
87 #define WM_RPT_BTN_ACC_EXP                      0x35
88 #define WM_RPT_BTN_IR_EXP                       0x36
89 #define WM_RPT_BTN_ACC_IR_EXP           0x37
90
91 #define WM_BT_INPUT                                     0x01
92 #define WM_BT_OUTPUT                            0x02
93
94 /* Identify the wiimote device by its class */
95 #define WM_DEV_CLASS_0                          0x04
96 #define WM_DEV_CLASS_1                          0x25
97 #define WM_DEV_CLASS_2                          0x00
98 #define WM_VENDOR_ID                            0x057E
99 #define WM_PRODUCT_ID                           0x0306
100
101 /* controller status stuff */
102 #define WM_MAX_BATTERY_CODE                     0xC8
103
104 /* offsets in wiimote memory */
105 #define WM_MEM_OFFSET_CALIBRATION       0x16
106 #define WM_EXP_MEM_BASE                         0x04A40000
107 #define WM_EXP_MEM_ENABLE                       0x04A40040
108 #define WM_EXP_MEM_CALIBR                       0x04A40020
109
110 #define WM_REG_IR                                       0x04B00030
111 #define WM_REG_IR_BLOCK1                        0x04B00000
112 #define WM_REG_IR_BLOCK2                        0x04B0001A
113 #define WM_REG_IR_MODENUM                       0x04B00033
114
115 /* ir block data */
116 #define WM_IR_BLOCK1_LEVEL1                     "\x02\x00\x00\x71\x01\x00\x64\x00\xfe"
117 #define WM_IR_BLOCK2_LEVEL1                     "\xfd\x05"
118 #define WM_IR_BLOCK1_LEVEL2                     "\x02\x00\x00\x71\x01\x00\x96\x00\xb4"
119 #define WM_IR_BLOCK2_LEVEL2                     "\xb3\x04"
120 #define WM_IR_BLOCK1_LEVEL3                     "\x02\x00\x00\x71\x01\x00\xaa\x00\x64"
121 #define WM_IR_BLOCK2_LEVEL3                     "\x63\x03"
122 #define WM_IR_BLOCK1_LEVEL4                     "\x02\x00\x00\x71\x01\x00\xc8\x00\x36"
123 #define WM_IR_BLOCK2_LEVEL4                     "\x35\x03"
124 #define WM_IR_BLOCK1_LEVEL5                     "\x07\x00\x00\x71\x01\x00\x72\x00\x20"
125 #define WM_IR_BLOCK2_LEVEL5                     "\x1f\x03"
126
127 #define WM_IR_TYPE_BASIC                        0x01
128 #define WM_IR_TYPE_EXTENDED                     0x03
129
130 /* controller status flags for the first message byte */
131 /* bit 1 is unknown */
132 #define WM_CTRL_STATUS_BYTE1_ATTACHMENT                 0x02
133 #define WM_CTRL_STATUS_BYTE1_SPEAKER_ENABLED    0x04
134 #define WM_CTRL_STATUS_BYTE1_IR_ENABLED                 0x08
135 #define WM_CTRL_STATUS_BYTE1_LED_1                              0x10
136 #define WM_CTRL_STATUS_BYTE1_LED_2                              0x20
137 #define WM_CTRL_STATUS_BYTE1_LED_3                              0x40
138 #define WM_CTRL_STATUS_BYTE1_LED_4                              0x80
139
140 /* aspect ratio */
141 #define WM_ASPECT_16_9_X        660
142 #define WM_ASPECT_16_9_Y        370
143 #define WM_ASPECT_4_3_X         560
144 #define WM_ASPECT_4_3_Y         420
145
146
147 /**
148  *      Expansion stuff
149  */
150
151 /* encrypted expansion id codes (located at 0x04A400FC) */
152 #define EXP_ID_CODE_NUNCHUK                                     0x9A1EFEFE
153 #define EXP_ID_CODE_CLASSIC_CONTROLLER          0x9A1EFDFD
154 #define EXP_ID_CODE_GUITAR                                      0x9A1EFDFB
155
156 #define EXP_HANDSHAKE_LEN                                       224\r
157 \r
158 /********************
159  *
160  *      End Wiimote internal codes
161  *
162  ********************/
163
164 /* wiimote state flags - (some duplicated in wiiuse.h)*/
165 #define WIIMOTE_STATE_DEV_FOUND                         0x0001
166 #define WIIMOTE_STATE_HANDSHAKE                         0x0002  /* actual connection exists but no handshake yet */
167 #define WIIMOTE_STATE_HANDSHAKE_COMPLETE        0x0004  /* actual connection exists but no handshake yet */
168 #define WIIMOTE_STATE_CONNECTED                         0x0008
169 #define WIIMOTE_STATE_RUMBLE                            0x0010
170 #define WIIMOTE_STATE_ACC                                       0x0020
171 #define WIIMOTE_STATE_EXP                                       0x0040
172 #define WIIMOTE_STATE_IR                                        0x0080
173 #define WIIMOTE_STATE_SPEAKER                           0x0100
174 #define WIIMOTE_STATE_IR_SENS_LVL1                      0x0200
175 #define WIIMOTE_STATE_IR_SENS_LVL2                      0x0400
176 #define WIIMOTE_STATE_IR_SENS_LVL3                      0x0800
177 #define WIIMOTE_STATE_IR_SENS_LVL4                      0x1000
178 #define WIIMOTE_STATE_IR_SENS_LVL5                      0x2000
179
180 #define WIIMOTE_INIT_STATES                                     (WIIMOTE_STATE_IR_SENS_LVL3)
181
182 /* macro to manage states */
183 #define WIIMOTE_IS_SET(wm, s)                   ((wm->state & (s)) == (s))
184 #define WIIMOTE_ENABLE_STATE(wm, s)             (wm->state |= (s))
185 #define WIIMOTE_DISABLE_STATE(wm, s)    (wm->state &= ~(s))
186 #define WIIMOTE_TOGGLE_STATE(wm, s)             ((wm->state & (s)) ? WIIMOTE_DISABLE_STATE(wm, s) : WIIMOTE_ENABLE_STATE(wm, s))
187
188 #define WIIMOTE_IS_FLAG_SET(wm, s)              ((wm->flags & (s)) == (s))
189 #define WIIMOTE_ENABLE_FLAG(wm, s)              (wm->flags |= (s))
190 #define WIIMOTE_DISABLE_FLAG(wm, s)             (wm->flags &= ~(s))
191 #define WIIMOTE_TOGGLE_FLAG(wm, s)              ((wm->flags & (s)) ? WIIMOTE_DISABLE_FLAG(wm, s) : WIIMOTE_ENABLE_FLAG(wm, s))
192
193 #define NUNCHUK_IS_FLAG_SET(wm, s)              ((*(wm->flags) & (s)) == (s))
194
195 /* misc macros */
196 #define WIIMOTE_ID(wm)                                  (wm->unid)
197 #define WIIMOTE_IS_CONNECTED(wm)                (WIIMOTE_IS_SET(wm, WIIMOTE_STATE_CONNECTED))
198
199 /*
200  *      Smooth tilt calculations are computed with the
201  *      exponential moving average formula:
202  *              St = St_last + (alpha * (tilt - St_last))
203  *      alpha is between 0 and 1
204  */
205 #define WIIUSE_DEFAULT_SMOOTH_ALPHA             0.07f
206
207 #define SMOOTH_ROLL                                             0x01
208 #define SMOOTH_PITCH                                    0x02\r
209 \r
210 #include "wiiuse.h"
211 \r
212 #ifdef __cplusplus
213 extern "C" {
214 #endif
215
216 /* not part of the api */
217 int wiiuse_set_report_type(struct wiimote_t* wm);
218 void wiiuse_send_next_pending_read_request(struct wiimote_t* wm);
219 int wiiuse_send(struct wiimote_t* wm, byte report_type, byte* msg, int len);
220 int wiiuse_read_data_cb(struct wiimote_t* wm, wiiuse_read_cb read_cb, byte* buffer, unsigned int offset, unsigned short len);
221
222 #ifdef __cplusplus
223 }
224 #endif
225
226 #endif /* WIIUSE_INTERNAL_H_INCLUDED */