From 0f68d5b292a14e71a410e3a4ebb8a5f8fa4760e9 Mon Sep 17 00:00:00 2001 From: DYefremov Date: Tue, 21 Jun 2022 22:58:47 +0300 Subject: [PATCH] transponders display for DVB-T/C --- app/eparser/ecommons.py | 6 ++- app/eparser/satxml.py | 107 +++++++++++++++++++++------------------- app/ui/xml/edit.py | 48 +++++++++++++++--- app/ui/xml/editor.glade | 91 +++++++++++++++++----------------- 4 files changed, 147 insertions(+), 105 deletions(-) diff --git a/app/eparser/ecommons.py b/app/eparser/ecommons.py index ae9efb9f..36148082 100644 --- a/app/eparser/ecommons.py +++ b/app/eparser/ecommons.py @@ -67,7 +67,7 @@ Transponder = namedtuple("Transponder", ["frequency", "symbol_rate", "polarizati "modulation", "pls_mode", "pls_code", "is_id", "t2mi_plp_id"]) TerTransponder = namedtuple("TerTransponder", ["centre_frequency", "system", "bandwidth", "constellation", "code_rate_hp", "code_rate_lp", "guard_interval", "transmission_mode", - "hierarchy_information", "inversion", "plp_id", "comment"]) + "hierarchy_information", "inversion", "plp_id"]) CableTransponder = namedtuple("CableTransponder", ["frequency", "symbol_rate", "fec_inner", "modulation"]) @@ -201,6 +201,8 @@ SERVICE_TYPE = {"-2": "Data", "1": "TV", "2": "Radio", "3": "Data", "10": "Radio # Terrestrial BANDWIDTH = {"0": "8MHz", "1": "7MHz", "2": "6MHz", "3": "Auto", "4": "5MHz", "5": "1/712MHz", "6": "10MHz"} +CONSTELLATION = {"0": "QPSK", "1": "16-QAM", "2": "64-QAM", "3": "Auto"} + T_MODULATION = {"0": "QPSK", "1": "QAM16", "2": "QAM64", "3": "Auto", "4": "QAM256"} TRANSMISSION_MODE = {"0": "2k", "1": "8k", "2": "Auto", "3": "4k", "4": "1k", "5": "16k", "6": "32k"} @@ -215,7 +217,7 @@ T_FEC = {"0": "1/2", "1": "2/3", "2": "3/4", "3": "5/6", "4": "7/8", "5": "Auto" T_SYSTEM = {"0": "DVB-T", "1": "DVB-T2", "-1": "DVB-T/T2"} # Cable -C_MODULATION = {"0": "Auto", "1": "QAM16", "2": "QAM32", "3": "QAM64", "4": "QAM128", "5": "QAM256"} +C_MODULATION = {"0": "QPSK", "1": "QAM16", "2": "QAM32", "3": "QAM64", "4": "QAM128", "5": "QAM256", "6": "Auto"} # ATSC A_MODULATION = {"0": "Auto", "1": "QAM16", "2": "QAM32", "3": "QAM64", "4": "QAM128", "5": "QAM256", "6": "8VSB", diff --git a/app/eparser/satxml.py b/app/eparser/satxml.py index 75ea7cf8..c5b7cc22 100644 --- a/app/eparser/satxml.py +++ b/app/eparser/satxml.py @@ -30,11 +30,12 @@ For more info see comments. """ -from xml.dom.minidom import parse, Document +from xml.dom.minidom import Document +import xml.etree.ElementTree as ETree -from app.commons import log -from .ecommons import POLARIZATION, FEC, SYSTEM, MODULATION, Transponder, Satellite, get_key_by_value, Terrestrial, \ - Cable +from .ecommons import (POLARIZATION, FEC, SYSTEM, MODULATION, Transponder, Satellite, get_key_by_value, + Terrestrial, Cable, TerTransponder, CableTransponder, T_SYSTEM, BANDWIDTH, GUARD_INTERVAL, + TRANSMISSION_MODE, T_FEC, HIERARCHY, C_MODULATION, FEC_DEFAULT, Inversion, CONSTELLATION) _SAT_COMMENT = (" File was created in DemonEditor\n\n" "usable flags are\n" @@ -60,17 +61,65 @@ _SAT_COMMENT = (" File was created in DemonEditor\n\n" def get_satellites(path): """ Returns data [Satellite] list from *.xml. """ - return [parse_sat(elem) for elem in parse(path).getElementsByTagName("sat") if elem.hasAttributes()] + return [Satellite(e.get("name", None), + e.get("flags", None), + e.get("position", None) or "0", + get_sat_transponders(e)) for e in ETree.parse(path).iter("sat")] + + +def get_sat_transponders(elem): + """ Returns satellite transponders list. """ + return [Transponder(e.get("frequency", "0"), + e.get("symbol_rate", "0"), + POLARIZATION[e.get("polarization", "0")], + FEC[e.get("fec_inner", "0")], + SYSTEM[e.get("system", "0")], + MODULATION[e.get("modulation", "0")], + e.get("pls_mode", None), + e.get("pls_code", None), + e.get("is_id", None), + e.get("t2mi_plp_id", None)) for e in elem.iter("transponder")] def get_terrestrial(path): """ Returns data [Terrestrial] list from *.xml. """ - return [parse_terrestrial(elem) for elem in parse(path).getElementsByTagName("terrestrial") if elem.hasAttributes()] + return [Terrestrial(e.get("name", None), + e.get("flags", None), + e.get("countrycode", None), + [get_ter_transponder(e) for e in e.iter("transponder")] + ) for e in ETree.parse(path).iter("terrestrial")] + + +def get_ter_transponder(elem): + """ Returns terrestrial transponder. """ + return TerTransponder(elem.get("centre_frequency", "0"), + T_SYSTEM.get(elem.get("system", None), None), + BANDWIDTH.get(elem.get("bandwidth", None), None), + CONSTELLATION.get(elem.get("constellation", None), None), + T_FEC.get(elem.get("code_rate_hp", None), None), + T_FEC.get(elem.get("code_rate_lp", None), None), + GUARD_INTERVAL.get(elem.get("guard_interval", None), None), + TRANSMISSION_MODE.get(elem.get("transmission_mode", None), None), + HIERARCHY.get(elem.get("hierarchy_information", None), None), + Inversion(elem.get("inversion")).name if "inversion" in elem.keys() else None, + elem.get("plp_id", None)) def get_cable(path): """ Returns data [Cable] list from *.xml. """ - return [parse_cable(elem) for elem in parse(path).getElementsByTagName("cable") if elem.hasAttributes()] + return [Cable(e.get("name", None), + e.get("flags", None), + e.get("satfeed", None), + e.get("countrycode", None), + get_cable_transponders(e)) for e in ETree.parse(path).iter("cable")] + + +def get_cable_transponders(elem): + """ Returns cable transponders list. """ + return [CableTransponder(e.get("frequency", "0"), + e.get("symbol_rate", "0"), + FEC_DEFAULT[e.get("fec_inner", "0")], + C_MODULATION[e.get("modulation", "0")]) for e in elem.iter("transponder")] def write_satellites(satellites, data_path): @@ -114,49 +163,5 @@ def write_satellites(satellites, data_path): doc.unlink() -def parse_transponders(elem, sat_name): - """ Parsing satellite transponders """ - transponders = [] - for el in elem.getElementsByTagName("transponder"): - if el.hasAttributes(): - atr = el.attributes - try: - tr = Transponder(atr["frequency"].value, - atr["symbol_rate"].value, - POLARIZATION[atr["polarization"].value], - FEC[atr["fec_inner"].value], - SYSTEM[atr["system"].value], - MODULATION[atr["modulation"].value], - atr["pls_mode"].value if "pls_mode" in atr else None, - atr["pls_code"].value if "pls_code" in atr else None, - atr["is_id"].value if "is_id" in atr else None, - atr["t2mi_plp_id"].value if "t2mi_plp_id" in atr else None) - except Exception as e: - message = f"Error: can't parse transponder for '{sat_name}' satellite! {repr(e)}" - log(message) - else: - transponders.append(tr) - return transponders - - -def parse_sat(elem): - """ Parsing satellite. """ - sat_name = elem.attributes["name"].value - return Satellite(sat_name, - elem.attributes["flags"].value, - elem.attributes["position"].value, - parse_transponders(elem, sat_name)) - - -def parse_terrestrial(elem): - atr = elem.attributes - return Terrestrial(atr["name"].value, None, None, []) - - -def parse_cable(elem): - atr = elem.attributes - return Cable(atr["name"].value, None, None, None, []) - - if __name__ == "__main__": pass diff --git a/app/ui/xml/edit.py b/app/ui/xml/edit.py index 9c01d817..bd409b8e 100644 --- a/app/ui/xml/edit.py +++ b/app/ui/xml/edit.py @@ -64,6 +64,8 @@ class SatellitesTool(Gtk.Box): self._settings = settings self._current_sat_path = None + self._current_ter_path = None + self._current_cable_path = None self._dvb_type = self.DVB.SAT handlers = {"on_satellite_view_realize": self.on_satellite_view_realize, @@ -79,7 +81,9 @@ class SatellitesTool(Gtk.Box): "on_edit": self.on_edit, "on_key_release": self.on_key_release, "on_visible_page": self.on_visible_page, - "on_satellite_selection": self.on_satellite_selection} + "on_satellite_selection": self.on_satellite_selection, + "on_terrestrial_selection": self.on_terrestrial_selection, + "on_cable_selection": self.on_cable_selection} builder = get_builder(f"{UI_RESOURCES_PATH}xml/editor.glade", handlers) @@ -87,11 +91,17 @@ class SatellitesTool(Gtk.Box): self._terrestrial_view = builder.get_object("terrestrial_view") self._cable_view = builder.get_object("cable_view") self._sat_tr_view = builder.get_object("sat_tr_view") - builder.get_object("sat_pos_column").set_cell_data_func(builder.get_object("sat_pos_renderer"), - self.sat_pos_func) + self._ter_tr_view = builder.get_object("ter_tr_view") + self._cable_tr_view = builder.get_object("cable_tr_view") self._transponders_stack = builder.get_object("transponders_stack") + self._add_header_button = builder.get_object("add_header_button") + self._update_header_button = builder.get_object("update_header_button") self.pack_start(builder.get_object("main_paned"), True, True, 0) self._app.connect("profile-changed", lambda a, m: self.load_satellites_list()) + # Custom renderer + sat_pos_renderer = builder.get_object("sat_pos_renderer") + builder.get_object("sat_pos_column").set_cell_data_func(sat_pos_renderer, self.sat_pos_func) + self.show() def on_satellite_view_realize(self, view): @@ -112,6 +122,13 @@ class SatellitesTool(Gtk.Box): def on_visible_page(self, stack, param): self._dvb_type = self.DVB(stack.get_visible_child_name()) self._transponders_stack.set_visible_child_name(self._dvb_type) + self._update_header_button.set_sensitive(self._dvb_type is self.DVB.SAT) + self._add_header_button.set_sensitive(self._dvb_type is self.DVB.SAT) + + if self._dvb_type is self.DVB.SAT: + self._app.on_info_bar_close() + else: + self._app.show_info_message("Read mode only!", Gtk.MessageType.WARNING) def on_satellite_selection(self, view): model = self._sat_tr_view.get_model() @@ -121,6 +138,22 @@ class SatellitesTool(Gtk.Box): if self._current_sat_path: list(map(model.append, view.get_model()[self._current_sat_path][-1])) + def on_terrestrial_selection(self, view): + model = self._ter_tr_view.get_model() + model.clear() + + self._current_ter_path, column = view.get_cursor() + if self._current_ter_path: + list(map(model.append, view.get_model()[self._current_ter_path][-1])) + + def on_cable_selection(self, view): + model = self._cable_tr_view.get_model() + model.clear() + + self._current_cable_path, column = view.get_cursor() + if self._current_cable_path: + list(map(model.append, view.get_model()[self._current_cable_path][-1])) + def on_up(self, item): move_items(KeyboardKey.UP, self._satellite_view) @@ -128,10 +161,11 @@ class SatellitesTool(Gtk.Box): move_items(KeyboardKey.DOWN, self._satellite_view) def on_button_press(self, menu, event): - if event.get_event_type() == Gdk.EventType.DOUBLE_BUTTON_PRESS: - self.on_edit(self._satellite_view if self._satellite_view.is_focus() else self._sat_tr_view) - else: - on_popup_menu(menu, event) + if self._dvb_type is self.DVB.SAT: + if event.get_event_type() == Gdk.EventType.DOUBLE_BUTTON_PRESS: + self.on_edit(self._satellite_view if self._satellite_view.is_focus() else self._sat_tr_view) + else: + on_popup_menu(menu, event) def on_key_release(self, view, event): """ Handling keystrokes """ diff --git a/app/ui/xml/editor.glade b/app/ui/xml/editor.glade index 9de9cb40..66dceda9 100644 --- a/app/ui/xml/editor.glade +++ b/app/ui/xml/editor.glade @@ -225,8 +225,6 @@ Author: Dmitriy Yefremov - - @@ -259,7 +257,6 @@ Author: Dmitriy Yefremov 5 5 5 - 5 vertical 5 @@ -272,7 +269,7 @@ Author: Dmitriy Yefremov 5 5 - + True True True @@ -343,7 +340,6 @@ Author: Dmitriy Yefremov False Satellites vertical - 5 True @@ -457,7 +453,6 @@ Author: Dmitriy Yefremov False Terrestrial vertical - 5 True @@ -472,9 +467,10 @@ Author: Dmitriy Yefremov True True + - + multiple @@ -484,7 +480,7 @@ Author: Dmitriy Yefremov True 0.49000000953674316 - + end @@ -556,7 +552,6 @@ Author: Dmitriy Yefremov False Cable vertical - 5 True @@ -571,19 +566,20 @@ Author: Dmitriy Yefremov True True + - + multiple - + Name True 0.49000000953674316 - + end @@ -684,7 +680,6 @@ Author: Dmitriy Yefremov 5 5 5 - 5 vertical 5 @@ -736,7 +731,6 @@ Author: Dmitriy Yefremov True False vertical - 5 True @@ -974,7 +968,6 @@ Author: Dmitriy Yefremov True False vertical - 5 True @@ -1063,22 +1056,34 @@ Author: Dmitriy Yefremov - + True 20 - Rate + SR (HP) True 0.5 - + 0.49000000953674316 + 1 4 + + + SR (LP) + + + + 5 + + + + True @@ -1090,20 +1095,6 @@ Author: Dmitriy Yefremov 0.49000000953674316 - - 5 - - - - - - - False - True - Transmission - True - - 6 @@ -1111,29 +1102,40 @@ Author: Dmitriy Yefremov - - False + True - Hierarchy + Transmission True - + 7 + + + True + Hierarchy + True + + + + 8 + + + + - False True Inversion True - 8 + 9 @@ -1200,7 +1202,6 @@ Author: Dmitriy Yefremov True False vertical - 5 True @@ -1228,7 +1229,7 @@ Author: Dmitriy Yefremov True 0.5 - + 0.49000000953674316 @@ -1245,7 +1246,7 @@ Author: Dmitriy Yefremov True 0.5 - + 0.49000000953674316 @@ -1262,11 +1263,11 @@ Author: Dmitriy Yefremov True 0.5 - + 0.49000000953674316 - 3 + 2 @@ -1279,11 +1280,11 @@ Author: Dmitriy Yefremov True 0.5 - + 0.49000000953674316 - 5 + 3