#!/usr/bin/env python3 """ This little program synchronizes an EPICS substitutions file with values read from the delta tau motor controller. Some research showed that the EPICS motorRecord seems to have no means of reading configuration data like limits or speeds or such from the device support. Than it is the easiest to read the data with this small program and update the substitutions file with it. Mark Koennecke, January 2023 """ import socket import sys from deltatau import packPmacCommand, readPmacReply socke = None # --------------- communication section def connect(host, port): global socke, sockfd socke = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # socke.connect(('localhost', 5050)) socke.connect((host, port)) socke.settimeout(1.) def transact(command): global socke data = packPmacCommand(command) socke.send(data) reply = readPmacReply(socke) return reply.decode('utf-8') 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 fix_line(par_list, index_list): # import pdb; pdb.set_trace() addridx = index_list.index('ADDR') motNo = int(par_list[addridx]) lowlim = transact('Q%d14' % motNo) lowidx = index_list.index('DLLM') par_list[lowidx] = lowlim.strip() highlim = transact('Q%d13' % motNo) highidx = index_list.index('DHLM') par_list[highidx] = highlim.strip() speed = transact('Q%d03' % motNo) 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() 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\tsyncPmacSub.py \n') sys.exit(1) connect(sys.argv[1], int(sys.argv[2])) scan_substitution_file(sys.argv[3]) socke.close()