motan: Add support for analyzing "angle" sensor data
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
parent
aec742ece4
commit
76558168d9
|
@ -157,6 +157,10 @@ class DataLogger:
|
||||||
aname = cfgname.split()[-1]
|
aname = cfgname.split()[-1]
|
||||||
self.send_subscribe("adxl345:" + aname, "adxl345/dump_adxl345",
|
self.send_subscribe("adxl345:" + aname, "adxl345/dump_adxl345",
|
||||||
{"sensor": aname})
|
{"sensor": aname})
|
||||||
|
if cfgname.startswith("angle "):
|
||||||
|
aname = cfgname.split()[1]
|
||||||
|
self.send_subscribe("angle:" + aname, "angle/dump_angle",
|
||||||
|
{"sensor": aname})
|
||||||
def handle_dump(self, msg, raw_msg):
|
def handle_dump(self, msg, raw_msg):
|
||||||
msg_id = msg["id"]
|
msg_id = msg["id"]
|
||||||
if "result" not in msg:
|
if "result" not in msg:
|
||||||
|
|
|
@ -374,6 +374,67 @@ class HandleADXL345:
|
||||||
self.data_pos += 1
|
self.data_pos += 1
|
||||||
LogHandlers["adxl345"] = HandleADXL345
|
LogHandlers["adxl345"] = HandleADXL345
|
||||||
|
|
||||||
|
# Extract positions from magnetic angle sensor
|
||||||
|
class HandleAngle:
|
||||||
|
SubscriptionIdParts = 2
|
||||||
|
ParametersMin = ParametersMax = 1
|
||||||
|
DataSets = [
|
||||||
|
('angle(<name>)', 'Angle sensor position'),
|
||||||
|
]
|
||||||
|
def __init__(self, lmanager, name, name_parts):
|
||||||
|
self.name = name
|
||||||
|
self.angle_name = name_parts[1]
|
||||||
|
self.jdispatch = lmanager.get_jdispatch()
|
||||||
|
self.next_angle_time = self.last_angle_time = 0.
|
||||||
|
self.next_angle = self.last_angle = 0.
|
||||||
|
self.cur_data = []
|
||||||
|
self.data_pos = 0
|
||||||
|
self.position_offset = 0.
|
||||||
|
self.angle_dist = 1.
|
||||||
|
# Determine angle distance from associated stepper's rotation_distance
|
||||||
|
config = lmanager.get_initial_status()['configfile']['settings']
|
||||||
|
aname = 'angle %s' % (self.angle_name,)
|
||||||
|
stepper_name = config.get(aname, {}).get('stepper')
|
||||||
|
if stepper_name is not None:
|
||||||
|
sconfig = config.get(stepper_name, {})
|
||||||
|
rotation_distance = sconfig.get('rotation_distance', 1.)
|
||||||
|
gear_ratio = sconfig.get('gear_ratio', ())
|
||||||
|
if type(gear_ratio) == str: # XXX
|
||||||
|
gear_ratio = [[float(v.strip()) for v in gr.split(':')]
|
||||||
|
for gr in gear_ratio.split(',')]
|
||||||
|
for n, d in gear_ratio:
|
||||||
|
rotation_distance *= d / n
|
||||||
|
self.angle_dist = rotation_distance / 65536.
|
||||||
|
def get_label(self):
|
||||||
|
label = '%s position' % (self.angle_name,)
|
||||||
|
return {'label': label, 'units': 'Position\n(mm)'}
|
||||||
|
def pull_data(self, req_time):
|
||||||
|
while 1:
|
||||||
|
if req_time <= self.next_angle_time:
|
||||||
|
pdiff = self.next_angle - self.last_angle
|
||||||
|
tdiff = self.next_angle_time - self.last_angle_time
|
||||||
|
rtdiff = req_time - self.last_angle_time
|
||||||
|
po = rtdiff * pdiff / tdiff
|
||||||
|
return ((self.last_angle + po) * self.angle_dist
|
||||||
|
+ self.position_offset)
|
||||||
|
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 (self.next_angle * self.angle_dist
|
||||||
|
+ self.position_offset)
|
||||||
|
self.cur_data = jmsg['data']
|
||||||
|
position_offset = jmsg.get('position_offset')
|
||||||
|
if position_offset is not None:
|
||||||
|
self.position_offset = position_offset
|
||||||
|
self.data_pos = 0
|
||||||
|
continue
|
||||||
|
self.last_angle = self.next_angle
|
||||||
|
self.last_angle_time = self.next_angle_time
|
||||||
|
self.next_angle_time, self.next_angle = self.cur_data[self.data_pos]
|
||||||
|
self.data_pos += 1
|
||||||
|
LogHandlers["angle"] = HandleAngle
|
||||||
|
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
# Log reading
|
# Log reading
|
||||||
|
|
Loading…
Reference in New Issue