| #!/usr/bin/python |
| # |
| # SPDX-License-Identifier: Apache-2.0 |
| # |
| # Copyright (C) 2015, ARM Limited and contributors. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); you may |
| # not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| |
| import logging |
| import getopt |
| import sys |
| |
| # Sampler configuration |
| config = { |
| 'period' : 0, |
| 'samples' : 0, |
| } |
| |
| class OdroidSampler(object): |
| |
| sysfs_base = '/sys/devices/12c60000.i2c/i2c-4/i2c-dev/i2c-4/device' |
| sysfs = { |
| 'arm' : sysfs_base + '/4-0040', |
| 'kfc' : sysfs_base + '/4-0045', |
| } |
| power = { |
| 'arm' : sysfs['arm'] + '/sensor_W', |
| 'kfc' : sysfs['kfc'] + '/sensor_W', |
| } |
| |
| def __init__(self, samples, period): |
| self.energy_proxy = { |
| 'arm' : 0, |
| 'kfc' : 0, |
| } |
| self.samples = samples |
| self.period = period |
| |
| def sample(self, device): |
| f = open(self.power[device], 'r') |
| power = f.readline() |
| self.energy_proxy[device] += power |
| f.close() |
| |
| def averagePower(self, device): |
| self.energy_proxy[device] = 0 |
| for i in range(0, self.samples): |
| sample(self, device) |
| sleep(self.period / 1e6) |
| return self.energy_proxy[device] / self.samples |
| |
| |
| def parseOptions(): |
| global config |
| |
| logging.debug('Parsing options') |
| |
| try: |
| opts, args = getopt.getopt(sys.argv[1:], "p:s:", ["period=", "samples="]) |
| except getopt.GetoptError as err: |
| # print help information and exit: |
| print str(err) |
| usage() |
| sys.exit(2) |
| output = None |
| verbose = False |
| for o, a in opts: |
| if o == "-v": |
| verbose = True |
| elif o in ("-p", "--period"): |
| config['period'] = int(a) |
| elif o in ("-s", "--samples"): |
| config['samples'] = int(a) |
| else: |
| assert False, "unhandled option" |
| |
| logging.info('Sampler configured for {0:d} samples, evenry {1:.3f}ms'\ |
| .format(config['samples'], config['period']/1000)) |
| |
| def main(): |
| |
| parseOptions() |
| |
| sampler = OdroidSampler(config['samples'], config['period']) |
| |
| avg_power = amples.averagePower(config['device']) |
| logging.info('Average power: {0:f}'.format(avg_power)) |
| |
| logging.basicConfig( |
| format='%(asctime)-9s %(levelname)-8s: %(message)s', |
| level=logging.DEBUG, |
| datefmt='%I:%M:%S') |
| |
| if __name__ == "__main__": |
| main() |