summaryrefslogtreecommitdiffstats
path: root/source/a/upower/patches/linux-Clamp-percentage-for-overfull-batteries.patch
blob: bb97ca78268cc67c3d66b4b1efd4d6deacad6961 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
From b8fe9902f3c6c50ca6a23e24fcea99582beebc65 Mon Sep 17 00:00:00 2001
From: Martin Pitt <martinpitt@gnome.org>
Date: Tue, 22 Oct 2013 10:02:51 +0200
Subject: [PATCH 2/3] 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;
-- 
2.6.4