diff --git a/tag1/WiiUseJC/wiiuse.c b/tag1/WiiUseJC/wiiuse.c new file mode 100644 index 0000000..23db02f --- /dev/null +++ b/tag1/WiiUseJC/wiiuse.c @@ -0,0 +1,168 @@ +/* + * wiiuse + * + * Written By: + * Michael Laforest < para > + * Email: < thepara (--AT--) g m a i l [--DOT--] com > + * + * Copyright 2006-2007 + * + * This file is part of wiiuse. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * $Header$ + * + */ + +/** + * @file + * @brief API source file + * + * The file must be linked to any third party + * program that is utilizing wiiuse as an + * external library. + */ + +#define WIIUSE_API_SRC + +#include +#include "wiiuse.h" + +#ifdef WIN32 + #define WIN32_LEAN_AND_MEAN + #include +#else + #include +#endif + +typedef int (*entry_func_t)(struct wiiuse_api_t**); + +struct wiiuse_api_t* wiiuse_api = NULL; +void* wiiuse_mod = NULL; + +/** + * @brief Load the wiiuse library and initialize the function pointers. + * + * @param wiiuse_file The relative or absolute path to the wiiuse library file. + * + * @return The version of the wiiuse library loaded. + * + * @see wiiuse_shutdown() + * + * If the version of wiiuse being used has a different API + * version as expected, this function will fail and return 0. + */ +const char* wiiuse_startup(char* wiiuse_file) { + entry_func_t entry_func = NULL; + + if (wiiuse_api) + /* already loaded */ + return wiiuse_api->version; + + if (!wiiuse_file) + return NULL; + + /* load the module */ + wiiuse_mod = dlopen(wiiuse_file, RTLD_NOW); + + if (!wiiuse_mod) + /* can not load module */ + return NULL; + + /* get the entry point */ + entry_func = (entry_func_t)dlsym(wiiuse_mod, "wiiuse_main"); + + if (!entry_func) { + wiiuse_shutdown(); + return NULL; + } + + /* call the entry function */ + entry_func(&wiiuse_api); + + /* make sure the API versions are the same */ + if (wiiuse_api->api_version != WIIUSE_API_VERSION) { + wiiuse_shutdown(); + return NULL; + } + + /* set all the function pointers */ + wiiuse_init = wiiuse_api->_wiiuse_init; + wiiuse_disconnected = wiiuse_api->_wiiuse_disconnected; + wiiuse_rumble = wiiuse_api->_wiiuse_rumble; + wiiuse_toggle_rumble = wiiuse_api->_wiiuse_toggle_rumble; + wiiuse_set_leds = wiiuse_api->_wiiuse_set_leds; + wiiuse_motion_sensing = wiiuse_api->_wiiuse_motion_sensing; + wiiuse_read_data = wiiuse_api->_wiiuse_read_data; + wiiuse_write_data = wiiuse_api->_wiiuse_write_data; + wiiuse_status = wiiuse_api->_wiiuse_status; + wiiuse_get_by_id = wiiuse_api->_wiiuse_get_by_id; + wiiuse_set_flags = wiiuse_api->_wiiuse_set_flags; + wiiuse_set_smooth_alpha = wiiuse_api->_wiiuse_set_smooth_alpha; + wiiuse_set_ir = wiiuse_api->_wiiuse_set_ir; + wiiuse_set_ir_vres = wiiuse_api->_wiiuse_set_ir_vres; + wiiuse_set_ir_position = wiiuse_api->_wiiuse_set_ir_position; + wiiuse_set_aspect_ratio = wiiuse_api->_wiiuse_set_aspect_ratio; + wiiuse_set_bluetooth_stack = wiiuse_api->_wiiuse_set_bluetooth_stack; + wiiuse_set_orient_threshold = wiiuse_api->_wiiuse_set_orient_threshold; + wiiuse_find = wiiuse_api->_wiiuse_find; + wiiuse_connect = wiiuse_api->_wiiuse_connect; + wiiuse_disconnect = wiiuse_api->_wiiuse_disconnect; + wiiuse_poll = wiiuse_api->_wiiuse_poll; + + printf("wiiuse v%s loaded ( http://wiiuse.net http://wiiuse.sf.net/ ).\n", wiiuse_api->version); + + return wiiuse_api->version; +} + + +/** + * @brief Unload the library. + * + * @see wiiuse_startup() + */ +void wiiuse_shutdown() { + if (!wiiuse_mod) + return; + + /* unload the module */ + dlclose(wiiuse_mod); + + wiiuse_api = NULL; + + wiiuse_init = NULL; + wiiuse_disconnected = NULL; + wiiuse_rumble = NULL; + wiiuse_toggle_rumble = NULL; + wiiuse_set_leds = NULL; + wiiuse_motion_sensing = NULL; + wiiuse_read_data = NULL; + wiiuse_write_data = NULL; + wiiuse_status = NULL; + wiiuse_get_by_id = NULL; + wiiuse_set_flags = NULL; + wiiuse_set_smooth_alpha = NULL; + wiiuse_set_ir = NULL; + wiiuse_set_ir_vres = NULL; + wiiuse_set_ir_position = NULL; + wiiuse_set_aspect_ratio = NULL; + wiiuse_set_bluetooth_stack = NULL; + wiiuse_set_orient_threshold = NULL; + wiiuse_find = NULL; + wiiuse_connect = NULL; + wiiuse_disconnect = NULL; + wiiuse_poll = NULL; + +}