Merge pull request #506 from andrewcsmith/patch-2
[supercollider.git] / HelpSource / Classes / WiiMote.schelp
blob4328e4d4fce37a098e6c0ea6f9e8a623dfd627a0
1 class:: WiiMote
2 summary:: use the Nintendo (tm) Wii Remote
3 related:: Classes/GeneralHID
4 categories:: External Control
6 description::
7 The WiiMote class allows you to access the WiiMote from SuperCollider, both to receive data from the device, as well as send data to the device.
9 subsection::Some Important Issues Regarding WiiMote
11 This class has been developed to work both on the Mac and on Linux. The interface is mostly the same, but there are some usage issues on the Mac.
12 Personally, I found that it works better with an external BlueTooth receiver, than with the internal one (tested on the MacBook Pro). I also found that on the Mac, I have to connect, disconnect and then reconnect to get everything to work properly.
14 The IR options, as well as the Classic controller have not been tested (due to lack of access to either complementary device by the developer).
16 ClassMethods::
18 private::initClass, prStart, prStop, prDiscover
20 method::new
21 note::
22 Should not be called directly. See link::#*discover::.
25 method::start
26 Starts the eventloop. Called automatically by link::#*discover::, so no real need to call this method.
28 argument::updtime
29 updatetime of the eventloop in milliseconds.
31 method::discover
32 Discovers a new device. This calls for the creation of a new device and class instance by calling the method link::#*new::. ( strong::new:: should not be called directly). This method is synchronous, and will block until a device is found or until it times out.
34 When discover is called, the buttons 1 and 2 on the Wii Remote should be pushed to put the device in discovery mode.
36 returns:: A new WiiMote object for the device discovered, or code::nil:: if no device was discovered.
38 discussion::
39 Example to start up:
40 code::
41 w = WiiMote.discover;   // discover a new device
42 w.battery;              // post the battery status of the device
44 // cleanup:
45 WiiMote.closeAll;       // close all devices
46 WiiMote.stop;
49 method::all
50 Returns an link::Classes/Array:: with all WiiMote devices.
52 method::closeAll
53 Close all WiiMote devices.
55 method::stop
56 Stops the eventloop. Only really necessary on Mac, but use it for cross platform robustness.
58 InstanceMethods::
60 private::prInit, prOpen, prClose, prAddress, prConnect, prDisconnect, prCalibration, prEnable, prEnableExpansion, prEnableIRSensor, prEnableMotionSensor, prEnableButtons, prSetVibration, prWiiSetLED, prHandleBatteryEvent, prHandleExtensionEvent, prHandleButtonEvent, prHandleNunchukEvent, prHandleClassicEvent, prHandleIREvent, prHandleAccEvent, prHandleEvent, prReadError, prConnectAction, prDisconnectAction
62 method::dumpEvents
63 dump incoming events for debugging purposes.
65 method::spec
66 Returns the device specification, with symbolic names for each item. Each name links to the current value.
68 method::actionSpec
69 Returns the device action specification, with symbolic names for each item. Each name in the dictionary links to an action to be performed upon receiving a new value.
71 method::closeAction
72 Set an action to be performed when the device closes.
74 method::connectAction
75 Set an action to be performed when the device connects.
77 method::disconnectAction
78 Set an action to be performed when the device disconnects.
80 method::at
81 Get the value of a device property at the given key.
83 method::setAction
84 Set an action to be performed when the value of strong::key:: changes. The key name must be one that occurs in the spec.
86 method::removeAction
87 Remove the previously defined action at the strong::key::.
89 method::close
90 Close the device.
92 subsection::The properties of the Wii Remote
94 method::battery
95 Returns the current battery status of the device.
97 method::ext_type
98 Returns the extension type that is connected.
100 method::remote_buttons
101 Returns an link::Classes/Array:: with the current button values.
103 method::remote_motion
104 Returns an link::Classes/Array:: with the current acceleration values (x,y,z, orientation). Orientation is Mac only.
106 method::remote_ir
107 Returns an link::Classes/Array:: with the found IR objects. (not tested!).
109 method::remote_led
110 Returns an link::Classes/Array:: with the current LED values.
112 method::setLEDState
113 Set the LED with number strong::id:: to value strong::value:: (1=on, 0=off).
115 method::rumble
116 Turn on the rumble, strong::value:: (1=on, 0=off).
118 method::enable
119 Enable the device.
121 method::enableExpansion
122 Enable the device expansion (nunchuk or classic controller).
124 method::enableButtons
125 Enable the buttons on the device.
127 method::enableMotionSensor
128 Enable the motion sensor on the device.
130 method::enableIRSensor
131 Enable the IR sensor on the device.
133 subsection::The properties of the NunChuk
135 method::nunchuk_buttons
136 Returns an link::Classes/Array:: with the current button values.
138 method::nunchuk_motion
139 Returns an link::Classes/Array:: with the current acceleration values (x,y,z, orientation). Orientation is Mac only.
141 method::nunchuk_stick
142 Returns an link::Classes/Array:: with the current stick values.
144 subsection::The properties of the Classic Controller
146 method::classic_buttons
147 Returns an link::Classes/Array:: with the current button values.
149 method::classic_stick1
150 Returns an link::Classes/Array:: with the current stick values of stick 1.
152 method::classic_stick2
153 Returns an link::Classes/Array:: with the current stick values of stick 2.
155 method::classic_analog
156 Returns an link::Classes/Array:: with the current analog values.
158 Examples::
160 code::
161 // Example to start up and view values
162 WiiMote.start;    // start the eventloop
163 w = WiiMote.discover; // discover a new device (wait for post about connected)
165 WiiMote.all;      // post an array of all devices
167 x = WiiMoteGUI.new( w ); // create a GUI (only covers the WiiMote and NunChuk currently)
169 w.enableMotionSensor( 1 );
170 w.enableExpansion( 1 );
172 w.setLEDState( 0,1 ); // turn the first LED on
173 w.rumble( 1 ); // rumble the device
174 w.rumble( 0 ); // rumble the device
176 w.setAction( \bA, { |v| v.postln; } ); // post the value when button A changes.
177 w.removeAction( \bA );
179 // (MacOSX) if you do not see any changes in the motion sensors, then the connection is bad.
180 // push the red button inside the battery compartment, or the buttons 1 and 2 on the WiiMote and start over again to discover...
182 WiiMote.discover; // discover a new device
183 WiiMote.all;      // post an array of all devices
185 w = WiiMote.all[1];
186 x.w.close; // close previous window
187 x = WiiMoteGUI.new( w ); // create a GUI (only covers the WiiMote and NunChuk currently)
189 // now it should work..., if not, repeat the exercise...
192 // clean up
193 WiiMote.closeAll; // close all devices
194 WiiMote.stop;
195 x.w.close;
198 subsection:: IR tracking
199 This example shows a window displaying the objects being tracked by the WiiMote IR camera.
200 code::
202 var q, w, u;
203 q = WiiMote.discover;
204 if(q.isNil) {
205     "No wiimote found, aborting.".error;
206 } {
207     q.enableIRSensor(1);
208     w = Window("IR sensor", Rect(100, 100, 400, 400)).front;
209     w.onClose = { q.close };
210     u = UserView(w, Rect(0, 0, 400, 400));
211     u.background = Color.black;
212     u.drawFunc = {
213         var p;
214         q.remote_ir.do {|ir, i|
215             if(ir.valid>0) {
216                 p = Point(ir.posx*400, ir.posy*400);
217                 Pen.addArc(p, ir.size*500.0, 0, pi*2);
218                 Pen.fillColor = Color.hsv(i/5, 1, 1);
219                 Pen.fill;
220                 Pen.stringAtPoint(
221                     "% @ % %".format(
222                         ir.posx.round(0.01),
223                         ir.posy.round(0.01),
224                         (ir.size*1000).floor
225                     ),
226                     p,
227                     Font(Font.defaultSansFace, 9),
228                     Color.white
229                 );
230             };
231         };
232     };
233     u.animate = true;