diff --git a/pyad2usb/ad2usb.py b/pyad2usb/ad2usb.py index 46bd08c..e7de0ac 100644 --- a/pyad2usb/ad2usb.py +++ b/pyad2usb/ad2usb.py @@ -188,12 +188,12 @@ class AD2USB(object): """ pass - def open(self, baudrate=None, interface=None, index=None): + def open(self, baudrate=None, interface=None, index=None, no_read_thread=False): """ Opens the device. """ self._wire_events() - self._device.open(baudrate=baudrate, interface=interface, index=index) + self._device.open(baudrate=baudrate, interface=interface, index=index, no_read_thread=no_read_thread) def close(self): """ diff --git a/pyad2usb/devices.py b/pyad2usb/devices.py index e54772a..be064fc 100644 --- a/pyad2usb/devices.py +++ b/pyad2usb/devices.py @@ -110,7 +110,7 @@ class USBDevice(Device): self._read_thread = Device.ReadThread(self) - def open(self, baudrate=BAUDRATE, interface=None, index=0): + def open(self, baudrate=BAUDRATE, interface=None, index=0, no_read_thread=False): """ Opens the device. """ @@ -143,7 +143,8 @@ class USBDevice(Device): raise util.CommError('Error opening AD2USB device: {0}'.format(str(err))) else: self._running = True - self._read_thread.start() + if not no_read_thread: + self._read_thread.start() self.on_open((self._serial_number, self._description)) @@ -164,7 +165,13 @@ class USBDevice(Device): self.on_close() - def close_reader(self): + def is_reader_alive(self): + """ + Indicates whether or not the reader thread is alive. + """ + return self._read_thread.is_alive() + + def stop_reader(self): """ Stops the reader thread. """ @@ -266,7 +273,7 @@ class SerialDevice(Device): """ pass - def open(self, baudrate=BAUDRATE, interface=None, index=None): + def open(self, baudrate=BAUDRATE, interface=None, index=None, no_read_thread=False): """ Opens the device. """ @@ -294,7 +301,8 @@ class SerialDevice(Device): self._running = True self.on_open((None, "AD2SERIAL")) # TODO: Fixme. - self._read_thread.start() + if not no_read_thread: + self._read_thread.start() def close(self): """ @@ -310,7 +318,13 @@ class SerialDevice(Device): self.on_close() - def close_reader(self): + def is_reader_alive(self): + """ + Indicates whether or not the reader thread is alive. + """ + return self._read_thread.is_alive() + + def stop_reader(self): """ Stops the reader thread. """ @@ -398,7 +412,7 @@ class SocketDevice(Device): """ pass - def open(self, baudrate=None, interface=None, index=0): + def open(self, baudrate=None, interface=None, index=0, no_read_thread=False): """ Opens the device. """ @@ -416,7 +430,9 @@ class SocketDevice(Device): self._running = True self.on_open((None, "AD2SOCKET")) # TEMP: Change me. - self._read_thread.start() + + if not no_read_thread: + self._read_thread.start() def close(self): """ @@ -433,7 +449,13 @@ class SocketDevice(Device): self.on_close() - def close_reader(self): + def is_reader_alive(self): + """ + Indicates whether or not the reader thread is alive. + """ + return self._read_thread.is_alive() + + def stop_reader(self): """ Stops the reader thread. """ diff --git a/pyad2usb/util.py b/pyad2usb/util.py index e0a115c..f31e231 100644 --- a/pyad2usb/util.py +++ b/pyad2usb/util.py @@ -113,12 +113,13 @@ class Firmware(object): stage_callback(Firmware.STAGE_START) - # Close the reader thread and wait for it to die, otherwise - # it interferes with our reading. - dev.close_reader() - while dev._read_thread.is_alive(): - stage_callback(Firmware.STAGE_WAITING) - time.sleep(1) + if dev.is_reader_alive(): + # Close the reader thread and wait for it to die, otherwise + # it interferes with our reading. + dev.stop_reader() + while dev._read_thread.is_alive(): + stage_callback(Firmware.STAGE_WAITING) + time.sleep(1) try: # Reboot the device and wait for the boot loader. diff --git a/test.py b/test.py index 44cde72..a86c2ff 100755 --- a/test.py +++ b/test.py @@ -55,7 +55,8 @@ def handle_firmware(stage): sys.stdout.write('.') sys.stdout.flush() elif stage == pyad2usb.ad2usb.util.Firmware.STAGE_BOOT: - print "\r\nRebooting device.." + if handle_firmware.wait_tick > 0: print "" + print "Rebooting device.." elif stage == pyad2usb.ad2usb.util.Firmware.STAGE_LOAD: print 'Waiting for boot loader..' elif stage == pyad2usb.ad2usb.util.Firmware.STAGE_UPLOADING: @@ -73,7 +74,7 @@ def handle_firmware(stage): def upload_usb(): dev = pyad2usb.ad2usb.devices.USBDevice() - dev.open() + dev.open(no_read_thread=True) pyad2usb.ad2usb.util.Firmware.upload(dev, 'tmp/ademcoemu_V2_2a_6.hex', handle_firmware) dev.close() @@ -204,6 +205,20 @@ def test_socket(): a2u.close() +def test_no_read_thread(): + a2u = pyad2usb.ad2usb.Overseer.create() + + a2u.on_open += handle_open + a2u.on_close += handle_close + a2u.on_read += handle_read + a2u.on_write += handle_write + + a2u.open(no_read_thread=True) + + print 'alive?', a2u._device._read_thread.is_alive() + + a2u.close() + try: signal.signal(signal.SIGINT, signal_handler) @@ -214,11 +229,13 @@ try: #test_usb_serial() #test_factory() #test_factory_watcher() - #upload_usb() + upload_usb() #upload_usb_serial() - test_socket() + #test_socket() #upload_socket() + #test_no_read_thread() + except Exception, err: traceback.print_exc(err)