Made SocketDevice behave similarly to the others with regards to blocking. Added ability to retrieve current configuration string.pyserial_fix
@@ -243,7 +243,9 @@ class AlarmDecoder(object): | |||||
""" | """ | ||||
Sets configuration entries on the device. | Sets configuration entries on the device. | ||||
""" | """ | ||||
config_string = '' | |||||
self.send("C{0}\r".format(self.get_config_string())) | |||||
def get_config_string(self): | |||||
config_entries = [] | config_entries = [] | ||||
# HACK: This is ugly.. but I can't think of an elegant way of doing it. | # HACK: This is ugly.. but I can't think of an elegant way of doing it. | ||||
@@ -258,9 +260,7 @@ class AlarmDecoder(object): | |||||
config_entries.append(('DEDUPLICATE', 'Y' if self.deduplicate else 'N')) | config_entries.append(('DEDUPLICATE', 'Y' if self.deduplicate else 'N')) | ||||
config_entries.append(('MODE', PANEL_TYPES.keys()[PANEL_TYPES.values().index(self.mode)])) | config_entries.append(('MODE', PANEL_TYPES.keys()[PANEL_TYPES.values().index(self.mode)])) | ||||
config_string = '&'.join(['='.join(t) for t in config_entries]) | |||||
self.send("C{0}\r".format(config_string)) | |||||
return '&'.join(['='.join(t) for t in config_entries]) | |||||
def reboot(self): | def reboot(self): | ||||
""" | """ | ||||
@@ -20,6 +20,7 @@ import threading | |||||
import serial | import serial | ||||
import serial.tools.list_ports | import serial.tools.list_ports | ||||
import socket | import socket | ||||
import select | |||||
from .util import CommError, TimeoutError, NoDeviceError, InvalidMessageError | from .util import CommError, TimeoutError, NoDeviceError, InvalidMessageError | ||||
from .event import event | from .event import event | ||||
@@ -1002,7 +1003,6 @@ class SocketDevice(Device): | |||||
self._init_ssl() | self._init_ssl() | ||||
self._device.connect((self._host, self._port)) | self._device.connect((self._host, self._port)) | ||||
#self._device.setblocking(1) | |||||
if self._use_ssl: | if self._use_ssl: | ||||
while True: | while True: | ||||
@@ -1082,7 +1082,10 @@ class SocketDevice(Device): | |||||
data = None | data = None | ||||
try: | try: | ||||
data = self._device.recv(1) | |||||
read_ready, _, _ = select.select([self._device], [], [], 0) | |||||
if (len(read_ready) != 0): | |||||
data = self._device.recv(1) | |||||
except socket.error, err: | except socket.error, err: | ||||
raise CommError('Error while reading from device: {0}'.format(str(err)), err) | raise CommError('Error while reading from device: {0}'.format(str(err)), err) | ||||
@@ -1119,6 +1122,12 @@ class SocketDevice(Device): | |||||
try: | try: | ||||
while timeout_event.reading: | while timeout_event.reading: | ||||
read_ready, _, _ = select.select([self._device], [], [], 0) | |||||
if (len(read_ready) == 0): | |||||
time.sleep(0.01) | |||||
continue | |||||
buf = self._device.recv(1) | buf = self._device.recv(1) | ||||
if buf != '': | if buf != '': | ||||
@@ -1130,6 +1139,7 @@ class SocketDevice(Device): | |||||
if len(self._buffer) > 0: | if len(self._buffer) > 0: | ||||
got_line = True | got_line = True | ||||
break | break | ||||
else: | else: | ||||
time.sleep(0.01) | time.sleep(0.01) | ||||
@@ -44,6 +44,7 @@ class UploadError(Exception): | |||||
""" | """ | ||||
pass | pass | ||||
class UploadChecksumError(UploadError): | class UploadChecksumError(UploadError): | ||||
""" | """ | ||||
The firmware upload failed due to a checksum error. | The firmware upload failed due to a checksum error. | ||||
@@ -172,11 +173,12 @@ class Firmware(object): | |||||
# Reboot the device and wait for the boot loader. | # Reboot the device and wait for the boot loader. | ||||
retry = 3 | retry = 3 | ||||
found_loader = False | |||||
while retry > 0: | while retry > 0: | ||||
try: | try: | ||||
stage_callback(Firmware.STAGE_BOOT) | stage_callback(Firmware.STAGE_BOOT) | ||||
dev.write("=") | dev.write("=") | ||||
read_until('......', timeout=15.0) | |||||
read_until('!boot', timeout=15.0) | |||||
# Get ourselves into the boot loader and wait for indication | # Get ourselves into the boot loader and wait for indication | ||||
# that it's ready for the firmware upload. | # that it's ready for the firmware upload. | ||||
@@ -188,11 +190,15 @@ class Firmware(object): | |||||
retry -= 1 | retry -= 1 | ||||
else: | else: | ||||
retry = 0 | retry = 0 | ||||
found_loader = True | |||||
# And finally do the upload. | # And finally do the upload. | ||||
try: | |||||
do_upload() | |||||
except UploadError, err: | |||||
stage_callback(Firmware.STAGE_ERROR, error=err) | |||||
if found_loader: | |||||
try: | |||||
do_upload() | |||||
except UploadError, err: | |||||
stage_callback(Firmware.STAGE_ERROR, error=str(err)) | |||||
else: | |||||
stage_callback(Firmware.STAGE_DONE) | |||||
else: | else: | ||||
stage_callback(Firmware.STAGE_DONE) | |||||
stage_callback(Firmware.STAGE_ERROR, error="Error entering bootloader.") |