// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later #pragma once #include "common/common_types.h" #include "core/hle/result.h" #include "hid_core/hid_types.h" namespace Kernel { class KernelCore; } namespace Service::HID { struct IAbstractedPad; class NpadAbstractedPadHolder; class NpadAbstractPropertiesHandler; enum class NpadMcuState : u32 { None, Available, Active, }; struct NpadMcuHolder { NpadMcuState state; INSERT_PADDING_BYTES(0x4); IAbstractedPad* abstracted_pad; }; static_assert(sizeof(NpadMcuHolder) == 0x10, "NpadMcuHolder is an invalid size"); /// Handles Npad request from HID interfaces class NpadAbstractMcuHandler final { public: explicit NpadAbstractMcuHandler(Kernel::KernelCore& kernel_); ~NpadAbstractMcuHandler(); void SetAbstractPadHolder(NpadAbstractedPadHolder* holder); void SetPropertiesHandler(NpadAbstractPropertiesHandler* handler); Result IncrementRefCounter(); Result DecrementRefCounter(); void UpdateMcuState(); Result GetAbstractedPad(IAbstractedPad** data, u32 mcu_index); NpadMcuState GetMcuState(u32 mcu_index); Result SetMcuState(bool is_enabled, u32 mcu_index); private: NpadAbstractedPadHolder* abstract_pad_holder{nullptr}; NpadAbstractPropertiesHandler* properties_handler{nullptr}; s32 ref_counter{}; std::array mcu_holder{}; Kernel::KernelCore& kernel; }; } // namespace Service::HID