From 71d377c64cf05eb5726e4ec803dc8288bf4c8357 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 7 Mar 2008 18:47:45 +0000 Subject: A first step of success, I got the wiiremote successfully connecting and getting one data event into Pd with the first bang. Now I have to figure out how to run the Carbon CFRunLoop into Pd land. - cleaned up some unused variables - fixed some warnings - folded in the b7 version - cleaned up the port a bit This code directly compiles and works fine on Max/MSP. svn path=/trunk/externals/io/; revision=9543 --- wiiremote/TODO | 7 +++ wiiremote/aka.wiiremote.c | 136 +++++++++++++++++++++++++++++++++----------- wiiremote/wiiremote-help.pd | 96 ++++++++++++++++++++++--------- wiiremote/wiiremote.c | 31 +++++----- wiiremote/wiiremote.h | 2 +- 5 files changed, 199 insertions(+), 73 deletions(-) create mode 100644 wiiremote/TODO (limited to 'wiiremote') diff --git a/wiiremote/TODO b/wiiremote/TODO new file mode 100644 index 0000000..a8da43d --- /dev/null +++ b/wiiremote/TODO @@ -0,0 +1,7 @@ + + + - try out IOBluetoothLocalDeviceAvailable(wiiremote->inquiry); to see if that will set up the event loops (http://lists.apple.com/archives/bluetooth-dev/2006/Dec/msg00001.html) + + +- try CFRunLoopRun(); then CFRunLoopStop(CFRunLoopGetCurrent()); in akawiiremote_clock() and akawiiremote_bang() + diff --git a/wiiremote/aka.wiiremote.c b/wiiremote/aka.wiiremote.c index 9d945b1..767d737 100644 --- a/wiiremote/aka.wiiremote.c +++ b/wiiremote/aka.wiiremote.c @@ -13,6 +13,8 @@ #define SETSYM SETSYMBOL #define SETLONG SETFLOAT #define method t_method +//#define addbang(x) class_addbang(wiiremote_class, (x)) +//#define addmess(x) class_addmessage(class_wiiremote, (x)) static t_class *wiiremote_class; #else /* Max */ #include "ext.h" @@ -20,6 +22,7 @@ static t_class *wiiremote_class; #include "wiiremote.h" #include +#include #define kInterval 100 #define kMaxTrial 100 @@ -39,7 +42,7 @@ typedef struct _akawiiremote Boolean connected; void *statusOut; - void *dataOut + void *dataOut; } t_akawiiremote; void *akawiiremote_class; // the number of instance of this object @@ -53,6 +56,7 @@ void akawiiremote_irsensor(t_akawiiremote *x, long enable); void akawiiremote_vibration(t_akawiiremote *x, long enable); void akawiiremote_led(t_akawiiremote *x, long enable1, long enable2, long enable3, long enable4); void akawiiremote_expansion(t_akawiiremote *x, long enable); +void akawiiremote_extraoutput(t_akawiiremote *x, long enable); void akawiiremote_getbattery(t_akawiiremote *x); void akawiiremote_getexpansion(t_akawiiremote *x); @@ -78,11 +82,11 @@ void main() NumVersion outSoftwareVersion; BluetoothHCIVersionInfo outHardwareVersion; - post("aka.wiiremote 1.0B6-UB by Masayuki Akamatsu"); + post("aka.wiiremote 1.0B7-UB by Masayuki Akamatsu"); - if (IOBluetoothGetVersion(&outSoftwareVersion, &outHardwareVersion)==kIOReturnSuccess) + if (IOBluetoothGetVersion(&outSoftwareVersion, &outHardwareVersion)==kIOReturnSuccess) // B7 { - if (outSoftwareVersion.majorRev < 1 || outSoftwareVersion.minorAndBugRev < 0x63) + if (outSoftwareVersion.majorRev < 1 && outSoftwareVersion.minorAndBugRev < 0x63) { error("requires Blutooth version 1.6.3 or later."); return; @@ -105,18 +109,22 @@ void main() A_GIMME,0); class_addbang(wiiremote_class,(t_method)akawiiremote_bang); + class_addmethod(wiiremote_class,(t_method)akawiiremote_address,gensym("address"),A_DEFSYMBOL, 0); class_addmethod(wiiremote_class,(t_method)akawiiremote_connect,gensym("connect"),0); class_addmethod(wiiremote_class,(t_method)akawiiremote_disconnect,gensym("disconnect"),0); class_addmethod(wiiremote_class,(t_method)akawiiremote_motionsensor,gensym("motion"), A_DEFFLOAT, 0); class_addmethod(wiiremote_class,(t_method)akawiiremote_irsensor,gensym("ir"), A_DEFFLOAT, 0); class_addmethod(wiiremote_class,(t_method)akawiiremote_vibration,gensym("vibration"), A_DEFFLOAT, 0); class_addmethod(wiiremote_class,(t_method)akawiiremote_led,gensym("led"), A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, 0); + class_addmethod(wiiremote_class,(t_method)akawiiremote_expansion,gensym("expansion"), A_DEFFLOAT, 0); + class_addmethod(wiiremote_class,(t_method)akawiiremote_expansion,gensym("nunchuk"), A_DEFFLOAT, 0); + class_addmethod(wiiremote_class,(t_method)akawiiremote_extraoutput,gensym("extraoutput"), A_DEFFLOAT, 0); // B7 class_addmethod(wiiremote_class,(t_method)akawiiremote_getbattery,gensym("getbattery"),0); class_addmethod(wiiremote_class,(t_method)akawiiremote_getexpansion,gensym("getexpansion"),0); class_addmethod(wiiremote_class,(t_method)akawiiremote_getled,gensym("getled"),0); - - class_addmethod(wiiremote_class,(t_method)akawiiremote_assist,gensym("assist"),A_CANT,0); + class_addmethod(wiiremote_class,(t_method)akawiiremote_getaddress,gensym("getaddress"),0); + class_addmethod(wiiremote_class,(t_method)akawiiremote_getcalibration,gensym("getcalibration"), 0); #else /* Max */ setup((t_messlist **)&akawiiremote_class, (method)akawiiremote_new, (method)akawiiremote_free, (short)sizeof(t_akawiiremote), 0L, A_GIMME, 0); @@ -130,6 +138,7 @@ void main() addmess((method)akawiiremote_led,"led", A_DEFLONG, A_DEFLONG, A_DEFLONG, A_DEFLONG, 0); addmess((method)akawiiremote_expansion,"expansion", A_DEFLONG, 0); addmess((method)akawiiremote_expansion,"nunchuk", A_DEFLONG, 0); + addmess((method)akawiiremote_extraoutput,"extraoutput", A_DEFLONG, 0); // B7 addmess((method)akawiiremote_getbattery,"getbattery",0); addmess((method)akawiiremote_getexpansion,"getexpansion",0); @@ -145,15 +154,10 @@ void main() void akawiiremote_bang(t_akawiiremote *x) { - t_atom av[5]; + t_atom av[7]; if (x->wiiremote->device == nil) return; // do nothing - -//#ifdef PD -// outlet_float(x->buttonsOut, (t_float) x->wiiremote->buttonData); -//#else /* Max */ -//#endif /* PD */ if (x->wiiremote->isExpansionPortAttached && x->wiiremote->isExpansionPortEnabled) { @@ -198,6 +202,18 @@ void akawiiremote_bang(t_akawiiremote *x) SETLONG(av + 2, x->wiiremote->nStickY); outlet_anything(x->dataOut, gensym(nunchukStr), 3, av); + if (x->wiiremote->isExtraOutputEnabled) + { + SETSYM(av, gensym("stick_calibration")); + SETLONG(av + 1, x->wiiremote->nunchukJoyStickCalibData.x_min); + SETLONG(av + 2, x->wiiremote->nunchukJoyStickCalibData.x_max); + SETLONG(av + 3, x->wiiremote->nunchukJoyStickCalibData.x_center); + SETLONG(av + 4, x->wiiremote->nunchukJoyStickCalibData.y_min); + SETLONG(av + 5, x->wiiremote->nunchukJoyStickCalibData.y_max); + SETLONG(av + 6, x->wiiremote->nunchukJoyStickCalibData.y_center); + outlet_anything(x->dataOut, gensym(nunchukStr), 7, av); + } + // Motion Sensor if (x->wiiremote->isMotionSensorEnabled) { @@ -207,6 +223,18 @@ void akawiiremote_bang(t_akawiiremote *x) SETLONG(av + 3, x->wiiremote->nAccZ); SETLONG(av + 4, x->wiiremote->nOrientation); outlet_anything(x->dataOut, gensym(nunchukStr), 5, av); + + if (x->wiiremote->isExtraOutputEnabled) + { + SETSYM(av, gensym("motion_calibration")); + SETLONG(av + 1, x->wiiremote->nunchukCalibData.accX_zero); + SETLONG(av + 2, x->wiiremote->nunchukCalibData.accY_zero); + SETLONG(av + 3, x->wiiremote->nunchukCalibData.accZ_zero); + SETLONG(av + 4, x->wiiremote->nunchukCalibData.accX_1g); + SETLONG(av + 5, x->wiiremote->nunchukCalibData.accY_1g); + SETLONG(av + 6, x->wiiremote->nunchukCalibData.accZ_1g); + outlet_anything(x->dataOut, gensym(nunchukStr), 7, av); + } } } } @@ -227,6 +255,31 @@ void akawiiremote_bang(t_akawiiremote *x) SETFLOAT(av + 3, x->wiiremote->angle); SETLONG (av + 4, x->wiiremote->tracking); outlet_anything(x->dataOut, gensym(remoteStr), 5, av); + + if (x->wiiremote->isExtraOutputEnabled) // B7 + { + SETSYM(av, gensym("irraw")); + SETLONG(av + 1, 0); + SETLONG(av + 2, x->wiiremote->irData[0].x); + SETLONG(av + 3, x->wiiremote->irData[0].y); + SETLONG(av + 4, x->wiiremote->irData[0].s); + outlet_anything(x->dataOut, gensym(remoteStr), 5, av); + SETLONG(av + 1, 1); + SETLONG(av + 2, x->wiiremote->irData[1].x); + SETLONG(av + 3, x->wiiremote->irData[1].y); + SETLONG(av + 4, x->wiiremote->irData[1].s); + outlet_anything(x->dataOut, gensym(remoteStr), 5, av); + SETLONG(av + 1, 2); + SETLONG(av + 2, x->wiiremote->irData[2].x); + SETLONG(av + 3, x->wiiremote->irData[2].y); + SETLONG(av + 4, x->wiiremote->irData[2].s); + outlet_anything(x->dataOut, gensym(remoteStr), 5, av); + SETLONG(av + 1, 3); + SETLONG(av + 2, x->wiiremote->irData[3].x); + SETLONG(av + 3, x->wiiremote->irData[3].y); + SETLONG(av + 4, x->wiiremote->irData[3].s); + outlet_anything(x->dataOut, gensym(remoteStr), 5, av); + } } // Motion Sensor @@ -238,6 +291,18 @@ void akawiiremote_bang(t_akawiiremote *x) SETLONG(av + 3, x->wiiremote->accZ); SETLONG(av + 4, x->wiiremote->orientation); outlet_anything(x->dataOut, gensym(remoteStr), 5, av); + + if (x->wiiremote->isExtraOutputEnabled) // B7 + { + SETSYM(av, gensym("motion_calibration")); + SETLONG(av + 1, x->wiiremote->wiiCalibData.accX_zero); + SETLONG(av + 2, x->wiiremote->wiiCalibData.accY_zero); + SETLONG(av + 3, x->wiiremote->wiiCalibData.accZ_zero); + SETLONG(av + 4, x->wiiremote->wiiCalibData.accX_1g); + SETLONG(av + 5, x->wiiremote->wiiCalibData.accY_1g); + SETLONG(av + 6, x->wiiremote->wiiCalibData.accZ_1g); + outlet_anything(x->dataOut, gensym(remoteStr), 7, av); + } } } @@ -255,6 +320,7 @@ void akawiiremote_address(t_akawiiremote *x, t_symbol *s) void akawiiremote_connect(t_akawiiremote *x) { + post("akawiiremote_connect"); t_atom status; Boolean result; @@ -278,6 +344,8 @@ void akawiiremote_foundFunc(t_akawiiremote *x) void akawiiremote_disconnect(t_akawiiremote *x) { + post("akawiiremote_disconnect"); + Boolean result; t_atom status; @@ -296,7 +364,6 @@ void akawiiremote_disconnect(t_akawiiremote *x) void akawiiremote_motionsensor(t_akawiiremote *x, long enable) { Boolean result; - t_atom status; result = wiiremote_motionsensor(x->wiiremote, enable); //SETLONG(&status, result); @@ -306,17 +373,20 @@ void akawiiremote_motionsensor(t_akawiiremote *x, long enable) void akawiiremote_irsensor(t_akawiiremote *x, long enable) { Boolean result; - t_atom status; result = wiiremote_irsensor(x->wiiremote, enable); //SETLONG(&status, result); //outlet_anything(x->statusOut, gensym("ir"), 1, &status); } +void akawiiremote_extraoutput(t_akawiiremote *x, long enable) // B7 +{ + x->wiiremote->isExtraOutputEnabled = enable; +} + void akawiiremote_expansion(t_akawiiremote *x, long enable) { Boolean result; - t_atom status; result = wiiremote_expansion(x->wiiremote, enable); //SETLONG(&status, result); @@ -326,7 +396,6 @@ void akawiiremote_expansion(t_akawiiremote *x, long enable) void akawiiremote_vibration(t_akawiiremote *x, long enable) { Boolean result; - t_atom status; result = wiiremote_vibration(x->wiiremote, enable); //SETLONG(&status, result); @@ -336,7 +405,6 @@ void akawiiremote_vibration(t_akawiiremote *x, long enable) void akawiiremote_led(t_akawiiremote *x, long enable1, long enable2, long enable3, long enable4) { Boolean result; - t_atom status; result = wiiremote_led(x->wiiremote, enable1, enable2, enable3, enable4); //SETLONG(&status, result); @@ -509,12 +577,27 @@ void akawiiremote_assist(t_akawiiremote *x, void *b, long m, long a, char *s) void *akawiiremote_new(t_symbol *s, short ac, t_atom *av) { - t_akawiiremote *x; - #ifdef PD - x = (t_akawiiremote *)pd_new(wiiremote_class); + t_akawiiremote *x = (t_akawiiremote *)pd_new(wiiremote_class); + t_symbol *first_argument; + + x->statusOut = outlet_new(&x->x_obj, 0); + x->dataOut = outlet_new(&x->x_obj, &s_list); + +/* this sets the device name from the object arguments */ + first_argument = atom_getsymbolarg(0, ac, av); + if(first_argument != &s_) + atom_string(av, x->address, MAXPDSTRING-1); #else /* Max */ + t_akawiiremote *x; + x = (t_akawiiremote *)newobject(akawiiremote_class); + + x->statusOut = outlet_new(x, 0); + x->dataOut = outlet_new(x, 0); + + if (ac>0 && av[0].a_type == A_SYM) + strcpy(x->address, av[0].a_w.w_sym->s_name); #endif /* PD */ x->wiiremote = (WiiRemoteRef)getbytes(sizeof(WiiRemoteRec)); @@ -529,22 +612,11 @@ void *akawiiremote_new(t_symbol *s, short ac, t_atom *av) x->wiiremote->isLED2Illuminated = false; x->wiiremote->isLED3Illuminated = false; x->wiiremote->isLED4Illuminated = false; + x->wiiremote->isExtraOutputEnabled = false; } x->clock = clock_new(x, (method)akawiiremote_clock); -#ifdef PD - if (ac>0 && av[0].a_type == A_SYMBOL) - strcpy(x->address, av[0].a_w.w_symbol->s_name); - x->statusOut = outlet_new(&x->x_obj, 0); - x->dataOut = outlet_new(&x->x_obj, 0); -#else /* Max */ - if (ac>0 && av[0].a_type == A_SYM) - strcpy(x->address, av[0].a_w.w_sym->s_name); - - x->statusOut = outlet_new(x, 0); - x->dataOut = outlet_new(x, 0); -#endif /* PD */ x->connected = false; return x; diff --git a/wiiremote/wiiremote-help.pd b/wiiremote/wiiremote-help.pd index 737fe6b..5c8f610 100644 --- a/wiiremote/wiiremote-help.pd +++ b/wiiremote/wiiremote-help.pd @@ -1,21 +1,14 @@ -#N canvas 41 171 577 460 10; -#X obj 451 21 import io; -#X obj 213 388 wiiremote; -#X msg 168 207 connect; -#X msg 185 233 disconnect; -#X msg 286 237 motionsensor \$1; -#X obj 286 215 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 +#N canvas 287 96 744 626 10; +#X msg 128 207 connect; +#X msg 141 228 disconnect; +#X obj 218 203 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; -#X obj 406 215 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 +#X obj 294 202 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; -#X msg 406 237 irsensor \$1; -#X obj 64 254 metro 100; -#X obj 64 233 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1 -; -#X msg 376 290 getbatterylevel; -#X msg 376 310 getledstatus; -#X msg 376 330 getexpansionstatus; -#X msg 129 283 bang; +#X obj 127 285 metro 100; +#X obj 127 264 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 +1; +#X msg 89 283 bang; #X text 49 49 - Use the Bluetooth Setup Assistant to setup the WiiRemote with your computer (only required for the first use).; #X text 49 79 - Press the "Sync" button on the WiiRemote \, four LEDs @@ -24,15 +17,64 @@ will start blinking.; blinking once its connected; #X text 49 139 - Start the [metro] to get updates from [wiiremote] ; -#X connect 2 0 1 0; -#X connect 3 0 1 0; -#X connect 4 0 1 0; +#X obj 399 526 pddp/print; +#X obj 354 556 pddp/print; +#X obj 354 410 route remote; +#X msg 503 290 getbattery; +#X msg 503 310 getled; +#X msg 503 330 getexpansion; +#X obj 489 431 print RIGHT; +#X obj 253 430 print LEFT; +#X obj 354 476 route motion buttons ir; +#X obj 444 497 pddp/print; +#X msg 294 224 ir \$1; +#X msg 218 225 motion \$1; +#X obj 344 202 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 +1; +#X msg 344 224 vibration \$1; +#X obj 434 202 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 +1; +#X msg 434 224 expansion \$1; +#X obj 524 202 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 +1; +#X msg 524 223 extraoutput \$1; +#N canvas 254 342 450 300 address 0; +#X obj 176 252 outlet; +#X msg 206 126 getaddress; +#X msg 176 72 address 00-1e-35-4c-e6-f1; +#X connect 1 0 0 0; +#X connect 2 0 0 0; +#X restore 25 462 pd address; +#X msg 503 352 getaddress; +#X obj 631 536 dac~; +#X obj 632 408 pddp/dsp; +#X obj 640 500 osc~ 100; +#X obj 303 388 wiiremote 00-1e-35-4c-e6-f1; +#X connect 0 0 34 0; +#X connect 1 0 34 0; +#X connect 2 0 22 0; +#X connect 3 0 21 0; +#X connect 4 0 34 0; #X connect 5 0 4 0; -#X connect 6 0 7 0; -#X connect 7 0 1 0; -#X connect 8 0 1 0; -#X connect 9 0 8 0; -#X connect 10 0 1 0; -#X connect 11 0 1 0; -#X connect 12 0 1 0; -#X connect 13 0 1 0; +#X connect 6 0 34 0; +#X connect 13 0 19 0; +#X connect 13 1 17 0; +#X connect 14 0 34 0; +#X connect 15 0 34 0; +#X connect 16 0 34 0; +#X connect 19 0 12 0; +#X connect 19 1 11 0; +#X connect 19 2 20 0; +#X connect 21 0 34 0; +#X connect 22 0 34 0; +#X connect 23 0 24 0; +#X connect 24 0 34 0; +#X connect 25 0 26 0; +#X connect 26 0 34 0; +#X connect 27 0 28 0; +#X connect 28 0 34 0; +#X connect 30 0 34 0; +#X connect 33 0 31 0; +#X connect 33 0 31 1; +#X connect 34 0 18 0; +#X connect 34 1 13 0; diff --git a/wiiremote/wiiremote.c b/wiiremote/wiiremote.c index 2caffb7..481085e 100644 --- a/wiiremote/wiiremote.c +++ b/wiiremote/wiiremote.c @@ -208,15 +208,16 @@ Boolean readData(WiiRemoteRef wiiremote, unsigned long address, unsigned short l void checkDevice(WiiRemoteRef wiiremote, IOBluetoothDeviceRef device) { + post("checkDevice"); CFStringRef name; CFStringRef address; - + if (wiiremote_isconnected(wiiremote)) return; name = IOBluetoothDeviceGetName(device); address = IOBluetoothDeviceGetAddressString(device); - if (name != nil && address != nil) + if (name != nil && address != nil) { if (CFStringCompare(name, CFSTR("Nintendo RVL-CNT-01"), 0) == kCFCompareEqualTo) { @@ -233,17 +234,20 @@ void checkDevice(WiiRemoteRef wiiremote, IOBluetoothDeviceRef device) void myFoundFunc(void *refCon, IOBluetoothDeviceInquiryRef inquiry, IOBluetoothDeviceRef device) { + post("myFoundFunc"); checkDevice((WiiRemoteRef)refCon, device); } void myUpdatedFunc(void *refCon, IOBluetoothDeviceInquiryRef inquiry, IOBluetoothDeviceRef device, uint32_t devicesRemaining) { + post("myUpdatedFunc"); + checkDevice((WiiRemoteRef)refCon, device); } void myCompleteFunc(void *refCon, IOBluetoothDeviceInquiryRef inquiry, IOReturn error, Boolean aborted) { - IOReturn ret; + post("myCompleteFunc"); if (aborted) return; // called by stop ;) @@ -252,14 +256,10 @@ void myCompleteFunc(void *refCon, IOBluetoothDeviceInquiryRef inquiry, IOReturn wiiremote_stopsearch((WiiRemoteRef)refCon); return; } - - /* - ret = IOBluetoothDeviceInquiryStart(((WiiRemoteRef)refCon)->inquiry); - if (ret != kIOReturnSuccess) - { - wiiremote_stopsearch((WiiRemoteRef)refCon); - } - */ +#ifdef PD + // PD doesn't use the Carbon loop, so we have to manually control it + CFRunLoopStop( CFRunLoopGetCurrent() ); +#endif } //-------------------------------------------------------------------------------------------- @@ -274,11 +274,12 @@ Boolean wiiremote_isconnected(WiiRemoteRef wiiremote) Boolean wiiremote_search(WiiRemoteRef wiiremote, char *address) { + post("wiiremote_search"); IOReturn ret; if (wiiremote->inquiry != nil) return true; - + wiiremote->inquiry = IOBluetoothDeviceInquiryCreateWithCallbackRefCon((void *)wiiremote); IOBluetoothDeviceInquirySetDeviceFoundCallback(wiiremote->inquiry, myFoundFunc); IOBluetoothDeviceInquirySetDeviceNameUpdatedCallback(wiiremote->inquiry, myUpdatedFunc); @@ -295,11 +296,15 @@ Boolean wiiremote_search(WiiRemoteRef wiiremote, char *address) wiiremote->inquiry = nil; return false; } +#ifdef PD + CFRunLoopRun(); // PD doesn't use the Carbon loop, so we have to manually control it +#endif return true; } Boolean wiiremote_stopsearch(WiiRemoteRef wiiremote) { + post("wiiremote_stopsearch"); IOReturn ret; if (wiiremote->inquiry == nil) @@ -841,7 +846,7 @@ Boolean wiiremote_connect(WiiRemoteRef wiiremote) Boolean wiiremote_disconnect(WiiRemoteRef wiiremote) { - short i; + short i = 0; if (wiiremote->cchan) { diff --git a/wiiremote/wiiremote.h b/wiiremote/wiiremote.h index f8ad39d..4a03f09 100644 --- a/wiiremote/wiiremote.h +++ b/wiiremote/wiiremote.h @@ -67,7 +67,6 @@ enum { WiiClassicControllerPlusButton }; - typedef UInt16 WiiExpansionPortType; enum{ WiiExpNotAttached, @@ -131,6 +130,7 @@ typedef struct _WiiRemoteRec Boolean isLED2Illuminated; Boolean isLED3Illuminated; Boolean isLED4Illuminated; + Boolean isExtraOutputEnabled; Boolean isExpansionPortAttached; -- cgit v1.2.1