added support for ATSC services

This commit is contained in:
DYefremov
2021-04-01 09:01:08 +03:00
parent 5c0d1d27f5
commit 4d6fbfce6c
5 changed files with 90 additions and 44 deletions

View File

@@ -35,6 +35,7 @@ class TrType(Enum):
Satellite = "s"
Terrestrial = "t"
Cable = "c"
ATSC = "a"
class BqType(Enum):
@@ -147,6 +148,10 @@ 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"}
# ATSC
A_MODULATION = {"0": "Auto", "1": "QAM16", "2": "QAM32", "3": "QAM64", "4": "QAM128", "5": "QAM256", "6": "8VSB",
"7": "16VSB"}
# CAS
CAS = {"C:26": "BISS", "C:0B": "Conax", "C:06": "Irdeto", "C:18": "Nagravision", "C:05": "Viaccess", "C:01": "SECA",
"C:0E": "PowerVu", "C:4A": "DRE-Crypt", "C:7B": "DRE-Crypt", "C:56": "Verimatrix", "C:09": "VideoGuard"}

View File

@@ -47,7 +47,7 @@ class LameDbReader:
tr_type = tr[0:1]
if tr_type == "c":
tr += ":0:0:0"
elif tr_type == "t":
elif tr_type == "t" or tr_type == "a":
tr += ":0:0"
else:
tr_data = tr.split(_SEP)
@@ -81,7 +81,7 @@ class LameDbReader:
lns = file.readlines()
if lns and not lns[0].endswith("/5/\n"):
raise SyntaxError("lamedb v.5 parsing error: unsupported format.")
raise SyntaxError("lamedb ver.5 parsing error: unsupported format.")
trs, srvs = {}, [""]
for line in lns:
@@ -95,8 +95,13 @@ class LameDbReader:
srv_data.append("p:")
srvs.extend(srv_data)
elif line.startswith("t:"):
tr, srv = line.split(",")
trs[tr.strip("t:")] = srv.strip().replace(":", " ", 1)
data = line.split(",")
len_data = len(data)
if len_data > 1:
tr, srv = data[0].strip("t:"), data[1].strip().replace(":", " ", 1)
trs[tr] = srv
else:
log("Error while parsing transponder data [ver. 5] for line: {}".format(line))
return self.parse_services(srvs, trs)
@@ -177,6 +182,10 @@ class LameDbReader:
system = "DVB-C"
pos = "C"
fec = FEC_DEFAULT.get(tr[4])
elif tr_type is TrType.ATSC:
system = "ATSC"
pos = "T"
fec = FEC_DEFAULT.get("0")
# Formatting displayed values.
try:

View File

@@ -2854,12 +2854,13 @@ class Application(Gtk.Application):
if self._s_type is SettingsType.ENIGMA_2:
terrestrial = False
cable = False
atsc = False
for srv in self._services.values():
tr_type = srv.transponder_type
if tr_type == "s" and srv.pos:
self._sat_positions.add(srv.pos)
elif tr_type == "t":
elif tr_type == "t" or tr_type == "a":
terrestrial = True
elif tr_type == "c":
cable = True

View File

@@ -40,37 +40,37 @@ Author: Dmitriy Yefremov
</columns>
<data>
<row>
<col id="0" translatable="yes">Auto</col>
<col id="0">Auto</col>
</row>
<row>
<col id="0" translatable="yes">1/2</col>
<col id="0">1/2</col>
</row>
<row>
<col id="0" translatable="yes">2/3</col>
</row>
<row>
<col id="0" translatable="yes">3/4</col>
<col id="0">3/4</col>
</row>
<row>
<col id="0" translatable="yes">5/6</col>
<col id="0">5/6</col>
</row>
<row>
<col id="0" translatable="yes">7/8</col>
<col id="0">7/8</col>
</row>
<row>
<col id="0" translatable="yes">8/9</col>
<col id="0">8/9</col>
</row>
<row>
<col id="0" translatable="yes">3/5</col>
<col id="0">3/5</col>
</row>
<row>
<col id="0" translatable="yes">4/5</col>
<col id="0">4/5</col>
</row>
<row>
<col id="0" translatable="yes">6/7</col>
<col id="0">6/7</col>
</row>
<row>
<col id="0" translatable="yes">9/10</col>
<col id="0">9/10</col>
</row>
</data>
</object>
@@ -94,13 +94,13 @@ Author: Dmitriy Yefremov
</columns>
<data>
<row>
<col id="0" translatable="yes">Off</col>
<col id="0">Off</col>
</row>
<row>
<col id="0" translatable="yes">On</col>
<col id="0">On</col>
</row>
<row>
<col id="0" translatable="yes">Auto</col>
<col id="0">Auto</col>
</row>
</data>
</object>
@@ -111,19 +111,19 @@ Author: Dmitriy Yefremov
</columns>
<data>
<row>
<col id="0" translatable="yes">Auto</col>
<col id="0">Auto</col>
</row>
<row>
<col id="0" translatable="yes">QPSK</col>
<col id="0">QPSK</col>
</row>
<row>
<col id="0" translatable="yes">8PSK</col>
<col id="0">8PSK</col>
</row>
<row>
<col id="0" translatable="yes">16APSK</col>
<col id="0">16APSK</col>
</row>
<row>
<col id="0" translatable="yes">32APSK</col>
<col id="0">32APSK</col>
</row>
</data>
</object>
@@ -134,13 +134,13 @@ Author: Dmitriy Yefremov
</columns>
<data>
<row>
<col id="0" translatable="yes">Off</col>
<col id="0">Off</col>
</row>
<row>
<col id="0" translatable="yes">On</col>
<col id="0">On</col>
</row>
<row>
<col id="0" translatable="yes">Auto</col>
<col id="0">Auto</col>
</row>
</data>
</object>
@@ -151,13 +151,13 @@ Author: Dmitriy Yefremov
</columns>
<data>
<row>
<col id="0" translatable="yes">Root</col>
<col id="0">Root</col>
</row>
<row>
<col id="0" translatable="yes">Gold</col>
<col id="0">Gold</col>
</row>
<row>
<col id="0" translatable="yes">Combo</col>
<col id="0">Combo</col>
</row>
</data>
</object>
@@ -168,16 +168,16 @@ Author: Dmitriy Yefremov
</columns>
<data>
<row>
<col id="0" translatable="yes">H</col>
<col id="0">H</col>
</row>
<row>
<col id="0" translatable="yes">V</col>
<col id="0">V</col>
</row>
<row>
<col id="0" translatable="yes">R</col>
<col id="0">R</col>
</row>
<row>
<col id="0" translatable="yes">L</col>
<col id="0">L</col>
</row>
</data>
</object>
@@ -188,16 +188,16 @@ Author: Dmitriy Yefremov
</columns>
<data>
<row>
<col id="0" translatable="yes">35%</col>
<col id="0">35%</col>
</row>
<row>
<col id="0" translatable="yes">25%</col>
<col id="0">25%</col>
</row>
<row>
<col id="0" translatable="yes">20%</col>
<col id="0">20%</col>
</row>
<row>
<col id="0" translatable="yes">Auto</col>
<col id="0">Auto</col>
</row>
</data>
</object>
@@ -253,10 +253,10 @@ Author: Dmitriy Yefremov
</columns>
<data>
<row>
<col id="0" translatable="yes">DVB-S</col>
<col id="0">DVB-S</col>
</row>
<row>
<col id="0" translatable="yes">DVB-S2</col>
<col id="0">DVB-S2</col>
</row>
</data>
</object>

View File

@@ -6,7 +6,7 @@ from app.eparser import Service
from app.eparser.ecommons import (MODULATION, Inversion, ROLL_OFF, Pilot, Flag, Pids, POLARIZATION, get_key_by_value,
get_value_by_name, FEC_DEFAULT, PLS_MODE, SERVICE_TYPE, T_MODULATION, C_MODULATION,
TrType, SystemCable, T_SYSTEM, BANDWIDTH, TRANSMISSION_MODE, GUARD_INTERVAL, T_FEC,
HIERARCHY)
HIERARCHY, A_MODULATION)
from app.settings import SettingsType
from .dialogs import show_dialog, DialogType, Action, get_dialogs_string
from .main_helper import get_base_model
@@ -206,6 +206,8 @@ class ServiceDetailsDialog:
self.update_ui_for_terrestrial()
elif self._tr_type is TrType.Cable:
self.update_ui_for_cable()
elif self._tr_type is TrType.ATSC:
self.update_ui_for_atsc()
else:
self.set_sat_positions(srv.pos)
@@ -307,6 +309,11 @@ class ServiceDetailsDialog:
self.select_active_text(self._pls_mode_combo_box, HIERARCHY.get(tr_data[7]))
self.select_active_text(self._invertion_combo_box, Inversion(tr_data[8]).name)
self.select_active_text(self._sys_combo_box, T_SYSTEM.get(tr_data[9]))
elif tr_type is TrType.ATSC:
self._sys_combo_box.set_active(0)
self.select_active_text(self._mod_combo_box, A_MODULATION.get(tr_data[2]))
self.select_active_text(self._invertion_combo_box, Inversion(tr_data[1]).name)
# Should be called last to properly initialize the reference
self._srv_type_entry.set_text(data[4])
@@ -396,6 +403,8 @@ class ServiceDetailsDialog:
transponder = self.get_terrestrial_transponder_data()
elif self._tr_type is TrType.Cable:
transponder = self.get_cable_transponder_data()
elif self._tr_type is TrType.ATSC:
transponder = self.get_atsc_transponder_data()
except Exception as e:
log("Edit service error: {}".format(e))
show_dialog(DialogType.ERROR, transient=self._dialog, text="Error getting transponder parameters!")
@@ -560,6 +569,7 @@ class ServiceDetailsDialog:
freq = self._freq_entry.get_text()
fec = self._fec_combo_box.get_active_id()
system = self._sys_combo_box.get_active_id()
o_srv = self._old_service
if self._tr_type is TrType.Satellite or self._s_type is SettingsType.NEUTRINO_MP:
freq = self._freq_entry.get_text()
@@ -567,11 +577,9 @@ class ServiceDetailsDialog:
pol = self._pol_combo_box.get_active_id()
pos = "{}{}".format(round(self._sat_pos_button.get_value(), 1), self._pos_side_box.get_active_id())
return freq, rate, pol, fec, system, pos
elif self._tr_type is TrType.Terrestrial:
o_srv = self._old_service
elif self._tr_type in (TrType.Terrestrial, TrType.ATSC):
return freq, o_srv.rate, o_srv.pol, fec, system, o_srv.pos
elif self._tr_type is TrType.Cable:
o_srv = self._old_service
return freq, self._rate_entry.get_text(), o_srv.pol, fec, o_srv.system, o_srv.pos
def get_satellite_transponder_data(self):
@@ -625,6 +633,7 @@ class ServiceDetailsDialog:
tr_data[8] = self.get_value_from_combobox_id(self._pls_mode_combo_box, HIERARCHY)
tr_data[9] = get_value_by_name(Inversion, self._invertion_combo_box.get_active_id())
tr_data[10] = self.get_value_from_combobox_id(self._sys_combo_box, T_SYSTEM)
return "{} {}".format(tr_data[0], ":".join(tr_data[1:]))
def get_cable_transponder_data(self):
@@ -636,6 +645,16 @@ class ServiceDetailsDialog:
tr_data[4] = self.get_value_from_combobox_id(self._mod_combo_box, C_MODULATION)
tr_data[5] = self.get_value_from_combobox_id(self._fec_combo_box, FEC_DEFAULT)
tr_data[6] = get_value_by_name(SystemCable, self._sys_combo_box.get_active_id())
return "{} {}".format(tr_data[0], ":".join(tr_data[1:]))
def get_atsc_transponder_data(self):
tr_data = re.split("\s|:", self._old_service.transponder)
# frequency, inversion, modulation, system
tr_data[1] = "{}000".format(self._freq_entry.get_text())
tr_data[2] = get_value_by_name(Inversion, self._invertion_combo_box.get_active_id())
tr_data[3] = self.get_value_from_combobox_id(self._mod_combo_box, A_MODULATION)
return "{} {}".format(tr_data[0], ":".join(tr_data[1:]))
def update_transponder_services(self, transponder, sat_pos):
@@ -695,7 +714,7 @@ class ServiceDetailsDialog:
return
self.update_dvb_s2_elements(active and (self._sys_combo_box.get_active_id() == "DVB-S2"
or self._old_service.transponder_type in "tc"))
or self._old_service.transponder_type in "tca"))
for elem in self._TRANSPONDER_ELEMENTS:
elem.set_sensitive(active)
@@ -826,6 +845,18 @@ class ServiceDetailsDialog:
self._transponder_id_entry.set_max_width_chars(8)
self._network_id_entry.set_max_width_chars(8)
def update_ui_for_atsc(self):
self.update_ui_for_cable()
tr_grid = self._builder.get_object("tr_grid")
tr_grid.remove_column(1)
tr_grid.remove_column(1)
# Init models
fec_model, modulation_model, system_model = self.get_models_for_non_satellite()
system_model.append((TrType.ATSC.name,))
[modulation_model.append((v,)) for k, v in A_MODULATION.items()]
# Extra
self._namespace_entry.set_max_width_chars(25)
def get_transponder_grid_for_non_satellite(self):
self._pids_grid.set_visible(False)
tr_grid = self._builder.get_object("tr_grid")