106 lines
2.8 KiB
Python
Executable file
106 lines
2.8 KiB
Python
Executable file
#!/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()
|