-
Notifications
You must be signed in to change notification settings - Fork 78
/
Copy pathpositioner_module.py
76 lines (64 loc) · 2.61 KB
/
positioner_module.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import epics
import cams
import time
from qtpy.QtCore import Slot
from os import path
from pydm import Display
class Positioner(Display):
def __init__(self, parent=None, args=None):
super().__init__(parent=parent, args=args)
self.moving = False
self.ui.pushButton.clicked.connect(self.move_motors)
self.motor1pv = epics.PV("MOTOR:1:VAL")
self.motor2pv = epics.PV("MOTOR:2:VAL")
self.motor3pv = epics.PV("MOTOR:3:VAL")
self.motor_pvs = (self.motor1pv, self.motor2pv, self.motor3pv)
self.ui.xPosTextEntry.textChanged.connect(self.desired_position_changed)
self.ui.yPosTextEntry.textChanged.connect(self.desired_position_changed)
self.ui.zPosTextEntry.textChanged.connect(self.desired_position_changed)
@property
def display_manager_window(self):
return self.window()
@Slot()
def move_motors(self):
if self.moving:
return
self.moving = True
self.ui.pushButton.setEnabled(False)
self.display_manager_window.statusBar().showMessage("Moving motors...")
self.motor1pv.put(self.m1des)
self.motor2pv.put(self.m2des)
self.motor3pv.put(self.m3des)
waiting = True
while waiting:
time.sleep(0.001)
waiting = not all([pv.put_complete for pv in self.motor_pvs])
self.display_manager_window.statusBar().showMessage("Motor move complete.", 2000)
self.ui.pushButton.setEnabled(True)
self.moving = False
@Slot(str)
def desired_position_changed(self):
x = self.ui.xPosTextEntry.text()
y = self.ui.yPosTextEntry.text()
theta = self.ui.zPosTextEntry.text()
try:
x = float(x)
y = float(y)
theta = float(theta)
except ValueError:
self.ui.pushButton.setEnabled(False)
self.display_manager_window.statusBar().showMessage(
"Cannot calculate new position, desired position is invalid."
)
return
self.display_manager_window.statusBar().showMessage("Calculating new position...", 1000)
(self.m1des, self.m2des, self.m3des, valid) = cams.real2cams((x, y, theta))
self.ui.motor1DesLabel.setText("%.3f" % self.m1des)
self.ui.motor2DesLabel.setText("%.3f" % self.m2des)
self.ui.motor3DesLabel.setText("%.3f" % self.m3des)
self.ui.pushButton.setEnabled(valid)
def ui_filename(self):
return "positioner-widget.ui"
def ui_filepath(self):
return path.join(path.dirname(path.realpath(__file__)), self.ui_filename())
intelclass = Positioner