| Index: tools/telemetry/telemetry/internal/platform/power_monitor/cros_power_monitor.py
|
| diff --git a/tools/telemetry/telemetry/internal/platform/power_monitor/cros_power_monitor.py b/tools/telemetry/telemetry/internal/platform/power_monitor/cros_power_monitor.py
|
| deleted file mode 100644
|
| index 7f922bd56ffa8b2fa25ceaf53fd27cede8aba2d5..0000000000000000000000000000000000000000
|
| --- a/tools/telemetry/telemetry/internal/platform/power_monitor/cros_power_monitor.py
|
| +++ /dev/null
|
| @@ -1,164 +0,0 @@
|
| -# Copyright 2014 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -import collections
|
| -import logging
|
| -import re
|
| -
|
| -from telemetry import decorators
|
| -from telemetry.internal.platform.power_monitor import sysfs_power_monitor
|
| -
|
| -
|
| -class CrosPowerMonitor(sysfs_power_monitor.SysfsPowerMonitor):
|
| - """PowerMonitor that relies on 'dump_power_status' to monitor power
|
| - consumption of a single ChromeOS application.
|
| - """
|
| - def __init__(self, platform_backend):
|
| - """Constructor.
|
| -
|
| - Args:
|
| - platform_backend: A LinuxBasedPlatformBackend object.
|
| -
|
| - Attributes:
|
| - _initial_power: The result of 'dump_power_status' before the test.
|
| - _start_time: The epoch time at which the test starts executing.
|
| - """
|
| - super(CrosPowerMonitor, self).__init__(platform_backend)
|
| - self._initial_power = None
|
| - self._start_time = None
|
| -
|
| - @decorators.Cache
|
| - def CanMonitorPower(self):
|
| - return super(CrosPowerMonitor, self).CanMonitorPower()
|
| -
|
| - def StartMonitoringPower(self, browser):
|
| - super(CrosPowerMonitor, self).StartMonitoringPower(browser)
|
| - if self._IsOnBatteryPower():
|
| - sample = self._platform.RunCommand(['dump_power_status;', 'date', '+%s'])
|
| - self._initial_power, self._start_time = CrosPowerMonitor.SplitSample(
|
| - sample)
|
| - else:
|
| - logging.warning('Device not on battery power during power monitoring. '
|
| - 'Results may be incorrect.')
|
| -
|
| - def StopMonitoringPower(self):
|
| - # Don't need to call self._CheckStop here; it's called by the superclass
|
| - cpu_stats = super(CrosPowerMonitor, self).StopMonitoringPower()
|
| - power_stats = {}
|
| - if self._IsOnBatteryPower():
|
| - sample = self._platform.RunCommand(['dump_power_status;', 'date', '+%s'])
|
| - final_power, end_time = CrosPowerMonitor.SplitSample(sample)
|
| - # The length of the test is used to measure energy consumption.
|
| - length_h = (end_time - self._start_time) / 3600.0
|
| - power_stats = CrosPowerMonitor.ParsePower(self._initial_power,
|
| - final_power, length_h)
|
| - else:
|
| - logging.warning('Device not on battery power during power monitoring. '
|
| - 'Results may be incorrect.')
|
| - return CrosPowerMonitor.CombineResults(cpu_stats, power_stats)
|
| -
|
| - @staticmethod
|
| - def SplitSample(sample):
|
| - """Splits a power and time sample into the two separate values.
|
| -
|
| - Args:
|
| - sample: The result of calling 'dump_power_status; date +%s' on the
|
| - device.
|
| -
|
| - Returns:
|
| - A tuple of power sample and epoch time of the sample.
|
| - """
|
| - sample = sample.strip()
|
| - index = sample.rfind('\n')
|
| - power = sample[:index]
|
| - time = sample[index + 1:]
|
| - return power, int(time)
|
| -
|
| - @staticmethod
|
| - def IsOnBatteryPower(status, board):
|
| - """Determines if the devices is being charged.
|
| -
|
| - Args:
|
| - status: The parsed result of 'dump_power_status'
|
| - board: The name of the board running the test.
|
| -
|
| - Returns:
|
| - True if the device is on battery power; False otherwise.
|
| - """
|
| - on_battery = status['line_power_connected'] == '0'
|
| - # Butterfly can incorrectly report AC online for some time after unplug.
|
| - # Check battery discharge state to confirm.
|
| - if board == 'butterfly':
|
| - on_battery |= status['battery_discharging'] == '1'
|
| - return on_battery
|
| -
|
| - def _IsOnBatteryPower(self):
|
| - """Determines if the device is being charged.
|
| -
|
| - Returns:
|
| - True if the device is on battery power; False otherwise.
|
| - """
|
| - status = CrosPowerMonitor.ParsePowerStatus(
|
| - self._platform.RunCommand(['dump_power_status']))
|
| - board_data = self._platform.RunCommand(['cat', '/etc/lsb-release'])
|
| - board = re.search('BOARD=(.*)', board_data).group(1)
|
| - return CrosPowerMonitor.IsOnBatteryPower(status, board)
|
| -
|
| - @staticmethod
|
| - def ParsePowerStatus(sample):
|
| - """Parses 'dump_power_status' command output.
|
| -
|
| - Args:
|
| - sample: The output of 'dump_power_status'
|
| -
|
| - Returns:
|
| - Dictionary containing all fields from 'dump_power_status'
|
| - """
|
| - rv = collections.defaultdict(dict)
|
| - for ln in sample.splitlines():
|
| - words = ln.split()
|
| - assert len(words) == 2
|
| - rv[words[0]] = words[1]
|
| - return dict(rv)
|
| -
|
| - @staticmethod
|
| - def ParsePower(initial_stats, final_stats, length_h):
|
| - """Parse output of 'dump_power_status'
|
| -
|
| - Args:
|
| - initial_stats: The output of 'dump_power_status' before the test.
|
| - final_stats: The output of 'dump_power_status' after the test.
|
| - length_h: The length of the test in hours.
|
| -
|
| - Returns:
|
| - Dictionary in the format returned by StopMonitoringPower().
|
| - """
|
| - initial = CrosPowerMonitor.ParsePowerStatus(initial_stats)
|
| - final = CrosPowerMonitor.ParsePowerStatus(final_stats)
|
| - # The charge value reported by 'dump_power_status' is not precise enough to
|
| - # give meaningful results across shorter tests, so average energy rate and
|
| - # the length of the test are used.
|
| - initial_power_mw = float(initial['battery_energy_rate']) * 10 ** 3
|
| - final_power_mw = float(final['battery_energy_rate']) * 10 ** 3
|
| - average_power_mw = (initial_power_mw + final_power_mw) / 2.0
|
| -
|
| - # Duplicating CrOS battery fields where applicable.
|
| - def CopyFinalState(field, key):
|
| - """Copy fields from battery final state."""
|
| - if field in final:
|
| - battery[key] = float(final[field])
|
| -
|
| - battery = {}
|
| - CopyFinalState('battery_charge_full', 'charge_full')
|
| - CopyFinalState('battery_charge_full_design', 'charge_full_design')
|
| - CopyFinalState('battery_charge', 'charge_now')
|
| - CopyFinalState('battery_current', 'current_now')
|
| - CopyFinalState('battery_energy', 'energy')
|
| - CopyFinalState('battery_energy_rate', 'energy_rate')
|
| - CopyFinalState('battery_voltage', 'voltage_now')
|
| -
|
| - return {'identifier': 'dump_power_status',
|
| - 'power_samples_mw': [initial_power_mw, final_power_mw],
|
| - 'energy_consumption_mwh': average_power_mw * length_h,
|
| - 'component_utilization': {'battery': battery}}
|
|
|