Mesen2/Core/Shared/SystemActionManager.h
2023-12-14 22:23:27 +09:00

94 lines
No EOL
1.9 KiB
C++

#pragma once
#include "pch.h"
#include "Shared/BaseControlDevice.h"
#include "Shared/Emulator.h"
class SystemActionManager : public BaseControlDevice
{
private:
bool _needReset = false;
bool _needPowerCycle = false;
protected:
string GetKeyNames() override
{
return "RP";
}
public:
enum Buttons { ResetButton = 0, PowerButton = 1 };
SystemActionManager(Emulator* emu) : BaseControlDevice(emu, ControllerType::None, BaseControlDevice::ConsoleInputPort)
{
_connected = false;
}
uint8_t ReadRam(uint16_t addr) override
{
return 0;
}
void WriteRam(uint16_t addr, uint8_t value) override
{
}
void ResetState()
{
//Only reset these flags once the reset/power cycle is done
//Called by emu class after reloading/resetting the game
//This is needed to avoid a reset/power cycle command from
//being queue while a reset/power cycle is in progress (which can
//break things when the debugger is opened, etc.)
_needPowerCycle = false;
_needReset = false;
//TODOv2 review this - prevents NES from power cycling 2x in a row
ClearBit(SystemActionManager::Buttons::ResetButton);
ClearBit(SystemActionManager::Buttons::PowerButton);
}
void OnAfterSetState() override
{
if(_needReset) {
SetBit(SystemActionManager::Buttons::ResetButton);
}
if(_needPowerCycle) {
SetBit(SystemActionManager::Buttons::PowerButton);
}
}
bool Reset()
{
if(!_needReset) {
_needReset = true;
_emu->SuspendDebugger(false);
return true;
}
return false;
}
bool PowerCycle()
{
if(!_needPowerCycle) {
_needPowerCycle = true;
_emu->SuspendDebugger(false);
return true;
}
return false;
}
bool IsResetPending()
{
return _needReset || _needPowerCycle;
}
bool IsResetPressed()
{
return IsPressed(SystemActionManager::Buttons::ResetButton);
}
bool IsPowerCyclePressed()
{
return IsPressed(SystemActionManager::Buttons::PowerButton);
}
};