shadPS4/src/Emulator/Host/controller.cpp
2024-02-23 23:33:43 +02:00

60 lines
1.5 KiB
C++

// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include "Emulator/Host/controller.h"
#include "core/hle/libraries/libkernel/time_management.h"
namespace Emulator::Host::Controller {
GameController::GameController() {
m_states_num = 0;
m_last_state = State();
}
void GameController::readState(State* state, bool* isConnected, int* connectedCount) {
std::scoped_lock lock{m_mutex};
*isConnected = m_connected;
*connectedCount = m_connected_count;
*state = getLastState();
}
State GameController::getLastState() const {
if (m_states_num == 0) {
return m_last_state;
}
auto last = (m_first_state + m_states_num - 1) % MAX_STATES;
return m_states[last];
}
void GameController::addState(const State& state) {
if (m_states_num >= MAX_STATES) {
m_states_num = MAX_STATES - 1;
m_first_state = (m_first_state + 1) % MAX_STATES;
}
auto index = (m_first_state + m_states_num) % MAX_STATES;
m_states[index] = state;
m_last_state = state;
m_states_num++;
}
void GameController::checKButton(int id, u32 button, bool isPressed) {
std::scoped_lock lock{m_mutex};
auto state = getLastState();
state.time = Core::Libraries::LibKernel::sceKernelGetProcessTime();
if (isPressed) {
state.buttonsState |= button;
} else {
state.buttonsState &= ~button;
}
addState(state);
}
} // namespace Emulator::Host::Controller