diff --git a/script/otf_main.py b/script/otf_main.py new file mode 100644 index 00000000..393298e0 --- /dev/null +++ b/script/otf_main.py @@ -0,0 +1,166 @@ +#!/usr/bin/env python +""" +On-the-fly scan server for the Pearl PGM + + +Authors: + Juraj Krempasky + Matthias Muntwiler + +Created: + 5.2.2013 + +$Id: otf_main.py 35 2015-03-02 16:18:00Z muntwiler_m $ +""" +import time +import random +import thread +import threading +import sys +import os +import numpy as np + +MAXARRAY = 6000 + +lib_path = os.path.abspath('..') +sys.path.append(lib_path) +from pcaspy import Driver, SimpleServer +import otf_thread as pgm + +prefix = "X03DA-OTF:" +#prefix = "" +pvdb = { + 'COUNT' :{ 'prec' : 0, 'unit' : 'pts' }, + 'E1' :{ 'prec' : 7, 'unit' : 'eV' }, + 'E2' :{ 'prec' : 7, 'unit' : 'eV' }, + 'BETA1' :{ 'prec' : 7, 'unit' : 'deg' }, + 'BETA2' :{ 'prec' : 7, 'unit' : 'deg' }, + 'THETA1' :{ 'prec' : 7, 'unit' : 'deg' }, + 'THETA2' :{ 'prec' : 7, 'unit' : 'deg' }, + 'TIME' :{ 'prec' : 1, 'hopr':3, 'lopr':0.5, 'unit': 'min' }, + 'RUN' :{ 'type' : 'enum', 'enums': ['STOP', 'START']}, + 'MODE' :{ 'type' : 'enum', 'enums': ['ENERGY', 'ANGLE']}, + 'EDATA' :{ 'prec' : 5, 'count':MAXARRAY, }, + 'BDATA' :{ 'prec' : 5, 'count':MAXARRAY, }, + 'TDATA' :{ 'prec' : 5, 'count':MAXARRAY, }, + 'IDATA1' :{ 'prec' : 5, 'count':MAXARRAY, }, + 'IDATA2' :{ 'prec' : 5, 'count':MAXARRAY, }, + 'IDATA3' :{ 'prec' : 5, 'count':MAXARRAY, }, + 'IDATA4' :{ 'prec' : 5, 'count':MAXARRAY, }, + 'MSG' :{ 'type' : 'string'}, + 'FILE' :{ 'type' : 'string'}, + 'FOLDER' :{ 'type' : 'string'}, + 'STATUS' :{ 'type' : 'enum', 'enums': ['DONE', 'BUSY']}, +} + +pvs={} + +class myDriver(Driver): + def __init__(self, data_source): + Driver.__init__(self) + self.otf = data_source + thread.start_new_thread(self.poll, ()) + # initial values + self.setParam('E1', 400) + self.setParam('E2', 500) + self.setParam('TIME', 1.0) + self.otf.uparam['otf'][0] = 400 + self.otf.uparam['otf'][1] = 500 + self.otf.uparam['otf'][2] = 1.0 + + self.setParam('BETA1', -87.0) + self.setParam('BETA2', -87.0) + self.setParam('THETA1', 86.0) + self.setParam('THETA2', 86.0) + self.otf.uparam['angles'][0] = -87.0 + self.otf.uparam['angles'][1] = -87.0 + self.otf.uparam['angles'][2] = 86.0 + self.otf.uparam['angles'][3] = 86.0 + self.otf.uparam['angles'][4] = 1.0 + + self.setParam('MODE', 0) + self.setParam('FOLDER','TEST') + self.otf.folder = 'TEST' + self.setParam('FILE','TEST') + self.otf.file = 'TEST' + + def start_otf(self): + # do nothing if already running + if self.otf.running: + return + else: + mode = self.getParam('MODE') + self.otf.folder = self.getParam('FOLDER') + self.otf.file = self.getParam('FILE') + if mode == 0: + print "start_otf: energy scan" + self.otf.uparam['otf'][0] = self.getParam('E1') + self.otf.uparam['otf'][1] = self.getParam('E2') + self.otf.uparam['otf'][2] = self.getParam('TIME') + thread.start_new_thread(self.otf.otfgo,()) + elif mode == 1: + print "start_otf: angle scan" + self.otf.uparam['angles'][0] = self.getParam('BETA1') + self.otf.uparam['angles'][1] = self.getParam('BETA2') + self.otf.uparam['angles'][2] = self.getParam('THETA1') + self.otf.uparam['angles'][3] = self.getParam('THETA2') + self.otf.uparam['angles'][4] = self.getParam('TIME') + thread.start_new_thread(self.otf.go_angle,()) + else: + print "start_otf: mode not implemented" + + def stop_otf(self): + if not self.otf.running: + return + else: + print "stop_otf" + self.otf.stop() + + def write(self, reason, value): + print "write: ", reason, value + self.setParam(reason, value) + self.updatePVs() + if reason == 'RUN': + if value == 1: + self.start_otf() + else: + self.stop_otf() + + def poll(self): + while True: + self.setParam('EDATA',np.asarray(self.otf.pvsdata['E_crbk'])) + self.setParam('BDATA',np.asarray(self.otf.pvsdata['beta_rbk'])) + self.setParam('TDATA',np.asarray(self.otf.pvsdata['theta_rbk'])) + self.setParam('IDATA1',np.asarray(self.otf.pvsdata['K1'])) + self.setParam('IDATA2',np.asarray(self.otf.pvsdata['K2'])) + self.setParam('COUNT',self.otf.pntcnt) + self.setParam('RUN',self.otf.running) + self.setParam('MSG',self.otf.msg) + self.updatePVs() + if self.otf.running: + time.sleep(0.1) + else: + time.sleep(1) + + +def run_direct(data_source_name): + otf = pgm.epicsPGM(data_source_name) + otf.otfgo() + +def run_server(data_source_name): + data_source = pgm.epicsPGM(data_source_name) + + server = SimpleServer() + server.createPV(prefix, pvdb) + driver = myDriver(data_source) + + # process CA transactions + while True: + server.process(0.01) + +if __name__ == '__main__': + #run_server('kei6517') + #run_server('ah401') + run_server('cadc') + #run_server('cadc3') +