#!/usr/bin/env python3 """ This little program synchronizes an EPICS substitutions file with values read from a MasterMAC motor controller. Mark Koennecke, February 2023 """ import sys import time from macmaster import MasterMACS def find_commas(rawline): comma_list = [] for i in range(len(rawline)): if rawline[i] == ',': comma_list.append(i) return comma_list def pretty_line(newlist, comma_list): """ adds spaces to match the tabbing of the patter line """ newline = '' for item, idx in zip(newlist, comma_list): length = len(newline) + 1 + len(item) if length < idx: newline += ' ' * (idx - length) newline += item newline += ',' newline += newlist[-1] return newline[0:-1] def transact(command): global mac mac.send(command) time.sleep(.1) return mac.receive() def fix_line(par_list, index_list): # import pdb; pdb.set_trace() addridx = index_list.index('ADDR') motNo = int(par_list[addridx]) ack, reply = transact('%dR24' % motNo) if ack == 'NO': idx = reply.find('=') lowlim = reply[idx+1:] lowidx = index_list.index('DLLM') par_list[lowidx] = lowlim.strip() ack, reply = transact('%dR23' % motNo) if ack == 'NO': idx = reply.find('=') highlim = reply[idx+1:] highidx = index_list.index('DHLM') par_list[highidx] = highlim.strip() ack, reply = transact('%dR05' % motNo) if ack == 'NO': idx = reply.find('=') speed = reply[idx+1:] speedidx = index_list.index('VELO') par_list[speedidx] = speed.strip() return par_list def scan_substitution_file(filename): index_list = None # import pdb; pdb.set_trace() with open(filename, 'r') as fin: rawline = fin.readline() # import pdb; pdb.set_trace() while rawline: line = rawline.replace(' ','') line = line.strip('{}') l = line.split(',') if line.find('DHLM') > 0: index_list = l comma_list = find_commas(rawline) sys.stdout.write(rawline) elif not index_list: sys.stdout.write(rawline) else: if len(l) == len(index_list): newlist = fix_line(l, index_list) # newline = ','.join(newlist) newline = pretty_line(newlist, comma_list) sys.stdout.write('{' + newline + '\n') else: sys.stdout.write(rawline) rawline = fin.readline() #------------------ main if len(sys.argv) < 4: print('Usage:\n\tsyncMMACSub.py \n') sys.exit(1) mac = MasterMACS(sys.argv[1], sys.argv[2]) scan_substitution_file(sys.argv[3])