diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/hle/service/hid/hid_debug_server.cpp | 173 | ||||
-rw-r--r-- | src/core/hle/service/hid/hid_debug_server.h | 24 | ||||
-rw-r--r-- | src/core/hle/service/hid/irs.cpp | 588 | ||||
-rw-r--r-- | src/core/hle/service/hid/irs.h | 84 | ||||
-rw-r--r-- | src/hid_core/irsensor/image_transfer_processor.cpp | 5 | ||||
-rw-r--r-- | src/hid_core/irsensor/image_transfer_processor.h | 4 |
6 files changed, 345 insertions, 533 deletions
diff --git a/src/core/hle/service/hid/hid_debug_server.cpp b/src/core/hle/service/hid/hid_debug_server.cpp index 610af34dd..4e2663672 100644 --- a/src/core/hle/service/hid/hid_debug_server.cpp +++ b/src/core/hle/service/hid/hid_debug_server.cpp @@ -3,6 +3,7 @@ #include <algorithm> +#include "core/hle/service/cmif_serialization.h" #include "core/hle/service/hid/hid_debug_server.h" #include "core/hle/service/ipc_helpers.h" #include "hid_core/hid_types.h" @@ -11,7 +12,6 @@ #include "hid_core/resources/touch_screen/gesture.h" #include "hid_core/resources/touch_screen/touch_screen.h" -#include "hid_core/resources/touch_screen/touch_types.h" namespace Service::HID { @@ -24,14 +24,14 @@ IHidDebugServer::IHidDebugServer(Core::System& system_, std::shared_ptr<Resource {0, nullptr, "DeactivateDebugPad"}, {1, nullptr, "SetDebugPadAutoPilotState"}, {2, nullptr, "UnsetDebugPadAutoPilotState"}, - {10, &IHidDebugServer::DeactivateTouchScreen, "DeactivateTouchScreen"}, - {11, &IHidDebugServer::SetTouchScreenAutoPilotState, "SetTouchScreenAutoPilotState"}, - {12, &IHidDebugServer::UnsetTouchScreenAutoPilotState, "UnsetTouchScreenAutoPilotState"}, - {13, &IHidDebugServer::GetTouchScreenConfiguration, "GetTouchScreenConfiguration"}, - {14, &IHidDebugServer::ProcessTouchScreenAutoTune, "ProcessTouchScreenAutoTune"}, - {15, &IHidDebugServer::ForceStopTouchScreenManagement, "ForceStopTouchScreenManagement"}, - {16, &IHidDebugServer::ForceRestartTouchScreenManagement, "ForceRestartTouchScreenManagement"}, - {17, &IHidDebugServer::IsTouchScreenManaged, "IsTouchScreenManaged"}, + {10, C<&IHidDebugServer::DeactivateTouchScreen>, "DeactivateTouchScreen"}, + {11, C<&IHidDebugServer::SetTouchScreenAutoPilotState>, "SetTouchScreenAutoPilotState"}, + {12, C<&IHidDebugServer::UnsetTouchScreenAutoPilotState>, "UnsetTouchScreenAutoPilotState"}, + {13, C<&IHidDebugServer::GetTouchScreenConfiguration>, "GetTouchScreenConfiguration"}, + {14, C<&IHidDebugServer::ProcessTouchScreenAutoTune>, "ProcessTouchScreenAutoTune"}, + {15, C<&IHidDebugServer::ForceStopTouchScreenManagement>, "ForceStopTouchScreenManagement"}, + {16, C<&IHidDebugServer::ForceRestartTouchScreenManagement>, "ForceRestartTouchScreenManagement"}, + {17, C<&IHidDebugServer::IsTouchScreenManaged>, "IsTouchScreenManaged"}, {20, nullptr, "DeactivateMouse"}, {21, nullptr, "SetMouseAutoPilotState"}, {22, nullptr, "UnsetMouseAutoPilotState"}, @@ -47,7 +47,7 @@ IHidDebugServer::IHidDebugServer(Core::System& system_, std::shared_ptr<Resource {60, nullptr, "ClearNpadSystemCommonPolicy"}, {61, nullptr, "DeactivateNpad"}, {62, nullptr, "ForceDisconnectNpad"}, - {91, &IHidDebugServer::DeactivateGesture, "DeactivateGesture"}, + {91, C<&IHidDebugServer::DeactivateGesture>, "DeactivateGesture"}, {110, nullptr, "DeactivateHomeButton"}, {111, nullptr, "SetHomeButtonAutoPilotState"}, {112, nullptr, "UnsetHomeButtonAutoPilotState"}, @@ -160,169 +160,122 @@ IHidDebugServer::IHidDebugServer(Core::System& system_, std::shared_ptr<Resource } IHidDebugServer::~IHidDebugServer() = default; -void IHidDebugServer::DeactivateTouchScreen(HLERequestContext& ctx) { - LOG_INFO(Service_HID, "called"); - Result result = ResultSuccess; +Result IHidDebugServer::DeactivateTouchScreen() { + LOG_INFO(Service_HID, "called"); if (!firmware_settings->IsDeviceManaged()) { - result = GetResourceManager()->GetTouchScreen()->Deactivate(); + R_RETURN(GetResourceManager()->GetTouchScreen()->Deactivate()); } - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(result); + R_SUCCEED(); } -void IHidDebugServer::SetTouchScreenAutoPilotState(HLERequestContext& ctx) { +Result IHidDebugServer::SetTouchScreenAutoPilotState( + InArray<TouchState, BufferAttr_HipcMapAlias> auto_pilot_buffer) { AutoPilotState auto_pilot{}; - auto_pilot.count = ctx.GetReadBufferNumElements<TouchState>(); - const auto buffer = ctx.ReadBuffer(); - auto_pilot.count = std::min(auto_pilot.count, static_cast<u64>(auto_pilot.state.size())); - memcpy(auto_pilot.state.data(), buffer.data(), auto_pilot.count * sizeof(TouchState)); + auto_pilot.count = + static_cast<u64>(std::min(auto_pilot_buffer.size(), auto_pilot.state.size())); + memcpy(auto_pilot.state.data(), auto_pilot_buffer.data(), + auto_pilot.count * sizeof(TouchState)); LOG_INFO(Service_HID, "called, auto_pilot_count={}", auto_pilot.count); - const Result result = - GetResourceManager()->GetTouchScreen()->SetTouchScreenAutoPilotState(auto_pilot); - - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(result); + R_RETURN(GetResourceManager()->GetTouchScreen()->SetTouchScreenAutoPilotState(auto_pilot)); } -void IHidDebugServer::UnsetTouchScreenAutoPilotState(HLERequestContext& ctx) { +Result IHidDebugServer::UnsetTouchScreenAutoPilotState() { LOG_INFO(Service_HID, "called"); - - const Result result = GetResourceManager()->GetTouchScreen()->UnsetTouchScreenAutoPilotState(); - - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(result); + R_RETURN(GetResourceManager()->GetTouchScreen()->UnsetTouchScreenAutoPilotState()); } -void IHidDebugServer::GetTouchScreenConfiguration(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const auto applet_resource_user_id{rp.Pop<u64>()}; - - LOG_INFO(Service_HID, "called, applet_resource_user_id={}", applet_resource_user_id); +Result IHidDebugServer::GetTouchScreenConfiguration( + Out<Core::HID::TouchScreenConfigurationForNx> out_touchscreen_config, + ClientAppletResourceUserId aruid) { + LOG_INFO(Service_HID, "called, applet_resource_user_id={}", aruid.pid); - Core::HID::TouchScreenConfigurationForNx touchscreen_config{}; - const Result result = GetResourceManager()->GetTouchScreen()->GetTouchScreenConfiguration( - touchscreen_config, applet_resource_user_id); + R_TRY(GetResourceManager()->GetTouchScreen()->GetTouchScreenConfiguration( + *out_touchscreen_config, aruid.pid)); - if (touchscreen_config.mode != Core::HID::TouchScreenModeForNx::Heat2 && - touchscreen_config.mode != Core::HID::TouchScreenModeForNx::Finger) { - touchscreen_config.mode = Core::HID::TouchScreenModeForNx::UseSystemSetting; + if (out_touchscreen_config->mode != Core::HID::TouchScreenModeForNx::Heat2 && + out_touchscreen_config->mode != Core::HID::TouchScreenModeForNx::Finger) { + out_touchscreen_config->mode = Core::HID::TouchScreenModeForNx::UseSystemSetting; } - IPC::ResponseBuilder rb{ctx, 6}; - rb.Push(result); - rb.PushRaw(touchscreen_config); + R_SUCCEED(); } -void IHidDebugServer::ProcessTouchScreenAutoTune(HLERequestContext& ctx) { +Result IHidDebugServer::ProcessTouchScreenAutoTune() { LOG_INFO(Service_HID, "called"); - - Result result = GetResourceManager()->GetTouchScreen()->ProcessTouchScreenAutoTune(); - - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(result); + R_RETURN(GetResourceManager()->GetTouchScreen()->ProcessTouchScreenAutoTune()); } -void IHidDebugServer::ForceStopTouchScreenManagement(HLERequestContext& ctx) { +Result IHidDebugServer::ForceStopTouchScreenManagement() { LOG_INFO(Service_HID, "called"); if (!firmware_settings->IsDeviceManaged()) { - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); - return; + R_SUCCEED(); } - Result result = ResultSuccess; - bool is_touch_active{}; - bool is_gesture_active{}; auto touch_screen = GetResourceManager()->GetTouchScreen(); auto gesture = GetResourceManager()->GetGesture(); if (firmware_settings->IsTouchI2cManaged()) { - result = touch_screen->IsActive(is_touch_active); - if (result.IsSuccess()) { - result = gesture->IsActive(is_gesture_active); - } - if (result.IsSuccess() && is_touch_active) { - result = touch_screen->Deactivate(); + bool is_touch_active{}; + bool is_gesture_active{}; + R_TRY(touch_screen->IsActive(is_touch_active)); + R_TRY(gesture->IsActive(is_gesture_active)); + + if (is_touch_active) { + R_TRY(touch_screen->Deactivate()); } - if (result.IsSuccess() && is_gesture_active) { - result = gesture->Deactivate(); + if (is_gesture_active) { + R_TRY(gesture->Deactivate()); } } - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(result); + R_SUCCEED(); } -void IHidDebugServer::ForceRestartTouchScreenManagement(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - struct Parameters { - u32 basic_gesture_id; - INSERT_PADDING_WORDS_NOINIT(1); - u64 applet_resource_user_id; - }; - static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size."); - - const auto parameters{rp.PopRaw<Parameters>()}; - +Result IHidDebugServer::ForceRestartTouchScreenManagement(u32 basic_gesture_id, + ClientAppletResourceUserId aruid) { LOG_INFO(Service_HID, "called, basic_gesture_id={}, applet_resource_user_id={}", - parameters.basic_gesture_id, parameters.applet_resource_user_id); + basic_gesture_id, aruid.pid); - Result result = ResultSuccess; auto touch_screen = GetResourceManager()->GetTouchScreen(); auto gesture = GetResourceManager()->GetGesture(); if (firmware_settings->IsDeviceManaged() && firmware_settings->IsTouchI2cManaged()) { - result = gesture->Activate(); - if (result.IsSuccess()) { - result = - gesture->Activate(parameters.applet_resource_user_id, parameters.basic_gesture_id); - } - if (result.IsSuccess()) { - result = touch_screen->Activate(); - } - if (result.IsSuccess()) { - result = touch_screen->Activate(parameters.applet_resource_user_id); - } + R_TRY(gesture->Activate()); + R_TRY(gesture->Activate(aruid.pid, basic_gesture_id)); + R_TRY(touch_screen->Activate()); + R_TRY(touch_screen->Activate(aruid.pid)); } - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(result); + R_SUCCEED(); } -void IHidDebugServer::IsTouchScreenManaged(HLERequestContext& ctx) { +Result IHidDebugServer::IsTouchScreenManaged(Out<bool> out_is_managed) { LOG_INFO(Service_HID, "called"); bool is_touch_active{}; bool is_gesture_active{}; + R_TRY(GetResourceManager()->GetTouchScreen()->IsActive(is_touch_active)); + R_TRY(GetResourceManager()->GetGesture()->IsActive(is_gesture_active)); - Result result = GetResourceManager()->GetTouchScreen()->IsActive(is_touch_active); - if (result.IsSuccess()) { - result = GetResourceManager()->GetGesture()->IsActive(is_gesture_active); - } - - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(result); - rb.Push(is_touch_active | is_gesture_active); + *out_is_managed = is_touch_active || is_gesture_active; + R_SUCCEED(); } -void IHidDebugServer::DeactivateGesture(HLERequestContext& ctx) { +Result IHidDebugServer::DeactivateGesture() { LOG_INFO(Service_HID, "called"); - Result result = ResultSuccess; - if (!firmware_settings->IsDeviceManaged()) { - result = GetResourceManager()->GetGesture()->Deactivate(); + R_RETURN(GetResourceManager()->GetGesture()->Deactivate()); } - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(result); + R_SUCCEED(); } std::shared_ptr<ResourceManager> IHidDebugServer::GetResourceManager() { diff --git a/src/core/hle/service/hid/hid_debug_server.h b/src/core/hle/service/hid/hid_debug_server.h index 7d5b082b3..3a483f07e 100644 --- a/src/core/hle/service/hid/hid_debug_server.h +++ b/src/core/hle/service/hid/hid_debug_server.h @@ -3,7 +3,9 @@ #pragma once +#include "core/hle/service/cmif_types.h" #include "core/hle/service/service.h" +#include "hid_core/resources/touch_screen/touch_types.h" namespace Core { class System; @@ -20,15 +22,19 @@ public: ~IHidDebugServer() override; private: - void DeactivateTouchScreen(HLERequestContext& ctx); - void SetTouchScreenAutoPilotState(HLERequestContext& ctx); - void UnsetTouchScreenAutoPilotState(HLERequestContext& ctx); - void GetTouchScreenConfiguration(HLERequestContext& ctx); - void ProcessTouchScreenAutoTune(HLERequestContext& ctx); - void ForceStopTouchScreenManagement(HLERequestContext& ctx); - void ForceRestartTouchScreenManagement(HLERequestContext& ctx); - void IsTouchScreenManaged(HLERequestContext& ctx); - void DeactivateGesture(HLERequestContext& ctx); + Result DeactivateTouchScreen(); + Result SetTouchScreenAutoPilotState( + InArray<TouchState, BufferAttr_HipcMapAlias> auto_pilot_buffer); + Result UnsetTouchScreenAutoPilotState(); + Result GetTouchScreenConfiguration( + Out<Core::HID::TouchScreenConfigurationForNx> out_touchscreen_config, + ClientAppletResourceUserId aruid); + Result ProcessTouchScreenAutoTune(); + Result ForceStopTouchScreenManagement(); + Result ForceRestartTouchScreenManagement(u32 basic_gesture_id, + ClientAppletResourceUserId aruid); + Result IsTouchScreenManaged(Out<bool> out_is_managed); + Result DeactivateGesture(); std::shared_ptr<ResourceManager> GetResourceManager(); diff --git a/src/core/hle/service/hid/irs.cpp b/src/core/hle/service/hid/irs.cpp index 18e544f2f..7d7368ff9 100644 --- a/src/core/hle/service/hid/irs.cpp +++ b/src/core/hle/service/hid/irs.cpp @@ -9,6 +9,7 @@ #include "core/hle/kernel/k_shared_memory.h" #include "core/hle/kernel/k_transfer_memory.h" #include "core/hle/kernel/kernel.h" +#include "core/hle/service/cmif_serialization.h" #include "core/hle/service/hid/irs.h" #include "core/hle/service/ipc_helpers.h" #include "core/memory.h" @@ -28,24 +29,24 @@ namespace Service::IRS { IRS::IRS(Core::System& system_) : ServiceFramework{system_, "irs"} { // clang-format off static const FunctionInfo functions[] = { - {302, &IRS::ActivateIrsensor, "ActivateIrsensor"}, - {303, &IRS::DeactivateIrsensor, "DeactivateIrsensor"}, - {304, &IRS::GetIrsensorSharedMemoryHandle, "GetIrsensorSharedMemoryHandle"}, - {305, &IRS::StopImageProcessor, "StopImageProcessor"}, - {306, &IRS::RunMomentProcessor, "RunMomentProcessor"}, - {307, &IRS::RunClusteringProcessor, "RunClusteringProcessor"}, - {308, &IRS::RunImageTransferProcessor, "RunImageTransferProcessor"}, - {309, &IRS::GetImageTransferProcessorState, "GetImageTransferProcessorState"}, - {310, &IRS::RunTeraPluginProcessor, "RunTeraPluginProcessor"}, - {311, &IRS::GetNpadIrCameraHandle, "GetNpadIrCameraHandle"}, - {312, &IRS::RunPointingProcessor, "RunPointingProcessor"}, - {313, &IRS::SuspendImageProcessor, "SuspendImageProcessor"}, - {314, &IRS::CheckFirmwareVersion, "CheckFirmwareVersion"}, - {315, &IRS::SetFunctionLevel, "SetFunctionLevel"}, - {316, &IRS::RunImageTransferExProcessor, "RunImageTransferExProcessor"}, - {317, &IRS::RunIrLedProcessor, "RunIrLedProcessor"}, - {318, &IRS::StopImageProcessorAsync, "StopImageProcessorAsync"}, - {319, &IRS::ActivateIrsensorWithFunctionLevel, "ActivateIrsensorWithFunctionLevel"}, + {302, C<&IRS::ActivateIrsensor>, "ActivateIrsensor"}, + {303, C<&IRS::DeactivateIrsensor>, "DeactivateIrsensor"}, + {304, C<&IRS::GetIrsensorSharedMemoryHandle>, "GetIrsensorSharedMemoryHandle"}, + {305, C<&IRS::StopImageProcessor>, "StopImageProcessor"}, + {306, C<&IRS::RunMomentProcessor>, "RunMomentProcessor"}, + {307, C<&IRS::RunClusteringProcessor>, "RunClusteringProcessor"}, + {308, C<&IRS::RunImageTransferProcessor>, "RunImageTransferProcessor"}, + {309, C<&IRS::GetImageTransferProcessorState>, "GetImageTransferProcessorState"}, + {310, C<&IRS::RunTeraPluginProcessor>, "RunTeraPluginProcessor"}, + {311, C<&IRS::GetNpadIrCameraHandle>, "GetNpadIrCameraHandle"}, + {312, C<&IRS::RunPointingProcessor>, "RunPointingProcessor"}, + {313, C<&IRS::SuspendImageProcessor>, "SuspendImageProcessor"}, + {314, C<&IRS::CheckFirmwareVersion>, "CheckFirmwareVersion"}, + {315, C<&IRS::SetFunctionLevel>, "SetFunctionLevel"}, + {316, C<&IRS::RunImageTransferExProcessor>, "RunImageTransferExProcessor"}, + {317, C<&IRS::RunIrLedProcessor>, "RunIrLedProcessor"}, + {318, C<&IRS::StopImageProcessorAsync>, "StopImageProcessorAsync"}, + {319, C<&IRS::ActivateIrsensorWithFunctionLevel>, "ActivateIrsensorWithFunctionLevel"}, }; // clang-format on @@ -57,489 +58,292 @@ IRS::IRS(Core::System& system_) : ServiceFramework{system_, "irs"} { } IRS::~IRS() = default; -void IRS::ActivateIrsensor(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const auto applet_resource_user_id{rp.Pop<u64>()}; - - LOG_WARNING(Service_IRS, "(STUBBED) called, applet_resource_user_id={}", - applet_resource_user_id); - - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); +Result IRS::ActivateIrsensor(ClientAppletResourceUserId aruid) { + LOG_WARNING(Service_IRS, "(STUBBED) called, applet_resource_user_id={}", aruid.pid); + R_SUCCEED(); } -void IRS::DeactivateIrsensor(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const auto applet_resource_user_id{rp.Pop<u64>()}; - - LOG_WARNING(Service_IRS, "(STUBBED) called, applet_resource_user_id={}", - applet_resource_user_id); - - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); +Result IRS::DeactivateIrsensor(ClientAppletResourceUserId aruid) { + LOG_WARNING(Service_IRS, "(STUBBED) called, applet_resource_user_id={}", aruid.pid); + R_SUCCEED(); } -void IRS::GetIrsensorSharedMemoryHandle(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const auto applet_resource_user_id{rp.Pop<u64>()}; - - LOG_DEBUG(Service_IRS, "called, applet_resource_user_id={}", applet_resource_user_id); +Result IRS::GetIrsensorSharedMemoryHandle(OutCopyHandle<Kernel::KSharedMemory> out_shared_memory, + ClientAppletResourceUserId aruid) { + LOG_DEBUG(Service_IRS, "called, applet_resource_user_id={}", aruid.pid); - IPC::ResponseBuilder rb{ctx, 2, 1}; - rb.Push(ResultSuccess); - rb.PushCopyObjects(&system.Kernel().GetIrsSharedMem()); + *out_shared_memory = &system.Kernel().GetIrsSharedMem(); + R_SUCCEED(); } -void IRS::StopImageProcessor(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - struct Parameters { - Core::IrSensor::IrCameraHandle camera_handle; - INSERT_PADDING_WORDS_NOINIT(1); - u64 applet_resource_user_id; - }; - static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size."); - - const auto parameters{rp.PopRaw<Parameters>()}; - +Result IRS::StopImageProcessor(Core::IrSensor::IrCameraHandle camera_handle, + ClientAppletResourceUserId aruid) { LOG_WARNING(Service_IRS, "(STUBBED) called, npad_type={}, npad_id={}, applet_resource_user_id={}", - parameters.camera_handle.npad_type, parameters.camera_handle.npad_id, - parameters.applet_resource_user_id); - - auto result = IsIrCameraHandleValid(parameters.camera_handle); - if (result.IsSuccess()) { - // TODO: Stop Image processor - npad_device->SetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex, - Common::Input::PollingMode::Active); - result = ResultSuccess; - } + camera_handle.npad_type, camera_handle.npad_id, aruid.pid); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(result); -} - -void IRS::RunMomentProcessor(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - struct Parameters { - Core::IrSensor::IrCameraHandle camera_handle; - INSERT_PADDING_WORDS_NOINIT(1); - u64 applet_resource_user_id; - Core::IrSensor::PackedMomentProcessorConfig processor_config; - }; - static_assert(sizeof(Parameters) == 0x30, "Parameters has incorrect size."); + R_TRY(IsIrCameraHandleValid(camera_handle)); - const auto parameters{rp.PopRaw<Parameters>()}; + // TODO: Stop Image processor + npad_device->SetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex, + Common::Input::PollingMode::Active); + R_SUCCEED(); +} +Result IRS::RunMomentProcessor( + Core::IrSensor::IrCameraHandle camera_handle, ClientAppletResourceUserId aruid, + const Core::IrSensor::PackedMomentProcessorConfig& processor_config) { LOG_WARNING(Service_IRS, "(STUBBED) called, npad_type={}, npad_id={}, applet_resource_user_id={}", - parameters.camera_handle.npad_type, parameters.camera_handle.npad_id, - parameters.applet_resource_user_id); - - const auto result = IsIrCameraHandleValid(parameters.camera_handle); - - if (result.IsSuccess()) { - auto& device = GetIrCameraSharedMemoryDeviceEntry(parameters.camera_handle); - MakeProcessorWithCoreContext<MomentProcessor>(parameters.camera_handle, device); - auto& image_transfer_processor = GetProcessor<MomentProcessor>(parameters.camera_handle); - image_transfer_processor.SetConfig(parameters.processor_config); - npad_device->SetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex, - Common::Input::PollingMode::IR); - } + camera_handle.npad_type, camera_handle.npad_id, aruid.pid); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(result); -} + R_TRY(IsIrCameraHandleValid(camera_handle)); -void IRS::RunClusteringProcessor(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - struct Parameters { - Core::IrSensor::IrCameraHandle camera_handle; - INSERT_PADDING_WORDS_NOINIT(1); - u64 applet_resource_user_id; - Core::IrSensor::PackedClusteringProcessorConfig processor_config; - }; - static_assert(sizeof(Parameters) == 0x38, "Parameters has incorrect size."); + auto& device = GetIrCameraSharedMemoryDeviceEntry(camera_handle); + MakeProcessorWithCoreContext<MomentProcessor>(camera_handle, device); + auto& image_transfer_processor = GetProcessor<MomentProcessor>(camera_handle); + image_transfer_processor.SetConfig(processor_config); + npad_device->SetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex, + Common::Input::PollingMode::IR); - const auto parameters{rp.PopRaw<Parameters>()}; + R_SUCCEED(); +} +Result IRS::RunClusteringProcessor( + Core::IrSensor::IrCameraHandle camera_handle, ClientAppletResourceUserId aruid, + const Core::IrSensor::PackedClusteringProcessorConfig& processor_config) { LOG_WARNING(Service_IRS, "(STUBBED) called, npad_type={}, npad_id={}, applet_resource_user_id={}", - parameters.camera_handle.npad_type, parameters.camera_handle.npad_id, - parameters.applet_resource_user_id); - - auto result = IsIrCameraHandleValid(parameters.camera_handle); - - if (result.IsSuccess()) { - auto& device = GetIrCameraSharedMemoryDeviceEntry(parameters.camera_handle); - MakeProcessorWithCoreContext<ClusteringProcessor>(parameters.camera_handle, device); - auto& image_transfer_processor = - GetProcessor<ClusteringProcessor>(parameters.camera_handle); - image_transfer_processor.SetConfig(parameters.processor_config); - npad_device->SetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex, - Common::Input::PollingMode::IR); - } + camera_handle.npad_type, camera_handle.npad_id, aruid.pid); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(result); -} + R_TRY(IsIrCameraHandleValid(camera_handle)); -void IRS::RunImageTransferProcessor(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - struct Parameters { - Core::IrSensor::IrCameraHandle camera_handle; - INSERT_PADDING_WORDS_NOINIT(1); - u64 applet_resource_user_id; - Core::IrSensor::PackedImageTransferProcessorConfig processor_config; - u32 transfer_memory_size; - }; - static_assert(sizeof(Parameters) == 0x30, "Parameters has incorrect size."); + auto& device = GetIrCameraSharedMemoryDeviceEntry(camera_handle); + MakeProcessorWithCoreContext<ClusteringProcessor>(camera_handle, device); + auto& image_transfer_processor = GetProcessor<ClusteringProcessor>(camera_handle); + image_transfer_processor.SetConfig(processor_config); + npad_device->SetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex, + Common::Input::PollingMode::IR); - const auto parameters{rp.PopRaw<Parameters>()}; - const auto t_mem_handle{ctx.GetCopyHandle(0)}; + R_SUCCEED(); +} - auto t_mem = ctx.GetObjectFromHandle<Kernel::KTransferMemory>(t_mem_handle); +Result IRS::RunImageTransferProcessor( + Core::IrSensor::IrCameraHandle camera_handle, ClientAppletResourceUserId aruid, + const Core::IrSensor::PackedImageTransferProcessorConfig& processor_config, + u64 transfer_memory_size, InCopyHandle<Kernel::KTransferMemory> t_mem) { - if (t_mem.IsNull()) { - LOG_ERROR(Service_IRS, "t_mem is a nullptr for handle=0x{:08X}", t_mem_handle); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultUnknown); - return; - } - - ASSERT_MSG(t_mem->GetSize() == parameters.transfer_memory_size, "t_mem has incorrect size"); + ASSERT_MSG(t_mem->GetSize() == transfer_memory_size, "t_mem has incorrect size"); LOG_INFO(Service_IRS, "called, npad_type={}, npad_id={}, transfer_memory_size={}, transfer_memory_size={}, " "applet_resource_user_id={}", - parameters.camera_handle.npad_type, parameters.camera_handle.npad_id, - parameters.transfer_memory_size, t_mem->GetSize(), parameters.applet_resource_user_id); - - const auto result = IsIrCameraHandleValid(parameters.camera_handle); - - if (result.IsSuccess()) { - auto& device = GetIrCameraSharedMemoryDeviceEntry(parameters.camera_handle); - MakeProcessorWithCoreContext<ImageTransferProcessor>(parameters.camera_handle, device); - auto& image_transfer_processor = - GetProcessor<ImageTransferProcessor>(parameters.camera_handle); - image_transfer_processor.SetConfig(parameters.processor_config); - image_transfer_processor.SetTransferMemoryAddress(t_mem->GetSourceAddress()); - npad_device->SetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex, - Common::Input::PollingMode::IR); - } + camera_handle.npad_type, camera_handle.npad_id, transfer_memory_size, t_mem->GetSize(), + aruid.pid); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(result); -} + R_TRY(IsIrCameraHandleValid(camera_handle)); -void IRS::GetImageTransferProcessorState(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - struct Parameters { - Core::IrSensor::IrCameraHandle camera_handle; - INSERT_PADDING_WORDS_NOINIT(1); - u64 applet_resource_user_id; - }; - static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size."); + auto& device = GetIrCameraSharedMemoryDeviceEntry(camera_handle); + MakeProcessorWithCoreContext<ImageTransferProcessor>(camera_handle, device); + auto& image_transfer_processor = GetProcessor<ImageTransferProcessor>(camera_handle); + image_transfer_processor.SetConfig(processor_config); + image_transfer_processor.SetTransferMemoryAddress(t_mem->GetSourceAddress()); + npad_device->SetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex, + Common::Input::PollingMode::IR); - const auto parameters{rp.PopRaw<Parameters>()}; + R_SUCCEED(); +} +Result IRS::GetImageTransferProcessorState( + Out<Core::IrSensor::ImageTransferProcessorState> out_state, + Core::IrSensor::IrCameraHandle camera_handle, ClientAppletResourceUserId aruid, + OutBuffer<BufferAttr_HipcMapAlias> out_buffer_data) { LOG_DEBUG(Service_IRS, "(STUBBED) called, npad_type={}, npad_id={}, applet_resource_user_id={}", - parameters.camera_handle.npad_type, parameters.camera_handle.npad_id, - parameters.applet_resource_user_id); - - const auto result = IsIrCameraHandleValid(parameters.camera_handle); - if (result.IsError()) { - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(result); - return; - } + camera_handle.npad_type, camera_handle.npad_id, aruid.pid); - const auto& device = GetIrCameraSharedMemoryDeviceEntry(parameters.camera_handle); + R_TRY(IsIrCameraHandleValid(camera_handle)); - if (device.mode != Core::IrSensor::IrSensorMode::ImageTransferProcessor) { - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(InvalidProcessorState); - return; - } + const auto& device = GetIrCameraSharedMemoryDeviceEntry(camera_handle); + + R_TRY(IsIrCameraHandleValid(camera_handle)); + R_UNLESS(device.mode == Core::IrSensor::IrSensorMode::ImageTransferProcessor, + InvalidProcessorState); - std::vector<u8> data{}; - const auto& image_transfer_processor = - GetProcessor<ImageTransferProcessor>(parameters.camera_handle); - const auto& state = image_transfer_processor.GetState(data); + *out_state = GetProcessor<ImageTransferProcessor>(camera_handle).GetState(out_buffer_data); - ctx.WriteBuffer(data); - IPC::ResponseBuilder rb{ctx, 6}; - rb.Push(ResultSuccess); - rb.PushRaw(state); + R_SUCCEED(); } -void IRS::RunTeraPluginProcessor(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - struct Parameters { - Core::IrSensor::IrCameraHandle camera_handle; - Core::IrSensor::PackedTeraPluginProcessorConfig processor_config; - INSERT_PADDING_WORDS_NOINIT(1); - u64 applet_resource_user_id; - }; - static_assert(sizeof(Parameters) == 0x18, "Parameters has incorrect size."); +Result IRS::RunTeraPluginProcessor(Core::IrSensor::IrCameraHandle camera_handle, + Core::IrSensor::PackedTeraPluginProcessorConfig processor_config, + ClientAppletResourceUserId aruid) { + LOG_WARNING(Service_IRS, + "(STUBBED) called, npad_type={}, npad_id={}, mode={}, mcu_version={}.{}, " + "applet_resource_user_id={}", + camera_handle.npad_type, camera_handle.npad_id, processor_config.mode, + processor_config.required_mcu_version.major, + processor_config.required_mcu_version.minor, aruid.pid); - const auto parameters{rp.PopRaw<Parameters>()}; + R_TRY(IsIrCameraHandleValid(camera_handle)); - LOG_WARNING( - Service_IRS, - "(STUBBED) called, npad_type={}, npad_id={}, mode={}, mcu_version={}.{}, " - "applet_resource_user_id={}", - parameters.camera_handle.npad_type, parameters.camera_handle.npad_id, - parameters.processor_config.mode, parameters.processor_config.required_mcu_version.major, - parameters.processor_config.required_mcu_version.minor, parameters.applet_resource_user_id); - - const auto result = IsIrCameraHandleValid(parameters.camera_handle); - - if (result.IsSuccess()) { - auto& device = GetIrCameraSharedMemoryDeviceEntry(parameters.camera_handle); - MakeProcessor<TeraPluginProcessor>(parameters.camera_handle, device); - auto& image_transfer_processor = - GetProcessor<TeraPluginProcessor>(parameters.camera_handle); - image_transfer_processor.SetConfig(parameters.processor_config); - npad_device->SetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex, - Common::Input::PollingMode::IR); - } + auto& device = GetIrCameraSharedMemoryDeviceEntry(camera_handle); + MakeProcessor<TeraPluginProcessor>(camera_handle, device); + auto& image_transfer_processor = GetProcessor<TeraPluginProcessor>(camera_handle); + image_transfer_processor.SetConfig(processor_config); + npad_device->SetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex, + Common::Input::PollingMode::IR); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(result); + R_SUCCEED(); } -void IRS::GetNpadIrCameraHandle(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const auto npad_id{rp.PopEnum<Core::HID::NpadIdType>()}; - - if (npad_id > Core::HID::NpadIdType::Player8 && npad_id != Core::HID::NpadIdType::Invalid && - npad_id != Core::HID::NpadIdType::Handheld) { - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(Service::HID::ResultInvalidNpadId); - return; - } +Result IRS::GetNpadIrCameraHandle(Out<Core::IrSensor::IrCameraHandle> out_camera_handle, + Core::HID::NpadIdType npad_id) { + R_UNLESS(HID::IsNpadIdValid(npad_id), HID::ResultInvalidNpadId); - Core::IrSensor::IrCameraHandle camera_handle{ + *out_camera_handle = { .npad_id = static_cast<u8>(HID::NpadIdTypeToIndex(npad_id)), .npad_type = Core::HID::NpadStyleIndex::None, }; LOG_INFO(Service_IRS, "called, npad_id={}, camera_npad_id={}, camera_npad_type={}", npad_id, - camera_handle.npad_id, camera_handle.npad_type); + out_camera_handle->npad_id, out_camera_handle->npad_type); - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(ResultSuccess); - rb.PushRaw(camera_handle); + R_SUCCEED(); } -void IRS::RunPointingProcessor(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const auto camera_handle{rp.PopRaw<Core::IrSensor::IrCameraHandle>()}; - const auto processor_config{rp.PopRaw<Core::IrSensor::PackedPointingProcessorConfig>()}; - const auto applet_resource_user_id{rp.Pop<u64>()}; - +Result IRS::RunPointingProcessor( + Core::IrSensor::IrCameraHandle camera_handle, + const Core::IrSensor::PackedPointingProcessorConfig& processor_config, + ClientAppletResourceUserId aruid) { LOG_WARNING( Service_IRS, "(STUBBED) called, npad_type={}, npad_id={}, mcu_version={}.{}, applet_resource_user_id={}", camera_handle.npad_type, camera_handle.npad_id, processor_config.required_mcu_version.major, - processor_config.required_mcu_version.minor, applet_resource_user_id); + processor_config.required_mcu_version.minor, aruid.pid); - auto result = IsIrCameraHandleValid(camera_handle); + R_TRY(IsIrCameraHandleValid(camera_handle)); - if (result.IsSuccess()) { - auto& device = GetIrCameraSharedMemoryDeviceEntry(camera_handle); - MakeProcessor<PointingProcessor>(camera_handle, device); - auto& image_transfer_processor = GetProcessor<PointingProcessor>(camera_handle); - image_transfer_processor.SetConfig(processor_config); - npad_device->SetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex, - Common::Input::PollingMode::IR); - } + auto& device = GetIrCameraSharedMemoryDeviceEntry(camera_handle); + MakeProcessor<PointingProcessor>(camera_handle, device); + auto& image_transfer_processor = GetProcessor<PointingProcessor>(camera_handle); + image_transfer_processor.SetConfig(processor_config); + npad_device->SetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex, + Common::Input::PollingMode::IR); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(result); + R_SUCCEED(); } -void IRS::SuspendImageProcessor(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - struct Parameters { - Core::IrSensor::IrCameraHandle camera_handle; - INSERT_PADDING_WORDS_NOINIT(1); - u64 applet_resource_user_id; - }; - static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size."); - - const auto parameters{rp.PopRaw<Parameters>()}; - +Result IRS::SuspendImageProcessor(Core::IrSensor::IrCameraHandle camera_handle, + ClientAppletResourceUserId aruid) { LOG_WARNING(Service_IRS, "(STUBBED) called, npad_type={}, npad_id={}, applet_resource_user_id={}", - parameters.camera_handle.npad_type, parameters.camera_handle.npad_id, - parameters.applet_resource_user_id); + camera_handle.npad_type, camera_handle.npad_id, aruid.pid); - auto result = IsIrCameraHandleValid(parameters.camera_handle); - if (result.IsSuccess()) { - // TODO: Suspend image processor - result = ResultSuccess; - } + R_TRY(IsIrCameraHandleValid(camera_handle)); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(result); -} + // TODO: Suspend image processor -void IRS::CheckFirmwareVersion(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const auto camera_handle{rp.PopRaw<Core::IrSensor::IrCameraHandle>()}; - const auto mcu_version{rp.PopRaw<Core::IrSensor::PackedMcuVersion>()}; - const auto applet_resource_user_id{rp.Pop<u64>()}; + R_SUCCEED(); +} +Result IRS::CheckFirmwareVersion(Core::IrSensor::IrCameraHandle camera_handle, + Core::IrSensor::PackedMcuVersion mcu_version, + ClientAppletResourceUserId aruid) { LOG_WARNING( Service_IRS, "(STUBBED) called, npad_type={}, npad_id={}, applet_resource_user_id={}, mcu_version={}.{}", - camera_handle.npad_type, camera_handle.npad_id, applet_resource_user_id, mcu_version.major, + camera_handle.npad_type, camera_handle.npad_id, aruid.pid, mcu_version.major, mcu_version.minor); - auto result = IsIrCameraHandleValid(camera_handle); - if (result.IsSuccess()) { - // TODO: Check firmware version - result = ResultSuccess; - } + R_TRY(IsIrCameraHandleValid(camera_handle)); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(result); -} + // TODO: Check firmware version -void IRS::SetFunctionLevel(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const auto camera_handle{rp.PopRaw<Core::IrSensor::IrCameraHandle>()}; - const auto function_level{rp.PopRaw<Core::IrSensor::PackedFunctionLevel>()}; - const auto applet_resource_user_id{rp.Pop<u64>()}; + R_SUCCEED(); +} +Result IRS::SetFunctionLevel(Core::IrSensor::IrCameraHandle camera_handle, + Core::IrSensor::PackedFunctionLevel function_level, + ClientAppletResourceUserId aruid) { LOG_WARNING( Service_IRS, "(STUBBED) called, npad_type={}, npad_id={}, function_level={}, applet_resource_user_id={}", - camera_handle.npad_type, camera_handle.npad_id, function_level.function_level, - applet_resource_user_id); + camera_handle.npad_type, camera_handle.npad_id, function_level.function_level, aruid.pid); - auto result = IsIrCameraHandleValid(camera_handle); - if (result.IsSuccess()) { - // TODO: Set Function level - result = ResultSuccess; - } + R_TRY(IsIrCameraHandleValid(camera_handle)); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(result); -} + // TODO: Set Function level -void IRS::RunImageTransferExProcessor(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - struct Parameters { - Core::IrSensor::IrCameraHandle camera_handle; - INSERT_PADDING_WORDS_NOINIT(1); - u64 applet_resource_user_id; - Core::IrSensor::PackedImageTransferProcessorExConfig processor_config; - u64 transfer_memory_size; - }; - static_assert(sizeof(Parameters) == 0x38, "Parameters has incorrect size."); + R_SUCCEED(); +} - const auto parameters{rp.PopRaw<Parameters>()}; - const auto t_mem_handle{ctx.GetCopyHandle(0)}; +Result IRS::RunImageTransferExProcessor( + Core::IrSensor::IrCameraHandle camera_handle, ClientAppletResourceUserId aruid, + const Core::IrSensor::PackedImageTransferProcessorExConfig& processor_config, + u64 transfer_memory_size, InCopyHandle<Kernel::KTransferMemory> t_mem) { - auto t_mem = ctx.GetObjectFromHandle<Kernel::KTransferMemory>(t_mem_handle); + ASSERT_MSG(t_mem->GetSize() == transfer_memory_size, "t_mem has incorrect size"); LOG_INFO(Service_IRS, "called, npad_type={}, npad_id={}, transfer_memory_size={}, " "applet_resource_user_id={}", - parameters.camera_handle.npad_type, parameters.camera_handle.npad_id, - parameters.transfer_memory_size, parameters.applet_resource_user_id); - - auto result = IsIrCameraHandleValid(parameters.camera_handle); - - if (result.IsSuccess()) { - auto& device = GetIrCameraSharedMemoryDeviceEntry(parameters.camera_handle); - MakeProcessorWithCoreContext<ImageTransferProcessor>(parameters.camera_handle, device); - auto& image_transfer_processor = - GetProcessor<ImageTransferProcessor>(parameters.camera_handle); - image_transfer_processor.SetConfig(parameters.processor_config); - image_transfer_processor.SetTransferMemoryAddress(t_mem->GetSourceAddress()); - npad_device->SetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex, - Common::Input::PollingMode::IR); - } + camera_handle.npad_type, camera_handle.npad_id, transfer_memory_size, aruid.pid); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(result); -} + R_TRY(IsIrCameraHandleValid(camera_handle)); + + auto& device = GetIrCameraSharedMemoryDeviceEntry(camera_handle); + MakeProcessorWithCoreContext<ImageTransferProcessor>(camera_handle, device); + auto& image_transfer_processor = GetProcessor<ImageTransferProcessor>(camera_handle); + image_transfer_processor.SetConfig(processor_config); + image_transfer_processor.SetTransferMemoryAddress(t_mem->GetSourceAddress()); + npad_device->SetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex, + Common::Input::PollingMode::IR); -void IRS::RunIrLedProcessor(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - const auto camera_handle{rp.PopRaw<Core::IrSensor::IrCameraHandle>()}; - const auto processor_config{rp.PopRaw<Core::IrSensor::PackedIrLedProcessorConfig>()}; - const auto applet_resource_user_id{rp.Pop<u64>()}; + R_SUCCEED(); +} +Result IRS::RunIrLedProcessor(Core::IrSensor::IrCameraHandle camera_handle, + Core::IrSensor::PackedIrLedProcessorConfig processor_config, + ClientAppletResourceUserId aruid) { LOG_WARNING(Service_IRS, "(STUBBED) called, npad_type={}, npad_id={}, light_target={}, mcu_version={}.{} " "applet_resource_user_id={}", camera_handle.npad_type, camera_handle.npad_id, processor_config.light_target, processor_config.required_mcu_version.major, - processor_config.required_mcu_version.minor, applet_resource_user_id); + processor_config.required_mcu_version.minor, aruid.pid); - auto result = IsIrCameraHandleValid(camera_handle); + R_TRY(IsIrCameraHandleValid(camera_handle)); - if (result.IsSuccess()) { - auto& device = GetIrCameraSharedMemoryDeviceEntry(camera_handle); - MakeProcessor<IrLedProcessor>(camera_handle, device); - auto& image_transfer_processor = GetProcessor<IrLedProcessor>(camera_handle); - image_transfer_processor.SetConfig(processor_config); - npad_device->SetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex, - Common::Input::PollingMode::IR); - } + auto& device = GetIrCameraSharedMemoryDeviceEntry(camera_handle); + MakeProcessor<IrLedProcessor>(camera_handle, device); + auto& image_transfer_processor = GetProcessor<IrLedProcessor>(camera_handle); + image_transfer_processor.SetConfig(processor_config); + npad_device->SetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex, + Common::Input::PollingMode::IR); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(result); + R_SUCCEED(); } -void IRS::StopImageProcessorAsync(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - struct Parameters { - Core::IrSensor::IrCameraHandle camera_handle; - INSERT_PADDING_WORDS_NOINIT(1); - u64 applet_resource_user_id; - }; - static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size."); - - const auto parameters{rp.PopRaw<Parameters>()}; - +Result IRS::StopImageProcessorAsync(Core::IrSensor::IrCameraHandle camera_handle, + ClientAppletResourceUserId aruid) { LOG_WARNING(Service_IRS, "(STUBBED) called, npad_type={}, npad_id={}, applet_resource_user_id={}", - parameters.camera_handle.npad_type, parameters.camera_handle.npad_id, - parameters.applet_resource_user_id); - - auto result = IsIrCameraHandleValid(parameters.camera_handle); - if (result.IsSuccess()) { - // TODO: Stop image processor async - npad_device->SetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex, - Common::Input::PollingMode::Active); - result = ResultSuccess; - } + camera_handle.npad_type, camera_handle.npad_id, aruid.pid); - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(result); -} + R_TRY(IsIrCameraHandleValid(camera_handle)); -void IRS::ActivateIrsensorWithFunctionLevel(HLERequestContext& ctx) { - IPC::RequestParser rp{ctx}; - struct Parameters { - Core::IrSensor::PackedFunctionLevel function_level; - INSERT_PADDING_WORDS_NOINIT(1); - u64 applet_resource_user_id; - }; - static_assert(sizeof(Parameters) == 0x10, "Parameters has incorrect size."); + // TODO: Stop image processor async + npad_device->SetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex, + Common::Input::PollingMode::Active); - const auto parameters{rp.PopRaw<Parameters>()}; + R_SUCCEED(); +} +Result IRS::ActivateIrsensorWithFunctionLevel(Core::IrSensor::PackedFunctionLevel function_level, + ClientAppletResourceUserId aruid) { LOG_WARNING(Service_IRS, "(STUBBED) called, function_level={}, applet_resource_user_id={}", - parameters.function_level.function_level, parameters.applet_resource_user_id); - - IPC::ResponseBuilder rb{ctx, 2}; - rb.Push(ResultSuccess); + function_level.function_level, aruid.pid); + R_SUCCEED(); } Result IRS::IsIrCameraHandleValid(const Core::IrSensor::IrCameraHandle& camera_handle) const { diff --git a/src/core/hle/service/hid/irs.h b/src/core/hle/service/hid/irs.h index 06b7279ee..58dfee6c3 100644 --- a/src/core/hle/service/hid/irs.h +++ b/src/core/hle/service/hid/irs.h @@ -4,6 +4,7 @@ #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" @@ -35,26 +36,73 @@ private: }; static_assert(sizeof(StatusManager) == 0x8000, "StatusManager is an invalid size"); - void ActivateIrsensor(HLERequestContext& ctx); - void DeactivateIrsensor(HLERequestContext& ctx); - void GetIrsensorSharedMemoryHandle(HLERequestContext& ctx); - void StopImageProcessor(HLERequestContext& ctx); - void RunMomentProcessor(HLERequestContext& ctx); - void RunClusteringProcessor(HLERequestContext& ctx); - void RunImageTransferProcessor(HLERequestContext& ctx); - void GetImageTransferProcessorState(HLERequestContext& ctx); - void RunTeraPluginProcessor(HLERequestContext& ctx); - void GetNpadIrCameraHandle(HLERequestContext& ctx); - void RunPointingProcessor(HLERequestContext& ctx); - void SuspendImageProcessor(HLERequestContext& ctx); - void CheckFirmwareVersion(HLERequestContext& ctx); - void SetFunctionLevel(HLERequestContext& ctx); - void RunImageTransferExProcessor(HLERequestContext& ctx); - void RunIrLedProcessor(HLERequestContext& ctx); - void StopImageProcessorAsync(HLERequestContext& ctx); - void ActivateIrsensorWithFunctionLevel(HLERequestContext& ctx); + Result ActivateIrsensor(ClientAppletResourceUserId aruid); + + Result DeactivateIrsensor(ClientAppletResourceUserId aruid); + + Result GetIrsensorSharedMemoryHandle(OutCopyHandle<Kernel::KSharedMemory> 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<Kernel::KTransferMemory> t_mem); + + Result GetImageTransferProcessorState( + Out<Core::IrSensor::ImageTransferProcessorState> out_state, + Core::IrSensor::IrCameraHandle camera_handle, ClientAppletResourceUserId aruid, + OutBuffer<BufferAttr_HipcMapAlias> out_buffer_data); + + Result RunTeraPluginProcessor(Core::IrSensor::IrCameraHandle camera_handle, + Core::IrSensor::PackedTeraPluginProcessorConfig processor_config, + ClientAppletResourceUserId aruid); + + Result GetNpadIrCameraHandle(Out<Core::IrSensor::IrCameraHandle> 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<Kernel::KTransferMemory> 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); diff --git a/src/hid_core/irsensor/image_transfer_processor.cpp b/src/hid_core/irsensor/image_transfer_processor.cpp index d6573f8dc..2b5a50ef6 100644 --- a/src/hid_core/irsensor/image_transfer_processor.cpp +++ b/src/hid_core/irsensor/image_transfer_processor.cpp @@ -145,9 +145,8 @@ void ImageTransferProcessor::SetTransferMemoryAddress(Common::ProcessAddress t_m } Core::IrSensor::ImageTransferProcessorState ImageTransferProcessor::GetState( - std::vector<u8>& data) const { - const auto size = GetDataSize(current_config.trimming_format); - data.resize(size); + std::span<u8> data) const { + const auto size = std::min(GetDataSize(current_config.trimming_format), data.size()); system.ApplicationMemory().ReadBlock(transfer_memory, data.data(), size); return processor_state; } diff --git a/src/hid_core/irsensor/image_transfer_processor.h b/src/hid_core/irsensor/image_transfer_processor.h index 4e0117084..df1c9d920 100644 --- a/src/hid_core/irsensor/image_transfer_processor.h +++ b/src/hid_core/irsensor/image_transfer_processor.h @@ -3,6 +3,8 @@ #pragma once +#include <span> + #include "common/typed_address.h" #include "hid_core/irsensor/irs_types.h" #include "hid_core/irsensor/processor_base.h" @@ -39,7 +41,7 @@ public: // Transfer memory where the image data will be stored void SetTransferMemoryAddress(Common::ProcessAddress t_mem); - Core::IrSensor::ImageTransferProcessorState GetState(std::vector<u8>& data) const; + Core::IrSensor::ImageTransferProcessorState GetState(std::span<u8> data) const; private: // This is nn::irsensor::ImageTransferProcessorConfig |