diff --git a/epics_widgets/MotorTweak.py b/epics_widgets/MotorTweak.py index f1f9254..e2ae839 100644 --- a/epics_widgets/MotorTweak.py +++ b/epics_widgets/MotorTweak.py @@ -43,10 +43,12 @@ class MotorTweak(QWidget, Ui_MotorTweak): def connect_motor(self, motor_base, short_name=None, **kwargs): + # TODO: DO NOT USE Motor base class, but reduce to the only really needed PV: s.a. class QopticZoom(object) + # TODO: have a own motor Class as class SimMotor: m = Motor(motor_base) m.get_position() self._ignore_limits = m.HLM == m.LLM # if both high/low limits are equal they are meaningless - self.motor = m + self._motor = m if not short_name: short_name = m.description self.short_name = short_name @@ -73,8 +75,8 @@ class MotorTweak(QWidget, Ui_MotorTweak): # self.jog_forward.released.connect(lambda: self.jog('forward', False)) # self.jog_reverse.released.connect(lambda: self.jog('reverse', False)) - self.tweak_forward.clicked.connect(lambda m: self.motor.tweak('forward')) - self.tweak_reverse.clicked.connect(lambda m: self.motor.tweak('reverse')) + self.tweak_forward.clicked.connect(lambda x: m.tweak('forward')) + self.tweak_reverse.clicked.connect(lambda x: m.tweak('reverse')) self.bind_wheel() @@ -101,7 +103,7 @@ class MotorTweak(QWidget, Ui_MotorTweak): def set_motor_validator(self, **kwargs): - m = self.motor + m = self._motor lineedit = self._drive_val min, max = m.PV('LLM').get(), m.PV('HLM').get() if min == max: @@ -111,18 +113,35 @@ class MotorTweak(QWidget, Ui_MotorTweak): def move_relative(self, dist): - self.motor.move(dist, ignore_limits=True, relative=True) + try: + self._val+=dist + except AttributeError: + pass + self._motor.move(dist, ignore_limits=True, relative=True) def is_done(self): - self.motor.refresh() - return 1 == self.motor.done_moving + m=self._motor + m.refresh() + return 1 == m.done_moving - def get_position(self): - return self.motor.get_position(readback=True) + def get_rbv(self): + #return self._motor.get('RBV') + m=self._motor + return m.get_position(readback=True) + + def get_val(self): + #return self._motor.get('VAL') + try: + v=self._val + except AttributeError: + m=self._motor + self._val=v=m.get('VAL') + return v def is_homed(self): - self.motor.refresh() - status = DeltatauMotorStatus(self.motor.motor_status) + m=self._motor + m.refresh() + status = DeltatauMotorStatus(m.motor_status) return bool(DeltatauMotorStatus.MOTOR_HAS_BEEN_HOMED & status) def move_motor_to_position(self, drive=None, wait=False, assert_position=False): @@ -130,9 +149,14 @@ class MotorTweak(QWidget, Ui_MotorTweak): drive = float(self._drive_val.text()) if assert_position: wait=True - self.motor.move(drive, wait=wait, ignore_limits=True, relative=False) + try: + self._val=drive + except AttributeError: + pass + m=self._motor + m.move(drive, wait=wait, ignore_limits=True, relative=False) if assert_position: - assert_motor_positions([(self.motor, drive, 0.1)], timeout=1) + assert_motor_positions([(m, drive, 0.1)], timeout=1) def emit_signals(self, **kw): ''' @@ -191,7 +215,7 @@ class MotorTweak(QWidget, Ui_MotorTweak): self.event_axis_fault.emit(self._pvname, kw) def update_label(self, **kwargs): - m = self.motor + m = self._motor self.label.setText(self._templates[self._label_style].format(rbv=m.readback)) self.jog_forward.setToolTip('jog forward at {:.3f} {}/s'.format(m.jog_speed, m.units)) self.jog_reverse.setToolTip('jog reverse at {:.3f} {}/s'.format(m.jog_speed, m.units)) @@ -199,7 +223,7 @@ class MotorTweak(QWidget, Ui_MotorTweak): self.tweak_reverse.setToolTip('tweak reverse by {:.3f} {}'.format(m.tweak_val, m.units)) def update_jog_speed(self, event): - m = self.motor + m = self._motor speed = m.jog_speed sign = math.copysign(1, event.angleDelta().y()) m.jog_speed = speed + (sign * 0.1 * speed) @@ -207,7 +231,7 @@ class MotorTweak(QWidget, Ui_MotorTweak): self.jog_reverse.setToolTip('jog reverse at {:.3f} {}/s'.format(m.jog_speed, m.units)) def tweak_event(self, event): - m = self.motor + m = self._motor sign = event.angleDelta().y() if sign < 0: m.tweak_reverse = 1 @@ -219,14 +243,14 @@ class MotorTweak(QWidget, Ui_MotorTweak): self.tweak_reverse.wheelEvent = self.tweak_event def jog(self, direction, enable): - m = self.motor + m = self._motor if 'forw' in direction: m.jog_forward = int(enable) else: m.jog_reverse = int(enable) def contextMenuEvent(self, event): - m = self.motor + m = self._motor menu = QMenu(self) menu.setTitle(self.short_name) @@ -267,7 +291,7 @@ class MotorTweak(QWidget, Ui_MotorTweak): prec, ok = QInputDialog.getInt(self, msg, msg, prec, 0, 10) _log.debug('prec after (%d) %d', ok, prec) if ok: - self.motor.put('PREC', prec, wait=True) + m.put('PREC', prec, wait=True) elif action == changejogspeedAction: name = m.NAME @@ -275,7 +299,7 @@ class MotorTweak(QWidget, Ui_MotorTweak): msg = 'Jog speed for motor {}'.format(name) speed, ok = QInputDialog.getDouble(self, msg, msg, speed, 0.01, m.slew_speed, m.precision) if ok: - self.motor.put('JVEL', speed, wait=True) + m.put('JVEL', speed, wait=True) elif action == changetweakstepAction: name = m.NAME @@ -283,13 +307,13 @@ class MotorTweak(QWidget, Ui_MotorTweak): msg = 'Tweak step for motor {} at {} {}'.format(name, tv, m.units) tv, ok = QInputDialog.getDouble(self, msg, msg, tv, pow(10, -m.precision), m.slew_speed, m.precision) if ok: - self.motor.put('TWV', tv, wait=True) + m.put('TWV', tv, wait=True) elif action == tozeroAction: m.move(0.0, ignore_limits=True) elif action == stopmotorAction: - self.motor.stop_go = SPMG_STOP if m.stop_go == SPMG_GO else SPMG_GO + m.stop_go = SPMG_STOP if m.stop_go == SPMG_GO else SPMG_GO elif action == autolabelsAction: self._auto_labels = not self._auto_labels @@ -315,7 +339,7 @@ class MotorTweak(QWidget, Ui_MotorTweak): self.update_label() def update_label_template(self): - m = self.motor + m = self._motor source = self._templates_source target = self._templates @@ -340,7 +364,7 @@ class MotorTweak(QWidget, Ui_MotorTweak): qp.end() def _draw_limits(self, qp): - m = self.motor + m = self._motor width, height = self.size().width(), self.size().height() pad = 5 rounding = 2 diff --git a/epics_widgets/SimMotorTweak.py b/epics_widgets/SimMotorTweak.py index 360f20b..82625e0 100644 --- a/epics_widgets/SimMotorTweak.py +++ b/epics_widgets/SimMotorTweak.py @@ -58,9 +58,9 @@ class SimMotorTweak(QWidget, Ui_MotorTweak): def connect_motor(self, rec_name, short_name=None, *args, **kwargs): self.label.setToolTip('{} => {}'.format(rec_name, short_name)) - self.motor=SimMotor(rec_name, short_name) + self._motor=m=SimMotor(rec_name, short_name) self.set_motor_validator() - self._drive_val.setText(str(self.motor._pos)) + self._drive_val.setText(str(m._pos)) self._drive_val.returnPressed.connect(self.move_motor_to_position) self.jog_forward.hide() @@ -68,7 +68,7 @@ class SimMotorTweak(QWidget, Ui_MotorTweak): tweak_min = kwargs.get("tweak_min", 0.0001) tweak_max = kwargs.get("tweak_max", 20.0) - self._tweak_val.setText(str(self.motor._twv)) + self._tweak_val.setText(str(m._twv)) self._tweak_val.setValidator(QDoubleValidator(tweak_min, tweak_max, 4, self._tweak_val)) #self._tweak_val.editingFinished.connect(lambda m=self._pv_tweak_val: m.put(self._tweak_val.text())) self.tweak_forward.clicked.connect(lambda m: self.move_relative(float(self._tweak_val.text()))) @@ -93,8 +93,9 @@ class SimMotorTweak(QWidget, Ui_MotorTweak): def set_motor_validator(self, **kwargs): + m=self._motor lineedit = self._drive_val - min, max = self.motor._llm, self.motor._hlm + min, max = m._llm, m._hlm if min == max: min = -1e6 max = 1e6 @@ -102,15 +103,19 @@ class SimMotorTweak(QWidget, Ui_MotorTweak): def move_relative(self, dist, delay=None): - self.motor._pos += dist + m=self._motor + m._pos += dist if delay: sleep(delay) - _log.debug('{} rel move => {}'.format(self.motor._short_name, dist)) + _log.debug('{} rel move => {}'.format(m._short_name, dist)) self.update_label() self.emit_signals(source_field='VAL') - def get_position(self): - return self.motor._pos + def get_rbv(self): + return self._motor._pos + + def get_val(self): + return self._motor._pos def is_homed(self): return True @@ -140,32 +145,34 @@ class SimMotorTweak(QWidget, Ui_MotorTweak): return True # in (0, 3) def move_motor_to_position(self, drive=None, wait=False, assert_position=False): + m=self._motor if assert_position: wait=True if drive is None: - _log.debug('{} abs target from widget'.format(self.motor._short_name)) + _log.debug('{} abs target from widget'.format(m._short_name)) drive = float(self._drive_val.text()) - _log.debug('{} abs move => {}'.format(self.motor._short_name, drive)) - self.motor._pos=drive + _log.debug('{} abs move => {}'.format(m._short_name, drive)) + m._pos=drive self.update_label() self.emit_signals(source_field='VAL') def emit_signals(self, **kw): + m=self._motor field = kw['source_field'] if field == 'VAL': - self.event_val.emit(self.motor._rec_name, kw) + self.event_val.emit(m._rec_name, kw) elif field == 'RBV': - self.event_readback.emit(self.motor._rec_name, kw) + self.event_readback.emit(m._rec_name, kw) elif field == 'LVIO': - self.event_soft_limit.emit(self.motor._rec_name, kw) + self.event_soft_limit.emit(m._rec_name, kw) elif field == 'HLS': - self.event_high_hard_limit.emit(self.motor._rec_name, kw) - self.event_axis_fault.emit(self.motor._rec_name, kw) + self.event_high_hard_limit.emit(m._rec_name, kw) + self.event_axis_fault.emit(m._rec_name, kw) elif field == 'LVIO': - self.event_low_hard_limit.emit(self.motor._rec_name, kw) - self.event_axis_fault.emit(self.motor._rec_name, kw) + self.event_low_hard_limit.emit(m._rec_name, kw) + self.event_axis_fault.emit(m._rec_name, kw) elif field == 'STAT': - self.event_axis_fault.emit(self.motor._rec_name, kw) + self.event_axis_fault.emit(m._rec_name, kw) def set_val_on_status_change(self, **kw): @@ -194,11 +201,12 @@ class SimMotorTweak(QWidget, Ui_MotorTweak): self._drive_val.setText(v) def update_label(self, **kwargs): - self.label.setText(self._templates[self._label_style].format(rbv=self.motor._pos)) - self._drive_val.setText(f'{self.motor._pos:.3f}') + m=self._motor + self.label.setText(self._templates[self._label_style].format(rbv=m._pos)) + self._drive_val.setText(f'{m._pos:.3f}') twv=float(self._tweak_val.text()) - self.tweak_forward.setToolTip('tweak forward by {:.3f} {}'.format(twv, self.motor._units)) - self.tweak_reverse.setToolTip('tweak reverse by {:.3f} {}'.format(twv, self.motor._units)) + self.tweak_forward.setToolTip('tweak forward by {:.3f} {}'.format(twv, m._units)) + self.tweak_reverse.setToolTip('tweak reverse by {:.3f} {}'.format(twv, m._units)) def tweak_event(self, event): sign = event.angleDelta().y() @@ -278,15 +286,16 @@ class SimMotorTweak(QWidget, Ui_MotorTweak): pass def update_label_template(self): + m=self._motor source = self._templates_source target = self._templates for k in source: target[k] = source[k].format( - short_name=self.motor._short_name, - precision=self.motor._prec, - units=self.motor._units) - self.label.setText(target[self._label_style].format(rbv=self.motor._pos)) + short_name=m._short_name, + precision=m._prec, + units=m._units) + self.label.setText(target[self._label_style].format(rbv=m._pos)) def paintEvent(self, e): qp = QPainter() diff --git a/epics_widgets/SmaractMotorTweak.py b/epics_widgets/SmaractMotorTweak.py index 14c7995..6908228 100644 --- a/epics_widgets/SmaractMotorTweak.py +++ b/epics_widgets/SmaractMotorTweak.py @@ -46,6 +46,7 @@ class SmaractMotorTweak(QWidget, Ui_MotorTweak): def connect_motor(self, motor_base, short_name=None, *args, **kwargs): + # TODO: DO NOT USE so many PVs, but reduce to the only really needed PV: s.a. class QopticZoom(object) self._pvname = motor_base+':DRIVE' self._pv_name = PV(motor_base+':NAME') self._pv_drive = PV(motor_base+':DRIVE') @@ -126,7 +127,7 @@ class SmaractMotorTweak(QWidget, Ui_MotorTweak): sleep(delay) self._pv_drive.put(target) - def get_position(self): + def get_rbv(self): return self._pv_readback.get(use_monitor=False) def is_homed(self): diff --git a/swissmx.py b/swissmx.py index f738d55..1d3206d 100755 --- a/swissmx.py +++ b/swissmx.py @@ -290,7 +290,7 @@ class Main(QMainWindow, Ui_MainWindow): self.prepare_microscope_page() self.prepare_embl_gui() self.prepare_left_tabs() - #self.update_beam_marker(qoptic_zoom.get_position()) #ZAC: orig. code + #self.update_beam_marker(qoptic_zoom.get_sp()) #ZAC: orig. code self._centerpiece_stack.setCurrentIndex(0) self._centerpiece_stack.currentChanged.connect(self.center_piece_update) self.init_validators() @@ -300,7 +300,7 @@ class Main(QMainWindow, Ui_MainWindow): self.create_helical_widgets() #ZAC: orig. code self.center_piece_update(0) # start camera updater - curzoom = app._zoom.get_sp() + curzoom = app._zoom.get_val() _log.debug(f"starting app with zoom at {curzoom}") self.zoom_changed_cb(curzoom) self._tabs_daq_methods.currentChanged.connect(self.switch_task) @@ -973,9 +973,9 @@ class Main(QMainWindow, Ui_MainWindow): app = QApplication.instance() self._tab_daq_method_embl.setLayout(QVBoxLayout()) layout = self._tab_daq_method_embl.layout() - motors = self.get_gonio_motors() + #motors = self.get_gonio_motors() self._embl_module = EmblWidget(self) #ZAC: orig. code - self._embl_module.configure(motors, app._camera, app._zoom) + #self._embl_module.configure(motors, app._camera, app._zoom) layout.addWidget(self._embl_module) def prepare_microscope_page(self): @@ -1074,12 +1074,12 @@ class Main(QMainWindow, Ui_MainWindow): # state = (zoom, fx, fy) (created at first call of self.track_objects() ) app=QApplication.instance() geo=app._geometry - zoom = app._zoom.get_sp() + zoom = app._zoom.get_val() fast_x=self.tweakers["fast_x"];fast_y=self.tweakers["fast_y"] # TODO: get_position() is delayed as it is the RBV. do same as for the zoom # TODO: and return the last set_point - fx=fast_x.get_position() - fy=fast_y.get_position() + fx=fast_x.get_val() + fy=fast_y.get_val() try: tracked=self._goTracked zoom_old,fx_old,fy_old=tracked['state'] @@ -1176,7 +1176,7 @@ class Main(QMainWindow, Ui_MainWindow): self._mouse_pos = pos task = self.active_task() xy = self._goImg.mapFromScene(pos) - z = app._zoom.get_sp() + z = app._zoom.get_val() #_log.debug('mouse_pos:{} scene_pos:{} zoom:{}'.format(pos,xy,z)) #TODO: implement mouse handling # if self._ppm_toolbox._force_ppm > 0: @@ -1217,7 +1217,7 @@ class Main(QMainWindow, Ui_MainWindow): def mouse_click_event_geometry_calib(self, event): app=QApplication.instance() - zoom = app._zoom.get() + zoom = app._zoom.get_val() fast_x=self.tweakers["fast_x"];fast_y=self.tweakers["fast_y"] if self._btn_pix2pos.isChecked(): try: @@ -1225,8 +1225,8 @@ class Main(QMainWindow, Ui_MainWindow): except KeyError as e: raw=app._raw_pix2pos[zoom]=list() imgPos=self._goImg.mapFromScene(event.scenePos()) - fx=fast_x.get_position(); - fy=fast_y.get_position() + fx=fast_x.get_rbv(); + fy=fast_y.get_rbv() x=imgPos.x();y=imgPos.y() _log.debug('append calib: zoom:{} stage_x_y:{}/{} cam_pix_x_y:{}/{}'.format(zoom, fx, fy, x, y)) raw.append((fx, fy, x, y)) @@ -1321,7 +1321,7 @@ class Main(QMainWindow, Ui_MainWindow): event.ignore() return pos = event.scenePos() - zoom_level = app._zoom.get() + zoom_level = app._zoom.get_val() _log.debug(" zoom {}".format(zoom_level)) try: @@ -1440,7 +1440,7 @@ class Main(QMainWindow, Ui_MainWindow): def get_beam_mark_on_camera_xy(self): app=QApplication.instance() - z = app._zoom.get() + z = app._zoom.get_val() try: bx = self.beamx_fitter(z) by = self.beamy_fitter(z) @@ -2125,8 +2125,8 @@ class Main(QMainWindow, Ui_MainWindow): def daq_grid_add_grid(self, gx=None, gy=None): grid_index = len(self._grids) if gx in (False, None): - gx=self.tweakers["fast_x"].get_position() - gy=self.tweakers["fast_y"].get_position() + gx=self.tweakers["fast_x"].get_rbv() + gy=self.tweakers["fast_y"].get_rbv() xstep = self._sb_grid_x_step.value() ystep = self._sb_grid_y_step.value() xoffset = self._sb_grid_x_offset.value() diff --git a/zoom.py b/zoom.py index b7d5d87..084c7f4 100755 --- a/zoom.py +++ b/zoom.py @@ -70,7 +70,7 @@ class Zoom(QGroupBox, Ui_Zoom): buttons=((1, "1"), (200, "200"), (400, "400"), (600, "600"), (800, "800"), (1000, "1000"),) zoom=QApplication.instance()._zoom - current_zoom_value = zoom.get_rb() + current_zoom_value = zoom.get_val() # zoom widgets layout = QVBoxLayout() @@ -306,21 +306,22 @@ class QopticZoom(object): self._pv[name]=pv return pv - def get_rb(self) -> int: - # get_rb somtimes lags. therefore get_sp will get the last set_point without usage of pvs + def get_rbv(self) -> int: + # get_rbv lags. therefore get_val is often the better choicewill get the last set_point without usage of pvs + # default do not get the RBV, because this might be delayed try: - pv = self.getPv('POS_RB') #default do not get the RBV, because this might be delayed + pv = self.getPv('POS_RB') except AttributeError: val=self._val; _log.debug('simulated mode:{}'.format(val)) return val else: return pv.get() - def get_sp(self) -> int: + def get_val(self) -> int: try: val=self._val except AttributeError: - pv=self.getPv('POS_RB') # default do not get the RBV, because this might be delayed + pv=self.getPv('POS_SP') self._val=val=pv.get() return val