Converting HID API to use be<> auto swapping type.

This commit is contained in:
Ben Vanik
2014-08-19 22:50:21 -07:00
parent 48a0e5c601
commit fb98683ed3
24 changed files with 325 additions and 518 deletions

View File

@@ -11,21 +11,16 @@
#define XENIA_HID_WINKEY_WINKEY_HID_PRIVATE_H_
#include <xenia/core.h>
#include <xenia/hid/winkey/winkey_hid.h>
namespace xe {
namespace hid {
namespace winkey {
//
} // namespace winkey
} // namespace hid
} // namespace xe
#endif // XENIA_HID_WINKEY_WINKEY_HID_PRIVATE_H_

View File

@@ -11,34 +11,32 @@
#include <xenia/hid/winkey/winkey_input_driver.h>
namespace xe {
namespace hid {
namespace winkey {
using namespace xe;
using namespace xe::hid;
using namespace xe::hid::winkey;
void InitializeIfNeeded();
void CleanupOnShutdown();
namespace {
void InitializeIfNeeded();
void CleanupOnShutdown();
void InitializeIfNeeded() {
static bool has_initialized = false;
if (has_initialized) {
return;
}
has_initialized = true;
//
atexit(CleanupOnShutdown);
void InitializeIfNeeded() {
static bool has_initialized = false;
if (has_initialized) {
return;
}
has_initialized = true;
void CleanupOnShutdown() {
}
//
atexit(CleanupOnShutdown);
}
void CleanupOnShutdown() {}
InputDriver* xe::hid::winkey::Create(InputSystem* input_system) {
InitializeIfNeeded();
return new WinKeyInputDriver(input_system);
}
} // namespace winkey
} // namespace hid
} // namespace xe

View File

@@ -12,22 +12,17 @@
#include <xenia/core.h>
XEDECLARECLASS2(xe, hid, InputDriver);
XEDECLARECLASS2(xe, hid, InputSystem);
namespace xe {
namespace hid {
namespace winkey {
InputDriver* Create(InputSystem* input_system);
} // namespace winkey
} // namespace hid
} // namespace xe
#endif // XENIA_HID_WINKEY_WINKEY_HID_H_

View File

@@ -11,51 +11,44 @@
#include <xenia/hid/hid-private.h>
namespace xe {
namespace hid {
namespace winkey {
using namespace xe;
using namespace xe::hid;
using namespace xe::hid::winkey;
WinKeyInputDriver::WinKeyInputDriver(InputSystem* input_system)
: packet_number_(1), InputDriver(input_system) {}
WinKeyInputDriver::~WinKeyInputDriver() {}
WinKeyInputDriver::WinKeyInputDriver(InputSystem* input_system) :
packet_number_(1),
InputDriver(input_system) {
}
X_STATUS WinKeyInputDriver::Setup() { return X_STATUS_SUCCESS; }
WinKeyInputDriver::~WinKeyInputDriver() {
}
X_STATUS WinKeyInputDriver::Setup() {
return X_STATUS_SUCCESS;
}
X_RESULT WinKeyInputDriver::GetCapabilities(
uint32_t user_index, uint32_t flags, X_INPUT_CAPABILITIES& out_caps) {
X_RESULT WinKeyInputDriver::GetCapabilities(uint32_t user_index, uint32_t flags,
X_INPUT_CAPABILITIES* out_caps) {
if (user_index != 0) {
return X_ERROR_DEVICE_NOT_CONNECTED;
}
// TODO(benvanik): confirm with a real XInput controller.
out_caps.type = 0x01; // XINPUT_DEVTYPE_GAMEPAD
out_caps.sub_type = 0x01; // XINPUT_DEVSUBTYPE_GAMEPAD
out_caps.flags = 0;
out_caps.gamepad.buttons = 0xFFFF;
out_caps.gamepad.left_trigger = 0xFF;
out_caps.gamepad.right_trigger = 0xFF;
out_caps.gamepad.thumb_lx = (int16_t)0xFFFF;
out_caps.gamepad.thumb_ly = (int16_t)0xFFFF;
out_caps.gamepad.thumb_rx = (int16_t)0xFFFF;
out_caps.gamepad.thumb_ry = (int16_t)0xFFFF;
out_caps.vibration.left_motor_speed = 0;
out_caps.vibration.right_motor_speed = 0;
out_caps->type = 0x01; // XINPUT_DEVTYPE_GAMEPAD
out_caps->sub_type = 0x01; // XINPUT_DEVSUBTYPE_GAMEPAD
out_caps->flags = 0;
out_caps->gamepad.buttons = 0xFFFF;
out_caps->gamepad.left_trigger = 0xFF;
out_caps->gamepad.right_trigger = 0xFF;
out_caps->gamepad.thumb_lx = (int16_t)0xFFFF;
out_caps->gamepad.thumb_ly = (int16_t)0xFFFF;
out_caps->gamepad.thumb_rx = (int16_t)0xFFFF;
out_caps->gamepad.thumb_ry = (int16_t)0xFFFF;
out_caps->vibration.left_motor_speed = 0;
out_caps->vibration.right_motor_speed = 0;
return X_ERROR_SUCCESS;
}
#define IS_KEY_TOGGLED(key) ((GetKeyState(key) & 0x1) == 0x1)
#define IS_KEY_DOWN(key) ((GetAsyncKeyState(key) & 0x8000) == 0x8000)
X_RESULT WinKeyInputDriver::GetState(
uint32_t user_index, X_INPUT_STATE& out_state) {
X_RESULT WinKeyInputDriver::GetState(uint32_t user_index,
X_INPUT_STATE* out_state) {
if (user_index != 0) {
return X_ERROR_DEVICE_NOT_CONNECTED;
}
@@ -74,19 +67,19 @@ X_RESULT WinKeyInputDriver::GetState(
// dpad toggled
if (IS_KEY_DOWN(0x41)) {
// A
buttons |= 0x0004; // XINPUT_GAMEPAD_DPAD_LEFT
buttons |= 0x0004; // XINPUT_GAMEPAD_DPAD_LEFT
}
if (IS_KEY_DOWN(0x44)) {
// D
buttons |= 0x0008; // XINPUT_GAMEPAD_DPAD_RIGHT
buttons |= 0x0008; // XINPUT_GAMEPAD_DPAD_RIGHT
}
if (IS_KEY_DOWN(0x53)) {
// S
buttons |= 0x0002; // XINPUT_GAMEPAD_DPAD_DOWN
buttons |= 0x0002; // XINPUT_GAMEPAD_DPAD_DOWN
}
if (IS_KEY_DOWN(0x57)) {
// W
buttons |= 0x0001; // XINPUT_GAMEPAD_DPAD_UP
buttons |= 0x0001; // XINPUT_GAMEPAD_DPAD_UP
}
} else {
// left stick
@@ -110,44 +103,44 @@ X_RESULT WinKeyInputDriver::GetState(
if (IS_KEY_DOWN(0x4C)) {
// L
buttons |= 0x4000; // XINPUT_GAMEPAD_X
buttons |= 0x4000; // XINPUT_GAMEPAD_X
}
if (IS_KEY_DOWN(VK_OEM_7)) {
// '
buttons |= 0x2000; // XINPUT_GAMEPAD_B
buttons |= 0x2000; // XINPUT_GAMEPAD_B
}
if (IS_KEY_DOWN(VK_OEM_1)) {
// ;
buttons |= 0x1000; // XINPUT_GAMEPAD_A
buttons |= 0x1000; // XINPUT_GAMEPAD_A
}
if (IS_KEY_DOWN(0x50)) {
// P
buttons |= 0x8000; // XINPUT_GAMEPAD_Y
buttons |= 0x8000; // XINPUT_GAMEPAD_Y
}
if (IS_KEY_DOWN(0x5A)) {
// Z
buttons |= 0x0020; // XINPUT_GAMEPAD_BACK
buttons |= 0x0020; // XINPUT_GAMEPAD_BACK
}
if (IS_KEY_DOWN(0x58)) {
// X
buttons |= 0x0010; // XINPUT_GAMEPAD_START
buttons |= 0x0010; // XINPUT_GAMEPAD_START
}
out_state.packet_number = packet_number_;
out_state.gamepad.buttons = buttons;
out_state.gamepad.left_trigger = left_trigger;
out_state.gamepad.right_trigger = right_trigger;
out_state.gamepad.thumb_lx = thumb_lx;
out_state.gamepad.thumb_ly = thumb_ly;
out_state.gamepad.thumb_rx = thumb_rx;
out_state.gamepad.thumb_ry = thumb_ry;
out_state->packet_number = packet_number_;
out_state->gamepad.buttons = buttons;
out_state->gamepad.left_trigger = left_trigger;
out_state->gamepad.right_trigger = right_trigger;
out_state->gamepad.thumb_lx = thumb_lx;
out_state->gamepad.thumb_ly = thumb_ly;
out_state->gamepad.thumb_rx = thumb_rx;
out_state->gamepad.thumb_ry = thumb_ry;
return X_ERROR_SUCCESS;
}
X_RESULT WinKeyInputDriver::SetState(
uint32_t user_index, X_INPUT_VIBRATION& vibration) {
X_RESULT WinKeyInputDriver::SetState(uint32_t user_index,
X_INPUT_VIBRATION* vibration) {
if (user_index != 0) {
return X_ERROR_DEVICE_NOT_CONNECTED;
}
@@ -155,8 +148,8 @@ X_RESULT WinKeyInputDriver::SetState(
return X_ERROR_SUCCESS;
}
X_RESULT WinKeyInputDriver::GetKeystroke(
uint32_t user_index, uint32_t flags, X_INPUT_KEYSTROKE& out_keystroke) {
X_RESULT WinKeyInputDriver::GetKeystroke(uint32_t user_index, uint32_t flags,
X_INPUT_KEYSTROKE* out_keystroke) {
if (user_index != 0) {
return X_ERROR_DEVICE_NOT_CONNECTED;
}
@@ -168,14 +161,18 @@ X_RESULT WinKeyInputDriver::GetKeystroke(
uint16_t keystroke_flags = 0;
uint8_t hid_code = 0;
out_keystroke.virtual_key = virtual_key;
out_keystroke.unicode = unicode;
out_keystroke.flags = keystroke_flags;
out_keystroke.user_index = 0;
out_keystroke.hid_code = hid_code;
out_keystroke->virtual_key = virtual_key;
out_keystroke->unicode = unicode;
out_keystroke->flags = keystroke_flags;
out_keystroke->user_index = 0;
out_keystroke->hid_code = hid_code;
// X_ERROR_EMPTY if no new keys
// X_ERROR_DEVICE_NOT_CONNECTED if no device
// X_ERROR_SUCCESS if key
return result;
}
} // namespace winkey
} // namespace hid
} // namespace xe

View File

@@ -11,40 +11,33 @@
#define XENIA_HID_WINKEY_WINKEY_DRIVER_H_
#include <xenia/core.h>
#include <xenia/hid/input_driver.h>
#include <xenia/hid/nop/nop_hid-private.h>
namespace xe {
namespace hid {
namespace winkey {
class WinKeyInputDriver : public InputDriver {
public:
public:
WinKeyInputDriver(InputSystem* input_system);
virtual ~WinKeyInputDriver();
~WinKeyInputDriver() override;
virtual X_STATUS Setup();
X_STATUS Setup() override;
virtual X_RESULT GetCapabilities(
uint32_t user_index, uint32_t flags, X_INPUT_CAPABILITIES& out_caps);
virtual X_RESULT GetState(
uint32_t user_index, X_INPUT_STATE& out_state);
virtual X_RESULT SetState(
uint32_t user_index, X_INPUT_VIBRATION& vibration);
virtual X_RESULT GetKeystroke(
uint32_t user_index, uint32_t flags, X_INPUT_KEYSTROKE& out_keystroke);
X_RESULT GetCapabilities(uint32_t user_index, uint32_t flags,
X_INPUT_CAPABILITIES* out_caps) override;
X_RESULT GetState(uint32_t user_index, X_INPUT_STATE* out_state) override;
X_RESULT SetState(uint32_t user_index, X_INPUT_VIBRATION* vibration) override;
X_RESULT GetKeystroke(uint32_t user_index, uint32_t flags,
X_INPUT_KEYSTROKE* out_keystroke) override;
protected:
protected:
uint32_t packet_number_;
};
} // namespace winkey
} // namespace hid
} // namespace xe
#endif // XENIA_HID_WINKEY_WINKEY_DRIVER_H_