diff --git a/src/io.c b/src/io.c index 1240fcc..305c0ea 100644 --- a/src/io.c +++ b/src/io.c @@ -95,6 +95,7 @@ void wiiuse_handshake_expansion(struct wiimote_t *wm,ubyte *data,uword len) case EXP_ID_CODE_CLASSIC_CONTROLLER: case EXP_ID_CODE_CLASSIC_CONTROLLER_NYKOWING: case EXP_ID_CODE_CLASSIC_CONTROLLER_NYKOWING2: + case EXP_ID_CODE_CLASSIC_CONTROLLER_NYKOWING3: case EXP_ID_CODE_CLASSIC_CONTROLLER_GENERIC: case EXP_ID_CODE_CLASSIC_CONTROLLER_GENERIC2: case EXP_ID_CODE_CLASSIC_CONTROLLER_GENERIC3: @@ -109,11 +110,12 @@ void wiiuse_handshake_expansion(struct wiimote_t *wm,ubyte *data,uword len) if(!wii_board_handshake(wm,&wm->exp.wb,data,len)) return; break; default: - WIIMOTE_DISABLE_STATE(wm,WIIMOTE_STATE_EXP_HANDSHAKE); + if(!classic_ctrl_handshake(wm,&wm->exp.classic,data,len)) return; + /*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; + return;*/ } __lwp_wkspace_free(data); diff --git a/src/io_wii.c b/src/io_wii.c index d024d97..a9082c9 100644 --- a/src/io_wii.c +++ b/src/io_wii.c @@ -12,8 +12,10 @@ #include "lwp_wkspace.h" #define MAX_COMMANDS 0x100 +#define MAX_WIIMOTES 5 static vu32* const _ipcReg = (u32*)0xCD000000; +static u8 *__queue_buffer[MAX_WIIMOTES] = { 0, 0, 0, 0, 0 }; extern void parse_event(struct wiimote_t *wm); extern void idle_cycle(struct wiimote_t* wm); @@ -179,14 +181,18 @@ void wiiuse_sensorbar_enable(int enable) __wiiuse_sensorbar_enable(enable); } + void wiiuse_init_cmd_queue(struct wiimote_t *wm) { - u8 *buffer; u32 size; - size = (MAX_COMMANDS*sizeof(struct cmd_blk_t)); - buffer = __lwp_wkspace_allocate(size); - __lwp_queue_initialize(&wm->cmdq,buffer,MAX_COMMANDS,sizeof(struct cmd_blk_t)); + if (!__queue_buffer[wm->unid]) { + size = (MAX_COMMANDS*sizeof(struct cmd_blk_t)); + __queue_buffer[wm->unid] = __lwp_wkspace_allocate(size); + if(!__queue_buffer[wm->unid]) return; + } + + __lwp_queue_initialize(&wm->cmdq,__queue_buffer[wm->unid],MAX_COMMANDS,sizeof(struct cmd_blk_t)); } int wiiuse_io_write(struct wiimote_t *wm,ubyte *buf,int len) diff --git a/src/wiiuse.c b/src/wiiuse.c index aa8ecb0..f1bab99 100644 --- a/src/wiiuse.c +++ b/src/wiiuse.c @@ -12,6 +12,8 @@ #include "wiiuse_internal.h" #include "io.h" +static struct wiimote_t** __wm = NULL; + void wiiuse_send_next_command(struct wiimote_t *wm) { struct cmd_blk_t *cmd = wm->cmd_head; @@ -54,51 +56,54 @@ extern void __wiiuse_sensorbar_enable(int enable); struct wiimote_t** wiiuse_init(int wiimotes, wii_event_cb event_cb) { #endif int i = 0; - struct wiimote_t** wm = NULL; if (!wiimotes) return NULL; - wm = __lwp_wkspace_allocate(sizeof(struct wiimote_t*) * wiimotes); - if(!wm) return NULL; + if (!__wm) { + __wm = __lwp_wkspace_allocate(sizeof(struct wiimote_t*) * wiimotes); + if(!__wm) return NULL; + memset(__wm, 0, sizeof(struct wiimote_t*) * wiimotes); + } for (i = 0; i < wiimotes; ++i) { - wm[i] = __lwp_wkspace_allocate(sizeof(struct wiimote_t)); - memset(wm[i], 0, sizeof(struct wiimote_t)); + if(!__wm[i]) + __wm[i] = __lwp_wkspace_allocate(sizeof(struct wiimote_t)); - wm[i]->unid = i; + memset(__wm[i], 0, sizeof(struct wiimote_t)); + __wm[i]->unid = i; #if defined(WIN32) - wm[i]->dev_handle = 0; - wm[i]->stack = WIIUSE_STACK_UNKNOWN; - wm[i]->normal_timeout = WIIMOTE_DEFAULT_TIMEOUT; - wm[i]->exp_timeout = WIIMOTE_EXP_TIMEOUT; - wm[i]->timeout = wm[i]->normal_timeout; + __wm[i]->dev_handle = 0; + __wm[i]->stack = WIIUSE_STACK_UNKNOWN; + __wm[i]->normal_timeout = WIIMOTE_DEFAULT_TIMEOUT; + __wm[i]->exp_timeout = WIIMOTE_EXP_TIMEOUT; + __wm[i]->timeout = __wm[i]->normal_timeout; #elif defined(GEKKO) - wm[i]->sock = NULL; - wm[i]->bdaddr = *BD_ADDR_ANY; - wm[i]->event_cb = event_cb; - wiiuse_init_cmd_queue(wm[i]); + __wm[i]->sock = NULL; + __wm[i]->bdaddr = *BD_ADDR_ANY; + __wm[i]->event_cb = event_cb; + wiiuse_init_cmd_queue(__wm[i]); #elif defined(unix) - wm[i]->bdaddr = *BDADDR_ANY; - wm[i]->out_sock = -1; - wm[i]->in_sock = -1; + __wm[i]->bdaddr = *BDADDR_ANY; + __wm[i]->out_sock = -1; + __wm[i]->in_sock = -1; #endif - wm[i]->state = WIIMOTE_INIT_STATES; - wm[i]->flags = WIIUSE_INIT_FLAGS; + __wm[i]->state = WIIMOTE_INIT_STATES; + __wm[i]->flags = WIIUSE_INIT_FLAGS; - wm[i]->event = WIIUSE_NONE; + __wm[i]->event = WIIUSE_NONE; - wm[i]->exp.type = EXP_NONE; + __wm[i]->exp.type = EXP_NONE; - wiiuse_set_aspect_ratio(wm[i], WIIUSE_ASPECT_4_3); - wiiuse_set_ir_position(wm[i], WIIUSE_IR_ABOVE); + wiiuse_set_aspect_ratio(__wm[i], WIIUSE_ASPECT_4_3); + wiiuse_set_ir_position(__wm[i], WIIUSE_IR_ABOVE); - wm[i]->accel_calib.st_alpha = WIIUSE_DEFAULT_SMOOTH_ALPHA; + __wm[i]->accel_calib.st_alpha = WIIUSE_DEFAULT_SMOOTH_ALPHA; } - return wm; + return __wm; } /** diff --git a/src/wiiuse_internal.h b/src/wiiuse_internal.h index 2bcfa34..4cfabdf 100644 --- a/src/wiiuse_internal.h +++ b/src/wiiuse_internal.h @@ -166,6 +166,7 @@ #define EXP_ID_CODE_CLASSIC_CONTROLLER 0xa4200101 #define EXP_ID_CODE_CLASSIC_CONTROLLER_NYKOWING 0x90908f00 #define EXP_ID_CODE_CLASSIC_CONTROLLER_NYKOWING2 0x9e9f9c00 +#define EXP_ID_CODE_CLASSIC_CONTROLLER_NYKOWING3 0x908f8f00 #define EXP_ID_CODE_CLASSIC_CONTROLLER_GENERIC 0xa5a2a300 #define EXP_ID_CODE_CLASSIC_CONTROLLER_GENERIC2 0x98999900 #define EXP_ID_CODE_CLASSIC_CONTROLLER_GENERIC3 0xa0a1a000 diff --git a/src/wpad.c b/src/wpad.c index b023cc7..387cdc0 100644 --- a/src/wpad.c +++ b/src/wpad.c @@ -182,17 +182,17 @@ static void __wpad_setfmt(s32 chan) case WPAD_FMT_BTNS: wiiuse_set_flags(__wpads[chan], 0, WIIUSE_CONTINUOUS); wiiuse_motion_sensing(__wpads[chan],0); - wiiuse_set_ir(__wpads[chan],0); + if(chan != WPAD_BALANCE_BOARD) wiiuse_set_ir(__wpads[chan],0); break; case WPAD_FMT_BTNS_ACC: wiiuse_set_flags(__wpads[chan], WIIUSE_CONTINUOUS, 0); wiiuse_motion_sensing(__wpads[chan],1); - wiiuse_set_ir(__wpads[chan],0); + if(chan != WPAD_BALANCE_BOARD) wiiuse_set_ir(__wpads[chan],0); break; case WPAD_FMT_BTNS_ACC_IR: wiiuse_set_flags(__wpads[chan], WIIUSE_CONTINUOUS, 0); wiiuse_motion_sensing(__wpads[chan],1); - wiiuse_set_ir(__wpads[chan],1); + if(chan != WPAD_BALANCE_BOARD) wiiuse_set_ir(__wpads[chan],1); break; default: break; @@ -559,7 +559,6 @@ static void __wpad_read_wiimote(struct wiimote_t *wm, WPADData *data, s32 *idle_ data->err = WPAD_ERR_NO_CONTROLLER; } - static void __wpad_eventCB(struct wiimote_t *wm,s32 event) { s32 chan; @@ -676,26 +675,35 @@ s32 WPAD_Init() __wpdcb[i].thresh.wb = WPAD_THRESH_DEFAULT_BALANCEBOARD; __wpdcb[i].thresh.mp = WPAD_THRESH_DEFAULT_MOTION_PLUS; - SYS_CreateAlarm(&__wpdcb[i].sound_alarm); + if (SYS_CreateAlarm(&__wpdcb[i].sound_alarm) < 0) + { + WPAD_Shutdown(); + _CPU_ISR_Restore(level); + return WPAD_ERR_UNKNOWN; + } } if(CONF_GetPadDevices(&__wpad_devs) < 0) { + WPAD_Shutdown(); _CPU_ISR_Restore(level); return WPAD_ERR_BADCONF; } if(__wpad_devs.num_registered == 0) { + WPAD_Shutdown(); _CPU_ISR_Restore(level); return WPAD_ERR_NONEREGISTERED; } if(__wpad_devs.num_registered > CONF_PAD_MAX_REGISTERED) { + WPAD_Shutdown(); _CPU_ISR_Restore(level); return WPAD_ERR_BADCONF; } __wpads = wiiuse_init(WPAD_MAX_WIIMOTES,__wpad_eventCB); if(__wpads==NULL) { + WPAD_Shutdown(); _CPU_ISR_Restore(level); return WPAD_ERR_UNKNOWN; } @@ -706,13 +714,18 @@ s32 WPAD_Init() BTE_SetDisconnectCallback(__wpad_disconnectCB); BTE_InitCore(__initcore_finished); - SYS_CreateAlarm(&__wpad_timer); + if (SYS_CreateAlarm(&__wpad_timer) < 0) + { + WPAD_Shutdown(); + _CPU_ISR_Restore(level); + return WPAD_ERR_UNKNOWN; + } + SYS_RegisterResetFunc(&__wpad_resetinfo); tb.tv_sec = 1; tb.tv_nsec = 0; SYS_SetPeriodicAlarm(__wpad_timer,&tb,&tb,__wpad_timeouthandler,NULL); - __wpads_inited = WPAD_STATE_ENABLING; } _CPU_ISR_Restore(level); @@ -1072,7 +1085,7 @@ void WPAD_SetBatteryDeadCallback(WPADShutdownCallback cb) s32 WPAD_Disconnect(s32 chan) { - u32 level; + u32 level, cnt = 0; struct _wpad_cb *wpdcb = NULL; if(chan=WPAD_MAX_WIIMOTES) return WPAD_ERR_BAD_CHANNEL; @@ -1085,9 +1098,14 @@ s32 WPAD_Disconnect(s32 chan) wpdcb = &__wpdcb[chan]; __wpad_disconnect(wpdcb); + _CPU_ISR_Restore(level); - while(__wpads_active&(0x01< 3000) break; + } + return WPAD_ERR_NONE; } @@ -1095,14 +1113,12 @@ void WPAD_Shutdown() { s32 i; u32 level; + u32 cnt = 0; struct _wpad_cb *wpdcb = NULL; _CPU_ISR_Disable(level); - if(__wpads_inited==WPAD_STATE_DISABLED) { - _CPU_ISR_Restore(level); - return; - } + __wpads_inited = WPAD_STATE_DISABLED; SYS_RemoveAlarm(__wpad_timer); for(i=0;i 3000) break; + } BTE_Shutdown(); }