fix wiiuse_read on mac and windows
This commit is contained in:
26
src/io.c
26
src/io.c
@@ -149,7 +149,7 @@ void wiiuse_wait_report(struct wiimote_t *wm, int report, byte *buffer, int buff
|
|||||||
*/
|
*/
|
||||||
void wiiuse_read(struct wiimote_t *wm, byte memory, unsigned addr, unsigned short size, byte *data)
|
void wiiuse_read(struct wiimote_t *wm, byte memory, unsigned addr, unsigned short size, byte *data)
|
||||||
{
|
{
|
||||||
byte pkt[8];
|
byte pkt[6];
|
||||||
byte buf[MAX_PAYLOAD];
|
byte buf[MAX_PAYLOAD];
|
||||||
unsigned n_full_reports;
|
unsigned n_full_reports;
|
||||||
unsigned last_report;
|
unsigned last_report;
|
||||||
@@ -160,27 +160,25 @@ void wiiuse_read(struct wiimote_t *wm, byte memory, unsigned addr, unsigned shor
|
|||||||
* address in big endian first, the leading byte will
|
* address in big endian first, the leading byte will
|
||||||
* be overwritten (only 3 bytes are sent)
|
* be overwritten (only 3 bytes are sent)
|
||||||
*/
|
*/
|
||||||
to_big_endian_uint32_t(pkt + 2, addr);
|
to_big_endian_uint32_t(pkt, addr);
|
||||||
|
|
||||||
pkt[0] = 0x52; /* HID read command */
|
/* read from registers or memory */
|
||||||
pkt[1] = 0x17; /* report 17 - read */
|
pkt[0] = (memory != 0) ? 0x00 : 0x04;
|
||||||
pkt[2] = (memory != 0) ? 0x00 : 0x04; /* read from registers or memory*/
|
|
||||||
|
/* length in big endian */
|
||||||
/*
|
to_big_endian_uint16_t(pkt + 4, size);
|
||||||
* length in big endian
|
|
||||||
*/
|
/* send */
|
||||||
to_big_endian_uint16_t(pkt + 6, size);
|
wiiuse_send(wm, WM_CMD_READ_DATA, pkt, sizeof(pkt));
|
||||||
|
|
||||||
/* calculate how many 16B packets we have to get back */
|
/* calculate how many 16B packets we have to get back */
|
||||||
n_full_reports = size / 16;
|
n_full_reports = size / 16;
|
||||||
last_report = size % 16;
|
last_report = size % 16;
|
||||||
output = data;
|
output = data;
|
||||||
|
|
||||||
wiiuse_os_write(wm, pkt, 8);
|
|
||||||
|
|
||||||
for(i = 0; i < n_full_reports; ++i)
|
for(i = 0; i < n_full_reports; ++i)
|
||||||
{
|
{
|
||||||
wiiuse_wait_report(wm, 0x21, buf, MAX_PAYLOAD);
|
wiiuse_wait_report(wm, WM_RPT_READ, buf, MAX_PAYLOAD);
|
||||||
memmove(output, buf + 7, 16);
|
memmove(output, buf + 7, 16);
|
||||||
output += 16;
|
output += 16;
|
||||||
}
|
}
|
||||||
@@ -188,7 +186,7 @@ void wiiuse_read(struct wiimote_t *wm, byte memory, unsigned addr, unsigned shor
|
|||||||
/* read the last incomplete packet */
|
/* read the last incomplete packet */
|
||||||
if(last_report)
|
if(last_report)
|
||||||
{
|
{
|
||||||
wiiuse_wait_report(wm, 0x21, buf, MAX_PAYLOAD);
|
wiiuse_wait_report(wm, WM_RPT_READ, buf, MAX_PAYLOAD);
|
||||||
memmove(output, buf + 7, last_report);
|
memmove(output, buf + 7, last_report);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user