]>
Commit | Line | Data |
---|---|---|
4c5b8e51 JP |
1 | From 22da1a0bc5943b683189418d8b0f766e91b2bdbe Mon Sep 17 00:00:00 2001 |
2 | From: Martin Pitt <martinpitt@gnome.org> | |
3 | Date: Tue, 22 Oct 2013 08:02:51 +0000 | |
4 | Subject: linux: Clamp percentage for overfull batteries | |
5 | ||
6 | Some batteries report energy > energy_full and a percentage ("capacity" | |
7 | attribute) > 100%. Clamp these within 0 and 100% for both plausibility as well | |
8 | as to avoid setting an out-of-range property which would then become 0%. | |
9 | ||
10 | https://launchpad.net/bugs/1240673 | |
11 | --- | |
12 | diff --git a/src/linux/integration-test b/src/linux/integration-test | |
13 | index 6adc5c4..b7f11a9 100755 | |
14 | --- a/src/linux/integration-test | |
15 | +++ b/src/linux/integration-test | |
16 | @@ -458,6 +458,39 @@ class Tests(unittest.TestCase): | |
d5f8ed79 | 17 | self.assertEqual(self.get_dbus_property('OnLowBattery'), False) |
4c5b8e51 JP |
18 | self.stop_daemon() |
19 | ||
20 | + def test_battery_overfull(self): | |
21 | + '''battery which reports a > 100% percentage for a full battery''' | |
22 | + | |
23 | + self.testbed.add_device('power_supply', 'BAT0', None, | |
24 | + ['type', 'Battery', | |
25 | + 'present', '1', | |
26 | + 'status', 'Full', | |
27 | + 'current_now', '1000', | |
28 | + 'charge_now', '11000000', | |
29 | + 'charge_full', '10000000', | |
30 | + 'charge_full_design', '11000000', | |
31 | + 'capacity', '110', | |
32 | + 'voltage_now', '12000000'], []) | |
33 | + | |
34 | + self.start_daemon() | |
35 | + devs = self.proxy.EnumerateDevices() | |
36 | + self.assertEqual(len(devs), 1) | |
37 | + bat0_up = devs[0] | |
38 | + | |
39 | + # should clamp percentage | |
40 | + self.assertEqual(self.get_dbus_dev_property(bat0_up, 'Percentage'), 100.0) | |
41 | + self.assertEqual(self.get_dbus_dev_property(bat0_up, 'IsPresent'), True) | |
42 | + self.assertEqual(self.get_dbus_dev_property(bat0_up, 'State'), | |
43 | + UP_DEVICE_STATE_FULLY_CHARGED) | |
44 | + self.assertEqual(self.get_dbus_dev_property(bat0_up, 'Energy'), 132.0) | |
45 | + # should adjust EnergyFull to reality, not what the battery claims | |
46 | + self.assertEqual(self.get_dbus_dev_property(bat0_up, 'EnergyFull'), 132.0) | |
47 | + self.assertEqual(self.get_dbus_dev_property(bat0_up, 'EnergyFullDesign'), 132.0) | |
48 | + self.assertEqual(self.get_dbus_dev_property(bat0_up, 'Voltage'), 12.0) | |
49 | + self.assertEqual(self.get_dbus_dev_property(bat0_up, 'PowerSupply'), True) | |
50 | + self.assertEqual(self.get_dbus_dev_property(bat0_up, 'Type'), 2) | |
51 | + self.stop_daemon() | |
52 | + | |
53 | def test_battery_temperature(self): | |
54 | '''battery which reports temperature''' | |
55 | ||
56 | diff --git a/src/linux/up-device-supply.c b/src/linux/up-device-supply.c | |
57 | index fd509c3..977d1b0 100644 | |
58 | --- a/src/linux/up-device-supply.c | |
59 | +++ b/src/linux/up-device-supply.c | |
60 | @@ -677,6 +677,10 @@ up_device_supply_refresh_battery (UpDeviceSupply *supply) | |
61 | /* get a precise percentage */ | |
62 | if (sysfs_file_exists (native_path, "capacity")) { | |
63 | percentage = sysfs_get_double (native_path, "capacity"); | |
64 | + if (percentage < 0.0f) | |
65 | + percentage = 0.0f; | |
66 | + if (percentage > 100.0f) | |
67 | + percentage = 100.0f; | |
68 | /* for devices which provide capacity, but not {energy,charge}_now */ | |
69 | if (energy < 0.1f && energy_full > 0.0f) | |
70 | energy = energy_full * percentage / 100; | |
71 | -- | |
72 | cgit v0.9.0.2-2-gbebe |