save labelsets and labels to project file

This commit is contained in:
jopohl
2016-06-01 17:43:08 +02:00
parent 23e1c38f14
commit 38fb400709
5 changed files with 59 additions and 67 deletions

View File

@@ -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)

View File

@@ -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)
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)

View File

@@ -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()

View File

@@ -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()

View File

@@ -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)