Source code for mesoSPIM.src.devices.joysticks.mesoSPIM_JoystickHandlers

'''
Contains the joystick handlers

Because the signals emitted can only be processed when a QEventLoop is running, you
need something with an eventloop (e.g. a QApplication) even for testing.
'''
from PyQt5 import QtCore

from .Demo_SidePanel import Demo_SidePanel
from .logitech import FarmSimulatorSidePanel

[docs] class Demo_JoystickHandler(QtCore.QObject): def __init__(self, parent = None): super().__init__() # QtCore.QObject.__init__(self) self.parent = parent self.cfg = parent.cfg
[docs] class mesoSPIM_JoystickHandler(QtCore.QObject): def __init__(self, parent = None): super().__init__() # QtCore.QObject.__init__(self) self.parent = parent self.cfg = parent.cfg ''' parent is the window ''' if self.cfg.sidepanel == 'FarmSimulator': self.joystick = FarmSimulatorSidePanel() self.joystick.sig_button_pressed.connect(self.button_handler) self.joystick.sig_mode_changed.connect(self.mode_handler) self.joystick.sig_axis_moved.connect(self.axis_handler) elif self.cfg.sidepanel == 'Demo': self.joystick = Demo_SidePanel() ''' ''' self.SliderChangeCount = 0 @QtCore.pyqtSlot(int) def button_handler(self, button_id): ''' Debugging print statement ''' # print('Button pressed: ', button_id) ''' Laser switching buttons ''' if button_id == 1: self.set_combobox_to_index(self.parent.LaserComboBox,0) if button_id == 2: self.set_combobox_to_index(self.parent.LaserComboBox,1) if button_id == 3: self.set_combobox_to_index(self.parent.LaserComboBox,2) if button_id == 6: self.set_combobox_to_index(self.parent.LaserComboBox,3) if button_id == 7: self.set_combobox_to_index(self.parent.LaserComboBox,4) if button_id == 8: self.set_combobox_to_index(self.parent.LaserComboBox,5) ''' Load & unload samples ''' if button_id == 5: self.parent.sig_unload_sample.emit() if button_id == 10: self.parent.sig_load_sample.emit() ''' Filter & Zoom Increments & decrements ''' if button_id == 11: self.increment_combobox(self.parent.FilterComboBox) if button_id == 12: self.decrement_combobox(self.parent.FilterComboBox) if button_id == 13: self.increment_combobox(self.parent.ZoomComboBox) if button_id == 14: self.decrement_combobox(self.parent.ZoomComboBox) ''' Shutter buttons ''' if button_id == 17: self.set_combobox_to_string(self.parent.ShutterComboBox, 'Both') if button_id == 18: self.set_combobox_to_string(self.parent.ShutterComboBox, 'Both') if button_id == 19: self.set_combobox_to_string(self.parent.ShutterComboBox, 'Left') if button_id == 20: self.set_combobox_to_string(self.parent.ShutterComboBox, 'Right') ''' Live button ''' if button_id == 21: current_state = self.parent.get_state_parameter('state') print('Current state: ',current_state) if current_state == ('live'): self.parent.StopButton.clicked.emit(True) elif current_state == 'idle': self.parent.LiveButton.clicked.emit(True) ''' Increase & decrease laser intensity ''' if button_id == 26: self.increase_slider(self.parent.LaserIntensitySlider, 2) if button_id == 27: self.decrease_slider(self.parent.LaserIntensitySlider, 2) ''' Stop movement button ''' if button_id == 28: self.parent.sig_stop_movement.emit() if button_id == 29: pass
[docs] def set_combobox_to_index(self, combobox, index): if index < combobox.count(): combobox.setCurrentIndex(index)
[docs] def set_combobox_to_string(self, combobox, string): index = combobox.findText(string) ''' Debugging print statement ''' # print('Index: ', index) if index != -1: combobox.setCurrentIndex(index)
[docs] def increment_combobox(self, combobox): index = combobox.currentIndex() index += 1 if index < combobox.count(): combobox.setCurrentIndex(index)
[docs] def decrement_combobox(self, combobox): index = combobox.currentIndex() index -= 1 if index > -1: combobox.setCurrentIndex(index)
[docs] def increase_slider(self, slider, event_devider=2): self.SliderChangeCount += 1 ''' To avoid events coming too quickly, only every n-th event is causing a change if n = event_devider ''' if self.SliderChangeCount % event_devider == 0: value = slider.value() value = value + 1 if value != 100: slider.setValue(value) else: slider.setValue(100)
[docs] def decrease_slider(self, slider, event_devider=2): ''' To avoid events coming too quickly, only every n-th event is causing a change if n = event_devider ''' self.SliderChangeCount += 1 if self.SliderChangeCount % event_devider == 0: value = slider.value() value = value - 1 if value != 0: slider.setValue(value) else: slider.setValue(0)
@QtCore.pyqtSlot(str) def mode_handler(self, str): ''' Helper method to handle mode changes of the joystick. The FarmSimulatorSidePanel has 6 movement axes, 0 to 2 in "blue" LED mode (grey button on the joystick) and 3 to 5 in "red" mode. When starting up, the mode is unknown and has to be found out by registering which axes produce joystick events. ''' ''' Debugging print statement ''' # print('New joystick mode: ', str) if str == '012': self.parent.display_status_message('Joystick Mode: XY Mode') elif str == '345': self.parent.display_status_message('Joystick Mode: ZF Mode') else: self.parent.display_status_message('Joystick Mode: Undefined') @QtCore.pyqtSlot(int, int) def axis_handler(self, axis_id, value): ''' The axis handler deals with joystick movements. The FarmSimulatorSidePanel has 6 movement axes, 0 to 2 in "blue" LED mode (grey button on the joystick) and 3 to 5 in "red" mode. When starting up, the mode is unknown and has to be found out by registering which axes produce joystick events. ''' ''' Debugging print statement ''' # print('Axis: ', axis_id, ',Value: ', value) ''' ''' value = value - 128 if axis_id == 0: self.parent.sig_move_relative.emit({'x_rel':value/5}) elif axis_id == 1: self.parent.sig_move_relative.emit({'y_rel':value/5}) elif axis_id == 3: ''' Some FarmSimulatorSidePanel have a bug which lets them send axis 2 and axis 3 (both rotation motions) at the same time. The following is intended to prevent this to affect the microscope: ''' if self.joystick.mode == '123': pass else: self.parent.sig_move_relative.emit({'f_rel':value/30}) elif axis_id == 4: self.parent.sig_move_relative.emit({'f_rel': value/5}) elif axis_id == 5: self.parent.sig_move_relative.emit({'z_rel': value/5})