|
|
@ -10,41 +10,31 @@ namespace InputCommon { |
|
|
|
|
|
|
|
|
void InputEngine::PreSetController(const PadIdentifier& identifier) { |
|
|
void InputEngine::PreSetController(const PadIdentifier& identifier) { |
|
|
std::lock_guard lock{mutex}; |
|
|
std::lock_guard lock{mutex}; |
|
|
if (!controller_list.contains(identifier)) { |
|
|
|
|
|
controller_list.insert_or_assign(identifier, ControllerData{}); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
controller_list.try_emplace(identifier); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void InputEngine::PreSetButton(const PadIdentifier& identifier, int button) { |
|
|
void InputEngine::PreSetButton(const PadIdentifier& identifier, int button) { |
|
|
std::lock_guard lock{mutex}; |
|
|
std::lock_guard lock{mutex}; |
|
|
ControllerData& controller = controller_list.at(identifier); |
|
|
ControllerData& controller = controller_list.at(identifier); |
|
|
if (!controller.buttons.contains(button)) { |
|
|
|
|
|
controller.buttons.insert_or_assign(button, false); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
controller.buttons.try_emplace(button, false); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void InputEngine::PreSetHatButton(const PadIdentifier& identifier, int button) { |
|
|
void InputEngine::PreSetHatButton(const PadIdentifier& identifier, int button) { |
|
|
std::lock_guard lock{mutex}; |
|
|
std::lock_guard lock{mutex}; |
|
|
ControllerData& controller = controller_list.at(identifier); |
|
|
ControllerData& controller = controller_list.at(identifier); |
|
|
if (!controller.hat_buttons.contains(button)) { |
|
|
|
|
|
controller.hat_buttons.insert_or_assign(button, u8{0}); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
controller.hat_buttons.try_emplace(button, u8{0}); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void InputEngine::PreSetAxis(const PadIdentifier& identifier, int axis) { |
|
|
void InputEngine::PreSetAxis(const PadIdentifier& identifier, int axis) { |
|
|
std::lock_guard lock{mutex}; |
|
|
std::lock_guard lock{mutex}; |
|
|
ControllerData& controller = controller_list.at(identifier); |
|
|
ControllerData& controller = controller_list.at(identifier); |
|
|
if (!controller.axes.contains(axis)) { |
|
|
|
|
|
controller.axes.insert_or_assign(axis, 0.0f); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
controller.axes.try_emplace(axis, 0.0f); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void InputEngine::PreSetMotion(const PadIdentifier& identifier, int motion) { |
|
|
void InputEngine::PreSetMotion(const PadIdentifier& identifier, int motion) { |
|
|
std::lock_guard lock{mutex}; |
|
|
std::lock_guard lock{mutex}; |
|
|
ControllerData& controller = controller_list.at(identifier); |
|
|
ControllerData& controller = controller_list.at(identifier); |
|
|
if (!controller.motions.contains(motion)) { |
|
|
|
|
|
controller.motions.insert_or_assign(motion, BasicMotion{}); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
controller.motions.try_emplace(motion); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void InputEngine::SetButton(const PadIdentifier& identifier, int button, bool value) { |
|
|
void InputEngine::SetButton(const PadIdentifier& identifier, int button, bool value) { |
|
|
@ -91,7 +81,7 @@ void InputEngine::SetBattery(const PadIdentifier& identifier, BatteryLevel value |
|
|
TriggerOnBatteryChange(identifier, value); |
|
|
TriggerOnBatteryChange(identifier, value); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void InputEngine::SetMotion(const PadIdentifier& identifier, int motion, BasicMotion value) { |
|
|
|
|
|
|
|
|
void InputEngine::SetMotion(const PadIdentifier& identifier, int motion, const BasicMotion& value) { |
|
|
{ |
|
|
{ |
|
|
std::lock_guard lock{mutex}; |
|
|
std::lock_guard lock{mutex}; |
|
|
ControllerData& controller = controller_list.at(identifier); |
|
|
ControllerData& controller = controller_list.at(identifier); |
|
|
@ -104,85 +94,93 @@ void InputEngine::SetMotion(const PadIdentifier& identifier, int motion, BasicMo |
|
|
|
|
|
|
|
|
bool InputEngine::GetButton(const PadIdentifier& identifier, int button) const { |
|
|
bool InputEngine::GetButton(const PadIdentifier& identifier, int button) const { |
|
|
std::lock_guard lock{mutex}; |
|
|
std::lock_guard lock{mutex}; |
|
|
if (!controller_list.contains(identifier)) { |
|
|
|
|
|
|
|
|
const auto controller_iter = controller_list.find(identifier); |
|
|
|
|
|
if (controller_iter == controller_list.cend()) { |
|
|
LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(), |
|
|
LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(), |
|
|
identifier.pad, identifier.port); |
|
|
identifier.pad, identifier.port); |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
ControllerData controller = controller_list.at(identifier); |
|
|
|
|
|
if (!controller.buttons.contains(button)) { |
|
|
|
|
|
|
|
|
const ControllerData& controller = controller_iter->second; |
|
|
|
|
|
const auto button_iter = controller.buttons.find(button); |
|
|
|
|
|
if (button_iter == controller.buttons.cend()) { |
|
|
LOG_ERROR(Input, "Invalid button {}", button); |
|
|
LOG_ERROR(Input, "Invalid button {}", button); |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
return controller.buttons.at(button); |
|
|
|
|
|
|
|
|
return button_iter->second; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
bool InputEngine::GetHatButton(const PadIdentifier& identifier, int button, u8 direction) const { |
|
|
bool InputEngine::GetHatButton(const PadIdentifier& identifier, int button, u8 direction) const { |
|
|
std::lock_guard lock{mutex}; |
|
|
std::lock_guard lock{mutex}; |
|
|
if (!controller_list.contains(identifier)) { |
|
|
|
|
|
|
|
|
const auto controller_iter = controller_list.find(identifier); |
|
|
|
|
|
if (controller_iter == controller_list.cend()) { |
|
|
LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(), |
|
|
LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(), |
|
|
identifier.pad, identifier.port); |
|
|
identifier.pad, identifier.port); |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
ControllerData controller = controller_list.at(identifier); |
|
|
|
|
|
if (!controller.hat_buttons.contains(button)) { |
|
|
|
|
|
|
|
|
const ControllerData& controller = controller_iter->second; |
|
|
|
|
|
const auto hat_iter = controller.hat_buttons.find(button); |
|
|
|
|
|
if (hat_iter == controller.hat_buttons.cend()) { |
|
|
LOG_ERROR(Input, "Invalid hat button {}", button); |
|
|
LOG_ERROR(Input, "Invalid hat button {}", button); |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
return (controller.hat_buttons.at(button) & direction) != 0; |
|
|
|
|
|
|
|
|
return (hat_iter->second & direction) != 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
f32 InputEngine::GetAxis(const PadIdentifier& identifier, int axis) const { |
|
|
f32 InputEngine::GetAxis(const PadIdentifier& identifier, int axis) const { |
|
|
std::lock_guard lock{mutex}; |
|
|
std::lock_guard lock{mutex}; |
|
|
if (!controller_list.contains(identifier)) { |
|
|
|
|
|
|
|
|
const auto controller_iter = controller_list.find(identifier); |
|
|
|
|
|
if (controller_iter == controller_list.cend()) { |
|
|
LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(), |
|
|
LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(), |
|
|
identifier.pad, identifier.port); |
|
|
identifier.pad, identifier.port); |
|
|
return 0.0f; |
|
|
return 0.0f; |
|
|
} |
|
|
} |
|
|
ControllerData controller = controller_list.at(identifier); |
|
|
|
|
|
if (!controller.axes.contains(axis)) { |
|
|
|
|
|
|
|
|
const ControllerData& controller = controller_iter->second; |
|
|
|
|
|
const auto axis_iter = controller.axes.find(axis); |
|
|
|
|
|
if (axis_iter == controller.axes.cend()) { |
|
|
LOG_ERROR(Input, "Invalid axis {}", axis); |
|
|
LOG_ERROR(Input, "Invalid axis {}", axis); |
|
|
return 0.0f; |
|
|
return 0.0f; |
|
|
} |
|
|
} |
|
|
return controller.axes.at(axis); |
|
|
|
|
|
|
|
|
return axis_iter->second; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
BatteryLevel InputEngine::GetBattery(const PadIdentifier& identifier) const { |
|
|
BatteryLevel InputEngine::GetBattery(const PadIdentifier& identifier) const { |
|
|
std::lock_guard lock{mutex}; |
|
|
std::lock_guard lock{mutex}; |
|
|
if (!controller_list.contains(identifier)) { |
|
|
|
|
|
|
|
|
const auto controller_iter = controller_list.find(identifier); |
|
|
|
|
|
if (controller_iter == controller_list.cend()) { |
|
|
LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(), |
|
|
LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(), |
|
|
identifier.pad, identifier.port); |
|
|
identifier.pad, identifier.port); |
|
|
return BatteryLevel::Charging; |
|
|
return BatteryLevel::Charging; |
|
|
} |
|
|
} |
|
|
ControllerData controller = controller_list.at(identifier); |
|
|
|
|
|
|
|
|
const ControllerData& controller = controller_iter->second; |
|
|
return controller.battery; |
|
|
return controller.battery; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
BasicMotion InputEngine::GetMotion(const PadIdentifier& identifier, int motion) const { |
|
|
BasicMotion InputEngine::GetMotion(const PadIdentifier& identifier, int motion) const { |
|
|
std::lock_guard lock{mutex}; |
|
|
std::lock_guard lock{mutex}; |
|
|
if (!controller_list.contains(identifier)) { |
|
|
|
|
|
|
|
|
const auto controller_iter = controller_list.find(identifier); |
|
|
|
|
|
if (controller_iter == controller_list.cend()) { |
|
|
LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(), |
|
|
LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.Format(), |
|
|
identifier.pad, identifier.port); |
|
|
identifier.pad, identifier.port); |
|
|
return {}; |
|
|
return {}; |
|
|
} |
|
|
} |
|
|
ControllerData controller = controller_list.at(identifier); |
|
|
|
|
|
|
|
|
const ControllerData& controller = controller_iter->second; |
|
|
return controller.motions.at(motion); |
|
|
return controller.motions.at(motion); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void InputEngine::ResetButtonState() { |
|
|
void InputEngine::ResetButtonState() { |
|
|
for (std::pair<PadIdentifier, ControllerData> controller : controller_list) { |
|
|
|
|
|
for (std::pair<int, bool> button : controller.second.buttons) { |
|
|
|
|
|
|
|
|
for (const auto& controller : controller_list) { |
|
|
|
|
|
for (const auto& button : controller.second.buttons) { |
|
|
SetButton(controller.first, button.first, false); |
|
|
SetButton(controller.first, button.first, false); |
|
|
} |
|
|
} |
|
|
for (std::pair<int, bool> button : controller.second.hat_buttons) { |
|
|
|
|
|
|
|
|
for (const auto& button : controller.second.hat_buttons) { |
|
|
SetHatButton(controller.first, button.first, false); |
|
|
SetHatButton(controller.first, button.first, false); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void InputEngine::ResetAnalogState() { |
|
|
void InputEngine::ResetAnalogState() { |
|
|
for (std::pair<PadIdentifier, ControllerData> controller : controller_list) { |
|
|
|
|
|
for (std::pair<int, float> axis : controller.second.axes) { |
|
|
|
|
|
|
|
|
for (const auto& controller : controller_list) { |
|
|
|
|
|
for (const auto& axis : controller.second.axes) { |
|
|
SetAxis(controller.first, axis.first, 0.0); |
|
|
SetAxis(controller.first, axis.first, 0.0); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
@ -190,7 +188,7 @@ void InputEngine::ResetAnalogState() { |
|
|
|
|
|
|
|
|
void InputEngine::TriggerOnButtonChange(const PadIdentifier& identifier, int button, bool value) { |
|
|
void InputEngine::TriggerOnButtonChange(const PadIdentifier& identifier, int button, bool value) { |
|
|
std::lock_guard lock{mutex_callback}; |
|
|
std::lock_guard lock{mutex_callback}; |
|
|
for (const std::pair<int, InputIdentifier> poller_pair : callback_list) { |
|
|
|
|
|
|
|
|
for (const auto& poller_pair : callback_list) { |
|
|
const InputIdentifier& poller = poller_pair.second; |
|
|
const InputIdentifier& poller = poller_pair.second; |
|
|
if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Button, button)) { |
|
|
if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Button, button)) { |
|
|
continue; |
|
|
continue; |
|
|
@ -218,7 +216,7 @@ void InputEngine::TriggerOnButtonChange(const PadIdentifier& identifier, int but |
|
|
|
|
|
|
|
|
void InputEngine::TriggerOnHatButtonChange(const PadIdentifier& identifier, int button, u8 value) { |
|
|
void InputEngine::TriggerOnHatButtonChange(const PadIdentifier& identifier, int button, u8 value) { |
|
|
std::lock_guard lock{mutex_callback}; |
|
|
std::lock_guard lock{mutex_callback}; |
|
|
for (const std::pair<int, InputIdentifier> poller_pair : callback_list) { |
|
|
|
|
|
|
|
|
for (const auto& poller_pair : callback_list) { |
|
|
const InputIdentifier& poller = poller_pair.second; |
|
|
const InputIdentifier& poller = poller_pair.second; |
|
|
if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::HatButton, button)) { |
|
|
if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::HatButton, button)) { |
|
|
continue; |
|
|
continue; |
|
|
@ -247,7 +245,7 @@ void InputEngine::TriggerOnHatButtonChange(const PadIdentifier& identifier, int |
|
|
|
|
|
|
|
|
void InputEngine::TriggerOnAxisChange(const PadIdentifier& identifier, int axis, f32 value) { |
|
|
void InputEngine::TriggerOnAxisChange(const PadIdentifier& identifier, int axis, f32 value) { |
|
|
std::lock_guard lock{mutex_callback}; |
|
|
std::lock_guard lock{mutex_callback}; |
|
|
for (const std::pair<int, InputIdentifier> poller_pair : callback_list) { |
|
|
|
|
|
|
|
|
for (const auto& poller_pair : callback_list) { |
|
|
const InputIdentifier& poller = poller_pair.second; |
|
|
const InputIdentifier& poller = poller_pair.second; |
|
|
if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Analog, axis)) { |
|
|
if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Analog, axis)) { |
|
|
continue; |
|
|
continue; |
|
|
@ -274,7 +272,7 @@ void InputEngine::TriggerOnAxisChange(const PadIdentifier& identifier, int axis, |
|
|
void InputEngine::TriggerOnBatteryChange(const PadIdentifier& identifier, |
|
|
void InputEngine::TriggerOnBatteryChange(const PadIdentifier& identifier, |
|
|
[[maybe_unused]] BatteryLevel value) { |
|
|
[[maybe_unused]] BatteryLevel value) { |
|
|
std::lock_guard lock{mutex_callback}; |
|
|
std::lock_guard lock{mutex_callback}; |
|
|
for (const std::pair<int, InputIdentifier> poller_pair : callback_list) { |
|
|
|
|
|
|
|
|
for (const auto& poller_pair : callback_list) { |
|
|
const InputIdentifier& poller = poller_pair.second; |
|
|
const InputIdentifier& poller = poller_pair.second; |
|
|
if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Battery, 0)) { |
|
|
if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Battery, 0)) { |
|
|
continue; |
|
|
continue; |
|
|
@ -286,9 +284,9 @@ void InputEngine::TriggerOnBatteryChange(const PadIdentifier& identifier, |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void InputEngine::TriggerOnMotionChange(const PadIdentifier& identifier, int motion, |
|
|
void InputEngine::TriggerOnMotionChange(const PadIdentifier& identifier, int motion, |
|
|
BasicMotion value) { |
|
|
|
|
|
|
|
|
const BasicMotion& value) { |
|
|
std::lock_guard lock{mutex_callback}; |
|
|
std::lock_guard lock{mutex_callback}; |
|
|
for (const std::pair<int, InputIdentifier> poller_pair : callback_list) { |
|
|
|
|
|
|
|
|
for (const auto& poller_pair : callback_list) { |
|
|
const InputIdentifier& poller = poller_pair.second; |
|
|
const InputIdentifier& poller = poller_pair.second; |
|
|
if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Motion, motion)) { |
|
|
if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Motion, motion)) { |
|
|
continue; |
|
|
continue; |
|
|
@ -342,7 +340,7 @@ const std::string& InputEngine::GetEngineName() const { |
|
|
|
|
|
|
|
|
int InputEngine::SetCallback(InputIdentifier input_identifier) { |
|
|
int InputEngine::SetCallback(InputIdentifier input_identifier) { |
|
|
std::lock_guard lock{mutex_callback}; |
|
|
std::lock_guard lock{mutex_callback}; |
|
|
callback_list.insert_or_assign(last_callback_key, input_identifier); |
|
|
|
|
|
|
|
|
callback_list.insert_or_assign(last_callback_key, std::move(input_identifier)); |
|
|
return last_callback_key++; |
|
|
return last_callback_key++; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|