From 38fb4007091d6800731ba564ec162ca7f4e69907 Mon Sep 17 00:00:00 2001 From: jopohl Date: Wed, 1 Jun 2016 17:43:08 +0200 Subject: [PATCH] save labelsets and labels to project file --- src/urh/controller/FuzzingDialogController.py | 2 +- src/urh/signalprocessing/ProtocolAnalyzer.py | 38 +++++---- src/urh/signalprocessing/encoding.py | 3 + src/urh/util/ProjectManager.py | 79 ++++++++----------- tests/TestFuzzing.py | 4 +- 5 files changed, 59 insertions(+), 67 deletions(-) diff --git a/src/urh/controller/FuzzingDialogController.py b/src/urh/controller/FuzzingDialogController.py index 8316711d..ecec6018 100644 --- a/src/urh/controller/FuzzingDialogController.py +++ b/src/urh/controller/FuzzingDialogController.py @@ -20,7 +20,7 @@ class FuzzingDialogController(QDialog): block_index = block_index if block_index != -1 else 0 self.ui.spinBoxFuzzBlock.setValue(block_index+1) self.ui.spinBoxFuzzBlock.setMinimum(1) - self.ui.spinBoxFuzzBlock.setMaximum(self.protocol.num_blocks+1) + self.ui.spinBoxFuzzBlock.setMaximum(self.protocol.num_blocks) self.proto_view = proto_view self.fuzz_table_model = FuzzingTableModel(self.current_label, proto_view) diff --git a/src/urh/signalprocessing/ProtocolAnalyzer.py b/src/urh/signalprocessing/ProtocolAnalyzer.py index 2ddeaa93..9213759a 100644 --- a/src/urh/signalprocessing/ProtocolAnalyzer.py +++ b/src/urh/signalprocessing/ProtocolAnalyzer.py @@ -76,12 +76,17 @@ class ProtocolAnalyzer(object): @property def default_labelset(self): + if len(self.labelsets) == 0: + self.labelsets.append(LabelSet("default")) + return self.labelsets[0] @default_labelset.setter def default_labelset(self, val: LabelSet): - self.labelsets[0] = val - + if len(self.labelsets) > 0: + self.labelsets[0] = val + else: + self.labelsets.append(val) @property def protocol_labels(self): @@ -594,7 +599,7 @@ class ProtocolAnalyzer(object): labelset.clear() except TypeError: pass # No labelsets defined - self.labelsets = None + self.labelsets = [] self.blocks = None def estimate_frequency_for_one(self, sample_rate: float, nbits=42) -> float: @@ -665,9 +670,7 @@ class ProtocolAnalyzer(object): # Save data data_tag = ET.SubElement(root, "blocks") for i, block in enumerate(self.blocks): - block_tag = block.to_xml(decoders=decoders, include_labelset=False) - block_tag.set("bits", block.plain_bits_str) - data_tag.append(block_tag) + data_tag.append(block.to_xml(decoders=decoders, include_labelset=False)) # Save labelsets separatively as not saved in blocks already labelsets_tag = ET.SubElement(root, "labelsets") @@ -677,16 +680,17 @@ class ProtocolAnalyzer(object): return root def from_xml(self, protocol_tag: ET.Element, participants, decoders): - self.used_symbols.clear() - symbols_tag = protocol_tag.find("symbols") - if symbols_tag: - for symbol_tag in symbols_tag.findall("symbol"): - s = Symbol(symbol_tag.get("name"), int(symbol_tag.get("nbits")), - int(symbol_tag.get("pulsetype")), int(symbol_tag.get("nsamples"))) - self.used_symbols.add(s) + if protocol_tag: + self.used_symbols.clear() + symbols_tag = protocol_tag.find("symbols") + if symbols_tag: + for symbol_tag in symbols_tag.findall("symbol"): + s = Symbol(symbol_tag.get("name"), int(symbol_tag.get("nbits")), + int(symbol_tag.get("pulsetype")), int(symbol_tag.get("nsamples"))) + self.used_symbols.add(s) - block_tags = protocol_tag.find("data").findall("block") + block_tags = protocol_tag.find("blocks").findall("block") - for i, block_tag in enumerate(block_tags): - self.blocks[i].from_xml(tag=block_tag, participants=participants, decoders=decoders) - self.blocks[i].pause = Formatter.str2val(block_tag.get("pause"), int) \ No newline at end of file + for i, block_tag in enumerate(block_tags): + self.blocks[i].from_xml(tag=block_tag, participants=participants, decoders=decoders, labelsets=self.labelsets) + self.blocks[i].pause = Formatter.str2val(block_tag.get("pause"), int) \ No newline at end of file diff --git a/src/urh/signalprocessing/encoding.py b/src/urh/signalprocessing/encoding.py index 8db9396f..0ef177fc 100755 --- a/src/urh/signalprocessing/encoding.py +++ b/src/urh/signalprocessing/encoding.py @@ -623,5 +623,8 @@ class encoding(object): return "0" * (4 * len(inpt.lstrip('0x')) - len(bitstring)) + bitstring + def __eq__(self, other): + return self.get_chain() == other.get_chain() + if __name__ == "__main__": e = encoding() diff --git a/src/urh/util/ProjectManager.py b/src/urh/util/ProjectManager.py index 1b01a364..e2e98cff 100644 --- a/src/urh/util/ProjectManager.py +++ b/src/urh/util/ProjectManager.py @@ -5,6 +5,7 @@ from PyQt5.QtCore import QDir, Qt, QObject, pyqtSignal from PyQt5.QtWidgets import QMessageBox from urh import constants +from urh.signalprocessing.LabelSet import LabelSet from urh.signalprocessing.Modulator import Modulator from urh.signalprocessing.Participant import Participant from urh.signalprocessing.ProtocoLabel import ProtocolLabel @@ -64,12 +65,7 @@ class ProjectManager(QObject): self.gain = int(gain) self.device = device - def read_parameters(self): - if self.project_file is None: - return - tree = ET.parse(self.project_file) - root = tree.getroot() - + def read_parameters(self, root): self.frequency = float(root.get("frequency", 433.92e6)) self.sample_rate = float(root.get("sample_rate", 1e6)) self.bandwidth = float(root.get("bandwidth", 1e6)) @@ -81,6 +77,22 @@ class ProjectManager(QObject): except AttributeError: self.participants = [] + def read_compare_frame_blocks(self, root, compare_frame_controller): + tag = root.find("protocol") + cfc = compare_frame_controller + cfc.proto_analyzer.from_xml(protocol_tag=tag, participants=self.participants, decoders=cfc.decodings) + + def read_labelsets(self): + if self.project_file is None: + return None + + tree = ET.parse(self.project_file) + root = tree.getroot() + try: + return [LabelSet.from_xml(lblset_tag) for lblset_tag in root.find("labelsets").findall("labelset")] + except AttributeError: + return [] + def set_project_folder(self, path, ask_for_new_project=True): if path != self.project_path: self.maincontroller.close_all() @@ -103,9 +115,12 @@ class ProjectManager(QObject): tree = ET.ElementTree(root) tree.write(self.project_file) else: - self.read_parameters() + tree = ET.parse(self.project_file) + root = tree.getroot() + + self.read_parameters(root) self.maincontroller.add_files(self.read_opened_filenames()) - self.read_compare_frame_groups() # Labels are read out here + self.read_compare_frame_groups(root) cfc = self.maincontroller.compare_frame_controller cfc.load_decodings() cfc.fill_decoding_combobox() @@ -113,6 +128,10 @@ class ProjectManager(QObject): for group_id, decoding_index in self.read_decodings().items(): cfc.groups[group_id].decoding = cfc.decodings[decoding_index] + cfc.proto_analyzer.labelsets = self.read_labelsets() + cfc.fill_labelset_combobox() + self.read_compare_frame_blocks(root=root, compare_frame_controller=cfc) + #cfc.ui.cbDecoding.setCurrentIndex(index) cfc.updateUI() modulators = self.read_modulators_from_project_file() @@ -288,6 +307,7 @@ class ProjectManager(QObject): group_tag.set("name", str(group.name)) group_tag.set("id", str(i)) + # TODO Remove as decoding will be blockwise try: decoding_index = cfc.decodings.index(group.decoding) except ValueError: @@ -301,26 +321,11 @@ class ProjectManager(QObject): show = "1" if proto_frame.show else "0" proto_tag.set("show", show) - for label in group_tag.findall('label'): - group_tag.remove(label) - + root.append(cfc.proto_analyzer.to_xml(decoders=cfc.decodings)) + labelsets_tag = ET.SubElement(root, "labelsets") for labelset in cfc.proto_analyzer.labelsets: - labelset_tag = ET.SubElement(root, "labelset") - labelset_tag.set("name", str(labelset.name)) - labelset_tag.set("id", str(labelset.id)) - - for plabel in labelset: - label_tag = ET.SubElement(labelset_tag, "label") - label_tag.set("name", plabel.name) - label_tag.set("start", str(plabel.start)) - label_tag.set("end", str(plabel.end - 1)) - label_tag.set("display_type_index", str(plabel.display_type_index)) - - apply_decoding = "1" if plabel.apply_decoding else "0" - - label_tag.set("color_index", str(plabel.color_index)) - label_tag.set("apply_decoding", apply_decoding) + labelsets_tag.append(labelset.to_xml()) xmlstr = minidom.parseString(ET.tostring(root)).toprettyxml(indent=" ") with open(self.project_file, "w") as f: @@ -406,13 +411,7 @@ class ProjectManager(QObject): return fileNames return [] - def read_compare_frame_groups(self): - if self.project_file is None: - return - - tree = ET.parse(self.project_file) - root = tree.getroot() - + def read_compare_frame_groups(self, root): proto_tree_model = self.maincontroller.compare_frame_controller.proto_tree_model tree_root = proto_tree_model.rootItem pfi = proto_tree_model.protocol_tree_items @@ -442,20 +441,6 @@ class ProjectManager(QObject): group.appendChild(proto_frame_item) proto_frame_item.show_in_compare_frame = Qt.Checked if show == "1" else Qt.Unchecked - group = proto_tree_model.groups[int(id)] - - for label_tag in group_tag.iter("label"): - name = label_tag.attrib["name"] - start = int(label_tag.attrib["start"]) - end = int(label_tag.attrib["end"]) - color_index = int(label_tag.attrib["color_index"]) - - proto_label = ProtocolLabel(name=name, start=start, end=end, val_type_index= 0, color_index=color_index) - proto_label.display_type_index = int(label_tag.attrib["display_type_index"]) - - # Todo Remove group.add_label - group.add_label(proto_label) - self.maincontroller.compare_frame_controller.expand_group_node(int(id)) self.maincontroller.compare_frame_controller.refresh() diff --git a/tests/TestFuzzing.py b/tests/TestFuzzing.py index b6d4d1ca..901b7f6a 100644 --- a/tests/TestFuzzing.py +++ b/tests/TestFuzzing.py @@ -80,7 +80,7 @@ class TestFuzzing(unittest.TestCase): self.gframe.ui.cbViewType.setCurrentIndex(1) # hex view QTest.qWait(10) - fdc = FuzzingDialogController(self.gframe.table_model.protocol.blocks[0], 0, 0, parent=self.gframe) + fdc = FuzzingDialogController(protocol=self.gframe.table_model.protocol, label_index=0, block_index=0, proto_view=0, parent=self.gframe) fdc.finished.connect(self.gframe.refresh_label_list) fdc.finished.connect(self.gframe.refresh_table) fdc.finished.connect(self.gframe.set_fuzzing_ui_status) @@ -95,7 +95,7 @@ class TestFuzzing(unittest.TestCase): self.gframe.ui.cbViewType.setCurrentIndex(1) # hex view QTest.qWait(10) - fdc = FuzzingDialogController(self.gframe.table_model.protocol.blocks[0], 0, 1, parent=self.gframe) + fdc = FuzzingDialogController(self.gframe.table_model.protocol, 0, 1, 1, parent=self.gframe) fdc.finished.connect(self.gframe.refresh_label_list) fdc.finished.connect(self.gframe.refresh_table) fdc.finished.connect(self.gframe.set_fuzzing_ui_status)