void wiiuse_handshake(struct wiimote_t *wm,ubyte *data,uword len) { ubyte *buf = NULL; struct accel_t *accel = &wm->accel_calib; //printf("wiiuse_handshake(%d,%p,%d)\n",wm->handshake_state,data,len); switch(wm->handshake_state) { case 0: wm->handshake_state++; wiiuse_set_leds(wm,WIIMOTE_LED_NONE,NULL); wiiuse_status(wm,wiiuse_handshake); return; case 1: wm->handshake_state++; buf = __lwp_wkspace_allocate(sizeof(ubyte)*8); if (len > 2 && data[2]&WM_CTRL_STATUS_BYTE1_ATTACHMENT) { wiiuse_read_data(wm,buf,WM_EXP_ID,6,wiiuse_handshake); return; case 2: if (BIG_ENDIAN_LONG(*(int*)(&data[2])) == EXP_ID_CODE_CLASSIC_WIIU_PRO) { memset(data, 0, 8); WIIMOTE_ENABLE_STATE(wm, WIIMOTE_STATE_WIIU_PRO); break; } buf = data; } wm->handshake_state++; wiiuse_read_data(wm,buf,WM_MEM_OFFSET_CALIBRATION,7,wiiuse_handshake); return; } accel->cal_zero.x = ((data[0]<<2)|((data[3]>>4)&3)); accel->cal_zero.y = ((data[1]<<2)|((data[3]>>2)&3)); accel->cal_zero.z = ((data[2]<<2)|(data[3]&3)); accel->cal_g.x = (((data[4]<<2)|((data[7]>>4)&3)) - accel->cal_zero.x); accel->cal_g.y = (((data[5]<<2)|((data[7]>>2)&3)) - accel->cal_zero.y); accel->cal_g.z = (((data[6]<<2)|(data[7]&3)) - accel->cal_zero.z); __lwp_wkspace_free(data); WIIMOTE_DISABLE_STATE(wm, WIIMOTE_STATE_HANDSHAKE); WIIMOTE_ENABLE_STATE(wm, WIIMOTE_STATE_HANDSHAKE_COMPLETE); wm->event = WIIUSE_CONNECT; wiiuse_status(wm,NULL); }
/** * @brief Handle the handshake data from the wiiboard. * * @param wb A pointer to a wii_board_t structure. * @param data The data read in from the device. * @param len The length of the data block, in bytes. * * @return Returns 1 if handshake was successful, 0 if not. */ int wii_board_handshake(struct wiimote_t* wm, struct wii_board_t* wb, ubyte* data, uword len) { int offset = 0; if (data[offset]==0xff) { if (data[offset+16]==0xff) { WIIUSE_DEBUG("Wii Balance Board handshake appears invalid, trying again."); wiiuse_read_data(wm, data, WM_EXP_MEM_CALIBR, EXP_HANDSHAKE_LEN, wiiuse_handshake_expansion); return 0; } offset += 16; } wb->ctr[0] = (data[offset+4]<<8)|data[offset+5]; wb->cbr[0] = (data[offset+6]<<8)|data[offset+7]; wb->ctl[0] = (data[offset+8]<<8)|data[offset+9]; wb->cbl[0] = (data[offset+10]<<8)|data[offset+11]; wb->ctr[1] = (data[offset+12]<<8)|data[offset+13]; wb->cbr[1] = (data[offset+14]<<8)|data[offset+15]; wb->ctl[1] = (data[offset+16]<<8)|data[offset+17]; wb->cbl[1] = (data[offset+18]<<8)|data[offset+19]; wb->ctr[2] = (data[offset+20]<<8)|data[offset+21]; wb->cbr[2] = (data[offset+22]<<8)|data[offset+23]; wb->ctl[2] = (data[offset+24]<<8)|data[offset+25]; wb->cbl[2] = (data[offset+26]<<8)|data[offset+27]; /* handshake done */ wm->event = WIIUSE_WII_BOARD_INSERTED; wm->exp.type = EXP_WII_BOARD; return 1; }
s32 PullMiiFromWiimote(int slot, int wiimote, u8* MiiData) { if(slot>=WIIMOTE_MII_SLOT_NUM) return ERR_INVARG; if(sizeof MiiData < WIIMOTE_MII_DATA_BYTES_PER_SLOT) return ERR_ARRAYSIZE; short miiOffset = WIIMOTE_MII_DATA_BEGIN_1 + (slot * WIIMOTE_MII_DATA_BYTES_PER_SLOT); wiiuse_read_data(__wpads[wiimote], MiiData, miiOffset, WIIMOTE_MII_DATA_BYTES_PER_SLOT, NULL); return ERR_NONE; }
void wiiuse_handshake_expansion(struct wiimote_t *wm,ubyte *data,uword len) { int id; ubyte val; ubyte *buf = NULL; switch(wm->expansion_state) { /* These two initialization writes disable the encryption */ case 0: wm->expansion_state = 1; val = 0x55; wiiuse_write_data(wm,WM_EXP_MEM_ENABLE1,&val,1,wiiuse_handshake_expansion); break; case 1: wm->expansion_state = 2; val = 0x00; wiiuse_write_data(wm,WM_EXP_MEM_ENABLE2,&val,1,wiiuse_handshake_expansion); break; case 2: wm->expansion_state = 3; buf = __lwp_wkspace_allocate(sizeof(ubyte)*EXP_HANDSHAKE_LEN); wiiuse_read_data(wm,buf,WM_EXP_MEM_CALIBR,EXP_HANDSHAKE_LEN,wiiuse_handshake_expansion); break; case 3: if(!data || !len) return; id = BIG_ENDIAN_LONG(*(int*)(&data[220])); switch(id) { case EXP_ID_CODE_NUNCHUK: if(!nunchuk_handshake(wm,&wm->exp.nunchuk,data,len)) return; break; case EXP_ID_CODE_CLASSIC_CONTROLLER: if(!classic_ctrl_handshake(wm,&wm->exp.classic,data,len)) return; break; case EXP_ID_CODE_GUITAR: if(!guitar_hero_3_handshake(wm,&wm->exp.gh3,data,len)) return; break; case EXP_ID_CODE_WIIBOARD: if(!wii_board_handshake(wm,&wm->exp.wb,data,len)) return; break; default: WIIMOTE_DISABLE_STATE(wm,WIIMOTE_STATE_EXP_HANDSHAKE); WIIMOTE_ENABLE_STATE(wm,WIIMOTE_STATE_EXP_FAILED); __lwp_wkspace_free(data); wiiuse_status(wm,NULL); return; } __lwp_wkspace_free(data); WIIMOTE_DISABLE_STATE(wm,WIIMOTE_STATE_EXP_HANDSHAKE); WIIMOTE_ENABLE_STATE(wm,WIIMOTE_STATE_EXP); wiiuse_set_ir_mode(wm); wiiuse_status(wm,NULL); break; } }
void wiiuse_handshake(struct wiimote_t *wm,ubyte *data,uword len) { ubyte *buf = NULL; struct accel_t *accel = &wm->accel_calib; //printf("wiiuse_handshake(%d,%p,%d)\n",wm->handshake_state,data,len); switch(wm->handshake_state) { case 0: wm->handshake_state++; wiiuse_set_leds(wm,WIIMOTE_LED_NONE,NULL); buf = __lwp_wkspace_allocate(sizeof(ubyte)*8); wiiuse_read_data(wm,buf,WM_MEM_OFFSET_CALIBRATION,7,wiiuse_handshake); break; case 1: wm->handshake_state++; accel->cal_zero.x = ((data[0]<<2)|((data[3]>>4)&3)); accel->cal_zero.y = ((data[1]<<2)|((data[3]>>2)&3)); accel->cal_zero.z = ((data[2]<<2)|(data[3]&3)); accel->cal_g.x = (((data[4]<<2)|((data[7]>>4)&3)) - accel->cal_zero.x); accel->cal_g.y = (((data[5]<<2)|((data[7]>>2)&3)) - accel->cal_zero.y); accel->cal_g.z = (((data[6]<<2)|(data[7]&3)) - accel->cal_zero.z); __lwp_wkspace_free(data); WIIMOTE_DISABLE_STATE(wm, WIIMOTE_STATE_HANDSHAKE); WIIMOTE_ENABLE_STATE(wm, WIIMOTE_STATE_HANDSHAKE_COMPLETE); wm->event = WIIUSE_CONNECT; wiiuse_status(wm,NULL); break; default: break; } }
void wiiuse_motion_plus_check(struct wiimote_t *wm,ubyte *data,uword len) { u32 val; if(data == NULL) { wiiuse_read_data(wm, wm->motion_plus_id, WM_EXP_ID, 6, wiiuse_motion_plus_check); } else { WIIMOTE_DISABLE_STATE(wm, WIIMOTE_STATE_EXP); WIIMOTE_DISABLE_STATE(wm, WIIMOTE_STATE_EXP_FAILED); WIIMOTE_DISABLE_STATE(wm, WIIMOTE_STATE_EXP_HANDSHAKE); val = (data[3] << 16) | (data[2] << 24) | (data[4] << 8) | data[5]; if(val == EXP_ID_CODE_MOTION_PLUS) { /* handshake done */ wm->event = WIIUSE_MOTION_PLUS_ACTIVATED; wm->exp.type = EXP_MOTION_PLUS; WIIMOTE_ENABLE_STATE(wm,WIIMOTE_STATE_EXP); wiiuse_set_ir_mode(wm); } } }
int Wiimote::readData(byte* buffer, unsigned int offset, unsigned short len) { return wiiuse_read_data(this->wm, buffer, offset, len); }