diff --git a/Externals/WiiUse/Inc/wiiuse.h b/Externals/WiiUse/Inc/wiiuse.h
index 2d7e5b0924..7528de9eed 100644
--- a/Externals/WiiUse/Inc/wiiuse.h
+++ b/Externals/WiiUse/Inc/wiiuse.h
@@ -60,115 +60,7 @@
#define WIIMOTE_LED_3 0x40
#define WIIMOTE_LED_4 0x80
-/* button codes */
-#define WIIMOTE_BUTTON_TWO 0x0001
-#define WIIMOTE_BUTTON_ONE 0x0002
-#define WIIMOTE_BUTTON_B 0x0004
-#define WIIMOTE_BUTTON_A 0x0008
-#define WIIMOTE_BUTTON_MINUS 0x0010
-#define WIIMOTE_BUTTON_ZACCEL_BIT6 0x0020
-#define WIIMOTE_BUTTON_ZACCEL_BIT7 0x0040
-#define WIIMOTE_BUTTON_HOME 0x0080
-#define WIIMOTE_BUTTON_LEFT 0x0100
-#define WIIMOTE_BUTTON_RIGHT 0x0200
-#define WIIMOTE_BUTTON_DOWN 0x0400
-#define WIIMOTE_BUTTON_UP 0x0800
-#define WIIMOTE_BUTTON_PLUS 0x1000
-#define WIIMOTE_BUTTON_ZACCEL_BIT4 0x2000
-#define WIIMOTE_BUTTON_ZACCEL_BIT5 0x4000
-#define WIIMOTE_BUTTON_UNKNOWN 0x8000
-#define WIIMOTE_BUTTON_ALL 0x1F9F
-/* nunchul button codes */
-#define NUNCHUK_BUTTON_Z 0x01
-#define NUNCHUK_BUTTON_C 0x02
-#define NUNCHUK_BUTTON_ALL 0x03
-
-/* classic controller button codes */
-#define CLASSIC_CTRL_BUTTON_UP 0x0001
-#define CLASSIC_CTRL_BUTTON_LEFT 0x0002
-#define CLASSIC_CTRL_BUTTON_ZR 0x0004
-#define CLASSIC_CTRL_BUTTON_X 0x0008
-#define CLASSIC_CTRL_BUTTON_A 0x0010
-#define CLASSIC_CTRL_BUTTON_Y 0x0020
-#define CLASSIC_CTRL_BUTTON_B 0x0040
-#define CLASSIC_CTRL_BUTTON_ZL 0x0080
-#define CLASSIC_CTRL_BUTTON_FULL_R 0x0200
-#define CLASSIC_CTRL_BUTTON_PLUS 0x0400
-#define CLASSIC_CTRL_BUTTON_HOME 0x0800
-#define CLASSIC_CTRL_BUTTON_MINUS 0x1000
-#define CLASSIC_CTRL_BUTTON_FULL_L 0x2000
-#define CLASSIC_CTRL_BUTTON_DOWN 0x4000
-#define CLASSIC_CTRL_BUTTON_RIGHT 0x8000
-#define CLASSIC_CTRL_BUTTON_ALL 0xFEFF
-
-/* guitar hero 3 button codes */
-#define GUITAR_HERO_3_BUTTON_STRUM_UP 0x0001
-#define GUITAR_HERO_3_BUTTON_YELLOW 0x0008
-#define GUITAR_HERO_3_BUTTON_GREEN 0x0010
-#define GUITAR_HERO_3_BUTTON_BLUE 0x0020
-#define GUITAR_HERO_3_BUTTON_RED 0x0040
-#define GUITAR_HERO_3_BUTTON_ORANGE 0x0080
-#define GUITAR_HERO_3_BUTTON_PLUS 0x0400
-#define GUITAR_HERO_3_BUTTON_MINUS 0x1000
-#define GUITAR_HERO_3_BUTTON_STRUM_DOWN 0x4000
-#define GUITAR_HERO_3_BUTTON_ALL 0xFEFF
-
-
-/* wiimote option flags */
-#define WIIUSE_SMOOTHING 0x01
-#define WIIUSE_CONTINUOUS 0x02
-#define WIIUSE_ORIENT_THRESH 0x04
-#define WIIUSE_INIT_FLAGS (WIIUSE_SMOOTHING | WIIUSE_ORIENT_THRESH)
-
-#define WIIUSE_ORIENT_PRECISION 100.0f
-
-/* expansion codes */
-#define EXP_NONE 0
-#define EXP_NUNCHUK 1
-#define EXP_CLASSIC 2
-#define EXP_GUITAR_HERO_3 3
-
-/* IR correction types */
-typedef enum ir_position_t {
- WIIUSE_IR_ABOVE,
- WIIUSE_IR_BELOW
-} ir_position_t;
-
-/**
- * @brief Check if a button is pressed.
- * @param dev Pointer to a wiimote_t or expansion structure.
- * @param button The button you are interested in.
- * @return 1 if the button is pressed, 0 if not.
- */
-#define IS_PRESSED(dev, button) ((dev->btns & button) == button)
-
-/**
- * @brief Check if a button is being held.
- * @param dev Pointer to a wiimote_t or expansion structure.
- * @param button The button you are interested in.
- * @return 1 if the button is held, 0 if not.
- */
-#define IS_HELD(dev, button) ((dev->btns_held & button) == button)
-
-/**
- * @brief Check if a button is released on this event. \n\n
- * This does not mean the button is not pressed, it means \n
- * this button was just now released.
- * @param dev Pointer to a wiimote_t or expansion structure.
- * @param button The button you are interested in.
- * @return 1 if the button is released, 0 if not.
- *
- */
-#define IS_RELEASED(dev, button) ((dev->btns_released & button) == button)
-
-/**
- * @brief Check if a button has just been pressed this event.
- * @param dev Pointer to a wiimote_t or expansion structure.
- * @param button The button you are interested in.
- * @return 1 if the button is pressed, 0 if not.
- */
-#define IS_JUST_PRESSED(dev, button) (IS_PRESSED(dev, button) && !IS_HELD(dev, button))
/**
* @brief Return the IR sensitivity level.
@@ -186,10 +78,6 @@ typedef enum ir_position_t {
else *lvl = 0; \
} while (0)
-#define WIIUSE_USING_ACC(wm) ((wm->state & 0x020) == 0x020)
-#define WIIUSE_USING_EXP(wm) ((wm->state & 0x040) == 0x040)
-#define WIIUSE_USING_IR(wm) ((wm->state & 0x080) == 0x080)
-#define WIIUSE_USING_SPEAKER(wm) ((wm->state & 0x100) == 0x100)
#define WIIUSE_IS_LED_SET(wm, num) ((wm->leds & WIIMOTE_LED_##num) == WIIMOTE_LED_##num)
@@ -204,7 +92,7 @@ typedef enum ir_position_t {
* be a useful feature to keep so it wasn't removed.
*/
#ifdef WIN32
- #define WIIMOTE_DEFAULT_TIMEOUT 10
+ #define WIIMOTE_DEFAULT_TIMEOUT 30
#define WIIMOTE_EXP_TIMEOUT 10
#endif
@@ -212,9 +100,7 @@ typedef unsigned char byte;
typedef char sbyte;
struct wiimote_t;
-struct vec3b_t;
-struct orient_t;
-struct gforce_t;
+
/**
@@ -538,41 +424,19 @@ typedef struct wiimote_t {
WCONST int out_sock; /**< output socket */
WCONST int in_sock; /**< input socket */
#else
+ WCONST char devicepath[255]; /**< reference for removing/adding new wiimotes to wiimote_t */
WCONST HANDLE dev_handle; /**< HID handle */
WCONST OVERLAPPED hid_overlap; /**< overlap handle */
WCONST enum win_bt_stack_t stack; /**< type of bluetooth stack to use */
WCONST int timeout; /**< read timeout */
- WCONST byte normal_timeout; /**< normal timeout */
- WCONST byte exp_timeout; /**< timeout for expansion handshake */
#endif
WCONST int state; /**< various state flags */
WCONST byte leds; /**< currently lit leds */
- WCONST float battery_level; /**< battery level */
-
WCONST int flags; /**< options flag */
-
WCONST byte handshake_state; /**< the state of the connection handshake */
WCONST struct read_req_t* read_req; /**< list of data read requests */
- WCONST struct accel_t accel_calib; /**< wiimote accelerometer calibration */
- WCONST struct expansion_t expansion; /**< wiimote expansion device */
-
- WCONST struct vec3b_t accel; /**< current raw acceleration data */
- WCONST struct orient_t orient; /**< current orientation on each axis */
- WCONST struct gforce_t gforce; /**< current gravity forces on each axis */
-
- WCONST struct ir_t ir; /**< IR data */
-
- WCONST unsigned short btns; /**< what buttons have just been pressed */
- WCONST unsigned short btns_held; /**< what buttons are being held down */
- WCONST unsigned short btns_released; /**< what buttons were just released this */
-
- WCONST float orient_threshold; /**< threshold for orient to generate an event */
- WCONST int accel_threshold; /**< threshold for accel to generate an event */
-
- WCONST struct wiimote_state_t lstate; /**< last saved state */
-
WCONST WIIUSE_EVENT_TYPE event; /**< type of event that occured */
WCONST byte event_buf[MAX_PAYLOAD]; /**< event buffer */
} wiimote;
@@ -611,14 +475,17 @@ WIIUSE_EXPORT extern void wiiuse_cleanup(struct wiimote_t** wm, int wiimotes);
WIIUSE_EXPORT extern void wiiuse_rumble(struct wiimote_t* wm, int status);
WIIUSE_EXPORT extern void wiiuse_toggle_rumble(struct wiimote_t* wm);
WIIUSE_EXPORT extern void wiiuse_set_leds(struct wiimote_t* wm, int leds);
-WIIUSE_EXPORT extern int wiiuse_read_data(struct wiimote_t* wm, byte* buffer, unsigned int offset, unsigned short len);
WIIUSE_EXPORT extern int wiiuse_write_data(struct wiimote_t* wm, unsigned int addr, byte* data, byte len);
WIIUSE_EXPORT extern int wiiuse_set_flags(struct wiimote_t* wm, int enable, int disable);
-WIIUSE_EXPORT extern void wiiuse_set_timeout(struct wiimote_t** wm, int wiimotes, byte normal_timeout, byte exp_timeout);
+WIIUSE_EXPORT extern void wiiuse_set_timeout(struct wiimote_t** wm, int wiimotes, byte timeout);
/* connect.c */
+#ifdef _WIN32
+WIIUSE_EXPORT extern int wiiuse_find(struct wiimote_t** wm, int max_wiimotes, int wiimotes);
+#else
WIIUSE_EXPORT extern int wiiuse_find(struct wiimote_t** wm, int max_wiimotes, int timeout);
+#endif
WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_t** wm, int wiimotes);
WIIUSE_EXPORT extern void wiiuse_disconnect(struct wiimote_t* wm);
#ifdef WIN32
@@ -627,8 +494,6 @@ WIIUSE_EXPORT extern int wiiuse_register_system_notification(HWND hwnd);
#endif
/* ir.c */
-WIIUSE_EXPORT extern void wiiuse_set_ir_position(struct wiimote_t* wm, enum ir_position_t pos);
-WIIUSE_EXPORT extern void wiiuse_set_aspect_ratio(struct wiimote_t* wm, enum aspect_t aspect);
WIIUSE_EXPORT extern void wiiuse_set_ir_sensitivity(struct wiimote_t* wm, int level);
/* io.c */
diff --git a/Externals/WiiUse/Win32/wiiuse.dll b/Externals/WiiUse/Win32/wiiuse.dll
index a708d495c0..17f986a96b 100644
Binary files a/Externals/WiiUse/Win32/wiiuse.dll and b/Externals/WiiUse/Win32/wiiuse.dll differ
diff --git a/Externals/WiiUse/Win32/wiiuse.lib b/Externals/WiiUse/Win32/wiiuse.lib
index 8c9a6da971..e95b66f02f 100644
Binary files a/Externals/WiiUse/Win32/wiiuse.lib and b/Externals/WiiUse/Win32/wiiuse.lib differ
diff --git a/Externals/WiiUse/X64/wiiuse.dll b/Externals/WiiUse/X64/wiiuse.dll
index 2febe627ce..34027e5fd0 100644
Binary files a/Externals/WiiUse/X64/wiiuse.dll and b/Externals/WiiUse/X64/wiiuse.dll differ
diff --git a/Externals/WiiUse/X64/wiiuse.lib b/Externals/WiiUse/X64/wiiuse.lib
index bb4392d16a..d9a56a8925 100644
Binary files a/Externals/WiiUse/X64/wiiuse.lib and b/Externals/WiiUse/X64/wiiuse.lib differ
diff --git a/Externals/WiiUseSrc/Src/Makefile b/Externals/WiiUseSrc/Src/Makefile
index 4d56436aac..ff4d129bd5 100644
--- a/Externals/WiiUseSrc/Src/Makefile
+++ b/Externals/WiiUseSrc/Src/Makefile
@@ -48,7 +48,6 @@ INCLUDES = -I.
# Generate a list of object files
#
OBJS = \
- $(OBJ_DIR)/io.o \
$(OBJ_DIR)/io_nix.o \
$(OBJ_DIR)/ir.o \
$(OBJ_DIR)/wiiuse.o
diff --git a/Externals/WiiUseSrc/Src/SConscript b/Externals/WiiUseSrc/Src/SConscript
index d04821ac9c..45935b40cf 100644
--- a/Externals/WiiUseSrc/Src/SConscript
+++ b/Externals/WiiUseSrc/Src/SConscript
@@ -13,7 +13,6 @@ if (sys.platform == 'linux2' and not env['HAVE_BLUEZ']) or \
env['HAVE_WIIUSE'] = 1
files = [
- "io.c",
"ir.c",
"wiiuse.c",
]
diff --git a/Externals/WiiUseSrc/Src/definitions.h b/Externals/WiiUseSrc/Src/definitions.h
index b34a67117f..0e0c1c3cfb 100644
--- a/Externals/WiiUseSrc/Src/definitions.h
+++ b/Externals/WiiUseSrc/Src/definitions.h
@@ -34,7 +34,7 @@
#ifndef DEFINITIONS_H_INCLUDED
#define DEFINITIONS_H_INCLUDED
-#if 1 // Use Dolphin logging
+#if 0 // Use Dolphin logging
#include "Log.h"
// NOTICE_LEVEL is more appropriate for the uses of WIIUSE_INFO than INFO_LEVEL
@@ -77,17 +77,10 @@
#endif // Use Dolphin logging
-#define WIIMOTE_PI 3.14159265f
-
-/* Convert between radians and degrees */
-#define RAD_TO_DEGREE(r) ((r * 180.0f) / WIIMOTE_PI)
-#define DEGREE_TO_RAD(d) (d * (WIIMOTE_PI / 180.0f))
/* Convert to big endian */
#define BIG_ENDIAN_LONG(i) (htonl(i))
#define BIG_ENDIAN_SHORT(i) (htons(i))
-#define absf(x) ((x >= 0) ? (x) : (x * -1.0f))
-#define diff_f(x, y) ((x >= y) ? (absf(x - y)) : (absf(y - x)))
#endif // DEFINITIONS_H_INCLUDED
diff --git a/Externals/WiiUseSrc/Src/io.c b/Externals/WiiUseSrc/Src/io.c
deleted file mode 100644
index 3f3c3f4aa6..0000000000
--- a/Externals/WiiUseSrc/Src/io.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * 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 Handles device I/O (non-OS specific).
- */
-
-#include
-#include
-
-#include "definitions.h"
-#include "wiiuse_internal.h"
-#include "io.h"
-
-
- /**
- * @brief Get initialization data from the wiimote.
- *
- * @param wm Pointer to a wiimote_t structure.
- * @param data unused
- * @param len unused
- *
- * When first called for a wiimote_t structure, a request
- * is sent to the wiimote for initialization information.
- * This includes factory set accelerometer data.
- * The handshake will be concluded when the wiimote responds
- * with this data.
- */
-void wiiuse_handshake(struct wiimote_t* wm, byte* data, unsigned short len) {
- if (!wm) return;
-
- switch (wm->handshake_state) {
- case 0:
- {
- /* send request to wiimote for accelerometer calibration */
- byte* buf;
-
- WIIMOTE_ENABLE_STATE(wm, WIIMOTE_STATE_HANDSHAKE);
- wiiuse_set_leds(wm, WIIMOTE_LED_NONE);
-
- buf = (byte*)malloc(sizeof(byte) * 8);
- wiiuse_read_data_cb(wm, wiiuse_handshake, buf, WM_MEM_OFFSET_CALIBRATION, 7);
- wm->handshake_state++;
-
- wiiuse_set_leds(wm, WIIMOTE_LED_NONE);
-
- break;
- }
- case 1:
- {
- struct read_req_t* req = wm->read_req;
- struct accel_t* accel = &wm->accel_calib;
-
- /* received read data */
- accel->cal_zero.x = req->buf[0];
- accel->cal_zero.y = req->buf[1];
- accel->cal_zero.z = req->buf[2];
-
- accel->cal_g.x = req->buf[4] - accel->cal_zero.x;
- accel->cal_g.y = req->buf[5] - accel->cal_zero.y;
- accel->cal_g.z = req->buf[6] - accel->cal_zero.z;
-
- /* done with the buffer */
- free(req->buf);
-
- /* handshake is done */
- WIIUSE_DEBUG("Handshake finished. Calibration: Idle: X=%x Y=%x Z=%x\t+1g: X=%x Y=%x Z=%x",
- accel->cal_zero.x, accel->cal_zero.y, accel->cal_zero.z,
- accel->cal_g.x, accel->cal_g.y, accel->cal_g.z);
-
-
- WIIMOTE_DISABLE_STATE(wm, WIIMOTE_STATE_HANDSHAKE);
- WIIMOTE_ENABLE_STATE(wm, WIIMOTE_STATE_HANDSHAKE_COMPLETE);
- wm->handshake_state++;
-
- break;
- }
- default:
- {
- break;
- }
- }
-}
diff --git a/Externals/WiiUseSrc/Src/io_win.c b/Externals/WiiUseSrc/Src/io_win.c
index 52a529e6d3..82e3ea8620 100644
--- a/Externals/WiiUseSrc/Src/io_win.c
+++ b/Externals/WiiUseSrc/Src/io_win.c
@@ -46,49 +46,64 @@
#include "io.h"
-int wiiuse_find(struct wiimote_t** wm, int max_wiimotes, int timeout) {
+int wiiuse_find(struct wiimote_t** wm, int max_wiimotes, int wiimotes) {
GUID device_id;
HANDLE dev;
HDEVINFO device_info;
- int i, index;
+ int i, x, found, index, udisc = 0;
DWORD len;
SP_DEVICE_INTERFACE_DATA device_data;
PSP_DEVICE_INTERFACE_DETAIL_DATA detail_data = NULL;
HIDD_ATTRIBUTES attr;
- int found = 0;
- (void) timeout; // unused
+
+ // todo: handle/remove (unexpected and forced) disconnected wiimotes here
+
+ // removal of unneeded wiimotes and exiting when we got enough wiimotes connected
+ if(wiiuse_remove(wm, wiimotes, max_wiimotes))
+ return wm;
device_data.cbSize = sizeof(device_data);
- index = 0;
- /* get the device id */
+ // get the device id
HidD_GetHidGuid(&device_id);
- /* get all hid devices connected */
+ // get all hid devices connected
device_info = SetupDiGetClassDevs(&device_id, NULL, NULL, (DIGCF_DEVICEINTERFACE | DIGCF_PRESENT));
- for (;; ++index) {
+ for (;wiimotes < max_wiimotes; ++index) {
if (detail_data) {
free(detail_data);
detail_data = NULL;
}
+ found = 0;
- /* query the next hid device info */
+ // query the next hid device info
if (!SetupDiEnumDeviceInterfaces(device_info, NULL, &device_id, index, &device_data))
break;
- /* get the size of the data block required */
+ // get the size of the data block required
i = SetupDiGetDeviceInterfaceDetail(device_info, &device_data, NULL, 0, &len, NULL);
detail_data = malloc(len);
detail_data->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
- /* query the data for this device */
+ // query the data for this device
if (!SetupDiGetDeviceInterfaceDetail(device_info, &device_data, detail_data, len, NULL, NULL))
continue;
+
+ // Wiimote already added
+ for(x = 0; x < wiimotes; x++)
+ {
+ if(memcmp(wm[x]->devicepath,detail_data->DevicePath,197) == 0) {
+ found = 1;
+ break;
+ }
+ }
+ if (found)
+ continue;
- /* open the device */
+ // open new device
dev = CreateFile(detail_data->DevicePath,
(GENERIC_READ | GENERIC_WRITE),
(FILE_SHARE_READ | FILE_SHARE_WRITE),
@@ -96,40 +111,43 @@ int wiiuse_find(struct wiimote_t** wm, int max_wiimotes, int timeout) {
if (dev == INVALID_HANDLE_VALUE)
continue;
- /* get device attributes */
+
+
+ // get device attributes
attr.Size = sizeof(attr);
i = HidD_GetAttributes(dev, &attr);
if ((attr.VendorID == WM_VENDOR_ID) && (attr.ProductID == WM_PRODUCT_ID)) {
- /* this is a wiimote */
- wm[found]->dev_handle = dev;
- wm[found]->hid_overlap.hEvent = CreateEvent(NULL, 1, 1, L"");
- wm[found]->hid_overlap.Offset = 0;
- wm[found]->hid_overlap.OffsetHigh = 0;
- WIIMOTE_ENABLE_STATE(wm[found], WIIMOTE_STATE_DEV_FOUND);
- WIIMOTE_ENABLE_STATE(wm[found], WIIMOTE_STATE_CONNECTED);
+ //this is a wiimote
+ wm[wiimotes]->dev_handle = dev;
- /* try to set the output report to see if the device is actually connected */
- if (!wiiuse_set_report_type(wm[found])) {
- Sleep(10);
- WIIMOTE_DISABLE_STATE(wm[found], WIIMOTE_STATE_CONNECTED);
- if (wm[found]->event == WIIUSE_UNEXPECTED_DISCONNECT)
- break;
+ wm[wiimotes]->hid_overlap.hEvent = CreateEvent(NULL, 1, 1, L"");
+ wm[wiimotes]->hid_overlap.Offset = 0;
+ wm[wiimotes]->hid_overlap.OffsetHigh = 0;
+
+ WIIMOTE_ENABLE_STATE(wm[wiimotes], WIIMOTE_STATE_DEV_FOUND);
+ WIIMOTE_ENABLE_STATE(wm[wiimotes], WIIMOTE_STATE_CONNECTED);
+ WIIMOTE_ENABLE_STATE(wm[wiimotes], WIIUSE_CONTINUOUS);
+ // try to set the output report to see if the device is actually connected
+
+ if (!wiiuse_set_report_type(wm[wiimotes])) {
+ WIIMOTE_DISABLE_STATE(wm[wiimotes], WIIMOTE_STATE_CONNECTED);
+ if (wm[wiimotes]->event == WIIUSE_UNEXPECTED_DISCONNECT)
+ {
+ wiiuse_disconnect(wm[wiimotes]);
+ memset(wm[wiimotes],0,sizeof(wm[wiimotes]));
+ }
continue;
- }
+ }
- /* do the handshake * shouldn't be needed as well, I'm gonna leave first it tho*/
- wiiuse_handshake(wm[found], NULL, 0);
+ memcpy(wm[wiimotes]->devicepath,detail_data->DevicePath,197);
+ WIIUSE_INFO("Connected to wiimote [id %i].", wm[wiimotes]->unid);
+ ++wiimotes;
- WIIUSE_INFO("Connected to wiimote [id %i].", wm[found]->unid);
-
- ++found;
- if (found >= max_wiimotes)
- break;
} else {
- /* not a wiimote */
+ // not a wiimote
CloseHandle(dev);
}
}
@@ -139,15 +157,23 @@ int wiiuse_find(struct wiimote_t** wm, int max_wiimotes, int timeout) {
SetupDiDestroyDeviceInfoList(device_info);
- return found;
+ return wiimotes;
}
-int wiiuse_connect(struct wiimote_t** wm, int wiimotes) {
- int connected = 0;
- int i = 0;
- for (; i < wiimotes; ++i) {
+
+
+
+
+
+
+
+
+
+int wiiuse_connect(struct wiimote_t** wm, int wiimotes) {
+ int i,connected=0;
+ for (i = 0; i < wiimotes; ++i) {
if (WIIMOTE_IS_SET(wm[i], WIIMOTE_STATE_CONNECTED))
++connected;
}
@@ -317,7 +343,6 @@ int wiiuse_check_system_notification(unsigned int nMsg, WPARAM wParam, LPARAM lP
else { //different method to acquire the "wiimote vid/pid" for a comparison when the device is already unavailable @CreateFile()
wcstombs(stringbuf, pDeviceInfo->dbcc_name, 255);
-
//ms bt stack + bluesoleil vid/pid dbccname format
if ( (strstr(stringbuf, "VID&0002057e_PID&0306") != NULL) || (strstr(stringbuf, "VID_057e&PID_0306") != NULL) )
{
@@ -348,4 +373,31 @@ int wiiuse_register_system_notification(HWND hwnd) {
return RegisterDeviceNotification(hwnd,&Filter, DEVICE_NOTIFY_ALL_INTERFACE_CLASSES);
}
+
+
+
+
+int wiiuse_remove(struct wiimote_t** wm, int wiimotes, int max_wiimotes) {
+ int i = 0;
+ WIIUSE_INFO("Remove Wiimotes, WM: %i MAX_WM: %i",wiimotes, max_wiimotes);
+
+ //No cleanup needed, less wiimotes available than needed
+ if (wiimotes <= max_wiimotes)
+ return 0;
+ else if (!wm)
+ return 0;
+
+ for (i = max_wiimotes; i < wiimotes; i++) {
+ if(wm[i]) {
+ wiiuse_disconnect(wm[i]);
+ wm[i]->state = WIIMOTE_INIT_STATES;
+ wm[i]->flags = WIIUSE_INIT_FLAGS;
+ wm[i]->event = WIIUSE_NONE;
+ }
+ }
+ return i;
+
+}
+
+
#endif /* ifdef WIN32 */
diff --git a/Externals/WiiUseSrc/Src/ir.c b/Externals/WiiUseSrc/Src/ir.c
index 8f87f360eb..2e815ae74b 100644
--- a/Externals/WiiUseSrc/Src/ir.c
+++ b/Externals/WiiUseSrc/Src/ir.c
@@ -81,69 +81,6 @@ static int get_ir_sens(struct wiimote_t* wm, const char** block1, const char** b
}
-
-/**
- * @brief Set the XY position for the IR cursor.
- *
- * @param wm Pointer to a wiimote_t structure.
- */
-void wiiuse_set_ir_position(struct wiimote_t* wm, enum ir_position_t pos) {
- if (!wm) return;
-
- wm->ir.pos = pos;
-
- switch (pos) {
-
- case WIIUSE_IR_ABOVE:
- wm->ir.offset[0] = 0;
-
- if (wm->ir.aspect == WIIUSE_ASPECT_16_9)
- wm->ir.offset[1] = WM_ASPECT_16_9_Y/2 - 70;
- else if (wm->ir.aspect == WIIUSE_ASPECT_4_3)
- wm->ir.offset[1] = WM_ASPECT_4_3_Y/2 - 100;
-
- return;
-
- case WIIUSE_IR_BELOW:
- wm->ir.offset[0] = 0;
-
- if (wm->ir.aspect == WIIUSE_ASPECT_16_9)
- wm->ir.offset[1] = -WM_ASPECT_16_9_Y/2 + 100;
- else if (wm->ir.aspect == WIIUSE_ASPECT_4_3)
- wm->ir.offset[1] = -WM_ASPECT_4_3_Y/2 + 70;
-
- return;
-
- default:
- return;
- };
-}
-
-
-/**
- * @brief Set the aspect ratio of the TV/monitor.
- *
- * @param wm Pointer to a wiimote_t structure.
- * @param aspect Either WIIUSE_ASPECT_16_9 or WIIUSE_ASPECT_4_3
- */
-void wiiuse_set_aspect_ratio(struct wiimote_t* wm, enum aspect_t aspect) {
- if (!wm) return;
-
- wm->ir.aspect = aspect;
-
- if (aspect == WIIUSE_ASPECT_4_3) {
- wm->ir.vres[0] = WM_ASPECT_4_3_X;
- wm->ir.vres[1] = WM_ASPECT_4_3_Y;
- } else {
- wm->ir.vres[0] = WM_ASPECT_16_9_X;
- wm->ir.vres[1] = WM_ASPECT_16_9_Y;
- }
-
- /* reset the position offsets */
- wiiuse_set_ir_position(wm, wm->ir.pos);
-}
-
-
/**
* @brief Set the IR sensitivity.
*
diff --git a/Externals/WiiUseSrc/Src/os.h b/Externals/WiiUseSrc/Src/os.h
index 79d4ce6edf..9fd808225d 100644
--- a/Externals/WiiUseSrc/Src/os.h
+++ b/Externals/WiiUseSrc/Src/os.h
@@ -41,8 +41,7 @@
#ifdef WIN32
/* windows */
- #define isnan(x) _isnan(x)
- #define isinf(x) !_finite(x)
+
/* disable warnings I don't care about */
#pragma warning(disable:4244) /* possible loss of data conversion */
diff --git a/Externals/WiiUseSrc/Src/wiiuse.c b/Externals/WiiUseSrc/Src/wiiuse.c
index 5e56541137..6f9c701e0a 100644
--- a/Externals/WiiUseSrc/Src/wiiuse.c
+++ b/Externals/WiiUseSrc/Src/wiiuse.c
@@ -131,24 +131,10 @@ struct wiimote_t** wiiuse_init(int wiimotes) {
wm[i]->stack = WIIUSE_STACK_UNKNOWN;
#endif
- wm[i]->normal_timeout = WIIMOTE_DEFAULT_TIMEOUT;
- wm[i]->exp_timeout = WIIMOTE_EXP_TIMEOUT;
- wm[i]->timeout = wm[i]->normal_timeout;
-
+ wm[i]->timeout = WIIMOTE_DEFAULT_TIMEOUT;
wm[i]->state = WIIMOTE_INIT_STATES;
wm[i]->flags = WIIUSE_INIT_FLAGS;
-
wm[i]->event = WIIUSE_NONE;
-
- wm[i]->expansion.type = EXP_NONE;
-
- wiiuse_set_aspect_ratio(wm[i], WIIUSE_ASPECT_4_3);
- wiiuse_set_ir_position(wm[i], WIIUSE_IR_ABOVE);
-
- wm[i]->orient_threshold = 0.5f;
- wm[i]->accel_threshold = 5;
-
- wm[i]->accel_calib.st_alpha = WIIUSE_DEFAULT_SMOOTH_ALPHA;
}
return wm;
@@ -172,10 +158,6 @@ void wiiuse_disconnected(struct wiimote_t* wm) {
wm->leds = 0;
wm->state = WIIMOTE_INIT_STATES;
wm->read_req = NULL;
- wm->handshake_state = 0;
- wm->btns = 0;
- wm->btns_held = 0;
- wm->btns_released = 0;
memset(wm->event_buf, 0, sizeof(wm->event_buf));
#ifdef __linux__
@@ -267,7 +249,6 @@ int wiiuse_set_report_type(struct wiimote_t* wm) {
return 0;
buf[0] = (WIIMOTE_IS_FLAG_SET(wm, WIIUSE_CONTINUOUS) ? 0x04 : 0x00); /* set to 0x04 for continuous reporting */
- buf[1] = 0x00;
/* if rumble is enabled, make sure we keep it */
if (WIIMOTE_IS_SET(wm, WIIMOTE_STATE_RUMBLE))
@@ -277,14 +258,8 @@ int wiiuse_set_report_type(struct wiimote_t* wm) {
expansion = WIIMOTE_IS_SET(wm, WIIMOTE_STATE_EXP);
ir = WIIMOTE_IS_SET(wm, WIIMOTE_STATE_IR);
- if (motion && ir && expansion) buf[1] = WM_RPT_BTN_ACC_IR_EXP;
- else if (motion && expansion) buf[1] = WM_RPT_BTN_ACC_EXP;
- else if (motion && ir) buf[1] = WM_RPT_BTN_ACC_IR;
- else if (ir && expansion) buf[1] = WM_RPT_BTN_IR_EXP;
- else if (ir) buf[1] = WM_RPT_BTN_ACC_IR;
- else if (expansion) buf[1] = WM_RPT_BTN_EXP;
- else if (motion) buf[1] = WM_RPT_BTN_ACC;
- else buf[1] = WM_RPT_BTN;
+ buf[1] = 0x30;
+
WIIUSE_DEBUG("Setting report type: 0x%x", buf[1]);
@@ -296,97 +271,6 @@ int wiiuse_set_report_type(struct wiimote_t* wm) {
}
-/**
- * @brief Read data from the wiimote (callback version).
- *
- * @param wm Pointer to a wiimote_t structure.
- * @param read_cb Function pointer to call when the data arrives from the wiimote.
- * @param buffer An allocated buffer to store the data as it arrives from the wiimote.
- * Must be persistent in memory and large enough to hold the data.
- * @param addr The address of wiimote memory to read from.
- * @param len The length of the block to be read.
- *
- * The library can only handle one data read request at a time
- * because it must keep track of the buffer and other
- * events that are specific to that request. So if a request
- * has already been made, subsequent requests will be added
- * to a pending list and be sent out when the previous
- * finishes.
- */
-int wiiuse_read_data_cb(struct wiimote_t* wm, wiiuse_read_cb read_cb, byte* buffer, unsigned int addr, unsigned short len) {
- struct read_req_t* req;
-
- if (!wm || !WIIMOTE_IS_CONNECTED(wm))
- return 0;
- if (!buffer || !len || !read_cb)
- return 0;
-
- /* make this request structure */
- req = (struct read_req_t*)malloc(sizeof(struct read_req_t));
- req->cb = read_cb;
- req->buf = buffer;
- req->addr = addr;
- req->size = len;
- req->wait = len;
- req->dirty = 0;
- req->next = NULL;
-
- /* add this to the request list */
- if (!wm->read_req) {
- /* root node */
- wm->read_req = req;
-
- WIIUSE_DEBUG("Data read request can be sent out immediately.");
-
- /* send the request out immediately */
- wiiuse_send_next_pending_read_request(wm);
- } else {
- struct read_req_t* nptr = wm->read_req;
- for (; nptr->next; nptr = nptr->next);
- nptr->next = req;
-
- WIIUSE_DEBUG("Added pending data read request.");
- }
-
- return 1;
-}
-
-
-
-/**
- * @brief Send the next pending data read request to the wiimote.
- *
- * @param wm Pointer to a wiimote_t structure.
- *
- * @see wiiuse_read_data()
- *
- * This function is not part of the wiiuse API.
- */
-void wiiuse_send_next_pending_read_request(struct wiimote_t* wm) {
- byte buf[6];
- struct read_req_t* req;
-
- if (!wm || !WIIMOTE_IS_CONNECTED(wm))
- return;
- if (!wm->read_req) return;
-
- /* skip over dirty ones since they have already been read */
- req = wm->read_req;
- while (req && req->dirty)
- req = req->next;
- if (!req)
- return;
-
- /* the offset is in big endian */
- *(int*)(buf) = BIG_ENDIAN_LONG(req->addr);
-
- /* the length is in big endian */
- *(short*)(buf + 4) = BIG_ENDIAN_SHORT(req->size);
-
- WIIUSE_DEBUG("Request read at address: 0x%x length: %i", req->addr, req->size);
- wiiuse_send(wm, WM_CMD_READ_DATA, buf, 6);
-}
-
/**
* @brief Write data to the wiimote.
@@ -511,13 +395,12 @@ void wiiuse_set_bluetooth_stack(struct wiimote_t** wm, int wiimotes, enum win_bt
* @param normal_timeout The timeout in milliseconds for a normal read.
* @param exp_timeout The timeout in millisecondsd to wait for an expansion handshake.
*/
-void wiiuse_set_timeout(struct wiimote_t** wm, int wiimotes, byte normal_timeout, byte exp_timeout) {
+void wiiuse_set_timeout(struct wiimote_t** wm, int wiimotes, byte timeout) {
int i;
if (!wm) return;
for (i = 0; i < wiimotes; ++i) {
- wm[i]->normal_timeout = normal_timeout;
- wm[i]->exp_timeout = exp_timeout;
+ wm[i]->timeout = timeout;
}
}
diff --git a/Externals/WiiUseSrc/Src/wiiuse.h b/Externals/WiiUseSrc/Src/wiiuse.h
index 5883fbf7c6..d6d2ed2542 100644
--- a/Externals/WiiUseSrc/Src/wiiuse.h
+++ b/Externals/WiiUseSrc/Src/wiiuse.h
@@ -64,67 +64,6 @@
#define WIIMOTE_LED_3 0x40
#define WIIMOTE_LED_4 0x80
-/* button codes */
-#define WIIMOTE_BUTTON_TWO 0x0001
-#define WIIMOTE_BUTTON_ONE 0x0002
-#define WIIMOTE_BUTTON_B 0x0004
-#define WIIMOTE_BUTTON_A 0x0008
-#define WIIMOTE_BUTTON_MINUS 0x0010
-#define WIIMOTE_BUTTON_ZACCEL_BIT6 0x0020
-#define WIIMOTE_BUTTON_ZACCEL_BIT7 0x0040
-#define WIIMOTE_BUTTON_HOME 0x0080
-#define WIIMOTE_BUTTON_LEFT 0x0100
-#define WIIMOTE_BUTTON_RIGHT 0x0200
-#define WIIMOTE_BUTTON_DOWN 0x0400
-#define WIIMOTE_BUTTON_UP 0x0800
-#define WIIMOTE_BUTTON_PLUS 0x1000
-#define WIIMOTE_BUTTON_ZACCEL_BIT4 0x2000
-#define WIIMOTE_BUTTON_ZACCEL_BIT5 0x4000
-#define WIIMOTE_BUTTON_UNKNOWN 0x8000
-#define WIIMOTE_BUTTON_ALL 0x1F9F
-
-/* nunchul button codes */
-#define NUNCHUK_BUTTON_Z 0x01
-#define NUNCHUK_BUTTON_C 0x02
-#define NUNCHUK_BUTTON_ALL 0x03
-
-/* classic controller button codes */
-#define CLASSIC_CTRL_BUTTON_UP 0x0001
-#define CLASSIC_CTRL_BUTTON_LEFT 0x0002
-#define CLASSIC_CTRL_BUTTON_ZR 0x0004
-#define CLASSIC_CTRL_BUTTON_X 0x0008
-#define CLASSIC_CTRL_BUTTON_A 0x0010
-#define CLASSIC_CTRL_BUTTON_Y 0x0020
-#define CLASSIC_CTRL_BUTTON_B 0x0040
-#define CLASSIC_CTRL_BUTTON_ZL 0x0080
-#define CLASSIC_CTRL_BUTTON_FULL_R 0x0200
-#define CLASSIC_CTRL_BUTTON_PLUS 0x0400
-#define CLASSIC_CTRL_BUTTON_HOME 0x0800
-#define CLASSIC_CTRL_BUTTON_MINUS 0x1000
-#define CLASSIC_CTRL_BUTTON_FULL_L 0x2000
-#define CLASSIC_CTRL_BUTTON_DOWN 0x4000
-#define CLASSIC_CTRL_BUTTON_RIGHT 0x8000
-#define CLASSIC_CTRL_BUTTON_ALL 0xFEFF
-
-/* guitar hero 3 button codes */
-#define GUITAR_HERO_3_BUTTON_STRUM_UP 0x0001
-#define GUITAR_HERO_3_BUTTON_YELLOW 0x0008
-#define GUITAR_HERO_3_BUTTON_GREEN 0x0010
-#define GUITAR_HERO_3_BUTTON_BLUE 0x0020
-#define GUITAR_HERO_3_BUTTON_RED 0x0040
-#define GUITAR_HERO_3_BUTTON_ORANGE 0x0080
-#define GUITAR_HERO_3_BUTTON_PLUS 0x0400
-#define GUITAR_HERO_3_BUTTON_MINUS 0x1000
-#define GUITAR_HERO_3_BUTTON_STRUM_DOWN 0x4000
-#define GUITAR_HERO_3_BUTTON_ALL 0xFEFF
-
-/* guitar hero world tour touch bar codes */
-#define GUITAR_HERO_3_TOUCH_AVAILABLE 0x1000
-#define GUITAR_HERO_3_TOUCH_GREEN 0x1001
-#define GUITAR_HERO_3_TOUCH_RED 0x1002
-#define GUITAR_HERO_3_TOUCH_YELLOW 0x1004
-#define GUITAR_HERO_3_TOUCH_BLUE 0x1008
-#define GUITAR_HERO_3_TOUCH_ORANGE 0x1010
/* wiimote option flags */
#define WIIUSE_SMOOTHING 0x01
@@ -132,57 +71,9 @@
#define WIIUSE_ORIENT_THRESH 0x04
#define WIIUSE_INIT_FLAGS (WIIUSE_SMOOTHING | WIIUSE_ORIENT_THRESH)
-#define WIIUSE_ORIENT_PRECISION 100.0f
-/* expansion codes */
-#define EXP_NONE 0
-#define EXP_NUNCHUK 1
-#define EXP_CLASSIC 2
-#define EXP_GUITAR_HERO_3 3
-#define EXP_WII_BOARD 4
-#define EXP_WII_MOTION_PLUS 5
-#define EXP_WII_MOTION_PLUS_NUNCHUK 6
-/* IR correction types */
-typedef enum ir_position_t {
- WIIUSE_IR_ABOVE,
- WIIUSE_IR_BELOW
-} ir_position_t;
-/**
- * @brief Check if a button is pressed.
- * @param dev Pointer to a wiimote_t or expansion structure.
- * @param button The button you are interested in.
- * @return 1 if the button is pressed, 0 if not.
- */
-#define IS_PRESSED(dev, button) ((dev->btns & button) == button)
-
-/**
- * @brief Check if a button is being held.
- * @param dev Pointer to a wiimote_t or expansion structure.
- * @param button The button you are interested in.
- * @return 1 if the button is held, 0 if not.
- */
-#define IS_HELD(dev, button) ((dev->btns_held & button) == button)
-
-/**
- * @brief Check if a button is released on this event. \n\n
- * This does not mean the button is not pressed, it means \n
- * this button was just now released.
- * @param dev Pointer to a wiimote_t or expansion structure.
- * @param button The button you are interested in.
- * @return 1 if the button is released, 0 if not.
- *
- */
-#define IS_RELEASED(dev, button) ((dev->btns_released & button) == button)
-
-/**
- * @brief Check if a button has just been pressed this event.
- * @param dev Pointer to a wiimote_t or expansion structure.
- * @param button The button you are interested in.
- * @return 1 if the button is pressed, 0 if not.
- */
-#define IS_JUST_PRESSED(dev, button) (IS_PRESSED(dev, button) && !IS_HELD(dev, button))
/**
* @brief Return the IR sensitivity level.
@@ -200,10 +91,7 @@ typedef enum ir_position_t {
else *lvl = 0; \
} while (0)
-#define WIIUSE_USING_ACC(wm) ((wm->state & 0x020) == 0x020)
-#define WIIUSE_USING_EXP(wm) ((wm->state & 0x040) == 0x040)
-#define WIIUSE_USING_IR(wm) ((wm->state & 0x080) == 0x080)
-#define WIIUSE_USING_SPEAKER(wm) ((wm->state & 0x100) == 0x100)
+
#define WIIUSE_IS_LED_SET(wm, num) ((wm->leds & WIIMOTE_LED_##num) == WIIMOTE_LED_##num)
@@ -217,8 +105,7 @@ typedef enum ir_position_t {
* This is left over from an old hack, but it may actually
* be a useful feature to keep so it wasn't removed.
*/
-#define WIIMOTE_DEFAULT_TIMEOUT 10
-#define WIIMOTE_EXP_TIMEOUT 10
+#define WIIMOTE_DEFAULT_TIMEOUT 30
typedef unsigned char byte;
typedef char sbyte;
@@ -615,41 +502,21 @@ typedef struct wiimote_t {
WCONST int out_sock; /**< output socket */
WCONST int in_sock; /**< input socket */
#elif defined(_WIN32)
+ WCONST char devicepath[255]; /**< unique wiimote reference */
+ //WCONST ULONGLONG btaddr; /**< bt address (windows) */
WCONST HANDLE dev_handle; /**< HID handle */
WCONST OVERLAPPED hid_overlap; /**< overlap handle */
WCONST enum win_bt_stack_t stack; /**< type of bluetooth stack to use */
#endif
-
WCONST int timeout; /**< read timeout */
- WCONST byte normal_timeout; /**< normal timeout */
- WCONST byte exp_timeout; /**< timeout for expansion handshake */
-
WCONST int state; /**< various state flags */
WCONST byte leds; /**< currently lit leds */
- WCONST float battery_level; /**< battery level */
WCONST int flags; /**< options flag */
WCONST byte handshake_state; /**< the state of the connection handshake */
WCONST struct read_req_t* read_req; /**< list of data read requests */
- WCONST struct accel_t accel_calib; /**< wiimote accelerometer calibration */
- WCONST struct expansion_t expansion; /**< wiimote expansion device */
-
- WCONST struct vec3b_t accel; /**< current raw acceleration data */
- WCONST struct orient_t orient; /**< current orientation on each axis */
- WCONST struct gforce_t gforce; /**< current gravity forces on each axis */
-
- WCONST struct ir_t ir; /**< IR data */
-
- WCONST unsigned short btns; /**< what buttons have just been pressed */
- WCONST unsigned short btns_held; /**< what buttons are being held down */
- WCONST unsigned short btns_released; /**< what buttons were just released this */
-
- WCONST float orient_threshold; /**< threshold for orient to generate an event */
- WCONST int accel_threshold; /**< threshold for accel to generate an event */
-
- WCONST struct wiimote_state_t lstate; /**< last saved state */
WCONST WIIUSE_EVENT_TYPE event; /**< type of event that occured */
WCONST byte event_buf[MAX_PAYLOAD]; /**< event buffer */
@@ -691,10 +558,14 @@ WIIUSE_EXPORT extern void wiiuse_set_leds(struct wiimote_t* wm, int leds);
WIIUSE_EXPORT extern int wiiuse_write_data(struct wiimote_t* wm, unsigned int addr, byte* data, byte len);
/* connect.c / io_win.c */
+#ifdef _WIN32
+WIIUSE_EXPORT extern int wiiuse_find(struct wiimote_t** wm, int max_wiimotes, int wiimotes);
+#else
WIIUSE_EXPORT extern int wiiuse_find(struct wiimote_t** wm, int max_wiimotes, int timeout);
+#endif
WIIUSE_EXPORT extern int wiiuse_connect(struct wiimote_t** wm, int wiimotes);
WIIUSE_EXPORT extern void wiiuse_disconnect(struct wiimote_t* wm);
-WIIUSE_EXPORT extern void wiiuse_set_timeout(struct wiimote_t** wm, int wiimotes, byte normal_timeout, byte exp_timeout);
+WIIUSE_EXPORT extern void wiiuse_set_timeout(struct wiimote_t** wm, int wiimotes, byte timeout);
#ifdef WIN32
WIIUSE_EXPORT extern int wiiuse_check_system_notification(unsigned int nMsg, WPARAM wParam, LPARAM lParam);
@@ -706,9 +577,7 @@ int wiiuse_find_more(struct wiimote_t** wm, int max_wiimotes, int timeout);
#endif
/* ir.c */
-WIIUSE_EXPORT extern void wiiuse_set_ir(struct wiimote_t* wm, int status);
-WIIUSE_EXPORT extern void wiiuse_set_ir_position(struct wiimote_t* wm, enum ir_position_t pos);
-WIIUSE_EXPORT extern void wiiuse_set_aspect_ratio(struct wiimote_t* wm, enum aspect_t aspect);
+
WIIUSE_EXPORT extern void wiiuse_set_ir_sensitivity(struct wiimote_t* wm, int level);
/* io.c */
diff --git a/Externals/WiiUseSrc/Src/wiiuse_internal.h b/Externals/WiiUseSrc/Src/wiiuse_internal.h
index 9e1e2a5b39..f8a5f11db4 100644
--- a/Externals/WiiUseSrc/Src/wiiuse_internal.h
+++ b/Externals/WiiUseSrc/Src/wiiuse_internal.h
@@ -79,17 +79,6 @@
#define WM_CMD_SPEAKER_MUTE 0x19// Size 1
#define WM_CMD_IR_2 0x1A
-/* input report ids */
-#define WM_RPT_CTRL_STATUS 0x20
-#define WM_RPT_READ 0x21
-#define WM_RPT_WRITE 0x22
-#define WM_RPT_BTN 0x30
-#define WM_RPT_BTN_ACC 0x31
-#define WM_RPT_BTN_ACC_IR 0x33
-#define WM_RPT_BTN_EXP 0x34
-#define WM_RPT_BTN_ACC_EXP 0x35
-#define WM_RPT_BTN_IR_EXP 0x36
-#define WM_RPT_BTN_ACC_IR_EXP 0x37
#define WM_BT_INPUT 0x01
#define WM_BT_OUTPUT 0x02
@@ -101,26 +90,14 @@
#define WM_VENDOR_ID 0x057E
#define WM_PRODUCT_ID 0x0306
-/* controller status stuff */
-#define WM_MAX_BATTERY_CODE 0xC8
+
/* offsets in wiimote memory */
#define WM_MEM_OFFSET_CALIBRATION 0x16
-#define WM_EXP_MEM_BASE 0x04A40000
-#define WM_EXP_MEM_ENABLE 0x04A40040
-#define WM_EXP_MEM_CALIBR 0x04A40020
-#define WM_EXP_MEM_ENABLE1 0x04A400F0
-#define WM_EXP_MEM_ENABLE2 0x04A400FB
-#define WM_REG_IR 0x04B00030
#define WM_REG_IR_BLOCK1 0x04B00000
#define WM_REG_IR_BLOCK2 0x04B0001A
-#define WM_REG_IR_MODENUM 0x04B00033
-#define WM_EXT_MP_MEM_BASE 0x04A60000
-#define WM_EXT_MP_MEM_ENABLE1 0x04A600F0
-#define WM_EXT_MP_MEM_ENABLE2 0x04A600FE
-#define WM_EXT_MP_MEM_ENABLE3 0x04A400FB
/* ir block data */
#define WM_IR_BLOCK1_LEVEL1 "\x02\x00\x00\x71\x01\x00\x64\x00\xfe"
@@ -138,40 +115,8 @@
#define WM_IR_TYPE_EXTENDED 0x03
#define WM_IR_TYPE_FULL 0x05
-/* controller status flags for the first message byte */
-/* bit 1 is unknown */
-#define WM_CTRL_STATUS_BYTE1_ATTACHMENT 0x02
-#define WM_CTRL_STATUS_BYTE1_SPEAKER_ENABLED 0x04
-#define WM_CTRL_STATUS_BYTE1_IR_ENABLED 0x08
-#define WM_CTRL_STATUS_BYTE1_LED_1 0x10
-#define WM_CTRL_STATUS_BYTE1_LED_2 0x20
-#define WM_CTRL_STATUS_BYTE1_LED_3 0x40
-#define WM_CTRL_STATUS_BYTE1_LED_4 0x80
-
-/* aspect ratio */
-#define WM_ASPECT_16_9_X 660
-#define WM_ASPECT_16_9_Y 370
-#define WM_ASPECT_4_3_X 560
-#define WM_ASPECT_4_3_Y 420
-/**
- * Expansion stuff
- */
-
-/* encrypted expansion id codes (located at 0x04A400FC) */
-/*#define EXP_ID_CODE_NUNCHUK 0x9A1EFEFE
-#define EXP_ID_CODE_CLASSIC_CONTROLLER 0x9A1EFDFD
-#define EXP_ID_CODE_GUITAR 0x9A1EFDFB
-*/
-#define EXP_ID_CODE_NUNCHUK 0xa4200000
-#define EXP_ID_CODE_CLASSIC_CONTROLLER 0xa4200101
-#define EXP_ID_CODE_GUITAR 0xa4200103 // 4 bytes are not unique enough
-#define EXP_ID_CODE_WII_BOARD 0xa4200402
-#define EXP_ID_CODE_MOTIONPLUS 0xa4200405
-#define EXP_ID_CODE_MOTIONPLUS_EXT 0xa4200505
-
-#define EXP_HANDSHAKE_LEN 224
/********************
*
@@ -214,16 +159,7 @@
#define WIIMOTE_ID(wm) (wm->unid)
#define WIIMOTE_IS_CONNECTED(wm) (WIIMOTE_IS_SET(wm, WIIMOTE_STATE_CONNECTED))
-/*
- * Smooth tilt calculations are computed with the
- * exponential moving average formula:
- * St = St_last + (alpha * (tilt - St_last))
- * alpha is between 0 and 1
- */
-#define WIIUSE_DEFAULT_SMOOTH_ALPHA 0.07f
-#define SMOOTH_ROLL 0x01
-#define SMOOTH_PITCH 0x02
#include "wiiuse.h"
@@ -233,9 +169,7 @@ extern "C" {
/* not part of the api */
int wiiuse_set_report_type(struct wiimote_t* wm);
-void wiiuse_send_next_pending_read_request(struct wiimote_t* wm);
int wiiuse_send(struct wiimote_t* wm, byte report_type, byte* msg, int len);
-int wiiuse_read_data_cb(struct wiimote_t* wm, wiiuse_read_cb read_cb, byte* buffer, unsigned int offset, unsigned short len);
#ifdef __cplusplus
}
diff --git a/Externals/WiiUseSrc/wiiuse.vcproj b/Externals/WiiUseSrc/wiiuse.vcproj
index 0953b69309..6be8595c83 100644
--- a/Externals/WiiUseSrc/wiiuse.vcproj
+++ b/Externals/WiiUseSrc/wiiuse.vcproj
@@ -411,10 +411,6 @@
-
-
diff --git a/Source/Plugins/Plugin_Wiimote/Src/ConfigBasicDlg.cpp b/Source/Plugins/Plugin_Wiimote/Src/ConfigBasicDlg.cpp
index 9c1c227bc7..13772181e7 100644
--- a/Source/Plugins/Plugin_Wiimote/Src/ConfigBasicDlg.cpp
+++ b/Source/Plugins/Plugin_Wiimote/Src/ConfigBasicDlg.cpp
@@ -544,7 +544,7 @@ void WiimoteBasicConfigDialog::IRCursorChanged(wxScrollEvent& event)
case IDS_TIMEOUT:
g_Config.bWiiReadTimeout = m_WiimoteTimeout[m_Page]->GetValue();
if (g_RealWiiMotePresent) {
- wiiuse_set_timeout(WiiMoteReal::g_WiiMotesFromWiiUse, WiiMoteReal::g_NumberOfWiiMotes, g_Config.bWiiReadTimeout, g_Config.bWiiReadTimeout);
+ wiiuse_set_timeout(WiiMoteReal::g_WiiMotesFromWiiUse, WiiMoteReal::g_NumberOfWiiMotes, g_Config.bWiiReadTimeout);
}
break;
}
diff --git a/Source/Plugins/Plugin_Wiimote/Src/wiimote_real.cpp b/Source/Plugins/Plugin_Wiimote/Src/wiimote_real.cpp
index 52930d63ef..93eec82879 100644
--- a/Source/Plugins/Plugin_Wiimote/Src/wiimote_real.cpp
+++ b/Source/Plugins/Plugin_Wiimote/Src/wiimote_real.cpp
@@ -49,8 +49,8 @@ extern SWiimoteInitialize g_WiimoteInitialize;
namespace WiiMoteReal
{
-bool g_RealWiiMoteInitialized = false;
-bool g_RealWiiMoteAllocated = false;
+ bool g_RealWiiMoteInitialized = false;
+ bool g_RealWiiMoteAllocated = false;
// Forwarding
@@ -61,8 +61,9 @@ class CWiiMote;
wiimote_t** g_WiiMotesFromWiiUse = NULL;
Common::Thread* g_pReadThread = NULL;
int g_NumberOfWiiMotes;
+volatile int LastNumberOfWiimotes = 0;
CWiiMote* g_WiiMotes[MAX_WIIMOTES];
-volatile bool g_Shutdown = false;
+volatile bool g_Shutdown = false;
bool g_WiimoteInUse[MAX_WIIMOTES];
Common::Event NeedsConnect;
Common::Event Connected;
@@ -78,6 +79,7 @@ unsigned int PairUpTimer = 2000;
int PairUpRefreshWiimote(bool addwiimote);
int PairUpFindNewSlot(void);
+void ToggleEmulatorState(bool stop);
THREAD_RETURN PairUp_ThreadFunc(void* arg);
THREAD_RETURN RunInvisibleMessageWindow_ThreadFunc(void* arg);
#endif
@@ -103,7 +105,8 @@ CWiiMote(u8 _WiimoteNumber, wiimote_t* _pWiimote)
#ifdef _WIN32
// F|RES: i dunno if we really need this
- CancelIo(m_pWiiMote->dev_handle);
+ //CancelIo(m_pWiiMote->dev_handle);
+ CancelIoEx(m_pWiiMote->dev_handle,NULL);
#endif
}
@@ -338,6 +341,8 @@ int Initialize()
// Return if already initialized
if (g_RealWiiMoteInitialized)
return g_NumberOfWiiMotes;
+
+
NeedsConnect.Init();
Connected.Init();
@@ -363,18 +368,19 @@ int Initialize()
return 0;
// Call Wiiuse.dll
- g_WiiMotesFromWiiUse = wiiuse_init(MAX_WIIMOTES);
- g_NumberOfWiiMotes = wiiuse_find(g_WiiMotesFromWiiUse, wiimote_slots, 5);
+ if(!g_WiiMotesFromWiiUse)
+ g_WiiMotesFromWiiUse = wiiuse_init(MAX_WIIMOTES);
+
+#ifdef _WIN32
+ g_NumberOfWiiMotes = wiiuse_find(g_WiiMotesFromWiiUse, wiimote_slots, LastNumberOfWiimotes);
+#else
+ g_NumberOfWiiMotes = wiiuse_find(g_WiiMotesFromWiiUse, wiimote_slots, 5); //move the timeout var into wiimote_t structure to avoid confusion
+#endif
+ LastNumberOfWiimotes = g_NumberOfWiiMotes;
DEBUG_LOG(WIIMOTE, "Found No of Wiimotes: %i", g_NumberOfWiiMotes);
if (g_NumberOfWiiMotes > 0)
{
- /*
- //TODO: We need here to re-order the wiimote structure, after we shutdown() and re-init().
- // If we don't do this Wiimotes will change slots on addition of a new real wiimote during a game,
- // causing a disconnect as well.
- if (g_EmulatorState == PLUGIN_EMUSTATE_PAUSE)
- SortWiimotes();
- */
+
g_RealWiiMotePresent = true;
// Create a new thread for listening for Wiimote data
// and also connecting in Linux/OSX.
@@ -396,27 +402,24 @@ int Initialize()
if (g_Config.iIRLevel) {
wiiuse_set_ir_sensitivity(g_WiiMotesFromWiiUse[i], g_Config.iIRLevel);
}
-
- // Set the sensor bar position, this should only affect the internal wiiuse api functions
- wiiuse_set_ir_position(g_WiiMotesFromWiiUse[i], WIIUSE_IR_ABOVE);
}
- if (g_Config.bWiiReadTimeout != 10)
- wiiuse_set_timeout(g_WiiMotesFromWiiUse, g_NumberOfWiiMotes, g_Config.bWiiReadTimeout, g_Config.bWiiReadTimeout);
+ if (g_Config.bWiiReadTimeout != 30)
+ wiiuse_set_timeout(g_WiiMotesFromWiiUse, g_NumberOfWiiMotes, g_Config.bWiiReadTimeout);
// If we are connecting from the config window without a game running we set the LEDs
- if (g_EmulatorState != PLUGIN_EMUSTATE_PLAY && g_RealWiiMotePresent)
+ if (g_EmulatorState == PLUGIN_EMUSTATE_STOP && g_RealWiiMotePresent)
FlashLights(true);
// Initialized, even if we didn't find a Wiimote
g_RealWiiMoteInitialized = true;
-
+
return g_NumberOfWiiMotes;
}
// Allocate each Real WiiMote found to a WiiMote slot with Source set to "WiiMote Real"
void Allocate()
{
- if (g_RealWiiMoteAllocated)
+ if (g_RealWiiMoteAllocated)// && (g_NumberOfWiiMotes == LastNumberOfWiimotes))
return;
if (!g_RealWiiMoteInitialized)
Initialize();
@@ -519,17 +522,14 @@ void Shutdown(void)
if (g_EmulatorState != PLUGIN_EMUSTATE_PLAY && g_RealWiiMotePresent)
FlashLights(false);
-
- // TODOE: Save Wiimote-order here to restore it after an Init()
- // we should best use the btaddress for this purpose, unfortunately it is a bit of a work to make wiiuse_find()
- // get the btaddress of a bt device on windows with only a createfile() handle etc., but it wiiuse_find() is already doing that on linux
-
// Clean up wiiuse
+#ifndef WIN32
wiiuse_cleanup(g_WiiMotesFromWiiUse, g_NumberOfWiiMotes);
-
+#endif
// Uninitialized
g_RealWiiMoteInitialized = false;
g_RealWiiMotePresent = false;
+ g_RealWiiMoteAllocated = false;
}
void InterruptChannel(int _WiimoteNumber, u16 _channelID, const void* _pData, u32 _Size)
@@ -613,7 +613,7 @@ int WiimotePairUp(bool unpair)
return -1;
}
nRadios--;
- //DEBUG_LOG(WIIMOTE, "Pair-Up: Found %d radios\n", nRadios);
+ DEBUG_LOG(WIIMOTE, "Pair-Up: Found %d radios\n", nRadios);
// Pair with Wii device(s)
int radio = 0;
@@ -637,7 +637,7 @@ int WiimotePairUp(bool unpair)
srch.fReturnConnected = TRUE; // does not filter properly somehow, so we 've to do an additional check on fConnected BT Devices
srch.fReturnUnknown = TRUE;
srch.fIssueInquiry = TRUE;
- srch.cTimeoutMultiplier = 1;
+ srch.cTimeoutMultiplier = 2;
srch.hRadio = hRadios[radio];
//DEBUG_LOG(WIIMOTE, "Pair-Up: Scanning for BT Device(s)");
@@ -653,6 +653,9 @@ int WiimotePairUp(bool unpair)
do
{
//btdi.szName is sometimes missings it's content - it's a bt feature..
+
+ DEBUG_LOG(WIIMOTE, "authed %i connected %i remembered %i ", btdi.fAuthenticated, btdi.fConnected, btdi.fRemembered);
+
if ((!wcscmp(btdi.szName, L"Nintendo RVL-WBC-01") || !wcscmp(btdi.szName, L"Nintendo RVL-CNT-01")) && !btdi.fConnected && !unpair)
{
//TODO: improve the read of the BT driver, esp. when batteries of the wiimote are removed while being fConnected
@@ -708,7 +711,6 @@ LRESULT CALLBACK CallBackDeviceChange(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
{
case WM_DEVICECHANGE:
-
// DBT_DEVNODES_CHANGED 0x007 (devnodes are atm not received); DBT_DEVICEARRIVAL 0x8000 DBT_DEVICEREMOVECOMPLETE 0x8004 // avoiding header file^^
if ( ( wParam == 0x8000 || wParam == 0x8004 || wParam == 0x0007 ) )
{
@@ -733,6 +735,7 @@ LRESULT CALLBACK CallBackDeviceChange(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
PairUpRefreshWiimote(false);
}
break;
+
}
}
}
@@ -787,6 +790,19 @@ THREAD_RETURN RunInvisibleMessageWindow_ThreadFunc(void* arg)
return (int)Msg.wParam;
}
+
+
+void ToggleEmulatorState(bool stop) {
+ PostMessage(GetParent(g_WiimoteInitialize.hWnd), WM_USER, WM_USER_PAUSE, 0);
+ if (stop) {
+ while (g_EmulatorState != PLUGIN_EMUSTATE_PLAY) Sleep(50);
+ }
+ else {
+ while (g_EmulatorState == PLUGIN_EMUSTATE_PLAY) Sleep(50);
+ }
+}
+
+
// function gets called by windows callbacks if a wiimote was either installed or removed
int PairUpRefreshWiimote(bool addwiimote)
{
@@ -795,24 +811,25 @@ int PairUpRefreshWiimote(bool addwiimote)
if (g_EmulatorState != PLUGIN_EMUSTATE_PLAY)
{
Shutdown();
+ if (addwiimote)
+ {
+ connectslot = PairUpFindNewSlot();
+ }
Initialize();
- //Allocate();
if (m_BasicConfigFrame != NULL)
m_BasicConfigFrame->UpdateGUI();
}
else {
- Sleep(100);
- PostMessage(GetParent(g_WiimoteInitialize.hWnd), WM_USER, WM_USER_PAUSE, 0);
- while (g_EmulatorState == PLUGIN_EMUSTATE_PLAY) Sleep(50);
+ ToggleEmulatorState(true);
Shutdown();
- if (addwiimote) {
+ if (addwiimote)
+ {
connectslot = PairUpFindNewSlot();
}
Initialize();
Allocate();
- PostMessage(GetParent(g_WiimoteInitialize.hWnd), WM_USER, WM_USER_PAUSE, 0);
- while (g_EmulatorState != PLUGIN_EMUSTATE_PLAY) Sleep(50);
+ ToggleEmulatorState(false);
if (addwiimote)
PostMessage(GetParent(g_WiimoteInitialize.hWnd), WM_USER, WM_USER_KEYDOWN, (3 + connectslot));
@@ -821,12 +838,17 @@ int PairUpRefreshWiimote(bool addwiimote)
}
// returns first inactive wiimote slot to place new wiimote and set type to real wiimote
int PairUpFindNewSlot() {
+ int realWM = 0;
for(int x=0; xg_NumberOfWiiMotes)
+ return x;
}
}
return -1;
diff --git a/Source/Plugins/Plugin_Wiimote/Src/wiimote_real.h b/Source/Plugins/Plugin_Wiimote/Src/wiimote_real.h
index 294316ea28..98dbad9f4b 100644
--- a/Source/Plugins/Plugin_Wiimote/Src/wiimote_real.h
+++ b/Source/Plugins/Plugin_Wiimote/Src/wiimote_real.h
@@ -51,6 +51,7 @@ void ClearEvents();
extern wiimote_t** g_WiiMotesFromWiiUse;
extern bool g_Shutdown;
extern int g_NumberOfWiiMotes;
+ extern int LastNumberOfWiimotes;
#ifdef _WIN32
extern Common::Thread* g_AutoPairUpInvisibleWindow;
extern Common::Thread* g_AutoPairUpMonitoring;