示例#1
0
    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
示例#2
0
    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, ""
示例#3
0
文件: Simulator.py 项目: jopohl/urh
    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, ""
示例#4
0
 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
示例#5
0
 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
示例#7
0
    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
示例#8
0
    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
示例#9
0
文件: TableModel.py 项目: jopohl/urh
    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
示例#10
0
文件: Simulator.py 项目: jopohl/urh
    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))
示例#11
0
    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()
示例#12
0
 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
示例#13
0
    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
示例#14
0
    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()