| @@ -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): | |||
| """ | |||
| @@ -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. | |||
| """ | |||
| @@ -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. | |||
| @@ -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) | |||