[upower/f20] fully charged battery reported as 0% charged (#1025980)

Rex Dieter rdieter at fedoraproject.org
Sun Dec 8 02:59:08 UTC 2013


commit a10a270876e1f2b367f88eaac9041ead90a1044e
Author: Rex Dieter <rdieter at math.unl.edu>
Date:   Sat Dec 7 20:59:05 2013 -0600

    fully charged battery reported as 0% charged (#1025980)

 ...x-Clamp-percentage-for-overfull-batteries.patch |   77 ++++++++++++++++++++
 upower.spec                                        |   11 +++-
 2 files changed, 87 insertions(+), 1 deletions(-)
---
diff --git a/0004-linux-Clamp-percentage-for-overfull-batteries.patch b/0004-linux-Clamp-percentage-for-overfull-batteries.patch
new file mode 100644
index 0000000..76c0680
--- /dev/null
+++ b/0004-linux-Clamp-percentage-for-overfull-batteries.patch
@@ -0,0 +1,77 @@
+From b8fe9902f3c6c50ca6a23e24fcea99582beebc65 Mon Sep 17 00:00:00 2001
+From: Martin Pitt <martinpitt at gnome.org>
+Date: Tue, 22 Oct 2013 10:02:51 +0200
+Subject: [PATCH 4/4] linux: Clamp percentage for overfull batteries
+
+Some batteries report energy > energy_full and a percentage ("capacity"
+attribute) > 100%. Clamp these within 0 and 100% for both plausibility as well
+as to avoid setting an out-of-range property which would then become 0%.
+
+https://launchpad.net/bugs/1240673
+---
+ src/linux/integration-test   | 33 +++++++++++++++++++++++++++++++++
+ src/linux/up-device-supply.c |  4 ++++
+ 2 files changed, 37 insertions(+)
+
+diff --git a/src/linux/integration-test b/src/linux/integration-test
+index 8489bf3..4be1922 100755
+--- a/src/linux/integration-test
++++ b/src/linux/integration-test
+@@ -442,6 +442,39 @@ class Tests(unittest.TestCase):
+         self.assertEqual(self.get_dbus_property('OnLowBattery'), False)
+         self.stop_daemon()
+ 
++    def test_battery_overfull(self):
++        '''battery which reports a > 100% percentage for a full battery'''
++
++        self.testbed.add_device('power_supply', 'BAT0', None,
++                                ['type', 'Battery',
++                                 'present', '1',
++                                 'status', 'Full',
++                                 'current_now', '1000',
++                                 'charge_now', '11000000',
++                                 'charge_full', '10000000',
++                                 'charge_full_design', '11000000',
++                                 'capacity', '110',
++                                 'voltage_now', '12000000'], [])
++
++        self.start_daemon()
++        devs = self.proxy.EnumerateDevices()
++        self.assertEqual(len(devs), 1)
++        bat0_up = devs[0]
++
++        # should clamp percentage
++        self.assertEqual(self.get_dbus_dev_property(bat0_up, 'Percentage'), 100.0)
++        self.assertEqual(self.get_dbus_dev_property(bat0_up, 'IsPresent'), True)
++        self.assertEqual(self.get_dbus_dev_property(bat0_up, 'State'),
++                         UP_DEVICE_STATE_FULLY_CHARGED)
++        self.assertEqual(self.get_dbus_dev_property(bat0_up, 'Energy'), 132.0)
++        # should adjust EnergyFull to reality, not what the battery claims
++        self.assertEqual(self.get_dbus_dev_property(bat0_up, 'EnergyFull'), 132.0)
++        self.assertEqual(self.get_dbus_dev_property(bat0_up, 'EnergyFullDesign'), 132.0)
++        self.assertEqual(self.get_dbus_dev_property(bat0_up, 'Voltage'), 12.0)
++        self.assertEqual(self.get_dbus_dev_property(bat0_up, 'PowerSupply'), True)
++        self.assertEqual(self.get_dbus_dev_property(bat0_up, 'Type'), 2)
++        self.stop_daemon()
++
+     def test_battery_temperature(self):
+         '''battery which reports temperature'''
+ 
+diff --git a/src/linux/up-device-supply.c b/src/linux/up-device-supply.c
+index 8020277..b953d65 100644
+--- a/src/linux/up-device-supply.c
++++ b/src/linux/up-device-supply.c
+@@ -708,6 +708,10 @@ up_device_supply_refresh_battery (UpDeviceSupply *supply)
+ 	/* get a precise percentage */
+         if (sysfs_file_exists (native_path, "capacity")) {
+ 		percentage = sysfs_get_double (native_path, "capacity");
++		if (percentage < 0.0f)
++			percentage = 0.0f;
++		if (percentage > 100.0f)
++			percentage = 100.0f;
+                 /* for devices which provide capacity, but not {energy,charge}_now */
+                 if (energy < 0.1f && energy_full > 0.0f)
+                     energy = energy_full * percentage / 100;
+-- 
+1.8.4.2
+
diff --git a/upower.spec b/upower.spec
index 74f6eee..7d8b9c5 100644
--- a/upower.spec
+++ b/upower.spec
@@ -1,11 +1,15 @@
 Summary:        Power Management Service
 Name:           upower
 Version:        0.9.23
-Release:        1%{?dist}
+Release:        2%{?dist}
 License:        GPLv2+
 Group:          System Environment/Libraries
 URL:            http://upower.freedesktop.org/
 Source0:        http://upower.freedesktop.org/releases/upower-%{version}.tar.xz
+
+# upstream patches
+Patch1: 0004-linux-Clamp-percentage-for-overfull-batteries.patch
+
 BuildRequires:  sqlite-devel
 BuildRequires:  libtool
 BuildRequires:  intltool
@@ -41,6 +45,8 @@ Headers and libraries for UPower.
 %prep
 %setup -q
 
+%patch1 -p1 -b .linux-Clamp-percentage-for-overfull-batteries
+
 %build
 %configure \
         --enable-gtk-doc \
@@ -101,6 +107,9 @@ rm -f $RPM_BUILD_ROOT%{_libdir}/*.la
 %{_includedir}/libupower-glib/upower.h
 
 %changelog
+* Sat Dec 07 2013 Rex Dieter <rdieter at fedoraproject.org> 0.9.23-2
+- fully charged battery reported as 0% charged (#1025980)
+
 * Fri Oct 18 2013 Richard Hughes <rhughes at redhat.com> - 0.9.23-1
 - New upstream release
 - Add missing dbus-glib-1 to private requires


More information about the scm-commits mailing list