diff --git a/src/core/libraries/pad/pad.cpp b/src/core/libraries/pad/pad.cpp index c9e332d2..305b20bd 100644 --- a/src/core/libraries/pad/pad.cpp +++ b/src/core/libraries/pad/pad.cpp @@ -105,7 +105,7 @@ int PS4_SYSV_ABI scePadGetControllerInformation(s32 handle, OrbisPadControllerIn pInfo->stickInfo.deadZoneRight = 2; pInfo->connectionType = ORBIS_PAD_PORT_TYPE_STANDARD; pInfo->connectedCount = 1; - pInfo->connected = 1; + pInfo->connected = true; pInfo->deviceClass = ORBIS_PAD_DEVICE_CLASS_STANDARD; return SCE_OK; } @@ -125,9 +125,16 @@ int PS4_SYSV_ABI scePadGetDeviceInfo() { return ORBIS_OK; } -int PS4_SYSV_ABI scePadGetExtControllerInformation() { - LOG_ERROR(Lib_Pad, "(STUBBED) called"); - return ORBIS_OK; +int PS4_SYSV_ABI scePadGetExtControllerInformation(s32 handle, + OrbisPadExtendedControllerInformation* pInfo) { + LOG_INFO(Lib_Pad, "called handle = {}", handle); + + pInfo->padType1 = 0; + pInfo->padType2 = 0; + pInfo->capability = 0; + + auto res = scePadGetControllerInformation(handle, &pInfo->base); + return res; } int PS4_SYSV_ABI scePadGetExtensionUnitInfo() { @@ -237,7 +244,7 @@ int PS4_SYSV_ABI scePadOpen(s32 userId, s32 type, s32 index, const OrbisPadOpenP int PS4_SYSV_ABI scePadOpenExt() { LOG_ERROR(Lib_Pad, "(STUBBED) called"); - return ORBIS_OK; + return 1; // dummy } int PS4_SYSV_ABI scePadOpenExt2() { @@ -422,6 +429,12 @@ int PS4_SYSV_ABI scePadSetLightBar(s32 handle, const OrbisPadLightBarParam* pPar if (pParam != nullptr) { LOG_INFO(Lib_Pad, "scePadSetLightBar called handle = {} rgb = {} {} {}", handle, pParam->r, pParam->g, pParam->b); + + if (pParam->r < 0xD && pParam->g < 0xD && pParam->b < 0xD) { + LOG_INFO(Lib_Pad, "Invalid lightbar setting"); + return ORBIS_PAD_ERROR_INVALID_LIGHTBAR_SETTING; + } + auto* controller = Common::Singleton::Instance(); controller->SetLightBarRGB(pParam->r, pParam->g, pParam->b); return ORBIS_OK; diff --git a/src/core/libraries/pad/pad.h b/src/core/libraries/pad/pad.h index 4f854290..3e9c14a1 100644 --- a/src/core/libraries/pad/pad.h +++ b/src/core/libraries/pad/pad.h @@ -212,6 +212,19 @@ struct OrbisPadControllerInformation { u8 reserve[8]; }; +struct OrbisPadExtendedControllerInformation { + OrbisPadControllerInformation base; + u16 padType1; + u16 padType2; + u8 capability; + + union { + u8 quantityOfSelectorSwitch; + int maxPhysicalWheelAngle; + u8 data[8]; + }; +}; + struct OrbisPadOpenParam { u8 reserve[8]; }; @@ -248,7 +261,8 @@ int PS4_SYSV_ABI scePadGetControllerInformation(s32 handle, OrbisPadControllerIn int PS4_SYSV_ABI scePadGetDataInternal(); int PS4_SYSV_ABI scePadGetDeviceId(); int PS4_SYSV_ABI scePadGetDeviceInfo(); -int PS4_SYSV_ABI scePadGetExtControllerInformation(); +int PS4_SYSV_ABI scePadGetExtControllerInformation(s32 handle, + OrbisPadExtendedControllerInformation* pInfo); int PS4_SYSV_ABI scePadGetExtensionUnitInfo(); int PS4_SYSV_ABI scePadGetFeatureReport(); int PS4_SYSV_ABI scePadGetHandle(s32 userId, s32 type, s32 index);