Skip to content

Commit

Permalink
input: redesign pad profiles
Browse files Browse the repository at this point in the history
  • Loading branch information
Megamouse committed Aug 13, 2021
1 parent 063df64 commit f91c7c1
Show file tree
Hide file tree
Showing 28 changed files with 747 additions and 595 deletions.
53 changes: 50 additions & 3 deletions Utilities/Config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,6 @@ void cfg::encode(YAML::Emitter& out, const cfg::_base& rhs)
out << YAML::Value;
encode(out, *node);
}

out << YAML::EndMap;
return;
}
Expand All @@ -237,10 +236,20 @@ void cfg::encode(YAML::Emitter& out, const cfg::_base& rhs)
{
out << str;
}

out << YAML::EndSeq;
return;
}
case type::map:
{
out << YAML::BeginMap;
for (const auto& np : static_cast<const map_entry&>(rhs).get_map())
{
out << YAML::Key << np.first;
out << YAML::Value << fmt::format("%s", np.second);
}
out << YAML::EndMap;
return;
}
case type::log:
{
out << YAML::BeginMap;
Expand All @@ -250,7 +259,6 @@ void cfg::encode(YAML::Emitter& out, const cfg::_base& rhs)
out << YAML::Key << np.first;
out << YAML::Value << fmt::format("%s", np.second);
}

out << YAML::EndMap;
return;
}
Expand Down Expand Up @@ -305,6 +313,25 @@ void cfg::decode(const YAML::Node& data, cfg::_base& rhs, bool dynamic)

break;
}
case type::map:
{
if (!data.IsMap())
{
return;
}

std::map<std::string, std::string> values;

for (const auto& pair : data)
{
if (!pair.first.IsScalar() || !pair.second.IsScalar()) continue;

values.emplace(pair.first.Scalar(), pair.second.Scalar());
}

static_cast<map_entry&>(rhs).set_map(std::move(values));
break;
}
case type::log:
{
if (data.IsScalar() || data.IsSequence())
Expand Down Expand Up @@ -387,6 +414,26 @@ void cfg::set_entry::from_default()
m_set = {};
}

std::string cfg::map_entry::get_value(const std::string& key)
{
return m_map.contains(key) ? m_map.at(key) : "";
}

void cfg::map_entry::set_value(const std::string& key, const std::string& value)
{
m_map[key] = value;
}

void cfg::map_entry::set_map(std::map<std::string, std::string>&& map)
{
m_map = std::move(map);
}

void cfg::map_entry::from_default()
{
set_map({});
}

void cfg::log_entry::set_map(std::map<std::string, logs::level>&& map)
{
m_map = std::move(map);
Expand Down
24 changes: 24 additions & 0 deletions Utilities/Config.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ namespace cfg
uint, // cfg::uint type
string, // cfg::string type
set, // cfg::set_entry type
map, // cfg::map_entry type
log,
};

Expand Down Expand Up @@ -473,6 +474,29 @@ namespace cfg
}
};

class map_entry final : public _base
{
std::map<std::string, std::string> m_map{};

public:
map_entry(node* owner, const std::string& name)
: _base(type::map, owner, name, true)
{
}

const std::map<std::string, std::string>& get_map() const
{
return m_map;
}

std::string get_value(const std::string& key);

void set_value(const std::string& key, const std::string& value);
void set_map(std::map<std::string, std::string>&& map);

void from_default() override;
};

class log_entry final : public _base
{
std::map<std::string, logs::level> m_map{};
Expand Down
5 changes: 1 addition & 4 deletions rpcs3/Emu/Io/Null/NullPadHandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,10 @@ class NullPadHandler final : public PadHandlerBase
return true;
}

void init_config(pad_config* cfg, const std::string& /*name*/) override
void init_config(cfg_pad* cfg) override
{
if (!cfg) return;

// This profile does not need a save location
cfg->cfg_name = "";

// Reset default button mapping
cfg->ls_left.def = "";
cfg->ls_down.def = "";
Expand Down
119 changes: 46 additions & 73 deletions rpcs3/Emu/Io/PadHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -299,39 +299,11 @@ bool PadHandlerBase::has_pressure_intensity_button() const
return b_has_pressure_intensity_button;
}

std::string PadHandlerBase::get_config_dir(pad_handler type, const std::string& title_id)
{
if (!title_id.empty())
{
return rpcs3::utils::get_custom_input_config_dir(title_id) + fmt::format("%s", type) + "/";
}
return fs::get_config_dir() + "/InputConfigs/" + fmt::format("%s", type) + "/";
}

std::string PadHandlerBase::get_config_filename(int i, const std::string& title_id)
{
if (!title_id.empty() && fs::is_file(rpcs3::utils::get_custom_input_config_path(title_id)))
{
const std::string path = rpcs3::utils::get_custom_input_config_dir(title_id) + g_cfg_input.player[i]->handler.to_string() + "/" + g_cfg_input.player[i]->profile.to_string() + ".yml";
if (fs::is_file(path))
{
return path;
}
}
return fs::get_config_dir() + "/InputConfigs/" + g_cfg_input.player[i]->handler.to_string() + "/" + g_cfg_input.player[i]->profile.to_string() + ".yml";
}

void PadHandlerBase::init_configs()
{
int index = 0;

for (u32 i = 0; i < MAX_GAMEPADS; i++)
{
if (g_cfg_input.player[i]->handler == m_type)
{
init_config(&m_pad_configs[index], get_config_filename(i, pad::g_title_id));
index++;
}
init_config(&m_pad_configs[i]);
}
}

Expand Down Expand Up @@ -460,24 +432,23 @@ bool PadHandlerBase::bindPadToDevice(std::shared_ptr<Pad> pad, const std::string
return false;
}

const int index = static_cast<int>(bindings.size());
m_pad_configs[index].load();
pad_device->config = &m_pad_configs[index];
m_pad_configs[player_id].from_string(g_cfg_input.player[player_id]->config.to_string());
pad_device->config = &m_pad_configs[player_id];
pad_device->player_id = player_id;
pad_config* profile = pad_device->config;
if (profile == nullptr)
cfg_pad* config = pad_device->config;
if (config == nullptr)
{
input_log.error("PadHandlerBase::bindPadToDevice: no profile found for device %d '%s'", index, device);
input_log.error("PadHandlerBase::bindPadToDevice: no profile found for device %d '%s'", bindings.size(), device);
return false;
}

std::array<u32, button::button_count> mapping = get_mapped_key_codes(pad_device, profile);
std::array<u32, button::button_count> mapping = get_mapped_key_codes(pad_device, config);

u32 pclass_profile = 0x0;

for (const auto& product : input::get_products_by_class(profile->device_class_type))
for (const auto& product : input::get_products_by_class(config->device_class_type))
{
if (product.vendor_id == profile->vendor_id && product.product_id == profile->product_id)
if (product.vendor_id == config->vendor_id && product.product_id == config->product_id)
{
pclass_profile = product.pclass_profile;
}
Expand All @@ -488,11 +459,11 @@ bool PadHandlerBase::bindPadToDevice(std::shared_ptr<Pad> pad, const std::string
CELL_PAD_STATUS_DISCONNECTED,
CELL_PAD_CAPABILITY_PS3_CONFORMITY | CELL_PAD_CAPABILITY_PRESS_MODE | CELL_PAD_CAPABILITY_HP_ANALOG_STICK | CELL_PAD_CAPABILITY_ACTUATOR | CELL_PAD_CAPABILITY_SENSOR_MODE,
CELL_PAD_DEV_TYPE_STANDARD,
profile->device_class_type,
config->device_class_type,
pclass_profile,
profile->vendor_id,
profile->product_id,
profile->pressure_intensity
config->vendor_id,
config->product_id,
config->pressure_intensity
);

pad->m_buttons.emplace_back(special_button_offset, mapping[button::pressure_intensity_button], special_button_value::pressure_intensity);
Expand Down Expand Up @@ -535,37 +506,39 @@ bool PadHandlerBase::bindPadToDevice(std::shared_ptr<Pad> pad, const std::string
return true;
}

std::array<u32, PadHandlerBase::button::button_count> PadHandlerBase::get_mapped_key_codes(const std::shared_ptr<PadDevice>& /*device*/, const pad_config* profile)
{
std::array<u32, button::button_count> mapping;

mapping[button::up] = FindKeyCode(button_list, profile->up);
mapping[button::down] = FindKeyCode(button_list, profile->down);
mapping[button::left] = FindKeyCode(button_list, profile->left);
mapping[button::right] = FindKeyCode(button_list, profile->right);
mapping[button::cross] = FindKeyCode(button_list, profile->cross);
mapping[button::square] = FindKeyCode(button_list, profile->square);
mapping[button::circle] = FindKeyCode(button_list, profile->circle);
mapping[button::triangle] = FindKeyCode(button_list, profile->triangle);
mapping[button::start] = FindKeyCode(button_list, profile->start);
mapping[button::select] = FindKeyCode(button_list, profile->select);
mapping[button::l1] = FindKeyCode(button_list, profile->l1);
mapping[button::l2] = FindKeyCode(button_list, profile->l2);
mapping[button::l3] = FindKeyCode(button_list, profile->l3);
mapping[button::r1] = FindKeyCode(button_list, profile->r1);
mapping[button::r2] = FindKeyCode(button_list, profile->r2);
mapping[button::r3] = FindKeyCode(button_list, profile->r3);
mapping[button::ls_left] = FindKeyCode(button_list, profile->ls_left);
mapping[button::ls_right] = FindKeyCode(button_list, profile->ls_right);
mapping[button::ls_down] = FindKeyCode(button_list, profile->ls_down);
mapping[button::ls_up] = FindKeyCode(button_list, profile->ls_up);
mapping[button::rs_left] = FindKeyCode(button_list, profile->rs_left);
mapping[button::rs_right] = FindKeyCode(button_list, profile->rs_right);
mapping[button::rs_down] = FindKeyCode(button_list, profile->rs_down);
mapping[button::rs_up] = FindKeyCode(button_list, profile->rs_up);
mapping[button::ps] = FindKeyCode(button_list, profile->ps);

mapping[button::pressure_intensity_button] = FindKeyCode(button_list, profile->pressure_intensity_button);
std::array<u32, PadHandlerBase::button::button_count> PadHandlerBase::get_mapped_key_codes(const std::shared_ptr<PadDevice>& /*device*/, const cfg_pad* cfg)
{
std::array<u32, button::button_count> mapping{};
if (!cfg)
return mapping;

mapping[button::up] = FindKeyCode(button_list, cfg->up);
mapping[button::down] = FindKeyCode(button_list, cfg->down);
mapping[button::left] = FindKeyCode(button_list, cfg->left);
mapping[button::right] = FindKeyCode(button_list, cfg->right);
mapping[button::cross] = FindKeyCode(button_list, cfg->cross);
mapping[button::square] = FindKeyCode(button_list, cfg->square);
mapping[button::circle] = FindKeyCode(button_list, cfg->circle);
mapping[button::triangle] = FindKeyCode(button_list, cfg->triangle);
mapping[button::start] = FindKeyCode(button_list, cfg->start);
mapping[button::select] = FindKeyCode(button_list, cfg->select);
mapping[button::l1] = FindKeyCode(button_list, cfg->l1);
mapping[button::l2] = FindKeyCode(button_list, cfg->l2);
mapping[button::l3] = FindKeyCode(button_list, cfg->l3);
mapping[button::r1] = FindKeyCode(button_list, cfg->r1);
mapping[button::r2] = FindKeyCode(button_list, cfg->r2);
mapping[button::r3] = FindKeyCode(button_list, cfg->r3);
mapping[button::ls_left] = FindKeyCode(button_list, cfg->ls_left);
mapping[button::ls_right] = FindKeyCode(button_list, cfg->ls_right);
mapping[button::ls_down] = FindKeyCode(button_list, cfg->ls_down);
mapping[button::ls_up] = FindKeyCode(button_list, cfg->ls_up);
mapping[button::rs_left] = FindKeyCode(button_list, cfg->rs_left);
mapping[button::rs_right] = FindKeyCode(button_list, cfg->rs_right);
mapping[button::rs_down] = FindKeyCode(button_list, cfg->rs_down);
mapping[button::rs_up] = FindKeyCode(button_list, cfg->rs_up);
mapping[button::ps] = FindKeyCode(button_list, cfg->ps);

mapping[button::pressure_intensity_button] = FindKeyCode(button_list, cfg->pressure_intensity_button);

return mapping;
}
Expand Down
11 changes: 4 additions & 7 deletions rpcs3/Emu/Io/PadHandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
class PadDevice
{
public:
pad_config* config{ nullptr };
cfg_pad* config{ nullptr };
u8 player_id{0};
};

Expand Down Expand Up @@ -83,7 +83,7 @@ class PadHandlerBase
bool b_has_rumble = false;
bool b_has_config = false;
bool b_has_pressure_intensity_button = true;
std::array<pad_config, MAX_GAMEPADS> m_pad_configs;
std::array<cfg_pad, MAX_GAMEPADS> m_pad_configs;
std::vector<std::pair<std::shared_ptr<PadDevice>, std::shared_ptr<Pad>>> bindings;
std::unordered_map<u32, std::string> button_list;
std::vector<u32> blacklist;
Expand Down Expand Up @@ -153,9 +153,6 @@ class PadHandlerBase
bool has_battery() const;
bool has_pressure_intensity_button() const;

static std::string get_config_dir(pad_handler type, const std::string& title_id = "");
static std::string get_config_filename(int i, const std::string& title_id = "");

u16 NormalizeStickInput(u16 raw_value, int threshold, int multiplier, bool ignore_threshold = false) const;
void convert_stick_values(u16& x_out, u16& y_out, const s32& x_in, const s32& y_in, const s32& deadzone, const s32& padsquircling) const;

Expand All @@ -171,7 +168,7 @@ class PadHandlerBase
virtual void ThreadProc();
// Binds a Pad to a device
virtual bool bindPadToDevice(std::shared_ptr<Pad> pad, const std::string& device, u8 player_id);
virtual void init_config(pad_config* /*cfg*/, const std::string& /*name*/) = 0;
virtual void init_config(cfg_pad* /*cfg*/) = 0;
virtual void get_next_button_press(const std::string& padId, const pad_callback& callback, const pad_fail_callback& fail_callback, bool get_blacklist, const std::vector<std::string>& buttons = {});

private:
Expand All @@ -187,7 +184,7 @@ class PadHandlerBase
virtual pad_preview_values get_preview_values(const std::unordered_map<u64, u16>& /*data*/) { return {}; }

protected:
virtual std::array<u32, PadHandlerBase::button::button_count> get_mapped_key_codes(const std::shared_ptr<PadDevice>& /*device*/, const pad_config* profile);
virtual std::array<u32, PadHandlerBase::button::button_count> get_mapped_key_codes(const std::shared_ptr<PadDevice>& device, const cfg_pad* cfg);
virtual void get_mapping(const std::shared_ptr<PadDevice>& device, const std::shared_ptr<Pad>& pad);
void TranslateButtonPress(const std::shared_ptr<PadDevice>& device, u64 keyCode, bool& pressed, u16& val, bool ignore_stick_threshold = false, bool ignore_trigger_threshold = false);
void init_configs();
Expand Down

0 comments on commit f91c7c1

Please sign in to comment.