Fix pending-charge state on some laptops

Resolves: rhbz#2130664
This commit is contained in:
Bastien Nocera 2022-12-19 11:12:08 +01:00
parent b48763588e
commit 693a42fd5f
2 changed files with 346 additions and 1 deletions

338
pending-charge.patch Normal file
View File

@ -0,0 +1,338 @@
From 91e9ccf69394d3c005f0386e92c8a84c158aa0c7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Paulo=20Rechi=20Vita?= <jprvita@endlessm.com>
Date: Thu, 1 Nov 2018 14:45:28 -0700
Subject: [PATCH 1/7] daemon: Make comment more succinct
This will help make it more clear when adding an extra state on the
following commit. It also makes the language consistent between the
different lines. There are no changes on the meaning of these lines nor
any functional changes on this commit.
---
src/up-daemon.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/up-daemon.c b/src/up-daemon.c
index 1a5dddc..95fff6b 100644
--- a/src/up-daemon.c
+++ b/src/up-daemon.c
@@ -209,9 +209,9 @@ up_daemon_update_display_battery (UpDaemon *daemon)
power_supply == FALSE)
continue;
- /* If one battery is charging, then the composite is charging
- * If all batteries are discharging, then the composite is discharging
- * If all batteries are fully charged, then they're all fully charged
+ /* If one battery is charging, the composite is charging
+ * If all batteries are discharging, the composite is discharging
+ * If all batteries are fully charged, the composite is fully charged
* Everything else is unknown */
if (state == UP_DEVICE_STATE_CHARGING)
state_total = UP_DEVICE_STATE_CHARGING;
--
2.38.1
From dc2de4e321c34e62a784ac6d9971f7defbf4984f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Paulo=20Rechi=20Vita?= <jprvita@endlessm.com>
Date: Mon, 15 Oct 2018 17:05:27 -0700
Subject: [PATCH 2/7] daemon: Consider pending-charge when calculating the
display state
Without this change if all batteries in the system are in the
pending-charge state, the display device state is set to unknown, and
its icon to battery-missing-symbolic.
This change makes the pending-charge state be considered when
calculating the DisplayDevice state, setting it to pending-charge if at
least one battery in the system is pending-charge and no other is
charging or discharging.
Closes: #81
Closes: #19
---
src/up-daemon.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/up-daemon.c b/src/up-daemon.c
index 95fff6b..690f379 100644
--- a/src/up-daemon.c
+++ b/src/up-daemon.c
@@ -210,14 +210,18 @@ up_daemon_update_display_battery (UpDaemon *daemon)
continue;
/* If one battery is charging, the composite is charging
- * If all batteries are discharging, the composite is discharging
+ * If all batteries are discharging or pending-charge, the composite is discharging
* If all batteries are fully charged, the composite is fully charged
+ * If one battery is pending-charge and no other is charging or discharging, then the composite is pending-charge
* Everything else is unknown */
if (state == UP_DEVICE_STATE_CHARGING)
state_total = UP_DEVICE_STATE_CHARGING;
else if (state == UP_DEVICE_STATE_DISCHARGING &&
state_total != UP_DEVICE_STATE_CHARGING)
state_total = UP_DEVICE_STATE_DISCHARGING;
+ else if (state == UP_DEVICE_STATE_PENDING_CHARGE &&
+ (state_total == UP_DEVICE_STATE_UNKNOWN || state_total == UP_DEVICE_STATE_PENDING_CHARGE))
+ state_total = UP_DEVICE_STATE_PENDING_CHARGE;
else if (state == UP_DEVICE_STATE_FULLY_CHARGED &&
state_total == UP_DEVICE_STATE_UNKNOWN)
state_total = UP_DEVICE_STATE_FULLY_CHARGED;
--
2.38.1
From 4420273ca55a6f6e97dd5075bca63e8a012c8794 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Paulo=20Rechi=20Vita?= <jprvita@endlessm.com>
Date: Fri, 2 Nov 2018 09:49:33 -0700
Subject: [PATCH 3/7] integration-test: Define PENDING_CHARGE and
PENDING_DISCHARGE states
Add definitions for UP_DEVICE_STATE_PENDING_CHARGE and
UP_DEVICE_STATE_PENDING_DISCHARGE.
---
src/linux/integration-test | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/linux/integration-test b/src/linux/integration-test
index 81064dd..fbd95da 100755
--- a/src/linux/integration-test
+++ b/src/linux/integration-test
@@ -60,7 +60,9 @@ BATTERY_IFACE = 'org.bluez.Battery1'
UP_DEVICE_STATE_CHARGING,
UP_DEVICE_STATE_DISCHARGING,
UP_DEVICE_STATE_EMPTY,
- UP_DEVICE_STATE_FULLY_CHARGED) = (0, 1, 2, 3, 4)
+ UP_DEVICE_STATE_FULLY_CHARGED,
+ UP_DEVICE_STATE_PENDING_CHARGE,
+ UP_DEVICE_STATE_PENDING_DISCHARGE) = (0, 1, 2, 3, 4, 5, 6)
(UP_DEVICE_LEVEL_UNKNOWN,
UP_DEVICE_LEVEL_NONE,
--
2.38.1
From ec968accf4038a48a1bc8a1a8c177a7550739233 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Paulo=20Rechi=20Vita?= <jprvita@endlessm.com>
Date: Fri, 2 Nov 2018 09:55:22 -0700
Subject: [PATCH 4/7] integration-test: Test DisplayDevice pending-charge
Test relaying the pending-charge state to the DisplayDevice. This commit
adds three tests: only one battery pending-charge, one battery
pending-charge and another one discharging, and one battery
pending-charge and another one charging.
---
src/linux/integration-test | 72 ++++++++++++++++++++++++++++++++++++++
1 file changed, 72 insertions(+)
diff --git a/src/linux/integration-test b/src/linux/integration-test
index fbd95da..ad6dade 100755
--- a/src/linux/integration-test
+++ b/src/linux/integration-test
@@ -491,6 +491,78 @@ class Tests(dbusmock.DBusTestCase):
self.assertEqual(self.get_dbus_display_property('WarningLevel'), UP_DEVICE_LEVEL_NONE)
self.stop_daemon()
+ def test_display_pending_charge_one_battery(self):
+ '''One battery pending-charge'''
+
+ self.testbed.add_device('power_supply', 'BAT0', None,
+ ['type', 'Battery',
+ 'present', '1',
+ 'status', 'Not charging',
+ 'charge_full', '10500000',
+ 'charge_full_design', '11000000',
+ 'capacity', '40',
+ 'voltage_now', '12000000'], [])
+
+ self.start_daemon()
+ devs = self.proxy.EnumerateDevices()
+ self.assertEqual(len(devs), 1)
+ self.assertEqual(self.get_dbus_display_property('State'), UP_DEVICE_STATE_PENDING_CHARGE)
+ self.stop_daemon()
+
+ def test_display_pending_charge_other_battery_discharging(self):
+ '''One battery pending-charge and another one discharging'''
+
+ self.testbed.add_device('power_supply', 'BAT0', None,
+ ['type', 'Battery',
+ 'present', '1',
+ 'status', 'Not charging',
+ 'charge_full', '10500000',
+ 'charge_full_design', '11000000',
+ 'capacity', '40',
+ 'voltage_now', '12000000'], [])
+ self.testbed.add_device('power_supply', 'BAT1', None,
+ ['type', 'Battery',
+ 'present', '1',
+ 'status', 'Discharging',
+ 'charge_full', '10500000',
+ 'charge_full_design', '11000000',
+ 'capacity', '40',
+ 'voltage_now', '12000000'], [])
+
+
+ self.start_daemon()
+ devs = self.proxy.EnumerateDevices()
+ self.assertEqual(len(devs), 2)
+ self.assertEqual(self.get_dbus_display_property('State'), UP_DEVICE_STATE_DISCHARGING)
+ self.stop_daemon()
+
+ def test_display_pending_charge_other_battery_charging(self):
+ '''One battery pending-charge and another one charging'''
+
+ self.testbed.add_device('power_supply', 'BAT0', None,
+ ['type', 'Battery',
+ 'present', '1',
+ 'status', 'Not charging',
+ 'charge_full', '10500000',
+ 'charge_full_design', '11000000',
+ 'capacity', '40',
+ 'voltage_now', '12000000'], [])
+ self.testbed.add_device('power_supply', 'BAT1', None,
+ ['type', 'Battery',
+ 'present', '1',
+ 'status', 'Charging',
+ 'charge_full', '10500000',
+ 'charge_full_design', '11000000',
+ 'capacity', '40',
+ 'voltage_now', '12000000'], [])
+
+
+ self.start_daemon()
+ devs = self.proxy.EnumerateDevices()
+ self.assertEqual(len(devs), 2)
+ self.assertEqual(self.get_dbus_display_property('State'), UP_DEVICE_STATE_CHARGING)
+ self.stop_daemon()
+
def test_battery_charge(self):
'''battery which reports charge instead of energy
--
2.38.1
From 9318e73c8cd55522829970a74dc9d6ca59e4f828 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Paulo=20Rechi=20Vita?= <jprvita@endlessm.com>
Date: Fri, 2 Nov 2018 16:05:21 -0700
Subject: [PATCH 5/7] linux: Don't set out_state before state is final
Currently up_device_supply_refresh_battery sets out_state before the
state value is definitive, so the wrong state value is returned to the
caller. Luckily the only caller does not make use of this value at the
moment, so there are no user-visible consequences. Nonetheless this is a
bug, so this commit fixes it.
---
src/linux/up-device-supply.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/linux/up-device-supply.c b/src/linux/up-device-supply.c
index 11a14e1..993cf12 100644
--- a/src/linux/up-device-supply.c
+++ b/src/linux/up-device-supply.c
@@ -664,7 +664,6 @@ up_device_supply_refresh_battery (UpDeviceSupply *supply,
}
state = up_device_supply_get_state (native_path);
- *out_state = state;
/* reset unknown counter */
if (state != UP_DEVICE_STATE_UNKNOWN) {
@@ -834,6 +833,8 @@ up_device_supply_refresh_battery (UpDeviceSupply *supply,
supply->priv->energy_old_first = 0;
}
+ *out_state = state;
+
g_object_set (device,
"energy", energy,
"energy-full", energy_full,
--
2.38.1
From ebea310f15cb61a3f5558800a45951d3c885201d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Paulo=20Rechi=20Vita?= <jprvita@endlessm.com>
Date: Mon, 26 Nov 2018 13:12:18 -0800
Subject: [PATCH 6/7] linux: Map pending-charge to fully-charged when charge is
100%
Some devices report "Not charging" when the battery is full and AC power
is connected. In this situation we should report fully-charged instead
of pending-charge.
Closes: #86.
---
src/linux/up-device-supply.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/linux/up-device-supply.c b/src/linux/up-device-supply.c
index 993cf12..42971da 100644
--- a/src/linux/up-device-supply.c
+++ b/src/linux/up-device-supply.c
@@ -733,6 +733,12 @@ up_device_supply_refresh_battery (UpDeviceSupply *supply,
percentage = CLAMP(percentage, 0.0f, 100.0f);
}
+ /* Some devices report "Not charging" when the battery is full and AC
+ * power is connected. In this situation we should report fully-charged
+ * instead of pending-charge. */
+ if (state == UP_DEVICE_STATE_PENDING_CHARGE && percentage == 100.0)
+ state = UP_DEVICE_STATE_FULLY_CHARGED;
+
/* the battery isn't charging or discharging, it's just
* sitting there half full doing nothing: try to guess a state */
if (state == UP_DEVICE_STATE_UNKNOWN && supply->priv->is_power_supply) {
--
2.38.1
From b327348ac160b57430ba4d2662835513ea35c08c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Paulo=20Rechi=20Vita?= <jprvita@endlessm.com>
Date: Mon, 26 Nov 2018 13:13:00 -0800
Subject: [PATCH 7/7] integration-test: Test mapping pending-charge to
fully-charged
---
src/linux/integration-test | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/src/linux/integration-test b/src/linux/integration-test
index ad6dade..c6fb5c0 100755
--- a/src/linux/integration-test
+++ b/src/linux/integration-test
@@ -563,6 +563,31 @@ class Tests(dbusmock.DBusTestCase):
self.assertEqual(self.get_dbus_display_property('State'), UP_DEVICE_STATE_CHARGING)
self.stop_daemon()
+ def test_map_pending_charge_to_fully_charged(self):
+ '''Map pending-charge to fully-charged'''
+
+ bat0 = self.testbed.add_device('power_supply', 'BAT0', None,
+ ['type', 'Battery',
+ 'present', '1',
+ 'status', 'Not charging',
+ 'charge_full', '10500000',
+ 'charge_full_design', '11000000',
+ 'capacity', '100',
+ 'voltage_now', '12000000'], [])
+
+ self.start_daemon()
+ devs = self.proxy.EnumerateDevices()
+ self.assertEqual(len(devs), 1)
+ bat0_up = devs[0]
+ self.assertEqual(self.get_dbus_dev_property(bat0_up, 'State'), UP_DEVICE_STATE_FULLY_CHARGED)
+ self.stop_daemon()
+
+ # and make sure we still return pending-charge below 100%
+ self.testbed.set_attribute(bat0, 'capacity', '99')
+ self.start_daemon()
+ self.assertEqual(self.get_dbus_dev_property(bat0_up, 'State'), UP_DEVICE_STATE_PENDING_CHARGE)
+ self.stop_daemon()
+
def test_battery_charge(self):
'''battery which reports charge instead of energy
--
2.38.1

View File

@ -1,7 +1,7 @@
Summary: Power Management Service
Name: upower
Version: 0.99.7
Release: 3%{?dist}
Release: 4%{?dist}
License: GPLv2+
Group: System Environment/Libraries
URL: http://upower.freedesktop.org/
@ -23,6 +23,9 @@ BuildRequires: systemd
Requires: udev
Requires: gobject-introspection
# 0.99.10 backport
Patch0: pending-charge.patch
%if 0%{?fedora}
# From rhughes-f20-gnome-3-12 copr
Obsoletes: compat-upower09 < 0.99
@ -107,6 +110,10 @@ rm -f $RPM_BUILD_ROOT%{_libdir}/*.la
%{_datadir}/gtk-doc/html/UPower/*
%changelog
* Mon Dec 19 2022 Bastien Nocera <bnocera@redhat.com> - 0.99.7-4
- Fix pending-charge state on some laptops
Resolves: rhbz#2130664
* Fri Feb 09 2018 Fedora Release Engineering <releng@fedoraproject.org> - 0.99.7-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild