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
This commit is contained in:
Martin Pitt 2013-10-22 10:02:51 +02:00
parent 90df3546b0
commit b8fe9902f3
2 changed files with 37 additions and 0 deletions

View file

@ -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'''

View file

@ -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;