diff --git a/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py b/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py index c44ec45..44401cc 100644 --- a/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py +++ b/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py @@ -465,6 +465,116 @@ class FlomniSampleTransferMixin: def laser_tracker_off(self): dev.rtx.controller.laser_tracker_off() + def laser_parameters_show_all(self): + dev.rtx.controller.emitter_show_all() + + def laser_parameters_set_targety(self, val: float): + dev.rtx.controller.emitter_set_tracking_target_y(val) + + def laser_parameters_set_targetz(self, val: float): + dev.rtx.controller.emitter_set_tracking_target_z(val) + + def laser_parameters_set_intensity_threshold_laser(self, val: float): + dev.rtx.controller.emitter_set_intensity_threshold_laser(val) + + def laser_parameters_set_psd_intensity_threshold_tracking_low(self, val: float): + dev.rtx.controller.emitter_set_psd_intensity_threshold_tracking_low(val) + + def laser_tweak(self): + """Interactive tweak of the two laser tracking target positions. + + Arrow keys nudge the ConstEmitter tracking targets by a fixed step of + 0.01 (absolute set of current +/- step): + left / right : target y -/+ + up / down : target z +/- + Keys: + s : return both targets to the positions they had at launch + q : quit + + After every change the current y/z targets and the fzp x interferometer + signal strength (channel 1) are printed, so one can watch the signal + respond while tweaking. + """ + import fcntl + import sys + import termios + import tty + + step = 0.01 + controller = dev.rtx.controller + + def read_targets(): + values = controller.emitter_get() + return ( + values["targetpos_tracking_y"], + values["targetpos_tracking_z"], + ) + + def signal_fzpx(): + # second channel (index 1) of show_signal_strength_interferometer, + # i.e. the fzp x channel / tracker signal + return controller.read_ssi_interferometer(1) + + def print_status(): + target_y, target_z = read_targets() + print( + f"\rtarget y: {target_y:.4f} target z: {target_z:.4f} " + f"fzp x signal: {signal_fzpx():.1f}\r" + ) + + # capture launch positions for the 's' (return to start) command + start_y, start_z = read_targets() + + print( + "Laser tweak. " + + self.OMNYTools.BOLD + + self.OMNYTools.OKBLUE + + "left/right: target y, up/down: target z, s: start pos, q: quit\r" + + self.OMNYTools.ENDC + ) + print_status() + + fd = sys.stdin.fileno() + old_term = termios.tcgetattr(fd) + try: + tty.setraw(fd) + old_flags = fcntl.fcntl(fd, fcntl.F_GETFL) + fcntl.fcntl(fd, fcntl.F_SETFL, old_flags | os.O_NONBLOCK) + while True: + try: + key = sys.stdin.read(1) + if key == "q": + print("\n\rExiting tweak mode\r") + break + elif key == "s": + controller.emitter_set_tracking_target_y(start_y) + controller.emitter_set_tracking_target_z(start_z) + print("\rReturned to start positions\r") + print_status() + elif key == "\x1b": # escape sequences for arrow keys + next1, next2 = sys.stdin.read(2) + if next1 == "[": + target_y, target_z = read_targets() + if next2 == "A": # up: target z + + controller.emitter_set_tracking_target_z(target_z + step) + print_status() + elif next2 == "B": # down: target z - + controller.emitter_set_tracking_target_z(target_z - step) + print_status() + elif next2 == "C": # right: target y + + controller.emitter_set_tracking_target_y(target_y + step) + print_status() + elif next2 == "D": # left: target y - + controller.emitter_set_tracking_target_y(target_y - step) + print_status() + except IOError: + pass + + time.sleep(0.02) + finally: + termios.tcsetattr(fd, termios.TCSADRAIN, old_term) + fcntl.fcntl(fd, fcntl.F_SETFL, old_flags) + def umvr_fsamy_tracked(self, shift: float, step: float = 0.01, _internal: bool = False): """ Relative move of fsamy by `shift` mm, broken into steps of at most