5 from typing import List
7 class ParseError(RuntimeError):
18 return self.x.popleft()
35 return (hi << 16) + lo
37 def next_u32_swapped(self):
38 hi = self.next_u16le()
40 return (hi << 16) + lo
43 return " ".join(["{:02x}".format(b) for b in self.x])
46 self.reg = self.next_u32()
47 self.text = "{:08x}".format(self.reg)
49 def _parse_reg_swapped(self):
50 self.reg = self.next_u32_swapped()
51 self.text = "{:08x}".format(self.reg)
53 def _parse_null(self):
58 "name": "REQUEST_INFO",
67 "parser": _parse_reg_swapped,
71 "parser": _parse_null,
75 "parser": _parse_null,
79 "parser": _parse_reg_swapped,
87 "parser": _parse_null,
91 "parser": _parse_reg_swapped,
95 "parser": _parse_reg_swapped,
101 if self.next_u8() != 0xdc:
102 raise ParseError("Missing SOF")
103 self.src = self.next_u8() ^ 0x80
104 self.dst = self.next_u8()
105 if self.next_u8() != len(self.orig):
106 raise ParseError("Invalid length byte")
107 self.op = self.next_u8()
109 # Remove CRC from the end
111 raise ParseError("Missing CRC")
116 # Which operation it is?
117 if self.op in Frame.op_table:
118 op_def = Frame.op_table[self.op]
119 self.op_name = op_def["name"]
120 op_def["parser"](self)
122 raise ParseError("Unknown OP")
125 rest = self.dump_rest()
126 return ("{:02x} -> {:02x} {}".format(self.src, self.dst, self.op_name) +
127 (" " if len(self.text) else "") +
129 (": " if len(rest) else "") +
132 def parse(self, values: List[int]):
134 self.x = collections.deque(values)
143 if len(output_files) == 0:
146 except FileExistsError:
148 if frame.reg is not None:
149 key = "{:08x}".format(frame.reg)
152 if key not in output_files:
153 output_files[key] = open("out/" + key, 'w')
154 return output_files[key]
159 for f in output_files.values():
163 def parse_file(name: str):
164 with open(name) as f:
166 fields = line.split()
167 timestamp = int(fields.pop(0))
168 dt = datetime.datetime.fromtimestamp(timestamp)
169 values = [int(x, base=16) for x in fields]
174 print(dt, frame, file=f)
175 except ParseError as x:
176 print(dt, 'ERROR({}): '.format(x) + " ".join(fields))
179 parse_file('/var/log/bsb-frames')