Index: tools/telemetry/telemetry/internal/platform/profiler/monsoon_profiler.py |
diff --git a/tools/telemetry/telemetry/internal/platform/profiler/monsoon_profiler.py b/tools/telemetry/telemetry/internal/platform/profiler/monsoon_profiler.py |
deleted file mode 100644 |
index e8712e6642007fde2cf93fdb8be5b21c275775a1..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/telemetry/internal/platform/profiler/monsoon_profiler.py |
+++ /dev/null |
@@ -1,97 +0,0 @@ |
-# Copyright 2013 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. |
- |
-"""Profiler using data collected from a Monsoon power meter. |
- |
-http://msoon.com/LabEquipment/PowerMonitor/ |
-Data collected is a namedtuple of (amps, volts), at 5000 samples/second. |
-Output graph plots power in watts over time in seconds. |
-""" |
- |
-import csv |
-import multiprocessing |
- |
-from telemetry.core import exceptions |
-from telemetry.internal.platform import profiler |
-from telemetry.internal.platform.profiler import monsoon |
-from telemetry.util import statistics |
- |
- |
-def _CollectData(output_path, is_collecting): |
- mon = monsoon.Monsoon(wait=False) |
- # Note: Telemetry requires the device to be connected by USB, but that |
- # puts it in charging mode. This increases the power consumption. |
- mon.SetUsbPassthrough(1) |
- # 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.) |
- mon.SetVoltage(4.0) |
- |
- samples = [] |
- try: |
- mon.StartDataCollection() |
- # Do one CollectData() to make the Monsoon set up, which takes about |
- # 0.3 seconds, and only signal that we've started after that. |
- mon.CollectData() |
- is_collecting.set() |
- while is_collecting.is_set(): |
- samples += mon.CollectData() |
- finally: |
- mon.StopDataCollection() |
- |
- # Add x-axis labels. |
- plot_data = [(i / 5000., sample.amps * sample.volts) |
- for i, sample in enumerate(samples)] |
- |
- # Print data in csv. |
- with open(output_path, 'w') as output_file: |
- output_writer = csv.writer(output_file) |
- output_writer.writerows(plot_data) |
- output_file.flush() |
- |
- power_samples = [s.amps * s.volts for s in samples] |
- |
- print 'Monsoon profile power readings in watts:' |
- print ' Total = %f' % statistics.TrapezoidalRule(power_samples, 1/5000.) |
- print (' Average = %f' % statistics.ArithmeticMean(power_samples) + |
- '+-%f' % statistics.StandardDeviation(power_samples)) |
- print ' Peak = %f' % max(power_samples) |
- print ' Duration = %f' % (len(power_samples) / 5000.) |
- |
- print 'To view the Monsoon profile, run:' |
- print (' echo "set datafile separator \',\'; plot \'%s\' with lines" | ' |
- 'gnuplot --persist' % output_path) |
- |
- |
-class MonsoonProfiler(profiler.Profiler): |
- def __init__(self, browser_backend, platform_backend, output_path, state): |
- super(MonsoonProfiler, self).__init__( |
- browser_backend, platform_backend, output_path, state) |
- # We collect the data in a separate process, so we can continuously |
- # read the samples from the USB port while running the test. |
- self._is_collecting = multiprocessing.Event() |
- self._collector = multiprocessing.Process( |
- target=_CollectData, args=(output_path, self._is_collecting)) |
- self._collector.start() |
- if not self._is_collecting.wait(timeout=0.5): |
- self._collector.terminate() |
- raise exceptions.ProfilingException('Failed to start data collection.') |
- |
- @classmethod |
- def name(cls): |
- return 'monsoon' |
- |
- @classmethod |
- def is_supported(cls, browser_type): |
- try: |
- monsoon.Monsoon(wait=False) |
- except EnvironmentError: |
- return False |
- else: |
- return True |
- |
- def CollectProfile(self): |
- self._is_collecting.clear() |
- self._collector.join() |
- return [self._output_path] |