diff options
Diffstat (limited to 'src/core/hle/service')
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 56 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.h | 37 | 
2 files changed, 56 insertions, 37 deletions
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index fb3acb507..b19e831fe 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp @@ -2,10 +2,14 @@  // Licensed under GPLv2 or any later version  // Refer to the license.txt file included. +#include <algorithm> +#include <atomic>  #include <cmath> +#include <memory>  #include "common/logging/log.h"  #include "core/core_timing.h"  #include "core/frontend/emu_window.h" +#include "core/frontend/input.h"  #include "core/hle/kernel/event.h"  #include "core/hle/kernel/shared_memory.h"  #include "core/hle/service/hid/hid.h" @@ -44,6 +48,11 @@ constexpr u64 pad_update_ticks = BASE_CLOCK_RATE_ARM11 / 234;  constexpr u64 accelerometer_update_ticks = BASE_CLOCK_RATE_ARM11 / 104;  constexpr u64 gyroscope_update_ticks = BASE_CLOCK_RATE_ARM11 / 101; +static std::atomic<bool> is_device_reload_pending; +static std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeButton::NUM_BUTTONS_HID> +    buttons; +static std::unique_ptr<Input::AnalogDevice> circle_pad; +  static PadState GetCirclePadDirectionState(s16 circle_pad_x, s16 circle_pad_y) {      // 30 degree and 60 degree are angular thresholds for directions      constexpr float TAN30 = 0.577350269f; @@ -74,14 +83,48 @@ static PadState GetCirclePadDirectionState(s16 circle_pad_x, s16 circle_pad_y) {      return state;  } +static void LoadInputDevices() { +    std::transform(Settings::values.buttons.begin() + Settings::NativeButton::BUTTON_HID_BEGIN, +                   Settings::values.buttons.begin() + Settings::NativeButton::BUTTON_HID_END, +                   buttons.begin(), Input::CreateDevice<Input::ButtonDevice>); +    circle_pad = Input::CreateDevice<Input::AnalogDevice>( +        Settings::values.analogs[Settings::NativeAnalog::CirclePad]); +} + +static void UnloadInputDevices() { +    for (auto& button : buttons) { +        button.reset(); +    } +    circle_pad.reset(); +} +  static void UpdatePadCallback(u64 userdata, int cycles_late) {      SharedMem* mem = reinterpret_cast<SharedMem*>(shared_mem->GetPointer()); -    PadState state = VideoCore::g_emu_window->GetPadState(); +    if (is_device_reload_pending.exchange(false)) +        LoadInputDevices(); + +    PadState state; +    using namespace Settings::NativeButton; +    state.a.Assign(buttons[A - BUTTON_HID_BEGIN]->GetStatus()); +    state.b.Assign(buttons[B - BUTTON_HID_BEGIN]->GetStatus()); +    state.x.Assign(buttons[X - BUTTON_HID_BEGIN]->GetStatus()); +    state.y.Assign(buttons[Y - BUTTON_HID_BEGIN]->GetStatus()); +    state.right.Assign(buttons[Right - BUTTON_HID_BEGIN]->GetStatus()); +    state.left.Assign(buttons[Left - BUTTON_HID_BEGIN]->GetStatus()); +    state.up.Assign(buttons[Up - BUTTON_HID_BEGIN]->GetStatus()); +    state.down.Assign(buttons[Down - BUTTON_HID_BEGIN]->GetStatus()); +    state.l.Assign(buttons[L - BUTTON_HID_BEGIN]->GetStatus()); +    state.r.Assign(buttons[R - BUTTON_HID_BEGIN]->GetStatus()); +    state.start.Assign(buttons[Start - BUTTON_HID_BEGIN]->GetStatus()); +    state.select.Assign(buttons[Select - BUTTON_HID_BEGIN]->GetStatus());      // Get current circle pad position and update circle pad direction -    s16 circle_pad_x, circle_pad_y; -    std::tie(circle_pad_x, circle_pad_y) = VideoCore::g_emu_window->GetCirclePadState(); +    float circle_pad_x_f, circle_pad_y_f; +    std::tie(circle_pad_x_f, circle_pad_y_f) = circle_pad->GetStatus(); +    constexpr int MAX_CIRCLEPAD_POS = 0x9C; // Max value for a circle pad position +    s16 circle_pad_x = static_cast<s16>(circle_pad_x_f * MAX_CIRCLEPAD_POS); +    s16 circle_pad_y = static_cast<s16>(circle_pad_y_f * MAX_CIRCLEPAD_POS);      state.hex |= GetCirclePadDirectionState(circle_pad_x, circle_pad_y).hex;      mem->pad.current_state.hex = state.hex; @@ -313,6 +356,8 @@ void Init() {      AddService(new HID_U_Interface);      AddService(new HID_SPVR_Interface); +    is_device_reload_pending.store(true); +      using Kernel::MemoryPermission;      shared_mem =          SharedMemory::Create(nullptr, 0x1000, MemoryPermission::ReadWrite, MemoryPermission::Read, @@ -350,6 +395,11 @@ void Shutdown() {      event_accelerometer = nullptr;      event_gyroscope = nullptr;      event_debug_pad = nullptr; +    UnloadInputDevices(); +} + +void ReloadInputDevices() { +    is_device_reload_pending.store(true);  }  } // namespace HID diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h index c7f4ee138..b505cdcd5 100644 --- a/src/core/hle/service/hid/hid.h +++ b/src/core/hle/service/hid/hid.h @@ -39,13 +39,6 @@ struct PadState {          BitField<10, 1, u32> x;          BitField<11, 1, u32> y; -        BitField<14, 1, u32> zl; -        BitField<15, 1, u32> zr; - -        BitField<24, 1, u32> c_right; -        BitField<25, 1, u32> c_left; -        BitField<26, 1, u32> c_up; -        BitField<27, 1, u32> c_down;          BitField<28, 1, u32> circle_right;          BitField<29, 1, u32> circle_left;          BitField<30, 1, u32> circle_up; @@ -183,33 +176,6 @@ ASSERT_REG_POSITION(touch.index_reset_ticks, 0x2A);  #undef ASSERT_REG_POSITION  #endif // !defined(_MSC_VER) -// Pre-defined PadStates for single button presses -const PadState PAD_NONE = {{0}}; -const PadState PAD_A = {{1u << 0}}; -const PadState PAD_B = {{1u << 1}}; -const PadState PAD_SELECT = {{1u << 2}}; -const PadState PAD_START = {{1u << 3}}; -const PadState PAD_RIGHT = {{1u << 4}}; -const PadState PAD_LEFT = {{1u << 5}}; -const PadState PAD_UP = {{1u << 6}}; -const PadState PAD_DOWN = {{1u << 7}}; -const PadState PAD_R = {{1u << 8}}; -const PadState PAD_L = {{1u << 9}}; -const PadState PAD_X = {{1u << 10}}; -const PadState PAD_Y = {{1u << 11}}; - -const PadState PAD_ZL = {{1u << 14}}; -const PadState PAD_ZR = {{1u << 15}}; - -const PadState PAD_C_RIGHT = {{1u << 24}}; -const PadState PAD_C_LEFT = {{1u << 25}}; -const PadState PAD_C_UP = {{1u << 26}}; -const PadState PAD_C_DOWN = {{1u << 27}}; -const PadState PAD_CIRCLE_RIGHT = {{1u << 28}}; -const PadState PAD_CIRCLE_LEFT = {{1u << 29}}; -const PadState PAD_CIRCLE_UP = {{1u << 30}}; -const PadState PAD_CIRCLE_DOWN = {{1u << 31}}; -  /**   * HID::GetIPCHandles service function   *  Inputs: @@ -297,5 +263,8 @@ void Init();  /// Shutdown HID service  void Shutdown(); + +/// Reload input devices. Used when input configuration changed +void ReloadInputDevices();  }  }  | 
