Files
KytyPS5/src/libs/libPad.cpp
T

425 lines
11 KiB
C++

#include "common/abi.h"
#include "common/logging/log.h"
#include "libs/controller.h"
#include "libs/errno.h"
#include "libs/libs.h"
#include "libs/padData.h"
#include "loader/symbolDatabase.h"
#include <cstring>
namespace Libs {
LIB_VERSION("Pad", 1, "Pad", 1, 1);
static int KYTY_SYSV_ABI PadSetVibrationMode(int handle, int mode) {
PRINT_NAME();
LOGF("\t handle = %d\n"
"\t mode = %d\n",
handle, mode);
return Controller::PadCheckHandle(handle);
}
static int KYTY_SYSV_ABI PadSetVibrationTriggerEffectWeakWhileEmbeddedMicInUse(bool enabled) {
PRINT_NAME();
LOGF("\t enabled = %d\n", enabled ? 1 : 0);
return OK;
}
struct PadDeviceClassExtendedInformation {
int32_t device_class;
uint8_t reserved[4];
uint8_t class_data[12];
};
struct PadDeviceClassData {
int32_t device_class;
bool data_valid;
uint8_t reserved[3];
union {
struct {
float steering_wheel_angle;
uint16_t steering_wheel;
uint16_t accelerator_pedal;
uint16_t brake_pedal;
uint16_t clutch_pedal;
uint16_t hand_brake;
uint8_t gear;
uint8_t reserved[1];
} steering_wheel;
struct {
uint8_t data_len;
uint8_t reserved[3];
uint8_t data[12];
} others;
uint8_t raw[16];
} class_data;
};
static_assert(sizeof(PadDeviceClassData) == 24);
static int KYTY_SYSV_ABI
PadDeviceClassGetExtendedInformation(int handle, PadDeviceClassExtendedInformation* info) {
PRINT_NAME();
constexpr int pad_error_invalid_arg = -2137915391; /* 0x80920001 */
if (const auto error = Controller::PadCheckHandle(handle); error != OK) {
return error;
}
if (info == nullptr) {
return pad_error_invalid_arg;
}
std::memset(info, 0, sizeof(*info));
return OK;
}
static int KYTY_SYSV_ABI PadDeviceClassParseData(int handle, const Controller::PadData* data,
PadDeviceClassData* class_data) {
PRINT_NAME();
constexpr int pad_error_invalid_arg = -2137915391; /* 0x80920001 */
LOGF("\t handle = %d\n"
"\t data = 0x%016" PRIx64 "\n"
"\t class_data = 0x%016" PRIx64 "\n",
handle, reinterpret_cast<uint64_t>(data), reinterpret_cast<uint64_t>(class_data));
if (const auto error = Controller::PadCheckHandle(handle); error != OK) {
return error;
}
if (data == nullptr || class_data == nullptr) {
return pad_error_invalid_arg;
}
std::memset(class_data, 0, sizeof(*class_data));
class_data->device_class = 0; // SCE_PAD_DEVICE_CLASS_STANDARD
class_data->data_valid = data->connected;
if (data->device_unique_data_len > 0) {
const auto data_len =
(data->device_unique_data_len > 12 ? 12 : data->device_unique_data_len);
class_data->device_class = -1; // SCE_PAD_DEVICE_CLASS_INVALID/unsupported device payload
class_data->class_data.others.data_len = data_len;
std::memcpy(class_data->class_data.others.data, data->device_unique_data, data_len);
}
return OK;
}
static int KYTY_SYSV_ABI PadSetTiltCorrectionState(int handle, bool enabled) {
PRINT_NAME();
LOGF("\t handle = %d\n"
"\t enabled = %d\n",
handle, enabled ? 1 : 0);
return Controller::PadCheckHandle(handle);
}
// PPSA02385
static int KYTY_SYSV_ABI PadOpenExtStub(int user_id, int type, int index, const void* param) {
PRINT_NAME();
LOGF("\t user_id = %d\n"
"\t type = %d\n"
"\t index = %d\n"
"\t param = 0x%016" PRIx64 "\n",
user_id, type, index, reinterpret_cast<uint64_t>(param));
return OK;
}
// PPSA02385
static int KYTY_SYSV_ABI PadGetExtControllerInformationStub(int handle, void* info) {
PRINT_NAME();
LOGF("\t handle = %d\n"
"\t info = 0x%016" PRIx64 "\n",
handle, reinterpret_cast<uint64_t>(info));
return Controller::PadCheckHandle(handle);
}
static int KYTY_SYSV_ABI PadUnknownN3kSX62fgNo(uint64_t arg0, uint64_t arg1, uint64_t arg2,
uint64_t arg3, uint64_t arg4, uint64_t arg5) {
PRINT_NAME();
LOGF("\t argc-style args = (0x%016" PRIx64 ", 0x%016" PRIx64 ", 0x%016" PRIx64 ", 0x%016" PRIx64
", 0x%016" PRIx64 ", 0x%016" PRIx64 ")\n",
arg0, arg1, arg2, arg3, arg4, arg5);
if (arg0 >= 0x10000 && arg3 > 0 && arg3 <= 0x1000) {
std::memset(reinterpret_cast<void*>(arg0), 0, static_cast<size_t>(arg3));
}
return OK;
}
LIB_DEFINE(InitPad_1) {
PRINT_NAME_ENABLE(true);
LIB_FUNC("hv1luiJrqQM", Controller::PadInit);
LIB_FUNC("xk0AcarP3V4", Controller::PadOpen);
LIB_FUNC("WFIiSfXGUq8", PadOpenExtStub);
LIB_FUNC("u1GRHp+oWoY", Controller::PadGetHandle);
LIB_FUNC("AcslpN1jHR8", PadDeviceClassGetExtendedInformation);
LIB_FUNC("IHPqcbc0zCA", PadDeviceClassParseData);
LIB_FUNC("clVvL4ZDntw", Controller::PadSetMotionSensorState);
LIB_FUNC("r44mAxdSG+U", Controller::PadSetAngularVelocityDeadbandState);
LIB_FUNC("rIZnR6eSpvk", Controller::PadResetOrientation);
LIB_FUNC("vDLMoJLde8I", PadSetTiltCorrectionState);
LIB_FUNC("gjP9-KQzoUk", Controller::PadGetControllerInformation);
LIB_FUNC("fCWdlnmB1Ks", Controller::PadIsRemoteController);
LIB_FUNC("hGbf2QTBmqc", PadGetExtControllerInformationStub);
LIB_FUNC("2JgFB2n9oUM", Controller::PadSetTriggerEffect);
LIB_FUNC("YndgXqQVV7c", Controller::PadReadState);
LIB_FUNC("q1cHNfGycLI", Controller::PadRead);
LIB_FUNC("yFVnOdGxvZY", Controller::PadSetVibration);
LIB_FUNC("W2G-yoyMF5U", PadSetVibrationMode);
LIB_FUNC("Yq0zOH7YNOM", PadSetVibrationTriggerEffectWeakWhileEmbeddedMicInUse);
LIB_FUNC("znaWI0gpuo8", Controller::PadGetTriggerEffectState);
LIB_FUNC("DscD1i9HX1w", Controller::PadResetLightBar);
LIB_FUNC("RR4novUEENY", Controller::PadSetLightBar);
LIB_FUNC("6ncge5+l5Qs", Controller::PadClose);
LIB_FUNC("n3kSX62fgNo", PadUnknownN3kSX62fgNo);
}
namespace LibMouse {
LIB_VERSION("Mouse", 1, "Mouse", 1, 1);
namespace Mouse {
constexpr int MOUSE_ERROR_INVALID_ARG = -2132869119; /* 0x80DF0001 */
constexpr int MOUSE_ERROR_INVALID_HANDLE = -2132869117; /* 0x80DF0003 */
struct MouseData {
uint64_t timestamp;
bool connected;
uint8_t padding[3];
uint32_t buttons;
int32_t x_axis;
int32_t y_axis;
int32_t wheel;
int32_t tilt;
uint8_t reserved[8];
};
static int KYTY_SYSV_ABI MouseInit() {
PRINT_NAME();
return OK;
}
static int KYTY_SYSV_ABI MouseOpen(int user_id, int32_t type, int32_t index, const void* param) {
PRINT_NAME();
LOGF("\t user_id = %d\n"
"\t type = %" PRId32 "\n"
"\t index = %" PRId32 "\n"
"\t param = 0x%016" PRIx64 "\n",
user_id, type, index, reinterpret_cast<uint64_t>(param));
if (type != 0 || index < 0 || index >= 2) {
return MOUSE_ERROR_INVALID_ARG;
}
return 1;
}
static int KYTY_SYSV_ABI MouseClose(int32_t handle) {
PRINT_NAME();
LOGF("\t handle = %" PRId32 "\n", handle);
if (handle <= 0) {
return MOUSE_ERROR_INVALID_HANDLE;
}
return OK;
}
static int KYTY_SYSV_ABI MouseRead(int32_t handle, MouseData* data, int32_t num) {
PRINT_NAME();
LOGF("\t handle = %" PRId32 "\n"
"\t data = 0x%016" PRIx64 "\n"
"\t num = %" PRId32 "\n",
handle, reinterpret_cast<uint64_t>(data), num);
if (handle <= 0) {
return MOUSE_ERROR_INVALID_HANDLE;
}
if (data == nullptr || num <= 0) {
return MOUSE_ERROR_INVALID_ARG;
}
std::memset(data, 0, sizeof(MouseData) * static_cast<size_t>(num));
return 0;
}
} // namespace Mouse
LIB_DEFINE(InitMouse_1) {
LIB_FUNC("cAnT0Rw-IwU", Mouse::MouseClose);
LIB_FUNC("Qs0wWulgl7U", Mouse::MouseInit);
LIB_FUNC("RaqxZIf6DvE", Mouse::MouseOpen);
LIB_FUNC("x8qnXqh-tiM", Mouse::MouseRead);
}
} // namespace LibMouse
namespace LibKeyboard {
LIB_VERSION("Keyboard", 1, "Keyboard", 1, 1);
namespace Keyboard {
constexpr int KEYBOARD_ERROR_INVALID_ARG = -2133196799; /* 0x80da0001 */
constexpr int KEYBOARD_ERROR_INVALID_HANDLE = -2133196797; /* 0x80da0003 */
constexpr int KEYBOARD_MAX_KEYCODES = 16;
constexpr int KEYBOARD_MAX_DATA_NUM = 16;
constexpr int KEYBOARD_MAPPING_101 = 0;
constexpr int KEYBOARD_MAPPING_106 = 1;
struct KeyboardData {
uint64_t timestamp;
bool intercepted;
uint8_t reserve1[7];
bool connected;
int32_t length;
uint32_t led;
uint32_t modifier_key;
uint16_t key_code[KEYBOARD_MAX_KEYCODES];
uint8_t reserve2[32];
};
struct KeyboardCharData {
bool processed;
int32_t length;
uint16_t char_code;
uint8_t reserve[8];
};
static int KYTY_SYSV_ABI KeyboardInit() {
PRINT_NAME();
return OK;
}
static int KYTY_SYSV_ABI KeyboardOpen(int user_id, int32_t type, int32_t index, const void* param) {
PRINT_NAME();
LOGF("\t user_id = %d\n"
"\t type = %" PRId32 "\n"
"\t index = %" PRId32 "\n"
"\t param = 0x%016" PRIx64 "\n",
user_id, type, index, reinterpret_cast<uint64_t>(param));
if (type != 0 || index < 0 || index >= 2) {
return KEYBOARD_ERROR_INVALID_ARG;
}
return 1;
}
static int KYTY_SYSV_ABI KeyboardClose(int32_t handle) {
PRINT_NAME();
LOGF("\t handle = %" PRId32 "\n", handle);
if (handle <= 0) {
return KEYBOARD_ERROR_INVALID_HANDLE;
}
return OK;
}
static int KYTY_SYSV_ABI KeyboardRead(int32_t handle, KeyboardData* data, int32_t num) {
PRINT_NAME();
LOGF("\t handle = %" PRId32 "\n"
"\t data = 0x%016" PRIx64 "\n"
"\t num = %" PRId32 "\n",
handle, reinterpret_cast<uint64_t>(data), num);
if (handle <= 0) {
return KEYBOARD_ERROR_INVALID_HANDLE;
}
if (data == nullptr || num <= 0 || num > KEYBOARD_MAX_DATA_NUM) {
return KEYBOARD_ERROR_INVALID_ARG;
}
std::memset(data, 0, sizeof(KeyboardData) * static_cast<size_t>(num));
return 0;
}
static int KYTY_SYSV_ABI KeyboardReadState(int32_t handle, KeyboardData* data) {
PRINT_NAME();
LOGF("\t handle = %" PRId32 "\n"
"\t data = 0x%016" PRIx64 "\n",
handle, reinterpret_cast<uint64_t>(data));
if (handle <= 0) {
return KEYBOARD_ERROR_INVALID_HANDLE;
}
if (data == nullptr) {
return KEYBOARD_ERROR_INVALID_ARG;
}
std::memset(data, 0, sizeof(KeyboardData));
return 0;
}
static int KYTY_SYSV_ABI KeyboardGetKey2Char(int32_t handle, int32_t arrange, uint32_t led,
uint32_t modifier_key, uint16_t key_code,
KeyboardCharData* char_data) {
PRINT_NAME();
LOGF("\t handle = %" PRId32 "\n"
"\t arrange = %" PRId32 "\n"
"\t led = %" PRIu32 "\n"
"\t modifier_key = %" PRIu32 "\n"
"\t key_code = %" PRIu16 "\n"
"\t char_data = 0x%016" PRIx64 "\n",
handle, arrange, led, modifier_key, key_code, reinterpret_cast<uint64_t>(char_data));
if (handle <= 0) {
return KEYBOARD_ERROR_INVALID_HANDLE;
}
if (char_data == nullptr ||
(arrange != KEYBOARD_MAPPING_101 && arrange != KEYBOARD_MAPPING_106)) {
return KEYBOARD_ERROR_INVALID_ARG;
}
std::memset(char_data, 0, sizeof(KeyboardCharData));
return OK;
}
} // namespace Keyboard
LIB_DEFINE(InitKeyboard_1) {
LIB_FUNC("wadT3QBCGY0", Keyboard::KeyboardInit);
LIB_FUNC("HJ+KnEHcaxI", Keyboard::KeyboardOpen);
LIB_FUNC("0LWei+c7RNc", Keyboard::KeyboardClose);
LIB_FUNC("6HpE68bzX6M", Keyboard::KeyboardReadState);
LIB_FUNC("xybbGMCr738", Keyboard::KeyboardRead);
LIB_FUNC("yO9JwdRhtSA", Keyboard::KeyboardGetKey2Char);
}
} // namespace LibKeyboard
} // namespace Libs