#!/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')