Skip to content

Commit 508ea1d

Browse files
committed
firmware: profile: different reset timeout for local/remote XBee and protocol
Currently, the XBee 3 modules need different amount of seconds to reset and join the network after a remote firmware update: * XBee 3 DigiMesh modules need ~20 seconds * XBee 3 802.15.4 modules need ~28 seconds * XBee 3 ZigBee modules need ~3 seconds This commit define different default timeouts depending on the XBee protocol for remote updates. Signed-off-by: Tatiana Leon <tatiana.leon@digi.com>
1 parent 404e3ed commit 508ea1d

File tree

1 file changed

+42
-2
lines changed

1 file changed

+42
-2
lines changed

digi/xbee/firmware.py

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@
7373

7474
_DEVICE_BREAK_RESET_TIMEOUT = 10 # seconds
7575
_DEVICE_CONNECTION_RETRIES = 3
76-
_DEVICE_RESET_TIMEOUT = 3 # seconds
7776

7877
_ERROR_BOOTLOADER_MODE = "Could not enter in bootloader mode"
7978
_ERROR_COMPATIBILITY_NUMBER = "Device compatibility number (%d) is greater than the firmware one (%d)"
@@ -998,14 +997,21 @@ def _check_bootloader_update_required(self):
998997

999998
return False
1000999

1000+
@abstractmethod
1001+
def _get_default_reset_timeout(self):
1002+
"""
1003+
Returns the default timeout to wait for reset.
1004+
"""
1005+
pass
1006+
10011007
def _wait_for_target_reset(self):
10021008
"""
10031009
Waits for the device to reset using the xml firmware file specified timeout or the default one.
10041010
"""
10051011
if self._xml_update_timeout_ms is not None:
10061012
time.sleep(self._xml_update_timeout_ms / 1000.0)
10071013
else:
1008-
time.sleep(_DEVICE_RESET_TIMEOUT)
1014+
time.sleep(self._get_default_reset_timeout())
10091015

10101016
def update_firmware(self):
10111017
"""
@@ -1163,6 +1169,8 @@ class _LocalFirmwareUpdater(_XBeeFirmwareUpdater):
11631169
Helper class used to handle the local firmware update process.
11641170
"""
11651171

1172+
__DEVICE_RESET_TIMEOUT = 3 # seconds
1173+
11661174
def __init__(self, target, xml_firmware_file, xbee_firmware_file=None, bootloader_firmware_file=None,
11671175
timeout=_READ_DATA_TIMEOUT, progress_callback=None):
11681176
"""
@@ -1691,12 +1699,25 @@ def _transfer_firmware_file_xmodem(self, firmware_file_path):
16911699
except XModemException as e:
16921700
raise FirmwareUpdateException(str(e))
16931701

1702+
def _get_default_reset_timeout(self):
1703+
"""
1704+
Override.
1705+
1706+
.. seealso::
1707+
| :meth:`._XBeeFirmwareUpdater._get_default_reset_timeout`
1708+
"""
1709+
return self.__class__.__DEVICE_RESET_TIMEOUT
1710+
16941711

16951712
class _RemoteFirmwareUpdater(_XBeeFirmwareUpdater):
16961713
"""
16971714
Helper class used to handle the remote firmware update process.
16981715
"""
16991716

1717+
__DEVICE_RESET_TIMEOUT_ZB = 3 # seconds
1718+
__DEVICE_RESET_TIMEOUT_DM = 20 # seconds
1719+
__DEVICE_RESET_TIMEOUT_802 = 28 # seconds
1720+
17001721
def __init__(self, remote_device, xml_firmware_file, ota_firmware_file=None, otb_firmware_file=None,
17011722
timeout=_READ_DATA_TIMEOUT, progress_callback=None):
17021723
"""
@@ -2499,6 +2520,25 @@ def _finish_firmware_update(self):
24992520
else:
25002521
self._exit_with_error(_ERROR_SEND_UPGRADE_END_RESPONSE % "Timeout sending frame")
25012522

2523+
def _get_default_reset_timeout(self):
2524+
"""
2525+
Override.
2526+
2527+
.. seealso::
2528+
| :meth:`._XBeeFirmwareUpdater._get_default_reset_timeout`
2529+
"""
2530+
protocol = self._remote_device.get_protocol()
2531+
if protocol == XBeeProtocol.ZIGBEE:
2532+
return self.__class__.__DEVICE_RESET_TIMEOUT_ZB
2533+
elif protocol == XBeeProtocol.DIGI_MESH:
2534+
return self.__class__.__DEVICE_RESET_TIMEOUT_DM
2535+
elif protocol == XBeeProtocol.RAW_802_15_4:
2536+
return self.__class__.__DEVICE_RESET_TIMEOUT_802
2537+
2538+
return max([self.__class__.__DEVICE_RESET_TIMEOUT_ZB,
2539+
self.__class__.__DEVICE_RESET_TIMEOUT_DM,
2540+
self.__class__.__DEVICE_RESET_TIMEOUT_802])
2541+
25022542

25032543
def update_local_firmware(target, xml_firmware_file, xbee_firmware_file=None, bootloader_firmware_file=None,
25042544
timeout=None, progress_callback=None):

0 commit comments

Comments
 (0)