mirror of
https://github.com/cemu-project/Cemu.git
synced 2026-04-26 21:15:16 -06:00
146 lines
3.4 KiB
C++
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{};
|
|
|
|
|
|
};
|