Input bouncing through to input system.
This commit is contained in:
parent
74803ae174
commit
c4fe2e6926
|
@ -41,3 +41,18 @@ X_STATUS InputSystem::Setup() {
|
||||||
void InputSystem::AddDriver(InputDriver* driver) {
|
void InputSystem::AddDriver(InputDriver* driver) {
|
||||||
drivers_.push_back(driver);
|
drivers_.push_back(driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
XRESULT InputSystem::GetCapabilities(
|
||||||
|
uint32_t user_index, uint32_t flags, X_INPUT_CAPABILITIES& out_caps) {
|
||||||
|
return X_ERROR_DEVICE_NOT_CONNECTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
XRESULT InputSystem::GetState(uint32_t user_index, X_INPUT_STATE& out_state) {
|
||||||
|
return X_ERROR_DEVICE_NOT_CONNECTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
XRESULT InputSystem::SetState(
|
||||||
|
uint32_t user_index, X_INPUT_VIBRATION& vibration) {
|
||||||
|
// or X_ERROR_BUSY
|
||||||
|
return X_ERROR_DEVICE_NOT_CONNECTED;
|
||||||
|
}
|
||||||
|
|
|
@ -37,6 +37,11 @@ public:
|
||||||
|
|
||||||
void AddDriver(InputDriver* driver);
|
void AddDriver(InputDriver* driver);
|
||||||
|
|
||||||
|
XRESULT GetCapabilities(
|
||||||
|
uint32_t user_index, uint32_t flags, X_INPUT_CAPABILITIES& out_caps);
|
||||||
|
XRESULT GetState(uint32_t user_index, X_INPUT_STATE& out_state);
|
||||||
|
XRESULT SetState(uint32_t user_index, X_INPUT_VIBRATION& vibration);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Emulator* emulator_;
|
Emulator* emulator_;
|
||||||
xe_memory_ref memory_;
|
xe_memory_ref memory_;
|
||||||
|
|
|
@ -9,12 +9,15 @@
|
||||||
|
|
||||||
#include <xenia/kernel/xam/xam_input.h>
|
#include <xenia/kernel/xam/xam_input.h>
|
||||||
|
|
||||||
|
#include <xenia/emulator.h>
|
||||||
|
#include <xenia/hid/hid.h>
|
||||||
#include <xenia/kernel/shim_utils.h>
|
#include <xenia/kernel/shim_utils.h>
|
||||||
#include <xenia/kernel/xam/xam_private.h>
|
#include <xenia/kernel/xam/xam_private.h>
|
||||||
#include <xenia/kernel/xam/xam_state.h>
|
#include <xenia/kernel/xam/xam_state.h>
|
||||||
|
|
||||||
|
|
||||||
using namespace xe;
|
using namespace xe;
|
||||||
|
using namespace xe::hid;
|
||||||
using namespace xe::kernel;
|
using namespace xe::kernel;
|
||||||
using namespace xe::kernel::xam;
|
using namespace xe::kernel::xam;
|
||||||
|
|
||||||
|
@ -37,7 +40,16 @@ SHIM_CALL XamInputGetCapabilities_shim(
|
||||||
flags,
|
flags,
|
||||||
caps_ptr);
|
caps_ptr);
|
||||||
|
|
||||||
SHIM_SET_RETURN(X_ERROR_DEVICE_NOT_CONNECTED);
|
InputSystem* input_system = state->emulator()->input_system();
|
||||||
|
|
||||||
|
X_INPUT_CAPABILITIES caps;
|
||||||
|
XRESULT result = input_system->GetCapabilities(user_index, flags, caps);
|
||||||
|
if (XSUCCEEDED(result)) {
|
||||||
|
if (caps_ptr) {
|
||||||
|
caps.Write(SHIM_MEM_BASE, caps_ptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SHIM_SET_RETURN(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -52,7 +64,16 @@ SHIM_CALL XamInputGetState_shim(
|
||||||
user_index,
|
user_index,
|
||||||
state_ptr);
|
state_ptr);
|
||||||
|
|
||||||
SHIM_SET_RETURN(X_ERROR_DEVICE_NOT_CONNECTED);
|
InputSystem* input_system = state->emulator()->input_system();
|
||||||
|
|
||||||
|
X_INPUT_STATE input_state;
|
||||||
|
XRESULT result = input_system->GetState(user_index, input_state);
|
||||||
|
if (XSUCCEEDED(result)) {
|
||||||
|
if (state_ptr) {
|
||||||
|
input_state.Write(SHIM_MEM_BASE, state_ptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SHIM_SET_RETURN(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -67,9 +88,14 @@ SHIM_CALL XamInputSetState_shim(
|
||||||
user_index,
|
user_index,
|
||||||
vibration_ptr);
|
vibration_ptr);
|
||||||
|
|
||||||
// or X_ERROR_BUSY
|
InputSystem* input_system = state->emulator()->input_system();
|
||||||
|
|
||||||
SHIM_SET_RETURN(X_ERROR_DEVICE_NOT_CONNECTED);
|
X_INPUT_VIBRATION vibration;
|
||||||
|
if (vibration_ptr) {
|
||||||
|
vibration.Read(SHIM_MEM_BASE, vibration_ptr);
|
||||||
|
}
|
||||||
|
XRESULT result = input_system->SetState(user_index, vibration);
|
||||||
|
SHIM_SET_RETURN(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@ public:
|
||||||
XamState(Emulator* emulator);
|
XamState(Emulator* emulator);
|
||||||
~XamState();
|
~XamState();
|
||||||
|
|
||||||
|
Emulator* emulator() const { return emulator_; }
|
||||||
xe_memory_ref memory() const { return memory_; }
|
xe_memory_ref memory() const { return memory_; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
135
src/xenia/xbox.h
135
src/xenia/xbox.h
|
@ -25,8 +25,8 @@ typedef uint32_t X_HANDLE;
|
||||||
// http://msdn.microsoft.com/en-us/library/cc704588.aspx
|
// http://msdn.microsoft.com/en-us/library/cc704588.aspx
|
||||||
// Adding as needed.
|
// Adding as needed.
|
||||||
typedef uint32_t X_STATUS;
|
typedef uint32_t X_STATUS;
|
||||||
#define XFAILED(s) (s & X_STATUS_UNSUCCESSFUL)
|
#define XFAILED(s) ((s) < 0)
|
||||||
#define XSUCCEEDED(s) !XFAILED(s)
|
#define XSUCCEEDED(s) ((s) >= 0)
|
||||||
#define X_STATUS_SUCCESS ((uint32_t)0x00000000L)
|
#define X_STATUS_SUCCESS ((uint32_t)0x00000000L)
|
||||||
#define X_STATUS_ABANDONED_WAIT_0 ((uint32_t)0x00000080L)
|
#define X_STATUS_ABANDONED_WAIT_0 ((uint32_t)0x00000080L)
|
||||||
#define X_STATUS_USER_APC ((uint32_t)0x000000C0L)
|
#define X_STATUS_USER_APC ((uint32_t)0x000000C0L)
|
||||||
|
@ -52,7 +52,7 @@ typedef uint32_t X_STATUS;
|
||||||
|
|
||||||
// HRESULT (ERROR_*)
|
// HRESULT (ERROR_*)
|
||||||
// Adding as needed.
|
// Adding as needed.
|
||||||
typedef uint32_t X_RESULT;
|
typedef uint32_t XRESULT;
|
||||||
#define X_ERROR_SUCCESS ((uint32_t)0x00000000L)
|
#define X_ERROR_SUCCESS ((uint32_t)0x00000000L)
|
||||||
#define X_ERROR_ACCESS_DENIED ((uint32_t)0x80070005L)
|
#define X_ERROR_ACCESS_DENIED ((uint32_t)0x80070005L)
|
||||||
#define X_ERROR_BUSY ((uint32_t)0x800700AAL)
|
#define X_ERROR_BUSY ((uint32_t)0x800700AAL)
|
||||||
|
@ -251,6 +251,135 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum _X_INPUT_FLAG {
|
||||||
|
X_INPUT_FLAG_GAMEPAD = 0x00000001,
|
||||||
|
} X_INPUT_FLAG;
|
||||||
|
|
||||||
|
class X_INPUT_GAMEPAD {
|
||||||
|
public:
|
||||||
|
uint16_t buttons;
|
||||||
|
uint8_t left_trigger;
|
||||||
|
uint8_t right_trigger;
|
||||||
|
int16_t thumb_lx;
|
||||||
|
int16_t thumb_ly;
|
||||||
|
int16_t thumb_rx;
|
||||||
|
int16_t thumb_ry;
|
||||||
|
|
||||||
|
X_INPUT_GAMEPAD() {
|
||||||
|
Zero();
|
||||||
|
}
|
||||||
|
X_INPUT_GAMEPAD(const uint8_t* base, uint32_t p) {
|
||||||
|
Read(base, p);
|
||||||
|
}
|
||||||
|
void Read(const uint8_t* base, uint32_t p) {
|
||||||
|
buttons = XEGETUINT16BE(base + p);
|
||||||
|
left_trigger = XEGETUINT8BE(base + p + 2);
|
||||||
|
right_trigger = XEGETUINT8BE(base + p + 3);
|
||||||
|
thumb_lx = XEGETINT16BE(base + p + 4);
|
||||||
|
thumb_ly = XEGETINT16BE(base + p + 6);
|
||||||
|
thumb_rx = XEGETINT16BE(base + p + 8);
|
||||||
|
thumb_ry = XEGETINT16BE(base + p + 10);
|
||||||
|
}
|
||||||
|
void Write(uint8_t* base, uint32_t p) {
|
||||||
|
XESETUINT16BE(base + p, buttons);
|
||||||
|
XESETUINT8BE(base + p + 2, left_trigger);
|
||||||
|
XESETUINT8BE(base + p + 3, right_trigger);
|
||||||
|
XESETINT16BE(base + p + 4, thumb_lx);
|
||||||
|
XESETINT16BE(base + p + 6, thumb_ly);
|
||||||
|
XESETINT16BE(base + p + 8, thumb_rx);
|
||||||
|
XESETINT16BE(base + p + 10, thumb_ry);
|
||||||
|
}
|
||||||
|
void Zero() {
|
||||||
|
buttons = 0;
|
||||||
|
left_trigger = right_trigger = 0;
|
||||||
|
thumb_lx = thumb_ly = thumb_rx = thumb_ry = 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
class X_INPUT_STATE {
|
||||||
|
public:
|
||||||
|
uint32_t packet_number;
|
||||||
|
X_INPUT_GAMEPAD gamepad;
|
||||||
|
|
||||||
|
X_INPUT_STATE() {
|
||||||
|
Zero();
|
||||||
|
}
|
||||||
|
X_INPUT_STATE(const uint8_t* base, uint32_t p) {
|
||||||
|
Read(base, p);
|
||||||
|
}
|
||||||
|
void Read(const uint8_t* base, uint32_t p) {
|
||||||
|
packet_number = XEGETUINT32BE(base + p);
|
||||||
|
gamepad.Read(base, p + 4);
|
||||||
|
}
|
||||||
|
void Write(uint8_t* base, uint32_t p) {
|
||||||
|
XESETUINT32BE(base + p, packet_number);
|
||||||
|
gamepad.Write(base, p + 4);
|
||||||
|
}
|
||||||
|
void Zero() {
|
||||||
|
packet_number = 0;
|
||||||
|
gamepad.Zero();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
class X_INPUT_VIBRATION {
|
||||||
|
public:
|
||||||
|
uint16_t left_motor_speed;
|
||||||
|
uint16_t right_motor_speed;
|
||||||
|
|
||||||
|
X_INPUT_VIBRATION() {
|
||||||
|
Zero();
|
||||||
|
}
|
||||||
|
X_INPUT_VIBRATION(const uint8_t* base, uint32_t p) {
|
||||||
|
Read(base, p);
|
||||||
|
}
|
||||||
|
void Read(const uint8_t* base, uint32_t p) {
|
||||||
|
left_motor_speed = XEGETUINT16BE(base + p);
|
||||||
|
right_motor_speed = XEGETUINT16BE(base + p + 2);
|
||||||
|
}
|
||||||
|
void Write(uint8_t* base, uint32_t p) {
|
||||||
|
XESETUINT16BE(base + p, left_motor_speed);
|
||||||
|
XESETUINT16BE(base + p + 2, right_motor_speed);
|
||||||
|
}
|
||||||
|
void Zero() {
|
||||||
|
left_motor_speed = right_motor_speed = 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
class X_INPUT_CAPABILITIES {
|
||||||
|
public:
|
||||||
|
uint8_t type;
|
||||||
|
uint8_t sub_type;
|
||||||
|
uint16_t flags;
|
||||||
|
X_INPUT_GAMEPAD gamepad;
|
||||||
|
X_INPUT_VIBRATION vibration;
|
||||||
|
|
||||||
|
X_INPUT_CAPABILITIES() {
|
||||||
|
Zero();
|
||||||
|
}
|
||||||
|
X_INPUT_CAPABILITIES(const uint8_t* base, uint32_t p) {
|
||||||
|
Read(base, p);
|
||||||
|
}
|
||||||
|
void Read(const uint8_t* base, uint32_t p) {
|
||||||
|
type = XEGETUINT8BE(base + p);
|
||||||
|
sub_type = XEGETUINT8BE(base + p + 1);
|
||||||
|
flags = XEGETUINT16BE(base + p + 2);
|
||||||
|
gamepad.Read(base, p + 4);
|
||||||
|
vibration.Read(base, p + 4 + 12);
|
||||||
|
}
|
||||||
|
void Write(uint8_t* base, uint32_t p) {
|
||||||
|
XESETUINT8BE(base + p, type);
|
||||||
|
XESETUINT8BE(base + p + 1, sub_type);
|
||||||
|
XESETUINT16BE(base + p + 2, flags);
|
||||||
|
gamepad.Write(base, p + 4);
|
||||||
|
vibration.Write(base, p + 4 + 12);
|
||||||
|
}
|
||||||
|
void Zero() {
|
||||||
|
type = 0;
|
||||||
|
sub_type = 0;
|
||||||
|
flags = 0;
|
||||||
|
gamepad.Zero();
|
||||||
|
vibration.Zero();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
} // namespace xe
|
} // namespace xe
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue