def __init__(self, config, settings, imageprocessor): self.config = config self.settings = settings # debug self.image = FSImage() self._logger = logging.getLogger(__name__) self._settings_mode_is_off = True self.camera = None self._image_processor = imageprocessor self.camera = FSCamera() self.serial_connection = FSSerialCom() self.turntable = Turntable(serial_object=self.serial_connection) self.laser = Laser(self.serial_connection) self.led = Led(self.serial_connection) self._logger.debug("Reset FabScanPi HAT...") self.reset_devices() self.laser.off(laser=0) #self.laser.off(laser=1) self.led.off() self.turntable.stop_turning() self._logger.debug("Hardware controller initialized...") self.hardware_test_functions = { "TURNTABLE": { "FUNCTIONS": { "START": self.turntable.start_turning, "STOP": self.turntable.stop_turning }, "LABEL": "Turntable" }, "LEFT_LASER": { "FUNCTIONS": { "ON": lambda: self.laser.on(0), "OFF": lambda: self.laser.off(0) }, "LABEL": "First Laser" }, "RIGHT_LASER": { "FUNCTIONS": { "ON": lambda: self.laser.on(1), "OFF": lambda: self.laser.off(1) }, "LABEL": "Second Laser" }, "LED_RING": { "FUNCTIONS": { "ON": lambda: self.led.on(255, 255, 255), "OFF": lambda: self.led.off() }, "LABEL": "Led Ring" } }
class FSHardwareControllerSingleton(FSHardwareControllerInterface): """ Wrapper class for getting the Laser, Camera, and Turntable classes working together """ def __init__(self, config, settings, imageprocessor): self._logger = logging.getLogger(__name__) self._logger.debug("Constructing FSHardwareControllerSingleton") self.config = config self.settings = settings self._settings_mode_is_off = True self.camera = None self._image_processor = imageprocessor self.camera = FSCamera() self.serial_connection = None # FSSerialCom() self.turntable = Turntable(serial_object=self.serial_connection, config=config) self.laser = Laser(self.serial_connection) self.led = Led(self.serial_connection) self._logger.debug("Reset FabScanPi HAT...") self.laser.off(laser=0) self.laser.off(laser=1) self.led.off() self.turntable.stop_turning() self._logger.debug("Hardware controller initialized...") self.lock = threading.Lock() self.hardware_test_functions = { "TURNTABLE": { "FUNCTIONS": { "START": self.turntable.start_turning, "STOP": self.turntable.stop_turning }, "LABEL": "Turntable" }, "LEFT_LASER": { "FUNCTIONS": { "ON": lambda: self.laser.on(0), "OFF": lambda: self.laser.off(0) }, "LABEL": "First Laser" }, # "RIGHT_LASER": { # "FUNCTIONS": { # "ON": lambda: self.laser.on(1), # "OFF": lambda: self.laser.off(1) # }, # "LABEL": "Second Laser" # }, "LED_RING": { "FUNCTIONS": { "ON": lambda: self.led.on(255, 255, 255), "OFF": lambda: self.led.off() }, "LABEL": "Led Ring" } } def flush(self): self.camera.camera_buffer.flush() #self.serial_connection.flush() def get_devices_as_json(self): devices = {} #copy.deepcopy(self.hardware_test_functions) for fnct in self.hardware_test_functions: devices[fnct] = {} devices[fnct]['FUNCTIONS'] = list(self.hardware_test_functions[fnct]['FUNCTIONS'].keys()) self._logger.debug("devices: " + str(devices)) return devices def call_test_function(self, device): device_name = str(device.name) device_value = str(device.function) #self._logger.debug(device) call_function = self.hardware_test_functions.get(device_name).get("FUNCTIONS").get(device_value) call_function() def settings_mode_on(self): while not self.camera.device.is_idle(): time.sleep(0.1) self.camera.device.start_stream(mode="settings") self._settings_mode_is_off = False self.camera.device.flush_stream() self.laser.on(laser=0) self._logger.debug("finished settings_mode_on") #self.turntable.start_turning() def settings_mode_off(self): self.turntable.stop_turning() self.led.off() self.laser.off(laser=0) self.camera.device.stop_stream() self.camera.device.flush_stream() self._settings_mode_is_off = True time.sleep(0.3) def get_picture(self): img = self.camera.device.get_frame() return img def get_pattern_image(self): self.led.on(110, 110, 110) #self.camera.device.contrast = 40 pattern_image = self.get_picture() self.led.off() return pattern_image def get_laser_image(self, index): #self._hardwarecontroller.led.on(30, 30, 30) self.laser.on(laser=index) time.sleep(3) self.camera.device.flush_stream() laser_image = self.get_picture() self.laser.off(laser=index) return laser_image def scan_at_position(self, steps=180, color=False): ''' Take a step and return an image. Step size calculated to correspond to num_steps_per_rotation Returns resulting image ''' self.turntable.step(steps, speed=900) time.sleep(0.7) img = self.camera.device.get_frame() return img def arduino_is_connected(self): return True #self.serial_connection.is_connected() def get_firmware_version(self): return "undefined" #self.serial_connection.get_firmware_version() def camera_is_connected(self): return self.camera.is_connected() def start_camera_stream(self, mode="default"): self.camera.device.start_stream(mode) def stop_camera_stream(self): self.camera.device.stop_stream()
class FSHardwareControllerSingleton(FSHardwareControllerInterface): """ Wrapper class for getting the Laser, Camera, and Turntable classes working together """ def __init__(self, config, settings, imageprocessor): self.config = config self.settings = settings # debug self.image = FSImage() self._logger = logging.getLogger(__name__) self._settings_mode_is_off = True self.camera = None self._image_processor = imageprocessor self.camera = FSCamera() self.serial_connection = FSSerialCom() self.turntable = Turntable(serial_object=self.serial_connection) self.laser = Laser(self.serial_connection) self.led = Led(self.serial_connection) self._logger.debug("Reset FabScanPi HAT...") self.reset_devices() self._logger.debug("Hardware controller initialized...") self.hardware_test_functions = { "TURNTABLE": { "FUNCTIONS": { "START": self.turntable.start_turning, "STOP": self.turntable.stop_turning }, "LABEL": "Turntable" }, "LEFT_LASER": { "FUNCTIONS": { "ON": lambda: self.laser.on(0), "OFF": lambda: self.laser.off(0) }, "LABEL": "First Laser" }, "RIGHT_LASER": { "FUNCTIONS": { "ON": lambda: self.laser.on(1), "OFF": lambda: self.laser.off(1) }, "LABEL": "Second Laser" }, "LED_RING": { "FUNCTIONS": { "ON": lambda: self.led.on(255, 255, 255), "OFF": lambda: self.led.off() }, "LABEL": "Led Ring" } } def reset_devices(self): for laser_index in range(self.config.file.laser.numbers): self.laser.off(laser_index) self.led.off() self.turntable.stop_turning() self.camera.device.stop_stream() def flush(self): self.camera.camera_buffer.flush() def get_devices_as_json(self): devices = dict() for device in self.hardware_test_functions: devices[device] = dict() devices[device]['FUNCTIONS'] = list(self.hardware_test_functions[device]['FUNCTIONS'].keys()) devices[device]['LABEL'] = self.hardware_test_functions[device]['LABEL'] return devices def call_test_function(self, device): device_name = str(device.name) device_value = str(device.function) #self._logger.debug(device) call_function = self.hardware_test_functions.get(device_name).get("FUNCTIONS").get(device_value) call_function() def settings_mode_on(self): while not self.camera.device.is_idle(): time.sleep(0.1) self.camera.device.start_stream(mode="settings") self._settings_mode_is_off = False self.camera.device.flush_stream() self.laser.on(laser=0) #self.turntable.start_turning() def settings_mode_off(self): self.turntable.stop_turning() self.led.off() self.laser.off(laser=0) self.laser.off(laser=1) self.camera.device.stop_stream() self._settings_mode_is_off = True def get_picture(self, flush=False): if flush: self.camera.device.flush_stream() try: img = self.camera.device.get_frame() except Exception as e: self._logger.error("Error while get_picture: {0}".format(e)) return img def capture(self): img = self.camera.device.capture_frame() return img def get_pattern_image(self): self.led.on(110, 110, 110) #self.camera.device.contrast = 40 pattern_image = self.get_picture() self.led.off() return pattern_image def reset_hardware(self): self.led.off() for i in range(self.config.file.laser.numbers): self.hardwareController.laser.off(i) self.turntable.stop_turning() def get_laser_image(self, index): self.laser.on(laser=index) laser_image = self.get_picture(flush=True) self.laser.off(laser=index) return laser_image def get_image_at_position(self, index=0): ''' Take a step and return an image. Step size calculated to correspond to num_steps_per_rotation Returns resulting image ''' laser_image = self.get_laser_image(index) if self.config.file.laser.interleaved == "True": backrgound_image = self.get_picture(flush=True) laser_image = cv2.subtract(laser_image, backrgound_image) return laser_image def move_to_next_position(self, steps=180, speed=800): self.turntable.step_blocking(steps, speed) def arduino_is_connected(self): return self.serial_connection.is_connected() def get_firmware_version(self): return self.serial_connection.get_firmware_version() def camera_is_connected(self): return self.camera.is_connected() def start_camera_stream(self, mode="default"): self.camera.device.start_stream(mode) def stop_camera_stream(self): self.camera.device.stop_stream() def destroy_camera_device(self): self.camera.device.destroy_camera()