Save/load buzzer state.

This commit is contained in:
Jean-Philip Desjardins 2024-06-18 17:00:13 -04:00
parent 1524bbcea1
commit d0dd51a235
7 changed files with 90 additions and 6 deletions

View file

@ -1,8 +1,13 @@
#include "PadHandler.h"
void CPadHandler::InsertListener(CPadInterface* pListener)
void CPadHandler::InsertListener(CPadInterface* listener)
{
m_interfaces.push_back(pListener);
m_interfaces.push_back(listener);
}
bool CPadHandler::HasListener(CPadInterface* listener) const
{
return std::find(m_interfaces.begin(), m_interfaces.end(), listener) != m_interfaces.end();
}
void CPadHandler::RemoveAllListeners()

View file

@ -1,5 +1,4 @@
#ifndef _PADHANDLER_H_
#define _PADHANDLER_H_
#pragma once
#include "PadInterface.h"
#include <list>
@ -14,11 +13,10 @@ public:
virtual ~CPadHandler() = default;
virtual void Update(uint8*) = 0;
void InsertListener(CPadInterface*);
bool HasListener(CPadInterface*) const;
void RemoveAllListeners();
protected:
typedef std::list<CPadInterface*> ListenerList;
ListenerList m_interfaces;
};
#endif

View file

@ -1,12 +1,17 @@
#include "Iop_Usbd.h"
#include "IopBios.h"
#include "../Log.h"
#include "string_format.h"
#include "lexical_cast_ex.h"
#include "UsbBuzzerDevice.h"
#include "states/RegisterStateCollectionFile.h"
using namespace Iop;
#define LOG_NAME "iop_usbd"
#define STATE_XML ("iop_usbd/state.xml")
#define FUNCTION_REGISTERLLD "RegisterLld"
#define FUNCTION_SCANSTATICDESCRIPTOR "ScanStaticDescriptor"
#define FUNCTION_OPENPIPE "OpenPipe"
@ -83,6 +88,38 @@ void CUsbd::Invoke(CMIPS& context, unsigned int functionId)
}
}
void CUsbd::SaveState(Framework::CZipArchiveWriter& writer) const
{
auto devicesStateFile = std::make_unique<CRegisterStateCollectionFile>(STATE_XML);
for(auto activeDeviceId : m_activeDeviceIds)
{
auto devicePairIterator = m_devices.find(activeDeviceId);
assert(devicePairIterator != m_devices.end());
auto& device = devicePairIterator->second;
auto deviceStateId = string_format("%08x", device->GetId());
CRegisterState deviceState;
device->SaveState(deviceState);
devicesStateFile->InsertRegisterState(deviceStateId.c_str(), std::move(deviceState));
}
writer.InsertFile(std::move(devicesStateFile));
}
void CUsbd::LoadState(Framework::CZipArchiveReader& reader)
{
m_activeDeviceIds.clear();
auto deviceStateFile = CRegisterStateCollectionFile(*reader.BeginReadFile(STATE_XML));
for(const auto& deviceStatePair : deviceStateFile)
{
uint32 deviceId = lexical_cast_hex<std::string>(deviceStatePair.first);
auto devicePairIterator = m_devices.find(deviceId);
if(devicePairIterator == std::end(m_devices)) continue;
const auto& deviceState = deviceStatePair.second;
auto& device = devicePairIterator->second;
device->LoadState(deviceState);
m_activeDeviceIds.push_back(deviceId);
}
}
void CUsbd::CountTicks(uint32 ticks)
{
for(auto activeDeviceId : m_activeDeviceIds)

View file

@ -17,6 +17,9 @@ namespace Iop
std::string GetFunctionName(unsigned int) const override;
void Invoke(CMIPS&, unsigned int) override;
void SaveState(Framework::CZipArchiveWriter&) const override;
void LoadState(Framework::CZipArchiveReader&) override;
void CountTicks(uint32);
template <typename DeviceType>

View file

@ -3,15 +3,48 @@
#include "IopBios.h"
#include "PadHandler.h"
#include "Ps2Const.h"
#include "states/RegisterState.h"
using namespace Iop;
#define STATE_REG_DESCRIPTORMEMPTR ("descriptorMemPtr")
#define STATE_REG_NEXTTRANSFERTICKS ("nextTransferTicks")
#define STATE_REG_TRANSFERBUFFERPTR ("transferBufferPtr")
#define STATE_REG_TRANSFERSIZE ("transferSize")
#define STATE_REG_TRANSFERCB ("transferCb")
#define STATE_REG_TRANSFERCBARG ("transferCbArg")
CBuzzerUsbDevice::CBuzzerUsbDevice(CIopBios& bios, uint8* ram)
: m_bios(bios)
, m_ram(ram)
{
}
void CBuzzerUsbDevice::SaveState(CRegisterState& state) const
{
state.SetRegister32(STATE_REG_DESCRIPTORMEMPTR, m_descriptorMemPtr);
state.SetRegister32(STATE_REG_NEXTTRANSFERTICKS, m_nextTransferTicks);
state.SetRegister32(STATE_REG_TRANSFERBUFFERPTR, m_transferBufferPtr);
state.SetRegister32(STATE_REG_TRANSFERSIZE, m_transferSize);
state.SetRegister32(STATE_REG_TRANSFERCB, m_transferCb);
state.SetRegister32(STATE_REG_TRANSFERCBARG, m_transferCbArg);
}
void CBuzzerUsbDevice::LoadState(const CRegisterState& state)
{
m_descriptorMemPtr = state.GetRegister32(STATE_REG_DESCRIPTORMEMPTR);
m_nextTransferTicks = state.GetRegister32(STATE_REG_NEXTTRANSFERTICKS);
m_transferBufferPtr = state.GetRegister32(STATE_REG_TRANSFERBUFFERPTR);
m_transferSize = state.GetRegister32(STATE_REG_TRANSFERSIZE);
m_transferCb = state.GetRegister32(STATE_REG_TRANSFERCB);
m_transferCbArg = state.GetRegister32(STATE_REG_TRANSFERCBARG);
if(!m_padHandler->HasListener(this))
{
m_padHandler->InsertListener(this);
}
}
void CBuzzerUsbDevice::SetPadHandler(CPadHandler* padHandler)
{
m_padHandler = padHandler;

View file

@ -25,6 +25,9 @@ namespace Iop
uint16 GetId() const override;
const char* GetLldName() const override;
void SaveState(CRegisterState&) const override;
void LoadState(const CRegisterState&);
void CountTicks(uint32) override;
void OnLldRegistered() override;

View file

@ -3,6 +3,8 @@
#include "Types.h"
#include <memory>
class CRegisterState;
namespace Iop
{
class CUsbDevice
@ -13,6 +15,9 @@ namespace Iop
virtual uint16 GetId() const = 0;
virtual const char* GetLldName() const = 0;
virtual void SaveState(CRegisterState&) const {};
virtual void LoadState(const CRegisterState&){};
virtual void CountTicks(uint32) = 0;
virtual void OnLldRegistered() = 0;