import queue import logging from pyaxidraw import axidraw from queue import Queue from threading import Event from sorteerhoed.Signal import Signal import time class Plotter: def __init__(self, config, eventQ: Queue, runningEvent: Event): self.config = config self.eventQ = eventQ self.q = Queue() self.isRunning = runningEvent self.logger = logging.getLogger("sorteerhoed").getChild("plotter") def start(self): self.axiDrawCueListener() def axiDrawCueListener(self): if self.config['dummy_plotter']: while self.isRunning.is_set(): plotterRan = False try: move = self.q.get(True, 1) plotterRan = True except queue.Empty as e: self.logger.log(5, "Empty queue.") if plotterRan: plotterRan = False self.eventQ.put(Signal('plotter.finished')) else: time.sleep(.05) self.logging.debug(f'Dummy plotter move: {move}') self.logger.info("Stopping dummy plotter") else: ad = axidraw.AxiDraw() ad.interactive() connected = ad.connect() if not connected: raise Exception("Cannot connect to Axidraw") try: ad.options.units = 1 # set to use centimeters instead of inches ad.options.accel = 100; ad.options.speed_penup = 100 ad.options.speed_pendown = 100 ad.options.model = 2 # A3, set to 1 for A4 ad.moveto(0,0) plotterWidth = 22 plotterHeight = 18 # 16? plotterRan = False while self.isRunning.is_set(): # TODO: set timeout on .get() with catch block, so we can escape if no moves come in try: move = self.q.get(True, 1) plotterRan = True except queue.Empty as e: self.logger.log(5, "Empty queue.") if plotterRan: plotterRan = False self.eventQ.put(Signal('plotter.finished')) else: ad.moveto(move[0]* plotterWidth, move[1]*plotterHeight) self.logging.debug(f'handler! {move}') except Exception as e: self.logger.exception(e) finally: self.logger.warning("Close Axidraw connection") ad.moveto(0,0) ad.disconnect() # send shutdown signal (if not already set) self.isRunning.clear()