#!/usr/bin/env python3 """ This little program synchronizes an EPICS substitutions file with values read from the EL734 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 import time socke = None sockfd = 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(2.) sockfd = socke.makefile(mode='rw', newline='\r') sockfd.write('RMT 1\r') sockfd.flush() sockfd.write('ECHO 0\r') sockfd.flush() sockfd.readline() def transact(command): global socke, sockfd sockfd.write(command + '\r') sockfd.flush() time.sleep(.1) return sockfd.readline() 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 pattern 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 = par_list[addridx] limits = transact('H ' + motNo) time.sleep(.1) l = limits.split() lowidx = index_list.index('DLLM') # import pdb; pdb.set_trace() par_list[lowidx] = l[0] highidx = index_list.index('DHLM') par_list[highidx] = l[1] speed = transact('J ' + motNo) vidx = index_list.index('VELO') par_list[vidx] = speed.strip() # vidx = index_list.index('VMAX') # par_list[vidx] = 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\tsyncEL734sub.py \n') sys.exit(1) connect(sys.argv[1], int(sys.argv[2])) scan_substitution_file(sys.argv[3]) socke.close()