diff --git a/app/eparser/ecommons.py b/app/eparser/ecommons.py index 2eebfe9d..557aa4a0 100644 --- a/app/eparser/ecommons.py +++ b/app/eparser/ecommons.py @@ -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"} diff --git a/app/eparser/enigma/lamedb.py b/app/eparser/enigma/lamedb.py index d6ca6798..e0ff943d 100644 --- a/app/eparser/enigma/lamedb.py +++ b/app/eparser/enigma/lamedb.py @@ -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: diff --git a/app/ui/main_app_window.py b/app/ui/main_app_window.py index f30b5079..f3500cc3 100644 --- a/app/ui/main_app_window.py +++ b/app/ui/main_app_window.py @@ -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 diff --git a/app/ui/service_details_dialog.glade b/app/ui/service_details_dialog.glade index b4d29abe..0b798ab7 100644 --- a/app/ui/service_details_dialog.glade +++ b/app/ui/service_details_dialog.glade @@ -40,37 +40,37 @@ Author: Dmitriy Yefremov - Auto + Auto - 1/2 + 1/2 2/3 - 3/4 + 3/4 - 5/6 + 5/6 - 7/8 + 7/8 - 8/9 + 8/9 - 3/5 + 3/5 - 4/5 + 4/5 - 6/7 + 6/7 - 9/10 + 9/10 @@ -94,13 +94,13 @@ Author: Dmitriy Yefremov - Off + Off - On + On - Auto + Auto @@ -111,19 +111,19 @@ Author: Dmitriy Yefremov - Auto + Auto - QPSK + QPSK - 8PSK + 8PSK - 16APSK + 16APSK - 32APSK + 32APSK @@ -134,13 +134,13 @@ Author: Dmitriy Yefremov - Off + Off - On + On - Auto + Auto @@ -151,13 +151,13 @@ Author: Dmitriy Yefremov - Root + Root - Gold + Gold - Combo + Combo @@ -168,16 +168,16 @@ Author: Dmitriy Yefremov - H + H - V + V - R + R - L + L @@ -188,16 +188,16 @@ Author: Dmitriy Yefremov - 35% + 35% - 25% + 25% - 20% + 20% - Auto + Auto @@ -253,10 +253,10 @@ Author: Dmitriy Yefremov - DVB-S + DVB-S - DVB-S2 + DVB-S2 diff --git a/app/ui/service_details_dialog.py b/app/ui/service_details_dialog.py index dbd212c7..23ff6c5f 100644 --- a/app/ui/service_details_dialog.py +++ b/app/ui/service_details_dialog.py @@ -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")