Source code for mesoSPIM.src.mesoSPIM_Zoom

"""
mesoSPIM Module for controlling a discrete zoom changer

Authors: Fabian Voigt, Nikita Vladimirov
"""

import time
import logging
from PyQt5 import QtCore
from .devices.servos.dynamixel.dynamixel import Dynamixel
import serial
logger = logging.getLogger(__name__)

[docs] class DemoZoom(QtCore.QObject): def __init__(self, zoomdict): super().__init__() self.zoomdict = zoomdict
[docs] def set_zoom(self, zoom, wait_until_done=True): if zoom in self.zoomdict: if wait_until_done: time.sleep(0.1)
[docs] class DynamixelZoom(Dynamixel): def __init__(self, zoomdict, COMport, identifier=1, baudrate=115200): super().__init__(COMport, identifier, baudrate) self.zoomdict = zoomdict
[docs] def set_zoom(self, zoom, wait_until_done=True): """Changes zoom after checking that the commanded value exists""" if zoom in self.zoomdict: self._move(self.zoomdict[zoom], wait_until_done) self.zoomvalue = zoom else: raise ValueError('Zoom designation not in the configuration')
[docs] class MitutoyoZoom(QtCore.QObject): def __init__(self, zoomdict, COMport, baudrate=9600): super().__init__() self.port = COMport self.baudrate = baudrate self.zoomdict = zoomdict try: self.revolver_connection = serial.Serial(self.port, self.baudrate, parity=serial.PARITY_EVEN, timeout=5, stopbits=serial.STOPBITS_ONE) self._initialize() except Exception as error: msg = f"Serial connection to Mitutoyo revolver failed, error: {error}" logger.error(msg) print(msg) def _initialize(self): response = self._send_command(b'RRDSTU\r') if response[:9] != 'ROK000001': msg = f"Error in Mitutoyo revolver initialization, response: {response} \nIf response is empty, check if the revolver is connected." logger.error(msg) print(msg) else: logger.info("Mitutoyo revolver initialized") def _send_command(self, command: bytes): try: self._reset_buffers() self.revolver_connection.write(command) message = self.revolver_connection.readline().decode("ascii") logger.debug(f"Serial received: {message} ") return message except Exception as error: logger.error(f"Serial exception of the Mitutoyo revolver: command {command.decode('ascii')}, error: {error}") def _reset_buffers(self): if self.revolver_connection is not None: self.revolver_connection.reset_input_buffer() self.revolver_connection.reset_output_buffer() else: logger.error("Serial port not initialized")
[docs] def set_zoom(self, zoom, wait_until_done=True): if zoom in self.zoomdict: position = self.zoomdict[zoom] assert position in ('A', 'B', 'C', 'D', 'E'), "Revolver position must be one of ('A', 'B', 'C', 'D', 'E')" command = 'RWRMV' + position + '\r' message = self._send_command(command.encode('ascii')) if message != 'ROK\r\n': msg = f"Error in Mitutoyo revolver command, response:{message}." logger.error(msg) print(msg) if wait_until_done: time.sleep(1) # wait for the revolver to move else: return ValueError(f"Zoom {zoom} not in 'zoomdict', check your config file")
def __del__(self): if self.revolver_connection is not None: self.revolver_connection.close() else: pass