From a3f9ced3aa8627d11801e505f870772b2ab11efd Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Wed, 2 Jul 2025 21:35:29 +0300 Subject: [PATCH] CPP fixes --- src/core/services/ir/circlepad_pro.cpp | 4 +++- src/core/services/ir/ir_user.cpp | 13 ++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/core/services/ir/circlepad_pro.cpp b/src/core/services/ir/circlepad_pro.cpp index c4b379f1..9e652a40 100644 --- a/src/core/services/ir/circlepad_pro.cpp +++ b/src/core/services/ir/circlepad_pro.cpp @@ -13,9 +13,11 @@ void CirclePadPro::receivePayload(Payload payload) { const u8 type = payload[0]; switch (type) { - case CPPRequestID::ConfigurePolling: + case CPPRequestID::ConfigurePolling: { + [[maybe_unused]] const u8 pollingPeriodMs = payload[1]; // TODO break; + } case CPPRequestID::ReadCalibrationData: { static constexpr std::array calibrationData = { diff --git a/src/core/services/ir/ir_user.cpp b/src/core/services/ir/ir_user.cpp index 7bd9055e..0c7b4df3 100644 --- a/src/core/services/ir/ir_user.cpp +++ b/src/core/services/ir/ir_user.cpp @@ -82,10 +82,12 @@ void IRUserService::initializeIrnopShared(u32 messagePointer) { receiveBuffer = std::make_unique(mem, memoryBlock->addr, 0x10, 0x20, receiveBufferPackageCount, receiveBufferSize); + // Initialize the shared memory block to 0s + for (int i = 0; i < sizeof(SharedMemoryStatus); i++) { + mem.write8(memoryBlock->addr + i, 0); + } // Set the initialized byte in shared mem to 1 mem.write8(memoryBlock->addr + offsetof(SharedMemoryStatus, isInitialized), 1); - mem.write64(memoryBlock->addr + 0x10, 0); // Initialize the receive buffer info to all 0s - mem.write64(memoryBlock->addr + 0x18, 0); mem.write32(messagePointer, IPC::responseHeader(0x18, 1, 0)); mem.write32(messagePointer + 4, Result::Success); @@ -166,6 +168,10 @@ void IRUserService::requireConnection(u32 messagePointer) { if (enableCirclePadPro) { cpp.connect(); + // Slight hack: For some reason, CirclePad Pro breaks in some games (eg Majora's Mask 3D) unless we do this + if (receiveEvent) { + kernel.signalEvent(*receiveEvent); + } } mem.write8(sharedMemAddress + offsetof(SharedMemoryStatus, connectionStatus), status); @@ -181,6 +187,8 @@ void IRUserService::requireConnection(u32 messagePointer) { mem.write8(sharedMemAddress + offsetof(SharedMemoryStatus, connectionStatus), 1); mem.write8(sharedMemAddress + offsetof(SharedMemoryStatus, connectionAttemptStatus), 2); } + } else { + Helpers::warn("RequireConnection without shmem"); } mem.write32(messagePointer, IPC::responseHeader(0x6, 1, 0)); @@ -329,7 +337,6 @@ void IRUserService::updateCirclePadPro() { response.cStick.x = rand() & 0xFFF; response.cStick.y = static_cast(CirclePadPro::ButtonState::C_STICK_CENTER); response.buttons.zlNotPressed = 1; - response.buttons.zrNotPressed = rand() & 1; response.buttons.rNotPressed = 1; std::vector responsePayload(sizeof(response));