diff options
author | Christian Pointner <equinox@spreadspace.org> | 2013-07-04 01:03:14 +0000 |
---|---|---|
committer | Christian Pointner <equinox@spreadspace.org> | 2013-07-04 01:03:14 +0000 |
commit | 41bdd42671371d68f7b8dd97823cfb8518691664 (patch) | |
tree | b1b36016bf813a9580fa4b18f3c203960bcfd701 /downloader | |
parent | handling of invalid commands (diff) |
improved response handling
git-svn-id: https://svn.spreadspace.org/pic/trunk@32 a09c6847-51d9-44de-8ef2-e725cf50f3c7
Diffstat (limited to 'downloader')
-rwxr-xr-x | downloader/downloader.py | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/downloader/downloader.py b/downloader/downloader.py index c918357..8f3fc3b 100755 --- a/downloader/downloader.py +++ b/downloader/downloader.py @@ -125,22 +125,21 @@ def exec_command(dev, cmd, answer): 3: "not implemented", 4: "flash write error", 5: "address invalid", 6: "address prohibited" } - answer = '<cB' + answer + 'B' - answer_len = struct.calcsize(answer) + answer = '<' + answer + 'B' + answer_len = struct.calcsize(answer) + 2 cstr = cmd + calc_csum(cmd) os.write(dev, cstr) astr = b'' - while len(astr) < answer_len: + while len(astr) < 2: astr += os.read(dev, answer_len - len(astr)) - data = list(struct.unpack(answer, astr)) - code = data.pop(0) - ret = data.pop(1) - checksum = data.pop() - if code != cmd[0]: + + if astr[0] != cmd[0]: print "ERROR: bootloader returned wrong command code" sys.exit(4) + + ret = ord(astr[1]) if ret != 0: rstr = "invalid return code" try: @@ -149,6 +148,11 @@ def exec_command(dev, cmd, answer): pass print "ERROR: bootloader returned %d: %s" % (ret, rstr) sys.exit(4) + + while len(astr) < answer_len: + astr += os.read(dev, answer_len - len(astr)) + + data = struct.unpack_from(answer, astr, 2) if 0 != calc_csum(astr): print "ERROR: checksum error" sys.exit(4) |