mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu.git
				synced 2025-05-12 00:45:25 +00:00 
			
		
		
		
	hid: Bare-minimum sharedmem input
This commit is contained in:
		
							parent
							
								
									bb1fcfac33
								
							
						
					
					
						commit
						1ea49442f9
					
				@ -2,7 +2,10 @@
 | 
			
		||||
// Licensed under GPLv2 or any later version
 | 
			
		||||
// Refer to the license.txt file included.
 | 
			
		||||
 | 
			
		||||
#include <atomic>
 | 
			
		||||
#include "common/logging/log.h"
 | 
			
		||||
#include "core/core_timing.h"
 | 
			
		||||
#include "core/frontend/input.h"
 | 
			
		||||
#include "core/hle/ipc_helpers.h"
 | 
			
		||||
#include "core/hle/kernel/client_port.h"
 | 
			
		||||
#include "core/hle/kernel/client_session.h"
 | 
			
		||||
@ -13,6 +16,12 @@
 | 
			
		||||
namespace Service {
 | 
			
		||||
namespace HID {
 | 
			
		||||
 | 
			
		||||
// Updating period for each HID device.
 | 
			
		||||
// TODO(shinyquagsire23): These need better values.
 | 
			
		||||
constexpr u64 pad_update_ticks = BASE_CLOCK_RATE / 234;
 | 
			
		||||
constexpr u64 accelerometer_update_ticks = BASE_CLOCK_RATE / 104;
 | 
			
		||||
constexpr u64 gyroscope_update_ticks = BASE_CLOCK_RATE / 101;
 | 
			
		||||
 | 
			
		||||
class IAppletResource final : public ServiceFramework<IAppletResource> {
 | 
			
		||||
public:
 | 
			
		||||
    IAppletResource() : ServiceFramework("IAppletResource") {
 | 
			
		||||
@ -24,6 +33,15 @@ public:
 | 
			
		||||
        shared_mem = Kernel::SharedMemory::Create(
 | 
			
		||||
            nullptr, 0x40000, Kernel::MemoryPermission::ReadWrite, Kernel::MemoryPermission::Read,
 | 
			
		||||
            0, Kernel::MemoryRegion::BASE, "HID:SharedMemory");
 | 
			
		||||
 | 
			
		||||
        // Register update callbacks
 | 
			
		||||
        pad_update_event = CoreTiming::RegisterEvent(
 | 
			
		||||
            "HID::UpdatePadCallback",
 | 
			
		||||
            [this](u64 userdata, int cycles_late) { UpdatePadCallback(userdata, cycles_late); });
 | 
			
		||||
 | 
			
		||||
        // TODO(shinyquagsire23): Other update callbacks? (accel, gyro?)
 | 
			
		||||
 | 
			
		||||
        CoreTiming::ScheduleEvent(pad_update_ticks, pad_update_event);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
@ -34,8 +52,76 @@ private:
 | 
			
		||||
        LOG_DEBUG(Service, "called");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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>);
 | 
			
		||||
        // TODO(shinyquagsire23): sticks, gyro, touch, mouse, keyboard
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void UpdatePadCallback(u64 userdata, int cycles_late) {
 | 
			
		||||
        SharedMemory* mem = reinterpret_cast<SharedMemory*>(shared_mem->GetPointer());
 | 
			
		||||
 | 
			
		||||
        if (is_device_reload_pending.exchange(false))
 | 
			
		||||
            LoadInputDevices();
 | 
			
		||||
 | 
			
		||||
        // TODO(shinyquagsire23): This is a hack!
 | 
			
		||||
        ControllerPadState& state =
 | 
			
		||||
            mem->controllers[Controller_Handheld].layouts[Layout_Default].entries[0].buttons;
 | 
			
		||||
        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.lstick.Assign(buttons[LStick - BUTTON_HID_BEGIN]->GetStatus());
 | 
			
		||||
        state.rstick.Assign(buttons[RStick - BUTTON_HID_BEGIN]->GetStatus());
 | 
			
		||||
        state.l.Assign(buttons[L - BUTTON_HID_BEGIN]->GetStatus());
 | 
			
		||||
        state.r.Assign(buttons[R - BUTTON_HID_BEGIN]->GetStatus());
 | 
			
		||||
        state.zl.Assign(buttons[ZL - BUTTON_HID_BEGIN]->GetStatus());
 | 
			
		||||
        state.zr.Assign(buttons[ZR - BUTTON_HID_BEGIN]->GetStatus());
 | 
			
		||||
        state.plus.Assign(buttons[Plus - BUTTON_HID_BEGIN]->GetStatus());
 | 
			
		||||
        state.minus.Assign(buttons[Minus - BUTTON_HID_BEGIN]->GetStatus());
 | 
			
		||||
 | 
			
		||||
        state.dleft.Assign(buttons[DLeft - BUTTON_HID_BEGIN]->GetStatus());
 | 
			
		||||
        state.dup.Assign(buttons[DUp - BUTTON_HID_BEGIN]->GetStatus());
 | 
			
		||||
        state.dright.Assign(buttons[DRight - BUTTON_HID_BEGIN]->GetStatus());
 | 
			
		||||
        state.ddown.Assign(buttons[DDown - BUTTON_HID_BEGIN]->GetStatus());
 | 
			
		||||
 | 
			
		||||
        state.lstick_left.Assign(buttons[LStick_Left - BUTTON_HID_BEGIN]->GetStatus());
 | 
			
		||||
        state.lstick_up.Assign(buttons[LStick_Up - BUTTON_HID_BEGIN]->GetStatus());
 | 
			
		||||
        state.lstick_right.Assign(buttons[LStick_Right - BUTTON_HID_BEGIN]->GetStatus());
 | 
			
		||||
        state.lstick_down.Assign(buttons[LStick_Down - BUTTON_HID_BEGIN]->GetStatus());
 | 
			
		||||
 | 
			
		||||
        state.rstick_left.Assign(buttons[RStick_Left - BUTTON_HID_BEGIN]->GetStatus());
 | 
			
		||||
        state.rstick_up.Assign(buttons[RStick_Up - BUTTON_HID_BEGIN]->GetStatus());
 | 
			
		||||
        state.rstick_right.Assign(buttons[RStick_Right - BUTTON_HID_BEGIN]->GetStatus());
 | 
			
		||||
        state.rstick_down.Assign(buttons[RStick_Down - BUTTON_HID_BEGIN]->GetStatus());
 | 
			
		||||
 | 
			
		||||
        state.sl.Assign(buttons[SL - BUTTON_HID_BEGIN]->GetStatus());
 | 
			
		||||
        state.sr.Assign(buttons[SR - BUTTON_HID_BEGIN]->GetStatus());
 | 
			
		||||
 | 
			
		||||
        // TODO(shinyquagsire23): Analog stick vals
 | 
			
		||||
 | 
			
		||||
        // TODO(shinyquagsire23): Update pad info proper, (circular buffers, timestamps, layouts)
 | 
			
		||||
 | 
			
		||||
        // TODO(shinyquagsire23): Update touch info
 | 
			
		||||
 | 
			
		||||
        // TODO(shinyquagsire23): Signal events
 | 
			
		||||
 | 
			
		||||
        // Reschedule recurrent event
 | 
			
		||||
        CoreTiming::ScheduleEvent(pad_update_ticks - cycles_late, pad_update_event);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Handle to shared memory region designated to HID service
 | 
			
		||||
    Kernel::SharedPtr<Kernel::SharedMemory> shared_mem;
 | 
			
		||||
 | 
			
		||||
    // CoreTiming update events
 | 
			
		||||
    CoreTiming::EventType* pad_update_event;
 | 
			
		||||
 | 
			
		||||
    // Stored input state info
 | 
			
		||||
    std::atomic<bool> is_device_reload_pending{true};
 | 
			
		||||
    std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeButton::NUM_BUTTONS_HID>
 | 
			
		||||
        buttons;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class Hid final : public ServiceFramework<Hid> {
 | 
			
		||||
 | 
			
		||||
@ -5,6 +5,7 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include "core/hle/service/service.h"
 | 
			
		||||
#include "core/settings.h"
 | 
			
		||||
 | 
			
		||||
namespace Service {
 | 
			
		||||
namespace HID {
 | 
			
		||||
@ -156,8 +157,7 @@ struct KeyboardHeader {
 | 
			
		||||
    u64 latestEntry;
 | 
			
		||||
    u64 maxEntryIndex;
 | 
			
		||||
};
 | 
			
		||||
static_assert(sizeof(KeyboardHeader) == 0x20,
 | 
			
		||||
              "HID keyboard header structure has incorrect size");
 | 
			
		||||
static_assert(sizeof(KeyboardHeader) == 0x20, "HID keyboard header structure has incorrect size");
 | 
			
		||||
 | 
			
		||||
struct KeyboardModifierKeyState {
 | 
			
		||||
    union {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user