project64/Source/Project64-input/CProject64Input.cpp

144 lines
4.2 KiB
C++

#include "CProject64Input.h"
#include "InputSettings.h"
#include "InputConfigUI.h"
CProject64Input * g_InputPlugin = nullptr;
CProject64Input::CProject64Input(HINSTANCE hinst) :
m_hinst(hinst),
m_Scanning(false),
m_DisplayCtrlId(0),
m_iFirstController(-1)
{
memset(m_Controllers, 0, sizeof(m_Controllers));
}
CProject64Input::~CProject64Input()
{
}
void CProject64Input::DevicesChanged(void)
{
CGuard guard(m_CS);
if (m_DirectInput.get() != nullptr)
{
m_DirectInput->DevicesChanged();
}
}
void CProject64Input::DeviceAdded(void)
{
ConfigUIDeviceAdded();
}
void CProject64Input::InitiateControllers(CONTROL_INFO * ControlInfo)
{
CGuard guard(m_CS);
m_ControlInfo = *ControlInfo;
if (m_DirectInput.get() == nullptr)
{
m_DirectInput.reset(new CDirectInput(m_hinst));
}
m_DirectInput->Initiate(ControlInfo);
m_iFirstController = -1;
for (uint32_t i = 0, n = sizeof(m_Controllers) / sizeof(m_Controllers[0]); i < n; i++)
{
g_Settings->LoadController(i, m_ControlInfo.Controls[i], m_Controllers[i]);
m_DirectInput->MapControllerDevice(m_Controllers[i]);
if (m_ControlInfo.Controls[i].Present != 0 && m_iFirstController < 0)
{
m_iFirstController = i;
}
}
}
void CProject64Input::GetKeys(int32_t Control, BUTTONS * Keys)
{
if (Control >= sizeof(m_Controllers) / sizeof(m_Controllers[0]))
{
return;
}
CGuard guard(m_CS);
if (Control == m_iFirstController)
{
m_DirectInput->UpdateDeviceData();
}
N64CONTROLLER & Controller = m_Controllers[Control];
Keys->R_DPAD = m_DirectInput->IsButtonPressed(Controller.R_DPAD);
Keys->L_DPAD = m_DirectInput->IsButtonPressed(Controller.L_DPAD);
Keys->D_DPAD = m_DirectInput->IsButtonPressed(Controller.D_DPAD);
Keys->U_DPAD = m_DirectInput->IsButtonPressed(Controller.U_DPAD);
Keys->START_BUTTON = m_DirectInput->IsButtonPressed(Controller.START_BUTTON);
Keys->Z_TRIG = m_DirectInput->IsButtonPressed(Controller.Z_TRIG);
Keys->B_BUTTON = m_DirectInput->IsButtonPressed(Controller.B_BUTTON);
Keys->A_BUTTON = m_DirectInput->IsButtonPressed(Controller.A_BUTTON);
Keys->R_CBUTTON = m_DirectInput->IsButtonPressed(Controller.R_CBUTTON);
Keys->L_CBUTTON = m_DirectInput->IsButtonPressed(Controller.L_CBUTTON);
Keys->D_CBUTTON = m_DirectInput->IsButtonPressed(Controller.D_CBUTTON);
Keys->U_CBUTTON = m_DirectInput->IsButtonPressed(Controller.U_CBUTTON);
Keys->R_TRIG = m_DirectInput->IsButtonPressed(Controller.R_TRIG);
Keys->L_TRIG = m_DirectInput->IsButtonPressed(Controller.L_TRIG);
m_DirectInput->GetAxis(Controller, Keys);
}
void CProject64Input::StartScanDevices(int32_t DisplayCtrlId)
{
m_Scanning = true;
m_DisplayCtrlId = DisplayCtrlId;
m_DirectInput->UpdateDeviceData();
}
void CProject64Input::EndScanDevices(void)
{
m_Scanning = false;
m_DisplayCtrlId = 0;
}
CDirectInput::ScanResult CProject64Input::ScanDevices(BUTTON & Button)
{
CDirectInput::ScanResult Result = CDirectInput::SCAN_FAILED;
if (m_DirectInput.get() != nullptr)
{
Result = m_DirectInput->ScanDevices(Button);
}
return Result;
}
std::wstring CProject64Input::ButtonAssignment(BUTTON & Button)
{
if (m_DirectInput.get() != nullptr)
{
return m_DirectInput->ButtonAssignment(Button);
}
return L"Unknown";
}
std::wstring CProject64Input::ControllerDevices(const N64CONTROLLER & Controller)
{
if (m_DirectInput.get() != nullptr)
{
return m_DirectInput->ControllerDevices(Controller);
}
return L"";
}
bool CProject64Input::SaveController(uint32_t ControlIndex)
{
CGuard guard(m_CS);
if (ControlIndex >= sizeof(m_Controllers) / sizeof(m_Controllers[0]))
{
return false;
}
g_Settings->SaveController(ControlIndex, m_ControlInfo.Controls[ControlIndex], m_Controllers[ControlIndex]);
m_DirectInput->MapControllerDevice(m_Controllers[ControlIndex]);
return true;
}
bool CProject64Input::ResetController(uint32_t ControlIndex, CONTROL & ControlInfo, N64CONTROLLER & Controller)
{
g_Settings->ResetController(ControlIndex, ControlInfo, Controller);
m_DirectInput->MapControllerDevice(Controller);
return true;
}