RflySimSDK v3.05
RflySimSDK说明文档
载入中...
搜索中...
未找到
vrpn_WiiMote.h
1// vrpn_WiiMote.h: Drive for the WiiMote, based on the WiiUse library.
2// Tested on Windows. Is supposed to also run on Linux.
3//
4// Russ Taylor, revised December 2008
5
6#ifndef VRPN_WIIMOTE_H
7#define VRPN_WIIMOTE_H
8
9#include "vrpn_Configure.h" // IWYU pragma: keep
10
11#if defined(VRPN_USE_WIIUSE)
12
13#include "vrpn_Analog.h"
14#include "vrpn_Analog_Output.h"
15#include "vrpn_Button.h"
16#include "vrpn_Connection.h"
17#include "vrpn_Shared.h"
18
19// maximum number of wiimotes connected to the system
20#define VRPN_WIIUSE_MAX_WIIMOTES 4
21
22// Opaque class to keep us from having to include wiiuse.h in user files.
23// This is defined in vrpn_WiiMote.C.
24class vrpn_Wiimote_Device;
25struct wiimote_t;
26#ifdef vrpn_THREADS_AVAILABLE
27struct vrpn_WiiMote_SharedData;
28#endif
29
30// The buttons are as read from the bit-fields of the primary controller (bits 0-15)
31// and then a second set for any extended controller (nunchuck bits 16-31),
32// (classic controller bits 32-47), (guitar hero 3 bits 48-63).
33//
34// If you enable "reorderButtons" by setting it to 1, the buttons on the Wiimote
35// itself are re-ordered to be reported as follows:
36// button[0] = Home
37// button[1] = "1"
38// button[2] = "2"
39// button[3] = "A"
40// button[4] = "B"
41// button[5] = "-"
42// button[6] = "+"
43// button[7] = direction pad: left
44// button[8] = direction pad: right
45// button[9] = direction pad: down
46// button[10] = direction pad: up
47// button[11] = WIIMOTE_BUTTON_ZACCEL_BIT4
48// button[12] = WIIMOTE_BUTTON_ZACCEL_BIT5
49// button[13] = WIIMOTE_BUTTON_ZACCEL_BIT6
50// button[14] = WIIMOTE_BUTTON_ZACCEL_BIT7
51// button[15] = WIIMOTE_BUTTON_UNKNOWN
52//
53// The Analogs are in an even more random order, both from the primary controller:
54// channel[0] = battery level (0-1)
55// channel[1] = gravity X vector calculation (1 = Earth gravity)
56// channel[2] = gravity Y vector calculation (1 = Earth gravity)
57// channel[3] = gravity Z vector calculation (1 = Earth gravity)
58// channel[4] = X of first sensor spot (0-1023, -1 if not seen)
59// channel[5] = Y of first sensor spot (0-767, -1 if not seen)
60// channel[6] = size of first sensor spot (0-15, -1 if not seen)
61// channel[7] = X of second sensor spot (0-1023, -1 if not seen)
62// channel[9] = Y of second sensor spot (0-767, -1 if not seen)
63// channel[9] = size of second sensor spot (0-15, -1 if not seen)
64// channel[10] = X of third sensor spot (0-1023, -1 if not seen)
65// channel[11] = Y of third sensor spot (0-767, -1 if not seen)
66// channel[12] = size of third sensor spot (0-15, -1 if not seen)
67// channel[13] = X of fourth sensor spot (0-1023, -1 if not seen)
68// channel[14] = Y of fourth sensor spot (0-767, -1 if not seen)
69// channel[15] = size of fourth sensor spot (0-15, -1 if not seen)
70// and on the secondary controllers (skipping values to leave room for expansion)
71// (with the joystick x and y values only available with WiiUse 0.14.2 or newer)
72// channel[16] = nunchuck gravity X vector
73// channel[17] = nunchuck gravity Y vector
74// channel[18] = nunchuck gravity Z vector
75// channel[19] = nunchuck joystick angle
76// channel[20] = nunchuck joystick magnitude
77// channel[21] = nunchuck joystick X
78// channel[22] = nunchuck joystick Y
79//
80// channel[32] = classic L button
81// channel[33] = classic R button
82// channel[34] = classic L joystick angle
83// channel[35] = classic L joystick magnitude
84// channel[36] = classic R joystick angle
85// channel[37] = classic R joystick magnitude
86// channel[38] = classic L joystick X
87// channel[39] = classic L joystick Y
88// channel[40] = classic R joystick X
89// channel[41] = classic R joystick Y
90//
91// channel[48] = guitar hero whammy bar
92// channel[49] = guitar hero joystick angle
93// channel[50] = guitar hero joystick magnitude
94// channel[51] = guitar hero joystick X
95// channel[52] = guitar hero joystick Y
96//
97// Balance board data: (requires WiiUse 0.13 or newer, preferably 0.14 or newer)
98// channel[64] = Balance board: top-left sensor, kg
99// channel[65] = Balance board: top-right sensor, kg
100// channel[66] = Balance board: bottom-left sensor, kg
101// channel[67] = Balance board: bottom-right sensor, kg
102// channel[68] = Balance board: total mass, kg
103// channel[69] = Balance board: center of gravity x, in [-1, 1]
104// channel[70] = Balance board: center of gravity y, in [-1, 1]
105//
106// The Analog_Output 0 is a hack to enable control over the rumble, inherited from
107// the RumblePack driver. This should eventually move to a binary output of
108// some kind (and so should the lights). For now, if you set output 0 to a
109// value greater than or equal to 0.5, it will turn on the rumble; if less, then
110// it will disable it.
111// Channel 1 sets the IR sensitivity: accepts 1, 2, 3, 4, 5 (clipping to this
112// range if given other values), same as the Wii system's sensitivity settings.
113
114// XXX It would be great to use the IR and accelerometer data along with
115// a description of the size of the official Wii sensor bar to compute
116// a pose and report this as a tracker report. This could be done as
117// a second device that reads the values or (better) as a built-in that
118// exports a vrpn_Tracker report. Best would be a Kalman filter that
119// takes all of these as inputs and produces an optimal estimate. This
120// needs to report in meters and we'll have to define an origin (middle
121// of the bar?) and a coordinate system (X along bar's most-horizontal
122// axis, Y vertical to gravity, Z perpendicular to these?).
123
124// XXX It would be great to have a vrpn_Sound device that could play through
125// the speaker on the WiiMote.
126
127class VRPN_API vrpn_WiiMote: public vrpn_Analog, public vrpn_Button_Filter, public vrpn_Analog_Output {
128 public:
129 // If there is more than one WiiMote on the machine, the zero-indexed 'which'
130 // parameter tells which one we want to open.
131 vrpn_WiiMote(const char *name, vrpn_Connection *c = NULL, unsigned which = 0
132 , unsigned useMS = 1, unsigned useIR = 1, unsigned reorderButtons = 0,
133 const char *bdaddr = NULL);
134 ~vrpn_WiiMote();
135
136 virtual void mainloop();
137
138 bool isValid() const;
139
140 protected:
141 // Handle the rumble-magnitude setting (channel 0).
142 static int VRPN_CALLBACK handle_request_message(void *userdata,
144 static int VRPN_CALLBACK handle_request_channels_message(void* userdata,
146 static int VRPN_CALLBACK handle_last_connection_dropped(void *selfPtr, vrpn_HANDLERPARAM data);
147
148 private:
153 void acquireMessageLock();
154 void releaseMessageLock();
156#ifdef vrpn_THREADS_AVAILABLE
158 static void connectThreadFunc(vrpn_ThreadData &threadData);
160 bool waitingForConnection;
162 vrpn_WiiMote_SharedData *sharedData;
164 vrpn_Thread *connectThread;
165#else
166 struct timeval last_reconnect_attempt
167#endif
169 vrpn_Wiimote_Device *wiimote;
171 wiimote_t **available_wiimotes;
172
174 inline void FAIL(const char *msg) {
175 struct timeval now;
176 vrpn_gettimeofday(&now, NULL);
177 send_text_message(msg, now, vrpn_TEXT_ERROR);
178 d_connection = NULL;
179 }
180
186 void report_changes(vrpn_uint32 class_of_service = vrpn_CONNECTION_LOW_LATENCY);
192 void report(vrpn_uint32 class_of_service = vrpn_CONNECTION_LOW_LATENCY);
193
195 struct timeval _timestamp;
196
198 void initialize_wiimote_state(void);
199
201 void handle_event(void);
202
204 void connect_wiimote(int timeout);
205
207 unsigned map_button(unsigned btn);
208};
209
210#endif // VRPN_USE_WIIUSE
211
212#endif // VRPN_WIIMOTE_H
定义 vrpn_Analog_Output.h:26
定义 vrpn_Analog.h:28
virtual void report(vrpn_uint32 class_of_service=vrpn_CONNECTION_LOW_LATENCY, const struct timeval time=vrpn_ANALOG_NOW)
virtual void report_changes(vrpn_uint32 class_of_service=vrpn_CONNECTION_LOW_LATENCY, const struct timeval time=vrpn_ANALOG_NOW)
int send_text_message(const char *msg, struct timeval timestamp, vrpn_TEXT_SEVERITY type=vrpn_TEXT_NORMAL, vrpn_uint32 level=0)
Sends a NULL-terminated text message from the device d_sender_id
virtual void mainloop()=0
定义 vrpn_Button.h:66
Generic connection class not specific to the transport mechanism.
定义 vrpn_Connection.h:562
定义 vrpn_Thread.h:185
This structure is what is passed to a vrpn_Connection message callback.
定义 vrpn_Connection.h:41
定义 vrpn_Thread.h:175