diff --git a/include/services/hid.hpp b/include/services/hid.hpp index beadf7f1..70bae750 100644 --- a/include/services/hid.hpp +++ b/include/services/hid.hpp @@ -63,6 +63,8 @@ class HIDService { MAKE_LOG_FUNCTION(log, hidLogger) // Service commands + void disableAccelerometer(u32 messagePointer); + void disableGyroscopeLow(u32 messagePointer); void enableAccelerometer(u32 messagePointer); void enableGyroscopeLow(u32 messagePointer); void getGyroscopeLowCalibrateParam(u32 messagePointer); diff --git a/src/core/services/hid.cpp b/src/core/services/hid.cpp index 7993dc7a..27a078f2 100644 --- a/src/core/services/hid.cpp +++ b/src/core/services/hid.cpp @@ -7,7 +7,9 @@ namespace HIDCommands { enum : u32 { GetIPCHandles = 0x000A0000, EnableAccelerometer = 0x00110000, + DisableAccelerometer = 0x00120000, EnableGyroscopeLow = 0x00130000, + DisableGyroscopeLow = 0x00140000, GetGyroscopeLowRawToDpsCoefficient = 0x00150000, GetGyroscopeLowCalibrateParam = 0x00160000 }; @@ -36,6 +38,8 @@ void HIDService::reset() { void HIDService::handleSyncRequest(u32 messagePointer) { const u32 command = mem.read32(messagePointer); switch (command) { + case HIDCommands::DisableAccelerometer: disableAccelerometer(messagePointer); break; + case HIDCommands::DisableGyroscopeLow: disableGyroscopeLow(messagePointer); break; case HIDCommands::EnableAccelerometer: enableAccelerometer(messagePointer); break; case HIDCommands::EnableGyroscopeLow: enableGyroscopeLow(messagePointer); break; case HIDCommands::GetGyroscopeLowCalibrateParam: getGyroscopeLowCalibrateParam(messagePointer); break; @@ -53,6 +57,14 @@ void HIDService::enableAccelerometer(u32 messagePointer) { mem.write32(messagePointer + 4, Result::Success); } +void HIDService::disableAccelerometer(u32 messagePointer) { + log("HID::DisableAccelerometer\n"); + accelerometerEnabled = false; + + mem.write32(messagePointer, IPC::responseHeader(0x12, 1, 0)); + mem.write32(messagePointer + 4, Result::Success); +} + void HIDService::enableGyroscopeLow(u32 messagePointer) { log("HID::EnableGyroscopeLow\n"); gyroEnabled = true; @@ -61,6 +73,14 @@ void HIDService::enableGyroscopeLow(u32 messagePointer) { mem.write32(messagePointer + 4, Result::Success); } +void HIDService::disableGyroscopeLow(u32 messagePointer) { + log("HID::DisableGyroscopeLow\n"); + gyroEnabled = false; + + mem.write32(messagePointer, IPC::responseHeader(0x14, 1, 0)); + mem.write32(messagePointer + 4, Result::Success); +} + void HIDService::getGyroscopeLowCalibrateParam(u32 messagePointer) { log("HID::GetGyroscopeLowCalibrateParam\n"); constexpr s16 unit = 6700; // Approximately from Citra which took it from hardware