int connectWiimote(wiimote** wiimotes) { int found = 0; int connected = 0; wiimote* wm; while(!found) { //Look for Wiimotes. Keep searching until one is found. Wiiuse provides no way to search forever, so search for 5 secs and repeat. found = wiiuse_find(wiimotes, MAX_WIIMOTES, 5); } connected = wiiuse_connect(wiimotes, MAX_WIIMOTES); wm = wiimotes[0]; if (connected) { EventClient.SendHELO("Wii Remote", ICON_PNG, NULL); wiiuse_set_leds(wm, WIIMOTE_LED_1); wiiuse_rumble(wm, 1); wiiuse_set_orient_threshold(wm,1); #ifndef WIN32 usleep(200000); #else Sleep(200); #endif wiiuse_rumble(wm, 0); return 1; } return 0; }
bool CryVR_WiimoteManagerPlugin::SetAccelThreshold( int ii, float angle ) { threshold = ii; angle_threshold = angle; if ( init && found > 0 ) { int i = 0; for ( ; i < MAX_WIIMOTES; ++i ) { wiiuse_set_accel_threshold( wiimotes[i], ii ); wiiuse_set_nunchuk_accel_threshold( wiimotes[i], ii ); wiiuse_set_orient_threshold( wiimotes[i], angle_threshold ); wiiuse_set_nunchuk_orient_threshold( wiimotes[i], angle_threshold ); } return true; } return false; }
/** * Set how many degrees an angle must change to generate an event. * @param id id of the wiimote concerned * @param thresh minimum angle detected by an event */ JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setOrientThreshold (JNIEnv *env, jobject obj, jint id, jfloat thresh) { wiiuse_set_orient_threshold(wiiuse_get_by_id(wiimotes, nbMaxWiimotes, id), thresh); }
void handle_event(struct wiimote_t* wm) { static uint8_t controls = ABS | TC | STABILITY; #if 0 printf("\n\n--- EVENT [id %i] ---\n", wm->unid); /* if a button is pressed, report it */ if (IS_PRESSED(wm, WIIMOTE_BUTTON_A)) printf("A pressed\n"); if (IS_PRESSED(wm, WIIMOTE_BUTTON_B)) printf("B pressed\n"); if (IS_PRESSED(wm, WIIMOTE_BUTTON_UP)) printf("UP pressed\n"); if (IS_PRESSED(wm, WIIMOTE_BUTTON_DOWN)) printf("DOWN pressed\n"); if (IS_PRESSED(wm, WIIMOTE_BUTTON_LEFT)) printf("LEFT pressed\n"); if (IS_PRESSED(wm, WIIMOTE_BUTTON_RIGHT)) printf("RIGHT pressed\n"); if (IS_PRESSED(wm, WIIMOTE_BUTTON_MINUS)) printf("MINUS pressed\n"); if (IS_PRESSED(wm, WIIMOTE_BUTTON_PLUS)) printf("PLUS pressed\n"); if (IS_PRESSED(wm, WIIMOTE_BUTTON_ONE)) printf("ONE pressed\n"); if (IS_PRESSED(wm, WIIMOTE_BUTTON_TWO)) printf("TWO pressed\n"); if (IS_PRESSED(wm, WIIMOTE_BUTTON_HOME)) printf("HOME pressed\n"); #endif /* * Pressing home will tell the wiimote we are interested in movement. */ if (IS_JUST_PRESSED(wm, WIIMOTE_BUTTON_HOME)) { wiiuse_set_orient_threshold(wm, 0.5); wiiuse_motion_sensing(wm, 1); } if(IS_JUST_PRESSED(wm, WIIMOTE_BUTTON_PLUS)){ carInputs.gear++; if(carInputs.gear>7) carInputs.gear = 7; controls ^= ABS; } if(IS_JUST_PRESSED(wm, WIIMOTE_BUTTON_UP)){ carInputs.cruisedist = carInputs.cruisedist +10; if(carInputs.cruisedist > 100) carInputs.cruisedist = 100; } if(IS_JUST_PRESSED(wm, WIIMOTE_BUTTON_DOWN)){ carInputs.cruisedist = carInputs.cruisedist -10; if(carInputs.cruisedist <50) carInputs.cruisedist = 50; } if(IS_JUST_PRESSED(wm, WIIMOTE_BUTTON_MINUS)){ if(carInputs.gear>=2) carInputs.gear--; controls ^= TC; } if (IS_JUST_PRESSED(wm, WIIMOTE_BUTTON_RIGHT)){ controls ^= STABILITY; carInputs.gear = 0; } if(IS_JUST_PRESSED(wm, WIIMOTE_BUTTON_A)) controls ^= CRUISE; if (WIIUSE_USING_ACC(wm)) { // obtain the steering angle input from wiimote float steer_temp = wm->orient.pitch; if(steer_temp < -90) steer_temp = -90; else if(steer_temp > 90) steer_temp = 90; if(steer_temp != 0) carInputs.steer = (steer_temp/abs(steer_temp))*pow(steer_temp/90,2)*50; else carInputs.steer = 0; //printf("steer: %d\n", carInputs.steer); } // obtain acceleration input from WiiMote if (IS_PRESSED(wm, WIIMOTE_BUTTON_ONE)) { carInputs.accel = 100; } else carInputs.accel = 0; // obtain brake input from WiiMote if (IS_PRESSED(wm, WIIMOTE_BUTTON_TWO)) { carInputs.brake = 100; controls &= ~(CRUISE); } else carInputs.brake = 0; if (IS_PRESSED(wm, WIIMOTE_BUTTON_LEFT)) carInputs.gear = -1; carInputs.clutch = 0; carInputs.controls = controls; }
/** * Set how many degrees an angle must change to generate an event. * @param id id of the wiimote concerned * @param angle minimum angle detected by an event */ JNIEXPORT void JNICALL Java_wiiusej_WiiUseApi_setOrientThreshold (JNIEnv *env, jobject obj, jint id, jfloat thresh) { wiiuse_set_orient_threshold(wiimotes[id-1], thresh); }
void Wiimote::setOrientThreshold(float threshold) { wiiuse_set_orient_threshold(this->wm, threshold); }
static u32 WII_Run(void *par) { GF_BitStream *bs; char *buf; u32 i, buf_size, count, scan_delay; const char *opt; GF_InputSensorDevice *ifce = (GF_InputSensorDevice *)par; GF_WiiMote *wii = (GF_WiiMote *)ifce->udta; scan_delay = 5; opt = gf_modules_get_option((GF_BaseInterface*)ifce, "WII", "ScanDelay"); if (opt) scan_delay = atoi(opt); /*locate the wiimotes*/ count = wiiuse_find(wii->wiimotes, wii->nb_wiimotes, scan_delay); GF_LOG(GF_LOG_INFO, GF_LOG_MMIO, ("[Wii] Found %d wiimotes\n", count)); count = wiiuse_connect(wii->wiimotes, wii->nb_wiimotes); if (count) { GF_LOG(GF_LOG_INFO, GF_LOG_MMIO, ("[Wii] Connected to %d connected wiimotes\n", count)); } else { GF_LOG(GF_LOG_INFO, GF_LOG_MMIO, ("[Wii] Failed to connect to any wiimote\n")); } opt = gf_modules_get_option((GF_BaseInterface*)ifce, "WII", "MotionSensing"); /*enable motion sensing*/ if (!opt || !strcmp(opt, "yes")) { Float smooth_alpha = 0.5; Float ori_threshold = 10.0; opt = gf_modules_get_option((GF_BaseInterface*)ifce, "WII", "OrientationThreshold"); if (opt) ori_threshold = (Float) atof(opt); opt = gf_modules_get_option((GF_BaseInterface*)ifce, "WII", "SmoothAlpha"); if (opt) { smooth_alpha = (Float) atof(opt); if (smooth_alpha<0) smooth_alpha = 0.5; else if (smooth_alpha>1.0) smooth_alpha=0.5; } GF_LOG(GF_LOG_INFO, GF_LOG_MMIO, ("[Wii] Enabling motion sensing - Alpha smoothing %f - Orientation Threshold %f\n", smooth_alpha, ori_threshold)); for (i=0; i<count; i++) { wiiuse_motion_sensing(wii->wiimotes[i], 1); wiiuse_set_smooth_alpha(wii->wiimotes[i],smooth_alpha); wiiuse_set_orient_threshold(wii->wiimotes[i], ori_threshold); } } while (wii->running) { count = wiiuse_poll(wii->wiimotes, wii->nb_wiimotes); if (!count) { continue; } for (i=0; i<count; i++) { struct wiimote_t* wm = wii->wiimotes[i]; switch (wm->event) { case WIIUSE_EVENT:/* A generic event occured on the wiimote. */ /*create the data frame*/ bs = gf_bs_new(NULL, 0, GF_BITSTREAM_WRITE); /*if not the same wiimote write the UID*/ if (wii->prev_id != wm->unid) { gf_bs_write_int(bs, 1, 1); gf_bs_write_int(bs, wm->unid, 32); wii->prev_id = wm->unid; } else { gf_bs_write_int(bs, 0, 1); } /*write buttons state*/ WRITE_BUTTON(WIIMOTE_BUTTON_ONE); WRITE_BUTTON(WIIMOTE_BUTTON_TWO); WRITE_BUTTON(WIIMOTE_BUTTON_A); WRITE_BUTTON(WIIMOTE_BUTTON_B); WRITE_BUTTON(WIIMOTE_BUTTON_MINUS); WRITE_BUTTON(WIIMOTE_BUTTON_HOME); WRITE_BUTTON(WIIMOTE_BUTTON_PLUS); WRITE_BUTTON(WIIMOTE_BUTTON_LEFT); WRITE_BUTTON(WIIMOTE_BUTTON_RIGHT); WRITE_BUTTON(WIIMOTE_BUTTON_DOWN); WRITE_BUTTON(WIIMOTE_BUTTON_UP); /*write yaw-pitch-roll - FIXME: wiiuse seems to output NaN in these values upon init*/ gf_bs_write_int(bs, 1, 1); gf_bs_write_float(bs, WII_PI * wm->orient.yaw / 24 ); gf_bs_write_float(bs, WII_PI * wm->orient.pitch / 180); gf_bs_write_float(bs, WII_PI * wm->orient.roll / 180); /*write gravity - FIXME: wiiuse seems to output NaN in these values upon init*/ gf_bs_write_int(bs, 1, 1); gf_bs_write_float(bs, wm->gforce.x); gf_bs_write_float(bs, wm->gforce.y); gf_bs_write_float(bs, wm->gforce.z); gf_bs_align(bs); gf_bs_get_content(bs, &buf, &buf_size); gf_bs_del(bs); ifce->DispatchFrame(ifce, buf, buf_size); gf_free(buf); break; case WIIUSE_STATUS: /*A status report was obtained from the wiimote. */ break; case WIIUSE_DISCONNECT:/*The wiimote disconnected. */ break; case WIIUSE_READ_DATA:/* Data was returned that was previously requested from the wiimote ROM/registers. */ break; case WIIUSE_NUNCHUK_INSERTED: case WIIUSE_NUNCHUK_REMOVED: case WIIUSE_CLASSIC_CTRL_INSERTED: case WIIUSE_CLASSIC_CTRL_REMOVED: case WIIUSE_GUITAR_HERO_3_CTRL_INSERTED: case WIIUSE_GUITAR_HERO_3_CTRL_REMOVED: break; } } } return 0; }