Lucas Teske ревизий этого фрагмента 9 years ago. К ревизии
1 file changed, 102 insertions
emwin.py(файл создан)
| @@ -0,0 +1,102 @@ | |||
| 1 | + | #!/usr/bin/env python | |
| 2 | + | ||
| 3 | + | import time | |
| 4 | + | from zipfile import ZipFile | |
| 5 | + | ||
| 6 | + | numfiles = 20 | |
| 7 | + | c = 0 | |
| 8 | + | ||
| 9 | + | def parseEMWINHeader(data): | |
| 10 | + | ||
| 11 | + | if not data[0] == '/': | |
| 12 | + | print "Invalid Header: %s" % data[:80] | |
| 13 | + | return False | |
| 14 | + | ||
| 15 | + | head = data[:80] | |
| 16 | + | filename = head[1:15] | |
| 17 | + | partNumber = head[18:24] | |
| 18 | + | partTotal = head[27:33] | |
| 19 | + | cs = head[36:43] | |
| 20 | + | dateTime = head[46:] | |
| 21 | + | ||
| 22 | + | return { | |
| 23 | + | "filename": filename, | |
| 24 | + | "partNumber": int(partNumber), | |
| 25 | + | "partTotal": int(partTotal), | |
| 26 | + | "cs": int(cs), | |
| 27 | + | "dateTime": dateTime | |
| 28 | + | } | |
| 29 | + | ||
| 30 | + | def findSyncMarker(data): | |
| 31 | + | found = False | |
| 32 | + | pos = -1 | |
| 33 | + | for i in range(len(data)-13): | |
| 34 | + | t = True | |
| 35 | + | for z in range(13): | |
| 36 | + | if z == 12: | |
| 37 | + | if not data[i+z] == '/': | |
| 38 | + | t = False | |
| 39 | + | break | |
| 40 | + | else: | |
| 41 | + | if not ord(data[i+z]) == 0x00: | |
| 42 | + | t = False | |
| 43 | + | break | |
| 44 | + | if t: | |
| 45 | + | pos = i | |
| 46 | + | break | |
| 47 | + | return pos | |
| 48 | + | ||
| 49 | + | buff = "" | |
| 50 | + | ||
| 51 | + | files = {} | |
| 52 | + | ||
| 53 | + | while True: | |
| 54 | + | if c == numfiles: | |
| 55 | + | break | |
| 56 | + | f = open("%s_0.emwin" % c, "rb") | |
| 57 | + | data = f.read() | |
| 58 | + | f.close() | |
| 59 | + | c += 1 | |
| 60 | + | buff += data | |
| 61 | + | pos = findSyncMarker(buff) | |
| 62 | + | if pos == -1: | |
| 63 | + | print "Marker not found" | |
| 64 | + | continue | |
| 65 | + | ||
| 66 | + | buff = buff[pos:] | |
| 67 | + | ||
| 68 | + | if len(buff) < 1116: | |
| 69 | + | #print "Not yet enough data" | |
| 70 | + | continue | |
| 71 | + | ||
| 72 | + | data = buff[pos:pos+1116] | |
| 73 | + | buff = buff[pos+1116:] | |
| 74 | + | data = data[12:] | |
| 75 | + | if len(data) > 0: | |
| 76 | + | header = parseEMWINHeader(data) | |
| 77 | + | if header != False: | |
| 78 | + | data = data[80:] | |
| 79 | + | filename = header["filename"] | |
| 80 | + | partNumber = header["partNumber"] | |
| 81 | + | partTotal = header["partTotal"] | |
| 82 | + | print "Received %s/%s of %s" %(header["partNumber"], header["partTotal"], header["filename"]) | |
| 83 | + | if partNumber == 1: | |
| 84 | + | tstamp = int(round(time.time())) | |
| 85 | + | outFile = "%s-%s" %(tstamp, filename) | |
| 86 | + | files[filename] = { "parts": partTotal, "received": 0, "output": outFile } | |
| 87 | + | ||
| 88 | + | if not filename in files: | |
| 89 | + | print "Received incomplete file %s" %filename | |
| 90 | + | elif files[filename]["received"] + 1 != partNumber: | |
| 91 | + | print "Missed %s frames for file %s" %(partNumber + 1 - partNumber, filename) | |
| 92 | + | else: | |
| 93 | + | f = open("%s" %files[filename]["output"], "wb" if partNumber == 1 else "ab") | |
| 94 | + | f.write(data) | |
| 95 | + | f.close() | |
| 96 | + | files[filename]["received"] += 1 | |
| 97 | + | if partNumber == partTotal and filename in files: | |
| 98 | + | print "Finished file %s" %filename | |
| 99 | + | if ".ZIS" in filename: | |
| 100 | + | f = ZipFile(files[filename]["output"], "r") | |
| 101 | + | f.extractall() | |
| 102 | + | files.pop(filename, None) | |
Новее
Позже