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)
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()
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()
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)
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
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")
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")
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
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])
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
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()
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()
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")
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
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)
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()
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()
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)
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)
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
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)
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)
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
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)
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)
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
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)
def __init_field_types(): result = [] for field_type_function in FieldType.Function: result.append( FieldType(field_type_function.value, field_type_function)) return result
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 }
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}