def __display_data(self, lbl: ProtocolLabel, expected_checksum: array = None): try: data = self.message.decoded_bits[lbl.start:lbl.end] except IndexError: return None lsb = lbl.display_bit_order_index == 1 lsd = lbl.display_bit_order_index == 2 data = util.convert_bits_to_string(data, lbl.display_format_index, pad_zeros=True, lsb=lsb, lsd=lsd) if data is None: return None if expected_checksum is not None: data += " (should be {0})".format( util.convert_bits_to_string(expected_checksum, lbl.display_format_index)) return data
def check_message(self, received_msg, expected_msg, retry: int, msg_index: int) -> (bool, str): if len(received_msg.decoded_bits) == 0: return False, "Failed to decode message {}".format(msg_index) for lbl in received_msg.message_type: if lbl.value_type_index in (1, 4): # get live, random continue start_recv, end_recv = received_msg.get_label_range(lbl.label, 0, True) start_exp, end_exp = expected_msg.get_label_range(lbl.label, 0, False) if isinstance(lbl.label, ChecksumLabel): expected = lbl.label.calculate_checksum_for_message(received_msg, use_decoded_bits=True) start, end = received_msg.get_label_range(lbl.label, 0, True) actual = received_msg.decoded_bits[start:end] else: actual = received_msg.decoded_bits[start_recv:end_recv] expected = expected_msg[start_exp:end_exp] if actual != expected: log_msg = [] log_msg.append("Attempt for message {} [{}/{}]".format(msg_index, retry + 1, self.project_manager.simulator_retries)) log_msg.append(HTMLFormatter.indent_string("Mismatch for label: <b>{}</b>".format(lbl.name))) expected_str = util.convert_bits_to_string(expected, lbl.label.display_format_index) got_str = util.convert_bits_to_string(actual, lbl.label.display_format_index) log_msg.append(HTMLFormatter.align_expected_and_got_value(expected_str, got_str, align_depth=2)) return False, log_msg return True, ""
def check_message(self, received_msg, expected_msg, retry: int, msg_index: int) -> (bool, str): if len(received_msg.decoded_bits) == 0: return False, "Failed to decode message {}".format(msg_index) for lbl in received_msg.message_type: if lbl.value_type_index in (1, 4): # get live, random continue start_recv, end_recv = received_msg.get_label_range(lbl.label, 0, True) start_exp, end_exp = expected_msg.get_label_range(lbl.label, 0, False) if isinstance(lbl.label, ChecksumLabel): expected = lbl.label.calculate_checksum_for_message(received_msg, use_decoded_bits=True) start, end = received_msg.get_label_range(lbl.label, 0, True) actual = received_msg.decoded_bits[start:end] else: actual = received_msg.decoded_bits[start_recv:end_recv] expected = expected_msg[start_exp:end_exp] if actual != expected: log_msg = [] log_msg.append("Attempt for message {} [{}/{}]".format(msg_index, retry + 1, self.project_manager.simulator_retries)) log_msg.append(HTMLFormatter.indent_string("Mismatch for label: <b>{}</b>".format(lbl.name))) expected_str = util.convert_bits_to_string(expected, lbl.label.display_format_index) got_str = util.convert_bits_to_string(actual, lbl.label.display_format_index) log_msg.append(HTMLFormatter.align_expected_and_got_value(expected_str, got_str, align_depth=2)) return False, log_msg return True, ""
def to_xml(self): root = ET.Element("crc") root.set("polynomial", util.convert_bits_to_string(self.polynomial, 0)) root.set("start_value", util.convert_bits_to_string(self.start_value, 0)) root.set("final_xor", util.convert_bits_to_string(self.final_xor, 0)) return root
def to_xml(self): root = ET.Element("crc") root.set("polynomial", util.convert_bits_to_string(self.polynomial, 0)) root.set("start_value", util.convert_bits_to_string(self.start_value, 0)) root.set("final_xor", util.convert_bits_to_string(self.final_xor, 0)) root.set("ref_in", str(int(self.lsb_first))) root.set("ref_out", str(int(self.reverse_all))) return root
def data(self, index: QModelIndex, role=Qt.DisplayRole): if not index.isValid(): return None i, j = index.row(), index.column() try: lbl = self.display_labels[i] except IndexError: return None if not lbl or not self.message: return None if isinstance(lbl, ChecksumLabel): calculated_crc = lbl.calculate_checksum_for_message(self.message, use_decoded_bits=True) else: calculated_crc = None if role == Qt.DisplayRole: if j == 0: return lbl.name elif j == 1: return lbl.DISPLAY_FORMATS[lbl.display_format_index] elif j == 2: start, end = self.message.get_label_range(lbl, lbl.display_format_index % 3, True) if lbl.display_format_index in (0, 1, 2): try: data = self.bit_str[self.message_index][start:end] if lbl.display_format_index == 0 \ else self.hex_str[self.message_index][start:end] if lbl.display_format_index == 1 \ else self.ascii_str[self.message_index][start:end] if lbl.display_format_index == 2 \ else "" except IndexError: return None else: # decimal try: data = str(int(self.bit_str[self.message_index][start:end], 2)) except (IndexError, ValueError): return None if calculated_crc is not None: data += " (should be {0})".format(util.convert_bits_to_string(calculated_crc, lbl.display_format_index)) return data elif role == Qt.BackgroundColorRole: if isinstance(lbl, ChecksumLabel): start, end = self.message.get_label_range(lbl, 0, True) if calculated_crc == self.message.decoded_bits[start:end]: return constants.BG_COLOR_CORRECT else: return constants.BG_COLOR_WRONG else: return None
def __display_data(self, lbl: ProtocolLabel, expected_checksum: array = None): if not self.show_label_values or self.message is None: return "-" try: data = self.message.decoded_bits[lbl.start:lbl.end] except IndexError: return None lsb = lbl.display_bit_order_index == 1 lsd = lbl.display_bit_order_index == 2 data = util.convert_bits_to_string(data, lbl.display_format_index, pad_zeros=True, lsb=lsb, lsd=lsd, endianness=lbl.display_endianness) if data is None: return None if expected_checksum is not None: data += " (should be {0})".format( util.convert_bits_to_string(expected_checksum, lbl.display_format_index)) return data
def get_tooltip(self, row: int, column: int) -> str: msg = self.protocol.messages[row] try: lbl = next(lbl for lbl in msg.message_type if column in range(*msg.get_label_range(lbl, self.proto_view, self.decode))) except StopIteration: return "" result = lbl.name if isinstance(lbl, ChecksumLabel): calculated_crc = lbl.calculate_checksum_for_message(msg, use_decoded_bits=self.decode) start, end = msg.get_label_range(lbl=lbl, view=0, decode=self.decode) bits = msg.decoded_bits if self.decode else msg.plain_bits color = "green" if bits[start:end] == calculated_crc else "red" expected = util.convert_bits_to_string(calculated_crc, self.proto_view) result += '<br><font color="{}">Expected <b>{}</b></font>'.format(color, expected) return result
def get_tooltip(self, row: int, column: int) -> str: msg = self.protocol.messages[row] try: lbl = next(lbl for lbl in msg.message_type if column in range(*msg.get_label_range(lbl, self.proto_view, self.decode))) except StopIteration: return "" result = lbl.name if isinstance(lbl, ChecksumLabel): calculated_crc = lbl.calculate_checksum_for_message(msg, use_decoded_bits=self.decode) start, end = msg.get_label_range(lbl=lbl, view=0, decode=self.decode) bits = msg.decoded_bits if self.decode else msg.plain_bits color = "green" if bits[start:end] == calculated_crc else "red" expected = util.convert_bits_to_string(calculated_crc, self.proto_view) result += '<br><font color="{}">Expected <b>{}</b></font>'.format(color, expected) return result
def log_message_labels(self, message: Message): message.split(decode=False) for lbl in message.message_type: if not lbl.logging_active: continue try: data = message.plain_bits[lbl.start:lbl.end] except IndexError: return None lsb = lbl.display_bit_order_index == 1 lsd = lbl.display_bit_order_index == 2 data = util.convert_bits_to_string(data, lbl.display_format_index, pad_zeros=True, lsb=lsb, lsd=lsd) if data is None: continue log_msg = lbl.name + ": " + HTMLFormatter.monospace(data) self.log_messages.append(HTMLFormatter.indent_string(log_msg))
def data(self, index: QModelIndex, role=Qt.DisplayRole): i, j = index.row(), index.column() lbl = self.message_type[i] # type: SimulatorProtocolLabel if role == Qt.DisplayRole: if j == 0: return lbl.name elif j == 1: return ProtocolLabel.DISPLAY_FORMATS[lbl.display_format_index] elif j == 2: if lbl.is_checksum_label: return "Checksum" else: return lbl.VALUE_TYPES[lbl.value_type_index] elif j == 3: if lbl.value_type_index == 0: message = lbl.parent() try: data = message.plain_bits[lbl.start:lbl.end] except IndexError: return None return util.convert_bits_to_string( data, lbl.display_format_index, pad_zeros=True) elif lbl.value_type_index == 1: return "-" elif lbl.value_type_index == 2: return lbl.formula elif lbl.value_type_index == 3: return lbl.external_program elif lbl.value_type_index == 4: return "Range (Decimal): " + str( lbl.random_min) + " - " + str(lbl.random_max) elif role == Qt.EditRole: if j == 0: return lbl.name elif j == 1: return lbl.display_format_index elif j == 2: return lbl.value_type_index elif j == 3: if lbl.value_type_index == 2: return lbl.formula elif lbl.value_type_index == 3: return lbl.external_program elif lbl.value_type_index == 4: return [lbl.random_min, lbl.random_max] elif role == Qt.FontRole: if j == 0: font = QFont() font.setItalic(lbl.field_type is None) return font elif j == 2 and self.link_index(index): font = QFont() font.setUnderline(True) return font elif role == Qt.BackgroundColorRole: if j == 0: return constants.LABEL_COLORS[lbl.color_index] elif j == 3: if (lbl.value_type_index == 2 and not self.controller.sim_expression_parser. validate_expression(lbl.formula)[0]): return constants.ERROR_BG_COLOR elif role == Qt.TextColorRole: if self.link_index(index): return qApp.palette().link().color()
def to_xml(self): root = ET.Element("crc") root.set("polynomial", util.convert_bits_to_string(self.polynomial, 0)) root.set("start_value", util.convert_bits_to_string(self.start_value, 0)) root.set("final_xor", util.convert_bits_to_string(self.final_xor, 0)) return root
def data(self, index: QModelIndex, role=Qt.DisplayRole): if not index.isValid(): return None i, j = index.row(), index.column() try: lbl = self.display_labels[i] except IndexError: return None if not lbl or not self.message: return None if isinstance(lbl, ChecksumLabel): calculated_crc = lbl.calculate_checksum_for_message( self.message, use_decoded_bits=True) else: calculated_crc = None if role == Qt.DisplayRole: if j == 0: return lbl.name elif j == 1: return lbl.DISPLAY_FORMATS[lbl.display_format_index] elif j == 2: start, end = self.message.get_label_range( lbl, lbl.display_format_index % 3, True) if lbl.display_format_index in (0, 1, 2): try: data = self.bit_str[self.message_index][start:end] if lbl.display_format_index == 0 \ else self.hex_str[self.message_index][start:end] if lbl.display_format_index == 1 \ else self.ascii_str[self.message_index][start:end] if lbl.display_format_index == 2 \ else "" except IndexError: return None else: # decimal try: data = str( int(self.bit_str[self.message_index][start:end], 2)) except (IndexError, ValueError): return None if calculated_crc is not None: data += " (should be {0})".format( util.convert_bits_to_string(calculated_crc, lbl.display_format_index)) return data elif role == Qt.BackgroundColorRole: if isinstance(lbl, ChecksumLabel): start, end = self.message.get_label_range(lbl, 0, True) if calculated_crc == self.message.decoded_bits[start:end]: return constants.BG_COLOR_CORRECT else: return constants.BG_COLOR_WRONG else: return None
def data(self, index: QModelIndex, role=Qt.DisplayRole): i, j = index.row(), index.column() lbl = self.message_type[i] # type: SimulatorProtocolLabel if role == Qt.DisplayRole: if j == 0: return lbl.name elif j == 1: return ProtocolLabel.DISPLAY_FORMATS[lbl.display_format_index] elif j == 2: if lbl.is_checksum_label: return "Checksum" else: return lbl.VALUE_TYPES[lbl.value_type_index] elif j == 3: if lbl.value_type_index == 0: message = lbl.parent() try: data = message.plain_bits[lbl.start:lbl.end] except IndexError: return None return util.convert_bits_to_string(data, lbl.display_format_index, pad_zeros=True) elif lbl.value_type_index == 1: return "-" elif lbl.value_type_index == 2: return lbl.formula elif lbl.value_type_index == 3: return lbl.external_program elif lbl.value_type_index == 4: return "Range (Decimal): " + str(lbl.random_min) + " - " + str(lbl.random_max) elif role == Qt.EditRole: if j == 0: return lbl.name elif j == 1: return lbl.display_format_index elif j == 2: return lbl.value_type_index elif j == 3: if lbl.value_type_index == 2: return lbl.formula elif lbl.value_type_index == 3: return lbl.external_program elif lbl.value_type_index == 4: return [lbl.random_min, lbl.random_max] elif role == Qt.FontRole: if j == 0: font = QFont() font.setItalic(lbl.field_type is None) return font elif j == 2 and self.link_index(index): font = QFont() font.setUnderline(True) return font elif role == Qt.BackgroundColorRole: if j == 0: return constants.LABEL_COLORS[lbl.color_index] elif j == 3: if (lbl.value_type_index == 2 and not self.controller.sim_expression_parser.validate_expression(lbl.formula)[0]): return constants.ERROR_BG_COLOR elif role == Qt.TextColorRole: if self.link_index(index): return qApp.palette().link().color()