summaryrefslogtreecommitdiff
path: root/Source/Core/InputCommon/ControllerInterface
diff options
context:
space:
mode:
authorJordan Woyak <jordan.woyak@gmail.com>2019-11-17 10:42:49 -0600
committerJordan Woyak <jordan.woyak@gmail.com>2020-01-13 16:29:24 -0600
commitf0534cabc6da4a090b61b8723ddddee76b36deb3 (patch)
tree3d855d83287365fd26df10905d58fb2350296e9c /Source/Core/InputCommon/ControllerInterface
parent48fd27cdab67061af32f3120534b57d70b23f71e (diff)
ControllerInterface: Exposse DSU client battery level as an input.
Diffstat (limited to 'Source/Core/InputCommon/ControllerInterface')
-rw-r--r--Source/Core/InputCommon/ControllerInterface/Device.h7
-rw-r--r--Source/Core/InputCommon/ControllerInterface/DualShockUDPClient/DualShockUDPClient.cpp29
2 files changed, 36 insertions, 0 deletions
diff --git a/Source/Core/InputCommon/ControllerInterface/Device.h b/Source/Core/InputCommon/ControllerInterface/Device.h
index a2cf0a329a..e07f4fb16a 100644
--- a/Source/Core/InputCommon/ControllerInterface/Device.h
+++ b/Source/Core/InputCommon/ControllerInterface/Device.h
@@ -22,11 +22,18 @@ namespace ciface
// range, used for periodic haptic effects though often ignored by devices
// TODO: Make this configurable.
constexpr int RUMBLE_PERIOD_MS = 10;
+
// This needs to be at least as long as the longest rumble that might ever be played.
// Too short and it's going to stop in the middle of a long effect.
// Infinite values are invalid for ramp effects and probably not sensible.
constexpr int RUMBLE_LENGTH_MS = 1000 * 10;
+// All inputs (other than accel/gyro) return 1.0 as their maximum value.
+// Battery inputs will almost always be mapped to the "Battery" setting which is a percentage.
+// If someone actually wants to map a battery input to a regular control they can divide by 100.
+// I think this is better than requiring multiplication by 100 for the most common usage.
+constexpr ControlState BATTERY_INPUT_MAX_VALUE = 100.0;
+
namespace Core
{
class Device
diff --git a/Source/Core/InputCommon/ControllerInterface/DualShockUDPClient/DualShockUDPClient.cpp b/Source/Core/InputCommon/ControllerInterface/DualShockUDPClient/DualShockUDPClient.cpp
index 913e03db2b..cb695018c3 100644
--- a/Source/Core/InputCommon/ControllerInterface/DualShockUDPClient/DualShockUDPClient.cpp
+++ b/Source/Core/InputCommon/ControllerInterface/DualShockUDPClient/DualShockUDPClient.cpp
@@ -102,6 +102,33 @@ private:
using GyroInput = AccelerometerInput;
+ class BatteryInput final : public Input
+ {
+ using BatteryState = Proto::DsBattery;
+
+ public:
+ BatteryInput(const BatteryState& battery) : m_battery(battery) {}
+
+ std::string GetName() const override { return "Battery"; }
+
+ ControlState GetState() const override
+ {
+ switch (m_battery)
+ {
+ case BatteryState::Charging:
+ case BatteryState::Charged:
+ return BATTERY_INPUT_MAX_VALUE;
+ default:
+ return ControlState(m_battery) / ControlState(BatteryState::Full) * BATTERY_INPUT_MAX_VALUE;
+ }
+ }
+
+ bool IsDetectable() override { return false; }
+
+ private:
+ const BatteryState& m_battery;
+ };
+
public:
void UpdateInput() override;
@@ -355,6 +382,8 @@ Device::Device(Proto::DsModel model, int index) : m_model{model}, m_index{index}
AddInput(new GyroInput("Gyro Roll Left", m_gyro.y, 1));
AddInput(new GyroInput("Gyro Yaw Right", m_gyro.z, -1));
AddInput(new GyroInput("Gyro Yaw Left", m_gyro.z, 1));
+
+ AddInput(new BatteryInput(m_pad_data.battery_status));
}
std::string Device::GetName() const