Cemu/src/input/emulated/WPADController.h

146 lines
3.4 KiB
C++

#pragma once
#include "input/emulated/EmulatedController.h"
#include "Cafe/OS/libs/padscore/padscore.h"
#include "Cafe/OS/libs/vpad/vpad.h"
constexpr uint32 kWPADButtonRepeat = 0x80000000;
enum WPADDeviceType
{
kWAPDevCore = 0,
kWAPDevFreestyle = 1,
kWAPDevClassic = 2,
kWAPDevMPLS = 5,
kWAPDevMPLSFreeStyle = 6,
kWAPDevMPLSClassic = 7,
kWAPDevURCC = 31,
kWAPDevNotFound = 253,
kWAPDevUnknown = 255,
};
// core, balanceboard
enum WPADCoreButtons
{
kWPADButton_Left = 0x1,
kWPADButton_Right = 0x2,
kWPADButton_Down = 0x4,
kWPADButton_Up = 0x8,
kWPADButton_Plus = 0x10,
kWPADButton_2 = 0x100,
kWPADButton_1 = 0x200,
kWPADButton_B = 0x400,
kWPADButton_A = 0x800,
kWPADButton_Minus = 0x1000,
kWPADButton_Home = 0x8000,
};
// Nunchuck aka Freestyle
enum WPADNunchuckButtons
{
kWPADButton_Z = 0x2000,
kWPADButton_C = 0x4000,
};
// Classic Controller
enum WPADClassicButtons
{
kCLButton_Up = 0x1,
kCLButton_Left = 0x2,
kCLButton_ZR = 0x4,
kCLButton_X = 0x8,
kCLButton_A = 0x10,
kCLButton_Y = 0x20,
kCLButton_B = 0x40,
kCLButton_ZL = 0x80,
kCLButton_R = 0x200,
kCLButton_Plus = 0x400,
kCLButton_Home = 0x800,
kCLButton_Minus = 0x1000,
kCLButton_L = 0x2000,
kCLButton_Down = 0x4000,
kCLButton_Right = 0x8000
};
// Pro Controller aka URCC
enum WPADProButtons
{
kProButton_Up = 0x1,
kProButton_Left = 0x2,
kProButton_ZR = 0x4,
kProButton_X = 0x8,
kProButton_A = 0x10,
kProButton_Y = 0x20,
kProButton_B = 0x40,
kProButton_ZL = 0x80,
kProButton_R = 0x200,
kProButton_Plus = 0x400,
kProButton_Home = 0x800,
kProButton_Minus = 0x1000,
kProButton_L = 0x2000,
kProButton_Down = 0x4000,
kProButton_Right = 0x8000,
kProButton_StickR = 0x10000,
kProButton_StickL = 0x20000
};
enum WPADDataFormat {
kDataFormat_CORE = 0,
kDataFormat_CORE_ACC = 1,
kDataFormat_CORE_ACC_DPD = 2,
kDataFormat_FREESTYLE = 3,
kDataFormat_FREESTYLE_ACC = 4,
kDataFormat_FREESTYLE_ACC_DPD = 5,
kDataFormat_CLASSIC = 6,
kDataFormat_CLASSIC_ACC = 7,
kDataFormat_CLASSIC_ACC_DPD = 8,
kDataFormat_CORE_ACC_DPD_FULL = 9, // buttons, motion, pointing
kDataFormat_TRAIN = 10,
kDataFormat_GUITAR = 11,
kDataFormat_BALANCE_CHECKER = 12,
kDataFormat_DRUM = 15,
kDataFormat_MPLS = 16, // buttons, motion, pointing, motion plus
kDataFormat_TAIKO = 17,
kDataFormat_URCC = 22, // buttons, URCC aka pro
};
class WPADController : public EmulatedController
{
using base_type = EmulatedController;
public:
WPADController(size_t player_index, WPADDataFormat data_format);
uint32 get_emulated_button_flag(WPADDataFormat format, uint32 id) const;
virtual WPADDeviceType get_device_type() const = 0;
WPADDataFormat get_data_format() const { return m_data_format; }
void set_data_format(WPADDataFormat data_format) { m_data_format = data_format; }
void WPADRead(WPADStatus_t* status);
void KPADRead(KPADStatus_t& status, const BtnRepeat& repeat);
virtual bool is_mpls_attached() { return false; }
enum class ConnectCallbackStatus
{
None, // do nothing
ReportDisconnect, // call disconnect
ReportConnect, // call connect
};
ConnectCallbackStatus m_status = ConnectCallbackStatus::ReportConnect;
ConnectCallbackStatus m_extension_status = ConnectCallbackStatus::ReportConnect;
WPADDataFormat get_default_data_format() const;
protected:
WPADDataFormat m_data_format;
private:
uint32be m_last_holdvalue = 0;
std::chrono::steady_clock::time_point m_last_hold_change{}, m_last_pulse{};
};