| Index: tools/telemetry/telemetry/internal/platform/power_monitor/monsoon_power_monitor.py
|
| diff --git a/tools/telemetry/telemetry/internal/platform/power_monitor/monsoon_power_monitor.py b/tools/telemetry/telemetry/internal/platform/power_monitor/monsoon_power_monitor.py
|
| deleted file mode 100644
|
| index abbd9f4de158b0d1ce5e19b0c30fa6dd6b442f82..0000000000000000000000000000000000000000
|
| --- a/tools/telemetry/telemetry/internal/platform/power_monitor/monsoon_power_monitor.py
|
| +++ /dev/null
|
| @@ -1,120 +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 json
|
| -import logging
|
| -import multiprocessing
|
| -import tempfile
|
| -import time
|
| -
|
| -from telemetry.core import exceptions
|
| -from telemetry.internal.platform.power_monitor import android_power_monitor_base
|
| -from telemetry.internal.platform.profiler import monsoon
|
| -
|
| -
|
| -def _MonitorPower(device, is_collecting, output):
|
| - """Monitoring process
|
| - Args:
|
| - device: A profiler.monsoon object to collect samples from.
|
| - is_collecting: the event to synchronize on.
|
| - output: opened file to write the samples.
|
| - """
|
| - with output:
|
| - samples = []
|
| - start_time = None
|
| - end_time = None
|
| - try:
|
| - device.StartDataCollection()
|
| - is_collecting.set()
|
| - # First sample also calibrate the computation.
|
| - device.CollectData()
|
| - start_time = time.time()
|
| - while is_collecting.is_set():
|
| - new_data = device.CollectData()
|
| - assert new_data, 'Unable to collect data from device'
|
| - samples += new_data
|
| - end_time = time.time()
|
| - finally:
|
| - device.StopDataCollection()
|
| - result = {
|
| - 'duration_s': end_time - start_time,
|
| - 'samples': samples
|
| - }
|
| - json.dump(result, output)
|
| -
|
| -
|
| -class MonsoonPowerMonitor(android_power_monitor_base.AndroidPowerMonitorBase):
|
| - def __init__(self, _, platform_backend):
|
| - super(MonsoonPowerMonitor, self).__init__()
|
| - self._powermonitor_process = None
|
| - self._powermonitor_output_file = None
|
| - self._is_collecting = None
|
| - self._monsoon = None
|
| - self._platform = platform_backend
|
| - try:
|
| - self._monsoon = monsoon.Monsoon(wait=False)
|
| - # Nominal Li-ion voltage is 3.7V, but it puts out 4.2V at max capacity.
|
| - # Use 4.0V to simulate a "~80%" charged battery. Google "li-ion voltage
|
| - # curve". This is true only for a single cell. (Most smartphones, some
|
| - # tablets.)
|
| - self._monsoon.SetVoltage(4.0)
|
| - except EnvironmentError:
|
| - self._monsoon = None
|
| -
|
| - def CanMonitorPower(self):
|
| - return self._monsoon is not None
|
| -
|
| - def StartMonitoringPower(self, browser):
|
| - self._CheckStart()
|
| - self._powermonitor_output_file = tempfile.TemporaryFile()
|
| - self._is_collecting = multiprocessing.Event()
|
| - self._powermonitor_process = multiprocessing.Process(
|
| - target=_MonitorPower,
|
| - args=(self._monsoon,
|
| - self._is_collecting,
|
| - self._powermonitor_output_file))
|
| - # Ensure child is not left behind: parent kills daemonic children on exit.
|
| - self._powermonitor_process.daemon = True
|
| - self._powermonitor_process.start()
|
| - if not self._is_collecting.wait(timeout=0.5):
|
| - self._powermonitor_process.terminate()
|
| - raise exceptions.ProfilingException('Failed to start data collection.')
|
| -
|
| - def StopMonitoringPower(self):
|
| - self._CheckStop()
|
| - try:
|
| - # Tell powermonitor to take an immediate sample and join.
|
| - self._is_collecting.clear()
|
| - self._powermonitor_process.join()
|
| - with self._powermonitor_output_file:
|
| - self._powermonitor_output_file.seek(0)
|
| - powermonitor_output = self._powermonitor_output_file.read()
|
| - assert powermonitor_output, 'PowerMonitor produced no output'
|
| - return MonsoonPowerMonitor.ParseSamplingOutput(powermonitor_output)
|
| - finally:
|
| - self._powermonitor_output_file = None
|
| - self._powermonitor_process = None
|
| - self._is_collecting = None
|
| -
|
| - @staticmethod
|
| - def ParseSamplingOutput(powermonitor_output):
|
| - """Parse the output of of the samples collector process.
|
| -
|
| - Returns:
|
| - Dictionary in the format returned by StopMonitoringPower().
|
| - """
|
| - result = json.loads(powermonitor_output)
|
| - if result['samples']:
|
| - timedelta_h = (result['duration_s'] / len(result['samples'])) / 3600.0
|
| - power_samples = [current_a * voltage_v * 10**3
|
| - for (current_a, voltage_v) in result['samples']]
|
| - total_energy_consumption_mwh = sum(power_samples) * timedelta_h
|
| - else:
|
| - logging.warning('Sample information not available.')
|
| - power_samples = []
|
| - total_energy_consumption_mwh = 0
|
| -
|
| - return {'identifier':'monsoon',
|
| - 'power_samples_mw':power_samples,
|
| - 'monsoon_energy_consumption_mwh':total_energy_consumption_mwh}
|
|
|