From 96715c9b2b6afb2f677aaa3d351c26627fd6732b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 28 Dec 2006 23:16:03 +0000 Subject: ported b4 from Masayuki Akamatsu, fixed one minor warning svn path=/trunk/externals/io/; revision=7092 --- wiiremote/aka.wiiremote.c | 47 ++--- wiiremote/aka.wiiremote_b2_pd-port.patch | 223 ++++++++++++++++++++ wiiremote/aka.wiiremote_b3_pd-port.patch | 176 ++++++++++++++++ wiiremote/aka.wiiremote_b4_pd-port.patch | 186 ++++++++++++++++ wiiremote/wiiremote.c | 351 ++++++++++++++++--------------- wiiremote/wiiremote.h | 23 +- 6 files changed, 797 insertions(+), 209 deletions(-) create mode 100644 wiiremote/aka.wiiremote_b2_pd-port.patch create mode 100644 wiiremote/aka.wiiremote_b3_pd-port.patch create mode 100644 wiiremote/aka.wiiremote_b4_pd-port.patch diff --git a/wiiremote/aka.wiiremote.c b/wiiremote/aka.wiiremote.c index 3c09341..662f94e 100644 --- a/wiiremote/aka.wiiremote.c +++ b/wiiremote/aka.wiiremote.c @@ -13,7 +13,6 @@ static t_class *wiiremote_class; #endif /* PD */ #include "wiiremote.h" - #include #define kInterval 100 @@ -41,8 +40,6 @@ typedef struct _akawiiremote void *akawiiremote_class; // the number of instance of this object -short akawiiremote_count; - void akawiiremote_bang(t_akawiiremote *x); void akawiiremote_connect(t_akawiiremote *x); void akawiiremote_disconnect(t_akawiiremote *x); @@ -83,7 +80,7 @@ void main() return; } - post("aka.wiiremote 1.0B3-UB by Masayuki Akamatsu"); + post("aka.wiiremote 1.0B4-UB by Masayuki Akamatsu"); #ifdef PD post("\tPd port by Hans-Christoph Steiner"); @@ -125,8 +122,6 @@ void main() addmess((method)akawiiremote_assist,"assist",A_CANT,0); #endif /* PD */ - - akawiiremote_count = 0; } //-------------------------------------------------------------------------------------------- @@ -170,14 +165,14 @@ void akawiiremote_connect(t_akawiiremote *x) t_atom status; Boolean result; - if (wiiremote_isconnected()) + if (wiiremote_isconnected(x->wiiremote)) { SETLONG(&status, -1); outlet_anything(x->statusOut, gensym("connect"), 1, &status); } else { - result = wiiremote_search(); // start searching the device + result = wiiremote_search(x->wiiremote); // start searching the device x->trial = 0; clock_unset(x->clock); // stop clock clock_delay(x->clock, 0); // start clock to check the device found @@ -193,29 +188,29 @@ void akawiiremote_disconnect(t_akawiiremote *x) Boolean result; t_atom status; - result = wiiremote_disconnect(); + result = wiiremote_disconnect(x->wiiremote); SETLONG(&status, result); outlet_anything(x->statusOut, gensym("disconnect"), 1, &status); } void akawiiremote_motionsensor(t_akawiiremote *x, long enable) { - wiiremote_motionsensor(enable); + wiiremote_motionsensor(x->wiiremote, enable); } void akawiiremote_irsensor(t_akawiiremote *x, long enable) { - wiiremote_irsensor(enable); + wiiremote_irsensor(x->wiiremote, enable); } void akawiiremote_vibration(t_akawiiremote *x, long enable) { - wiiremote_vibration(enable); + wiiremote_vibration(x->wiiremote, enable); } void akawiiremote_led(t_akawiiremote *x, long enable1, long enable2, long enable3, long enable4) { - wiiremote_led(enable1, enable2, enable3, enable4); + wiiremote_led(x->wiiremote, enable1, enable2, enable3, enable4); } //-------------------------------------------------------------------------------------------- @@ -251,16 +246,16 @@ void akawiiremote_getledstatus(t_akawiiremote *x) void akawiiremote_clock(t_akawiiremote *x) { - Boolean result; + //Boolean result; t_atom status; - if (wiiremote_isconnected()) // if the device is connected... + if (wiiremote_isconnected(x->wiiremote)) // if the device is connected... { clock_unset(x->clock); // stop clock - wiiremote_stopsearch(); + wiiremote_stopsearch(x->wiiremote); //result = wiiremote_connect(); // remove in B3 - wiiremote_getstatus(); // add in B3 + wiiremote_getstatus(x->wiiremote); // add in B3 SETLONG(&status, 1); outlet_anything(x->statusOut, gensym("connect"), 1, &status); } @@ -274,7 +269,7 @@ void akawiiremote_clock(t_akawiiremote *x) { clock_unset(x->clock); // stop clock - wiiremote_stopsearch(); + wiiremote_stopsearch(x->wiiremote); SETLONG(&status, 0); outlet_anything(x->statusOut, gensym("connect"), 1, &status); } @@ -315,7 +310,8 @@ void *akawiiremote_new(t_symbol *s, short ac, t_atom *av) #ifdef PD t_akawiiremote *x = (t_akawiiremote *)pd_new(wiiremote_class); - x->wiiremote = wiiremote_init(); + if (x->wiiremote != nil) + wiiremote_init(x->wiiremote); x->clock = clock_new(x, (t_method)akawiiremote_clock); @@ -329,7 +325,9 @@ void *akawiiremote_new(t_symbol *s, short ac, t_atom *av) x = (t_akawiiremote *)newobject(akawiiremote_class); - x->wiiremote = wiiremote_init(); + x->wiiremote = (WiiRemoteRef)getbytes(sizeof(WiiRemoteRec)); // add in 1.0B4 + if (x->wiiremote != nil) + wiiremote_init(x->wiiremote); x->clock = clock_new(x, (method)akawiiremote_clock); @@ -341,15 +339,16 @@ void *akawiiremote_new(t_symbol *s, short ac, t_atom *av) x->trial = 0; x->interval = kInterval; - akawiiremote_count++; return x; } void akawiiremote_free(t_akawiiremote *x) { - akawiiremote_count--; - if (akawiiremote_count == 0) - wiiremote_disconnect(); + if (x->wiiremote != nil) // add in 1.0B4 + { + wiiremote_disconnect(x->wiiremote); + freebytes(x->wiiremote, sizeof(WiiRemoteRec)); // add in 1.0B4 + } clock_unset(x->clock); #ifdef PD diff --git a/wiiremote/aka.wiiremote_b2_pd-port.patch b/wiiremote/aka.wiiremote_b2_pd-port.patch new file mode 100644 index 0000000..3f96112 --- /dev/null +++ b/wiiremote/aka.wiiremote_b2_pd-port.patch @@ -0,0 +1,223 @@ +--- /Users/hans/Desktop/aka.wiiremote-b2-src/aka.wiiremote.c 2006-12-15 08:36:06.000000000 -0500 ++++ aka.wiiremote.c 2006-12-16 17:05:31.000000000 -0500 +@@ -1,15 +1,28 @@ + // aka.wiiremote.c + // Copyright by Masayuki Akamatsu ++// port to Pd by Hans-Christoph Steiner + ++ ++#ifdef PD ++#include "m_pd.h" ++#define SETLONG SETFLOAT ++static t_class *wiiremote_class; ++#else /* Max */ + #include "ext.h" ++#endif + #include "wiiremote.h" + + #define kInterval 100 + #define kMaxTrial 100 + ++ + typedef struct _akawiiremote + { ++#ifdef PD ++ t_object x_obj; ++#else /* Max */ + struct object obj; ++#endif + + WiiRemoteRef wiiremote; + +@@ -44,6 +57,36 @@ + void *akawiiremote_new(t_symbol *s, short ac, t_atom *av); + void akawiiremote_free(t_akawiiremote *x); + ++#ifdef PD ++void wiiremote_setup() ++{ ++ wiiremote_class = class_new(gensym("wiiremote"), ++ (t_newmethod)akawiiremote_new, ++ (t_method)akawiiremote_free, ++ sizeof(t_akawiiremote), ++ CLASS_DEFAULT, ++ A_GIMME,0); ++ ++ class_addbang(wiiremote_class,(t_method)akawiiremote_bang); ++ 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("motionsensor"), A_DEFFLOAT, 0); ++ class_addmethod(wiiremote_class,(t_method)akawiiremote_irsensor,gensym("irsensor"), 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_getbatterylevel,gensym("getbatterylevel"),0); ++ class_addmethod(wiiremote_class,(t_method)akawiiremote_getexpansionstatus,gensym("getexpansionstatus"),0); ++ class_addmethod(wiiremote_class,(t_method)akawiiremote_getledstatus,gensym("getledstatus"),0); ++ ++ class_addmethod(wiiremote_class,(t_method)akawiiremote_assist,gensym("assist"),A_CANT,0); ++ ++ post("aka.wiiremote 1.0B2-UB by Masayuki Akamatsu"); ++ post("\tPd port by Hans-Christoph Steiner"); ++ ++ akawiiremote_count = 0; ++} ++#else /* Max */ + void main() + { + setup((t_messlist **)&akawiiremote_class, (method)akawiiremote_new, (method)akawiiremote_free, (short)sizeof(t_akawiiremote), 0L, A_GIMME, 0); +@@ -66,7 +109,7 @@ + + akawiiremote_count = 0; + } +- ++#endif /* PD */ + //-------------------------------------------------------------------------------------------- + + void akawiiremote_bang(t_akawiiremote *x) +@@ -76,6 +119,27 @@ + if (x->wiiremote->device == nil) + return; // do nothing + ++#ifdef PD ++ outlet_float(x->buttonsOut, (t_float) x->wiiremote->buttonData); ++ ++ if (x->wiiremote->isIRSensorEnabled) ++ { ++ SETFLOAT(list, x->wiiremote->posX); ++ SETFLOAT(list + 1, x->wiiremote->posY); ++ SETFLOAT(list + 2, x->wiiremote->angle); ++ SETFLOAT (list + 3, x->wiiremote->tracking); ++ outlet_list(x->irOut, &s_list, 4, list); ++ } ++ ++ if (x->wiiremote->isMotionSensorEnabled) ++ { ++ SETFLOAT(list, x->wiiremote->accX); ++ SETFLOAT(list + 1, x->wiiremote->accY); ++ SETFLOAT(list + 2, x->wiiremote->accZ); ++ SETFLOAT(list + 3, x->wiiremote->orientation); ++ outlet_list(x->accOut, &s_list, 4, list); ++ } ++#else /* Max */ + outlet_int(x->buttonsOut, x->wiiremote->buttonData); + + if (x->wiiremote->isIRSensorEnabled) +@@ -95,6 +159,7 @@ + SETLONG(list + 3, x->wiiremote->orientation); + outlet_list(x->accOut, 0L, 4, &list); + } ++#endif /* PD */ + + wiiremote_getstatus(); + } +@@ -173,11 +238,19 @@ + { + t_atom list[4]; + ++#ifdef PD ++ SETFLOAT(list, x->wiiremote->isLED1Illuminated); ++ SETFLOAT(list + 1, x->wiiremote->isLED2Illuminated); ++ SETFLOAT(list + 2, x->wiiremote->isLED3Illuminated); ++ SETFLOAT(list + 3, x->wiiremote->isLED4Illuminated); ++ outlet_anything(x->statusOut, gensym("ledstatus"), 4, list); ++#else /* Max */ + SETLONG(list, x->wiiremote->isLED1Illuminated); + SETLONG(list + 1, x->wiiremote->isLED2Illuminated); + SETLONG(list + 2, x->wiiremote->isLED3Illuminated); + SETLONG(list + 3, x->wiiremote->isLED4Illuminated); + outlet_anything(x->statusOut, gensym("ledstatus"), 4, &list); ++#endif + } + + //-------------------------------------------------------------------------------------------- +@@ -222,11 +295,13 @@ + + void akawiiremote_assist(t_akawiiremote *x, void *b, long m, long a, char *s) + { ++#ifndef PD /* Max */ + if (m==ASSIST_INLET) + { + sprintf(s,"connect, bang, disconnect...."); + } + else ++#endif /* NOT PD */ + { + switch(a) + { +@@ -242,6 +317,17 @@ + + void *akawiiremote_new(t_symbol *s, short ac, t_atom *av) + { ++#ifdef PD ++ t_akawiiremote *x = (t_akawiiremote *)pd_new(wiiremote_class); ++ ++ x->clock = clock_new(x, (t_method)akawiiremote_clock); ++ ++ /* create anything outlet used for HID data */ ++ x->statusOut = outlet_new(&x->x_obj, 0); ++ x->buttonsOut = outlet_new(&x->x_obj, &s_float); ++ x->irOut = outlet_new(&x->x_obj, &s_list); ++ x->accOut = outlet_new(&x->x_obj, &s_list); ++#else /* Max */ + t_akawiiremote *x; + + x = (t_akawiiremote *)newobject(akawiiremote_class); +@@ -249,13 +335,15 @@ + x->wiiremote = wiiremote_init(); + + x->clock = clock_new(x, (method)akawiiremote_clock); +- x->trial = 0; +- x->interval = kInterval; + + x->statusOut = outlet_new(x, 0); + x->buttonsOut = intout(x); + x->irOut = listout(x); + x->accOut = listout(x); ++#endif /* PD */ ++ x->trial = 0; ++ x->interval = kInterval; ++ + + akawiiremote_count++; + return x; +@@ -267,6 +355,12 @@ + if (akawiiremote_count == 0) + wiiremote_disconnect(); + ++#ifdef PD ++ if (x->clock) ++ clock_unset(x->clock); ++ clock_free(x->clock); ++#else /* Max */ + freeobject(x->clock); ++#endif + } + +--- /Users/hans/Desktop/aka.wiiremote-b2-src/wiiremote.h 2006-12-14 10:21:42.000000000 -0500 ++++ wiiremote.h 2006-12-16 16:48:38.000000000 -0500 +@@ -2,9 +2,13 @@ + // Copyright by Masayuki Akamatsu + // Based on "DarwiinRemote" by Hiroaki Kimura + ++#include + #include + #include + ++#include ++#include ++ + typedef struct { + int x, y, s; + } IRData; +--- /Users/hans/Desktop/aka.wiiremote-b2-src/wiiremote.c 2006-12-15 08:31:05.000000000 -0500 ++++ wiiremote.c 2006-12-16 17:12:14.000000000 -0500 +@@ -4,6 +4,8 @@ + + #include "wiiremote.h" + ++#include ++ + // this type is used a lot (data array): + typedef unsigned char darr[]; + diff --git a/wiiremote/aka.wiiremote_b3_pd-port.patch b/wiiremote/aka.wiiremote_b3_pd-port.patch new file mode 100644 index 0000000..8609c62 --- /dev/null +++ b/wiiremote/aka.wiiremote_b3_pd-port.patch @@ -0,0 +1,176 @@ +--- /Users/hans/Documents/Research/HID/wiiremote/aka.wiiremote-b3-src/wiiremote.h 2006-12-20 05:29:31.000000000 -0500 ++++ wiiremote.h 2006-12-28 01:36:00.000000000 -0500 +@@ -2,8 +2,13 @@ + // Copyright by Masayuki Akamatsu + // Based on "DarwiinRemote" by Hiroaki Kimura + ++#include ++#include + #include + ++#include ++#include ++ + typedef struct { + int x, y, s; + } IRData; +--- /Users/hans/Documents/Research/HID/wiiremote/aka.wiiremote-b3-src/aka.wiiremote.c 2006-12-20 06:09:10.000000000 -0500 ++++ aka.wiiremote.c 2006-12-28 17:47:08.000000000 -0500 +@@ -4,15 +4,28 @@ + // 1.0B2 : 2006.12.15 + // 1.0B3 : 2006.12.20 + ++#ifdef PD ++#include "m_pd.h" ++#define SETLONG SETFLOAT ++static t_class *wiiremote_class; ++#else /* Max */ + #include "ext.h" ++#endif /* PD */ ++ + #include "wiiremote.h" + ++#include ++ + #define kInterval 100 + #define kMaxTrial 100 + + typedef struct _akawiiremote + { ++#ifdef PD ++ t_object x_obj; ++#else /* Max */ + struct object obj; ++#endif + + WiiRemoteRef wiiremote; + +@@ -47,7 +60,11 @@ + void *akawiiremote_new(t_symbol *s, short ac, t_atom *av); + void akawiiremote_free(t_akawiiremote *x); + ++#ifdef PD ++void wiiremote_setup() ++#else /* Max */ + void main() ++#endif /* PD */ + { + NumVersion outSoftwareVersion; + BluetoothHCIVersionInfo outHardwareVersion; +@@ -66,6 +83,32 @@ + return; + } + ++ post("aka.wiiremote 1.0B3-UB by Masayuki Akamatsu"); ++ ++#ifdef PD ++ post("\tPd port by Hans-Christoph Steiner"); ++ ++ wiiremote_class = class_new(gensym("wiiremote"), ++ (t_newmethod)akawiiremote_new, ++ (t_method)akawiiremote_free, ++ sizeof(t_akawiiremote), ++ CLASS_DEFAULT, ++ A_GIMME,0); ++ ++ class_addbang(wiiremote_class,(t_method)akawiiremote_bang); ++ 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("motionsensor"), A_DEFFLOAT, 0); ++ class_addmethod(wiiremote_class,(t_method)akawiiremote_irsensor,gensym("irsensor"), 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_getbatterylevel,gensym("getbatterylevel"),0); ++ class_addmethod(wiiremote_class,(t_method)akawiiremote_getexpansionstatus,gensym("getexpansionstatus"),0); ++ class_addmethod(wiiremote_class,(t_method)akawiiremote_getledstatus,gensym("getledstatus"),0); ++ ++ class_addmethod(wiiremote_class,(t_method)akawiiremote_assist,gensym("assist"),A_CANT,0); ++#else /* Max */ + setup((t_messlist **)&akawiiremote_class, (method)akawiiremote_new, (method)akawiiremote_free, (short)sizeof(t_akawiiremote), 0L, A_GIMME, 0); + + addbang((method)akawiiremote_bang); +@@ -81,8 +124,7 @@ + addmess((method)akawiiremote_getledstatus,"getledstatus",0); + + addmess((method)akawiiremote_assist,"assist",A_CANT,0); +- +- post("aka.wiiremote 1.0B3-UB by Masayuki Akamatsu"); ++#endif /* PD */ + + akawiiremote_count = 0; + } +@@ -96,7 +138,11 @@ + if (x->wiiremote->device == nil) + return; // do nothing + ++#ifdef PD ++ outlet_float(x->buttonsOut, (t_float) x->wiiremote->buttonData); ++#else /* Max */ + outlet_int(x->buttonsOut, x->wiiremote->buttonData); ++#endif /* PD */ + + if (x->wiiremote->isIRSensorEnabled) + { +@@ -244,11 +290,13 @@ + + void akawiiremote_assist(t_akawiiremote *x, void *b, long m, long a, char *s) + { ++#ifndef PD /* Max */ + if (m==ASSIST_INLET) + { + sprintf(s,"connect, bang, disconnect...."); + } + else ++#endif /* NOT PD */ + { + switch(a) + { +@@ -264,6 +312,19 @@ + + void *akawiiremote_new(t_symbol *s, short ac, t_atom *av) + { ++#ifdef PD ++ t_akawiiremote *x = (t_akawiiremote *)pd_new(wiiremote_class); ++ ++ x->wiiremote = wiiremote_init(); ++ ++ x->clock = clock_new(x, (t_method)akawiiremote_clock); ++ ++ /* create anything outlet used for HID data */ ++ x->statusOut = outlet_new(&x->x_obj, 0); ++ x->buttonsOut = outlet_new(&x->x_obj, &s_float); ++ x->irOut = outlet_new(&x->x_obj, &s_list); ++ x->accOut = outlet_new(&x->x_obj, &s_list); ++#else /* Max */ + t_akawiiremote *x; + + x = (t_akawiiremote *)newobject(akawiiremote_class); +@@ -271,13 +332,14 @@ + x->wiiremote = wiiremote_init(); + + x->clock = clock_new(x, (method)akawiiremote_clock); +- x->trial = 0; +- x->interval = kInterval; + + x->statusOut = outlet_new(x, 0); + x->buttonsOut = intout(x); + x->irOut = listout(x); + x->accOut = listout(x); ++#endif /* PD */ ++ x->trial = 0; ++ x->interval = kInterval; + + akawiiremote_count++; + return x; +@@ -290,6 +352,10 @@ + wiiremote_disconnect(); + + clock_unset(x->clock); ++#ifdef PD ++ clock_free(x->clock); ++#else /* Max */ + freeobject((t_object *)x->clock); ++#endif /* PD */ + } + diff --git a/wiiremote/aka.wiiremote_b4_pd-port.patch b/wiiremote/aka.wiiremote_b4_pd-port.patch new file mode 100644 index 0000000..0edf592 --- /dev/null +++ b/wiiremote/aka.wiiremote_b4_pd-port.patch @@ -0,0 +1,186 @@ +--- /Users/hans/Documents/Research/HID/wiiremote/aka.wiiremote-b4-src/wiiremote.c 2006-12-23 09:52:07.000000000 -0500 ++++ wiiremote.c 2006-12-28 18:11:52.000000000 -0500 +@@ -444,7 +444,7 @@ + Boolean writeData(WiiRemoteRef wiiremote, const unsigned char *data, unsigned long address, size_t length) + { + unsigned char cmd[22]; +- int i; ++ unsigned int i; + + for(i=0 ; i ++#include + #include ++#include ++#include + + typedef struct { + int x, y, s; +--- /Users/hans/Documents/Research/HID/wiiremote/aka.wiiremote-b4-src/aka.wiiremote.c 2006-12-22 19:18:31.000000000 -0500 ++++ aka.wiiremote.c 2006-12-28 18:09:23.000000000 -0500 +@@ -4,15 +4,27 @@ + // 1.0B2 : 2006.12.15 + // 1.0B3 : 2006.12.20 + ++#ifdef PD ++#include "m_pd.h" ++#define SETLONG SETFLOAT ++static t_class *wiiremote_class; ++#else /* Max */ + #include "ext.h" ++#endif /* PD */ ++ + #include "wiiremote.h" ++#include + + #define kInterval 100 + #define kMaxTrial 100 + + typedef struct _akawiiremote + { ++#ifdef PD ++ t_object x_obj; ++#else /* Max */ + struct object obj; ++#endif + + WiiRemoteRef wiiremote; + +@@ -45,7 +57,11 @@ + void *akawiiremote_new(t_symbol *s, short ac, t_atom *av); + void akawiiremote_free(t_akawiiremote *x); + ++#ifdef PD ++void wiiremote_setup() ++#else /* Max */ + void main() ++#endif /* PD */ + { + NumVersion outSoftwareVersion; + BluetoothHCIVersionInfo outHardwareVersion; +@@ -64,6 +80,32 @@ + return; + } + ++ post("aka.wiiremote 1.0B4-UB by Masayuki Akamatsu"); ++ ++#ifdef PD ++ post("\tPd port by Hans-Christoph Steiner"); ++ ++ wiiremote_class = class_new(gensym("wiiremote"), ++ (t_newmethod)akawiiremote_new, ++ (t_method)akawiiremote_free, ++ sizeof(t_akawiiremote), ++ CLASS_DEFAULT, ++ A_GIMME,0); ++ ++ class_addbang(wiiremote_class,(t_method)akawiiremote_bang); ++ 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("motionsensor"), A_DEFFLOAT, 0); ++ class_addmethod(wiiremote_class,(t_method)akawiiremote_irsensor,gensym("irsensor"), 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_getbatterylevel,gensym("getbatterylevel"),0); ++ class_addmethod(wiiremote_class,(t_method)akawiiremote_getexpansionstatus,gensym("getexpansionstatus"),0); ++ class_addmethod(wiiremote_class,(t_method)akawiiremote_getledstatus,gensym("getledstatus"),0); ++ ++ class_addmethod(wiiremote_class,(t_method)akawiiremote_assist,gensym("assist"),A_CANT,0); ++#else /* Max */ + setup((t_messlist **)&akawiiremote_class, (method)akawiiremote_new, (method)akawiiremote_free, (short)sizeof(t_akawiiremote), 0L, A_GIMME, 0); + + addbang((method)akawiiremote_bang); +@@ -79,9 +121,7 @@ + addmess((method)akawiiremote_getledstatus,"getledstatus",0); + + addmess((method)akawiiremote_assist,"assist",A_CANT,0); +- +- post("aka.wiiremote 1.0B4-UB by Masayuki Akamatsu"); +- ++#endif /* PD */ + } + + //-------------------------------------------------------------------------------------------- +@@ -93,7 +133,11 @@ + if (x->wiiremote->device == nil) + return; // do nothing + ++#ifdef PD ++ outlet_float(x->buttonsOut, (t_float) x->wiiremote->buttonData); ++#else /* Max */ + outlet_int(x->buttonsOut, x->wiiremote->buttonData); ++#endif /* PD */ + + if (x->wiiremote->isIRSensorEnabled) + { +@@ -241,11 +285,13 @@ + + void akawiiremote_assist(t_akawiiremote *x, void *b, long m, long a, char *s) + { ++#ifndef PD /* Max */ + if (m==ASSIST_INLET) + { + sprintf(s,"connect, bang, disconnect...."); + } + else ++#endif /* NOT PD */ + { + switch(a) + { +@@ -261,6 +307,20 @@ + + void *akawiiremote_new(t_symbol *s, short ac, t_atom *av) + { ++#ifdef PD ++ t_akawiiremote *x = (t_akawiiremote *)pd_new(wiiremote_class); ++ ++ if (x->wiiremote != nil) ++ wiiremote_init(x->wiiremote); ++ ++ x->clock = clock_new(x, (t_method)akawiiremote_clock); ++ ++ /* create anything outlet used for HID data */ ++ x->statusOut = outlet_new(&x->x_obj, 0); ++ x->buttonsOut = outlet_new(&x->x_obj, &s_float); ++ x->irOut = outlet_new(&x->x_obj, &s_list); ++ x->accOut = outlet_new(&x->x_obj, &s_list); ++#else /* Max */ + t_akawiiremote *x; + + x = (t_akawiiremote *)newobject(akawiiremote_class); +@@ -270,13 +330,14 @@ + wiiremote_init(x->wiiremote); + + x->clock = clock_new(x, (method)akawiiremote_clock); +- x->trial = 0; +- x->interval = kInterval; + + x->statusOut = outlet_new(x, 0); + x->buttonsOut = intout(x); + x->irOut = listout(x); + x->accOut = listout(x); ++#endif /* PD */ ++ x->trial = 0; ++ x->interval = kInterval; + + return x; + } +@@ -290,6 +351,10 @@ + } + + clock_unset(x->clock); ++#ifdef PD ++ clock_free(x->clock); ++#else /* Max */ + freeobject((t_object *)x->clock); ++#endif /* PD */ + } + diff --git a/wiiremote/wiiremote.c b/wiiremote/wiiremote.c index b379f5e..cabbb6e 100644 --- a/wiiremote/wiiremote.c +++ b/wiiremote/wiiremote.c @@ -10,44 +10,42 @@ typedef unsigned char darr[]; #define kTrial 10 -static WiiRemoteRec gWiiRemote; +//static WiiRemoteRec gWiiRemote; // remove in 1.0B4 //-------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------- -WiiRemoteRef wiiremote_init(void) +void wiiremote_init(WiiRemoteRef wiiremote) { - gWiiRemote.inquiry = nil; - gWiiRemote.device = nil; - gWiiRemote.ichan = nil; - gWiiRemote.cchan = nil; - - gWiiRemote.accX = 0x10; - gWiiRemote.accY = 0x10; - gWiiRemote.accZ = 0x10; - gWiiRemote.buttonData = 0; - gWiiRemote.leftPoint = -1; - gWiiRemote.tracking = false; - - gWiiRemote.batteryLevel = 0; - - gWiiRemote.isIRSensorEnabled = false; - gWiiRemote.isMotionSensorEnabled = false; - gWiiRemote.isVibrationEnabled = false; - - gWiiRemote.isExpansionPortUsed = false; - gWiiRemote.isLED1Illuminated = false; - gWiiRemote.isLED2Illuminated = false; - gWiiRemote.isLED3Illuminated = false; - gWiiRemote.isLED4Illuminated = false; - - return &gWiiRemote; + wiiremote->inquiry = nil; + wiiremote->device = nil; + wiiremote->ichan = nil; + wiiremote->cchan = nil; + + wiiremote->accX = 0x10; + wiiremote->accY = 0x10; + wiiremote->accZ = 0x10; + wiiremote->buttonData = 0; + wiiremote->leftPoint = -1; + wiiremote->tracking = false; + + wiiremote->batteryLevel = 0; + + wiiremote->isIRSensorEnabled = false; + wiiremote->isMotionSensorEnabled = false; + wiiremote->isVibrationEnabled = false; + + wiiremote->isExpansionPortUsed = false; + wiiremote->isLED1Illuminated = false; + wiiremote->isLED2Illuminated = false; + wiiremote->isLED3Illuminated = false; + wiiremote->isLED4Illuminated = false; } //-------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------- -void checkDevice(IOBluetoothDeviceRef device) +void checkDevice(WiiRemoteRef wiiremote, IOBluetoothDeviceRef device) { CFStringRef myString; @@ -56,21 +54,21 @@ void checkDevice(IOBluetoothDeviceRef device) { if (CFStringCompare(myString, CFSTR("Nintendo RVL-CNT-01"), 0) == kCFCompareEqualTo) { - gWiiRemote.device = IOBluetoothObjectRetain(device); - if ( !wiiremote_connect()) // add in B3 - wiiremote_disconnect(); // add in B3 + wiiremote->device = IOBluetoothObjectRetain(device); + if ( !wiiremote_connect(wiiremote)) // add in B3 + wiiremote_disconnect(wiiremote); // add in B3 } } } void myFoundFunc(void *refCon, IOBluetoothDeviceInquiryRef inquiry, IOBluetoothDeviceRef device) { - checkDevice(device); + checkDevice((WiiRemoteRef)refCon, device); } void myUpdatedFunc(void *refCon, IOBluetoothDeviceInquiryRef inquiry, IOBluetoothDeviceRef device, uint32_t devicesRemaining) { - checkDevice(device); + checkDevice((WiiRemoteRef)refCon, device); } void myCompleteFunc(void *refCon, IOBluetoothDeviceInquiryRef inquiry, IOReturn error, Boolean aborted) @@ -79,60 +77,60 @@ void myCompleteFunc(void *refCon, IOBluetoothDeviceInquiryRef inquiry, IOReturn if (error != kIOReturnSuccess) { - wiiremote_stopsearch(); + wiiremote_stopsearch((WiiRemoteRef)refCon); } } //-------------------------------------------------------------------------------------------- -Boolean wiiremote_isconnected(void) +Boolean wiiremote_isconnected(WiiRemoteRef wiiremote) { Boolean result; - result = gWiiRemote.device != nil && IOBluetoothDeviceIsConnected(gWiiRemote.device); + result = wiiremote->device != nil && IOBluetoothDeviceIsConnected(wiiremote->device); return result; } -Boolean wiiremote_search(void) +Boolean wiiremote_search(WiiRemoteRef wiiremote) { IOReturn ret; - if (gWiiRemote.inquiry != nil) + if (wiiremote->inquiry != nil) return true; - gWiiRemote.inquiry = IOBluetoothDeviceInquiryCreateWithCallbackRefCon(nil); - IOBluetoothDeviceInquirySetDeviceFoundCallback(gWiiRemote.inquiry, myFoundFunc); - IOBluetoothDeviceInquirySetDeviceNameUpdatedCallback(gWiiRemote.inquiry, myUpdatedFunc); - IOBluetoothDeviceInquirySetCompleteCallback(gWiiRemote.inquiry, myCompleteFunc); + wiiremote->inquiry = IOBluetoothDeviceInquiryCreateWithCallbackRefCon((void *)wiiremote); + IOBluetoothDeviceInquirySetDeviceFoundCallback(wiiremote->inquiry, myFoundFunc); + IOBluetoothDeviceInquirySetDeviceNameUpdatedCallback(wiiremote->inquiry, myUpdatedFunc); + IOBluetoothDeviceInquirySetCompleteCallback(wiiremote->inquiry, myCompleteFunc); - ret = IOBluetoothDeviceInquiryStart(gWiiRemote.inquiry); + ret = IOBluetoothDeviceInquiryStart(wiiremote->inquiry); if (ret != kIOReturnSuccess) { - IOBluetoothDeviceInquiryDelete(gWiiRemote.inquiry); - gWiiRemote.inquiry = nil; + IOBluetoothDeviceInquiryDelete(wiiremote->inquiry); + wiiremote->inquiry = nil; return false; } return true; } -Boolean wiiremote_stopsearch(void) +Boolean wiiremote_stopsearch(WiiRemoteRef wiiremote) { IOReturn ret; - if (gWiiRemote.inquiry == nil) + if (wiiremote->inquiry == nil) { return true; // already stopped } - ret = IOBluetoothDeviceInquiryStop(gWiiRemote.inquiry); + ret = IOBluetoothDeviceInquiryStop(wiiremote->inquiry); if (ret != kIOReturnSuccess && ret != kIOReturnNotPermitted) { // kIOReturnNotPermitted is if it's already stopped } - IOBluetoothDeviceInquiryDelete(gWiiRemote.inquiry); - gWiiRemote.inquiry = nil; + IOBluetoothDeviceInquiryDelete(wiiremote->inquiry); + wiiremote->inquiry = nil; return (ret==kIOReturnSuccess); } @@ -142,51 +140,52 @@ Boolean wiiremote_stopsearch(void) void myDataListener(IOBluetoothL2CAPChannelRef channel, void *data, UInt16 length, void *refCon) { - unsigned char *dp = (unsigned char*)data; + WiiRemoteRef wiiremote = (WiiRemoteRef)refCon; + unsigned char *dp = (unsigned char*)data; - if (dp[1] == 0x20 && length >= 8) - { - gWiiRemote.batteryLevel = (double)dp[7]; - gWiiRemote.batteryLevel /= (double)0xC0; + if (dp[1] == 0x20 && length >= 8) + { + wiiremote->batteryLevel = (double)dp[7]; + wiiremote->batteryLevel /= (double)0xC0; - gWiiRemote.isExpansionPortUsed = (dp[4] & 0x02) != 0; - gWiiRemote.isLED1Illuminated = (dp[4] & 0x10) != 0; - gWiiRemote.isLED2Illuminated = (dp[4] & 0x20) != 0; - gWiiRemote.isLED3Illuminated = (dp[4] & 0x40) != 0; - gWiiRemote.isLED4Illuminated = (dp[4] & 0x80) != 0; + wiiremote->isExpansionPortUsed = (dp[4] & 0x02) != 0; + wiiremote->isLED1Illuminated = (dp[4] & 0x10) != 0; + wiiremote->isLED2Illuminated = (dp[4] & 0x20) != 0; + wiiremote->isLED3Illuminated = (dp[4] & 0x40) != 0; + wiiremote->isLED4Illuminated = (dp[4] & 0x80) != 0; - //have to reset settings (vibration, motion, IR and so on...) - wiiremote_irsensor(gWiiRemote.isIRSensorEnabled); - } + //have to reset settings (vibration, motion, IR and so on...) + wiiremote_irsensor(wiiremote, wiiremote->isIRSensorEnabled); + } if ((dp[1]&0xF0) == 0x30) { - gWiiRemote.buttonData = ((short)dp[2] << 8) + dp[3]; + wiiremote->buttonData = ((short)dp[2] << 8) + dp[3]; if (dp[1] & 0x01) { - gWiiRemote.accX = dp[4]; - gWiiRemote.accY = dp[5]; - gWiiRemote.accZ = dp[6]; + wiiremote->accX = dp[4]; + wiiremote->accY = dp[5]; + wiiremote->accZ = dp[6]; - gWiiRemote.lowZ = gWiiRemote.lowZ * .9 + gWiiRemote.accZ * .1; - gWiiRemote.lowX = gWiiRemote.lowX * .9 + gWiiRemote.accX * .1; + wiiremote->lowZ = wiiremote->lowZ * .9 + wiiremote->accZ * .1; + wiiremote->lowX = wiiremote->lowX * .9 + wiiremote->accX * .1; - float absx = abs(gWiiRemote.lowX - 128); - float absz = abs(gWiiRemote.lowZ - 128); + float absx = abs(wiiremote->lowX - 128); + float absz = abs(wiiremote->lowZ - 128); - if (gWiiRemote.orientation == 0 || gWiiRemote.orientation == 2) absx -= 5; - if (gWiiRemote.orientation == 1 || gWiiRemote.orientation == 3) absz -= 5; + if (wiiremote->orientation == 0 || wiiremote->orientation == 2) absx -= 5; + if (wiiremote->orientation == 1 || wiiremote->orientation == 3) absz -= 5; if (absz >= absx) { if (absz > 5) - gWiiRemote.orientation = (gWiiRemote.lowZ > 128) ? 0 : 2; + wiiremote->orientation = (wiiremote->lowZ > 128) ? 0 : 2; } else { if (absx > 5) - gWiiRemote.orientation = (gWiiRemote.lowX > 128) ? 3 : 1; + wiiremote->orientation = (wiiremote->lowX > 128) ? 3 : 1; } //printf("orientation: %d\n", orientation); } @@ -196,65 +195,66 @@ Boolean wiiremote_stopsearch(void) int i; for(i=0 ; i<4 ; i++) { - gWiiRemote.irData[i].x = dp[7 + 3*i]; - gWiiRemote.irData[i].y = dp[8 + 3*i]; - gWiiRemote.irData[i].s = dp[9 + 3*i]; - gWiiRemote.irData[i].x += (gWiiRemote.irData[i].s & 0x30) << 4; - gWiiRemote.irData[i].y += (gWiiRemote.irData[i].s & 0xC0) << 2; - gWiiRemote.irData[i].s &= 0x0F; + wiiremote->irData[i].x = dp[7 + 3*i]; + wiiremote->irData[i].y = dp[8 + 3*i]; + wiiremote->irData[i].s = dp[9 + 3*i]; + wiiremote->irData[i].x += (wiiremote->irData[i].s & 0x30) << 4; + wiiremote->irData[i].y += (wiiremote->irData[i].s & 0xC0) << 2; + wiiremote->irData[i].s &= 0x0F; } } } float ox, oy; - if (gWiiRemote.irData[0].s < 0x0F && gWiiRemote.irData[1].s < 0x0F) + if (wiiremote->irData[0].s < 0x0F && wiiremote->irData[1].s < 0x0F) { - int l = gWiiRemote.leftPoint, r; - if (gWiiRemote.leftPoint == -1) + int l = wiiremote->leftPoint, r; + if (wiiremote->leftPoint == -1) { // printf("Tracking.\n"); - switch (gWiiRemote.orientation) + switch (wiiremote->orientation) { - case 0: l = (gWiiRemote.irData[0].x < gWiiRemote.irData[1].x) ? 0 : 1; break; - case 1: l = (gWiiRemote.irData[0].y > gWiiRemote.irData[1].y) ? 0 : 1; break; - case 2: l = (gWiiRemote.irData[0].x > gWiiRemote.irData[1].x) ? 0 : 1; break; - case 3: l = (gWiiRemote.irData[0].y < gWiiRemote.irData[1].y) ? 0 : 1; break; + case 0: l = (wiiremote->irData[0].x < wiiremote->irData[1].x) ? 0 : 1; break; + case 1: l = (wiiremote->irData[0].y > wiiremote->irData[1].y) ? 0 : 1; break; + case 2: l = (wiiremote->irData[0].x > wiiremote->irData[1].x) ? 0 : 1; break; + case 3: l = (wiiremote->irData[0].y < wiiremote->irData[1].y) ? 0 : 1; break; } - gWiiRemote.leftPoint = l; + wiiremote->leftPoint = l; } r = 1-l; - float dx = gWiiRemote.irData[r].x - gWiiRemote.irData[l].x; - float dy = gWiiRemote.irData[r].y - gWiiRemote.irData[l].y; + float dx = wiiremote->irData[r].x - wiiremote->irData[l].x; + float dy = wiiremote->irData[r].y - wiiremote->irData[l].y; float d = sqrt(dx*dx+dy*dy); dx /= d; dy /= d; - float cx = (gWiiRemote.irData[l].x+gWiiRemote.irData[r].x)/1024.0 - 1; - float cy = (gWiiRemote.irData[l].y+gWiiRemote.irData[r].y)/1024.0 - .75; + float cx = (wiiremote->irData[l].x+wiiremote->irData[r].x)/1024.0 - 1; + float cy = (wiiremote->irData[l].y+wiiremote->irData[r].y)/1024.0 - .75; - gWiiRemote.angle = atan2(dy, dx); + wiiremote->angle = atan2(dy, dx); ox = -dy*cy-dx*cx; oy = -dx*cy+dy*cx; //printf("x:%5.2f; y: %5.2f; angle: %5.1f\n", ox, oy, angle*180/M_PI); - gWiiRemote.tracking = true; + wiiremote->tracking = true; } else { // printf("Not tracking.\n"); ox = oy = -100; - gWiiRemote.leftPoint = -1; - gWiiRemote.tracking = false; + wiiremote->angle = -100; + wiiremote->leftPoint = -1; + wiiremote->tracking = false; } - gWiiRemote.posX = ox; - gWiiRemote.posY = oy; + wiiremote->posX = ox; + wiiremote->posY = oy; } void myEventListener(IOBluetoothL2CAPChannelRef channel, void *refCon, IOBluetoothL2CAPChannelEvent *event) @@ -282,29 +282,32 @@ void myDisconnectedFunc(void * refCon, IOBluetoothUserNotificationRef inRef, IOB //-------------------------------------------------------------------------------------------- -Boolean wiiremote_connect(void) +Boolean wiiremote_connect(WiiRemoteRef wiiremote) { + IOReturn ret; short i; - if (gWiiRemote.device == nil) + if (wiiremote->device == nil) return false; // connect the device for (i=0; idevice, nil, nil); + if ( ret == kIOReturnSuccess) break; usleep(10000); // wait 10ms } if (i==kTrial) return false; - gWiiRemote.disconnectNotification = IOBluetoothDeviceRegisterForDisconnectNotification(gWiiRemote.device, myDisconnectedFunc, 0); + wiiremote->disconnectNotification = IOBluetoothDeviceRegisterForDisconnectNotification(wiiremote->device, myDisconnectedFunc, 0); // performs an SDP query for (i=0; idevice, nil, nil); + if ( ret == kIOReturnSuccess) break; usleep(10000); // wait 10ms } @@ -314,84 +317,86 @@ Boolean wiiremote_connect(void) // open L2CAPChannel : BluetoothL2CAPPSM = 17 for (i=0; idevice, &(wiiremote->cchan), 17, myEventListener, (void *)wiiremote); + if ( ret == kIOReturnSuccess) break; usleep(10000); // wait 10ms } if (i==kTrial) { - gWiiRemote.cchan = nil; - IOBluetoothDeviceCloseConnection(gWiiRemote.device); - gWiiRemote.device = nil; + wiiremote->cchan = nil; + IOBluetoothDeviceCloseConnection(wiiremote->device); + wiiremote->device = nil; return false; } // open L2CAPChannel : BluetoothL2CAPPSM = 19 for (i=0; idevice, &(wiiremote->ichan), 19, myEventListener, (void *)wiiremote); + if ( ret == kIOReturnSuccess) break; usleep(10000); // wait 10ms } if (i==kTrial) { - gWiiRemote.ichan = nil; - IOBluetoothL2CAPChannelCloseChannel(gWiiRemote.cchan); - IOBluetoothDeviceCloseConnection(gWiiRemote.device); - gWiiRemote.device = nil; + wiiremote->ichan = nil; + IOBluetoothL2CAPChannelCloseChannel(wiiremote->cchan); + IOBluetoothDeviceCloseConnection(wiiremote->device); + wiiremote->device = nil; return false; } - wiiremote_motionsensor(true); - wiiremote_irsensor(false); - wiiremote_vibration(false); - wiiremote_led(false, false, false, false); + wiiremote_motionsensor(wiiremote, true); + wiiremote_irsensor(wiiremote, false); + wiiremote_vibration(wiiremote, false); + wiiremote_led(wiiremote, false, false, false, false); return true; } -Boolean wiiremote_disconnect(void) +Boolean wiiremote_disconnect(WiiRemoteRef wiiremote) { short i; - if (gWiiRemote.disconnectNotification != nil) + if (wiiremote->disconnectNotification != nil) { - IOBluetoothUserNotificationUnregister(gWiiRemote.disconnectNotification); - gWiiRemote.disconnectNotification = nil; + IOBluetoothUserNotificationUnregister(wiiremote->disconnectNotification); + wiiremote->disconnectNotification = nil; } - if (gWiiRemote.cchan && IOBluetoothDeviceIsConnected(gWiiRemote.device)) + if (wiiremote->cchan && IOBluetoothDeviceIsConnected(wiiremote->device)) { for (i=0; icchan) == kIOReturnSuccess) { - gWiiRemote.cchan = nil; + wiiremote->cchan = nil; break; } } if (i==kTrial) return false; } - if (gWiiRemote.ichan && IOBluetoothDeviceIsConnected(gWiiRemote.device)) + if (wiiremote->ichan && IOBluetoothDeviceIsConnected(wiiremote->device)) { for (i=0; iichan) == kIOReturnSuccess) { - gWiiRemote.ichan = nil; + wiiremote->ichan = nil; break; } } if (i==kTrial) return false; } - if (gWiiRemote.device && IOBluetoothDeviceIsConnected(gWiiRemote.device)) + if (wiiremote->device && IOBluetoothDeviceIsConnected(wiiremote->device)) { for (i=0; idevice) == kIOReturnSuccess) { break; } @@ -399,10 +404,10 @@ Boolean wiiremote_disconnect(void) if (i==kTrial) return false; } - if (gWiiRemote.device != nil) + if (wiiremote->device != nil) { - IOBluetoothObjectRelease(gWiiRemote.device); - gWiiRemote.device = nil; + IOBluetoothObjectRelease(wiiremote->device); + wiiremote->device = nil; } return true; @@ -411,7 +416,7 @@ Boolean wiiremote_disconnect(void) //-------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------- -Boolean sendCommand(unsigned char *data, size_t length) +Boolean sendCommand(WiiRemoteRef wiiremote, unsigned char *data, size_t length) { unsigned char buf[40]; IOReturn ret; @@ -427,7 +432,7 @@ Boolean sendCommand(unsigned char *data, size_t length) for (i = 0; icchan, buf, length); if (ret == kIOReturnSuccess) break; usleep(10000); @@ -436,10 +441,10 @@ Boolean sendCommand(unsigned char *data, size_t length) return (ret==kIOReturnSuccess); } -Boolean writeData(const unsigned char *data, unsigned long address, size_t length) +Boolean writeData(WiiRemoteRef wiiremote, const unsigned char *data, unsigned long address, size_t length) { unsigned char cmd[22]; - int i; + unsigned int i; for(i=0 ; iisVibrationEnabled) cmd[1] |= 0x01; data = cmd; - return sendCommand(cmd, 22); + return sendCommand(wiiremote, cmd, 22); } //-------------------------------------------------------------------------------------------- -Boolean wiiremote_motionsensor(Boolean enabled) +Boolean wiiremote_motionsensor(WiiRemoteRef wiiremote, Boolean enabled) { - gWiiRemote.isMotionSensorEnabled = enabled; + wiiremote->isMotionSensorEnabled = enabled; unsigned char cmd[] = {0x12, 0x00, 0x30}; - if (gWiiRemote.isVibrationEnabled) cmd[1] |= 0x01; - if (gWiiRemote.isMotionSensorEnabled) cmd[2] |= 0x01; - if (gWiiRemote.isIRSensorEnabled) cmd[2] |= 0x02; + if (wiiremote->isVibrationEnabled) cmd[1] |= 0x01; + if (wiiremote->isMotionSensorEnabled) cmd[2] |= 0x01; + if (wiiremote->isIRSensorEnabled) cmd[2] |= 0x02; - return sendCommand(cmd, 3); + return sendCommand(wiiremote, cmd, 3); } -Boolean wiiremote_irsensor(Boolean enabled) +Boolean wiiremote_irsensor(WiiRemoteRef wiiremote, Boolean enabled) { IOReturn ret; - gWiiRemote.isIRSensorEnabled = enabled; + wiiremote->isIRSensorEnabled = enabled; // set register 0x12 (report type) - if (ret = wiiremote_motionsensor(gWiiRemote.isMotionSensorEnabled)) return ret; + if (ret = wiiremote_motionsensor(wiiremote, wiiremote->isMotionSensorEnabled) == false) return ret; // set register 0x13 (ir enable/vibe) - if (ret = wiiremote_vibration(gWiiRemote.isVibrationEnabled)) return ret; + if (ret = wiiremote_vibration(wiiremote, wiiremote->isVibrationEnabled) == false) return ret; // set register 0x1a (ir enable 2) unsigned char cmd[] = {0x1a, 0x00}; if (enabled) cmd[1] |= 0x04; - if (ret = sendCommand(cmd, 2)) return ret; + if (ret = sendCommand(wiiremote, cmd, 2) == false) return ret; if(enabled){ // based on marcan's method, found on wiili wiki: @@ -497,65 +502,65 @@ Boolean wiiremote_irsensor(Boolean enabled) // of it actually turning on 100% of the time (was seeing 30-40% failure rate before) // the sleeps help it it seems usleep(10000); - if (ret = writeData((darr){0x01}, 0x04B00030, 1)) return ret; + if (ret = writeData(wiiremote, (darr){0x01}, 0x04B00030, 1) == false) return ret; usleep(10000); - if (ret = writeData((darr){0x08}, 0x04B00030, 1)) return ret; + if (ret = writeData(wiiremote, (darr){0x08}, 0x04B00030, 1) == false) return ret; usleep(10000); - if (ret = writeData((darr){0x90}, 0x04B00006, 1)) return ret; + if (ret = writeData(wiiremote, (darr){0x90}, 0x04B00006, 1) == false) return ret; usleep(10000); - if (ret = writeData((darr){0xC0}, 0x04B00008, 1)) return ret; + if (ret = writeData(wiiremote, (darr){0xC0}, 0x04B00008, 1) == false) return ret; usleep(10000); - if (ret = writeData((darr){0x40}, 0x04B0001A, 1)) return ret; + if (ret = writeData(wiiremote, (darr){0x40}, 0x04B0001A, 1) == false) return ret; usleep(10000); - if (ret = writeData((darr){0x33}, 0x04B00033, 1)) return ret; + if (ret = writeData(wiiremote, (darr){0x33}, 0x04B00033, 1) == false) return ret; usleep(10000); - if (ret = writeData((darr){0x08}, 0x04B00030, 1)) return ret; + if (ret = writeData(wiiremote, (darr){0x08}, 0x04B00030, 1) == false) return ret; }else{ // probably should do some writes to power down the camera, save battery // but don't know how yet. //bug fix #1614587 - wiiremote_motionsensor(gWiiRemote.isMotionSensorEnabled); - wiiremote_vibration(gWiiRemote.isVibrationEnabled); + wiiremote_motionsensor(wiiremote, wiiremote->isMotionSensorEnabled); + wiiremote_vibration(wiiremote, wiiremote->isVibrationEnabled); } return true; } -Boolean wiiremote_vibration(Boolean enabled) +Boolean wiiremote_vibration(WiiRemoteRef wiiremote, Boolean enabled) { - gWiiRemote.isVibrationEnabled = enabled; + wiiremote->isVibrationEnabled = enabled; unsigned char cmd[] = {0x13, 0x00}; - if (gWiiRemote.isVibrationEnabled) cmd[1] |= 0x01; - if (gWiiRemote.isIRSensorEnabled) cmd[1] |= 0x04; + if (wiiremote->isVibrationEnabled) cmd[1] |= 0x01; + if (wiiremote->isIRSensorEnabled) cmd[1] |= 0x04; - return sendCommand(cmd, 2);; + return sendCommand(wiiremote, cmd, 2);; } -Boolean wiiremote_led(Boolean enabled1, Boolean enabled2, Boolean enabled3, Boolean enabled4) +Boolean wiiremote_led(WiiRemoteRef wiiremote, Boolean enabled1, Boolean enabled2, Boolean enabled3, Boolean enabled4) { unsigned char cmd[] = {0x11, 0x00}; - if (gWiiRemote.isVibrationEnabled) cmd[1] |= 0x01; + if (wiiremote->isVibrationEnabled) cmd[1] |= 0x01; if (enabled1) cmd[1] |= 0x10; if (enabled2) cmd[1] |= 0x20; if (enabled3) cmd[1] |= 0x40; if (enabled4) cmd[1] |= 0x80; - gWiiRemote.isLED1Illuminated = enabled1; - gWiiRemote.isLED2Illuminated = enabled2; - gWiiRemote.isLED3Illuminated = enabled3; - gWiiRemote.isLED4Illuminated = enabled4; + wiiremote->isLED1Illuminated = enabled1; + wiiremote->isLED2Illuminated = enabled2; + wiiremote->isLED3Illuminated = enabled3; + wiiremote->isLED4Illuminated = enabled4; - return sendCommand(cmd, 2); + return sendCommand(wiiremote, cmd, 2); } -void wiiremote_getstatus(void) +Boolean wiiremote_getstatus(WiiRemoteRef wiiremote) { unsigned char cmd[] = {0x15, 0x00}; - sendCommand(cmd, 2); + return sendCommand(wiiremote, cmd, 2); } diff --git a/wiiremote/wiiremote.h b/wiiremote/wiiremote.h index 730682c..66ec4ac 100644 --- a/wiiremote/wiiremote.h +++ b/wiiremote/wiiremote.h @@ -5,7 +5,6 @@ #include #include #include - #include #include @@ -50,14 +49,14 @@ typedef struct _WiiRemoteRec IOBluetoothUserNotificationRef disconnectNotification; } WiiRemoteRec, *WiiRemoteRef; -WiiRemoteRef wiiremote_init(void); -Boolean wiiremote_isconnected(void); -Boolean wiiremote_search(void); -Boolean wiiremote_stopsearch(void); -Boolean wiiremote_connect(void); -Boolean wiiremote_disconnect(void); -Boolean wiiremote_motionsensor(Boolean enabled); -Boolean wiiremote_irsensor(Boolean enabled); -Boolean wiiremote_vibration(Boolean enabled); -Boolean wiiremote_led(Boolean enabled1, Boolean enabled2, Boolean enabled3, Boolean enabled4); -void wiiremote_getstatus(void); +void wiiremote_init(WiiRemoteRef wiiremote); +Boolean wiiremote_isconnected(WiiRemoteRef wiiremote); +Boolean wiiremote_search(WiiRemoteRef wiiremote); +Boolean wiiremote_stopsearch(WiiRemoteRef wiiremote); +Boolean wiiremote_connect(WiiRemoteRef wiiremote); +Boolean wiiremote_disconnect(WiiRemoteRef wiiremote); +Boolean wiiremote_motionsensor(WiiRemoteRef wiiremote, Boolean enabled); +Boolean wiiremote_irsensor(WiiRemoteRef wiiremote, Boolean enabled); +Boolean wiiremote_vibration(WiiRemoteRef wiiremote, Boolean enabled); +Boolean wiiremote_led(WiiRemoteRef wiiremote, Boolean enabled1, Boolean enabled2, Boolean enabled3, Boolean enabled4); +Boolean wiiremote_getstatus(WiiRemoteRef wiiremote); -- cgit v1.2.1