transponders display for DVB-T/C

This commit is contained in:
DYefremov
2022-06-21 22:58:47 +03:00
parent c3d9159822
commit 0f68d5b292
4 changed files with 147 additions and 105 deletions

View File

@@ -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",

View File

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

View File

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

View File

@@ -225,8 +225,6 @@ Author: Dmitriy Yefremov
<column type="gchararray"/>
<!-- column-name plp_id -->
<column type="gchararray"/>
<!-- column-name comment -->
<column type="gchararray"/>
</columns>
</object>
<object class="GtkListStore" id="terrestrial_model">
@@ -259,7 +257,6 @@ Author: Dmitriy Yefremov
<property name="margin_left">5</property>
<property name="margin_right">5</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
@@ -272,7 +269,7 @@ Author: Dmitriy Yefremov
<property name="margin_bottom">5</property>
<property name="spacing">5</property>
<child>
<object class="GtkButton" id="satellite_add_button">
<object class="GtkButton" id="add_header_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
@@ -343,7 +340,6 @@ Author: Dmitriy Yefremov
<property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">Satellites</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkScrolledWindow" id="satellite_view_scrolled">
<property name="visible">True</property>
@@ -457,7 +453,6 @@ Author: Dmitriy Yefremov
<property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">Terrestrial</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkScrolledWindow" id="terrestrial_view_scrolled">
<property name="visible">True</property>
@@ -472,9 +467,10 @@ Author: Dmitriy Yefremov
<property name="rubber_banding">True</property>
<property name="activate_on_single_click">True</property>
<signal name="button-press-event" handler="on_button_press" object="popup_menu" swapped="no"/>
<signal name="cursor-changed" handler="on_terrestrial_selection" swapped="no"/>
<signal name="realize" handler="on_terrestrial_view_realize" swapped="no"/>
<child internal-child="selection">
<object class="GtkTreeSelection">
<object class="GtkTreeSelection" id="terrrestrial_view_selection">
<property name="mode">multiple</property>
</object>
</child>
@@ -484,7 +480,7 @@ Author: Dmitriy Yefremov
<property name="expand">True</property>
<property name="alignment">0.49000000953674316</property>
<child>
<object class="GtkCellRendererText" id="sat_name_renderer1">
<object class="GtkCellRendererText" id="ter_name_renderer">
<property name="ellipsize">end</property>
</object>
<attributes>
@@ -556,7 +552,6 @@ Author: Dmitriy Yefremov
<property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">Cable</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkScrolledWindow" id="cable_view_scrolled">
<property name="visible">True</property>
@@ -571,19 +566,20 @@ Author: Dmitriy Yefremov
<property name="rubber_banding">True</property>
<property name="activate_on_single_click">True</property>
<signal name="button-press-event" handler="on_button_press" object="popup_menu" swapped="no"/>
<signal name="cursor-changed" handler="on_cable_selection" swapped="no"/>
<signal name="realize" handler="on_cable_view_realize" swapped="no"/>
<child internal-child="selection">
<object class="GtkTreeSelection">
<object class="GtkTreeSelection" id="cable_view_selection">
<property name="mode">multiple</property>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="sat_name_column2">
<object class="GtkTreeViewColumn" id="cable_name_column">
<property name="title" translatable="yes">Name</property>
<property name="expand">True</property>
<property name="alignment">0.49000000953674316</property>
<child>
<object class="GtkCellRendererText" id="sat_name_renderer2">
<object class="GtkCellRendererText" id="cable_name_renderer">
<property name="ellipsize">end</property>
</object>
<attributes>
@@ -684,7 +680,6 @@ Author: Dmitriy Yefremov
<property name="margin_left">5</property>
<property name="margin_right">5</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
@@ -736,7 +731,6 @@ Author: Dmitriy Yefremov
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkScrolledWindow" id="sat_tr_view_scrolled">
<property name="visible">True</property>
@@ -974,7 +968,6 @@ Author: Dmitriy Yefremov
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkScrolledWindow" id="ter_tr_view_scrolled">
<property name="visible">True</property>
@@ -1063,22 +1056,34 @@ Author: Dmitriy Yefremov
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="ter_rate_column">
<object class="GtkTreeViewColumn" id="ter_rate_hp_column">
<property name="resizable">True</property>
<property name="min_width">20</property>
<property name="title" translatable="yes">Rate</property>
<property name="title" translatable="yes">SR (HP)</property>
<property name="expand">True</property>
<property name="alignment">0.5</property>
<child>
<object class="GtkCellRendererText" id="ter_rate_cellrenderer">
<object class="GtkCellRendererText" id="ter_rate_hp_cellrenderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
<attribute name="single-paragraph-mode">1</attribute>
<attribute name="text">4</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="ter_rate_lp_column">
<property name="title" translatable="yes">SR (LP)</property>
<child>
<object class="GtkCellRendererText" id="ter_rate_lp_cellrenderer"/>
<attributes>
<attribute name="text">5</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="ter_guard_column">
<property name="resizable">True</property>
@@ -1090,20 +1095,6 @@ Author: Dmitriy Yefremov
<object class="GtkCellRendererText" id="ter_guard_cellrenderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
<attribute name="text">5</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="ter_tr_mode_column">
<property name="visible">False</property>
<property name="resizable">True</property>
<property name="title" translatable="yes">Transmission</property>
<property name="expand">True</property>
<child>
<object class="GtkCellRendererText" id="ter_tr_mode_cellrenderer"/>
<attributes>
<attribute name="text">6</attribute>
</attributes>
@@ -1111,29 +1102,40 @@ Author: Dmitriy Yefremov
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="ter_hierarchy_column">
<property name="visible">False</property>
<object class="GtkTreeViewColumn" id="ter_tr_mode_column">
<property name="resizable">True</property>
<property name="title" translatable="yes">Hierarchy</property>
<property name="title" translatable="yes">Transmission</property>
<property name="expand">True</property>
<child>
<object class="GtkCellRendererText" id="ter_hierarchy_cellrenderer"/>
<object class="GtkCellRendererText" id="ter_tr_mode_cellrenderer"/>
<attributes>
<attribute name="text">7</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="ter_hierarchy_column">
<property name="resizable">True</property>
<property name="title" translatable="yes">Hierarchy</property>
<property name="expand">True</property>
<child>
<object class="GtkCellRendererText" id="ter_hierarchy_cellrenderer"/>
<attributes>
<attribute name="text">8</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="ter_inversion_column">
<property name="visible">False</property>
<property name="resizable">True</property>
<property name="title" translatable="yes">Inversion</property>
<property name="expand">True</property>
<child>
<object class="GtkCellRendererText" id="ter_inversion_cellrenderer"/>
<attributes>
<attribute name="text">8</attribute>
<attribute name="text">9</attribute>
</attributes>
</child>
</object>
@@ -1200,7 +1202,6 @@ Author: Dmitriy Yefremov
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkScrolledWindow" id="cable_tr_view_scrolled">
<property name="visible">True</property>
@@ -1228,7 +1229,7 @@ Author: Dmitriy Yefremov
<property name="expand">True</property>
<property name="alignment">0.5</property>
<child>
<object class="GtkCellRendererText" id="frequency_cellrenderertext2">
<object class="GtkCellRendererText" id="cable_frequency_cellrenderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
@@ -1245,7 +1246,7 @@ Author: Dmitriy Yefremov
<property name="expand">True</property>
<property name="alignment">0.5</property>
<child>
<object class="GtkCellRendererText" id="sat_rate_cellrenderertext2">
<object class="GtkCellRendererText" id="cable_rate_cellrenderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
@@ -1262,11 +1263,11 @@ Author: Dmitriy Yefremov
<property name="expand">True</property>
<property name="alignment">0.5</property>
<child>
<object class="GtkCellRendererText" id="set_fec_cellrenderertext2">
<object class="GtkCellRendererText" id="cable_fec_cellrenderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
<attribute name="text">3</attribute>
<attribute name="text">2</attribute>
</attributes>
</child>
</object>
@@ -1279,11 +1280,11 @@ Author: Dmitriy Yefremov
<property name="expand">True</property>
<property name="alignment">0.5</property>
<child>
<object class="GtkCellRendererText" id="mod_cellrenderertext2">
<object class="GtkCellRendererText" id="cable_mod_cellrenderer">
<property name="xalign">0.49000000953674316</property>
</object>
<attributes>
<attribute name="text">5</attribute>
<attribute name="text">3</attribute>
</attributes>
</child>
</object>