aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/motan
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/motan')
-rwxr-xr-xscripts/motan/data_logger.py6
-rw-r--r--scripts/motan/readlog.py65
2 files changed, 69 insertions, 2 deletions
diff --git a/scripts/motan/data_logger.py b/scripts/motan/data_logger.py
index 81370713..e00c9956 100755
--- a/scripts/motan/data_logger.py
+++ b/scripts/motan/data_logger.py
@@ -152,10 +152,12 @@ class DataLogger:
"motion_report/dump_stepper", {"name": stepper})
# Subscribe to additional sensor data
stypes = ["adxl345", "lis2dw", "mpu9250", "angle"]
+ stypes = {st:st for st in stypes}
+ stypes['probe_eddy_current'] = 'ldc1612'
config = status["configfile"]["settings"]
for cfgname in config.keys():
- for st in stypes:
- if cfgname == st or cfgname.startswith(st + " "):
+ for capprefix, st in sorted(stypes.items()):
+ if cfgname == capprefix or cfgname.startswith(capprefix + " "):
aname = cfgname.split()[-1]
lname = "%s:%s" % (st, aname)
qcmd = "%s/dump_%s" % (st, st)
diff --git a/scripts/motan/readlog.py b/scripts/motan/readlog.py
index f49f0b59..1b44c937 100644
--- a/scripts/motan/readlog.py
+++ b/scripts/motan/readlog.py
@@ -439,6 +439,71 @@ class HandleAngle:
self.data_pos += 1
LogHandlers["angle"] = HandleAngle
+def interpolate(next_val, prev_val, next_time, prev_time, req_time):
+ vdiff = next_val - prev_val
+ tdiff = next_time - prev_time
+ rtdiff = req_time - prev_time
+ return prev_val + rtdiff * vdiff / tdiff
+
+# Extract eddy current data
+class HandleEddyCurrent:
+ SubscriptionIdParts = 2
+ ParametersMin = 1
+ ParametersMax = 2
+ DataSets = [
+ ('ldc1612(<name>)', 'Coil resonant frequency'),
+ ('ldc1612(<name>,period)', 'Coil resonant period'),
+ ('ldc1612(<name>,z)', 'Estimated Z height'),
+ ]
+ def __init__(self, lmanager, name, name_parts):
+ self.name = name
+ self.sensor_name = name_parts[1]
+ if len(name_parts) == 3 and name_parts[2] not in ("period", "z"):
+ raise error("Unknown ldc1612 selection '%s'" % (name_parts[2],))
+ self.report_frequency = len(name_parts) == 2
+ self.report_z = len(name_parts) == 3 and name_parts[2] == "z"
+ self.jdispatch = lmanager.get_jdispatch()
+ self.next_samp = self.prev_samp = [0., 0., 0.]
+ self.cur_data = []
+ self.data_pos = 0
+ def get_label(self):
+ if self.report_frequency:
+ label = '%s frequency' % (self.sensor_name,)
+ return {'label': label, 'units': 'Frequency\n(Hz)'}
+ if self.report_z:
+ label = '%s height' % (self.sensor_name,)
+ return {'label': label, 'units': 'Position\n(mm)'}
+ label = '%s period' % (self.sensor_name,)
+ return {'label': label, 'units': 'Period\n(s)'}
+ def pull_data(self, req_time):
+ while 1:
+ next_time, next_freq, next_z = self.next_samp
+ if req_time <= next_time:
+ prev_time, prev_freq, prev_z = self.prev_samp
+ if self.report_frequency:
+ next_val = next_freq
+ prev_val = prev_freq
+ elif self.report_z:
+ next_val = next_z
+ prev_val = prev_z
+ else:
+ next_val = 1. / next_freq
+ prev_val = 1. / prev_freq
+ return interpolate(next_val, prev_val, next_time, prev_time,
+ req_time)
+ if self.data_pos >= len(self.cur_data):
+ # Read next data block
+ jmsg = self.jdispatch.pull_msg(req_time, self.name)
+ if jmsg is None:
+ return 0.
+ self.cur_data = jmsg['data']
+ self.data_pos = 0
+ continue
+ self.prev_samp = self.next_samp
+ self.next_samp = self.cur_data[self.data_pos]
+ self.data_pos += 1
+LogHandlers["ldc1612"] = HandleEddyCurrent
+
######################################################################
# Log reading