summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2018-10-09 08:07:39 +0200
committerDaniel Friesel <derf@finalrewind.org>2018-10-09 08:07:39 +0200
commitc143ca0b50005c1f40c231ba38cb2e9e417cb96b (patch)
tree59b8029774a97478edfe64eef1eac7fdc5953a03
parentaa12b20c2a80f3bc55bd4fd1a9cd94eefb05f509 (diff)
Support loading and saving of energy data
-rwxr-xr-xbin/msp430-etv49
1 files changed, 41 insertions, 8 deletions
diff --git a/bin/msp430-etv b/bin/msp430-etv
index de138cf..7d4123a 100755
--- a/bin/msp430-etv
+++ b/bin/msp430-etv
@@ -1,19 +1,16 @@
#!/usr/bin/env python3
+import getopt
import matplotlib.pyplot as plt
import numpy as np
import os
+import re
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]))
+opt = dict()
+def measure_data(time):
if not 'LD_LIBRARY_PATH' in os.environ:
os.environ['LD_LIBRARY_PATH'] = '{}/var/projects/msp430/MSP430Flasher_1.3.7'.format(os.environ['HOME'])
@@ -21,7 +18,37 @@ if __name__ == '__main__':
res = subprocess.run([energytrace_cmd, str(duration)], stdout = subprocess.PIPE, universal_newlines = True)
- lines = res.stdout.split('\n')
+ return res.stdout
+
+if __name__ == '__main__':
+ try:
+ optspec = ('load= save=')
+ raw_opts, args = getopt.getopt(sys.argv[1:], "", optspec.split(' '))
+
+ for option, parameter in raw_opts:
+ optname = re.sub(r'^--', '', option)
+ opt[optname] = parameter
+
+ if not 'load' in opt:
+ duration = int(args[1])
+
+ except getopt.GetoptError as err:
+ print(err)
+ sys.exit(2)
+ except IndexError:
+ print('Usage: msp430-etv <duration>')
+ sys.exit(2)
+ except ValueError:
+ print('Error: duration "{}" is not a number'.format(sys.argv[1]))
+ sys.exit(2)
+
+ if 'load' in opt:
+ with open(opt['load'], 'r') as f:
+ log_data = f.read()
+ else:
+ log_data = measure_data(duration)
+
+ lines = log_data.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))
@@ -33,12 +60,18 @@ if __name__ == '__main__':
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]))
+ m_energy_deviation = np.abs(m_energy - m_calc_energy) / np.max([m_energy, m_calc_energy])
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))
+ print('Energy deviation: {:.1f}%'.format(m_energy_deviation * 100))
+
+ if 'save' in opt:
+ with open(opt['save'], 'w') as f:
+ f.write(log_data)
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)