Re: [hackers] [PATCH slstatus] Support energy_now/power_now in battery_remaining

2018-05-20 Thread Aaron Marcher

David,

thanks for the patch. I applied it.

Cheers!
Aaron

--
Web: https://drkhsh.at/ or http://drkhsh5rv6pnahas.onion/
Gopher: gopher://drkhsh.at or gopher://drkhsh5rv6pnahas.onion
GPG: 0x7A65E38D55BE96FE
Fingerprint: 4688 907C 8720 3318 0D9F AFDE 7A65 E38D 55BE 96FE



[hackers] [PATCH slstatus] Support energy_now/power_now in battery_remaining

2018-05-20 Thread David Demelier
On some laptops (mostly thinkpads), the remaining time may be
expressed in µWh using energy_now and power_now files rather than µAh
for charge_now and current_now.

Add pick function to conditionally select appropriate one.
---
 components/battery.c | 41 +++--
 1 file changed, 27 insertions(+), 14 deletions(-)

diff --git a/components/battery.c b/components/battery.c
index 5031608..5d7a385 100644
--- a/components/battery.c
+++ b/components/battery.c
@@ -7,6 +7,26 @@
 
 #if defined(__linux__)
#include 
+   #include 
+
+   #define CHARGE_NOW"/sys/class/power_supply/%s/charge_now"
+   #define ENERGY_NOW"/sys/class/power_supply/%s/energy_now"
+   #define CURRENT_NOW   "/sys/class/power_supply/%s/current_now"
+   #define POWER_NOW "/sys/class/power_supply/%s/power_now"
+
+   static const char *
+   pick(const char *bat, const char *f1, const char *f2, char *path, 
size_t length)
+   {
+   if (esnprintf(path, length, f1, bat) > 0 && access(path, R_OK) 
== 0) {
+   return f1;
+   }
+
+   if (esnprintf(path, length, f2, bat) > 0 && access(path, R_OK) 
== 0) {
+   return f2;
+   }
+
+   return NULL;
+   }
 
const char *
battery_perc(const char *bat)
@@ -72,21 +92,14 @@
return NULL;
}
 
+   if (pick(bat, CHARGE_NOW, ENERGY_NOW, path, sizeof (path)) == 
NULL ||
+   pscanf(path, "%d", _now) < 0) {
+   return NULL;
+   }
+
if (!strcmp(state, "Discharging")) {
-   if (esnprintf(path, sizeof(path),
-  "/sys/class/power_supply/%s/charge_now",
- bat) < 0) {
-   return NULL;
-   }
-   if (pscanf(path, "%d", _now) != 1) {
-   return NULL;
-   }
-   if (esnprintf(path, sizeof(path),
- "/sys/class/power_supply/%s/current_now",
- bat) < 0) {
-   return NULL;
-   }
-   if (pscanf(path, "%d", _now) != 1) {
+   if (pick(bat, CURRENT_NOW, POWER_NOW, path, sizeof 
(path)) == NULL ||
+   pscanf(path, "%d", _now) < 0) {
return NULL;
}
 
-- 
2.17.0