@@ -188,12 +188,12 @@ class AD2USB(object): | |||||
""" | """ | ||||
pass | 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. | Opens the device. | ||||
""" | """ | ||||
self._wire_events() | 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): | def close(self): | ||||
""" | """ | ||||
@@ -110,7 +110,7 @@ class USBDevice(Device): | |||||
self._read_thread = Device.ReadThread(self) | 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. | Opens the device. | ||||
""" | """ | ||||
@@ -143,7 +143,8 @@ class USBDevice(Device): | |||||
raise util.CommError('Error opening AD2USB device: {0}'.format(str(err))) | raise util.CommError('Error opening AD2USB device: {0}'.format(str(err))) | ||||
else: | else: | ||||
self._running = True | self._running = True | ||||
self._read_thread.start() | if not no_read_thread: | ||||
self._read_thread.start() | |||||
self.on_open((self._serial_number, self._description)) | self.on_open((self._serial_number, self._description)) | ||||
@@ -164,7 +165,13 @@ class USBDevice(Device): | |||||
self.on_close() | 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. | Stops the reader thread. | ||||
""" | """ | ||||
@@ -266,7 +273,7 @@ class SerialDevice(Device): | |||||
""" | """ | ||||
pass | 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. | Opens the device. | ||||
""" | """ | ||||
@@ -294,7 +301,8 @@ class SerialDevice(Device): | |||||
self._running = True | self._running = True | ||||
self.on_open((None, "AD2SERIAL")) # TODO: Fixme. | self.on_open((None, "AD2SERIAL")) # TODO: Fixme. | ||||
self._read_thread.start() | if not no_read_thread: | ||||
self._read_thread.start() | |||||
def close(self): | def close(self): | ||||
""" | """ | ||||
@@ -310,7 +318,13 @@ class SerialDevice(Device): | |||||
self.on_close() | 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. | Stops the reader thread. | ||||
""" | """ | ||||
@@ -398,7 +412,7 @@ class SocketDevice(Device): | |||||
""" | """ | ||||
pass | 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. | Opens the device. | ||||
""" | """ | ||||
@@ -416,7 +430,9 @@ class SocketDevice(Device): | |||||
self._running = True | self._running = True | ||||
self.on_open((None, "AD2SOCKET")) # TEMP: Change me. | self.on_open((None, "AD2SOCKET")) # TEMP: Change me. | ||||
self._read_thread.start() | if not no_read_thread: | ||||
self._read_thread.start() | |||||
def close(self): | def close(self): | ||||
""" | """ | ||||
@@ -433,7 +449,13 @@ class SocketDevice(Device): | |||||
self.on_close() | 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. | Stops the reader thread. | ||||
""" | """ | ||||
@@ -113,12 +113,13 @@ class Firmware(object): | |||||
stage_callback(Firmware.STAGE_START) | stage_callback(Firmware.STAGE_START) | ||||
# Close the reader thread and wait for it to die, otherwise | if dev.is_reader_alive(): | ||||
# it interferes with our reading. | # Close the reader thread and wait for it to die, otherwise | ||||
dev.close_reader() | # it interferes with our reading. | ||||
while dev._read_thread.is_alive(): | dev.stop_reader() | ||||
stage_callback(Firmware.STAGE_WAITING) | while dev._read_thread.is_alive(): | ||||
time.sleep(1) | stage_callback(Firmware.STAGE_WAITING) | ||||
time.sleep(1) | |||||
try: | try: | ||||
# Reboot the device and wait for the boot loader. | # Reboot the device and wait for the boot loader. | ||||
@@ -55,7 +55,8 @@ def handle_firmware(stage): | |||||
sys.stdout.write('.') | sys.stdout.write('.') | ||||
sys.stdout.flush() | sys.stdout.flush() | ||||
elif stage == pyad2usb.ad2usb.util.Firmware.STAGE_BOOT: | 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: | elif stage == pyad2usb.ad2usb.util.Firmware.STAGE_LOAD: | ||||
print 'Waiting for boot loader..' | print 'Waiting for boot loader..' | ||||
elif stage == pyad2usb.ad2usb.util.Firmware.STAGE_UPLOADING: | elif stage == pyad2usb.ad2usb.util.Firmware.STAGE_UPLOADING: | ||||
@@ -73,7 +74,7 @@ def handle_firmware(stage): | |||||
def upload_usb(): | def upload_usb(): | ||||
dev = pyad2usb.ad2usb.devices.USBDevice() | 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) | pyad2usb.ad2usb.util.Firmware.upload(dev, 'tmp/ademcoemu_V2_2a_6.hex', handle_firmware) | ||||
dev.close() | dev.close() | ||||
@@ -204,6 +205,20 @@ def test_socket(): | |||||
a2u.close() | 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: | try: | ||||
signal.signal(signal.SIGINT, signal_handler) | signal.signal(signal.SIGINT, signal_handler) | ||||
@@ -214,11 +229,13 @@ try: | |||||
#test_usb_serial() | #test_usb_serial() | ||||
#test_factory() | #test_factory() | ||||
#test_factory_watcher() | #test_factory_watcher() | ||||
#upload_usb() | upload_usb() | ||||
#upload_usb_serial() | #upload_usb_serial() | ||||
test_socket() | #test_socket() | ||||
#upload_socket() | #upload_socket() | ||||
#test_no_read_thread() | |||||
except Exception, err: | except Exception, err: | ||||
traceback.print_exc(err) | traceback.print_exc(err) |