Exemple #1
0
    def closeEvent(self, event: QCloseEvent):
        changed_values = {}
        if bool(self.ui.checkBoxPauseTime.isChecked()) != self.old_show_pause_as_time:
            changed_values['show_pause_as_time'] = bool(self.ui.checkBoxPauseTime.isChecked())
        if self.old_default_view != self.ui.comboBoxDefaultView.currentIndex():
            changed_values['default_view'] = self.ui.comboBoxDefaultView.currentIndex()
        if self.old_num_sending_repeats != self.ui.spinBoxNumSendingRepeats.value():
            changed_values["num_sending_repeats"] = self.ui.spinBoxNumSendingRepeats.value()

        settings = constants.SETTINGS
        settings.setValue('default_view', self.ui.comboBoxDefaultView.currentIndex())
        settings.setValue('num_sending_repeats', self.ui.spinBoxNumSendingRepeats.value())
        settings.setValue('show_pause_as_time', self.ui.checkBoxPauseTime.isChecked())

        FieldType.save_to_xml(self.field_type_table_model.field_types)
        self.plugin_controller.save_enabled_states()
        for plugin in self.plugin_controller.model.plugins:
            plugin.destroy_settings_frame()

        for i in range(self.ui.scrollAreaWidgetSpectrogramColormapContents.layout().count()):
            widget = self.ui.scrollAreaWidgetSpectrogramColormapContents.layout().itemAt(i).widget()
            if isinstance(widget, QRadioButton) and widget.isChecked():
                selected_colormap_name = widget.objectName()
                if selected_colormap_name != colormaps.read_selected_colormap_name_from_settings():
                    colormaps.choose_colormap(selected_colormap_name)
                    colormaps.write_selected_colormap_to_settings(selected_colormap_name)
                    changed_values["spectrogram_colormap"] = selected_colormap_name
                break

        self.values_changed.emit(changed_values)

        constants.SETTINGS.setValue("{}/geometry".format(self.__class__.__name__), self.saveGeometry())
        super().closeEvent(event)
Exemple #2
0
    def closeEvent(self, event: QCloseEvent):
        changed_values = {}
        if self.ui.spinBoxSymbolTreshold.value() != self.old_symbol_tresh:
            changed_values[
                "rel_symbol_length"] = 100 - 2 * self.ui.spinBoxSymbolTreshold.value(
                )
        if bool(self.ui.checkBoxPauseTime.isChecked()
                ) != self.old_show_pause_as_time:
            changed_values['show_pause_as_time'] = bool(
                self.ui.checkBoxPauseTime.isChecked())
        if self.old_default_view != self.ui.comboBoxDefaultView.currentIndex():
            changed_values[
                'default_view'] = self.ui.comboBoxDefaultView.currentIndex()

        settings = constants.SETTINGS
        settings.setValue('default_view',
                          self.ui.comboBoxDefaultView.currentIndex())
        settings.setValue('num_sending_repeats',
                          self.ui.spinBoxNumSendingRepeats.value())
        settings.setValue('show_pause_as_time',
                          self.ui.checkBoxPauseTime.isChecked())

        FieldType.save_to_xml(self.field_type_table_model.field_types)
        self.plugin_controller.save_enabled_states()

        self.values_changed.emit(changed_values)

        event.accept()
Exemple #3
0
    def write_default_options():
        settings = constants.SETTINGS
        keys = settings.allKeys()

        if 'rel_symbol_length' not in keys:
            settings.setValue('rel_symbol_length', 0)

        if 'default_view' not in keys:
            settings.setValue('default_view', 0)

        if 'num_sending_repeats' not in keys:
            settings.setValue('num_sending_repeats', 0)

        if 'show_pause_as_time' not in keys:
            settings.setValue('show_pause_as_time', False)

        settings.sync(
        )  # Ensure conf dir is created to have field types in place

        if not os.path.isfile(constants.FIELD_TYPE_SETTINGS):
            FieldType.save_to_xml(FieldType.default_field_types())

        bh = BackendHandler()
        for be in bh.device_backends.values():
            be.write_settings()
Exemple #4
0
    def closeEvent(self, event: QCloseEvent):
        changed_values = {}
        if bool(self.ui.checkBoxPauseTime.isChecked()
                ) != self.old_show_pause_as_time:
            changed_values['show_pause_as_time'] = bool(
                self.ui.checkBoxPauseTime.isChecked())
        if self.old_default_view != self.ui.comboBoxDefaultView.currentIndex():
            changed_values[
                'default_view'] = self.ui.comboBoxDefaultView.currentIndex()

        settings = constants.SETTINGS
        settings.setValue('default_view',
                          self.ui.comboBoxDefaultView.currentIndex())
        settings.setValue('num_sending_repeats',
                          self.ui.spinBoxNumSendingRepeats.value())
        settings.setValue('show_pause_as_time',
                          self.ui.checkBoxPauseTime.isChecked())

        FieldType.save_to_xml(self.field_type_table_model.field_types)
        self.plugin_controller.save_enabled_states()
        for plugin in self.plugin_controller.model.plugins:
            plugin.destroy_settings_frame()

        self.values_changed.emit(changed_values)

        constants.SETTINGS.setValue(
            "{}/geometry".format(self.__class__.__name__), self.saveGeometry())
        super().closeEvent(event)
Exemple #5
0
    def __init__(self,
                 name: str,
                 start: int,
                 end: int,
                 color_index: int,
                 fuzz_created=False,
                 auto_created=False,
                 field_type: FieldType = None):
        self.__name = name
        self.start = start
        self.end = end + 1

        self.apply_decoding = True
        self.color_index = color_index
        self.show = Qt.Checked

        self.__fuzz_me = Qt.Checked
        self.fuzz_values = []

        self.fuzz_created = fuzz_created

        if field_type is None:
            self.__field_type = FieldType.from_caption(name)
        else:
            self.__field_type = field_type  # type: FieldType

        self.display_format_index = 0 if field_type is None else field_type.display_format_index
        self.display_bit_order_index = 0
        self.display_endianness = "big"

        self.auto_created = auto_created

        self.copied = False  # keep track if label was already copied for COW in generation to avoid needless recopy
Exemple #6
0
    def test_configure_crc_parameters(self):
        crc_label = ChecksumLabel(
            "crc_label", 25, 120, 0,
            FieldType("crc", FieldType.Function.CHECKSUM))

        crc_widget_controller = ChecksumWidgetController(
            crc_label, Message([0] * 150, 0, MessageType("test")), 0)

        crc = GenericCRC(
            polynomial=list(GenericCRC.DEFAULT_POLYNOMIALS.keys())[0])
        self.assertEqual(crc_widget_controller.ui.lineEditCRCPolynomial.text(),
                         crc.polynomial_as_hex_str)
        self.assertEqual(crc_widget_controller.ui.lineEditStartValue.text(),
                         util.bit2hex(crc.start_value))
        self.assertEqual(crc_widget_controller.ui.lineEditFinalXOR.text(),
                         util.bit2hex(crc.final_xor))

        crc_widget_controller.ui.comboBoxCRCFunction.setCurrentIndex(2)
        crc.polynomial = crc.choose_polynomial(2)
        self.assertEqual(crc_widget_controller.ui.lineEditCRCPolynomial.text(),
                         crc.polynomial_as_hex_str)

        crc_widget_controller.ui.lineEditCRCPolynomial.setText("abcde")
        crc_widget_controller.ui.lineEditCRCPolynomial.editingFinished.emit()
        self.assertEqual(crc_label.checksum.polynomial,
                         array.array("B", [1]) + util.hex2bit("abcde"))

        crc_widget_controller.ui.lineEditStartValue.setText("12345")
        crc_widget_controller.ui.lineEditStartValue.editingFinished.emit()
        self.assertEqual(util.bit2hex(crc_label.checksum.start_value), "12345")

        crc_widget_controller.ui.lineEditFinalXOR.setText("cccaa")
        crc_widget_controller.ui.lineEditFinalXOR.editingFinished.emit()
        self.assertEqual(util.bit2hex(crc_label.checksum.final_xor), "cccaa")
Exemple #7
0
    def test_default_crcs(self):
        crc_label = ChecksumLabel(
            "crc_label", 25, 120, 0,
            FieldType("crc", FieldType.Function.CHECKSUM))
        crc_widget_controller = ChecksumWidgetController(
            crc_label, Message([0] * 150, 0, MessageType("test")), 0)

        default_crc_polynomials = GenericCRC.DEFAULT_POLYNOMIALS
        special_crcs = ChecksumWidgetController.SPECIAL_CRCS

        self.assertEqual(
            len(default_crc_polynomials) + len(special_crcs),
            crc_widget_controller.ui.comboBoxCRCFunction.count())
        for i, default_polynomial_name in enumerate(default_crc_polynomials):
            self.assertEqual(
                default_polynomial_name,
                crc_widget_controller.ui.comboBoxCRCFunction.itemText(i))

        for i, special_crc in enumerate(special_crcs):
            self.assertEqual(
                special_crc,
                crc_widget_controller.ui.comboBoxCRCFunction.itemText(
                    i + len(default_crc_polynomials)))

        crc_widget_controller.ui.comboBoxCRCFunction.setCurrentIndex(1)
        self.assertNotEqual(
            crc_widget_controller.ui.comboBoxCRCFunction.currentText(),
            "8_standard")
        crc_widget_controller.ui.comboBoxCRCFunction.setCurrentText(
            "8_standard")
        self.assertEqual(
            crc_widget_controller.ui.comboBoxCRCFunction.currentText(),
            "8_standard")
        self.assertEqual(crc_widget_controller.ui.lineEditCRCPolynomial.text(),
                         "d5")
Exemple #8
0
    def from_xml(tag: ET.Element):
        field_types_by_caption = {
            ft.caption: ft
            for ft in FieldType.load_from_xml()
        }

        name = tag.get("name", "blank")
        id = tag.get("id", None)
        assigned_by_ruleset = bool(int(tag.get("assigned_by_ruleset", 0)))
        assigned_by_logic_analyzer = bool(
            int(tag.get("assigned_by_logic_analyzer", 0)))
        labels = []
        for lbl_tag in tag.findall("label"):
            labels.append(
                ProtocolLabel.from_xml(
                    lbl_tag, field_types_by_caption=field_types_by_caption))
        for lbl_tag in tag.findall("checksum_label"):
            labels.append(
                ChecksumLabel.from_xml(
                    lbl_tag, field_types_by_caption=field_types_by_caption))
        result = MessageType(name=name,
                             iterable=labels,
                             id=id,
                             ruleset=Ruleset.from_xml(tag.find("ruleset")))
        result.assigned_by_ruleset = assigned_by_ruleset
        result.assigned_by_logic_analyzer = assigned_by_logic_analyzer

        return result
Exemple #9
0
    def __init__(self, protocol, participants=None, field_types=None):
        """

        :type protocol: urh.signalprocessing.ProtocolAnalyzer.ProtocolAnalyzer
        :param participants:
        """
        if participants is not None:
            protocol.auto_assign_participants(participants)

        self.protocol = protocol
        self.bitvectors = [np.array(msg.decoded_bits, dtype=np.int8) for msg in self.protocol.messages]
        self.len_cluster = self.cluster_lengths()
        self.xor_matrix = self.build_xor_matrix()


        mt = self.protocol.message_types

        field_types = FieldType.load_from_xml() if field_types is None else field_types

        self.preamble_component = Preamble(fieldtypes=field_types, priority=0, messagetypes=mt)
        self.length_component = Length(fieldtypes=field_types, length_cluster=self.len_cluster, priority=1,
                                       predecessors=[self.preamble_component], messagetypes=mt)
        self.address_component = Address(fieldtypes=field_types, xor_matrix=self.xor_matrix, priority=2,
                                         predecessors=[self.preamble_component], messagetypes=mt)
        self.sequence_number_component = SequenceNumber(fieldtypes=field_types, priority=3,
                                                        predecessors=[self.preamble_component])
        self.type_component = Type(priority=4, predecessors=[self.preamble_component])
        self.flags_component = Flags(priority=5, predecessors=[self.preamble_component])
Exemple #10
0
    def __init__(self, protocol, participants=None, field_types=None):
        """

        :type protocol: urh.signalprocessing.ProtocolAnalyzer.ProtocolAnalyzer
        :param participants:
        """
        if participants is not None:
            protocol.auto_assign_participants(participants)

        self.protocol = protocol
        self.bitvectors = [np.array(msg.decoded_bits, dtype=np.int8) for msg in self.protocol.messages]
        self.len_cluster = self.cluster_lengths()
        self.xor_matrix = self.build_xor_matrix()


        mt = self.protocol.message_types

        field_types = FieldType.load_from_xml() if field_types is None else field_types

        self.preamble_component = Preamble(fieldtypes=field_types, priority=0, messagetypes=mt)
        self.length_component = Length(fieldtypes=field_types, length_cluster=self.len_cluster, priority=1,
                                       predecessors=[self.preamble_component], messagetypes=mt)
        self.address_component = Address(fieldtypes=field_types, xor_matrix=self.xor_matrix, priority=2,
                                         predecessors=[self.preamble_component], messagetypes=mt)
        self.sequence_number_component = SequenceNumber(fieldtypes=field_types, priority=3,
                                                        predecessors=[self.preamble_component])
        self.type_component = Type(priority=4, predecessors=[self.preamble_component])
        self.flags_component = Flags(priority=5, predecessors=[self.preamble_component])
Exemple #11
0
    def setUp(self):
        self.field_types = FieldType.default_field_types()

        self.preamble_field_type = self.__field_type_with_function(self.field_types, FieldType.Function.PREAMBLE)
        self.sync_field_type = self.__field_type_with_function(self.field_types, FieldType.Function.SYNC)
        self.length_field_type = self.__field_type_with_function(self.field_types, FieldType.Function.LENGTH)
        self.sequence_number_field_type = self.__field_type_with_function(self.field_types,
                                                                          FieldType.Function.SEQUENCE_NUMBER)
        self.dst_address_field_type = self.__field_type_with_function(self.field_types, FieldType.Function.DST_ADDRESS)
        self.src_address_field_type = self.__field_type_with_function(self.field_types, FieldType.Function.SRC_ADDRESS)

        self.protocol = ProtocolAnalyzer(None)
        with open(get_path_for_data_file("awre_consistent_addresses.txt")) as f:
            for line in f:
                self.protocol.messages.append(Message.from_plain_bits_str(line.replace("\n", "")))
                self.protocol.messages[-1].message_type = self.protocol.default_message_type

        # Assign participants
        alice = Participant("Alice", "A")
        bob = Participant("Bob", "B")
        alice_indices = {1, 2, 5, 6, 9, 10, 13, 14, 17, 18, 20, 22, 23, 26, 27, 30, 31, 34, 35, 38, 39, 41}
        for i, message in enumerate(self.protocol.messages):
            message.participant = alice if i in alice_indices else bob

        self.participants = [alice, bob]

        self.zero_crc_protocol = ProtocolAnalyzer(None)
        with open(get_path_for_data_file("awre_zeroed_crc.txt")) as f:
            for line in f:
                self.zero_crc_protocol.messages.append(Message.from_plain_bits_str(line.replace("\n", "")))
                self.zero_crc_protocol.messages[-1].message_type = self.protocol.default_message_type

        for i, message in enumerate(self.zero_crc_protocol.messages):
            message.participant = alice if i in alice_indices else bob
Exemple #12
0
    def __init__(self,
                 preselected_index,
                 message: Message,
                 viewtype: int,
                 parent=None):
        super().__init__(parent)
        self.ui = Ui_DialogLabels()
        self.ui.setupUi(self)
        field_types = FieldType.load_from_xml()
        self.model = PLabelTableModel(message, field_types)
        self.preselected_index = preselected_index

        self.ui.tblViewProtoLabels.setItemDelegateForColumn(
            0,
            ComboBoxDelegate([ft.caption for ft in field_types],
                             is_editable=True,
                             return_index=False,
                             parent=self))
        self.ui.tblViewProtoLabels.setItemDelegateForColumn(
            1, SpinBoxDelegate(1, len(message), self))
        self.ui.tblViewProtoLabels.setItemDelegateForColumn(
            2, SpinBoxDelegate(1, len(message), self))
        self.ui.tblViewProtoLabels.setItemDelegateForColumn(
            3,
            ComboBoxDelegate([""] * len(constants.LABEL_COLORS),
                             colors=constants.LABEL_COLORS,
                             parent=self))
        self.ui.tblViewProtoLabels.setItemDelegateForColumn(
            4, CheckBoxDelegate(self))
        self.ui.tblViewProtoLabels.setModel(self.model)
        self.ui.tblViewProtoLabels.selectRow(preselected_index)
        self.ui.tblViewProtoLabels.setEditTriggers(
            QAbstractItemView.AllEditTriggers)

        self.ui.tblViewProtoLabels.horizontalHeader().setSectionResizeMode(
            QHeaderView.Stretch)

        self.ui.tblViewProtoLabels.resizeColumnsToContents()
        self.setWindowFlags(Qt.Window)
        self.setWindowTitle(
            self.tr("Edit Protocol Labels from message type %s") %
            message.message_type.name)

        self.configure_special_config_tabs()
        self.ui.splitter.setSizes([self.height() / 2, self.height() / 2])

        self.create_connects()
        self.ui.cbProtoView.setCurrentIndex(viewtype)
        self.setAttribute(Qt.WA_DeleteOnClose)

        try:
            self.restoreGeometry(
                constants.SETTINGS.value("{}/geometry".format(
                    self.__class__.__name__)))
        except TypeError:
            pass

        for i in range(self.model.rowCount()):
            self.open_editors(i)
    def on_btn_add_label_type_clicked(self):
        suffix = 1
        field_type_names = {ft.caption for ft in self.field_type_table_model.field_types}
        while "New Fieldtype #" + str(suffix) in field_type_names:
            suffix += 1

        caption = "New Fieldtype #" + str(suffix)
        self.field_type_table_model.field_types.append(FieldType(caption, FieldType.Function.CUSTOM))
        self.field_type_table_model.update()
Exemple #14
0
    def read_options(self):
        self.ui.comboBoxDefaultView.setCurrentIndex(settings.read('default_view', 0, type=int))
        self.ui.spinBoxNumSendingRepeats.setValue(settings.read('num_sending_repeats', 0, type=int))
        self.ui.checkBoxPauseTime.setChecked(settings.read('show_pause_as_time', False, type=bool))

        self.old_show_pause_as_time = bool(self.ui.checkBoxPauseTime.isChecked())

        self.field_type_table_model.field_types = FieldType.load_from_xml()
        self.field_type_table_model.update()
Exemple #15
0
    def test_crc_widget_in_protocol_label_dialog(self):
        mt = MessageType("test")
        mt.append(
            ChecksumLabel("test_crc", 8, 16, 0,
                          FieldType("test_crc", FieldType.Function.CHECKSUM)))

        self.dialog = ProtocolLabelController(0, Message([0] * 100, 0, mt), 0)
        self.assertEqual(self.dialog.ui.tabWidgetAdvancedSettings.count(), 1)
        self.assertEqual(self.dialog.ui.tabWidgetAdvancedSettings.tabText(0),
                         "test_crc")
Exemple #16
0
 def from_label(cls, label: ProtocolLabel):
     result = ChecksumLabel(name=label.name, start=label.start, end=label.end - 1, color_index=label.color_index,
                            field_type=FieldType(label.name, FieldType.Function.CHECKSUM),
                            fuzz_created=label.fuzz_created, auto_created=label.auto_created)
     result.apply_decoding = label.apply_decoding
     result.show = label.show
     result.fuzz_me = label.fuzz_me
     result.fuzz_values = label.fuzz_values
     result.display_format_index = label.display_format_index
     return result
Exemple #17
0
    def read_options(self):
        settings = constants.SETTINGS

        self.ui.comboBoxDefaultView.setCurrentIndex(settings.value('default_view', type=int))
        self.ui.spinBoxNumSendingRepeats.setValue(settings.value('num_sending_repeats', type=int))
        self.ui.checkBoxPauseTime.setChecked(settings.value('show_pause_as_time', type=bool))

        self.old_show_pause_as_time = bool(self.ui.checkBoxPauseTime.isChecked())

        self.field_type_table_model.field_types = FieldType.load_from_xml()
        self.field_type_table_model.update()
    def closeEvent(self, event: QCloseEvent):
        changed_values = {}
        if bool(self.ui.checkBoxPauseTime.isChecked()) != self.old_show_pause_as_time:
            changed_values['show_pause_as_time'] = bool(self.ui.checkBoxPauseTime.isChecked())
        if self.old_default_view != self.ui.comboBoxDefaultView.currentIndex():
            changed_values['default_view'] = self.ui.comboBoxDefaultView.currentIndex()

        settings = constants.SETTINGS
        settings.setValue('default_view', self.ui.comboBoxDefaultView.currentIndex())
        settings.setValue('num_sending_repeats', self.ui.spinBoxNumSendingRepeats.value())
        settings.setValue('show_pause_as_time', self.ui.checkBoxPauseTime.isChecked())

        FieldType.save_to_xml(self.field_type_table_model.field_types)
        self.plugin_controller.save_enabled_states()
        for plugin in self.plugin_controller.model.plugins:
            plugin.destroy_settings_frame()

        self.values_changed.emit(changed_values)

        constants.SETTINGS.setValue("{}/geometry".format(self.__class__.__name__), self.saveGeometry())
        super().closeEvent(event)
Exemple #19
0
    def write_default_options():
        settings = constants.SETTINGS
        keys = settings.allKeys()

        if 'default_view' not in keys:
            settings.setValue('default_view', 0)

        if 'num_sending_repeats' not in keys:
            settings.setValue('num_sending_repeats', 0)

        if 'show_pause_as_time' not in keys:
            settings.setValue('show_pause_as_time', False)

        settings.sync()  # Ensure conf dir is created to have field types in place

        if not os.path.isfile(constants.FIELD_TYPE_SETTINGS):
            FieldType.save_to_xml(FieldType.default_field_types())

        bh = BackendHandler()
        for be in bh.device_backends.values():
            be.write_settings()
Exemple #20
0
    def read_options(self):
        settings = constants.SETTINGS

        self.ui.comboBoxDefaultView.setCurrentIndex(settings.value('default_view', type=int))
        self.ui.spinBoxNumSendingRepeats.setValue(settings.value('num_sending_repeats', type=int))
        self.ui.checkBoxPauseTime.setChecked(settings.value('show_pause_as_time', type=bool))

        symbol_thresh = (settings.value('rel_symbol_length', type=int) - 100) / (-2)
        self.ui.spinBoxSymbolTreshold.setValue(symbol_thresh)
        self.old_symbol_tresh = symbol_thresh
        self.old_show_pause_as_time = bool(self.ui.checkBoxPauseTime.isChecked())

        self.field_type_table_model.field_types = FieldType.load_from_xml()
        self.field_type_table_model.update()
Exemple #21
0
    def __init__(self,
                 preselected_index,
                 message_type: MessageType,
                 viewtype: int,
                 max_end: int,
                 parent=None):
        super().__init__(parent)
        self.ui = Ui_DialogLabels()
        self.ui.setupUi(self)
        field_types = FieldType.load_from_xml()
        self.model = PLabelTableModel(message_type, field_types)
        self.preselected_index = preselected_index

        self.ui.tblViewProtoLabels.setItemDelegateForColumn(
            0,
            ComboBoxDelegate([ft.caption for ft in field_types],
                             is_editable=True,
                             return_index=False,
                             parent=self))
        self.ui.tblViewProtoLabels.setItemDelegateForColumn(
            1, SpinBoxDelegate(1, max_end, self))
        self.ui.tblViewProtoLabels.setItemDelegateForColumn(
            2, SpinBoxDelegate(1, max_end, self))
        self.ui.tblViewProtoLabels.setItemDelegateForColumn(
            3,
            ComboBoxDelegate([""] * len(constants.LABEL_COLORS),
                             colors=constants.LABEL_COLORS,
                             parent=self))
        self.ui.tblViewProtoLabels.setItemDelegateForColumn(
            4, CheckBoxDelegate(self))

        self.ui.tblViewProtoLabels.setModel(self.model)
        self.ui.tblViewProtoLabels.selectRow(preselected_index)

        self.ui.tblViewProtoLabels.horizontalHeader().setSectionResizeMode(
            QHeaderView.Stretch)

        for i in range(self.model.row_count):
            self.open_editors(i)

        self.ui.tblViewProtoLabels.resizeColumnsToContents()
        self.setWindowTitle(
            self.tr("Edit Protocol Labels from %s") % message_type.name)

        self.create_connects()
        self.ui.cbProtoView.setCurrentIndex(viewtype)
        self.setAttribute(Qt.WA_DeleteOnClose)
Exemple #22
0
    def __init__(self, message: Message, viewtype: int, selected_index=None, parent=None):
        super().__init__(parent)
        self.ui = Ui_DialogLabels()
        self.ui.setupUi(self)
        util.set_splitter_stylesheet(self.ui.splitter)

        field_types = FieldType.load_from_xml()
        self.model = PLabelTableModel(message, field_types)

        self.ui.tblViewProtoLabels.setItemDelegateForColumn(0, ComboBoxDelegate([ft.caption for ft in field_types],
                                                                                is_editable=True,
                                                                                return_index=False, parent=self))
        self.ui.tblViewProtoLabels.setItemDelegateForColumn(1, SpinBoxDelegate(1, len(message), self))
        self.ui.tblViewProtoLabels.setItemDelegateForColumn(2, SpinBoxDelegate(1, len(message), self))
        self.ui.tblViewProtoLabels.setItemDelegateForColumn(3,
                                                            ComboBoxDelegate([""] * len(constants.LABEL_COLORS),
                                                                             colors=constants.LABEL_COLORS,
                                                                             parent=self))
        self.ui.tblViewProtoLabels.setItemDelegateForColumn(4, CheckBoxDelegate(self))
        self.ui.tblViewProtoLabels.setModel(self.model)
        self.ui.tblViewProtoLabels.setEditTriggers(QAbstractItemView.AllEditTriggers)

        self.ui.tblViewProtoLabels.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

        self.ui.tblViewProtoLabels.resizeColumnsToContents()
        self.setWindowFlags(Qt.Window)
        self.setWindowTitle(self.tr("Edit Protocol Labels from message type %s") % message.message_type.name)

        self.configure_special_config_tabs()
        self.ui.splitter.setSizes([self.height() / 2, self.height() / 2])

        self.create_connects()

        if selected_index is not None:
            self.ui.tblViewProtoLabels.setCurrentIndex(self.model.index(selected_index, 0))

        self.ui.cbProtoView.setCurrentIndex(viewtype)
        self.setAttribute(Qt.WA_DeleteOnClose)
        self.setWindowFlags(Qt.Window)

        try:
            self.restoreGeometry(constants.SETTINGS.value("{}/geometry".format(self.__class__.__name__)))
        except TypeError:
            pass

        for i in range(self.model.rowCount()):
            self.open_editors(i)
Exemple #23
0
    def from_xml(tag: ET.Element):
        field_types_by_caption = {ft.caption: ft for ft in FieldType.load_from_xml()}

        name = tag.get("name", "blank")
        id = tag.get("id", None)
        assigned_by_ruleset = bool(int(tag.get("assigned_by_ruleset", 0)))
        assigned_by_logic_analyzer = bool(int(tag.get("assigned_by_logic_analyzer", 0)))
        labels = []
        for lbl_tag in tag.findall("label"):
            labels.append(ProtocolLabel.from_xml(lbl_tag, field_types_by_caption=field_types_by_caption))
        for lbl_tag in tag.findall("checksum_label"):
            labels.append(ChecksumLabel.from_xml(lbl_tag, field_types_by_caption=field_types_by_caption))
        result = MessageType(name=name, iterable=labels, id=id, ruleset=Ruleset.from_xml(tag.find("ruleset")))
        result.assigned_by_ruleset = assigned_by_ruleset
        result.assigned_by_logic_analyzer = assigned_by_logic_analyzer

        return result
Exemple #24
0
    def test_enocean_checksum(self):
        checksum_label = ChecksumLabel(
            "checksum_label", 50, 100, 0,
            FieldType("crc", FieldType.Function.CHECKSUM))
        crc_widget_controller = ChecksumWidgetController(
            checksum_label, Message([0] * 100, 0, MessageType("test")), 0)

        crc_widget_controller.ui.comboBoxCategory.setCurrentIndex(1)
        self.assertEqual(
            crc_widget_controller.ui.stackedWidget.currentWidget(),
            crc_widget_controller.ui.page_wsp)

        self.assertTrue(
            crc_widget_controller.ui.radioButtonWSPAuto.isChecked())

        crc_widget_controller.ui.radioButtonWSPChecksum8.click()

        self.assertEqual(checksum_label.checksum.mode,
                         WSPChecksum.ChecksumMode.checksum8)
Exemple #25
0
    def add_label(self,
                  label_type: FieldType.Function,
                  length: int,
                  name: str = None):
        try:
            start = self.message_type[-1].end
            color_index = self.message_type[-1].color_index + 1
        except IndexError:
            start, color_index = 0, 0

        if name is None:
            name = label_type.value

        lbl = ProtocolLabel(name,
                            start,
                            start + length - 1,
                            color_index,
                            field_type=FieldType(label_type.name, label_type))
        self.message_type.append(lbl)
Exemple #26
0
    def from_xml(cls, tag: ET.Element, field_types_by_caption=None):
        lbl = super().from_xml(tag, field_types_by_caption)
        if lbl.field_type is None or lbl.field_type.function != FieldType.Function.CHECKSUM:
            checksum_field_type = next(
                (ft for ft in field_types_by_caption.values() if ft.function == FieldType.Function.CHECKSUM),
                FieldType("checksum", FieldType.Function.CHECKSUM, display_format_index=1))
            lbl.field_type = checksum_field_type
        result = cls.from_label(lbl)
        result.data_ranges = ast.literal_eval(tag.get("data_ranges", "[]"))
        result.category = cls.Category[tag.get("category", "generic")]

        crc_tag = tag.find("crc")
        if crc_tag is not None:
            result.checksum = GenericCRC.from_xml(crc_tag)

        wsp_tag = tag.find("wsp_checksum")
        if wsp_tag is not None:
            result.checksum = WSPChecksum.from_xml(wsp_tag)

        return result
Exemple #27
0
    def add_range_to_message_type(common_range: CommonRange,
                                  message_type: MessageType):
        field_type = FieldType.from_caption(common_range.field_type)
        label = message_type.add_protocol_label(name=common_range.field_type,
                                                start=common_range.bit_start,
                                                end=common_range.bit_end,
                                                auto_created=True,
                                                type=field_type)
        label.display_endianness = common_range.byte_order

        if field_type.function == FieldType.Function.CHECKSUM:
            assert isinstance(label, ChecksumLabel)
            assert isinstance(common_range, ChecksumRange)
            label.data_ranges = [(common_range.data_range_bit_start,
                                  common_range.data_range_bit_end)]

            if isinstance(common_range.crc, WSPChecksum):
                label.category = ChecksumLabel.Category.wsp
            else:
                label.checksum = copy.copy(common_range.crc)
Exemple #28
0
    def add_checksum_label(self,
                           length,
                           checksum,
                           data_start=None,
                           data_end=None,
                           name: str = None):
        label_type = FieldType.Function.CHECKSUM
        try:
            start = self.message_type[-1].end
            color_index = self.message_type[-1].color_index + 1
        except IndexError:
            start, color_index = 0, 0

        if name is None:
            name = label_type.value

        if data_start is None:
            # End of sync or preamble
            sync_label = self.message_type.get_first_label_with_type(
                FieldType.Function.SYNC)
            if sync_label:
                data_start = sync_label.end
            else:
                preamble_label = self.message_type.get_first_label_with_type(
                    FieldType.Function.PREAMBLE)
                if preamble_label:
                    data_start = preamble_label.end
                else:
                    data_start = 0

        if data_end is None:
            data_end = start

        lbl = ChecksumLabel(name,
                            start,
                            start + length - 1,
                            color_index,
                            field_type=FieldType(label_type.name, label_type))
        lbl.data_ranges = [(data_start, data_end)]
        lbl.checksum = checksum
        self.message_type.append(lbl)
Exemple #29
0
    def setData(self, index: QModelIndex, value, role=None):
        if role == Qt.EditRole:
            i, j = index.row(), index.column()
            label = self.message_type[i]  # type: SimulatorProtocolLabel

            if j == 0:
                label.name = value
                ft = self.controller.field_types_by_caption.get(
                    value, FieldType("Custom", FieldType.Function.CUSTOM))
                label.field_type = ft
            elif j == 1:
                label.display_format_index = value
            elif j == 2:
                label.value_type_index = value
            elif j == 3:
                if label.value_type_index == 0:
                    message = label.parent()
                    try:
                        bits = util.convert_string_to_bits(
                            value,
                            label.display_format_index,
                            target_num_bits=label.end - label.start)

                        message.plain_bits[label.start:label.end] = bits
                    except ValueError:
                        pass
                elif label.value_type_index == 2:
                    label.formula = value
                elif label.value_type_index == 3:
                    label.external_program = value
                elif label.value_type_index == 4:
                    label.random_min = value[0]
                    label.random_max = value[1]
            self.dataChanged.emit(self.index(i, 0),
                                  self.index(i, self.columnCount()))
            self.protocol_label_updated.emit(label)

        return True
Exemple #30
0
    def test_configure_crc_ranges(self):
        checksum_label = ChecksumLabel(
            "checksum_label", 50, 100, 0,
            FieldType("crc", FieldType.Function.CHECKSUM))

        crc_widget_controller = ChecksumWidgetController(
            checksum_label, Message([0] * 100, 0, MessageType("test")), 0)
        model = crc_widget_controller.data_range_table_model
        self.assertEqual(model.data(model.index(0, 0)), 1)
        self.assertEqual(model.data(model.index(0, 1)), 50)
        self.assertEqual(model.rowCount(), 1)

        crc_widget_controller.ui.btnAddRange.click()
        self.assertEqual(model.rowCount(), 2)
        crc_widget_controller.ui.btnAddRange.click()
        self.assertEqual(model.rowCount(), 3)

        crc_widget_controller.ui.btnRemoveRange.click()
        self.assertEqual(model.rowCount(), 2)
        crc_widget_controller.ui.btnRemoveRange.click()
        self.assertEqual(model.rowCount(), 1)
        crc_widget_controller.ui.btnRemoveRange.click()
        self.assertEqual(model.rowCount(), 1)
Exemple #31
0
 def __init_field_types():
     result = []
     for field_type_function in FieldType.Function:
         result.append(
             FieldType(field_type_function.value, field_type_function))
     return result
Exemple #32
0
 def reload_field_types(self):
     self.field_types = FieldType.load_from_xml()
     self.field_types_by_caption = {
         field_type.caption: field_type
         for field_type in self.field_types
     }
Exemple #33
0
 def reload_field_types(self):
     self.field_types = FieldType.load_from_xml()
     self.field_types_by_caption = {field_type.caption: field_type for field_type in self.field_types}