7 from typing import List
9 class ParseError(RuntimeError):
20 return self.x.popleft()
37 return (hi << 16) + lo
39 def next_u32_swapped(self):
40 hi = self.next_u16le()
42 return (hi << 16) + lo
45 return " ".join(["{:02x}".format(b) for b in self.x])
48 self.reg = self.next_u32()
49 self.text = "{:08x}".format(self.reg)
51 def _parse_reg_swapped(self):
52 self.reg = self.next_u32_swapped()
53 self.text = "{:08x}".format(self.reg)
55 def _parse_null(self):
60 "name": "REQUEST_INFO",
69 "parser": _parse_reg_swapped,
73 "parser": _parse_null,
77 "parser": _parse_null,
81 "parser": _parse_reg_swapped,
89 "parser": _parse_null,
93 "parser": _parse_reg_swapped,
97 "parser": _parse_reg_swapped,
103 if self.next_u8() != 0xdc:
104 raise ParseError("Missing SOF")
105 self.src = self.next_u8() ^ 0x80
106 self.dst = self.next_u8()
107 if self.next_u8() != len(self.orig):
108 raise ParseError("Invalid length byte")
109 self.op = self.next_u8()
111 # Remove CRC from the end
113 raise ParseError("Missing CRC")
118 # Which operation it is?
119 if self.op in Frame.op_table:
120 op_def = Frame.op_table[self.op]
121 self.op_name = op_def["name"]
122 op_def["parser"](self)
124 raise ParseError("Unknown OP")
127 rest = self.dump_rest()
128 return ("{:02x} -> {:02x} {}".format(self.src, self.dst, self.op_name) +
129 (" " if len(self.text) else "") +
131 (": " if len(rest) else "") +
134 def parse(self, values: List[int]):
136 self.x = collections.deque(values)
145 if len(output_files) == 0:
148 except FileExistsError:
150 if frame.reg is not None:
151 key = "{:08x}".format(frame.reg)
154 if key not in output_files:
155 output_files[key] = open("out/" + key, 'w')
156 return output_files[key]
161 for f in output_files.values():
165 def parse_file(name: str):
166 with open(name) as f:
168 fields = line.split()
169 timestamp = int(fields.pop(0))
170 dt = datetime.datetime.fromtimestamp(timestamp)
171 values = [int(x, base=16) for x in fields]
176 print(dt, frame, file=f)
177 except ParseError as x:
178 print(dt, 'ERROR({}): '.format(x) + " ".join(fields))
181 parse_file('/var/log/bsb-frames')