/***** BEGIN WIIMOTE *****/
typedef struct wpad_driver
{
input_driver driver;
input_driver *next;
struct wiimote_t** wiimotes;
int wpad_initted;
int wpad_connected;
uint8_t wm_data[WPAD_MAX_WIIMOTES][64];
} wpad_driver;
static wpad_driver *_wpad;
static void wpad_shutdown(input_driver *driver)
{
wpad_driver *wpad = (wpad_driver*)driver;
if (wpad==NULL)
return;
if (wpad->wpad_initted)
{
WPAD_Shutdown();
wpad->wpad_initted = 0;
}
if (wpad->next)
wpad->next->shutdown(wpad->next);
wpad->next = NULL;
}
static void wm_read_cb(struct wiimote_t *wm, ubyte *data, uword len)
{
int i;
if (len != 16 || _wpad==NULL || _wpad->wiimotes==NULL)
return;
for (i=0; i < WPAD_MAX_WIIMOTES; i++)
{
if (_wpad->wiimotes[i]==wm)
break;
}
if (i==WPAD_MAX_WIIMOTES)
return; // don't know which wiimote this is
}
static int wpad_poll(input_driver *driver, unsigned int *pressed)
{
wpad_driver *wpad = (wpad_driver*)driver;
int read = 0;
const WPADData *wd;
if (wpad && wpad->wpad_initted)
{
int i;
// This stuff isn't used yet
for (i=0; i < WPAD_MAX_WIIMOTES; i++)
{
if (wpad->wpad_connected & (1<<i) && WPAD_Probe(i, NULL)==WPAD_ERR_NO_CONTROLLER)
{
// printf("Wiimote %d disconnected\n", i);
wpad->wpad_connected &= ~(1<<i);
}
else if ((wpad->wpad_connected & (1<<i))==0 && WPAD_Probe(i, NULL) == WPAD_ERR_NONE)
{
// printf("Wiimote %d connected (%p)\n", i, wpad->wm_data[i]);
wpad->wpad_connected |= (1<<i);
// wiiuse_read_data(wpad->wiimotes[i], wpad->wm_data[i], , sizeof(wpad->wm_data[0]), wm_read_cb);
}
}
if (WPAD_ReadPending(WPAD_CHAN_0, NULL)>0 && (wd = WPAD_Data(WPAD_CHAN_0)) && (wd->data_present&WPAD_DATA_BUTTONS))
{
if (wd->btns_d & WPAD_BUTTON_DOWN)
*pressed |= INPUT_BUTTON_DOWN;
if (wd->btns_d & WPAD_BUTTON_UP)
*pressed |= INPUT_BUTTON_UP;
if (wd->btns_d & WPAD_BUTTON_LEFT)
*pressed |= INPUT_BUTTON_LEFT;
if (wd->btns_d & WPAD_BUTTON_RIGHT)
*pressed |= INPUT_BUTTON_RIGHT;
if (wd->btns_d & WPAD_BUTTON_A)
*pressed |= INPUT_BUTTON_OK;
if (wd->btns_d & WPAD_BUTTON_B)
*pressed |= INPUT_BUTTON_CANCEL;
if (wd->btns_d & WPAD_BUTTON_1)
*pressed |= INPUT_BUTTON_1;
if (wd->btns_d & WPAD_BUTTON_2)
*pressed |= INPUT_BUTTON_2;
if (wd->btns_d & WPAD_BUTTON_HOME)
*pressed |= INPUT_BUTTON_START;
if (wd->exp.type == WPAD_EXP_CLASSIC)
{
if (wd->btns_d & WPAD_CLASSIC_BUTTON_DOWN)
*pressed |= INPUT_BUTTON_DOWN;
if (wd->btns_d & WPAD_CLASSIC_BUTTON_UP)
*pressed |= INPUT_BUTTON_UP;
if (wd->btns_d & WPAD_CLASSIC_BUTTON_LEFT)
*pressed |= INPUT_BUTTON_LEFT;
if (wd->btns_d & WPAD_CLASSIC_BUTTON_RIGHT)
*pressed |= INPUT_BUTTON_RIGHT;
if (wd->btns_d & WPAD_CLASSIC_BUTTON_B)
*pressed |= INPUT_BUTTON_OK;
if (wd->btns_d & WPAD_CLASSIC_BUTTON_Y)
*pressed |= INPUT_BUTTON_CANCEL;
if (wd->btns_d & WPAD_CLASSIC_BUTTON_X)
*pressed |= INPUT_BUTTON_1;
if (wd->btns_d & WPAD_CLASSIC_BUTTON_A)
*pressed |= INPUT_BUTTON_2;
if (wd->btns_d & WPAD_CLASSIC_BUTTON_HOME)
*pressed |= INPUT_BUTTON_START;
}
read = 1;
}
}
if (wpad->next)
read += wpad->next->poll(wpad->next, pressed);
return read;
}
static input_driver* wpad_init(input_driver *in)
{
wpad_driver *wpad = _wpad;
if (wpad && wpad->wpad_initted)
return in;
if (wpad == NULL)
{
wpad = (wpad_driver*)malloc(sizeof(wpad_driver));
if (wpad==NULL)
return in;
_wpad = wpad;
// get wiimote_t array before WPAD_Init() calls wiiuse_init()
wpad->wiimotes = wiiuse_init(WPAD_MAX_WIIMOTES, NULL);
wpad->wpad_connected = 0;
}
else if (wpad->wpad_initted)
return in;
WPAD_Init();
wpad->wpad_initted = 1;
wpad->driver = wpad_interface;
wpad->next = in;
return &wpad->driver;
}
/***** END WIIMOTE *****/