From 2aa899d83c48bf6c2d62b148f7adb3022a867533 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sun, 7 Jan 2024 17:59:50 +0800 Subject: [PATCH] Gamepad (Linux): support battery level detection of NS Pro controller --- src/detection/gamepad/gamepad_linux.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/detection/gamepad/gamepad_linux.c b/src/detection/gamepad/gamepad_linux.c index ec584aad5..ac823e0fa 100644 --- a/src/detection/gamepad/gamepad_linux.c +++ b/src/detection/gamepad/gamepad_linux.c @@ -32,10 +32,26 @@ static void detectGamepad(FFlist* devices, FFstrbuf* name, FFstrbuf* path) ffStrbufAppendS(path, "/capacity"); // /sys/class/input/jsX/device/device/power_supply/XXX/capacity char capacity[32]; ssize_t nRead = ffReadFileData(path->chars, sizeof(capacity) - 1, capacity); - if (nRead > 0) + if (nRead > 0) // Tested with a PS4 controller { capacity[nRead] = '\0'; device->battery = (uint8_t) strtoul(capacity, NULL, 10); + break; + } + + ffStrbufAppendS(path, "_level"); + nRead = ffReadFileData(path->chars, sizeof(capacity) - 1, capacity); + if (nRead > 0) // Tested with a NS Pro controller + { + // https://github.com/torvalds/linux/blob/52b1853b080a082ec3749c3a9577f6c71b1d4a90/drivers/power/supply/power_supply_sysfs.c#L124 + switch (capacity[0]) + { + case 'C': device->battery = 1; break; // Critical + case 'L': device->battery = 25; break; // Low + case 'N': device->battery = 50; break; // Normal + case 'H': device->battery = 75; break; // High + case 'F': device->battery = 100; break; // Full + } } } }