rpcs3/rpcs3/mm_joystick_handler.h

75 lines
2.2 KiB
C++

#pragma once
#include "Emu/Io/PadHandler.h"
#include <Windows.h>
#include <mmsystem.h>
#include "Utilities/Config.h"
struct mm_joystick_config final : cfg::node
{
const std::string cfg_name = fs::get_config_dir() + "/config_mmjoystick.yml";
//cfg::int32 left_stick_left{this, "Left Analog Stick Left", static_cast<int>('A')};
//cfg::int32 left_stick_down{this, "Left Analog Stick Down", static_cast<int>('S')};
//cfg::int32 left_stick_right{this, "Left Analog Stick Right", static_cast<int>('D')};
//cfg::int32 left_stick_up{this, "Left Analog Stick Up", static_cast<int>('W')};
//cfg::int32 right_stick_left{this, "Right Analog Stick Left", 313};
//cfg::int32 right_stick_down{this, "Right Analog Stick Down", 367};
//cfg::int32 right_stick_right{this, "Right Analog Stick Right", 312};
//cfg::int32 right_stick_up{this, "Right Analog Stick Up", 366};
cfg::int32 start{this, "Start", JOY_BUTTON9};
cfg::int32 select{this, "Select", JOY_BUTTON10};
cfg::int32 square{this, "Square", JOY_BUTTON4};
cfg::int32 cross{this, "Cross", JOY_BUTTON3};
cfg::int32 circle{this, "Circle", JOY_BUTTON2};
cfg::int32 triangle{this, "Triangle", JOY_BUTTON1};
//cfg::int32 left{this, "Left", 314};
//cfg::int32 down{this, "Down", 317};
//cfg::int32 right{this, "Right", 316};
//cfg::int32 up{this, "Up", 315};
cfg::int32 r1{this, "R1", JOY_BUTTON8};
cfg::int32 r2{this, "R2", JOY_BUTTON6};
cfg::int32 r3{this, "R3", JOY_BUTTON12};
cfg::int32 l1{this, "L1", JOY_BUTTON7};
cfg::int32 l2{this, "L2", JOY_BUTTON5};
cfg::int32 l3{this, "L3", JOY_BUTTON11};
bool load()
{
if (fs::file cfg_file{ cfg_name, fs::read })
{
return from_string(cfg_file.to_string());
}
return false;
}
void save()
{
fs::file(cfg_name, fs::rewrite).write(to_string());
}
};
class mm_joystick_handler final : public PadHandlerBase
{
public:
mm_joystick_handler();
~mm_joystick_handler();
bool Init() override;
std::vector<std::string> ListDevices() override;
bool bindPadToDevice(std::shared_ptr<Pad> pad, const std::string& device) override;
void ThreadProc() override;
private:
bool is_init;
u32 supportedJoysticks;
JOYINFOEX js_info;
JOYCAPS js_caps;
std::vector<std::shared_ptr<Pad>> bindings;
std::array<bool, 7> last_connection_status = {};
};