#include "hid.h" #include namespace skyline::kernel::service::hid { IAppletResource::IAppletResource(const DeviceState &state, ServiceManager& manager) : BaseService(state, manager, false, Service::hid_IAppletResource, { {0x0, SFunc(IAppletResource::GetSharedMemoryHandle)} }) {} void IAppletResource::GetSharedMemoryHandle(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { hidSharedMemory = state.os->MapSharedKernel(0, constant::hidSharedMemSize, memory::Permission(true, false, false), memory::Permission(true, true, false), memory::Type::SharedMemory); response.copyHandles.push_back(state.thisProcess->InsertItem(hidSharedMemory)); } hid::hid(const DeviceState &state, ServiceManager &manager) : BaseService(state, manager, false, Service::hid, { {0x0, SFunc(hid::CreateAppletResource)}, {0x64, SFunc(hid::SetSupportedNpadStyleSet)}, {0x66, SFunc(hid::SetSupportedNpadIdType)}, {0x67, SFunc(hid::ActivateNpad)}, {0x78, SFunc(hid::SetNpadJoyHoldType)}, {0x7A, SFunc(hid::SetNpadJoyAssignmentModeSingleByDefault)}, {0x7B, SFunc(hid::SetNpadJoyAssignmentModeSingle)}, {0x7C, SFunc(hid::SetNpadJoyAssignmentModeDual)} }) {} void hid::CreateAppletResource(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { resource = std::make_shared(state, manager); manager.RegisterService(resource, session, response); } void hid::SetSupportedNpadStyleSet(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { struct InputStruct { u32 styleSet; u64 appletUserId; } *input = reinterpret_cast(request.cmdArg); styleSet = *reinterpret_cast(&input->styleSet); state.logger->Write(Logger::Debug, "Controller Support: Pro-Controller: {} Joy-Con: Handheld: {}, Dual: {}, L: {}, R: {} GameCube: {} PokeBall: {} NES: {} NES Handheld: {} SNES: {}", static_cast(styleSet->pro_controller), static_cast(styleSet->joycon_handheld), static_cast(styleSet->joycon_dual), static_cast(styleSet->joycon_left), static_cast (styleSet->joycon_right), static_cast(styleSet->gamecube), static_cast(styleSet->pokeball), static_cast(styleSet->nes), static_cast(styleSet->nes_handheld), static_cast(styleSet->snes)); } void hid::SetSupportedNpadIdType(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { const auto &buffer = request.vecBufX[0]; uint numId = buffer->size / sizeof(NpadId); u64 address = buffer->Address(); for (uint i = 0; i < numId; i++) { auto id = state.thisProcess->ReadMemory(address); deviceMap[id] = JoyConDevice(id); address += sizeof(NpadId); } } void hid::ActivateNpad(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) {} void hid::SetNpadJoyHoldType(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { struct InputStruct { NpadId controllerId; u64 appletUserId; } *input = reinterpret_cast(request.cmdArg); deviceMap[input->controllerId].assignment = JoyConAssignment::Single; } void hid::SetNpadJoyAssignmentModeSingleByDefault(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { struct InputStruct { u64 appletUserId; JoyConOrientation orientation; } *input = reinterpret_cast(request.cmdArg); orientation = input->orientation; } void hid::SetNpadJoyAssignmentModeSingle(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { struct InputStruct { NpadId controllerId; u64 appletUserId; JoyConSide joyDeviceType; } *input = reinterpret_cast(request.cmdArg); deviceMap[input->controllerId].assignment = JoyConAssignment::Single; deviceMap[input->controllerId].side = input->joyDeviceType; } void hid::SetNpadJoyAssignmentModeDual(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { struct InputStruct { NpadId controllerType; u64 appletUserId; } *input = reinterpret_cast(request.cmdArg); deviceMap[input->controllerType].assignment = JoyConAssignment::Dual; } }