From 744fac6777e5bcd4496f97715939056038131d29 Mon Sep 17 00:00:00 2001 From: benoa Date: Sun, 15 Sep 2019 00:46:02 +0200 Subject: [PATCH] Wii: Add wiimote lightgun support --- config.def.h | 4 + configuration.c | 3 + configuration.h | 4 +- input/drivers/gx_input.c | 174 ++++++++++++++++++++++++++- input/drivers_joypad/gx_joypad.c | 105 ++++++++++++++++ intl/msg_hash_lbl.h | 4 + intl/msg_hash_us.h | 10 ++ menu/cbs/menu_cbs_sublabel.c | 8 ++ menu/menu_displaylist.c | 6 + menu/menu_setting.c | 15 +++ msg_hash.h | 3 + wii/libogc/libs/wii/libbte.a | Bin 97912 -> 97912 bytes wii/libogc/libs/wii/libdb.a | Bin 102260 -> 102260 bytes wii/libogc/libs/wii/libogc.a | Bin 722704 -> 722704 bytes wii/libogc/libs/wii/libwiikeyboard.a | Bin 40698 -> 40698 bytes wii/libogc/libs/wii/libwiiuse.a | Bin 63960 -> 64870 bytes wii/libogc/wiiuse/wpad.c | 38 ++++++ 17 files changed, 372 insertions(+), 2 deletions(-) diff --git a/config.def.h b/config.def.h index 88a931c393..3c1b02c72b 100644 --- a/config.def.h +++ b/config.def.h @@ -93,6 +93,10 @@ #define DEFAULT_MAX_PADS 16 #endif +#if defined(GEKKO) +#define DEFAULT_MOUSE_SCALE 1 +#endif + #if defined(RARCH_MOBILE) || defined(HAVE_LIBNX) #define DEFAULT_POINTER_ENABLE true #else diff --git a/configuration.c b/configuration.c index 749da361d6..910112c8ac 100644 --- a/configuration.c +++ b/configuration.c @@ -1726,6 +1726,9 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings, SETTING_UINT("input_max_users", input_driver_get_uint(INPUT_ACTION_MAX_USERS), true, input_max_users, false); SETTING_UINT("fps_update_interval", &settings->uints.fps_update_interval, true, DEFAULT_FPS_UPDATE_INTERVAL, false); SETTING_UINT("input_menu_toggle_gamepad_combo", &settings->uints.input_menu_toggle_gamepad_combo, true, menu_toggle_gamepad_combo, false); +#ifdef GEKKO + SETTING_UINT("input_mouse_scale", &settings->uints.input_mouse_scale, true, DEFAULT_MOUSE_SCALE, false); +#endif SETTING_UINT("audio_latency", &settings->uints.audio_latency, false, 0 /* TODO */, false); SETTING_UINT("audio_resampler_quality", &settings->uints.audio_resampler_quality, true, audio_resampler_quality_level, false); SETTING_UINT("audio_block_frames", &settings->uints.audio_block_frames, true, 0, false); diff --git a/configuration.h b/configuration.h index 7c1dda92cd..7107eb790d 100644 --- a/configuration.h +++ b/configuration.h @@ -454,7 +454,9 @@ typedef struct settings unsigned input_bind_timeout; unsigned input_bind_hold; - +#ifdef GEKKO + unsigned input_mouse_scale; +#endif unsigned input_menu_toggle_gamepad_combo; unsigned input_keyboard_gamepad_mapping_type; unsigned input_poll_type_behavior; diff --git a/input/drivers/gx_input.c b/input/drivers/gx_input.c index d93413a0bf..ddf178eb2e 100644 --- a/input/drivers/gx_input.c +++ b/input/drivers/gx_input.c @@ -32,11 +32,103 @@ /* TODO/FIXME - * fix game focus toggle */ +/* gx joypad functions */ +bool gxpad_mousevalid(unsigned port); +void gx_joypad_read_mouse(unsigned port, int *irx, int *iry, uint32_t *button); + +typedef struct +{ + int x_abs, y_abs; + int x_last, y_last; + uint32_t button; +} gx_input_mouse_t; + typedef struct gx_input { const input_device_driver_t *joypad; + int mouse_max; + gx_input_mouse_t *mouse; } gx_input_t; +static int16_t gx_lightgun_state(gx_input_t *gx, unsigned id, uint16_t joy_idx) +{ + struct video_viewport vp = {0}; + video_driver_get_viewport_info(&vp); + int16_t res_x = 0; + int16_t res_y = 0; + int16_t res_screen_x = 0; + int16_t res_screen_y = 0; + int16_t x = 0; + int16_t y = 0; + + vp.x = 0; + vp.y = 0; + vp.width = 0; + vp.height = 0; + vp.full_width = 0; + vp.full_height = 0; + + x = gx->mouse[joy_idx].x_abs; + y = gx->mouse[joy_idx].y_abs; + + if (!(video_driver_translate_coord_viewport_wrap(&vp, x, y, + &res_x, &res_y, &res_screen_x, &res_screen_y))) + return 0; + + switch (id) + { + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X: + return res_screen_x; + case RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y: + return res_screen_y; + case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER: + return gx->mouse[joy_idx].button & (1 << RETRO_DEVICE_ID_LIGHTGUN_TRIGGER); + case RETRO_DEVICE_ID_LIGHTGUN_AUX_A: + return gx->mouse[joy_idx].button & (1 << RETRO_DEVICE_ID_LIGHTGUN_AUX_A); + case RETRO_DEVICE_ID_LIGHTGUN_AUX_B: + return gx->mouse[joy_idx].button & (1 << RETRO_DEVICE_ID_LIGHTGUN_AUX_B); + case RETRO_DEVICE_ID_LIGHTGUN_AUX_C: + return gx->mouse[joy_idx].button & (1 << RETRO_DEVICE_ID_LIGHTGUN_AUX_C); + case RETRO_DEVICE_ID_LIGHTGUN_START: + return gx->mouse[joy_idx].button & (1 << RETRO_DEVICE_ID_LIGHTGUN_START); + case RETRO_DEVICE_ID_LIGHTGUN_SELECT: + return gx->mouse[joy_idx].button & (1 << RETRO_DEVICE_ID_LIGHTGUN_SELECT); + case RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN: + return !gxpad_mousevalid(joy_idx); + default: + return 0; + } + + return 0; +} + +static int16_t gx_mouse_state(gx_input_t *gx, unsigned id, uint16_t joy_idx) +{ + int x = 0; + int y = 0; + + settings_t *settings = config_get_ptr(); + int x_scale = settings->uints.input_mouse_scale; + int y_scale = settings->uints.input_mouse_scale; + + x = (gx->mouse[joy_idx].x_abs - gx->mouse[joy_idx].x_last) * x_scale; + y = (gx->mouse[joy_idx].y_abs - gx->mouse[joy_idx].y_last) * y_scale; + + switch (id) + { + case RETRO_DEVICE_ID_MOUSE_X: + return x; + case RETRO_DEVICE_ID_MOUSE_Y: + return y; + case RETRO_DEVICE_ID_MOUSE_LEFT: + return gx->mouse[joy_idx].button & (1 << RETRO_DEVICE_ID_MOUSE_LEFT); + case RETRO_DEVICE_ID_MOUSE_RIGHT: + return gx->mouse[joy_idx].button & (1 << RETRO_DEVICE_ID_MOUSE_RIGHT); + default: + return 0; + } +} + static int16_t gx_input_state(void *data, rarch_joypad_info_t joypad_info, const struct retro_keybind **binds, @@ -96,6 +188,12 @@ static int16_t gx_input_state(void *data, return input_joypad_analog(gx->joypad, joypad_info, port, idx, id, binds[port]); break; + + case RETRO_DEVICE_MOUSE: + return gx_mouse_state(gx, id, joypad_info.joy_idx); + + case RETRO_DEVICE_LIGHTGUN: + return gx_lightgun_state(gx, id, joypad_info.joy_idx); } return 0; @@ -111,9 +209,33 @@ static void gx_input_free_input(void *data) if (gx->joypad) gx->joypad->destroy(); + if(gx->mouse) + free(gx->mouse); + free(gx); } +static inline int gx_count_mouse(gx_input_t *gx) +{ + int count = 0; + + if(gx) + { + for(int i=0; ijoypad->name(i)) + { + if(!strcmp(gx->joypad->name(i), "Wiimote Controller")) + { + count++; + } + } + } + } + + return count; +} + static void *gx_input_init(const char *joypad_driver) { gx_input_t *gx = (gx_input_t*)calloc(1, sizeof(*gx)); @@ -122,22 +244,72 @@ static void *gx_input_init(const char *joypad_driver) gx->joypad = input_joypad_init_driver(joypad_driver, gx); + /* Allocate at least 1 mouse at startup */ + gx->mouse_max = 1; + gx->mouse = (gx_input_mouse_t*) calloc(gx->mouse_max, sizeof(gx_input_mouse_t)); + return gx; } +static void gx_input_poll_mouse(gx_input_t *gx) +{ + int count = 0; + count = gx_count_mouse(gx); + + if(gx && count > 0) + { + if(count != gx->mouse_max) + { + gx_input_mouse_t* tmp = NULL; + + tmp = (gx_input_mouse_t*)realloc(gx->mouse, count * sizeof(gx_input_mouse_t)); + if(!tmp) + { + free(gx->mouse); + } + else + { + gx->mouse = tmp; + gx->mouse_max = count; + + for(int i=0; imouse_max; i++) + { + gx->mouse[i].x_last = 0; + gx->mouse[i].y_last = 0; + } + } + } + + for(unsigned i=0; imouse_max; i++) + { + gx->mouse[i].x_last = gx->mouse[i].x_abs; + gx->mouse[i].y_last = gx->mouse[i].y_abs; + gx_joypad_read_mouse(i, &gx->mouse[i].x_abs, &gx->mouse[i].y_abs, &gx->mouse[i].button); + } + } +} + static void gx_input_poll(void *data) { gx_input_t *gx = (gx_input_t*)data; if (gx && gx->joypad) + { gx->joypad->poll(); + + if(gx->mouse) + gx_input_poll_mouse(gx); + } } static uint64_t gx_input_get_capabilities(void *data) { (void)data; - return (1 << RETRO_DEVICE_JOYPAD) | (1 << RETRO_DEVICE_ANALOG); + return (1 << RETRO_DEVICE_JOYPAD) | + (1 << RETRO_DEVICE_ANALOG) | + (1 << RETRO_DEVICE_MOUSE) | + (1 << RETRO_DEVICE_LIGHTGUN); } static const input_device_driver_t *gx_input_get_joypad_driver(void *data) diff --git a/input/drivers_joypad/gx_joypad.c b/input/drivers_joypad/gx_joypad.c index 5af82e6113..d560b31a32 100644 --- a/input/drivers_joypad/gx_joypad.c +++ b/input/drivers_joypad/gx_joypad.c @@ -29,6 +29,7 @@ #define WPADInit WPAD_Init #define WPADDisconnect WPAD_Disconnect #define WPADProbe WPAD_Probe +#define WPADSetDataFormat WPAD_SetDataFormat #endif #define WPAD_EXP_SICKSAXIS 252 @@ -41,6 +42,12 @@ #define NUM_DEVICES 1 #endif +#ifdef HW_RVL +#define MAX_MOUSEBUTTONS 6 +static const uint32_t gx_mousemask[MAX_MOUSEBUTTONS] = {WPAD_BUTTON_B, WPAD_BUTTON_A, WPAD_BUTTON_1, WPAD_BUTTON_2, + WPAD_BUTTON_PLUS, WPAD_BUTTON_MINUS}; +#endif + enum { GX_GC_A = 0, @@ -102,6 +109,17 @@ static uint32_t pad_type[DEFAULT_MAX_PADS] = { WPAD_EXP_NOCONTROLLER, WPAD_EXP_N static int16_t analog_state[DEFAULT_MAX_PADS][2][2]; static bool g_menu = false; +struct gx_mousedata +{ + int32_t x, y; + uint32_t mouse_button; + bool valid; +}; + +static struct gx_mousedata gx_mouse[2]; + +static bool gx_joypad_query_pad(unsigned pad); + #ifdef HW_RVL static bool g_quit = false; @@ -116,6 +134,45 @@ static void reset_cb(void) g_menu = true; } +static inline void gx_mouse_info(uint32_t joybutton, unsigned port) { + uint8_t i; + ir_t ir; + + /* Get the IR data from the wiimote */ + WPAD_IR(port, &ir); + if (ir.valid) + { + gx_mouse[port].valid = true; + gx_mouse[port].x = ir.x; + gx_mouse[port].y = ir.y; + } + else + { + gx_mouse[port].valid = false; + } + + /* reset button state */ + gx_mouse[port].mouse_button = 0; + for (i = 0; i < MAX_MOUSEBUTTONS; i++) { + gx_mouse[port].mouse_button |= (joybutton & gx_mousemask[i]) ? (1 << i) : 0; + } + + /* Small adjustment to match the RA buttons */ + gx_mouse[port].mouse_button = gx_mouse[port].mouse_button << 2; +} + +bool gxpad_mousevalid(unsigned port) +{ + return gx_mouse[port].valid; +} + +void gx_joypad_read_mouse(unsigned port, int *irx, int *iry, uint32_t *button) +{ + *irx = gx_mouse[port].x; + *iry = gx_mouse[port].y; + *button = gx_mouse[port].mouse_button; +} + static const char *gx_joypad_name(unsigned pad) { switch (pad_type[pad]) @@ -150,6 +207,33 @@ static void handle_hotplug(unsigned port, uint32_t ptype) ); } +static void check_port0_active(uint8_t pad_count) +{ + settings_t *settings = config_get_ptr(); + int idx = settings->uints.input_joypad_map[0]; + + if(pad_count < 2 && idx != 0) + { +#ifdef HW_RVL + pad_type[0] = WPAD_EXP_NONE; +#else + pad_type[0] = WPAD_EXP_GAMECUBE; +#endif + settings->uints.input_joypad_map[0] = 0; + + input_autoconfigure_connect( + gx_joypad_name(0), + NULL, + gx_joypad.ident, + 0, // port + 0, + 0 + ); + + input_config_set_device_name(0, gx_joypad_name(0)); + } +} + static bool gx_joypad_button(unsigned port, uint16_t key) { if (port >= DEFAULT_MAX_PADS) @@ -309,6 +393,7 @@ static int16_t WPAD_StickY(WPADData *data, u8 right) static void gx_joypad_poll(void) { unsigned i, j, port; + uint8_t pad_count = 0; uint8_t gcpad = 0; uint64_t state_p1; uint64_t check_menu_toggle; @@ -381,6 +466,13 @@ static void gx_joypad_poll(void) down = wpaddata->btns_h; + /* Mouse & Lightgun: Retrieve IR data */ + if (ptype == WPAD_EXP_NONE) + { + if (port == WPAD_CHAN_0 || port == WPAD_CHAN_1) + gx_mouse_info(wpaddata->btns_h, port); + } + *state_cur |= (down & WPAD_BUTTON_A) ? (UINT64_C(1) << GX_WIIMOTE_A) : 0; *state_cur |= (down & WPAD_BUTTON_B) ? (UINT64_C(1) << GX_WIIMOTE_B) : 0; *state_cur |= (down & WPAD_BUTTON_1) ? (UINT64_C(1) << GX_WIIMOTE_1) : 0; @@ -389,6 +481,8 @@ static void gx_joypad_poll(void) *state_cur |= (down & WPAD_BUTTON_MINUS) ? (UINT64_C(1) << GX_WIIMOTE_MINUS) : 0; *state_cur |= (down & WPAD_BUTTON_HOME) ? (UINT64_C(1) << GX_WIIMOTE_HOME) : 0; + + if (ptype != WPAD_EXP_NUNCHUK) { /* Rotated d-pad on Wiimote. */ @@ -439,6 +533,14 @@ static void gx_joypad_poll(void) } #endif + /* Count active controllers */ + if(gx_joypad_query_pad(port)) + pad_count++; + + /* Always enable 1 pad in port 0 if there's only 1 controller connected. + * This avoids being stuck in rgui input settings. */ + check_port0_active(pad_count); + if (ptype != pad_type[port]) handle_hotplug(port, ptype); @@ -482,6 +584,9 @@ static bool gx_joypad_init(void *data) PAD_Init(); #ifdef HW_RVL WPADInit(); + /* Set IR for all wiimotes */ + WPAD_SetVRes(WPAD_CHAN_ALL,640,480); + WPAD_SetDataFormat(WPAD_CHAN_ALL,WPAD_FMT_BTNS_ACC_IR); #endif gx_joypad_poll(); diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 6d13938271..4fcf775066 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -567,6 +567,10 @@ MSG_HASH(MENU_ENUM_LABEL_INPUT_ANALOG_DEADZONE, "input_analog_deadzone") MSG_HASH(MENU_ENUM_LABEL_INPUT_ANALOG_SENSITIVITY, "input_analog_sensitivity") +#ifdef GEKKO +MSG_HASH(MENU_ENUM_LABEL_INPUT_MOUSE_SCALE, + "input_mouse_scale") +#endif MSG_HASH(MENU_ENUM_LABEL_INPUT_BIND_MODE, "input_bind_mode") MSG_HASH(MENU_ENUM_LABEL_INPUT_BIND_TIMEOUT, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 481537193a..616e31150e 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -1085,6 +1085,16 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_SENSITIVITY, "Analog Sensitivity" ) +#ifdef GEKKO +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_SCALE, + "Mouse Scale" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_MOUSE_SCALE, + "Adjust x/y scale for Wiimote lightgun speed." + ) +#endif MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_INPUT_SWAP_OK_CANCEL, "Menu Swap OK & Cancel Buttons" diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index f04573e8ee..daa910b278 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -230,6 +230,9 @@ default_sublabel_macro(action_bind_sublabel_audio_volume, MENU_ default_sublabel_macro(action_bind_sublabel_audio_mixer_volume, MENU_ENUM_SUBLABEL_AUDIO_MIXER_VOLUME) #endif default_sublabel_macro(action_bind_sublabel_audio_sync, MENU_ENUM_SUBLABEL_AUDIO_SYNC) +#if defined(GEKKO) +default_sublabel_macro(action_bind_sublabel_input_mouse_scale, MENU_ENUM_SUBLABEL_INPUT_MOUSE_SCALE) +#endif default_sublabel_macro(action_bind_sublabel_axis_threshold, MENU_ENUM_SUBLABEL_INPUT_BUTTON_AXIS_THRESHOLD) default_sublabel_macro(action_bind_sublabel_input_turbo_period, MENU_ENUM_SUBLABEL_INPUT_TURBO_PERIOD) default_sublabel_macro(action_bind_sublabel_input_duty_cycle, MENU_ENUM_SUBLABEL_INPUT_DUTY_CYCLE) @@ -2402,6 +2405,11 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_INPUT_BUTTON_AXIS_THRESHOLD: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_axis_threshold); break; +#if defined(GEKKO) + case MENU_ENUM_LABEL_INPUT_MOUSE_SCALE: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_mouse_scale); + break; +#endif case MENU_ENUM_LABEL_AUDIO_SYNC: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_audio_sync); break; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 79ddeb8921..f47f7cbd4a 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -3768,6 +3768,12 @@ unsigned menu_displaylist_build_list(file_list_t *list, enum menu_displaylist_ct MENU_ENUM_LABEL_INPUT_BUTTON_AXIS_THRESHOLD, PARSE_ONLY_FLOAT, false) == 0) count++; +#if defined(GEKKO) + if (menu_displaylist_parse_settings_enum(list, + MENU_ENUM_LABEL_INPUT_MOUSE_SCALE, + PARSE_ONLY_UINT, false) == 0) + count++; +#endif if (menu_displaylist_parse_settings_enum(list, MENU_ENUM_LABEL_INPUT_ANALOG_DEADZONE, PARSE_ONLY_FLOAT, false) == 0) diff --git a/menu/menu_setting.c b/menu/menu_setting.c index f5364dc2b0..72ea5aa40b 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -10349,6 +10349,21 @@ static bool setting_append_list( menu_settings_list_current_add_range(list, list_info, 0, 2, 1, true, true); SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED); +#ifdef GEKKO + CONFIG_UINT( + list, list_info, + &settings->uints.input_mouse_scale, + MENU_ENUM_LABEL_INPUT_MOUSE_SCALE, + MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_SCALE, + DEFAULT_MOUSE_SCALE, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + menu_settings_list_current_add_range(list, list_info, 1, 4, 1, true, true); +#endif + #ifdef VITA CONFIG_BOOL( list, list_info, diff --git a/msg_hash.h b/msg_hash.h index 4c11a0da26..9c614e0f6f 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -772,6 +772,9 @@ enum msg_hash_enums MENU_LABEL(INPUT_DESCRIPTOR_LABEL_SHOW), MENU_LABEL(INPUT_DESCRIPTOR_HIDE_UNBOUND), MENU_LABEL(INPUT_BUTTON_AXIS_THRESHOLD), +#if defined(GEKKO) + MENU_LABEL(INPUT_MOUSE_SCALE), +#endif MENU_LABEL(INPUT_ANALOG_DEADZONE), MENU_LABEL(INPUT_ANALOG_SENSITIVITY), MENU_LABEL(INPUT_BIND_TIMEOUT), diff --git a/wii/libogc/libs/wii/libbte.a b/wii/libogc/libs/wii/libbte.a index 191c62e51b4a23515eea2785a81a151166b4fa6c..9cc37e149b8ef3713532f949cec6140373fc88df 100644 GIT binary patch delta 274 zcmezIhxNxF)(KJ^W+s+~W(F3f81_nr^nVE@#f{C%EnZo3SGMbx{ zxMc)opo%S#ltHur6>pv;Ga&_L999(y3Z@_{z{Zs|RtV!aj%%t14}KMS3m3r5ut0V> z!bw_NmvBJMz@g&RUJ-V@Di%u}Wrg|*yAcWs#>N&V5MQO8(%{8w+U8Z)OEh6B46y~{ zb}L54IhrsVu_^&+votUOh2wT5ZN?TYLaI%SEWqyD{wb8P1@0RhW?LEnBOYw_p=ibk WWtiDU*c=N?AciJT)oJyNd;$P?D~BQg delta 611 zcmew|kL}Amwh2<~2F8XK#zv+a6~A&RL)nH33I+-w03i(x49v{T6ckL1EzJ}rFO<>T zoWw07C<9e&1XG5rc=Ifo2`L1OGc_N&V5MQO8(%{8w+U8Z)OEmGS*lxwhI7gF!jfMu61_q#L y*{-C`*rG*9wTY1h*nQhSg)+7f@{Of|8N@f+4@EOZC=)Q-#Lxt)I<20OPXGXOK7geF diff --git a/wii/libogc/libs/wii/libogc.a b/wii/libogc/libs/wii/libogc.a index 8d1fd55a9fd701466d96f2b539f08e7c3573f54a..ec000bbe7f4d7ed97e52dbab051752e1fbf7fc53 100644 GIT binary patch delta 3018 zcmai$U1%Le6vx^7v3qxtCZXE2gfvcWVznkIyR)-1v#pBN#+D%c2zg4=($-dspa_D5 z3Po&)ATdU6$*rQ;`dLkcl&elDRHcY5eJD}-B#PDARun<>EsD6gyC>w~>@I{0fgk_* zpELh+W~U~5r^3IslHh?W9I4Kf*X-?z{_%ZEUB_{j{R+V;4P3=(rE_L|ZG7*17fpwi zsx}oGHr39&uq)r5hSoa9x0va~(TV3f(uua2p^ZR@Wxk^tLie?oZhUFo5&J+1N_q9w zQ&wMX`j4+xLMIZ)KrvPC#Ha5YL+i@vvM%%3v{&rWTkkTyC}b!z-(z)UJ=kkpwKJqW z$#``iH+%Fm!g#JJwF8>;8`nx8D6u9{>bXKy=VnQdmfMXTjbJu`W-N%!emiXZQtFKR zkU$GZRhtV9y*hu;*pUOTD6F4)%s9O^<84FtV&&+8uX96V>BzZ({0Pj&;x<4x1XEIkO}YEU{d@9y|DMA6 zCqNY4DSG3j!pPQmECq^C>Q_3)`}EJv#ZOknT}~oBk2_I%uishxr!oEL1y=ksAKyfx zpzp^47qU3N0%$a|p;1prR*%GBfAPdOKqsV4avtpvEmoVQwO|&d^)NTPVY~&7y#Aos zScV2A#n5+E7{fpths?fBa3l)rfs^K?RWTy*>}~kW93762#F22R%79gOo(xyi-!0Y$ z5TGPlx+-qU%`U6Z9&eN++7*8FM@@RQe876tjQgDgGr^OPOLpWW_{ldT|>3?g}AsK=-s|E5S88(^v+`Ki> z3O9u!VSJ@>qMNGRvW~Ta!vvZM6>iJL{deF$>)*rR&_jq9}skR=%$ZLJD*HP zjDC=&YPzNlW);Tw1CsQp$kUGV-fdreE0pd&^7fq&7k^Bx{mpH6Du8`x+=?1U-K)RQLf*RCK*U91Lj2he^{(#mO{vvZrQN{%) Q7sx&vY~d@P6dKI@|6w4R;s5{u delta 3018 zcmai0TWC~A80PHd%$`Y1f|n>Erjt#)CXsXI%*>h9w$#>C3F0N>DMs;9s}w4NAVEPy zLj+0Fl$ES4E!AGtM2M{Ih~Nbg6(1yuPo<^aE0#jhw^)iNd(Matvop)Gu<-Hy-~au$ z85(RI3cqz3*Y~)ODL#{(wV^5cLjr_cH2H~sJ=bN7A(ZntLHWj!1;zdi<4s5p=Dbjq zs#sDyb6{<KK?mCiMnKeRwfJtE^ zv0KD0X6>!gIv`-XbuVKg^cXLUjlvcYtg=>DO0i|aW1Ne{-s!d;Wg7K9FqapqQx&Zu z`H{6cA+;*0#g31y6SED`sY_X8)#g5HY?_{M(NSx((vUo+Ih;o$3&q?YEqALSy2k>S zPY#3l4kpM_19gZdCF<cTsf>#d%{TV9 zi3io`voj1X`#y1_?tM5X{jyRYdIG2aO&TiUQyMoo3)16LVl)j`k7_?sp9Q$o5}obo zqqhy*0U^;25p1TNnJvYt>(fo_=GWt`hJ5wDU73{zDIo}X)Z<|r=7hD?Zd;-c*>TLi zF+&eo^sC+5Z3sz%94@Rm7OtolHQ;C2K%|Voz~iwgPntlgUT%~!Xphmtp8~du;61R# zmVTE3V@9IuC7yf;mO%sB^IaT`_wKdeE;gV8;>O&=ec<223T zs!nIte5!}+sdLT&J!DnZdAcsnQ>`T&0zz5go(ON;!F|rRX+7b)ea@^J6QLWh(t-c} zh|?qweA(!nxuoRV)GwW{SLmbPyzii9Lm@mG(5Mj1hQ04dLgj`QH$Q-5E8?jtr*Lv$ zOLzME00i>wrr!AC+2`;F+3spSacUG!uaK&gn^XK2&T!h0CMNPIc3yzJ@?oTo8P+)9 zJU{ffMa;Yo|CX;yHCQy2aHss*t;s><2@*IvCT6u5+Zgljr JV5-7Sz5-tqdjJ3c diff --git a/wii/libogc/libs/wii/libwiikeyboard.a b/wii/libogc/libs/wii/libwiikeyboard.a index 4a24f7cee413923675faa10662162a37eff4ca5e..6ef17286b27b76651a65339aec525f196991a229 100644 GIT binary patch delta 168 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 Y_GsZH{xKi_m7>!7m;dKRzkKDN0GU%~-2eap delta 8005 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 diff --git a/wii/libogc/wiiuse/wpad.c b/wii/libogc/wiiuse/wpad.c index 639ed79222..1d97f9f520 100644 --- a/wii/libogc/wiiuse/wpad.c +++ b/wii/libogc/wiiuse/wpad.c @@ -1104,3 +1104,41 @@ void WPAD_Accel(int chan, struct vec3w_t *accel) //if(chan<0 || chan>=WPAD_MAX_WIIMOTES || accel==NULL ) return; *accel = wpaddata[chan].accel; } + +s32 WPAD_SetDataFormat(s32 chan, s32 fmt) +{ + u32 level; + s32 ret; + int i; + + if(chan == WPAD_CHAN_ALL) { + for(i=WPAD_CHAN_0; i=WPAD_MAX_WIIMOTES) return WPAD_ERR_BAD_CHANNEL; + + _CPU_ISR_Disable(level); + if(__wpads_inited==WPAD_STATE_DISABLED) { + _CPU_ISR_Restore(level); + return WPAD_ERR_NOT_READY; + } + + if(__wpads[chan]!=NULL) { + switch(fmt) { + case WPAD_FMT_BTNS: + case WPAD_FMT_BTNS_ACC: + case WPAD_FMT_BTNS_ACC_IR: + __wpdcb[chan].data_fmt = fmt; + __wpad_setfmt(chan); + break; + default: + _CPU_ISR_Restore(level); + return WPAD_ERR_BADVALUE; + } + } + _CPU_ISR_Restore(level); + return WPAD_ERR_NONE; +}