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"
|
#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()
|
void CPadHandler::RemoveAllListeners()
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#ifndef _PADHANDLER_H_
|
#pragma once
|
||||||
#define _PADHANDLER_H_
|
|
||||||
|
|
||||||
#include "PadInterface.h"
|
#include "PadInterface.h"
|
||||||
#include <list>
|
#include <list>
|
||||||
|
@ -14,11 +13,10 @@ public:
|
||||||
virtual ~CPadHandler() = default;
|
virtual ~CPadHandler() = default;
|
||||||
virtual void Update(uint8*) = 0;
|
virtual void Update(uint8*) = 0;
|
||||||
void InsertListener(CPadInterface*);
|
void InsertListener(CPadInterface*);
|
||||||
|
bool HasListener(CPadInterface*) const;
|
||||||
void RemoveAllListeners();
|
void RemoveAllListeners();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
typedef std::list<CPadInterface*> ListenerList;
|
typedef std::list<CPadInterface*> ListenerList;
|
||||||
ListenerList m_interfaces;
|
ListenerList m_interfaces;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -1,12 +1,17 @@
|
||||||
#include "Iop_Usbd.h"
|
#include "Iop_Usbd.h"
|
||||||
#include "IopBios.h"
|
#include "IopBios.h"
|
||||||
#include "../Log.h"
|
#include "../Log.h"
|
||||||
|
#include "string_format.h"
|
||||||
|
#include "lexical_cast_ex.h"
|
||||||
#include "UsbBuzzerDevice.h"
|
#include "UsbBuzzerDevice.h"
|
||||||
|
#include "states/RegisterStateCollectionFile.h"
|
||||||
|
|
||||||
using namespace Iop;
|
using namespace Iop;
|
||||||
|
|
||||||
#define LOG_NAME "iop_usbd"
|
#define LOG_NAME "iop_usbd"
|
||||||
|
|
||||||
|
#define STATE_XML ("iop_usbd/state.xml")
|
||||||
|
|
||||||
#define FUNCTION_REGISTERLLD "RegisterLld"
|
#define FUNCTION_REGISTERLLD "RegisterLld"
|
||||||
#define FUNCTION_SCANSTATICDESCRIPTOR "ScanStaticDescriptor"
|
#define FUNCTION_SCANSTATICDESCRIPTOR "ScanStaticDescriptor"
|
||||||
#define FUNCTION_OPENPIPE "OpenPipe"
|
#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)
|
void CUsbd::CountTicks(uint32 ticks)
|
||||||
{
|
{
|
||||||
for(auto activeDeviceId : m_activeDeviceIds)
|
for(auto activeDeviceId : m_activeDeviceIds)
|
||||||
|
|
|
@ -17,6 +17,9 @@ namespace Iop
|
||||||
std::string GetFunctionName(unsigned int) const override;
|
std::string GetFunctionName(unsigned int) const override;
|
||||||
void Invoke(CMIPS&, unsigned int) override;
|
void Invoke(CMIPS&, unsigned int) override;
|
||||||
|
|
||||||
|
void SaveState(Framework::CZipArchiveWriter&) const override;
|
||||||
|
void LoadState(Framework::CZipArchiveReader&) override;
|
||||||
|
|
||||||
void CountTicks(uint32);
|
void CountTicks(uint32);
|
||||||
|
|
||||||
template <typename DeviceType>
|
template <typename DeviceType>
|
||||||
|
|
|
@ -3,15 +3,48 @@
|
||||||
#include "IopBios.h"
|
#include "IopBios.h"
|
||||||
#include "PadHandler.h"
|
#include "PadHandler.h"
|
||||||
#include "Ps2Const.h"
|
#include "Ps2Const.h"
|
||||||
|
#include "states/RegisterState.h"
|
||||||
|
|
||||||
using namespace Iop;
|
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)
|
CBuzzerUsbDevice::CBuzzerUsbDevice(CIopBios& bios, uint8* ram)
|
||||||
: m_bios(bios)
|
: m_bios(bios)
|
||||||
, m_ram(ram)
|
, 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)
|
void CBuzzerUsbDevice::SetPadHandler(CPadHandler* padHandler)
|
||||||
{
|
{
|
||||||
m_padHandler = padHandler;
|
m_padHandler = padHandler;
|
||||||
|
|
|
@ -25,6 +25,9 @@ namespace Iop
|
||||||
uint16 GetId() const override;
|
uint16 GetId() const override;
|
||||||
const char* GetLldName() const override;
|
const char* GetLldName() const override;
|
||||||
|
|
||||||
|
void SaveState(CRegisterState&) const override;
|
||||||
|
void LoadState(const CRegisterState&);
|
||||||
|
|
||||||
void CountTicks(uint32) override;
|
void CountTicks(uint32) override;
|
||||||
|
|
||||||
void OnLldRegistered() override;
|
void OnLldRegistered() override;
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
#include "Types.h"
|
#include "Types.h"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
class CRegisterState;
|
||||||
|
|
||||||
namespace Iop
|
namespace Iop
|
||||||
{
|
{
|
||||||
class CUsbDevice
|
class CUsbDevice
|
||||||
|
@ -13,6 +15,9 @@ namespace Iop
|
||||||
virtual uint16 GetId() const = 0;
|
virtual uint16 GetId() const = 0;
|
||||||
virtual const char* GetLldName() 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 CountTicks(uint32) = 0;
|
||||||
|
|
||||||
virtual void OnLldRegistered() = 0;
|
virtual void OnLldRegistered() = 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue