diff options
author | Martin Pitt <martinpitt@gnome.org> | 2013-10-22 10:02:51 +0200 |
---|---|---|
committer | Martin Pitt <martinpitt@gnome.org> | 2013-10-22 10:02:51 +0200 |
commit | 22da1a0bc5943b683189418d8b0f766e91b2bdbe (patch) | |
tree | 09d242e5c28d64941f0f399b1ed06536ca78e063 | |
parent | a30ad0beaef1d6c42742c21c4f6c11866e9f53c9 (diff) | |
download | upower-22da1a0bc5943b683189418d8b0f766e91b2bdbe.tar.gz |
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
-rwxr-xr-x | src/linux/integration-test | 33 | ||||
-rw-r--r-- | src/linux/up-device-supply.c | 4 |
2 files changed, 37 insertions, 0 deletions
diff --git a/src/linux/integration-test b/src/linux/integration-test index 6adc5c4..b7f11a9 100755 --- a/src/linux/integration-test +++ b/src/linux/integration-test @@ -458,6 +458,39 @@ class Tests(unittest.TestCase): self.assertEqual(self.get_dbus_display_property('WarningLevel'), UP_DEVICE_LEVEL_NONE) 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 fd509c3..977d1b0 100644 --- a/src/linux/up-device-supply.c +++ b/src/linux/up-device-supply.c @@ -677,6 +677,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; |