Move shared Wiimote files into WiimoteCommon
This commit is contained in:
parent
4d52df150b
commit
823dba47f5
|
@ -0,0 +1,58 @@
|
|||
// Copyright 2017 Dolphin Emulator Project
|
||||
// Licensed under GPLv2+
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Wiimote internal codes
|
||||
|
||||
// Communication channels
|
||||
enum WiimoteChannel
|
||||
{
|
||||
WC_OUTPUT = 0x11,
|
||||
WC_INPUT = 0x13
|
||||
};
|
||||
|
||||
// The 4 most significant bits of the first byte of an outgoing command must be
|
||||
// 0x50 if sending on the command channel and 0xA0 if sending on the interrupt
|
||||
// channel. On Mac and Linux we use interrupt channel; on Windows, command.
|
||||
enum WiimoteReport
|
||||
{
|
||||
#ifdef _WIN32
|
||||
WR_SET_REPORT = 0x50
|
||||
#else
|
||||
WR_SET_REPORT = 0xA0
|
||||
#endif
|
||||
};
|
||||
|
||||
enum WiimoteBT
|
||||
{
|
||||
BT_INPUT = 0x01,
|
||||
BT_OUTPUT = 0x02
|
||||
};
|
||||
|
||||
// LED bit masks
|
||||
enum WiimoteLED
|
||||
{
|
||||
LED_NONE = 0x00,
|
||||
LED_1 = 0x10,
|
||||
LED_2 = 0x20,
|
||||
LED_3 = 0x40,
|
||||
LED_4 = 0x80
|
||||
};
|
||||
|
||||
enum WiimoteSpace
|
||||
{
|
||||
WS_EEPROM = 0x00,
|
||||
WS_REGS1 = 0x01,
|
||||
WS_REGS2 = 0x02
|
||||
};
|
||||
|
||||
enum WiimoteReadError
|
||||
{
|
||||
RDERR_WOREG = 7,
|
||||
RDERR_NOMEM = 8
|
||||
};
|
||||
|
||||
constexpr u8 MAX_PAYLOAD = 23;
|
||||
constexpr u32 WIIMOTE_DEFAULT_TIMEOUT = 1000;
|
|
@ -0,0 +1,34 @@
|
|||
// Copyright 2017 Dolphin Emulator Project
|
||||
// Licensed under GPLv2+
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "Common/CommonTypes.h"
|
||||
|
||||
// what is this ?
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable : 4200)
|
||||
#endif
|
||||
|
||||
#pragma pack(push, 1)
|
||||
|
||||
// Source: HID_010_SPC_PFL/1.0 (official HID specification)
|
||||
|
||||
struct hid_packet
|
||||
{
|
||||
u8 param : 4;
|
||||
u8 type : 4;
|
||||
u8 data[0];
|
||||
};
|
||||
|
||||
constexpr u8 HID_TYPE_HANDSHAKE = 0;
|
||||
constexpr u8 HID_TYPE_SET_REPORT = 5;
|
||||
constexpr u8 HID_TYPE_DATA = 0xA;
|
||||
|
||||
constexpr u8 HID_HANDSHAKE_SUCCESS = 0;
|
||||
|
||||
constexpr u8 HID_PARAM_INPUT = 1;
|
||||
constexpr u8 HID_PARAM_OUTPUT = 2;
|
||||
|
||||
#pragma pack(pop)
|
|
@ -1,37 +1,47 @@
|
|||
// Copyright 2008 Dolphin Emulator Project
|
||||
// Copyright 2017 Dolphin Emulator Project
|
||||
// Licensed under GPLv2+
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "Common/CommonTypes.h"
|
||||
|
||||
// what is this ?
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable : 4200)
|
||||
#endif
|
||||
typedef std::vector<u8> Report;
|
||||
|
||||
#pragma pack(push, 1)
|
||||
|
||||
// Source: HID_010_SPC_PFL/1.0 (official HID specification)
|
||||
|
||||
struct hid_packet
|
||||
// Report defines
|
||||
enum ReportType
|
||||
{
|
||||
u8 param : 4;
|
||||
u8 type : 4;
|
||||
u8 data[0];
|
||||
RT_RUMBLE = 0x10,
|
||||
RT_LEDS = 0x11,
|
||||
RT_REPORT_MODE = 0x12,
|
||||
RT_IR_PIXEL_CLOCK = 0x13,
|
||||
RT_SPEAKER_ENABLE = 0x14,
|
||||
RT_REQUEST_STATUS = 0x15,
|
||||
RT_WRITE_DATA = 0x16,
|
||||
RT_READ_DATA = 0x17,
|
||||
RT_WRITE_SPEAKER_DATA = 0x18,
|
||||
RT_SPEAKER_MUTE = 0x19,
|
||||
RT_IR_LOGIC = 0x1A,
|
||||
RT_STATUS_REPORT = 0x20,
|
||||
RT_READ_DATA_REPLY = 0x21,
|
||||
RT_ACK_DATA = 0x22,
|
||||
RT_REPORT_CORE = 0x30,
|
||||
RT_REPORT_CORE_ACCEL = 0x31,
|
||||
RT_REPORT_CORE_EXT8 = 0x32,
|
||||
RT_REPORT_CORE_ACCEL_IR12 = 0x33,
|
||||
RT_REPORT_CORE_EXT19 = 0x34,
|
||||
RT_REPORT_CORE_ACCEL_EXT16 = 0x35,
|
||||
RT_REPORT_CORE_IR10_EXT9 = 0x36,
|
||||
RT_REPORT_CORE_ACCEL_IR10_EXT6 = 0x37,
|
||||
RT_REPORT_EXT21 = 0x3d, // never used?
|
||||
RT_REPORT_INTERLEAVE1 = 0x3e,
|
||||
RT_REPORT_INTERLEAVE2 = 0x3f
|
||||
};
|
||||
|
||||
#define HID_TYPE_HANDSHAKE 0
|
||||
#define HID_TYPE_SET_REPORT 5
|
||||
#define HID_TYPE_DATA 0xA
|
||||
|
||||
#define HID_HANDSHAKE_SUCCESS 0
|
||||
|
||||
#define HID_PARAM_INPUT 1
|
||||
#define HID_PARAM_OUTPUT 2
|
||||
|
||||
// Source: http://wiibrew.org/wiki/Wiimote
|
||||
// Custom structs
|
||||
|
||||
union wm_buttons // also just called "core data"
|
||||
{
|
||||
|
@ -332,9 +342,6 @@ struct wm_report
|
|||
};
|
||||
};
|
||||
|
||||
#define WM_RUMBLE 0x10
|
||||
|
||||
#define WM_LEDS 0x11
|
||||
struct wm_leds
|
||||
{
|
||||
u8 rumble : 1;
|
||||
|
@ -343,7 +350,6 @@ struct wm_leds
|
|||
u8 leds : 4;
|
||||
};
|
||||
|
||||
#define WM_REPORT_MODE 0x12
|
||||
struct wm_report_mode
|
||||
{
|
||||
u8 rumble : 1;
|
||||
|
@ -354,17 +360,12 @@ struct wm_report_mode
|
|||
u8 mode;
|
||||
};
|
||||
|
||||
#define WM_IR_PIXEL_CLOCK 0x13
|
||||
#define WM_IR_LOGIC 0x1A
|
||||
|
||||
#define WM_REQUEST_STATUS 0x15
|
||||
struct wm_request_status
|
||||
{
|
||||
u8 rumble : 1;
|
||||
u8 : 7;
|
||||
};
|
||||
|
||||
#define WM_STATUS_REPORT 0x20
|
||||
struct wm_status_report
|
||||
{
|
||||
wm_buttons buttons;
|
||||
|
@ -377,7 +378,6 @@ struct wm_status_report
|
|||
u8 battery;
|
||||
};
|
||||
|
||||
#define WM_WRITE_DATA 0x16
|
||||
struct wm_write_data
|
||||
{
|
||||
u8 rumble : 1;
|
||||
|
@ -388,7 +388,6 @@ struct wm_write_data
|
|||
u8 data[16];
|
||||
};
|
||||
|
||||
#define WM_ACK_DATA 0x22
|
||||
struct wm_acknowledge
|
||||
{
|
||||
wm_buttons buttons;
|
||||
|
@ -396,7 +395,6 @@ struct wm_acknowledge
|
|||
u8 errorID;
|
||||
};
|
||||
|
||||
#define WM_READ_DATA 0x17
|
||||
struct wm_read_data
|
||||
{
|
||||
u8 rumble : 1;
|
||||
|
@ -406,12 +404,6 @@ struct wm_read_data
|
|||
u16 size;
|
||||
};
|
||||
|
||||
#define WM_SPACE_EEPROM 0
|
||||
#define WM_SPACE_REGS1 1
|
||||
#define WM_SPACE_REGS2 2
|
||||
#define WM_SPACE_INVALID 3
|
||||
|
||||
#define WM_READ_DATA_REPLY 0x21
|
||||
struct wm_read_data_reply
|
||||
{
|
||||
wm_buttons buttons;
|
||||
|
@ -421,27 +413,19 @@ struct wm_read_data_reply
|
|||
u8 data[16];
|
||||
};
|
||||
|
||||
#define WM_RDERR_WOREG 7
|
||||
#define WM_RDERR_NOMEM 8
|
||||
|
||||
// Data reports
|
||||
|
||||
#define WM_REPORT_CORE 0x30
|
||||
struct wm_report_core
|
||||
{
|
||||
wm_buttons c;
|
||||
};
|
||||
|
||||
#define WM_REPORT_CORE_ACCEL 0x31
|
||||
struct wm_report_core_accel
|
||||
{
|
||||
wm_buttons c;
|
||||
wm_accel a;
|
||||
};
|
||||
|
||||
#define WM_REPORT_CORE_EXT8 0x32
|
||||
|
||||
#define WM_REPORT_CORE_ACCEL_IR12 0x33
|
||||
struct wm_report_core_accel_ir12
|
||||
{
|
||||
wm_buttons c;
|
||||
|
@ -449,8 +433,6 @@ struct wm_report_core_accel_ir12
|
|||
wm_ir_extended ir[4];
|
||||
};
|
||||
|
||||
#define WM_REPORT_CORE_EXT19 0x34
|
||||
#define WM_REPORT_CORE_ACCEL_EXT16 0x35
|
||||
struct wm_report_core_accel_ext16
|
||||
{
|
||||
wm_buttons c;
|
||||
|
@ -460,9 +442,6 @@ struct wm_report_core_accel_ext16
|
|||
u8 pad[10];
|
||||
};
|
||||
|
||||
#define WM_REPORT_CORE_IR10_EXT9 0x36
|
||||
|
||||
#define WM_REPORT_CORE_ACCEL_IR10_EXT6 0x37
|
||||
struct wm_report_core_accel_ir10_ext6
|
||||
{
|
||||
wm_buttons c;
|
||||
|
@ -472,25 +451,14 @@ struct wm_report_core_accel_ir10_ext6
|
|||
wm_nc ext; // TODO: Does this make any sense? Shouldn't it be just a general "extension" field?
|
||||
};
|
||||
|
||||
#define WM_REPORT_EXT21 0x3d // never used?
|
||||
struct wm_report_ext21
|
||||
{
|
||||
u8 ext[21];
|
||||
};
|
||||
|
||||
#define WM_REPORT_INTERLEAVE1 0x3e
|
||||
#define WM_REPORT_INTERLEAVE2 0x3f
|
||||
|
||||
#define WM_SPEAKER_ENABLE 0x14
|
||||
#define WM_SPEAKER_MUTE 0x19
|
||||
#define WM_WRITE_SPEAKER_DATA 0x18
|
||||
struct wm_speaker_data
|
||||
{
|
||||
u8 unknown : 3;
|
||||
u8 length : 5;
|
||||
u8 data[20];
|
||||
};
|
||||
|
||||
// Custom structs
|
||||
|
||||
#pragma pack(pop)
|
|
@ -27,9 +27,9 @@
|
|||
#include "Common/MsgHandler.h"
|
||||
#include "Common/Swap.h"
|
||||
#include "Core/Core.h"
|
||||
#include "Core/HW/WiimoteCommon/WiimoteHid.h"
|
||||
#include "Core/HW/WiimoteEmu/Attachment/Attachment.h"
|
||||
#include "Core/HW/WiimoteEmu/WiimoteEmu.h"
|
||||
#include "Core/HW/WiimoteEmu/WiimoteHid.h"
|
||||
#include "Core/HW/WiimoteReal/WiimoteReal.h"
|
||||
#include "InputCommon/ControllerEmu/ControlGroup/Extension.h"
|
||||
|
||||
|
@ -53,7 +53,7 @@ void Wiimote::ReportMode(const wm_report_mode* const dr)
|
|||
|
||||
if (dr->mode > 0x37)
|
||||
PanicAlert("Wiimote: Unsupported Reporting mode.");
|
||||
else if (dr->mode < WM_REPORT_CORE)
|
||||
else if (dr->mode < RT_REPORT_CORE)
|
||||
PanicAlert("Wiimote: Reporting mode < 0x30.");
|
||||
}
|
||||
|
||||
|
@ -81,28 +81,28 @@ void Wiimote::HidOutputReport(const wm_report* const sr, const bool send_ack)
|
|||
|
||||
switch (sr->wm)
|
||||
{
|
||||
case WM_RUMBLE: // 0x10
|
||||
case RT_RUMBLE: // 0x10
|
||||
// this is handled above
|
||||
return; // no ack
|
||||
break;
|
||||
|
||||
case WM_LEDS: // 0x11
|
||||
case RT_LEDS: // 0x11
|
||||
// INFO_LOG(WIIMOTE, "Set LEDs: 0x%02x", sr->data[0]);
|
||||
m_status.leds = sr->data[0] >> 4;
|
||||
break;
|
||||
|
||||
case WM_REPORT_MODE: // 0x12
|
||||
case RT_REPORT_MODE: // 0x12
|
||||
ReportMode((wm_report_mode*)sr->data);
|
||||
break;
|
||||
|
||||
case WM_IR_PIXEL_CLOCK: // 0x13
|
||||
case RT_IR_PIXEL_CLOCK: // 0x13
|
||||
// INFO_LOG(WIIMOTE, "WM IR Clock: 0x%02x", sr->data[0]);
|
||||
// m_ir_clock = sr->enable;
|
||||
if (false == sr->ack)
|
||||
return;
|
||||
break;
|
||||
|
||||
case WM_SPEAKER_ENABLE: // 0x14
|
||||
case RT_SPEAKER_ENABLE: // 0x14
|
||||
// ERROR_LOG(WIIMOTE, "WM Speaker Enable: %02x", sr->enable);
|
||||
// PanicAlert( "WM Speaker Enable: %d", sr->data[0] );
|
||||
m_status.speaker = sr->enable;
|
||||
|
@ -110,32 +110,32 @@ void Wiimote::HidOutputReport(const wm_report* const sr, const bool send_ack)
|
|||
return;
|
||||
break;
|
||||
|
||||
case WM_REQUEST_STATUS: // 0x15
|
||||
case RT_REQUEST_STATUS: // 0x15
|
||||
if (WIIMOTE_SRC_EMU & g_wiimote_sources[m_index])
|
||||
RequestStatus((wm_request_status*)sr->data);
|
||||
return; // sends its own ack
|
||||
break;
|
||||
|
||||
case WM_WRITE_DATA: // 0x16
|
||||
case RT_WRITE_DATA: // 0x16
|
||||
WriteData((wm_write_data*)sr->data);
|
||||
break;
|
||||
|
||||
case WM_READ_DATA: // 0x17
|
||||
case RT_READ_DATA: // 0x17
|
||||
if (WIIMOTE_SRC_EMU & g_wiimote_sources[m_index])
|
||||
ReadData((wm_read_data*)sr->data);
|
||||
return; // sends its own ack
|
||||
break;
|
||||
|
||||
case WM_WRITE_SPEAKER_DATA: // 0x18
|
||||
case RT_WRITE_SPEAKER_DATA: // 0x18
|
||||
// wm_speaker_data *spkz = (wm_speaker_data*)sr->data;
|
||||
// ERROR_LOG(WIIMOTE, "WM_WRITE_SPEAKER_DATA len:%x %s", spkz->length,
|
||||
// ERROR_LOG(WIIMOTE, "RT_WRITE_SPEAKER_DATA len:%x %s", spkz->length,
|
||||
// ArrayToString(spkz->data, spkz->length, 100, false).c_str());
|
||||
if (WIIMOTE_SRC_EMU & g_wiimote_sources[m_index] && !m_speaker_mute)
|
||||
Wiimote::SpeakerData((wm_speaker_data*)sr->data);
|
||||
return; // no ack
|
||||
break;
|
||||
|
||||
case WM_SPEAKER_MUTE: // 0x19
|
||||
case RT_SPEAKER_MUTE: // 0x19
|
||||
// ERROR_LOG(WIIMOTE, "WM Speaker Mute: %02x", sr->enable);
|
||||
// PanicAlert( "WM Speaker Mute: %d", sr->data[0] & 0x04 );
|
||||
// testing
|
||||
|
@ -146,7 +146,7 @@ void Wiimote::HidOutputReport(const wm_report* const sr, const bool send_ack)
|
|||
return;
|
||||
break;
|
||||
|
||||
case WM_IR_LOGIC: // 0x1a
|
||||
case RT_IR_LOGIC: // 0x1a
|
||||
// comment from old plugin:
|
||||
// This enables or disables the IR lights, we update the global variable g_IR
|
||||
// so that WmRequestStatus() knows about it
|
||||
|
@ -177,7 +177,7 @@ void Wiimote::SendAck(u8 _reportID)
|
|||
u8 data[6];
|
||||
|
||||
data[0] = 0xA1;
|
||||
data[1] = WM_ACK_DATA;
|
||||
data[1] = RT_ACK_DATA;
|
||||
|
||||
wm_acknowledge* const ack = (wm_acknowledge*)(data + 2);
|
||||
|
||||
|
@ -223,7 +223,7 @@ void Wiimote::RequestStatus(const wm_request_status* const rs)
|
|||
// set up report
|
||||
u8 data[8];
|
||||
data[0] = 0xA1;
|
||||
data[1] = WM_STATUS_REPORT;
|
||||
data[1] = RT_STATUS_REPORT;
|
||||
|
||||
// status values
|
||||
*(wm_status_report*)(data + 2) = m_status;
|
||||
|
@ -238,7 +238,7 @@ void Wiimote::RequestStatus(const wm_request_status* const rs)
|
|||
if (g_wiimotes[m_index])
|
||||
{
|
||||
wm_request_status rpt = {};
|
||||
g_wiimotes[m_index]->QueueReport(WM_REQUEST_STATUS, &rpt, sizeof(rpt));
|
||||
g_wiimotes[m_index]->QueueReport(RT_REQUEST_STATUS, &rpt, sizeof(rpt));
|
||||
}
|
||||
|
||||
return;
|
||||
|
@ -264,7 +264,7 @@ void Wiimote::WriteData(const wm_write_data* const wd)
|
|||
|
||||
switch (wd->space)
|
||||
{
|
||||
case WM_SPACE_EEPROM:
|
||||
case WS_EEPROM:
|
||||
{
|
||||
// Write to EEPROM
|
||||
|
||||
|
@ -290,8 +290,8 @@ void Wiimote::WriteData(const wm_write_data* const wd)
|
|||
}
|
||||
break;
|
||||
|
||||
case WM_SPACE_REGS1:
|
||||
case WM_SPACE_REGS2:
|
||||
case WS_REGS1:
|
||||
case WS_REGS2:
|
||||
{
|
||||
// Write to Control Register
|
||||
|
||||
|
@ -405,7 +405,7 @@ void Wiimote::ReadData(const wm_read_data* const rd)
|
|||
|
||||
switch (rd->space)
|
||||
{
|
||||
case WM_SPACE_EEPROM:
|
||||
case WS_EEPROM:
|
||||
{
|
||||
// PanicAlert("ReadData: reading from EEPROM: address: 0x%x size: 0x%x", address, size);
|
||||
// Read from EEPROM
|
||||
|
@ -438,8 +438,8 @@ void Wiimote::ReadData(const wm_read_data* const rd)
|
|||
}
|
||||
break;
|
||||
|
||||
case WM_SPACE_REGS1:
|
||||
case WM_SPACE_REGS2:
|
||||
case WS_REGS1:
|
||||
case WS_REGS2:
|
||||
{
|
||||
// Read from Control Register
|
||||
|
||||
|
@ -533,7 +533,7 @@ void Wiimote::SendReadDataReply(ReadRequest& _request)
|
|||
{
|
||||
u8 data[23];
|
||||
data[0] = 0xA1;
|
||||
data[1] = WM_READ_DATA_REPLY;
|
||||
data[1] = RT_READ_DATA_REPLY;
|
||||
|
||||
wm_read_data_reply* const reply = (wm_read_data_reply*)(data + 2);
|
||||
reply->buttons = m_status.buttons;
|
||||
|
|
|
@ -15,13 +15,15 @@
|
|||
|
||||
#include "Core/ConfigManager.h"
|
||||
#include "Core/Core.h"
|
||||
#include "Core/HW/Wiimote.h"
|
||||
#include "Core/HW/WiimoteCommon/WiimoteConstants.h"
|
||||
#include "Core/HW/WiimoteCommon/WiimoteHid.h"
|
||||
#include "Core/HW/WiimoteEmu/Attachment/Classic.h"
|
||||
#include "Core/HW/WiimoteEmu/Attachment/Drums.h"
|
||||
#include "Core/HW/WiimoteEmu/Attachment/Guitar.h"
|
||||
#include "Core/HW/WiimoteEmu/Attachment/Nunchuk.h"
|
||||
#include "Core/HW/WiimoteEmu/Attachment/Turntable.h"
|
||||
#include "Core/HW/WiimoteEmu/MatrixMath.h"
|
||||
#include "Core/HW/WiimoteEmu/WiimoteHid.h"
|
||||
#include "Core/HW/WiimoteReal/WiimoteReal.h"
|
||||
#include "Core/Host.h"
|
||||
#include "Core/Movie.h"
|
||||
|
@ -195,7 +197,7 @@ static const char* const named_buttons[] = {
|
|||
|
||||
void Wiimote::Reset()
|
||||
{
|
||||
m_reporting_mode = WM_REPORT_CORE;
|
||||
m_reporting_mode = RT_REPORT_CORE;
|
||||
// i think these two are good
|
||||
m_reporting_channel = 0;
|
||||
m_reporting_auto = false;
|
||||
|
@ -726,7 +728,7 @@ void Wiimote::Update()
|
|||
|
||||
m_status.battery = (u8)(m_battery_setting->GetValue() * 100);
|
||||
|
||||
const ReportFeatures& rptf = reporting_mode_features[m_reporting_mode - WM_REPORT_CORE];
|
||||
const ReportFeatures& rptf = reporting_mode_features[m_reporting_mode - RT_REPORT_CORE];
|
||||
s8 rptf_size = rptf.size;
|
||||
if (Movie::IsPlayingInput() &&
|
||||
Movie::PlayWiimote(m_index, data, rptf, m_extension->active_extension, m_ext_key))
|
||||
|
@ -776,10 +778,10 @@ void Wiimote::Update()
|
|||
{
|
||||
// use data reports
|
||||
default:
|
||||
if (real_data[1] >= WM_REPORT_CORE)
|
||||
if (real_data[1] >= RT_REPORT_CORE)
|
||||
{
|
||||
const ReportFeatures& real_rptf =
|
||||
reporting_mode_features[real_data[1] - WM_REPORT_CORE];
|
||||
reporting_mode_features[real_data[1] - RT_REPORT_CORE];
|
||||
|
||||
// force same report type from real-Wiimote
|
||||
if (&real_rptf != &rptf)
|
||||
|
@ -807,7 +809,7 @@ void Wiimote::Update()
|
|||
memcpy(data + rptf.ext, real_data + real_rptf.ext,
|
||||
sizeof(wm_nc)); // TODO: Why NC specific?
|
||||
}
|
||||
else if (WM_ACK_DATA != real_data[1] || m_extension->active_extension > 0)
|
||||
else if (real_data[1] != RT_ACK_DATA || m_extension->active_extension > 0)
|
||||
rptf_size = 0;
|
||||
else
|
||||
// use real-acks if an emu-extension isn't chosen
|
||||
|
@ -815,7 +817,7 @@ void Wiimote::Update()
|
|||
break;
|
||||
|
||||
// use all status reports, after modification of the extension bit
|
||||
case WM_STATUS_REPORT:
|
||||
case RT_STATUS_REPORT:
|
||||
// if (m_extension->switch_extension)
|
||||
//((wm_status_report*)(real_data + 2))->extension = (m_extension->active_extension > 0);
|
||||
if (m_extension->active_extension)
|
||||
|
@ -824,7 +826,7 @@ void Wiimote::Update()
|
|||
break;
|
||||
|
||||
// use all read-data replies
|
||||
case WM_READ_DATA_REPLY:
|
||||
case RT_READ_DATA_REPLY:
|
||||
rptf_size = -1;
|
||||
break;
|
||||
}
|
||||
|
@ -851,7 +853,7 @@ void Wiimote::Update()
|
|||
Movie::CheckWiimoteStatus(m_index, data, rptf, m_extension->active_extension, m_ext_key);
|
||||
|
||||
// don't send a data report if auto reporting is off
|
||||
if (false == m_reporting_auto && data[1] >= WM_REPORT_CORE)
|
||||
if (false == m_reporting_auto && data[1] >= RT_REPORT_CORE)
|
||||
return;
|
||||
|
||||
// send data report
|
||||
|
@ -935,8 +937,8 @@ void Wiimote::InterruptChannel(const u16 _channelID, const void* _pData, u32 _Si
|
|||
switch (sr->wm)
|
||||
{
|
||||
// these two types are handled in RequestStatus() & ReadData()
|
||||
case WM_REQUEST_STATUS:
|
||||
case WM_READ_DATA:
|
||||
case RT_REQUEST_STATUS:
|
||||
case RT_READ_DATA:
|
||||
if (WIIMOTE_SRC_REAL == g_wiimote_sources[m_index])
|
||||
WiimoteReal::InterruptChannel(m_index, _channelID, _pData, _Size);
|
||||
break;
|
||||
|
|
|
@ -7,8 +7,9 @@
|
|||
#include <queue>
|
||||
#include <string>
|
||||
|
||||
#include "Core/HW/WiimoteCommon/WiimoteHid.h"
|
||||
#include "Core/HW/WiimoteCommon/WiimoteReport.h"
|
||||
#include "Core/HW/WiimoteEmu/Encryption.h"
|
||||
#include "Core/HW/WiimoteEmu/WiimoteHid.h"
|
||||
#include "InputCommon/ControllerEmu/ControllerEmu.h"
|
||||
|
||||
// Registry sizes
|
||||
|
|
|
@ -139,7 +139,7 @@ bool WiimoteLinux::ConnectInternal()
|
|||
addr.l2_cid = 0;
|
||||
|
||||
// Output channel
|
||||
addr.l2_psm = htobs(WM_OUTPUT_CHANNEL);
|
||||
addr.l2_psm = htobs(WC_OUTPUT);
|
||||
if ((m_cmd_sock = socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP)) == -1 ||
|
||||
connect(m_cmd_sock, (sockaddr*)&addr, sizeof(addr)) < 0)
|
||||
{
|
||||
|
@ -150,7 +150,7 @@ bool WiimoteLinux::ConnectInternal()
|
|||
}
|
||||
|
||||
// Input channel
|
||||
addr.l2_psm = htobs(WM_INPUT_CHANNEL);
|
||||
addr.l2_psm = htobs(WC_INPUT);
|
||||
if ((m_int_sock = socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP)) == -1 ||
|
||||
connect(m_int_sock, (sockaddr*)&addr, sizeof(addr)) < 0)
|
||||
{
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include "Common/CommonTypes.h"
|
||||
#include "Common/Logging/Log.h"
|
||||
#include "Common/Thread.h"
|
||||
#include "Core/HW/WiimoteCommon/WiimoteConstants.h"
|
||||
#include "Core/HW/WiimoteReal/IOWin.h"
|
||||
|
||||
// Create func_t function pointer type and declare a nullptr-initialized static variable of that
|
||||
|
@ -366,7 +367,7 @@ static bool IsWiimote(const std::basic_string<TCHAR>& device_path, WinWriteMetho
|
|||
return false;
|
||||
|
||||
u8 buf[MAX_PAYLOAD];
|
||||
u8 const req_status_report[] = {WM_SET_REPORT | WM_BT_OUTPUT, WM_REQUEST_STATUS, 0};
|
||||
u8 const req_status_report[] = {WR_SET_REPORT | BT_OUTPUT, RT_REQUEST_STATUS, 0};
|
||||
int invalid_report_count = 0;
|
||||
int rc = WriteToHandle(dev_handle, method, req_status_report, sizeof(req_status_report));
|
||||
while (rc > 0)
|
||||
|
@ -377,7 +378,7 @@ static bool IsWiimote(const std::basic_string<TCHAR>& device_path, WinWriteMetho
|
|||
|
||||
switch (buf[1])
|
||||
{
|
||||
case WM_STATUS_REPORT:
|
||||
case RT_STATUS_REPORT:
|
||||
return true;
|
||||
default:
|
||||
WARN_LOG(WIIMOTE, "IsWiimote(): Received unexpected report %02x", buf[1]);
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
#include <windows.h>
|
||||
|
||||
#include "Common/StringUtil.h"
|
||||
#include "Core/HW/WiimoteEmu/WiimoteHid.h"
|
||||
#include "Core/HW/WiimoteCommon/WiimoteHid.h"
|
||||
#include "Core/HW/WiimoteReal/WiimoteReal.h"
|
||||
|
||||
namespace WiimoteReal
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#include "Core/HW/WiimoteReal/IOdarwin.h"
|
||||
#include "Common/Common.h"
|
||||
#include "Common/Logging/Log.h"
|
||||
#include "Core/HW/WiimoteEmu/WiimoteHid.h"
|
||||
#include "Core/HW/WiimoteCommon/WiimoteHid.h"
|
||||
#include "Core/HW/WiimoteReal/IOdarwin_private.h"
|
||||
|
||||
@interface SearchBT : NSObject
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
#include "Common/Assert.h"
|
||||
#include "Common/Logging/Log.h"
|
||||
#include "Common/StringUtil.h"
|
||||
#include "Core/HW/WiimoteEmu/WiimoteHid.h"
|
||||
#include "Core/HW/WiimoteCommon/WiimoteHid.h"
|
||||
#include "Core/HW/WiimoteReal/IOhidapi.h"
|
||||
|
||||
static bool IsDeviceUsable(const std::string& device_path)
|
||||
|
@ -23,7 +23,7 @@ static bool IsDeviceUsable(const std::string& device_path)
|
|||
// Some third-party adapters (DolphinBar) always expose all four Wii Remotes as HIDs
|
||||
// even when they are not connected, which causes an endless error loop when we try to use them.
|
||||
// Try to write a report to the device to see if this Wii Remote is really usable.
|
||||
static const u8 report[] = {WM_SET_REPORT | WM_BT_OUTPUT, WM_REQUEST_STATUS, 0};
|
||||
static const u8 report[] = {WR_SET_REPORT | BT_OUTPUT, RT_REQUEST_STATUS, 0};
|
||||
const int result = hid_write(handle, report, sizeof(report));
|
||||
// The DolphinBar uses EPIPE to signal the absence of a Wii Remote connected to this HID.
|
||||
if (result == -1 && errno != EPIPE)
|
||||
|
@ -128,13 +128,13 @@ int WiimoteHidapi::IORead(u8* buf)
|
|||
{
|
||||
return -1; // didn't read packet
|
||||
}
|
||||
buf[0] = WM_SET_REPORT | WM_BT_INPUT;
|
||||
buf[0] = WR_SET_REPORT | BT_INPUT;
|
||||
return result + 1; // number of bytes read
|
||||
}
|
||||
|
||||
int WiimoteHidapi::IOWrite(const u8* buf, size_t len)
|
||||
{
|
||||
_dbg_assert_(WIIMOTE, buf[0] == (WM_SET_REPORT | WM_BT_OUTPUT));
|
||||
_dbg_assert_(WIIMOTE, buf[0] == (WR_SET_REPORT | BT_OUTPUT));
|
||||
int result = hid_write(m_handle, buf + 1, len - 1);
|
||||
if (result == -1)
|
||||
{
|
||||
|
|
|
@ -17,8 +17,8 @@
|
|||
#include "Common/Thread.h"
|
||||
#include "Core/ConfigManager.h"
|
||||
#include "Core/Core.h"
|
||||
#include "Core/HW/WiimoteCommon/WiimoteHid.h"
|
||||
#include "Core/HW/WiimoteEmu/WiimoteEmu.h"
|
||||
#include "Core/HW/WiimoteEmu/WiimoteHid.h"
|
||||
#include "Core/HW/WiimoteReal/IOAndroid.h"
|
||||
#include "Core/HW/WiimoteReal/IOLinux.h"
|
||||
#include "Core/HW/WiimoteReal/IOWin.h"
|
||||
|
@ -70,7 +70,7 @@ void Wiimote::WriteReport(Report rpt)
|
|||
bool const new_rumble_state = (rpt[2] & 0x1) != 0;
|
||||
|
||||
// If this is a rumble report and the rumble state didn't change, ignore.
|
||||
if (WM_RUMBLE == rpt[1] && new_rumble_state == m_rumble_state)
|
||||
if (rpt[1] == RT_RUMBLE && new_rumble_state == m_rumble_state)
|
||||
return;
|
||||
|
||||
m_rumble_state = new_rumble_state;
|
||||
|
@ -86,7 +86,7 @@ void Wiimote::QueueReport(u8 rpt_id, const void* _data, unsigned int size)
|
|||
auto const data = static_cast<const u8*>(_data);
|
||||
|
||||
Report rpt(size + 2);
|
||||
rpt[0] = WM_SET_REPORT | WM_BT_OUTPUT;
|
||||
rpt[0] = WR_SET_REPORT | BT_OUTPUT;
|
||||
rpt[1] = rpt_id;
|
||||
std::copy_n(data, size, rpt.begin() + 2);
|
||||
WriteReport(std::move(rpt));
|
||||
|
@ -98,11 +98,11 @@ void Wiimote::DisableDataReporting()
|
|||
|
||||
// This probably accomplishes nothing.
|
||||
wm_report_mode rpt = {};
|
||||
rpt.mode = WM_REPORT_CORE;
|
||||
rpt.mode = RT_REPORT_CORE;
|
||||
rpt.all_the_time = 0;
|
||||
rpt.continuous = 0;
|
||||
rpt.rumble = 0;
|
||||
QueueReport(WM_REPORT_MODE, &rpt, sizeof(rpt));
|
||||
QueueReport(RT_REPORT_MODE, &rpt, sizeof(rpt));
|
||||
}
|
||||
|
||||
void Wiimote::EnableDataReporting(u8 mode)
|
||||
|
@ -113,7 +113,7 @@ void Wiimote::EnableDataReporting(u8 mode)
|
|||
rpt.mode = mode;
|
||||
rpt.all_the_time = 1;
|
||||
rpt.continuous = 1;
|
||||
QueueReport(WM_REPORT_MODE, &rpt, sizeof(rpt));
|
||||
QueueReport(RT_REPORT_MODE, &rpt, sizeof(rpt));
|
||||
}
|
||||
|
||||
void Wiimote::SetChannel(u16 channel)
|
||||
|
@ -173,12 +173,12 @@ void Wiimote::InterruptChannel(const u16 channel, const void* const _data, const
|
|||
// party ones don't.
|
||||
if (rpt[0] == 0xa2)
|
||||
{
|
||||
rpt[0] = WM_SET_REPORT | WM_BT_OUTPUT;
|
||||
rpt[0] = WR_SET_REPORT | BT_OUTPUT;
|
||||
}
|
||||
|
||||
// Disallow games from turning off all of the LEDs.
|
||||
// It makes Wiimote connection status confusing.
|
||||
if (rpt[1] == WM_LEDS)
|
||||
if (rpt[1] == RT_LEDS)
|
||||
{
|
||||
auto& leds_rpt = *reinterpret_cast<wm_leds*>(&rpt[2]);
|
||||
if (0 == leds_rpt.leds)
|
||||
|
@ -187,11 +187,11 @@ void Wiimote::InterruptChannel(const u16 channel, const void* const _data, const
|
|||
leds_rpt.leds = 0xf;
|
||||
}
|
||||
}
|
||||
else if (rpt[1] == WM_WRITE_SPEAKER_DATA && (!SConfig::GetInstance().m_WiimoteEnableSpeaker ||
|
||||
else if (rpt[1] == RT_WRITE_SPEAKER_DATA && (!SConfig::GetInstance().m_WiimoteEnableSpeaker ||
|
||||
(!wm->m_status.speaker || wm->m_speaker_mute)))
|
||||
{
|
||||
// Translate speaker data reports into rumble reports.
|
||||
rpt[1] = WM_RUMBLE;
|
||||
rpt[1] = RT_RUMBLE;
|
||||
// Keep only the rumble bit.
|
||||
rpt[2] &= 0x1;
|
||||
rpt.resize(3);
|
||||
|
@ -255,10 +255,10 @@ bool Wiimote::IsBalanceBoard()
|
|||
return false;
|
||||
// Initialise the extension by writing 0x55 to 0xa400f0, then writing 0x00 to 0xa400fb.
|
||||
static const u8 init_extension_rpt1[MAX_PAYLOAD] = {
|
||||
WM_SET_REPORT | WM_BT_OUTPUT, WM_WRITE_DATA, 0x04, 0xa4, 0x00, 0xf0, 0x01, 0x55};
|
||||
WR_SET_REPORT | BT_OUTPUT, RT_WRITE_DATA, 0x04, 0xa4, 0x00, 0xf0, 0x01, 0x55};
|
||||
static const u8 init_extension_rpt2[MAX_PAYLOAD] = {
|
||||
WM_SET_REPORT | WM_BT_OUTPUT, WM_WRITE_DATA, 0x04, 0xa4, 0x00, 0xfb, 0x01, 0x00};
|
||||
static const u8 status_report[] = {WM_SET_REPORT | WM_BT_OUTPUT, WM_REQUEST_STATUS, 0};
|
||||
WR_SET_REPORT | BT_OUTPUT, RT_WRITE_DATA, 0x04, 0xa4, 0x00, 0xfb, 0x01, 0x00};
|
||||
static const u8 status_report[] = {WR_SET_REPORT | BT_OUTPUT, RT_REQUEST_STATUS, 0};
|
||||
if (!IOWrite(init_extension_rpt1, sizeof(init_extension_rpt1)) ||
|
||||
!IOWrite(init_extension_rpt2, sizeof(init_extension_rpt2)))
|
||||
{
|
||||
|
@ -276,7 +276,7 @@ bool Wiimote::IsBalanceBoard()
|
|||
|
||||
switch (buf[1])
|
||||
{
|
||||
case WM_STATUS_REPORT:
|
||||
case RT_STATUS_REPORT:
|
||||
{
|
||||
const auto* status = reinterpret_cast<wm_status_report*>(&buf[2]);
|
||||
// A Balance Board has a Balance Board extension.
|
||||
|
@ -284,11 +284,11 @@ bool Wiimote::IsBalanceBoard()
|
|||
return false;
|
||||
// Read two bytes from 0xa400fe to identify the extension.
|
||||
static const u8 identify_ext_rpt[] = {
|
||||
WM_SET_REPORT | WM_BT_OUTPUT, WM_READ_DATA, 0x04, 0xa4, 0x00, 0xfe, 0x02, 0x00};
|
||||
WR_SET_REPORT | BT_OUTPUT, RT_READ_DATA, 0x04, 0xa4, 0x00, 0xfe, 0x02, 0x00};
|
||||
ret = IOWrite(identify_ext_rpt, sizeof(identify_ext_rpt));
|
||||
break;
|
||||
}
|
||||
case WM_READ_DATA_REPLY:
|
||||
case RT_READ_DATA_REPLY:
|
||||
{
|
||||
const auto* reply = reinterpret_cast<wm_read_data_reply*>(&buf[2]);
|
||||
if (Common::swap16(reply->address) != 0x00fe)
|
||||
|
@ -300,10 +300,10 @@ bool Wiimote::IsBalanceBoard()
|
|||
// A Balance Board ext can be identified by checking for 0x0402.
|
||||
return reply->data[0] == 0x04 && reply->data[1] == 0x02;
|
||||
}
|
||||
case WM_ACK_DATA:
|
||||
case RT_ACK_DATA:
|
||||
{
|
||||
const auto* ack = reinterpret_cast<wm_acknowledge*>(&buf[2]);
|
||||
if (ack->reportID == WM_READ_DATA && ack->errorID != 0x00)
|
||||
if (ack->reportID == RT_READ_DATA && ack->errorID != 0x00)
|
||||
{
|
||||
WARN_LOG(WIIMOTE, "Failed to read from 0xa400fe, assuming Wiimote is not a Balance Board.");
|
||||
return false;
|
||||
|
@ -316,7 +316,7 @@ bool Wiimote::IsBalanceBoard()
|
|||
|
||||
static bool IsDataReport(const Report& rpt)
|
||||
{
|
||||
return rpt.size() >= 2 && rpt[1] >= WM_REPORT_CORE;
|
||||
return rpt.size() >= 2 && rpt[1] >= RT_REPORT_CORE;
|
||||
}
|
||||
|
||||
// Returns the next report that should be sent
|
||||
|
@ -376,16 +376,16 @@ void Wiimote::ConnectOnInput()
|
|||
{
|
||||
switch (rpt[1])
|
||||
{
|
||||
case WM_REPORT_CORE:
|
||||
case WM_REPORT_CORE_ACCEL:
|
||||
case WM_REPORT_CORE_EXT8:
|
||||
case WM_REPORT_CORE_ACCEL_IR12:
|
||||
case WM_REPORT_CORE_EXT19:
|
||||
case WM_REPORT_CORE_ACCEL_EXT16:
|
||||
case WM_REPORT_CORE_IR10_EXT9:
|
||||
case WM_REPORT_CORE_ACCEL_IR10_EXT6:
|
||||
case WM_REPORT_INTERLEAVE1:
|
||||
case WM_REPORT_INTERLEAVE2:
|
||||
case RT_REPORT_CORE:
|
||||
case RT_REPORT_CORE_ACCEL:
|
||||
case RT_REPORT_CORE_EXT8:
|
||||
case RT_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_INTERLEAVE1:
|
||||
case RT_REPORT_INTERLEAVE2:
|
||||
// check any button without checking accelerometer data
|
||||
if ((rpt[2] & 0x1F) != 0 || (rpt[3] & 0x9F) != 0)
|
||||
{
|
||||
|
@ -409,17 +409,17 @@ void Wiimote::Prepare()
|
|||
bool Wiimote::PrepareOnThread()
|
||||
{
|
||||
// core buttons, no continuous reporting
|
||||
u8 static const mode_report[] = {WM_SET_REPORT | WM_BT_OUTPUT, WM_REPORT_MODE, 0, WM_REPORT_CORE};
|
||||
u8 static const mode_report[] = {WR_SET_REPORT | BT_OUTPUT, RT_REPORT_MODE, 0, RT_REPORT_CORE};
|
||||
|
||||
// Set the active LEDs and turn on rumble.
|
||||
u8 static led_report[] = {WM_SET_REPORT | WM_BT_OUTPUT, WM_LEDS, 0};
|
||||
led_report[2] = u8(WIIMOTE_LED_1 << (m_index % WIIMOTE_BALANCE_BOARD) | 0x1);
|
||||
u8 static led_report[] = {WR_SET_REPORT | BT_OUTPUT, RT_LEDS, 0};
|
||||
led_report[2] = u8(WiimoteLED::LED_1 << (m_index % WIIMOTE_BALANCE_BOARD) | 0x1);
|
||||
|
||||
// Turn off rumble
|
||||
u8 static const rumble_report[] = {WM_SET_REPORT | WM_BT_OUTPUT, WM_RUMBLE, 0};
|
||||
u8 static const rumble_report[] = {WR_SET_REPORT | BT_OUTPUT, RT_RUMBLE, 0};
|
||||
|
||||
// Request status report
|
||||
u8 static const req_status_report[] = {WM_SET_REPORT | WM_BT_OUTPUT, WM_REQUEST_STATUS, 0};
|
||||
u8 static const req_status_report[] = {WR_SET_REPORT | BT_OUTPUT, RT_REQUEST_STATUS, 0};
|
||||
// TODO: check for sane response?
|
||||
|
||||
return (IOWrite(mode_report, sizeof(mode_report)) && IOWrite(led_report, sizeof(led_report)) &&
|
||||
|
@ -455,7 +455,7 @@ void Wiimote::EmuResume()
|
|||
rpt.mode = wm->m_reporting_mode;
|
||||
rpt.all_the_time = 1;
|
||||
rpt.continuous = 1;
|
||||
QueueReport(WM_REPORT_MODE, &rpt, sizeof(rpt));
|
||||
QueueReport(RT_REPORT_MODE, &rpt, sizeof(rpt));
|
||||
|
||||
NOTICE_LOG(WIIMOTE, "Resuming Wiimote data reporting.");
|
||||
|
||||
|
@ -467,10 +467,10 @@ void Wiimote::EmuPause()
|
|||
m_last_input_report.clear();
|
||||
|
||||
wm_report_mode rpt = {};
|
||||
rpt.mode = WM_REPORT_CORE;
|
||||
rpt.mode = RT_REPORT_CORE;
|
||||
rpt.all_the_time = 0;
|
||||
rpt.continuous = 0;
|
||||
QueueReport(WM_REPORT_MODE, &rpt, sizeof(rpt));
|
||||
QueueReport(RT_REPORT_MODE, &rpt, sizeof(rpt));
|
||||
|
||||
NOTICE_LOG(WIIMOTE, "Pausing Wiimote data reporting.");
|
||||
|
||||
|
|
|
@ -16,12 +16,12 @@
|
|||
#include "Common/Flag.h"
|
||||
#include "Common/NonCopyable.h"
|
||||
#include "Core/HW/Wiimote.h"
|
||||
#include "Core/HW/WiimoteReal/WiimoteRealBase.h"
|
||||
#include "Core/HW/WiimoteCommon/WiimoteConstants.h"
|
||||
#include "Core/HW/WiimoteCommon/WiimoteHid.h"
|
||||
#include "Core/HW/WiimoteCommon/WiimoteReport.h"
|
||||
|
||||
class PointerWrap;
|
||||
|
||||
typedef std::vector<u8> Report;
|
||||
|
||||
namespace WiimoteReal
|
||||
{
|
||||
class Wiimote : NonCopyable
|
||||
|
|
|
@ -1,36 +0,0 @@
|
|||
// Copyright 2010 Dolphin Emulator Project
|
||||
// Licensed under GPLv2+
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Wiimote internal codes
|
||||
|
||||
// Communication channels
|
||||
#define WM_OUTPUT_CHANNEL 0x11
|
||||
#define WM_INPUT_CHANNEL 0x13
|
||||
|
||||
// The 4 most significant bits of the first byte of an outgoing command must be
|
||||
// 0x50 if sending on the command channel and 0xA0 if sending on the interrupt
|
||||
// channel. On Mac and Linux we use interrupt channel; on Windows, command.
|
||||
#ifdef _WIN32
|
||||
#define WM_SET_REPORT 0x50
|
||||
#else
|
||||
#define WM_SET_REPORT 0xA0
|
||||
#endif
|
||||
|
||||
#define WM_BT_INPUT 0x01
|
||||
#define WM_BT_OUTPUT 0x02
|
||||
|
||||
// LED bit masks
|
||||
#define WIIMOTE_LED_NONE 0x00
|
||||
#define WIIMOTE_LED_1 0x10
|
||||
#define WIIMOTE_LED_2 0x20
|
||||
#define WIIMOTE_LED_3 0x40
|
||||
#define WIIMOTE_LED_4 0x80
|
||||
|
||||
// End Wiimote internal codes
|
||||
|
||||
// It's 23. NOT 32!
|
||||
#define MAX_PAYLOAD 23
|
||||
#define WIIMOTE_DEFAULT_TIMEOUT 1000
|
|
@ -33,8 +33,9 @@
|
|||
#include "Core/HW/ProcessorInterface.h"
|
||||
#include "Core/HW/SI/SI.h"
|
||||
#include "Core/HW/Wiimote.h"
|
||||
#include "Core/HW/WiimoteCommon/WiimoteHid.h"
|
||||
#include "Core/HW/WiimoteCommon/WiimoteReport.h"
|
||||
#include "Core/HW/WiimoteEmu/WiimoteEmu.h"
|
||||
#include "Core/HW/WiimoteEmu/WiimoteHid.h"
|
||||
#include "Core/IOS/USB/Bluetooth/BTEmu.h"
|
||||
#include "Core/IOS/USB/Bluetooth/WiimoteDevice.h"
|
||||
#include "Core/NetPlayProto.h"
|
||||
|
|
Loading…
Reference in New Issue