Commit 391e9c09 authored by Jonathan Wilkes's avatar Jonathan Wilkes
Browse files

ported from pd-l2ork git: commit ac2528233bbe36074747ae4779f909713a9b951f

 *minor bug fixes to the 0.7.00 release of cwiid (keeping the version the same)
parent 3560a053
......@@ -15,6 +15,10 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* ChangeLog:
* 2015-09-22 Ivica Ico Bukvic <ico@vt.edu>
* * Made old wiimotes use old way of connecting as some of them fail to do so using 1+2 when using new method
* * Removed error report thats tend to unnecessarily spam the console
*
* 2015-09-17 Ivica Ico Bukvic <ico@vt.edu>
* * Added Wii MotionPlus Inside support, thereby completing support for all known Wii devices
* * Version bump to 0.7.00
......@@ -98,21 +102,36 @@ int cwiid_send_rpt(cwiid_wiimote_t *wiimote, uint8_t flags, uint8_t report,
return -1;
}
buf[0] = BT_TRANS_SET_REPORT | BT_PARAM_OUTPUT;
if (wiimote->type == WIIMOTE_NEW)
buf[0] = BT_TRANS_DATA | BT_PARAM_OUTPUT;
else
buf[0] = BT_TRANS_SET_REPORT | BT_PARAM_OUTPUT;
buf[1] = report;
memcpy(buf+2, data, len);
if (!(flags & CWIID_SEND_RPT_NO_RUMBLE)) {
buf[2] |= wiimote->state.rumble;
}
if (write(wiimote->int_socket, buf, len+2) != (ssize_t)(len+2)) {
free(buf);
return -1;
// if this is a new version of the wiimote
if (wiimote->type == WIIMOTE_NEW)
{
if (write(wiimote->int_socket, buf, len+2) != (ssize_t)(len+2)) {
free(buf);
return -1;
}
}
// otherwise it is WIIMOTE_OLD which also includes Wii Board
else
{
if (write(wiimote->ctl_socket, buf, len+2) != (ssize_t)(len+2)) {
free(buf);
return -1;
}
else if (verify_handshake(wiimote)) {
free(buf);
return -1;
}
}
/*else if (verify_handshake(wiimote)) {
free(buf);
return -1;
}*/
return 0;
}
......@@ -391,11 +410,11 @@ int cwiid_write(cwiid_wiimote_t *wiimote, uint8_t flags, uint32_t offset,
goto CODA;
}
if (mesg.error) {
/*if (mesg.error) {
cwiid_err(wiimote, "Wiimote write error");
ret = -1;
goto CODA;
};
};*/
sent+=buf[4];
}
......
......@@ -15,6 +15,10 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* ChangeLog:
* 2015-09-22 Ivica Ico Bukvic <ico@vt.edu>
* * Made old wiimotes use old way of connecting as some of them fail to do so using 1+2 when using new method
* * Removed error report thats tend to unnecessarily spam the console
*
* 2015-09-17 Ivica Ico Bukvic <ico@vt.edu>
* * Added Wii MotionPlus Inside support, thereby completing support for all known Wii devices
* * Version bump to 0.7.00
......@@ -88,8 +92,9 @@ cwiid_wiimote_t *cwiid_open_timeout(bdaddr_t *bdaddr, int flags, int timeout)
char mesg_pipe_init = 0, status_pipe_init = 0, rw_pipe_init = 0,
state_mutex_init = 0, rw_mutex_init = 0, rpt_mutex_init = 0,
router_thread_init = 0, status_thread_init = 0, ext_passthrough_polling_thread_init = 0,
poll_mutex_init = 0, poll_cond_init = 0;
poll_mutex_init = 0, poll_cond_init = 0, name[BT_NAME_LEN] = { 0 };
void *pthread_ret;
int sock;
/* Allocate wiimote */
if ((wiimote = malloc(sizeof *wiimote)) == NULL) {
......@@ -123,6 +128,22 @@ cwiid_wiimote_t *cwiid_open_timeout(bdaddr_t *bdaddr, int flags, int timeout)
sleep(1);
}
/* Figure out if the device is old or new version by looking up its name */
sock = hci_open_dev(wiimote->id);
if (!hci_read_remote_name(sock, bdaddr, BT_NAME_LEN, name, 0)) {
if (!strncmp(name, WIIMOTE_PLUS_NAME, BT_NAME_LEN)) {
fprintf(stderr,"Found new version of the wiimote (%s)\n", name);
wiimote->type = WIIMOTE_NEW;
}
else {
fprintf(stderr,"Found old version of the wiimote (%s)\n", name);
wiimote->type = WIIMOTE_OLD;
}
}
else
fprintf(stderr,"Error reading wiimote name, unable to determine version\n");
close(sock);
/* Connect to Wiimote */
/* Control Channel */
memset(&remote_addr, 0, sizeof remote_addr);
......
......@@ -16,6 +16,10 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* ChangeLog:
* 2015-09-22 Ivica Ico Bukvic <ico@vt.edu>
* * Made old wiimotes use old way of connecting as some of them fail to do so using 1+2 when using new method
* * Removed error report thats tend to unnecessarily spam the console
*
* 2015-09-17 Ivica Ico Bukvic <ico@vt.edu>
* * Added Wii MotionPlus Inside support, thereby completing support for all known Wii devices
* * Version bump to 0.7.00
......@@ -65,7 +69,7 @@
/* Bluetooth magic numbers */
#define BT_TRANS_MASK 0xF0
#define BT_TRANS_HANDSHAKE 0x00
#define BT_TRANS_SET_REPORT 0xA0
#define BT_TRANS_SET_REPORT 0x50
#define BT_TRANS_DATA 0xA0
#define BT_TRANS_DATAC 0xB0
......@@ -157,6 +161,10 @@
#define WII_L5_IR_BLOCK_1 "\x02\x00\x00\x71\x01\x00\x72\x00\x20"
#define WII_L5_IR_BLOCK_2 "\x1F\x03"
/* Type of Wiimote */
#define WIIMOTE_OLD 0
#define WIIMOTE_NEW 1
/* Write Sequences */
enum write_seq_type {
WRITE_SEQ_RPT,
......@@ -216,9 +224,10 @@ struct wiimote {
pthread_mutex_t rpt_mutex;
int id;
const void *data;
int ext; //extension identifier already added to wiimote
int ext; // extension identifier already added to wiimote
pthread_t passthrough_polling_thread;
int passthrough_activate_flag;
int type; // type of wiimote, 0 = old, 1 = new
pthread_mutex_t poll_mutex;
pthread_cond_t condition_var;
};
......@@ -232,7 +241,7 @@ void *mesg_callback_thread(struct wiimote *wiimote);
/* util.c */
void cwiid_err(struct wiimote *wiimote, const char *str, ...);
//int verify_handshake(struct wiimote *wiimote);
int verify_handshake(struct wiimote *wiimote);
int exec_write_seq(struct wiimote *wiimote, unsigned int len,
struct write_seq *seq);
int full_read(int fd, void *buf, size_t len);
......
......@@ -16,6 +16,10 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* ChangeLog:
* 2015-09-22 Ivica Ico Bukvic <ico@vt.edu>
* * Made old wiimotes use old way of connecting as some of them fail to do so using 1+2 when using new method
* * Removed error report thats tend to unnecessarily spam the console
*
* 2015-09-17 Ivica Ico Bukvic <ico@vt.edu>
* * Added Wii MotionPlus Inside support, thereby completing support for all known Wii devices
* * Version bump to 0.7.00
......@@ -376,7 +380,7 @@ int process_write(struct wiimote *wiimote, unsigned char *data)
if (wiimote->rw_status != RW_WRITE) {
cwiid_err(wiimote, "Received unexpected write report %d", wiimote->rw_status);
//return -1;
return -1;
}
rw_mesg.type = RW_WRITE;
......@@ -385,7 +389,7 @@ int process_write(struct wiimote *wiimote, unsigned char *data)
if (write(wiimote->rw_pipe[1], &rw_mesg, sizeof rw_mesg) !=
sizeof rw_mesg) {
cwiid_err(wiimote, "RW pipe write error");
//return -1;
return -1;
}
return 0;
......
......@@ -16,6 +16,10 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* ChangeLog:
* 2015-09-22 Ivica Ico Bukvic <ico@vt.edu>
* * Made old wiimotes use old way of connecting as some of them fail to do so using 1+2 when using new method
* * Removed error report thats tend to unnecessarily spam the console
*
* 2015-09-17 Ivica Ico Bukvic <ico@vt.edu>
* * Added Wii MotionPlus Inside support, thereby completing support for all known Wii devices
* * Version bump to 0.7.00
......@@ -94,10 +98,9 @@ void cwiid_err(struct wiimote *wiimote, const char *str, ...)
}
}
/*
/* used only for old versions of Wiimotes, including Wii Board */
int verify_handshake(struct wiimote *wiimote)
{
// disabled because we don't use ctl_socket any more
unsigned char handshake;
if (read(wiimote->ctl_socket, &handshake, 1) != 1) {
cwiid_err(wiimote, "Socket read error (handshake)");
......@@ -114,7 +117,7 @@ int verify_handshake(struct wiimote *wiimote)
return 0;
}
*/
int exec_write_seq(struct wiimote *wiimote, unsigned int len,
struct write_seq *seq)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment