| # Copyright (c) 2012 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 logging |
| |
| class ThermalThrottle(object): |
| """Class to detect and track thermal throttling |
| |
| Usage: |
| Wait for IsThrottled() to be False before running test |
| After running test call HasBeenThrottled() to find out if the |
| test run was affected by thermal throttling. |
| |
| Currently assumes an OMap device. |
| """ |
| def __init__(self, adb): |
| self._adb = adb |
| self._throttled = False |
| |
| |
| def HasBeenThrottled(self): |
| """ True if there has been any throttling since the last call to |
| HasBeenThrottled or IsThrottled |
| """ |
| return self._ReadLog() |
| |
| def IsThrottled(self): |
| """True if currently throttled""" |
| self._ReadLog() |
| return self._throttled |
| |
| def _ReadLog(self): |
| has_been_throttled = False |
| serial_number = self._adb.Adb().GetSerialNumber() |
| log = self._adb.RunShellCommand('dmesg -c') |
| degree_symbol = unichr(0x00B0) |
| for line in log: |
| if 'omap_thermal_throttle' in line: |
| if not self._throttled: |
| logging.warning('>>> Device %s Thermally Throttled', serial_number) |
| self._throttled = True |
| has_been_throttled = True |
| if 'omap_thermal_unthrottle' in line: |
| if self._throttled: |
| logging.warning('>>> Device %s Thermally Unthrottled', serial_number) |
| self._throttled = False |
| has_been_throttled = True |
| if 'throttle_delayed_work_fn' in line: |
| temp = float([s for s in line.split() if s.isdigit()][0]) / 1000.0 |
| logging.info(u' Device %s Thermally Thottled at %3.1f%sC', |
| serial_number, temp, degree_symbol) |
| |
| # Print temperature of CPU SoC. |
| omap_temp_file = '/sys/devices/platform/omap/omap_temp_sensor.0/temperature' |
| if self._adb.FileExistsOnDevice(omap_temp_file): |
| tempdata = self._adb.GetFileContents(omap_temp_file) |
| temp = float(tempdata[0]) / 1000.0 |
| logging.info(u'Current OMAP Temperature of %s = %3.1f%sC', |
| serial_number, temp, degree_symbol) |
| |
| # Print temperature of battery, to give a system temperature |
| dumpsys_log = self._adb.RunShellCommand('dumpsys battery') |
| for line in dumpsys_log: |
| if 'temperature' in line: |
| btemp = float([s for s in line.split() if s.isdigit()][0]) / 10.0 |
| logging.info(u'Current battery temperature of %s = %3.1f%sC', |
| serial_number, btemp, degree_symbol) |
| |
| return has_been_throttled |