From 36144a56905046d0dee1fd369f9eb4e130e18c35 Mon Sep 17 00:00:00 2001
From: Narr the Reg <juangerman-13@hotmail.com>
Date: Mon, 17 Jan 2022 10:44:13 -0600
Subject: [PATCH] input_common: Report battery for UDP controllers

---
 src/input_common/drivers/udp_client.cpp | 21 +++++++++++++++++++++
 src/input_common/drivers/udp_client.h   |  4 ++++
 2 files changed, 25 insertions(+)

diff --git a/src/input_common/drivers/udp_client.cpp b/src/input_common/drivers/udp_client.cpp
index c8a12c7d53..9aaeb91be8 100644
--- a/src/input_common/drivers/udp_client.cpp
+++ b/src/input_common/drivers/udp_client.cpp
@@ -192,6 +192,25 @@ std::size_t UDPClient::GetClientNumber(std::string_view host, u16 port) const {
     return MAX_UDP_CLIENTS;
 }
 
+BatteryLevel UDPClient::GetBatteryLevel(Response::Battery battery) const {
+    switch (battery) {
+    case Response::Battery::Dying:
+        return BatteryLevel::Empty;
+    case Response::Battery::Low:
+        return BatteryLevel::Critical;
+    case Response::Battery::Medium:
+        return BatteryLevel::Low;
+    case Response::Battery::High:
+        return BatteryLevel::Medium;
+    case Response::Battery::Full:
+    case Response::Battery::Charged:
+        return BatteryLevel::Full;
+    case Response::Battery::Charging:
+    default:
+        return BatteryLevel::Charging;
+    }
+}
+
 void UDPClient::OnVersion([[maybe_unused]] Response::Version data) {
     LOG_TRACE(Input, "Version packet received: {}", data.version);
 }
@@ -299,6 +318,8 @@ void UDPClient::OnPadData(Response::PadData data, std::size_t client) {
         const int button = static_cast<int>(buttons[i]);
         SetButton(identifier, button, button_status);
     }
+
+    SetBattery(identifier, GetBatteryLevel(data.info.battery));
 }
 
 void UDPClient::StartCommunication(std::size_t client, const std::string& host, u16 port) {
diff --git a/src/input_common/drivers/udp_client.h b/src/input_common/drivers/udp_client.h
index 1adc947c45..61a1fff376 100644
--- a/src/input_common/drivers/udp_client.h
+++ b/src/input_common/drivers/udp_client.h
@@ -15,6 +15,7 @@ namespace InputCommon::CemuhookUDP {
 class Socket;
 
 namespace Response {
+enum class Battery : u8;
 struct PadData;
 struct PortInfo;
 struct TouchPad;
@@ -137,6 +138,9 @@ private:
     // Translates configuration to client number
     std::size_t GetClientNumber(std::string_view host, u16 port) const;
 
+    // Translates UDP battery level to input engine battery level
+    BatteryLevel GetBatteryLevel(Response::Battery battery) const;
+
     void OnVersion(Response::Version);
     void OnPortInfo(Response::PortInfo);
     void OnPadData(Response::PadData, std::size_t client);