]> git.sur5r.net Git - i3/i3status/commitdiff
Treat zero battery capacity as "not available" (#259)
authorjohcgt <35880934+johcgt@users.noreply.github.com>
Sun, 28 Jan 2018 14:37:51 +0000 (14:37 +0000)
committerMichael Stapelberg <stapelberg@users.noreply.github.com>
Sun, 28 Jan 2018 14:37:51 +0000 (15:37 +0100)
`print_battery_info` computes `batt_info.percentage_remaining` by
dividing batt_info.remaining by `full`. If `full` is `0` then the
battery remaining will be reported as "inf".

Before this, it tries to set `full` to either the design capacity or to
the last known good charge. It determines if these values are available
by checking whether their fields in `batt_info` are non-negative. As it
initialized `batt_info` with values of `-1`, a non-negative value
implies that something has provided a value.

`slurp_all_batteries` and `add_battery_info` however initialize these
fields to zero, so if these functions are called then
`batt_info.full_design` will always be used.

This means that on systems that don't provide a value for design
capacity the percentage remaining will be reported as "inf", unless the
user has set `last_full_capacity` to `true` in their `i3status.conf`.

This patch changes `print_battery_info` to expect values for the battery
capacity to be strictly greater than zero. This seems reasonable as a
battery with a capacity of zero isn't useful.

An alternative solution would be to change `slurp_all_batteries` and
`add_battery_info` to initialize `batt_info` with `-1`, as
`print_battery_info` does. This is less appealing as `add_battery_info`
is accumulating the values, so using `-1` would introduce off-by-one
errors without additional code to avoid them.

src/print_battery_info.c
testcases/018-battery-capacity/1/uevent [new file with mode: 0644]
testcases/018-battery-capacity/expected_output.txt [new file with mode: 0644]
testcases/018-battery-capacity/i3status.conf [new file with mode: 0644]
testcases/019-battery-capacity/1/uevent [new file with mode: 0644]
testcases/019-battery-capacity/expected_output.txt [new file with mode: 0644]
testcases/019-battery-capacity/i3status.conf [new file with mode: 0644]

index e22ca3ebae19c160fd0f07f71dde7597d776e69a..7a462f7fcf29dd0148d19f3a3189e09f24b5bc48 100644 (file)
@@ -513,13 +513,13 @@ void print_battery_info(yajl_gen json_gen, char *buffer, int number, const char
     // We prefer the design capacity, but use the last capacity if we don't have it,
     // or if we are asked to (last_full_capacity == true); but similarly we use
     // the design capacity if we don't have the last capacity.
-    // If we don't have either then both full_design and full_last < 0,
-    // which implies full < 0, which bails out on the following line.
+    // If we don't have either then both full_design and full_last <= 0,
+    // which implies full <= 0, which bails out on the following line.
     int full = batt_info.full_design;
-    if (full < 0 || (last_full_capacity && batt_info.full_last >= 0)) {
+    if (full <= 0 || (last_full_capacity && batt_info.full_last > 0)) {
         full = batt_info.full_last;
     }
-    if (full < 0 && batt_info.remaining < 0 && batt_info.percentage_remaining < 0) {
+    if (full <= 0 && batt_info.remaining < 0 && batt_info.percentage_remaining < 0) {
         /* We have no physical measurements and no estimates. Nothing
          * much we can report, then. */
         OUTPUT_FULL_TEXT(format_down);
diff --git a/testcases/018-battery-capacity/1/uevent b/testcases/018-battery-capacity/1/uevent
new file mode 100644 (file)
index 0000000..00b1148
--- /dev/null
@@ -0,0 +1,2 @@
+POWER_SUPPLY_CHARGE_FULL=100
+POWER_SUPPLY_CHARGE_NOW=50
diff --git a/testcases/018-battery-capacity/expected_output.txt b/testcases/018-battery-capacity/expected_output.txt
new file mode 100644 (file)
index 0000000..ab07d0a
--- /dev/null
@@ -0,0 +1 @@
+50.00%
diff --git a/testcases/018-battery-capacity/i3status.conf b/testcases/018-battery-capacity/i3status.conf
new file mode 100644 (file)
index 0000000..7a3443c
--- /dev/null
@@ -0,0 +1,10 @@
+general {
+        output_format = "none"
+}
+
+order += "battery all"
+
+battery all {
+        format = "%percentage"
+        path = "testcases/018-battery-capacity/%d/uevent"
+}
diff --git a/testcases/019-battery-capacity/1/uevent b/testcases/019-battery-capacity/1/uevent
new file mode 100644 (file)
index 0000000..d004bf1
--- /dev/null
@@ -0,0 +1,2 @@
+POWER_SUPPLY_CHARGE_FULL_DESIGN=100
+POWER_SUPPLY_CHARGE_NOW=50
diff --git a/testcases/019-battery-capacity/expected_output.txt b/testcases/019-battery-capacity/expected_output.txt
new file mode 100644 (file)
index 0000000..ab07d0a
--- /dev/null
@@ -0,0 +1 @@
+50.00%
diff --git a/testcases/019-battery-capacity/i3status.conf b/testcases/019-battery-capacity/i3status.conf
new file mode 100644 (file)
index 0000000..8152d44
--- /dev/null
@@ -0,0 +1,11 @@
+general {
+        output_format = "none"
+}
+
+order += "battery all"
+
+battery all {
+        format = "%percentage"
+        path = "testcases/019-battery-capacity/%d/uevent"
+        last_full_capacity = true
+}