167 lines
5.2 KiB
Python
167 lines
5.2 KiB
Python
#!/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')
|
|
|