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