mirror of
https://gitlab.freedesktop.org/upower/upower.git
synced 2025-12-20 06:40:04 +01:00
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:
parent
90df3546b0
commit
b8fe9902f3
2 changed files with 37 additions and 0 deletions
|
|
@ -442,6 +442,39 @@ class Tests(unittest.TestCase):
|
||||||
self.assertEqual(self.get_dbus_property('OnLowBattery'), False)
|
self.assertEqual(self.get_dbus_property('OnLowBattery'), False)
|
||||||
self.stop_daemon()
|
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):
|
def test_battery_temperature(self):
|
||||||
'''battery which reports temperature'''
|
'''battery which reports temperature'''
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -708,6 +708,10 @@ up_device_supply_refresh_battery (UpDeviceSupply *supply)
|
||||||
/* get a precise percentage */
|
/* get a precise percentage */
|
||||||
if (sysfs_file_exists (native_path, "capacity")) {
|
if (sysfs_file_exists (native_path, "capacity")) {
|
||||||
percentage = sysfs_get_double (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 */
|
/* for devices which provide capacity, but not {energy,charge}_now */
|
||||||
if (energy < 0.1f && energy_full > 0.0f)
|
if (energy < 0.1f && energy_full > 0.0f)
|
||||||
energy = energy_full * percentage / 100;
|
energy = energy_full * percentage / 100;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue