mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-26 15:55:31 +01:00
Merge pull request #5556 from shuffle2/jloehr-FixWiimoteReportSizeOnWindows
fix wiimote report size on windows
This commit is contained in:
commit
3d6c278892
@ -449,6 +449,13 @@ struct wm_report_core_accel
|
|||||||
};
|
};
|
||||||
static_assert(sizeof(wm_report_core_accel) == 5, "Wrong size");
|
static_assert(sizeof(wm_report_core_accel) == 5, "Wrong size");
|
||||||
|
|
||||||
|
struct wm_report_core_ext8
|
||||||
|
{
|
||||||
|
wm_buttons c;
|
||||||
|
u8 ext[8];
|
||||||
|
};
|
||||||
|
static_assert(sizeof(wm_report_core_ext8) == 10, "Wrong size");
|
||||||
|
|
||||||
struct wm_report_core_accel_ir12
|
struct wm_report_core_accel_ir12
|
||||||
{
|
{
|
||||||
wm_buttons c;
|
wm_buttons c;
|
||||||
|
@ -577,6 +577,38 @@ bool WiimoteWindows::IsConnected() const
|
|||||||
return m_dev_handle != nullptr;
|
return m_dev_handle != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// See http://wiibrew.org/wiki/Wiimote for the Report IDs and its sizes
|
||||||
|
size_t GetReportSize(u8 report_id)
|
||||||
|
{
|
||||||
|
switch (report_id)
|
||||||
|
{
|
||||||
|
case RT_STATUS_REPORT:
|
||||||
|
return sizeof(wm_status_report);
|
||||||
|
case RT_READ_DATA_REPLY:
|
||||||
|
return sizeof(wm_read_data_reply);
|
||||||
|
case RT_ACK_DATA:
|
||||||
|
return sizeof(wm_acknowledge);
|
||||||
|
case RT_REPORT_CORE:
|
||||||
|
return sizeof(wm_report_core);
|
||||||
|
case RT_REPORT_CORE_ACCEL:
|
||||||
|
return sizeof(wm_report_core_accel);
|
||||||
|
case RT_REPORT_CORE_EXT8:
|
||||||
|
return sizeof(wm_report_core_ext8);
|
||||||
|
case RT_REPORT_CORE_ACCEL_IR12:
|
||||||
|
return sizeof(wm_report_core_accel_ir12);
|
||||||
|
case RT_REPORT_CORE_EXT19:
|
||||||
|
case RT_REPORT_CORE_ACCEL_EXT16:
|
||||||
|
case RT_REPORT_CORE_IR10_EXT9:
|
||||||
|
case RT_REPORT_CORE_ACCEL_IR10_EXT6:
|
||||||
|
case RT_REPORT_EXT21:
|
||||||
|
case RT_REPORT_INTERLEAVE1:
|
||||||
|
case RT_REPORT_INTERLEAVE2:
|
||||||
|
return sizeof(wm_report_ext21);
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// positive = read packet
|
// positive = read packet
|
||||||
// negative = didn't read packet
|
// negative = didn't read packet
|
||||||
// zero = error
|
// zero = error
|
||||||
@ -624,7 +656,17 @@ int IORead(HANDLE& dev_handle, OVERLAPPED& hid_overlap_read, u8* buf, int index)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return bytes + 1;
|
// ReadFile will always return 22 bytes read.
|
||||||
|
// So we need to calculate the actual report size by its report ID
|
||||||
|
DWORD report_size = static_cast<DWORD>(GetReportSize(buf[1]));
|
||||||
|
if (report_size == 0)
|
||||||
|
{
|
||||||
|
WARN_LOG(WIIMOTE, "Received unsupported report %d in Wii Remote %i", buf[1], index + 1);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1 Byte for the Data Report Byte, another for the Report ID and the actual report size
|
||||||
|
return 1 + 1 + report_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WiimoteWindows::IOWakeup()
|
void WiimoteWindows::IOWakeup()
|
||||||
@ -646,15 +688,15 @@ static int IOWritePerSetOutputReport(HANDLE& dev_handle, const u8* buf, size_t l
|
|||||||
if (!result)
|
if (!result)
|
||||||
{
|
{
|
||||||
DWORD err = GetLastError();
|
DWORD err = GetLastError();
|
||||||
if (err == 121)
|
if (err == ERROR_SEM_TIMEOUT)
|
||||||
{
|
{
|
||||||
// Semaphore timeout
|
|
||||||
NOTICE_LOG(WIIMOTE, "IOWrite[WWM_SET_OUTPUT_REPORT]: Unable to send data to the Wiimote");
|
NOTICE_LOG(WIIMOTE, "IOWrite[WWM_SET_OUTPUT_REPORT]: Unable to send data to the Wiimote");
|
||||||
}
|
}
|
||||||
else if (err != 0x1F) // Some third-party adapters (DolphinBar) use this
|
else if (err != ERROR_GEN_FAILURE)
|
||||||
// error code to signal the absence of a Wiimote
|
|
||||||
// linked to the HID device.
|
|
||||||
{
|
{
|
||||||
|
// Some third-party adapters (DolphinBar) use this
|
||||||
|
// error code to signal the absence of a Wiimote
|
||||||
|
// linked to the HID device.
|
||||||
WARN_LOG(WIIMOTE, "IOWrite[WWM_SET_OUTPUT_REPORT]: Error: %08x", err);
|
WARN_LOG(WIIMOTE, "IOWrite[WWM_SET_OUTPUT_REPORT]: Error: %08x", err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user