diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/hid/emulated_controller.cpp | 75 | ||||
| -rw-r--r-- | src/core/hid/emulated_controller.h | 6 | ||||
| -rw-r--r-- | src/core/hle/service/hid/controllers/npad.cpp | 3 | 
3 files changed, 83 insertions, 1 deletions
diff --git a/src/core/hid/emulated_controller.cpp b/src/core/hid/emulated_controller.cpp index 0e06468da..631aa6ad2 100644 --- a/src/core/hid/emulated_controller.cpp +++ b/src/core/hid/emulated_controller.cpp @@ -12,6 +12,7 @@  namespace Core::HID {  constexpr s32 HID_JOYSTICK_MAX = 0x7fff;  constexpr s32 HID_TRIGGER_MAX = 0x7fff; +constexpr u32 TURBO_BUTTON_DELAY = 4;  // Use a common UUID for TAS and Virtual Gamepad  constexpr Common::UUID TAS_UUID =      Common::UUID{{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xA5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}; @@ -447,6 +448,7 @@ void EmulatedController::ReloadInput() {                  },          });      } +    turbo_button_state = 0;  }  void EmulatedController::UnloadInput() { @@ -687,6 +689,7 @@ void EmulatedController::SetButton(const Common::Input::CallbackStatus& callback      }      current_status.toggle = new_status.toggle; +    current_status.turbo = new_status.turbo;      current_status.uuid = uuid;      // Update button status with current @@ -1548,7 +1551,7 @@ NpadButtonState EmulatedController::GetNpadButtons() const {      if (is_configuring) {          return {};      } -    return controller.npad_button_state; +    return {controller.npad_button_state.raw & GetTurboButtonMask()};  }  DebugPadButton EmulatedController::GetDebugPadButtons() const { @@ -1656,4 +1659,74 @@ void EmulatedController::DeleteCallback(int key) {      }      callback_list.erase(iterator);  } + +void EmulatedController::TurboButtonUpdate() { +    turbo_button_state = (turbo_button_state + 1) % (TURBO_BUTTON_DELAY * 2); +} + +NpadButton EmulatedController::GetTurboButtonMask() const { +    // Apply no mask when disabled +    if (turbo_button_state < TURBO_BUTTON_DELAY) { +        return {NpadButton::All}; +    } + +    NpadButtonState button_mask{}; +    for (std::size_t index = 0; index < controller.button_values.size(); ++index) { +        if (!controller.button_values[index].turbo) { +            continue; +        } + +        switch (index) { +        case Settings::NativeButton::A: +            button_mask.a.Assign(1); +            break; +        case Settings::NativeButton::B: +            button_mask.b.Assign(1); +            break; +        case Settings::NativeButton::X: +            button_mask.x.Assign(1); +            break; +        case Settings::NativeButton::Y: +            button_mask.y.Assign(1); +            break; +        case Settings::NativeButton::L: +            button_mask.l.Assign(1); +            break; +        case Settings::NativeButton::R: +            button_mask.r.Assign(1); +            break; +        case Settings::NativeButton::ZL: +            button_mask.zl.Assign(1); +            break; +        case Settings::NativeButton::ZR: +            button_mask.zr.Assign(1); +            break; +        case Settings::NativeButton::DLeft: +            button_mask.left.Assign(1); +            break; +        case Settings::NativeButton::DUp: +            button_mask.up.Assign(1); +            break; +        case Settings::NativeButton::DRight: +            button_mask.right.Assign(1); +            break; +        case Settings::NativeButton::DDown: +            button_mask.down.Assign(1); +            break; +        case Settings::NativeButton::SL: +            button_mask.left_sl.Assign(1); +            button_mask.right_sl.Assign(1); +            break; +        case Settings::NativeButton::SR: +            button_mask.left_sr.Assign(1); +            button_mask.right_sr.Assign(1); +            break; +        default: +            break; +        } +    } + +    return static_cast<NpadButton>(~button_mask.raw); +} +  } // namespace Core::HID diff --git a/src/core/hid/emulated_controller.h b/src/core/hid/emulated_controller.h index 3ac77b2b5..b02bf35c4 100644 --- a/src/core/hid/emulated_controller.h +++ b/src/core/hid/emulated_controller.h @@ -411,6 +411,9 @@ public:       */      void DeleteCallback(int key); +    /// Swaps the state of the turbo buttons +    void TurboButtonUpdate(); +  private:      /// creates input devices from params      void LoadDevices(); @@ -511,6 +514,8 @@ private:       */      void TriggerOnChange(ControllerTriggerType type, bool is_service_update); +    NpadButton GetTurboButtonMask() const; +      const NpadIdType npad_id_type;      NpadStyleIndex npad_type{NpadStyleIndex::None};      NpadStyleIndex original_npad_type{NpadStyleIndex::None}; @@ -520,6 +525,7 @@ private:      bool system_buttons_enabled{true};      f32 motion_sensitivity{0.01f};      bool force_update_motion{false}; +    u32 turbo_button_state{0};      // Temporary values to avoid doing changes while the controller is in configuring mode      NpadStyleIndex tmp_npad_type{NpadStyleIndex::None}; diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp index 84edc8839..513ea485a 100644 --- a/src/core/hle/service/hid/controllers/npad.cpp +++ b/src/core/hle/service/hid/controllers/npad.cpp @@ -428,6 +428,9 @@ void Controller_NPad::RequestPadStateUpdate(Core::HID::NpadIdType npad_id) {          return;      } +    // This function is unique to yuzu for the turbo buttons to work properly +    controller.device->TurboButtonUpdate(); +      auto& pad_entry = controller.npad_pad_state;      auto& trigger_entry = controller.npad_trigger_state;      const auto button_state = controller.device->GetNpadButtons();  | 
