return Vibration data through CPadInterface

This commit is contained in:
Mahmood - Zer0xFF 2023-10-30 21:58:23 +00:00
parent 3cc0dbb1ab
commit 85059b988c
6 changed files with 21 additions and 1 deletions

View file

@ -9,5 +9,6 @@ public:
virtual ~CPadInterface() = default; virtual ~CPadInterface() = default;
virtual void SetButtonState(unsigned int, PS2::CControllerInfo::BUTTON, bool, uint8*) = 0; virtual void SetButtonState(unsigned int, PS2::CControllerInfo::BUTTON, bool, uint8*) = 0;
virtual void SetAxisState(unsigned int, PS2::CControllerInfo::BUTTON, uint8, uint8*) = 0; virtual void SetAxisState(unsigned int, PS2::CControllerInfo::BUTTON, uint8, uint8*) = 0;
virtual void GetVibration(unsigned int, uint8& largeMotor, uint8& smallMotor) = 0;
static uint32 GetButtonMask(PS2::CControllerInfo::BUTTON); static uint32 GetButtonMask(PS2::CControllerInfo::BUTTON);
}; };

View file

@ -2,7 +2,7 @@
void CPH_GenericInput::Update(uint8* ram) void CPH_GenericInput::Update(uint8* ram)
{ {
std::map<unsigned int, std::pair<uint8, uint8>> vibMap; std::map<unsigned int, std::pair<uint8, uint8>> vibrationMap;
for(auto* interface : m_interfaces) for(auto* interface : m_interfaces)
{ {
for(unsigned int pad = 0; pad < CInputBindingManager::MAX_PADS; pad++) for(unsigned int pad = 0; pad < CInputBindingManager::MAX_PADS; pad++)
@ -22,6 +22,9 @@ void CPH_GenericInput::Update(uint8* ram)
interface->SetButtonState(pad, button, value != 0, ram); interface->SetButtonState(pad, button, value != 0, ram);
} }
} }
// Only Sio2 currently provides vibration information
auto& [largeMotor, smallMotor] = vibrationMap[pad];
interface->GetVibration(pad, largeMotor, smallMotor);
} }
} }
} }

View file

@ -45,6 +45,7 @@ namespace Iop
//CPadInterface //CPadInterface
void SetButtonState(unsigned int, PS2::CControllerInfo::BUTTON, bool, uint8*) override; void SetButtonState(unsigned int, PS2::CControllerInfo::BUTTON, bool, uint8*) override;
void SetAxisState(unsigned int, PS2::CControllerInfo::BUTTON, uint8, uint8*) override; void SetAxisState(unsigned int, PS2::CControllerInfo::BUTTON, uint8, uint8*) override;
void GetVibration(unsigned int, uint8& largeMotor, uint8& smallMotor) override {};
//CGunListener //CGunListener
void SetGunPosition(float, float) override; void SetGunPosition(float, float) override;

View file

@ -28,6 +28,7 @@ namespace Iop
void LoadState(Framework::CZipArchiveReader&) override; void LoadState(Framework::CZipArchiveReader&) override;
void SetButtonState(unsigned int, PS2::CControllerInfo::BUTTON, bool, uint8*) override; void SetButtonState(unsigned int, PS2::CControllerInfo::BUTTON, bool, uint8*) override;
void SetAxisState(unsigned int, PS2::CControllerInfo::BUTTON, uint8, uint8*) override; void SetAxisState(unsigned int, PS2::CControllerInfo::BUTTON, uint8, uint8*) override;
void GetVibration(unsigned int padId, uint8& largeMotor, uint8& smallMotor) override {};
enum MODULE_ID enum MODULE_ID
{ {

View file

@ -343,6 +343,10 @@ void CSio2::ProcessController(unsigned int portId, size_t outputOffset, uint32 d
//Pad data goes here //Pad data goes here
m_outputBuffer[outputOffset + 0x03] = static_cast<uint8>(padState.buttonState >> 8); m_outputBuffer[outputOffset + 0x03] = static_cast<uint8>(padState.buttonState >> 8);
m_outputBuffer[outputOffset + 0x04] = static_cast<uint8>(padState.buttonState & 0xFF); m_outputBuffer[outputOffset + 0x04] = static_cast<uint8>(padState.buttonState & 0xFF);
padState.smallMotor = m_inputBuffer[0x03] & 0x01;
padState.largeMotor = m_inputBuffer[0x04];
if(dstSize >= 9) if(dstSize >= 9)
{ {
//Analog stuff //Analog stuff
@ -661,3 +665,10 @@ void CSio2::DisassembleWrite(uint32 address, uint32 value)
break; break;
} }
} }
void CSio2::GetVibration(unsigned int padId, uint8& largeMotor, uint8& smallMotor)
{
auto& padState = m_padState[padId];
largeMotor = padState.largeMotor;
smallMotor = padState.smallMotor;
}

View file

@ -32,6 +32,7 @@ namespace Iop
void SetButtonState(unsigned int, PS2::CControllerInfo::BUTTON, bool, uint8*) override; void SetButtonState(unsigned int, PS2::CControllerInfo::BUTTON, bool, uint8*) override;
void SetAxisState(unsigned int, PS2::CControllerInfo::BUTTON, uint8, uint8*) override; void SetAxisState(unsigned int, PS2::CControllerInfo::BUTTON, uint8, uint8*) override;
void GetVibration(unsigned int padId, uint8& largeMotor, uint8& smallMotor) override;
private: private:
enum REGISTERS enum REGISTERS
@ -72,6 +73,8 @@ namespace Iop
uint8 pollMask[3]; uint8 pollMask[3];
uint16 buttonState; uint16 buttonState;
uint8 analogStickState[4]; uint8 analogStickState[4];
uint8 smallMotor;
uint8 largeMotor;
}; };
typedef std::deque<uint8> ByteBufferType; typedef std::deque<uint8> ByteBufferType;