| |
| |
|
|
| #include "common/param_package.h" |
| #include "input_common/drivers/touch_screen.h" |
|
|
| namespace InputCommon { |
|
|
| constexpr PadIdentifier identifier = { |
| .guid = Common::UUID{}, |
| .port = 0, |
| .pad = 0, |
| }; |
|
|
| TouchScreen::TouchScreen(std::string input_engine_) : InputEngine(std::move(input_engine_)) { |
| PreSetController(identifier); |
| ReleaseAllTouch(); |
| } |
|
|
| void TouchScreen::TouchMoved(float x, float y, std::size_t finger_id) { |
| const auto index = GetIndexFromFingerId(finger_id); |
| if (!index) { |
| |
| TouchPressed(x, y, finger_id); |
| return; |
| } |
| const auto i = index.value(); |
| fingers[i].is_active = true; |
| SetButton(identifier, static_cast<int>(i), true); |
| SetAxis(identifier, static_cast<int>(i * 2), x); |
| SetAxis(identifier, static_cast<int>(i * 2 + 1), y); |
| } |
|
|
| void TouchScreen::TouchPressed(float x, float y, std::size_t finger_id) { |
| if (GetIndexFromFingerId(finger_id)) { |
| |
| TouchMoved(x, y, finger_id); |
| return; |
| } |
| const auto index = GetNextFreeIndex(); |
| if (!index) { |
| |
| return; |
| } |
| const auto i = index.value(); |
| fingers[i].is_enabled = true; |
| fingers[i].finger_id = finger_id; |
| TouchMoved(x, y, finger_id); |
| } |
|
|
| void TouchScreen::TouchReleased(std::size_t finger_id) { |
| const auto index = GetIndexFromFingerId(finger_id); |
| if (!index) { |
| return; |
| } |
| const auto i = index.value(); |
| fingers[i].is_enabled = false; |
| SetButton(identifier, static_cast<int>(i), false); |
| SetAxis(identifier, static_cast<int>(i * 2), 0.0f); |
| SetAxis(identifier, static_cast<int>(i * 2 + 1), 0.0f); |
| } |
|
|
| std::optional<std::size_t> TouchScreen::GetIndexFromFingerId(std::size_t finger_id) const { |
| for (std::size_t index = 0; index < MAX_FINGER_COUNT; ++index) { |
| const auto& finger = fingers[index]; |
| if (!finger.is_enabled) { |
| continue; |
| } |
| if (finger.finger_id == finger_id) { |
| return index; |
| } |
| } |
| return std::nullopt; |
| } |
|
|
| std::optional<std::size_t> TouchScreen::GetNextFreeIndex() const { |
| for (std::size_t index = 0; index < MAX_FINGER_COUNT; ++index) { |
| if (!fingers[index].is_enabled) { |
| return index; |
| } |
| } |
| return std::nullopt; |
| } |
|
|
| void TouchScreen::ClearActiveFlag() { |
| for (auto& finger : fingers) { |
| finger.is_active = false; |
| } |
| } |
|
|
| void TouchScreen::ReleaseInactiveTouch() { |
| for (const auto& finger : fingers) { |
| if (!finger.is_active) { |
| TouchReleased(finger.finger_id); |
| } |
| } |
| } |
|
|
| void TouchScreen::ReleaseAllTouch() { |
| for (const auto& finger : fingers) { |
| if (finger.is_enabled) { |
| TouchReleased(finger.finger_id); |
| } |
| } |
| } |
|
|
| } |
|
|