1 #pragma once 2 #include "stdafx.h" 3 #include "BaseControlDevice.h" 4 5 class PartyTap : public BaseControlDevice 6 { 7 private: 8 uint8_t _stateBuffer = 0; 9 uint8_t _readCount = 0; 10 bool _enabled = false; 11 12 protected: 13 enum Buttons { B1 = 0, B2, B3, B4, B5, B6 }; 14 GetKeyNames()15 string GetKeyNames() override 16 { 17 return "123456"; 18 } 19 InternalSetStateFromInput()20 void InternalSetStateFromInput() override 21 { 22 for(KeyMapping keyMapping : _keyMappings) { 23 for(int i = 0; i < 6; i++) { 24 SetPressedState(i, keyMapping.PartyTapButtons[i]); 25 } 26 } 27 } 28 StreamState(bool saving)29 void StreamState(bool saving) override 30 { 31 BaseControlDevice::StreamState(saving); 32 Stream(_stateBuffer, _readCount, _enabled); 33 } 34 35 public: PartyTap(shared_ptr<Console> console,KeyMappingSet keyMappings)36 PartyTap(shared_ptr<Console> console, KeyMappingSet keyMappings) : BaseControlDevice(console, BaseControlDevice::ExpDevicePort, keyMappings) 37 { 38 } 39 ReadRAM(uint16_t addr)40 uint8_t ReadRAM(uint16_t addr) override 41 { 42 if(addr == 0x4017) { 43 if(_readCount < 2) { 44 uint8_t value = (_stateBuffer & 0x7) << 2; 45 _stateBuffer >>= 3; 46 StrobeProcessRead(); 47 _readCount++; 48 return value; 49 } else { 50 //"After 1st/2nd reads, a detection value can be read : $4017 & $1C == $14" 51 return 0x14; 52 } 53 } 54 return 0; 55 } 56 RefreshStateBuffer()57 void RefreshStateBuffer() override 58 { 59 _readCount = 0; 60 _stateBuffer = 61 IsPressed(PartyTap::Buttons::B1) ? 1 : 0 | 62 IsPressed(PartyTap::Buttons::B2) ? 2 : 0 | 63 IsPressed(PartyTap::Buttons::B3) ? 4 : 0 | 64 IsPressed(PartyTap::Buttons::B4) ? 8 : 0 | 65 IsPressed(PartyTap::Buttons::B5) ? 16 : 0 | 66 IsPressed(PartyTap::Buttons::B6) ? 32 : 0; 67 } 68 WriteRAM(uint16_t addr,uint8_t value)69 void WriteRAM(uint16_t addr, uint8_t value) override 70 { 71 StrobeProcessWrite(value); 72 } 73 };