Skip to content

Commit

Permalink
Merge remote branch 'libogc-wiiuse/trunk'
Browse files Browse the repository at this point in the history
  • Loading branch information
xloem committed Jan 26, 2011
2 parents 6ba78f4 + 89473e0 commit ade37fd
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 47 deletions.
6 changes: 4 additions & 2 deletions src/io.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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);

Expand Down
14 changes: 10 additions & 4 deletions src/io_wii.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand Down
57 changes: 31 additions & 26 deletions src/wiiuse.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}

/**
Expand Down
1 change: 1 addition & 0 deletions src/wiiuse_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
47 changes: 32 additions & 15 deletions src/wpad.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand All @@ -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);
Expand Down Expand Up @@ -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_CHAN_0 || chan>=WPAD_MAX_WIIMOTES) return WPAD_ERR_BAD_CHANNEL;
Expand All @@ -1085,24 +1098,27 @@ s32 WPAD_Disconnect(s32 chan)

wpdcb = &__wpdcb[chan];
__wpad_disconnect(wpdcb);

_CPU_ISR_Restore(level);

while(__wpads_active&(0x01<<chan));
while(__wpads_active&(0x01<<chan)) {
usleep(50);
if(++cnt > 3000) break;
}

return WPAD_ERR_NONE;
}

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<WPAD_MAX_WIIMOTES;i++) {
wpdcb = &__wpdcb[i];
Expand All @@ -1111,11 +1127,12 @@ void WPAD_Shutdown()
}

__wiiuse_sensorbar_enable(0);
__wpads_inited = WPAD_STATE_DISABLED;
_CPU_ISR_Restore(level);

while(__wpads_active)
while(__wpads_active) {
usleep(50);
if(++cnt > 3000) break;
}

BTE_Shutdown();
}
Expand Down

0 comments on commit ade37fd

Please sign in to comment.