|
@@ -1,18 +1,33 @@
|
|
|
from modbus import Modbus, MBError, NoResponseError
|
|
|
+import time
|
|
|
|
|
|
class IO_Module(Modbus):
|
|
|
def __init__(self, tty: str, brate: int, address: int):
|
|
|
super().__init__(tty, brate, address)
|
|
|
+ self.update_segment_number = 0
|
|
|
|
|
|
def iap_start(self):
|
|
|
"""Reboot device in IAP mode"""
|
|
|
request = bytes((self.address, 0x41, 0x01))
|
|
|
response = self.raw_communicate(request + self._crc(request))
|
|
|
|
|
|
-
|
|
|
+ def write_fw_start(self, size: int):
|
|
|
+ """Ask device to start update"""
|
|
|
+ self.update_segment_number = 0
|
|
|
+ request = bytes((self.address, 0x41, 0x01, 0xEF, 0xBE, 0xAD, 0xDE)) + size.to_bytes(4, 'big')
|
|
|
+ response = self.raw_communicate(request + self._crc(request), 5)
|
|
|
+ if len(response) == 0:
|
|
|
+ raise NoResponseError('No response on WRITE_START command')
|
|
|
+ if len(response) != 5:
|
|
|
+ raise MBError('Incorrect response length')
|
|
|
+ if response[:3] != bytes((self.address, 0x41, 0x01)):
|
|
|
+ raise MBError('Incorrect response')
|
|
|
|
|
|
def update(self):
|
|
|
self.iap_start()
|
|
|
+ time.sleep(4)
|
|
|
+ self.write_fw_start(123)
|
|
|
+
|
|
|
|
|
|
|
|
|
|
|
@@ -21,6 +36,7 @@ def main():
|
|
|
|
|
|
dev.update()
|
|
|
|
|
|
+
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
main()
|