Última atividade 1 month ago

EMWIN Stream decoder

racerxdl's Avatar Lucas Teske revisou este gist 9 years ago. Ir para a revisão

1 file changed, 102 insertions

emwin.py(arquivo criado)

@@ -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)
Próximo Anterior