From 8aa35d209907e9bc0e476d1bdad182953a216928 Mon Sep 17 00:00:00 2001
From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com>
Date: Sun, 20 Aug 2023 14:18:30 +0300
Subject: [PATCH] Implement HID::GetSoundVolume

---
 include/services/hid.hpp  |  1 +
 src/core/services/hid.cpp | 16 +++++++++++++++-
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/include/services/hid.hpp b/include/services/hid.hpp
index e10f78f0..28ba4bd6 100644
--- a/include/services/hid.hpp
+++ b/include/services/hid.hpp
@@ -71,6 +71,7 @@ class HIDService {
 	void getGyroscopeLowCalibrateParam(u32 messagePointer);
 	void getGyroscopeCoefficient(u32 messagePointer);
 	void getIPCHandles(u32 messagePointer);
+	void getSoundVolume(u32 messagePointer);
 
 	// Don't call these prior to initializing shared mem pls
 	template <typename T>
diff --git a/src/core/services/hid.cpp b/src/core/services/hid.cpp
index 0c83487c..ef6cbb41 100644
--- a/src/core/services/hid.cpp
+++ b/src/core/services/hid.cpp
@@ -11,7 +11,8 @@ namespace HIDCommands {
 		EnableGyroscopeLow = 0x00130000,
 		DisableGyroscopeLow = 0x00140000,
 		GetGyroscopeLowRawToDpsCoefficient = 0x00150000,
-		GetGyroscopeLowCalibrateParam = 0x00160000
+		GetGyroscopeLowCalibrateParam = 0x00160000,
+		GetSoundVolume = 0x00170000,
 	};
 }
 
@@ -46,6 +47,7 @@ void HIDService::handleSyncRequest(u32 messagePointer) {
 		case HIDCommands::GetGyroscopeLowCalibrateParam: getGyroscopeLowCalibrateParam(messagePointer); break;
 		case HIDCommands::GetGyroscopeLowRawToDpsCoefficient: getGyroscopeCoefficient(messagePointer); break;
 		case HIDCommands::GetIPCHandles: getIPCHandles(messagePointer); break;
+		case HIDCommands::GetSoundVolume: getSoundVolume(messagePointer); break;
 		default: Helpers::panic("HID service requested. Command: %08X\n", command);
 	}
 }
@@ -107,6 +109,18 @@ void HIDService::getGyroscopeCoefficient(u32 messagePointer) {
 	mem.write32(messagePointer + 8, Helpers::bit_cast<u32, float>(gyroscopeCoeff));
 }
 
+// The volume here is in the range [0, 0x3F]
+// It is read directly from I2C Device 3 register 0x09
+// Since we currently do not have audio, set the volume a bit below max (0x30)
+void HIDService::getSoundVolume(u32 messagePointer) {
+	log("HID::GetSoundVolume\n");
+	constexpr u8 volume = 0x30;
+
+	mem.write32(messagePointer, IPC::responseHeader(0x17, 2, 0));
+	mem.write32(messagePointer + 4, Result::Success);
+	mem.write8(messagePointer + 8, volume);
+}
+
 void HIDService::getIPCHandles(u32 messagePointer) {
 	log("HID::GetIPCHandles\n");