scePadRead,scePthreadYield implementations
This commit is contained in:
parent
5409576197
commit
81143b4a9e
|
@ -19,6 +19,37 @@ void GameController::readState(State* state, bool* isConnected, int* connectedCo
|
||||||
*state = getLastState();
|
*state = getLastState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int GameController::ReadStates(State* states, int states_num, bool* isConnected,
|
||||||
|
int* connectedCount) {
|
||||||
|
std::scoped_lock lock{m_mutex};
|
||||||
|
|
||||||
|
*isConnected = m_connected;
|
||||||
|
*connectedCount = m_connected_count;
|
||||||
|
|
||||||
|
int ret_num = 0;
|
||||||
|
|
||||||
|
if (m_connected) {
|
||||||
|
if (m_states_num == 0) {
|
||||||
|
ret_num = 1;
|
||||||
|
states[0] = m_last_state;
|
||||||
|
} else {
|
||||||
|
for (uint32_t i = 0; i < m_states_num; i++) {
|
||||||
|
if (ret_num >= states_num) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
auto index = (m_first_state + i) % MAX_STATES;
|
||||||
|
if (!m_private[index].obtained) {
|
||||||
|
m_private[index].obtained = true;
|
||||||
|
|
||||||
|
states[ret_num++] = m_states[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret_num;
|
||||||
|
}
|
||||||
|
|
||||||
State GameController::getLastState() const {
|
State GameController::getLastState() const {
|
||||||
if (m_states_num == 0) {
|
if (m_states_num == 0) {
|
||||||
return m_last_state;
|
return m_last_state;
|
||||||
|
@ -39,7 +70,7 @@ void GameController::addState(const State& state) {
|
||||||
|
|
||||||
m_states[index] = state;
|
m_states[index] = state;
|
||||||
m_last_state = state;
|
m_last_state = state;
|
||||||
|
m_private[index].obtained = false;
|
||||||
m_states_num++;
|
m_states_num++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,11 +20,16 @@ public:
|
||||||
virtual ~GameController() = default;
|
virtual ~GameController() = default;
|
||||||
|
|
||||||
void readState(State* state, bool* isConnected, int* connectedCount);
|
void readState(State* state, bool* isConnected, int* connectedCount);
|
||||||
|
int ReadStates(State* states, int states_num, bool* isConnected, int* connectedCount);
|
||||||
State getLastState() const;
|
State getLastState() const;
|
||||||
void checKButton(int id, u32 button, bool isPressed);
|
void checKButton(int id, u32 button, bool isPressed);
|
||||||
void addState(const State& state);
|
void addState(const State& state);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
struct StateInternal {
|
||||||
|
bool obtained = false;
|
||||||
|
};
|
||||||
|
|
||||||
std::mutex m_mutex;
|
std::mutex m_mutex;
|
||||||
bool m_connected = false;
|
bool m_connected = false;
|
||||||
State m_last_state;
|
State m_last_state;
|
||||||
|
@ -32,6 +37,7 @@ private:
|
||||||
u32 m_states_num = 0;
|
u32 m_states_num = 0;
|
||||||
u32 m_first_state = 0;
|
u32 m_first_state = 0;
|
||||||
State m_states[MAX_STATES];
|
State m_states[MAX_STATES];
|
||||||
|
StateInternal m_private[MAX_STATES];
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Emulator::Host::Controller
|
} // namespace Emulator::Host::Controller
|
||||||
|
|
|
@ -881,6 +881,10 @@ ScePthread PThreadPool::Create() {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PS4_SYSV_ABI scePthreadYield() {
|
||||||
|
sched_yield();
|
||||||
|
}
|
||||||
|
|
||||||
void pthreadSymbolsRegister(Loader::SymbolsResolver* sym) {
|
void pthreadSymbolsRegister(Loader::SymbolsResolver* sym) {
|
||||||
LIB_FUNCTION("4+h9EzwKF4I", "libkernel", 1, "libkernel", 1, 1, scePthreadAttrSetschedpolicy);
|
LIB_FUNCTION("4+h9EzwKF4I", "libkernel", 1, "libkernel", 1, 1, scePthreadAttrSetschedpolicy);
|
||||||
LIB_FUNCTION("-Wreprtu0Qs", "libkernel", 1, "libkernel", 1, 1, scePthreadAttrSetdetachstate);
|
LIB_FUNCTION("-Wreprtu0Qs", "libkernel", 1, "libkernel", 1, 1, scePthreadAttrSetdetachstate);
|
||||||
|
@ -896,6 +900,8 @@ void pthreadSymbolsRegister(Loader::SymbolsResolver* sym) {
|
||||||
|
|
||||||
LIB_FUNCTION("bt3CTBKmGyI", "libkernel", 1, "libkernel", 1, 1, scePthreadSetaffinity);
|
LIB_FUNCTION("bt3CTBKmGyI", "libkernel", 1, "libkernel", 1, 1, scePthreadSetaffinity);
|
||||||
LIB_FUNCTION("6UgtwV+0zb4", "libkernel", 1, "libkernel", 1, 1, scePthreadCreate);
|
LIB_FUNCTION("6UgtwV+0zb4", "libkernel", 1, "libkernel", 1, 1, scePthreadCreate);
|
||||||
|
LIB_FUNCTION("T72hz6ffq08", "libkernel", 1, "libkernel", 1, 1, scePthreadYield);
|
||||||
|
|
||||||
// mutex calls
|
// mutex calls
|
||||||
LIB_FUNCTION("cmo1RIYva9o", "libkernel", 1, "libkernel", 1, 1, scePthreadMutexInit);
|
LIB_FUNCTION("cmo1RIYva9o", "libkernel", 1, "libkernel", 1, 1, scePthreadMutexInit);
|
||||||
LIB_FUNCTION("2Of0f+3mhhE", "libkernel", 1, "libkernel", 1, 1, scePthreadMutexDestroy);
|
LIB_FUNCTION("2Of0f+3mhhE", "libkernel", 1, "libkernel", 1, 1, scePthreadMutexDestroy);
|
||||||
|
|
|
@ -4,11 +4,11 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#define _TIMESPEC_DEFINED
|
#define _TIMESPEC_DEFINED
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <sched.h>
|
#include <sched.h>
|
||||||
#include <vector>
|
|
||||||
#include <mutex>
|
|
||||||
|
|
||||||
#include "common/types.h"
|
#include "common/types.h"
|
||||||
|
|
||||||
|
@ -88,6 +88,7 @@ struct PthreadCondAttrInternal {
|
||||||
class PThreadPool {
|
class PThreadPool {
|
||||||
public:
|
public:
|
||||||
ScePthread Create();
|
ScePthread Create();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<ScePthread> m_threads;
|
std::vector<ScePthread> m_threads;
|
||||||
std::mutex m_mutex;
|
std::mutex m_mutex;
|
||||||
|
|
|
@ -48,6 +48,51 @@ int PS4_SYSV_ABI scePadReadState(int32_t handle, ScePadData* pData) {
|
||||||
return SCE_OK;
|
return SCE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int PS4_SYSV_ABI scePadRead(int handle, ScePadData* pData, int num) {
|
||||||
|
int connected_count = 0;
|
||||||
|
bool connected = false;
|
||||||
|
Emulator::Host::Controller::State states[64];
|
||||||
|
auto* controller = Common::Singleton<Emulator::Host::Controller::GameController>::Instance();
|
||||||
|
int ret_num = controller->ReadStates(states, num, &connected, &connected_count);
|
||||||
|
|
||||||
|
if (!connected) {
|
||||||
|
ret_num = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < ret_num; i++) {
|
||||||
|
pData[i].buttons = states[i].buttonsState;
|
||||||
|
pData[i].leftStick.x = 128; // dummy
|
||||||
|
pData[i].leftStick.y = 128; // dummy
|
||||||
|
pData[i].rightStick.x = 0; // dummy
|
||||||
|
pData[i].rightStick.y = 0; // dummy
|
||||||
|
pData[i].analogButtons.l2 = 0; // dummy
|
||||||
|
pData[i].analogButtons.r2 = 0; // dummy
|
||||||
|
pData[i].orientation.x = 0.0f;
|
||||||
|
pData[i].orientation.y = 0.0f;
|
||||||
|
pData[i].orientation.z = 0.0f;
|
||||||
|
pData[i].orientation.w = 1.0f;
|
||||||
|
pData[i].acceleration.x = 0.0f;
|
||||||
|
pData[i].acceleration.y = 0.0f;
|
||||||
|
pData[i].acceleration.z = 0.0f;
|
||||||
|
pData[i].angularVelocity.x = 0.0f;
|
||||||
|
pData[i].angularVelocity.y = 0.0f;
|
||||||
|
pData[i].angularVelocity.z = 0.0f;
|
||||||
|
pData[i].touchData.touchNum = 0;
|
||||||
|
pData[i].touchData.touch[0].x = 0;
|
||||||
|
pData[i].touchData.touch[0].y = 0;
|
||||||
|
pData[i].touchData.touch[0].id = 1;
|
||||||
|
pData[i].touchData.touch[1].x = 0;
|
||||||
|
pData[i].touchData.touch[1].y = 0;
|
||||||
|
pData[i].touchData.touch[1].id = 2;
|
||||||
|
pData[i].connected = connected;
|
||||||
|
pData[i].timestamp = states[i].time;
|
||||||
|
pData[i].connectedCount = connected_count;
|
||||||
|
pData[i].deviceUniqueDataLen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret_num;
|
||||||
|
}
|
||||||
|
|
||||||
s32 PS4_SYSV_ABI scePadGetControllerInformation(s32 handle, OrbisPadInformation* info) {
|
s32 PS4_SYSV_ABI scePadGetControllerInformation(s32 handle, OrbisPadInformation* info) {
|
||||||
LOG_INFO(Lib_Pad, "called handle = {}", handle);
|
LOG_INFO(Lib_Pad, "called handle = {}", handle);
|
||||||
info->touchpadDensity = 1;
|
info->touchpadDensity = 1;
|
||||||
|
@ -72,6 +117,8 @@ void padSymbolsRegister(Core::Loader::SymbolsResolver* sym) {
|
||||||
LIB_FUNCTION("hv1luiJrqQM", "libScePad", 1, "libScePad", 1, 1, scePadInit);
|
LIB_FUNCTION("hv1luiJrqQM", "libScePad", 1, "libScePad", 1, 1, scePadInit);
|
||||||
LIB_FUNCTION("xk0AcarP3V4", "libScePad", 1, "libScePad", 1, 1, scePadOpen);
|
LIB_FUNCTION("xk0AcarP3V4", "libScePad", 1, "libScePad", 1, 1, scePadOpen);
|
||||||
LIB_FUNCTION("YndgXqQVV7c", "libScePad", 1, "libScePad", 1, 1, scePadReadState);
|
LIB_FUNCTION("YndgXqQVV7c", "libScePad", 1, "libScePad", 1, 1, scePadReadState);
|
||||||
|
LIB_FUNCTION("q1cHNfGycLI", "libScePad", 1, "libScePad", 1, 1, scePadRead);
|
||||||
|
|
||||||
LIB_FUNCTION("gjP9-KQzoUk", "libScePad", 1, "libScePad", 1, 1, scePadGetControllerInformation);
|
LIB_FUNCTION("gjP9-KQzoUk", "libScePad", 1, "libScePad", 1, 1, scePadGetControllerInformation);
|
||||||
LIB_FUNCTION("clVvL4ZDntw", "libScePad", 1, "libScePad", 1, 1, scePadSetMotionSensorState);
|
LIB_FUNCTION("clVvL4ZDntw", "libScePad", 1, "libScePad", 1, 1, scePadSetMotionSensorState);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue