From f9fdaafa0496e3aae894719d2e3aad62f8bd698c Mon Sep 17 00:00:00 2001 From: wwylele Date: Sun, 7 May 2017 21:53:27 +0300 Subject: [PATCH] fixup!ir: implement new 3ds HID via ir:rst --- src/core/hle/service/ir/ir_rst.cpp | 63 +++++++++++++++--------------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/src/core/hle/service/ir/ir_rst.cpp b/src/core/hle/service/ir/ir_rst.cpp index b22f6548c..53807cd91 100644 --- a/src/core/hle/service/ir/ir_rst.cpp +++ b/src/core/hle/service/ir/ir_rst.cpp @@ -17,15 +17,15 @@ namespace Service { namespace IR { union PadState { - u32 hex; + u32_le hex; - BitField<14, 1, u32> zl; - BitField<15, 1, u32> zr; + BitField<14, 1, u32_le> zl; + BitField<15, 1, u32_le> zr; - BitField<24, 1, u32> c_stick_right; - BitField<25, 1, u32> c_stick_left; - BitField<26, 1, u32> c_stick_up; - BitField<27, 1, u32> c_stick_down; + BitField<24, 1, u32_le> c_stick_right; + BitField<25, 1, u32_le> c_stick_left; + BitField<26, 1, u32_le> c_stick_up; + BitField<27, 1, u32_le> c_stick_down; }; struct PadDataEntry { @@ -33,14 +33,14 @@ struct PadDataEntry { PadState delta_additions; PadState delta_removals; - s16 c_stick_x; - s16 c_stick_y; + s16_le c_stick_x; + s16_le c_stick_y; }; struct SharedMem { - u64 index_reset_ticks; ///< CPU tick count for when HID module updated entry index 0 - u64 index_reset_ticks_previous; ///< Previous `index_reset_ticks` - u32 index; + u64_le index_reset_ticks; ///< CPU tick count for when HID module updated entry index 0 + u64_le index_reset_ticks_previous; ///< Previous `index_reset_ticks` + u32_le index; INSERT_PADDING_WORDS(1); std::array entries; ///< Last 8 pad entries }; @@ -50,26 +50,26 @@ static_assert(sizeof(SharedMem) == 0x98, "SharedMem has wrong size!"); static Kernel::SharedPtr update_event; static Kernel::SharedPtr shared_memory; static u32 next_pad_index; -static int update_callback; -static std::unique_ptr zl; -static std::unique_ptr zr; +static int update_callback_id; +static std::unique_ptr zl_button; +static std::unique_ptr zr_button; static std::unique_ptr c_stick; static std::atomic is_device_reload_pending; static bool raw_c_stick; static int update_period; static void LoadInputDevices() { - zl = Input::CreateDevice( + zl_button = Input::CreateDevice( Settings::values.buttons[Settings::NativeButton::ZL]); - zr = Input::CreateDevice( + zr_button = Input::CreateDevice( Settings::values.buttons[Settings::NativeButton::ZR]); c_stick = Input::CreateDevice( Settings::values.analogs[Settings::NativeAnalog::CStick]); } static void UnloadInputDevices() { - zl = nullptr; - zr = nullptr; + zl_button = nullptr; + zr_button = nullptr; c_stick = nullptr; } @@ -80,15 +80,15 @@ static void UpdateCallback(u64 userdata, int cycles_late) { LoadInputDevices(); PadState state; - state.zl.Assign(zl->GetStatus()); - state.zr.Assign(zr->GetStatus()); + state.zl.Assign(zl_button->GetStatus()); + state.zr.Assign(zr_button->GetStatus()); // Get current c-stick position and update c-stick direction float c_stick_x_f, c_stick_y_f; std::tie(c_stick_x_f, c_stick_y_f) = c_stick->GetStatus(); - constexpr int MAX_CSTICK_POS = 0x9C; // Max value for a c-stick position - const s16 c_stick_x = static_cast(c_stick_x_f * MAX_CSTICK_POS); - const s16 c_stick_y = static_cast(c_stick_y_f * MAX_CSTICK_POS); + constexpr int MAX_CSTICK_RADIUS = 0x9C; // Max value for a c-stick radius + const s16 c_stick_x = static_cast(c_stick_x_f * MAX_CSTICK_RADIUS); + const s16 c_stick_y = static_cast(c_stick_y_f * MAX_CSTICK_RADIUS); if (!raw_c_stick) { const HID::DirectionState direction = HID::GetStickDirectionState(c_stick_x, c_stick_y); @@ -129,7 +129,7 @@ static void UpdateCallback(u64 userdata, int cycles_late) { update_event->Signal(); // Reschedule recurrent event - CoreTiming::ScheduleEvent(msToCycles(update_period) - cycles_late, update_callback); + CoreTiming::ScheduleEvent(msToCycles(update_period) - cycles_late, update_callback_id); } /** @@ -164,23 +164,23 @@ static void Initialize(Interface* self) { next_pad_index = 0; is_device_reload_pending.store(true); - CoreTiming::ScheduleEvent(msToCycles(update_period), update_callback); + CoreTiming::ScheduleEvent(msToCycles(update_period), update_callback_id); IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); rb.Push(RESULT_SUCCESS); - LOG_INFO(Service_IR, "called. update_period=%d, raw_c_stick=%d", update_period, raw_c_stick); + LOG_DEBUG(Service_IR, "called. update_period=%d, raw_c_stick=%d", update_period, raw_c_stick); } static void Shutdown(Interface* self) { IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x03, 1, 0); - CoreTiming::UnscheduleEvent(update_callback, 0); + CoreTiming::UnscheduleEvent(update_callback_id, 0); UnloadInputDevices(); IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); rb.Push(RESULT_SUCCESS); - LOG_INFO(Service_IR, "called"); + LOG_DEBUG(Service_IR, "called"); } const Interface::FunctionInfo FunctionTable[] = { @@ -195,14 +195,15 @@ IR_RST_Interface::IR_RST_Interface() { } void InitRST() { - // Note: these two kernel objects are available before Initialize service function is called. using namespace Kernel; + // Note: these two kernel objects are even available before Initialize service function is + // called. shared_memory = SharedMemory::Create(nullptr, 0x1000, MemoryPermission::ReadWrite, MemoryPermission::Read, 0, MemoryRegion::BASE, "IRRST:SharedMemory"); update_event = Event::Create(ResetType::OneShot, "IRRST:UpdateEvent"); - update_callback = CoreTiming::RegisterEvent("IRRST:UpdateCallBack", UpdateCallback); + update_callback_id = CoreTiming::RegisterEvent("IRRST:UpdateCallBack", UpdateCallback); } void ShutdownRST() {