class BarcodeReader(DeviceBase): def doInitialize(self): self.disable() self.readout = None self.processing = False self.task_callable=None def enable(self): microscan_cmd.write("") self.setState(State.Ready) def disable(self): microscan_cmd.write("") self.setState(State.Disabled) def get(self,timeout=1.0): self.state.assertReady() try: self.setState(State.Busy) microscan.flush() ret = microscan.waitString(int(timeout * 1000)) if ret is not None: ret = ret.strip() self.setCache(ret, None) return ret except: self.setCache(None, None) return None finally: if self.state == State.Busy: self.setState(State.Ready) def doUpdate(self): self.get() def read(self,timeout=1.0): if self.processing: raise Exception("Ongoing read operation") self.processing = True try: initial = self.state if initial == State.Disabled: self.enable() try: return self.get(timeout) finally: if initial == State.Disabled: self.disable() finally: self.processing = False def _read_task(self, timeout): global readout self.readout = self.read(timeout) return self.readout def start_read(self, timeout=1.0): self.readout = None self.task_callable = fork((self._read_task, (timeout,))) def get_readout(self): return self.readout def wait_readout(self): if self.task_callable is not None: join(self.task_callable) self.task_callable = None return self.readout add_device(BarcodeReader("barcode_reader"), force = True)