// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include "core/core.h" #include "core/hle/service/cmif_types.h" #include "core/hle/service/service.h" #include "hid_core/hid_types.h" #include "hid_core/irsensor/irs_types.h" #include "hid_core/irsensor/processor_base.h" namespace Core::HID { class EmulatedController; } // namespace Core::HID namespace Service::IRS { class IRS final : public ServiceFramework { public: explicit IRS(Core::System& system_); ~IRS() override; private: // This is nn::irsensor::detail::AruidFormat struct AruidFormat { u64 sensor_aruid; u64 sensor_aruid_status; }; static_assert(sizeof(AruidFormat) == 0x10, "AruidFormat is an invalid size"); // This is nn::irsensor::detail::StatusManager struct StatusManager { std::array device; std::array aruid; }; static_assert(sizeof(StatusManager) == 0x8000, "StatusManager is an invalid size"); Result ActivateIrsensor(ClientAppletResourceUserId aruid); Result DeactivateIrsensor(ClientAppletResourceUserId aruid); Result GetIrsensorSharedMemoryHandle(OutCopyHandle out_shared_memory, ClientAppletResourceUserId aruid); Result StopImageProcessor(Core::IrSensor::IrCameraHandle camera_handle, ClientAppletResourceUserId aruid); Result RunMomentProcessor(Core::IrSensor::IrCameraHandle camera_handle, ClientAppletResourceUserId aruid, const Core::IrSensor::PackedMomentProcessorConfig& processor_config); Result RunClusteringProcessor( Core::IrSensor::IrCameraHandle camera_handle, ClientAppletResourceUserId aruid, const Core::IrSensor::PackedClusteringProcessorConfig& processor_config); Result RunImageTransferProcessor( Core::IrSensor::IrCameraHandle camera_handle, ClientAppletResourceUserId aruid, const Core::IrSensor::PackedImageTransferProcessorConfig& processor_config, u64 transfer_memory_size, InCopyHandle t_mem); Result GetImageTransferProcessorState( Out out_state, Core::IrSensor::IrCameraHandle camera_handle, ClientAppletResourceUserId aruid, OutBuffer out_buffer_data); Result RunTeraPluginProcessor(Core::IrSensor::IrCameraHandle camera_handle, Core::IrSensor::PackedTeraPluginProcessorConfig processor_config, ClientAppletResourceUserId aruid); Result GetNpadIrCameraHandle(Out out_camera_handle, Core::HID::NpadIdType npad_id); Result RunPointingProcessor( Core::IrSensor::IrCameraHandle camera_handle, const Core::IrSensor::PackedPointingProcessorConfig& processor_config, ClientAppletResourceUserId aruid); Result SuspendImageProcessor(Core::IrSensor::IrCameraHandle camera_handle, ClientAppletResourceUserId aruid); Result CheckFirmwareVersion(Core::IrSensor::IrCameraHandle camera_handle, Core::IrSensor::PackedMcuVersion mcu_version, ClientAppletResourceUserId aruid); Result SetFunctionLevel(Core::IrSensor::IrCameraHandle camera_handle, Core::IrSensor::PackedFunctionLevel function_level, ClientAppletResourceUserId aruid); Result RunImageTransferExProcessor( Core::IrSensor::IrCameraHandle camera_handle, ClientAppletResourceUserId aruid, const Core::IrSensor::PackedImageTransferProcessorExConfig& processor_config, u64 transfer_memory_size, InCopyHandle t_mem); Result RunIrLedProcessor(Core::IrSensor::IrCameraHandle camera_handle, Core::IrSensor::PackedIrLedProcessorConfig processor_config, ClientAppletResourceUserId aruid); Result StopImageProcessorAsync(Core::IrSensor::IrCameraHandle camera_handle, ClientAppletResourceUserId aruid); Result ActivateIrsensorWithFunctionLevel(Core::IrSensor::PackedFunctionLevel function_level, ClientAppletResourceUserId aruid); Result IsIrCameraHandleValid(const Core::IrSensor::IrCameraHandle& camera_handle) const; Core::IrSensor::DeviceFormat& GetIrCameraSharedMemoryDeviceEntry( const Core::IrSensor::IrCameraHandle& camera_handle); template void MakeProcessor(const Core::IrSensor::IrCameraHandle& handle, Core::IrSensor::DeviceFormat& device_state) { const auto index = static_cast(handle.npad_id); if (index > sizeof(processors)) { LOG_CRITICAL(Service_IRS, "Invalid index {}", index); return; } processors[index] = std::make_unique(device_state); } template void MakeProcessorWithCoreContext(const Core::IrSensor::IrCameraHandle& handle, Core::IrSensor::DeviceFormat& device_state) { const auto index = static_cast(handle.npad_id); if (index > sizeof(processors)) { LOG_CRITICAL(Service_IRS, "Invalid index {}", index); return; } if constexpr (std::is_constructible_v) { processors[index] = std::make_unique(system, device_state, index); } else { processors[index] = std::make_unique(system.HIDCore(), device_state, index); } } template T& GetProcessor(const Core::IrSensor::IrCameraHandle& handle) { const auto index = static_cast(handle.npad_id); if (index > sizeof(processors)) { LOG_CRITICAL(Service_IRS, "Invalid index {}", index); return static_cast(*processors[0]); } return static_cast(*processors[index]); } template const T& GetProcessor(const Core::IrSensor::IrCameraHandle& handle) const { const auto index = static_cast(handle.npad_id); if (index > sizeof(processors)) { LOG_CRITICAL(Service_IRS, "Invalid index {}", index); return static_cast(*processors[0]); } return static_cast(*processors[index]); } Core::HID::EmulatedController* npad_device = nullptr; StatusManager* shared_memory = nullptr; std::array, 9> processors{}; }; class IRS_SYS final : public ServiceFramework { public: explicit IRS_SYS(Core::System& system); ~IRS_SYS() override; }; } // namespace Service::IRS