void WiiCursor::process(std::vector<WiimoteData>& wiimotes, bool const& running) { // Sets up the Wiimotes for (std::vector<WiimoteData>::iterator iter = wiimotes.begin(); iter != wiimotes.end(); ++iter) { DEBUG_MSG(1, "Enabling reporting of events and non-block signal checking in Wiimote #%d...\n", iter-wiimotes.begin()); cwiid_enable(iter->wiimote, CWIID_FLAG_MESG_IFC); cwiid_disable(iter->wiimote, CWIID_FLAG_NONBLOCK); } // Sets up itself m_thread_data.running = &running; // No need to check anything here since running is a reference while (running) { std::vector<WiiEvent> events; get_wiis_event_data(wiimotes, m_thread_data.ir, events); for (std::vector<WiiEvent>::const_iterator iter = events.begin(); iter != events.end(); ++iter) { switch (iter->type) { case WII_EVENT_TYPE_BUTTON: //running = false; // NOTE: Not handling any key events for now break; case WII_EVENT_TYPE_IR: process_ir_events(iter->ir, iter->transform); break; case WII_EVENT_TYPE_NON_EVENT: default: break; } } } }
static void wiimote_report(t_wiimote*x, t_symbol*s, int onoff) { int flag=-1; if(gensym("status")==s) flag=CWIID_RPT_STATUS; else if(gensym("button")==s) flag=CWIID_RPT_BTN; else if(gensym("acceleration")==s) flag=CWIID_RPT_ACC; else if(gensym("ir")==s) flag=CWIID_RPT_IR; #ifdef CWIID_RPT_NUNCHUK else if(gensym("nunchuk")==s) flag=CWIID_RPT_NUNCHUK; #endif #ifdef CWIID_RPT_CLASSIC else if(gensym("classic")==s) flag=CWIID_RPT_CLASSIC; #endif #ifdef CWIID_RPT_BALANCE else if(gensym("balance")==s) flag=CWIID_RPT_BALANCE; #endif #ifdef CWIID_RPT_MOTIONPLUS else if(gensym("motionplus")==s) flag=CWIID_RPT_MOTIONPLUS; #endif else if(gensym("ext")==s) flag=CWIID_RPT_EXT; else { pd_error(x, "unknown report mode '%s'", s->s_name); } #ifdef CWIID_RPT_MOTIONPLUS if(CWIID_RPT_MOTIONPLUS==flag) { if(x->connected) { int err=0; if(onoff) { err=cwiid_enable(x->wiimote, CWIID_FLAG_MOTIONPLUS); } else { err=cwiid_disable(x->wiimote, CWIID_FLAG_MOTIONPLUS); } if(err) { pd_error(x, "turning %s motionplus returned %d", (flag?"on":"off"), err); } } } #endif if(flag!=-1) { if(onoff) { x->reportMode |= flag; } else { x->reportMode &= ~flag; } } wiimote_resetReportMode(x); }
static PyObject *Wiimote_disable(Wiimote *self, PyObject *args, PyObject *kwds) { static char *kwlist[] = {"flags", NULL}; int flags; if (!PyArg_ParseTupleAndKeywords(args, kwds, "i:cwiid.Wiimote.disable", kwlist, &flags)) { return NULL; } if (cwiid_disable(self->wiimote, flags)) { PyErr_SetString(PyExc_RuntimeError, "Error disabling wiimote flags"); return NULL; } Py_RETURN_NONE; }
void* wiicursor_thread_func(void* ptr) { DEBUG_MSG(3, "Entering wiicursor_thread_func()\n"); ASSERT(ptr != 0, "No data has been passed along"); WiiThreadFuncData& data = *static_cast<WiiThreadFuncData*>(ptr); ASSERT(data.this_thread != 0, "This thread has become immortal, omfg!!!1"); WiiCursor wc; wc.events() = data.events; wc.process(data.wiimotes, data.thread_running); // The main loop for (std::vector<WiimoteData>::iterator iter = data.wiimotes.begin(); iter != data.wiimotes.end(); ++iter) { DEBUG_MSG(1, "Disabling reporting of events in Wiimote #%d...\n", iter-data.wiimotes.begin()); cwiid_disable(iter->wiimote, CWIID_FLAG_MESG_IFC); } DEBUG_MSG(3, "Exiting wiicursor_thread_func()\n"); return 0; }
int main(int argc, char *argv[]) { cwiid_wiimote_t *wiimote; /* wiimote handle */ struct cwiid_state state; /* wiimote state */ bdaddr_t bdaddr; /* bluetooth device address */ unsigned char mesg = 0; unsigned char led_state = 0; unsigned char rpt_mode = 0; unsigned char rumble = 0; int exit = 0; cwiid_set_err(err); /* Connect to address given on command-line, if present */ if (argc > 1) { str2ba(argv[1], &bdaddr); } else { bdaddr = *BDADDR_ANY; } /* Connect to the wiimote */ printf("Put Wiimote in discoverable mode now (press 1+2)...\n"); if (!(wiimote = cwiid_open(&bdaddr, 0))) { fprintf(stderr, "Unable to connect to wiimote\n"); return -1; } if (cwiid_set_mesg_callback(wiimote, cwiid_callback)) { fprintf(stderr, "Unable to set message callback\n"); } printf("Note: To demonstrate the new API interfaces, wmdemo no longer " "enables messages by default.\n" "Output can be gathered through the new state-based interface (s), " "or by enabling the messages interface (c).\n"); /* Menu */ printf("%s", MENU); while (!exit) { switch (getchar()) { case '1': toggle_bit(led_state, CWIID_LED1_ON); set_led_state(wiimote, led_state); break; case '2': toggle_bit(led_state, CWIID_LED2_ON); set_led_state(wiimote, led_state); break; case '3': toggle_bit(led_state, CWIID_LED3_ON); set_led_state(wiimote, led_state); break; case '4': toggle_bit(led_state, CWIID_LED4_ON); set_led_state(wiimote, led_state); break; case '5': toggle_bit(rumble, 1); if (cwiid_set_rumble(wiimote, rumble)) { fprintf(stderr, "Error setting rumble\n"); } break; case 'a': toggle_bit(rpt_mode, CWIID_RPT_ACC); set_rpt_mode(wiimote, rpt_mode); break; case 'b': toggle_bit(rpt_mode, CWIID_RPT_BTN); set_rpt_mode(wiimote, rpt_mode); break; case 'e': /* CWIID_RPT_EXT is actually * CWIID_RPT_NUNCHUK | CWIID_RPT_CLASSIC */ toggle_bit(rpt_mode, CWIID_RPT_EXT); set_rpt_mode(wiimote, rpt_mode); break; case 'i': /* libwiimote picks the highest quality IR mode available with the * other options selected (not including as-yet-undeciphered * interleaved mode */ toggle_bit(rpt_mode, CWIID_RPT_IR); set_rpt_mode(wiimote, rpt_mode); break; case 'm': if (!mesg) { if (cwiid_enable(wiimote, CWIID_FLAG_MESG_IFC)) { fprintf(stderr, "Error enabling messages\n"); } else { mesg = 1; } } else { if (cwiid_disable(wiimote, CWIID_FLAG_MESG_IFC)) { fprintf(stderr, "Error disabling message\n"); } else { mesg = 0; } } break; case 'p': printf("%s", MENU); break; case 'r': if (cwiid_request_status(wiimote)) { fprintf(stderr, "Error requesting status message\n"); } break; case 's': if (cwiid_get_state(wiimote, &state)) { fprintf(stderr, "Error getting state\n"); } print_state(&state); break; case 't': toggle_bit(rpt_mode, CWIID_RPT_STATUS); set_rpt_mode(wiimote, rpt_mode); break; case 'x': exit = -1; break; case '\n': break; default: fprintf(stderr, "invalid option\n"); } } if (cwiid_close(wiimote)) { fprintf(stderr, "Error on wiimote disconnect\n"); return -1; } return 0; }