Последняя активность 1 month ago

EMWIN Stream decoder

emwin.py Исходник
1#!/usr/bin/env python
2
3import time
4from zipfile import ZipFile
5
6numfiles = 20
7c = 0
8
9def 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
30def 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
49buff = ""
50
51files = {}
52
53while 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)
103