mirror of
https://github.com/jpd002/Play-.git
synced 2025-04-28 13:47:57 +03:00
Save/load buzzer state.
This commit is contained in:
parent
1524bbcea1
commit
d0dd51a235
7 changed files with 90 additions and 6 deletions
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue