1# Copyright 2014 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5import telemetry.core.platform.power_monitor as power_monitor 6 7 8class PowerMonitorController(power_monitor.PowerMonitor): 9 """ 10 PowerMonitor that acts as facade for a list of PowerMonitor objects and uses 11 the first available one. 12 """ 13 def __init__(self, power_monitors): 14 super(PowerMonitorController, self).__init__() 15 self._cascading_power_monitors = power_monitors 16 self._active_monitor = None 17 18 def _AsyncPowerMonitor(self): 19 return next( 20 (x for x in self._cascading_power_monitors if x.CanMonitorPower()), 21 None) 22 23 def CanMonitorPower(self): 24 return bool(self._AsyncPowerMonitor()) 25 26 def StartMonitoringPower(self, browser): 27 self._active_monitor = self._AsyncPowerMonitor() 28 assert self._active_monitor, 'No available monitor.' 29 self._active_monitor.StartMonitoringPower(browser) 30 31 def StopMonitoringPower(self): 32 assert self._active_monitor, 'StartMonitoringPower() not called.' 33 try: 34 return self._active_monitor.StopMonitoringPower() 35 finally: 36 self._active_monitor = None 37