Commit aa12b20c authored by Daniel Friesel's avatar Daniel Friesel
Browse files

Initial commit. Shows matplotlib graphs of MSP430 EnergyTrace power readings

parents
Loading
Loading
Loading
Loading

bin/msp430-etv

0 → 100755
+49 −0
Original line number Original line Diff line number Diff line
#!/usr/bin/env python3

import matplotlib.pyplot as plt
import numpy as np
import os
import subprocess
import sys

if __name__ == '__main__':
	try:
		duration = int(sys.argv[1])
	except IndexError:
		print('Usage: msp430-etv <duration>')
	except ValueError:
		print('Error: duration "{}" is not a number'.format(sys.argv[1]))

	if not 'LD_LIBRARY_PATH' in os.environ:
		os.environ['LD_LIBRARY_PATH'] = '{}/var/projects/msp430/MSP430Flasher_1.3.7'.format(os.environ['HOME'])

	energytrace_cmd = '{}/var/source/energytrace-util/energytrace'.format(os.environ['HOME'])

	res = subprocess.run([energytrace_cmd, str(duration)], stdout = subprocess.PIPE, universal_newlines = True)

	lines = res.stdout.split('\n')
	data_count = sum(map(lambda x: len(x) > 0 and x[0] != '#', lines))
	data_lines = filter(lambda x: len(x) > 0 and x[0] != '#', lines)
	data = np.empty((data_count, 4))

	for i, line in enumerate(data_lines):
		timestamp, current, voltage, total_energy = map(float, line.split(' '))
		data[i] = [timestamp, current, voltage, total_energy]

	m_duration = data[-1, 0] - data[0, 0]
	m_energy = data[-1, 3] - data[0, 3]
	m_calc_energy = np.sum(data[1:, 1] * data[1:, 2] * (data[1:, 0] - data[:-1, 0]))

	print('{:d} measurements in {:.2f} s = {:.0f} Hz sample rate'.format(
		data_count, m_duration, data_count / m_duration))

	print('Reported energy: E = {:f} J'.format(m_energy))
	print('Calculated energy: U*I*t = {:f} J'.format(m_calc_energy))

	pwrhandle, = plt.plot(data[:, 0], data[:, 1] * data[:, 2], 'b-', label='U*I', markersize=1)
	#energyhandle, = plt.plot(data[1:, 0], (data[1:, 3] - data[:-1, 3]) / (data[1:, 0] - data[:-1, 0]), 'r-', label='E/Δt', markersize=1)
	plt.legend(handles=[pwrhandle])
	plt.xlabel('Time [s]')
	plt.ylabel('Power [W]')
	plt.grid(True)
	plt.show()