2021-05-19 17:51:48 +03:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
#
|
|
|
|
|
# The MIT License (MIT)
|
|
|
|
|
#
|
2022-02-21 12:22:44 +03:00
|
|
|
# Copyright (c) 2018-2022 Dmitriy Yefremov
|
2021-05-19 17:51:48 +03:00
|
|
|
#
|
|
|
|
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
|
# of this software and associated documentation files (the "Software"), to deal
|
|
|
|
|
# in the Software without restriction, including without limitation the rights
|
|
|
|
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
|
# copies of the Software, and to permit persons to whom the Software is
|
|
|
|
|
# furnished to do so, subject to the following conditions:
|
|
|
|
|
#
|
|
|
|
|
# The above copyright notice and this permission notice shall be included in
|
|
|
|
|
# all copies or substantial portions of the Software.
|
|
|
|
|
#
|
|
|
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
|
# THE SOFTWARE.
|
|
|
|
|
#
|
|
|
|
|
# Author: Dmitriy Yefremov
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
|
2018-03-27 23:03:01 +03:00
|
|
|
import os
|
2020-09-08 12:21:10 +03:00
|
|
|
import re
|
2018-03-27 23:03:01 +03:00
|
|
|
|
2021-01-18 22:37:11 +03:00
|
|
|
from app.commons import run_idle, log
|
2018-03-30 09:07:17 +03:00
|
|
|
from app.eparser import Service
|
2020-09-08 12:21:10 +03:00
|
|
|
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,
|
2021-04-01 09:01:08 +03:00
|
|
|
HIERARCHY, A_MODULATION)
|
2021-08-25 14:05:27 +03:00
|
|
|
from app.eparser.neutrino import get_attributes, SP, KSP
|
2019-12-22 20:42:29 +03:00
|
|
|
from app.settings import SettingsType
|
2021-04-28 14:12:59 +03:00
|
|
|
from .dialogs import show_dialog, DialogType, Action, get_builder
|
2018-03-11 21:52:10 +03:00
|
|
|
from .main_helper import get_base_model
|
2021-04-28 14:12:59 +03:00
|
|
|
from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, HIDE_ICON, CODED_ICON, Column
|
2018-02-16 01:56:28 +03:00
|
|
|
|
2019-05-10 14:41:33 +03:00
|
|
|
_UI_PATH = UI_RESOURCES_PATH + "service_details_dialog.glade"
|
|
|
|
|
|
2018-02-16 01:56:28 +03:00
|
|
|
|
2018-02-14 00:00:52 +03:00
|
|
|
class ServiceDetailsDialog:
|
2018-03-17 22:18:10 +03:00
|
|
|
_ENIGMA2_DATA_ID = "{:04x}:{:08x}:{:04x}:{:04x}:{}:{}"
|
2018-02-23 17:14:08 +03:00
|
|
|
|
2018-03-17 22:18:10 +03:00
|
|
|
_ENIGMA2_FAV_ID = "{:X}:{:X}:{:X}:{:X}"
|
2018-02-23 17:14:08 +03:00
|
|
|
|
2018-03-17 22:18:10 +03:00
|
|
|
_ENIGMA2_TRANSPONDER_DATA = "{} {}:{}:{}:{}:{}:{}:{}"
|
|
|
|
|
|
|
|
|
|
_NEUTRINO_FAV_ID = "{:x}:{:x}:{:x}"
|
|
|
|
|
|
2018-03-18 18:11:16 +03:00
|
|
|
_DIGIT_ENTRY_ELEMENTS = ("bitstream_entry", "pcm_entry", "video_pid_entry", "pcr_pid_entry", "srv_type_entry",
|
|
|
|
|
"ac3_pid_entry", "ac3plus_pid_entry", "acc_pid_entry", "he_acc_pid_entry",
|
|
|
|
|
"teletext_pid_entry", "pls_code_entry", "stream_id_entry", "tr_flag_entry",
|
2018-03-20 23:42:06 +03:00
|
|
|
"audio_pid_entry")
|
|
|
|
|
_NOT_EMPTY_DIGIT_ELEMENTS = ("sid_entry", "freq_entry", "rate_entry", "transponder_id_entry", "network_id_entry",
|
2018-03-26 17:33:20 +03:00
|
|
|
"namespace_entry", "srv_type_entry")
|
2018-02-20 23:34:07 +03:00
|
|
|
|
2018-03-18 17:13:21 +03:00
|
|
|
_DIGIT_ENTRY_NAME = "digit-entry"
|
|
|
|
|
|
2022-02-21 12:22:44 +03:00
|
|
|
def __init__(self, app, new_color, action=Action.EDIT):
|
2018-02-18 17:14:02 +03:00
|
|
|
handlers = {"on_system_changed": self.on_system_changed,
|
|
|
|
|
"on_save": self.on_save,
|
2018-02-20 23:34:07 +03:00
|
|
|
"on_create_new": self.on_create_new,
|
2018-03-18 18:11:16 +03:00
|
|
|
"on_tr_edit_toggled": self.on_tr_edit_toggled,
|
2018-03-29 13:49:01 +03:00
|
|
|
"update_reference": self.update_reference,
|
|
|
|
|
"on_cas_entry_changed": self.on_cas_entry_changed,
|
2021-05-19 17:51:48 +03:00
|
|
|
"on_extra_pids_entry_changed": self.on_extra_pids_entry_changed,
|
2018-03-29 13:49:01 +03:00
|
|
|
"on_digit_entry_changed": self.on_digit_entry_changed,
|
2021-01-21 15:03:01 +03:00
|
|
|
"on_non_empty_entry_changed": self.on_non_empty_entry_changed,
|
|
|
|
|
"on_cancel": lambda item: self._dialog.destroy()}
|
2018-02-17 16:23:41 +03:00
|
|
|
|
2021-04-28 14:12:59 +03:00
|
|
|
builder = get_builder(_UI_PATH, handlers, use_str=True)
|
2018-03-23 21:42:54 +03:00
|
|
|
self._builder = builder
|
2022-02-21 12:22:44 +03:00
|
|
|
settings = app.app_settings
|
2018-02-14 00:00:52 +03:00
|
|
|
|
|
|
|
|
self._dialog = builder.get_object("service_details_dialog")
|
2022-02-21 12:22:44 +03:00
|
|
|
self._dialog.set_transient_for(app.app_window)
|
2019-12-22 20:42:29 +03:00
|
|
|
self._s_type = settings.setting_type
|
2021-01-21 15:03:01 +03:00
|
|
|
self._tr_type = TrType.Satellite
|
2021-08-30 15:04:15 +03:00
|
|
|
self._picons_path = settings.profile_picons_path
|
2022-02-21 12:22:44 +03:00
|
|
|
self._services_view = app.services_view
|
|
|
|
|
self._fav_view = app.fav_view
|
2018-03-10 17:49:53 +03:00
|
|
|
self._action = action
|
2018-02-20 00:20:32 +03:00
|
|
|
self._old_service = None
|
2022-02-21 12:22:44 +03:00
|
|
|
self._services = app.current_services
|
|
|
|
|
self._bouquets = app.current_bouquets
|
2018-12-23 16:15:48 +03:00
|
|
|
self._new_color = new_color
|
2018-02-25 22:59:36 +03:00
|
|
|
self._transponder_services_iters = None
|
2018-02-20 23:34:07 +03:00
|
|
|
self._current_model = None
|
2018-02-26 16:26:53 +03:00
|
|
|
self._current_itr = None
|
2018-03-29 13:49:01 +03:00
|
|
|
# Patterns
|
2019-05-10 14:41:33 +03:00
|
|
|
self._DIGIT_PATTERN = re.compile("\\D")
|
|
|
|
|
self._NON_EMPTY_PATTERN = re.compile("(?:^[\\s]*$|\\D)")
|
2020-01-18 15:28:46 +03:00
|
|
|
self._CAID_PATTERN = re.compile("(?:^[\\s]*$)|(C:[0-9a-fA-F]{1,4})(,C:[0-9a-fA-F]{1,4})*")
|
2021-05-19 17:51:48 +03:00
|
|
|
self._PIDS_PATTERN = re.compile("(?:^[\\s]*$)|(c:[0-9]{2}[0-9a-fA-F]{4})(,c:[0-9]{2}[0-9a-fA-F]{4})*")
|
2018-03-29 13:49:01 +03:00
|
|
|
# Buttons
|
2018-03-10 17:49:53 +03:00
|
|
|
self._apply_button = builder.get_object("apply_button")
|
|
|
|
|
self._create_button = builder.get_object("create_button")
|
2018-02-20 23:34:07 +03:00
|
|
|
# style
|
|
|
|
|
self._style_provider = Gtk.CssProvider()
|
|
|
|
|
self._style_provider.load_from_path(UI_RESOURCES_PATH + "style.css")
|
2018-03-18 18:11:16 +03:00
|
|
|
# initialization only digit elements
|
2018-02-20 23:34:07 +03:00
|
|
|
self._digit_elements = {k: builder.get_object(k) for k in self._DIGIT_ENTRY_ELEMENTS}
|
|
|
|
|
for elem in self._digit_elements.values():
|
|
|
|
|
elem.get_style_context().add_provider_for_screen(Gdk.Screen.get_default(), self._style_provider,
|
|
|
|
|
Gtk.STYLE_PROVIDER_PRIORITY_USER)
|
2018-03-18 18:11:16 +03:00
|
|
|
# initialization of non empty elements
|
|
|
|
|
self._non_empty_elements = {k: builder.get_object(k) for k in self._NOT_EMPTY_DIGIT_ELEMENTS}
|
|
|
|
|
for elem in self._non_empty_elements.values():
|
|
|
|
|
elem.get_style_context().add_provider_for_screen(Gdk.Screen.get_default(), self._style_provider,
|
|
|
|
|
Gtk.STYLE_PROVIDER_PRIORITY_USER)
|
|
|
|
|
self._sid_entry = self._non_empty_elements.get("sid_entry")
|
2018-02-20 23:34:07 +03:00
|
|
|
self._bitstream_entry = self._digit_elements.get("bitstream_entry")
|
|
|
|
|
self._pcm_entry = self._digit_elements.get("pcm_entry")
|
|
|
|
|
self._video_pid_entry = self._digit_elements.get("video_pid_entry")
|
|
|
|
|
self._pcr_pid_entry = self._digit_elements.get("pcr_pid_entry")
|
|
|
|
|
self._audio_pid_entry = self._digit_elements.get("audio_pid_entry")
|
|
|
|
|
self._ac3_pid_entry = self._digit_elements.get("ac3_pid_entry")
|
|
|
|
|
self._ac3plus_pid_entry = self._digit_elements.get("ac3plus_pid_entry")
|
|
|
|
|
self._acc_pid_entry = self._digit_elements.get("acc_pid_entry")
|
|
|
|
|
self._he_acc_pid_entry = self._digit_elements.get("he_acc_pid_entry")
|
|
|
|
|
self._teletext_pid_entry = self._digit_elements.get("teletext_pid_entry")
|
2018-03-18 18:11:16 +03:00
|
|
|
self._transponder_id_entry = self._non_empty_elements.get("transponder_id_entry")
|
|
|
|
|
self._network_id_entry = self._non_empty_elements.get("network_id_entry")
|
|
|
|
|
self._freq_entry = self._non_empty_elements.get("freq_entry")
|
|
|
|
|
self._rate_entry = self._non_empty_elements.get("rate_entry")
|
2018-02-20 23:34:07 +03:00
|
|
|
self._pls_code_entry = self._digit_elements.get("pls_code_entry")
|
|
|
|
|
self._stream_id_entry = self._digit_elements.get("stream_id_entry")
|
2018-02-26 16:26:53 +03:00
|
|
|
self._tr_flag_entry = self._digit_elements.get("tr_flag_entry")
|
2018-03-20 23:42:06 +03:00
|
|
|
self._namespace_entry = self._non_empty_elements.get("namespace_entry")
|
2021-05-19 17:51:48 +03:00
|
|
|
self._extra_pids_entry = builder.get_object("extra_pids_entry")
|
2018-02-15 15:16:34 +03:00
|
|
|
# Service elements
|
|
|
|
|
self._name_entry = builder.get_object("name_entry")
|
|
|
|
|
self._package_entry = builder.get_object("package_entry")
|
2018-03-26 17:33:20 +03:00
|
|
|
self._srv_type_entry = self._non_empty_elements.get("srv_type_entry")
|
2018-02-16 07:41:19 +03:00
|
|
|
self._service_type_combo_box = builder.get_object("service_type_combo_box")
|
2018-02-16 01:56:28 +03:00
|
|
|
self._cas_entry = builder.get_object("cas_entry")
|
2018-02-15 15:16:34 +03:00
|
|
|
self._reference_entry = builder.get_object("reference_entry")
|
|
|
|
|
self._keep_check_button = builder.get_object("keep_check_button")
|
|
|
|
|
self._hide_check_button = builder.get_object("hide_check_button")
|
|
|
|
|
self._use_pids_check_button = builder.get_object("use_pids_check_button")
|
|
|
|
|
self._new_check_button = builder.get_object("new_check_button")
|
2018-03-03 23:24:43 +03:00
|
|
|
self._pids_grid = builder.get_object("pids_grid")
|
2018-02-15 15:16:34 +03:00
|
|
|
# Transponder elements
|
2018-03-20 00:33:00 +03:00
|
|
|
self._sat_pos_button = builder.get_object("sat_pos_button")
|
2021-01-18 22:37:11 +03:00
|
|
|
self._pos_side_box = builder.get_object("pos_side_box")
|
2018-02-15 15:16:34 +03:00
|
|
|
self._pol_combo_box = builder.get_object("pol_combo_box")
|
|
|
|
|
self._fec_combo_box = builder.get_object("fec_combo_box")
|
2019-01-24 10:04:27 +03:00
|
|
|
self._rate_lp_combo_box = builder.get_object("rate_lp_combo_box")
|
2018-02-15 15:16:34 +03:00
|
|
|
self._sys_combo_box = builder.get_object("sys_combo_box")
|
|
|
|
|
self._mod_combo_box = builder.get_object("mod_combo_box")
|
|
|
|
|
self._invertion_combo_box = builder.get_object("invertion_combo_box")
|
|
|
|
|
self._rolloff_combo_box = builder.get_object("rolloff_combo_box")
|
|
|
|
|
self._pilot_combo_box = builder.get_object("pilot_combo_box")
|
|
|
|
|
self._pls_mode_combo_box = builder.get_object("pls_mode_combo_box")
|
2018-02-25 22:59:36 +03:00
|
|
|
self._tr_edit_switch = builder.get_object("tr_edit_switch")
|
2018-03-20 00:33:00 +03:00
|
|
|
self._tr_extra_expander = builder.get_object("tr_extra_expander")
|
2018-02-20 23:34:07 +03:00
|
|
|
|
2018-02-17 16:23:41 +03:00
|
|
|
self._DVB_S2_ELEMENTS = (self._mod_combo_box, self._rolloff_combo_box, self._pilot_combo_box,
|
|
|
|
|
self._pls_mode_combo_box, self._pls_code_entry, self._stream_id_entry)
|
2018-03-20 00:33:00 +03:00
|
|
|
self._TRANSPONDER_ELEMENTS = (self._sat_pos_button, self._pol_combo_box, self._invertion_combo_box,
|
2018-02-23 23:56:19 +03:00
|
|
|
self._sys_combo_box, self._freq_entry, self._transponder_id_entry,
|
|
|
|
|
self._network_id_entry, self._namespace_entry, self._fec_combo_box,
|
2021-01-18 22:37:11 +03:00
|
|
|
self._rate_entry, self._rate_lp_combo_box, self._pos_side_box)
|
2018-02-20 23:34:07 +03:00
|
|
|
|
2018-03-10 17:49:53 +03:00
|
|
|
if self._action is Action.EDIT:
|
|
|
|
|
self.update_data_elements()
|
|
|
|
|
elif self._action is Action.ADD:
|
2018-03-20 00:33:00 +03:00
|
|
|
self.init_default_data_elements()
|
2018-02-15 15:16:34 +03:00
|
|
|
|
2018-03-03 23:24:43 +03:00
|
|
|
def show(self):
|
2021-01-21 15:03:01 +03:00
|
|
|
self._dialog.show()
|
2018-03-03 23:24:43 +03:00
|
|
|
|
2018-03-20 00:33:00 +03:00
|
|
|
@run_idle
|
|
|
|
|
def init_default_data_elements(self):
|
|
|
|
|
self._apply_button.set_visible(False)
|
|
|
|
|
self._create_button.set_visible(True)
|
|
|
|
|
self._tr_edit_switch.set_sensitive(False)
|
|
|
|
|
self.on_tr_edit_toggled(self._tr_edit_switch.set_active(True), True)
|
|
|
|
|
for elem in self._non_empty_elements.values():
|
|
|
|
|
elem.set_text(" ")
|
|
|
|
|
elem.set_text("")
|
|
|
|
|
self._new_check_button.set_active(True)
|
|
|
|
|
self._tr_extra_expander.activate()
|
|
|
|
|
self._service_type_combo_box.set_active(0)
|
|
|
|
|
self._pol_combo_box.set_active(0)
|
|
|
|
|
self._fec_combo_box.set_active(0)
|
|
|
|
|
self._sys_combo_box.set_active(0)
|
|
|
|
|
self._invertion_combo_box.set_active(2)
|
|
|
|
|
|
2018-02-15 15:16:34 +03:00
|
|
|
def update_data_elements(self):
|
|
|
|
|
model, paths = self._services_view.get_selection().get_selected_rows()
|
2018-02-26 16:26:53 +03:00
|
|
|
# Unpacking to search for an iterator for the base model
|
|
|
|
|
filter_model = model.get_model()
|
2018-02-20 23:34:07 +03:00
|
|
|
self._current_model = get_base_model(model)
|
2018-09-28 10:09:36 +03:00
|
|
|
itr = None
|
|
|
|
|
if not paths:
|
|
|
|
|
# If editing from bouquet list and services list in the filter mode
|
|
|
|
|
fav_model, paths = self._fav_view.get_selection().get_selected_rows()
|
|
|
|
|
fav_id = fav_model[paths][7]
|
|
|
|
|
for row in self._current_model:
|
|
|
|
|
if row[-2] == fav_id:
|
|
|
|
|
itr = row.iter
|
|
|
|
|
break
|
|
|
|
|
else:
|
|
|
|
|
itr = model.get_iter(paths)
|
|
|
|
|
itr = filter_model.convert_iter_to_child_iter(model.convert_iter_to_child_iter(itr))
|
|
|
|
|
|
|
|
|
|
if not itr:
|
|
|
|
|
return
|
|
|
|
|
|
2018-12-16 17:28:07 +03:00
|
|
|
srv = Service(*self._current_model[itr][: Column.SRV_TOOLTIP])
|
2018-02-26 16:26:53 +03:00
|
|
|
self._old_service = srv
|
|
|
|
|
self._current_itr = itr
|
2018-02-20 00:20:32 +03:00
|
|
|
# Service
|
|
|
|
|
self._name_entry.set_text(srv.service)
|
|
|
|
|
self._package_entry.set_text(srv.package)
|
2018-03-02 15:12:21 +03:00
|
|
|
self._sid_entry.set_text(str(int(srv.ssid, 16)))
|
2018-02-20 00:20:32 +03:00
|
|
|
# Transponder
|
2021-08-23 14:34:56 +03:00
|
|
|
self._tr_type = TrType(srv.transponder_type)
|
2018-02-20 00:20:32 +03:00
|
|
|
self._freq_entry.set_text(srv.freq)
|
|
|
|
|
self._rate_entry.set_text(srv.rate)
|
|
|
|
|
self.select_active_text(self._pol_combo_box, srv.pol)
|
|
|
|
|
self.select_active_text(self._fec_combo_box, srv.fec)
|
2018-03-03 23:24:43 +03:00
|
|
|
self.select_active_text(self._sys_combo_box, srv.system)
|
2019-01-20 00:25:02 +03:00
|
|
|
if self._tr_type is TrType.Terrestrial:
|
2018-10-15 11:39:33 +03:00
|
|
|
self.update_ui_for_terrestrial()
|
2019-01-20 00:25:02 +03:00
|
|
|
elif self._tr_type is TrType.Cable:
|
|
|
|
|
self.update_ui_for_cable()
|
2021-04-01 09:01:08 +03:00
|
|
|
elif self._tr_type is TrType.ATSC:
|
|
|
|
|
self.update_ui_for_atsc()
|
2018-10-15 11:39:33 +03:00
|
|
|
else:
|
|
|
|
|
self.set_sat_positions(srv.pos)
|
2018-02-20 00:20:32 +03:00
|
|
|
|
2019-12-22 20:42:29 +03:00
|
|
|
if self._s_type is SettingsType.ENIGMA_2:
|
2018-02-20 00:20:32 +03:00
|
|
|
self.init_enigma2_service_data(srv)
|
|
|
|
|
self.init_enigma2_transponder_data(srv)
|
2019-12-22 20:42:29 +03:00
|
|
|
elif self._s_type is SettingsType.NEUTRINO_MP:
|
2018-03-03 23:24:43 +03:00
|
|
|
self.init_neutrino_data(srv)
|
2018-03-23 21:42:54 +03:00
|
|
|
self.init_neutrino_ui_elements()
|
2018-03-03 23:24:43 +03:00
|
|
|
|
|
|
|
|
# ***************** Init Enigma2 data *********************#
|
2018-02-16 01:56:28 +03:00
|
|
|
|
2018-02-17 16:23:41 +03:00
|
|
|
@run_idle
|
|
|
|
|
def init_enigma2_service_data(self, srv):
|
2018-02-16 01:56:28 +03:00
|
|
|
""" Service data initialisation """
|
2018-02-20 23:34:07 +03:00
|
|
|
flags = srv.flags_cas
|
|
|
|
|
if flags:
|
|
|
|
|
flags = flags.split(",")
|
|
|
|
|
self.init_enigma2_flags(flags)
|
|
|
|
|
self.init_enigma2_pids(flags)
|
|
|
|
|
self.init_enigma2_cas(flags)
|
2018-02-17 16:23:41 +03:00
|
|
|
|
2018-02-20 23:34:07 +03:00
|
|
|
def init_enigma2_flags(self, flags):
|
|
|
|
|
f_flags = list(filter(lambda x: x.startswith("f:"), flags))
|
|
|
|
|
if f_flags:
|
2021-10-20 11:46:22 +03:00
|
|
|
value = Flag.parse(f_flags[0])
|
2018-02-19 23:18:01 +03:00
|
|
|
self._keep_check_button.set_active(Flag.is_keep(value))
|
|
|
|
|
self._hide_check_button.set_active(Flag.is_hide(value))
|
|
|
|
|
self._use_pids_check_button.set_active(Flag.is_pids(value))
|
|
|
|
|
self._new_check_button.set_active(Flag.is_new(value))
|
|
|
|
|
|
2018-02-20 23:34:07 +03:00
|
|
|
def init_enigma2_cas(self, flags):
|
|
|
|
|
cas = list(filter(lambda x: x.startswith("C:"), flags))
|
|
|
|
|
if cas:
|
|
|
|
|
self._cas_entry.set_text(",".join(cas))
|
|
|
|
|
|
|
|
|
|
def init_enigma2_pids(self, flags):
|
2018-02-16 01:56:28 +03:00
|
|
|
pids = list(filter(lambda x: x.startswith("c:"), flags))
|
|
|
|
|
if pids:
|
2021-05-19 17:51:48 +03:00
|
|
|
extra_pids = []
|
2018-02-16 01:56:28 +03:00
|
|
|
for pid in pids:
|
2018-02-16 01:58:43 +03:00
|
|
|
if pid.startswith(Pids.VIDEO.value):
|
2018-02-17 16:23:41 +03:00
|
|
|
self._video_pid_entry.set_text(str(int(pid[4:], 16)))
|
2018-02-16 01:58:43 +03:00
|
|
|
elif pid.startswith(Pids.AUDIO.value):
|
2018-02-17 16:23:41 +03:00
|
|
|
self._audio_pid_entry.set_text(str(int(pid[4:], 16)))
|
2018-02-16 01:58:43 +03:00
|
|
|
elif pid.startswith(Pids.TELETEXT.value):
|
2018-02-17 16:23:41 +03:00
|
|
|
self._teletext_pid_entry.set_text(str(int(pid[4:], 16)))
|
2018-02-16 01:58:43 +03:00
|
|
|
elif pid.startswith(Pids.PCR.value):
|
2018-02-17 16:23:41 +03:00
|
|
|
self._pcr_pid_entry.set_text(str(int(pid[4:], 16)))
|
2018-02-16 01:58:43 +03:00
|
|
|
elif pid.startswith(Pids.AC3.value):
|
2018-02-17 16:23:41 +03:00
|
|
|
self._ac3_pid_entry.set_text(str(int(pid[4:], 16)))
|
2018-02-16 01:58:43 +03:00
|
|
|
elif pid.startswith(Pids.VIDEO_TYPE.value):
|
2021-05-19 17:51:48 +03:00
|
|
|
extra_pids.append(pid)
|
2018-02-16 01:58:43 +03:00
|
|
|
elif pid.startswith(Pids.AUDIO_CHANNEL.value):
|
2021-05-19 17:51:48 +03:00
|
|
|
extra_pids.append(pid)
|
2018-02-16 01:58:43 +03:00
|
|
|
elif pid.startswith(Pids.BIT_STREAM_DELAY.value):
|
2018-02-17 16:23:41 +03:00
|
|
|
self._bitstream_entry.set_text(str(int(pid[4:], 16)))
|
2018-02-16 01:58:43 +03:00
|
|
|
elif pid.startswith(Pids.PCM_DELAY.value):
|
2018-02-17 16:23:41 +03:00
|
|
|
self._pcm_entry.set_text(str(int(pid[4:], 16)))
|
2018-02-16 01:58:43 +03:00
|
|
|
elif pid.startswith(Pids.SUBTITLE.value):
|
2021-05-19 17:51:48 +03:00
|
|
|
extra_pids.append(pid)
|
|
|
|
|
else:
|
|
|
|
|
extra_pids.append(pid)
|
|
|
|
|
|
|
|
|
|
self._extra_pids_entry.set_text(",".join(extra_pids))
|
2018-02-16 01:56:28 +03:00
|
|
|
|
2018-02-17 16:23:41 +03:00
|
|
|
def init_enigma2_transponder_data(self, srv):
|
2018-02-16 01:56:28 +03:00
|
|
|
""" Transponder data initialisation """
|
2018-02-17 16:23:41 +03:00
|
|
|
data = srv.data_id.split(":")
|
|
|
|
|
tr_data = srv.transponder.split(":")
|
2019-01-18 18:35:22 +03:00
|
|
|
tr_type = TrType(srv.transponder_type)
|
2018-02-17 16:23:41 +03:00
|
|
|
|
|
|
|
|
self._namespace_entry.set_text(str(int(data[1], 16)))
|
|
|
|
|
self._transponder_id_entry.set_text(str(int(data[2], 16)))
|
|
|
|
|
self._network_id_entry.set_text(str(int(data[3], 16)))
|
2019-01-18 18:35:22 +03:00
|
|
|
|
|
|
|
|
if tr_type is TrType.Satellite:
|
|
|
|
|
self.select_active_text(self._invertion_combo_box, Inversion(tr_data[5]).name)
|
|
|
|
|
if srv.system == "DVB-S2":
|
|
|
|
|
self.select_active_text(self._mod_combo_box, MODULATION.get(tr_data[8]))
|
|
|
|
|
self.select_active_text(self._rolloff_combo_box, ROLL_OFF.get(tr_data[9]))
|
|
|
|
|
self.select_active_text(self._pilot_combo_box, Pilot(tr_data[10]).name)
|
|
|
|
|
self._tr_flag_entry.set_text(tr_data[7])
|
|
|
|
|
if len(tr_data) > 12:
|
|
|
|
|
self._stream_id_entry.set_text(tr_data[11])
|
|
|
|
|
self._pls_code_entry.set_text(tr_data[12])
|
|
|
|
|
self.select_active_text(self._pls_mode_combo_box, PLS_MODE.get(tr_data[13]))
|
|
|
|
|
elif tr_type is TrType.Cable:
|
|
|
|
|
self.select_active_text(self._invertion_combo_box, Inversion(tr_data[2]).name)
|
|
|
|
|
self.select_active_text(self._mod_combo_box, C_MODULATION.get(tr_data[3]))
|
|
|
|
|
self.select_active_text(self._fec_combo_box, FEC_DEFAULT.get(tr_data[4]))
|
2019-01-20 00:25:02 +03:00
|
|
|
self.select_active_text(self._sys_combo_box, SystemCable(tr_data[5]).name)
|
2019-01-18 18:35:22 +03:00
|
|
|
elif tr_type is TrType.Terrestrial:
|
2019-01-21 18:04:46 +03:00
|
|
|
self.select_active_text(self._fec_combo_box, T_FEC.get(tr_data[2]))
|
2019-01-24 10:04:27 +03:00
|
|
|
self.select_active_text(self._rate_lp_combo_box, T_FEC.get(tr_data[3]))
|
2019-01-21 18:04:46 +03:00
|
|
|
# Pol -> Bandwidth
|
|
|
|
|
self.select_active_text(self._pol_combo_box, BANDWIDTH.get(tr_data[1]))
|
2019-01-18 18:35:22 +03:00
|
|
|
self.select_active_text(self._mod_combo_box, T_MODULATION.get(tr_data[4]))
|
2019-01-21 18:04:46 +03:00
|
|
|
# Transmission Mode -> Roll off
|
|
|
|
|
self.select_active_text(self._rolloff_combo_box, TRANSMISSION_MODE.get(tr_data[5]))
|
|
|
|
|
# GuardInterval -> Pilot
|
|
|
|
|
self.select_active_text(self._pilot_combo_box, GUARD_INTERVAL.get(tr_data[6]))
|
|
|
|
|
# Hierarchy -> Pls Mode
|
|
|
|
|
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]))
|
2021-04-01 09:01:08 +03:00
|
|
|
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)
|
|
|
|
|
|
2018-03-26 17:33:20 +03:00
|
|
|
# Should be called last to properly initialize the reference
|
|
|
|
|
self._srv_type_entry.set_text(data[4])
|
2018-02-15 15:16:34 +03:00
|
|
|
|
2018-03-03 23:24:43 +03:00
|
|
|
# ***************** Init Neutrino data *********************#
|
|
|
|
|
|
|
|
|
|
def init_neutrino_data(self, srv):
|
2021-08-23 14:34:56 +03:00
|
|
|
if self._tr_type is not TrType.Satellite:
|
|
|
|
|
return
|
2021-08-25 14:05:27 +03:00
|
|
|
tr_data = get_attributes(srv.transponder)
|
2021-08-23 14:34:56 +03:00
|
|
|
self._transponder_id_entry.set_text(str(int(tr_data.get("id", "0"), 16)))
|
|
|
|
|
self._network_id_entry.set_text(str(int(tr_data.get("on", "0"), 16)))
|
|
|
|
|
self.select_active_text(self._invertion_combo_box, Inversion(tr_data.get("inv", "2")).name)
|
2018-03-26 17:33:20 +03:00
|
|
|
self.select_active_text(self._service_type_combo_box, srv.service_type)
|
|
|
|
|
self.update_reference_entry()
|
2018-03-03 23:24:43 +03:00
|
|
|
|
2018-03-23 21:42:54 +03:00
|
|
|
def init_neutrino_ui_elements(self):
|
|
|
|
|
self._builder.get_object("flags_box").set_visible(False)
|
|
|
|
|
self._builder.get_object("pids_grid").set_visible(False)
|
2019-01-18 18:35:22 +03:00
|
|
|
tr_grid = self._builder.get_object("tr_grid")
|
|
|
|
|
tr_grid.remove_column(7)
|
|
|
|
|
tr_grid.set_margin_bottom(5)
|
2018-03-25 10:46:30 +03:00
|
|
|
self._builder.get_object("tr_extra_expander").set_visible(False)
|
2018-03-23 21:42:54 +03:00
|
|
|
self._builder.get_object("srv_separator").set_visible(False)
|
2021-08-23 14:34:56 +03:00
|
|
|
self._package_entry.set_sensitive(False)
|
2018-03-03 23:24:43 +03:00
|
|
|
|
|
|
|
|
# ***************** Init Sat positions *********************#
|
2018-02-14 00:00:52 +03:00
|
|
|
|
2018-02-17 16:23:41 +03:00
|
|
|
def set_sat_positions(self, sat_pos):
|
2018-03-03 23:24:43 +03:00
|
|
|
""" Sat positions initialisation """
|
2021-01-18 22:37:11 +03:00
|
|
|
self._sat_pos_button.set_value(float(sat_pos[:-1]))
|
|
|
|
|
self._pos_side_box.set_active_id(sat_pos[-1:])
|
2018-02-17 16:23:41 +03:00
|
|
|
|
|
|
|
|
def on_system_changed(self, box):
|
2018-02-26 16:26:53 +03:00
|
|
|
if not self._tr_edit_switch.get_active():
|
|
|
|
|
return
|
|
|
|
|
active = box.get_active()
|
|
|
|
|
self.update_dvb_s2_elements(active)
|
|
|
|
|
|
|
|
|
|
def update_dvb_s2_elements(self, active):
|
2018-02-17 16:23:41 +03:00
|
|
|
for elem in self._DVB_S2_ELEMENTS:
|
2018-02-26 16:26:53 +03:00
|
|
|
elem.set_sensitive(active)
|
2018-02-20 23:34:07 +03:00
|
|
|
self._pls_code_entry.set_name("GtkEntry")
|
|
|
|
|
self._stream_id_entry.set_name("GtkEntry")
|
2018-02-17 16:23:41 +03:00
|
|
|
|
2018-03-28 17:29:07 +03:00
|
|
|
if active:
|
|
|
|
|
if not self._mod_combo_box.get_active_id():
|
|
|
|
|
self._mod_combo_box.set_active_id(MODULATION["2"])
|
|
|
|
|
if not self._rolloff_combo_box.get_active_id():
|
|
|
|
|
self._rolloff_combo_box.set_active_id(ROLL_OFF["0"])
|
|
|
|
|
if not self._pilot_combo_box.get_active_id():
|
|
|
|
|
self._pilot_combo_box.set_active_id(Pilot.Auto.name)
|
|
|
|
|
if not self._pls_mode_combo_box.get_active_id():
|
|
|
|
|
self._pls_mode_combo_box.set_active_id(PLS_MODE["0"])
|
|
|
|
|
|
2018-03-03 23:24:43 +03:00
|
|
|
# ***************** Save data *********************#
|
2018-02-14 00:00:52 +03:00
|
|
|
|
2018-02-18 17:14:02 +03:00
|
|
|
def on_save(self, item):
|
2018-03-18 18:11:16 +03:00
|
|
|
self.save_data()
|
|
|
|
|
|
|
|
|
|
def on_create_new(self, item):
|
|
|
|
|
self.save_data()
|
|
|
|
|
|
|
|
|
|
def save_data(self):
|
2021-08-23 14:34:56 +03:00
|
|
|
if self._s_type is SettingsType.NEUTRINO_MP and self._tr_type is not TrType.Satellite:
|
|
|
|
|
show_dialog(DialogType.ERROR, transient=self._dialog, text="Not implemented yet!")
|
|
|
|
|
return
|
|
|
|
|
|
2018-03-18 17:13:21 +03:00
|
|
|
if not self.is_data_correct():
|
|
|
|
|
show_dialog(DialogType.ERROR, self._dialog, "Error. Verify the data!")
|
|
|
|
|
return
|
|
|
|
|
|
2018-02-20 00:20:32 +03:00
|
|
|
if show_dialog(DialogType.QUESTION, self._dialog) == Gtk.ResponseType.CANCEL:
|
|
|
|
|
return
|
2018-02-25 22:59:36 +03:00
|
|
|
|
2021-01-21 15:03:01 +03:00
|
|
|
if self.on_edit() if self._action is Action.EDIT else self.on_new():
|
|
|
|
|
self._dialog.destroy()
|
2018-03-18 18:11:16 +03:00
|
|
|
|
2019-01-18 18:35:22 +03:00
|
|
|
def on_new(self):
|
|
|
|
|
""" Create new service. """
|
|
|
|
|
service = self.get_service(*self.get_srv_data(), self.get_satellite_transponder_data())
|
|
|
|
|
show_dialog(DialogType.ERROR, transient=self._dialog, text="Not implemented yet!")
|
2021-01-21 15:03:01 +03:00
|
|
|
return True
|
2019-01-18 18:35:22 +03:00
|
|
|
|
2018-03-18 18:11:16 +03:00
|
|
|
def on_edit(self):
|
2019-01-18 18:35:22 +03:00
|
|
|
""" Edit current service. """
|
2018-02-23 17:14:08 +03:00
|
|
|
fav_id, data_id = self.get_srv_data()
|
2021-01-18 22:37:11 +03:00
|
|
|
# Transponder
|
2018-02-25 22:59:36 +03:00
|
|
|
transponder = self._old_service.transponder
|
|
|
|
|
if self._tr_edit_switch.get_active():
|
2019-01-23 16:36:50 +03:00
|
|
|
try:
|
|
|
|
|
if self._tr_type is TrType.Satellite:
|
|
|
|
|
transponder = self.get_satellite_transponder_data()
|
|
|
|
|
elif self._tr_type is TrType.Terrestrial:
|
|
|
|
|
transponder = self.get_terrestrial_transponder_data()
|
|
|
|
|
elif self._tr_type is TrType.Cable:
|
|
|
|
|
transponder = self.get_cable_transponder_data()
|
2021-04-01 09:01:08 +03:00
|
|
|
elif self._tr_type is TrType.ATSC:
|
|
|
|
|
transponder = self.get_atsc_transponder_data()
|
2019-01-23 16:36:50 +03:00
|
|
|
except Exception as e:
|
2021-01-18 22:37:11 +03:00
|
|
|
log("Edit service error: {}".format(e))
|
2019-01-23 16:36:50 +03:00
|
|
|
show_dialog(DialogType.ERROR, transient=self._dialog, text="Error getting transponder parameters!")
|
|
|
|
|
else:
|
|
|
|
|
if self._transponder_services_iters:
|
2021-01-21 15:03:01 +03:00
|
|
|
self.update_transponder_services(transponder, self.get_sat_position())
|
2021-01-18 22:37:11 +03:00
|
|
|
# Service
|
2019-01-18 18:35:22 +03:00
|
|
|
service = self.get_service(fav_id, data_id, transponder)
|
2018-02-23 17:14:08 +03:00
|
|
|
old_fav_id = self._old_service.fav_id
|
|
|
|
|
if old_fav_id != fav_id:
|
2021-01-21 15:03:01 +03:00
|
|
|
if fav_id in self._services:
|
|
|
|
|
msg = "{}\n\n\t{}".format("A similar service is already in this list!", "Are you sure?")
|
|
|
|
|
if show_dialog(DialogType.QUESTION, transient=self._dialog, text=msg) != Gtk.ResponseType.OK:
|
|
|
|
|
return False
|
2018-03-26 17:33:20 +03:00
|
|
|
self.update_bouquets(fav_id, old_fav_id)
|
2021-01-21 15:03:01 +03:00
|
|
|
|
2018-02-23 17:14:08 +03:00
|
|
|
self._services[fav_id] = service
|
2018-10-21 18:34:14 +03:00
|
|
|
|
2018-03-26 17:33:20 +03:00
|
|
|
if self._old_service.picon_id != service.picon_id:
|
|
|
|
|
self.update_picon_name(self._old_service.picon_id, service.picon_id)
|
2018-10-21 18:34:14 +03:00
|
|
|
|
2018-12-16 17:47:55 +03:00
|
|
|
flags = service.flags_cas
|
2018-12-17 18:31:57 +03:00
|
|
|
extra_data = {Column.SRV_TOOLTIP: None, Column.SRV_BACKGROUND: None}
|
2021-01-21 15:03:01 +03:00
|
|
|
if self._s_type is SettingsType.ENIGMA_2 and flags:
|
2018-12-16 17:47:55 +03:00
|
|
|
f_flags = list(filter(lambda x: x.startswith("f:"), flags.split(",")))
|
2021-10-20 11:46:22 +03:00
|
|
|
if f_flags and Flag.is_new(Flag.parse(f_flags[0])):
|
2018-12-23 16:15:48 +03:00
|
|
|
extra_data[Column.SRV_BACKGROUND] = self._new_color
|
2018-12-16 17:47:55 +03:00
|
|
|
|
|
|
|
|
self._current_model.set(self._current_itr, extra_data)
|
2018-02-26 16:26:53 +03:00
|
|
|
self._current_model.set(self._current_itr, {i: v for i, v in enumerate(service)})
|
2018-04-10 13:04:21 +03:00
|
|
|
self.update_fav_view(self._old_service, service)
|
2018-02-26 16:26:53 +03:00
|
|
|
self._old_service = service
|
2021-01-21 15:03:01 +03:00
|
|
|
return True
|
2018-02-18 17:14:02 +03:00
|
|
|
|
2018-03-26 17:33:20 +03:00
|
|
|
def update_bouquets(self, fav_id, old_fav_id):
|
|
|
|
|
self._services.pop(old_fav_id, None)
|
|
|
|
|
for bq in self._bouquets.values():
|
|
|
|
|
indexes = []
|
|
|
|
|
for i, f_id in enumerate(bq):
|
|
|
|
|
if old_fav_id == f_id:
|
|
|
|
|
indexes.append(i)
|
|
|
|
|
for i in indexes:
|
|
|
|
|
bq[i] = fav_id
|
|
|
|
|
|
2018-04-10 13:04:21 +03:00
|
|
|
@run_idle
|
|
|
|
|
def update_fav_view(self, old_service, new_service):
|
|
|
|
|
model = self._fav_view.get_model()
|
|
|
|
|
for row in filter(lambda r: old_service.fav_id == r[7], model):
|
2020-09-08 12:21:10 +03:00
|
|
|
itr = row.iter
|
|
|
|
|
if not model.get_value(itr, Column.FAV_BACKGROUND):
|
|
|
|
|
model.set_value(itr, Column.FAV_SERVICE, new_service.service)
|
|
|
|
|
|
|
|
|
|
model.set(itr, {Column.FAV_CODED: new_service.coded,
|
|
|
|
|
Column.FAV_LOCKED: new_service.locked,
|
|
|
|
|
Column.FAV_HIDE: new_service.hide,
|
|
|
|
|
Column.FAV_TYPE: new_service.service_type,
|
|
|
|
|
Column.FAV_POS: new_service.pos,
|
|
|
|
|
Column.FAV_ID: new_service.fav_id,
|
|
|
|
|
Column.FAV_PICON: new_service.picon})
|
2018-04-10 13:04:21 +03:00
|
|
|
|
2018-03-26 17:33:20 +03:00
|
|
|
def update_picon_name(self, old_name, new_name):
|
2021-08-30 15:04:15 +03:00
|
|
|
if not os.path.isdir(self._picons_path):
|
2018-09-11 15:21:05 +03:00
|
|
|
return
|
|
|
|
|
|
2021-08-30 15:04:15 +03:00
|
|
|
for file_name in os.listdir(self._picons_path):
|
2018-03-27 23:03:01 +03:00
|
|
|
if file_name == old_name:
|
2021-08-30 15:04:15 +03:00
|
|
|
old_file = os.path.join(self._picons_path, old_name)
|
|
|
|
|
new_file = os.path.join(self._picons_path, new_name)
|
2018-03-27 23:03:01 +03:00
|
|
|
os.rename(old_file, new_file)
|
|
|
|
|
break
|
2018-03-26 17:33:20 +03:00
|
|
|
|
2019-01-18 18:35:22 +03:00
|
|
|
# ***************** Service ********************* #
|
2018-02-20 00:20:32 +03:00
|
|
|
|
2019-01-18 18:35:22 +03:00
|
|
|
def get_service(self, fav_id, data_id, transponder):
|
|
|
|
|
freq, rate, pol, fec, system, pos = self.get_transponder_values()
|
2018-03-18 17:13:21 +03:00
|
|
|
return Service(flags_cas=self.get_flags(),
|
2019-01-18 18:35:22 +03:00
|
|
|
transponder_type=self._old_service.transponder_type,
|
2018-04-10 13:04:21 +03:00
|
|
|
coded=CODED_ICON if self._cas_entry.get_text() else None,
|
2018-03-18 17:13:21 +03:00
|
|
|
service=self._name_entry.get_text(),
|
|
|
|
|
locked=self._old_service.locked,
|
|
|
|
|
hide=HIDE_ICON if self._hide_check_button.get_active() else None,
|
|
|
|
|
package=self._package_entry.get_text(),
|
2018-03-26 17:33:20 +03:00
|
|
|
service_type=SERVICE_TYPE.get(self._srv_type_entry.get_text(), SERVICE_TYPE["3"]),
|
2018-03-18 17:13:21 +03:00
|
|
|
picon=self._old_service.picon,
|
2018-03-26 17:33:20 +03:00
|
|
|
picon_id=self._reference_entry.get_text().replace(":", "_") + ".png",
|
|
|
|
|
ssid="{:04x}".format(int(self._sid_entry.get_text())),
|
2018-03-18 17:13:21 +03:00
|
|
|
freq=freq,
|
|
|
|
|
rate=rate,
|
|
|
|
|
pol=pol,
|
|
|
|
|
fec=fec,
|
|
|
|
|
system=system,
|
|
|
|
|
pos=pos,
|
|
|
|
|
data_id=data_id,
|
|
|
|
|
fav_id=fav_id,
|
|
|
|
|
transponder=transponder)
|
|
|
|
|
|
2018-02-20 00:20:32 +03:00
|
|
|
def get_flags(self):
|
2019-12-22 20:42:29 +03:00
|
|
|
if self._s_type is SettingsType.ENIGMA_2:
|
2018-02-20 23:34:07 +03:00
|
|
|
return self.get_enigma2_flags()
|
2019-12-22 20:42:29 +03:00
|
|
|
elif self._s_type is SettingsType.NEUTRINO_MP:
|
2021-08-25 14:05:27 +03:00
|
|
|
flags = get_attributes(self._old_service.flags_cas)
|
2021-08-23 14:34:56 +03:00
|
|
|
flags["position"] = self.get_sat_position()
|
|
|
|
|
return SP.join("{}{}{}".format(k, KSP, v) for k, v in flags.items())
|
2018-02-20 23:34:07 +03:00
|
|
|
|
|
|
|
|
def get_enigma2_flags(self):
|
2018-02-26 16:26:53 +03:00
|
|
|
flags = ["p:{}".format(self._package_entry.get_text())]
|
2018-02-20 23:34:07 +03:00
|
|
|
# cas
|
|
|
|
|
cas = self._cas_entry.get_text()
|
|
|
|
|
if cas:
|
|
|
|
|
flags.append(cas)
|
|
|
|
|
# pids
|
|
|
|
|
video_pid = self._video_pid_entry.get_text()
|
|
|
|
|
if video_pid:
|
|
|
|
|
flags.append("{}{:04x}".format(Pids.VIDEO.value, int(video_pid)))
|
|
|
|
|
audio_pid = self._audio_pid_entry.get_text()
|
|
|
|
|
if audio_pid:
|
|
|
|
|
flags.append("{}{:04x}".format(Pids.AUDIO.value, int(audio_pid)))
|
|
|
|
|
teletext_pid = self._teletext_pid_entry.get_text()
|
|
|
|
|
if teletext_pid:
|
|
|
|
|
flags.append("{}{:04x}".format(Pids.TELETEXT.value, int(teletext_pid)))
|
|
|
|
|
pcr_pid = self._pcr_pid_entry.get_text()
|
|
|
|
|
if pcr_pid:
|
|
|
|
|
flags.append("{}{:04x}".format(Pids.PCR.value, int(pcr_pid)))
|
|
|
|
|
ac3_pid = self._ac3_pid_entry.get_text()
|
|
|
|
|
if ac3_pid:
|
|
|
|
|
flags.append("{}{:04x}".format(Pids.AC3.value, int(ac3_pid)))
|
|
|
|
|
bitstream_pid = self._bitstream_entry.get_text()
|
|
|
|
|
if bitstream_pid:
|
|
|
|
|
flags.append("{}{:04x}".format(Pids.BIT_STREAM_DELAY.value, int(bitstream_pid)))
|
|
|
|
|
pcm_pid = self._pcm_entry.get_text()
|
|
|
|
|
if pcm_pid:
|
|
|
|
|
flags.append("{}{:04x}".format(Pids.PCM_DELAY.value, int(pcm_pid)))
|
2021-05-19 17:51:48 +03:00
|
|
|
extra_pids = self._extra_pids_entry.get_text()
|
|
|
|
|
if extra_pids:
|
|
|
|
|
flags.append(extra_pids)
|
2018-02-20 23:34:07 +03:00
|
|
|
# flags
|
|
|
|
|
f_flags = Flag.KEEP.value if self._keep_check_button.get_active() else 0
|
|
|
|
|
f_flags = f_flags + Flag.HIDE.value if self._hide_check_button.get_active() else f_flags
|
|
|
|
|
f_flags = f_flags + Flag.PIDS.value if self._use_pids_check_button.get_active() else f_flags
|
|
|
|
|
f_flags = f_flags + Flag.NEW.value if self._new_check_button.get_active() else f_flags
|
|
|
|
|
if f_flags:
|
2018-02-23 17:36:49 +03:00
|
|
|
flags.append("f:{:02d}".format(f_flags))
|
2018-02-20 23:34:07 +03:00
|
|
|
|
|
|
|
|
return ",".join(flags)
|
2018-02-20 00:20:32 +03:00
|
|
|
|
2018-02-23 17:14:08 +03:00
|
|
|
def get_srv_data(self):
|
2018-03-02 15:12:21 +03:00
|
|
|
ssid = int(self._sid_entry.get_text())
|
2018-03-17 22:18:10 +03:00
|
|
|
net_id, tr_id = int(self._network_id_entry.get_text()), int(self._transponder_id_entry.get_text())
|
2018-03-02 15:12:21 +03:00
|
|
|
service_type = self._srv_type_entry.get_text()
|
2018-02-23 17:14:08 +03:00
|
|
|
|
2019-12-22 20:42:29 +03:00
|
|
|
if self._s_type is SettingsType.ENIGMA_2:
|
2018-03-17 22:18:10 +03:00
|
|
|
namespace = int(self._namespace_entry.get_text())
|
|
|
|
|
data_id = self._ENIGMA2_DATA_ID.format(ssid, namespace, tr_id, net_id, service_type, 0)
|
|
|
|
|
fav_id = self._ENIGMA2_FAV_ID.format(ssid, tr_id, net_id, namespace)
|
2018-02-23 17:14:08 +03:00
|
|
|
return fav_id, data_id
|
2019-12-22 20:42:29 +03:00
|
|
|
elif self._s_type is SettingsType.NEUTRINO_MP:
|
2021-08-25 14:05:27 +03:00
|
|
|
data = get_attributes(self._old_service.data_id)
|
2021-08-23 14:34:56 +03:00
|
|
|
data["n"] = self._name_entry.get_text()
|
|
|
|
|
data["t"] = "{:x}".format(int(service_type))
|
|
|
|
|
data["i"] = "{:04x}".format(ssid)
|
2018-03-17 22:18:10 +03:00
|
|
|
fav_id = self._NEUTRINO_FAV_ID.format(tr_id, net_id, ssid)
|
2021-08-23 14:34:56 +03:00
|
|
|
return fav_id, SP.join("{}{}{}".format(k, KSP, v) for k, v in data.items())
|
2018-02-20 00:20:32 +03:00
|
|
|
|
2019-01-18 18:35:22 +03:00
|
|
|
# ***************** Transponder ********************* #
|
|
|
|
|
|
|
|
|
|
def get_transponder_values(self):
|
|
|
|
|
freq = self._freq_entry.get_text()
|
|
|
|
|
fec = self._fec_combo_box.get_active_id()
|
2019-01-23 16:36:50 +03:00
|
|
|
system = self._sys_combo_box.get_active_id()
|
2021-04-01 09:01:08 +03:00
|
|
|
o_srv = self._old_service
|
2019-01-18 18:35:22 +03:00
|
|
|
|
2019-12-22 20:42:29 +03:00
|
|
|
if self._tr_type is TrType.Satellite or self._s_type is SettingsType.NEUTRINO_MP:
|
2018-10-21 18:34:14 +03:00
|
|
|
freq = self._freq_entry.get_text()
|
|
|
|
|
rate = self._rate_entry.get_text()
|
|
|
|
|
pol = self._pol_combo_box.get_active_id()
|
2021-01-18 22:37:11 +03:00
|
|
|
pos = "{}{}".format(round(self._sat_pos_button.get_value(), 1), self._pos_side_box.get_active_id())
|
2018-10-21 18:34:14 +03:00
|
|
|
return freq, rate, pol, fec, system, pos
|
2021-04-01 09:01:08 +03:00
|
|
|
elif self._tr_type in (TrType.Terrestrial, TrType.ATSC):
|
2019-01-23 16:36:50 +03:00
|
|
|
return freq, o_srv.rate, o_srv.pol, fec, system, o_srv.pos
|
2019-01-18 18:35:22 +03:00
|
|
|
elif self._tr_type is TrType.Cable:
|
|
|
|
|
return freq, self._rate_entry.get_text(), o_srv.pol, fec, o_srv.system, o_srv.pos
|
2018-10-21 18:34:14 +03:00
|
|
|
|
2019-01-18 18:35:22 +03:00
|
|
|
def get_satellite_transponder_data(self):
|
2018-02-23 17:14:08 +03:00
|
|
|
sys = self._sys_combo_box.get_active_id()
|
2021-01-18 22:37:11 +03:00
|
|
|
freq = "{}000".format(self._freq_entry.get_text())
|
|
|
|
|
rate = "{}000".format(self._rate_entry.get_text())
|
2018-02-23 17:14:08 +03:00
|
|
|
pol = self.get_value_from_combobox_id(self._pol_combo_box, POLARIZATION)
|
2018-02-25 22:59:36 +03:00
|
|
|
fec = self.get_value_from_combobox_id(self._fec_combo_box, FEC_DEFAULT)
|
2021-01-21 15:03:01 +03:00
|
|
|
sat_pos = self.get_sat_position()
|
2021-01-18 22:37:11 +03:00
|
|
|
|
2018-02-23 17:14:08 +03:00
|
|
|
inv = get_value_by_name(Inversion, self._invertion_combo_box.get_active_id())
|
2018-02-26 16:26:53 +03:00
|
|
|
srv_sys = "0" # !!!
|
2018-02-23 17:14:08 +03:00
|
|
|
|
2019-12-22 20:42:29 +03:00
|
|
|
if self._s_type is SettingsType.ENIGMA_2:
|
2018-03-17 22:18:10 +03:00
|
|
|
dvb_s_tr = self._ENIGMA2_TRANSPONDER_DATA.format("s", freq, rate, pol, fec, sat_pos, inv, srv_sys)
|
2018-02-23 17:14:08 +03:00
|
|
|
if sys == "DVB-S":
|
|
|
|
|
return dvb_s_tr
|
|
|
|
|
if sys == "DVB-S2":
|
2018-02-26 16:26:53 +03:00
|
|
|
flag = self._tr_flag_entry.get_text()
|
2018-02-23 17:14:08 +03:00
|
|
|
mod = self.get_value_from_combobox_id(self._mod_combo_box, MODULATION)
|
|
|
|
|
roll_off = self.get_value_from_combobox_id(self._rolloff_combo_box, ROLL_OFF)
|
|
|
|
|
pilot = get_value_by_name(Pilot, self._pilot_combo_box.get_active_id())
|
2018-02-26 16:26:53 +03:00
|
|
|
pls_mode = self.get_value_from_combobox_id(self._pls_mode_combo_box, PLS_MODE)
|
|
|
|
|
pls_code = self._pls_code_entry.get_text()
|
|
|
|
|
st_id = self._stream_id_entry.get_text()
|
2018-03-01 00:18:05 +03:00
|
|
|
pls = ":{}:{}:{}".format(st_id, pls_code, pls_mode) if pls_mode and pls_code and st_id else ""
|
2021-08-23 14:34:56 +03:00
|
|
|
|
2018-03-01 00:18:05 +03:00
|
|
|
return "{}:{}:{}:{}:{}{}".format(dvb_s_tr, flag, mod, roll_off, pilot, pls)
|
2019-12-22 20:42:29 +03:00
|
|
|
elif self._s_type is SettingsType.NEUTRINO_MP:
|
2021-08-25 14:05:27 +03:00
|
|
|
tr_data = get_attributes(self._old_service.transponder)
|
2021-08-23 14:34:56 +03:00
|
|
|
tr_data["frq"] = freq
|
|
|
|
|
tr_data["sr"] = rate
|
|
|
|
|
tr_data["pol"] = pol
|
|
|
|
|
tr_data["fec"] = fec
|
|
|
|
|
tr_data["on"] = "{:04x}".format(int(self._network_id_entry.get_text()))
|
|
|
|
|
tr_data["id"] = "{:04x}".format(int(self._transponder_id_entry.get_text()))
|
|
|
|
|
tr_data["inv"] = inv
|
|
|
|
|
|
|
|
|
|
return SP.join("{}{}{}".format(k, KSP, v) for k, v in tr_data.items())
|
2018-02-20 23:34:07 +03:00
|
|
|
|
2021-01-21 15:03:01 +03:00
|
|
|
def get_sat_position(self):
|
|
|
|
|
sat_pos = self._sat_pos_button.get_value() * (-1 if self._pos_side_box.get_active_id() == "W" else 1)
|
|
|
|
|
sat_pos = str(round(sat_pos, 1)).replace(".", "")
|
|
|
|
|
return sat_pos
|
|
|
|
|
|
2019-01-18 18:35:22 +03:00
|
|
|
def get_terrestrial_transponder_data(self):
|
2019-01-23 16:36:50 +03:00
|
|
|
tr_data = re.split("\s|:", self._old_service.transponder)
|
|
|
|
|
# frequency, bandwidth, code rate HP, code rate LP, modulation, transmission mode, guard interval, hierarchy,
|
|
|
|
|
# inversion, system, plp_id
|
2019-01-24 10:04:27 +03:00
|
|
|
# Bandwidth -> Pol, Rate HP -> FEC, TransmissionMode -> Roll off, GuardInterval -> Pilot, Hierarchy -> Pls Mode
|
2021-01-18 22:37:11 +03:00
|
|
|
tr_data[1] = "{}000".format(self._freq_entry.get_text())
|
2019-01-23 16:36:50 +03:00
|
|
|
tr_data[2] = self.get_value_from_combobox_id(self._pol_combo_box, BANDWIDTH)
|
2019-01-24 10:04:27 +03:00
|
|
|
tr_data[3] = self.get_value_from_combobox_id(self._fec_combo_box, T_FEC)
|
|
|
|
|
tr_data[4] = self.get_value_from_combobox_id(self._rate_lp_combo_box, T_FEC)
|
2019-01-23 16:36:50 +03:00
|
|
|
tr_data[5] = self.get_value_from_combobox_id(self._mod_combo_box, T_MODULATION)
|
|
|
|
|
tr_data[6] = self.get_value_from_combobox_id(self._rolloff_combo_box, TRANSMISSION_MODE)
|
|
|
|
|
tr_data[7] = self.get_value_from_combobox_id(self._pilot_combo_box, GUARD_INTERVAL)
|
|
|
|
|
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)
|
2021-04-01 09:01:08 +03:00
|
|
|
|
2019-01-23 16:36:50 +03:00
|
|
|
return "{} {}".format(tr_data[0], ":".join(tr_data[1:]))
|
2019-01-18 18:35:22 +03:00
|
|
|
|
|
|
|
|
def get_cable_transponder_data(self):
|
|
|
|
|
tr_data = re.split("\s|:", self._old_service.transponder)
|
2019-01-23 16:36:50 +03:00
|
|
|
# frequency, symbol_rate, modulation, inversion, fec_inner, system;
|
2021-01-18 22:37:11 +03:00
|
|
|
tr_data[1] = "{}000".format(self._freq_entry.get_text())
|
|
|
|
|
tr_data[2] = "{}000".format(self._rate_entry.get_text())
|
2019-01-23 16:36:50 +03:00
|
|
|
tr_data[3] = get_value_by_name(Inversion, self._invertion_combo_box.get_active_id())
|
|
|
|
|
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())
|
2021-04-01 09:01:08 +03:00
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
2019-01-23 16:36:50 +03:00
|
|
|
return "{} {}".format(tr_data[0], ":".join(tr_data[1:]))
|
2019-01-18 18:35:22 +03:00
|
|
|
|
2021-01-21 15:03:01 +03:00
|
|
|
def update_transponder_services(self, transponder, sat_pos):
|
2018-03-18 18:11:16 +03:00
|
|
|
for itr in self._transponder_services_iters:
|
2021-01-21 15:03:01 +03:00
|
|
|
srv = self._current_model[itr][:]
|
2018-12-17 18:31:57 +03:00
|
|
|
srv[Column.SRV_FREQ], srv[Column.SRV_RATE], srv[Column.SRV_POL], srv[Column.SRV_FEC], srv[
|
2019-01-18 18:35:22 +03:00
|
|
|
Column.SRV_SYSTEM], srv[Column.SRV_POS] = self.get_transponder_values()
|
2018-12-17 18:31:57 +03:00
|
|
|
srv[Column.SRV_TRANSPONDER] = transponder
|
2021-01-21 15:03:01 +03:00
|
|
|
|
|
|
|
|
fav_id = srv[Column.SRV_FAV_ID]
|
|
|
|
|
old_srv = self._services.pop(fav_id, None)
|
|
|
|
|
if not old_srv:
|
|
|
|
|
log("Update transponder services error: No service found for ID {}".format(srv[Column.SRV_FAV_ID]))
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
if self._s_type is SettingsType.NEUTRINO_MP:
|
2021-08-25 14:05:27 +03:00
|
|
|
flags = get_attributes(srv[Column.SRV_CAS_FLAGS])
|
2021-08-23 14:34:56 +03:00
|
|
|
flags["position"] = sat_pos
|
|
|
|
|
srv[Column.SRV_CAS_FLAGS] = SP.join("{}{}{}".format(k, KSP, v) for k, v in flags.items())
|
2021-01-21 15:03:01 +03:00
|
|
|
|
|
|
|
|
self._services[fav_id] = Service(*srv[:Column.SRV_TOOLTIP])
|
|
|
|
|
self._current_model.set_row(itr, srv)
|
2018-03-18 18:11:16 +03:00
|
|
|
|
2018-03-03 23:24:43 +03:00
|
|
|
# ***************** Others *********************#
|
|
|
|
|
|
2019-01-18 18:35:22 +03:00
|
|
|
def select_active_text(self, box, text):
|
2018-03-03 23:24:43 +03:00
|
|
|
model = box.get_model()
|
|
|
|
|
for index, row in enumerate(model):
|
|
|
|
|
if row[0] == text:
|
|
|
|
|
box.set_active(index)
|
|
|
|
|
break
|
|
|
|
|
|
2018-02-20 23:34:07 +03:00
|
|
|
def on_digit_entry_changed(self, entry):
|
2018-03-18 18:11:16 +03:00
|
|
|
entry.set_name(self._DIGIT_ENTRY_NAME if self._DIGIT_PATTERN.search(entry.get_text()) else "GtkEntry")
|
|
|
|
|
|
|
|
|
|
def on_non_empty_entry_changed(self, entry):
|
|
|
|
|
entry.set_name(self._DIGIT_ENTRY_NAME if self._NON_EMPTY_PATTERN.search(entry.get_text()) else "GtkEntry")
|
2018-02-18 17:14:02 +03:00
|
|
|
|
2018-03-29 13:49:01 +03:00
|
|
|
def on_cas_entry_changed(self, entry):
|
|
|
|
|
entry.set_name("GtkEntry" if self._CAID_PATTERN.fullmatch(entry.get_text()) else self._DIGIT_ENTRY_NAME)
|
|
|
|
|
|
2021-05-19 17:51:48 +03:00
|
|
|
def on_extra_pids_entry_changed(self, entry):
|
|
|
|
|
entry.set_name("GtkEntry" if self._PIDS_PATTERN.fullmatch(entry.get_text()) else self._DIGIT_ENTRY_NAME)
|
|
|
|
|
|
2018-02-23 17:14:08 +03:00
|
|
|
def get_value_from_combobox_id(self, box: Gtk.ComboBox, dc: dict):
|
|
|
|
|
cb_id = box.get_active_id()
|
|
|
|
|
return get_key_by_value(dc, cb_id)
|
|
|
|
|
|
2018-02-23 23:56:19 +03:00
|
|
|
@run_idle
|
2019-01-18 18:35:22 +03:00
|
|
|
def on_tr_edit_toggled(self, switch, active):
|
2018-03-10 17:49:53 +03:00
|
|
|
if active and self._action is Action.EDIT:
|
2018-02-25 22:59:36 +03:00
|
|
|
self._transponder_services_iters = []
|
|
|
|
|
response = TransponderServicesDialog(self._dialog,
|
2021-01-21 15:03:01 +03:00
|
|
|
self._services_view,
|
2018-02-25 22:59:36 +03:00
|
|
|
self._old_service.transponder,
|
|
|
|
|
self._transponder_services_iters).show()
|
2021-01-21 15:03:01 +03:00
|
|
|
if response == Gtk.ResponseType.CANCEL or response == Gtk.ResponseType.DELETE_EVENT:
|
2018-02-25 17:52:21 +03:00
|
|
|
switch.set_active(False)
|
2018-02-25 22:59:36 +03:00
|
|
|
self._transponder_services_iters = None
|
2018-02-25 17:52:21 +03:00
|
|
|
return
|
|
|
|
|
|
2019-01-18 18:35:22 +03:00
|
|
|
self.update_dvb_s2_elements(active and (self._sys_combo_box.get_active_id() == "DVB-S2"
|
2021-04-01 09:01:08 +03:00
|
|
|
or self._old_service.transponder_type in "tca"))
|
2018-02-26 16:26:53 +03:00
|
|
|
|
2018-02-25 17:52:21 +03:00
|
|
|
for elem in self._TRANSPONDER_ELEMENTS:
|
|
|
|
|
elem.set_sensitive(active)
|
|
|
|
|
|
2018-03-18 17:13:21 +03:00
|
|
|
def is_data_correct(self):
|
|
|
|
|
for elem in self._digit_elements.values():
|
|
|
|
|
if elem.get_name() == self._DIGIT_ENTRY_NAME:
|
|
|
|
|
return False
|
2018-03-18 18:11:16 +03:00
|
|
|
for elem in self._non_empty_elements.values():
|
|
|
|
|
if elem.get_name() == self._DIGIT_ENTRY_NAME:
|
|
|
|
|
return False
|
2018-03-29 13:49:01 +03:00
|
|
|
if self._cas_entry.get_name() == self._DIGIT_ENTRY_NAME:
|
|
|
|
|
return False
|
2021-05-19 17:51:48 +03:00
|
|
|
if self._extra_pids_entry.get_name() == self._DIGIT_ENTRY_NAME:
|
|
|
|
|
return False
|
2018-03-18 17:13:21 +03:00
|
|
|
return True
|
|
|
|
|
|
2018-03-26 17:33:20 +03:00
|
|
|
def update_reference(self, entry, event=None):
|
2019-12-22 20:42:29 +03:00
|
|
|
if not self.is_data_correct() or (event is None and self._s_type is SettingsType.NEUTRINO_MP):
|
2018-03-26 17:33:20 +03:00
|
|
|
return
|
|
|
|
|
self.update_reference_entry()
|
|
|
|
|
|
|
|
|
|
def update_reference_entry(self):
|
2018-11-17 13:48:34 +03:00
|
|
|
srv_type = int(self._srv_type_entry.get_text())
|
2018-03-26 17:33:20 +03:00
|
|
|
ssid = int(self._sid_entry.get_text())
|
|
|
|
|
tid = int(self._transponder_id_entry.get_text())
|
|
|
|
|
nid = int(self._network_id_entry.get_text())
|
2019-12-22 20:42:29 +03:00
|
|
|
if self._s_type is SettingsType.ENIGMA_2:
|
2018-03-26 17:33:20 +03:00
|
|
|
on_id = int(self._namespace_entry.get_text())
|
2018-11-17 13:48:34 +03:00
|
|
|
ref = "1:0:{:X}:{:X}:{:X}:{:X}:{:X}:0:0:0".format(srv_type, ssid, tid, nid, on_id)
|
2018-03-26 17:33:20 +03:00
|
|
|
self._reference_entry.set_text(ref)
|
|
|
|
|
else:
|
|
|
|
|
self._reference_entry.set_text("{:x}{:04x}{:04x}".format(tid, nid, ssid))
|
|
|
|
|
|
2018-10-15 11:39:33 +03:00
|
|
|
def update_ui_for_terrestrial(self):
|
2019-01-20 00:25:02 +03:00
|
|
|
tr_grid = self.get_transponder_grid_for_non_satellite()
|
2019-01-21 18:04:46 +03:00
|
|
|
tr_grid.remove_column(1)
|
|
|
|
|
tr_grid.insert_column(1)
|
|
|
|
|
extra_tr_grid = self._builder.get_object("extra_transponder_grid")
|
|
|
|
|
for i in range(4):
|
|
|
|
|
extra_tr_grid.remove_column(6)
|
|
|
|
|
# Bandwidth -> Pol
|
|
|
|
|
pol_label = self._builder.get_object("pol_label")
|
|
|
|
|
pol_label.set_text("Bandwidth")
|
|
|
|
|
tr_grid.attach(pol_label, 1, 0, 1, 1)
|
|
|
|
|
tr_grid.attach(self._pol_combo_box, 1, 1, 1, 1)
|
2019-01-24 10:04:27 +03:00
|
|
|
# Rate HP -> FEC
|
|
|
|
|
self._builder.get_object("fec_label").set_text("Rate HP")
|
|
|
|
|
# Rate LP
|
|
|
|
|
tr_grid.insert_column(3)
|
|
|
|
|
rate_lp_label = self._builder.get_object("pls_code_label")
|
|
|
|
|
rate_lp_label.set_text("Rate LP")
|
|
|
|
|
tr_grid.attach(rate_lp_label, 3, 0, 1, 1)
|
|
|
|
|
tr_grid.attach(self._rate_lp_combo_box, 3, 1, 1, 1)
|
2019-01-21 18:04:46 +03:00
|
|
|
# Modulation
|
|
|
|
|
tr_grid.insert_column(4)
|
|
|
|
|
extra_tr_grid.remove_column(1)
|
|
|
|
|
tr_grid.attach(self._builder.get_object("mod_label"), 4, 0, 1, 1)
|
|
|
|
|
tr_grid.attach(self._mod_combo_box, 4, 1, 1, 1)
|
|
|
|
|
# TransmissionMode -> Roll off
|
|
|
|
|
rolloff_label = self._builder.get_object("rolloff_label")
|
|
|
|
|
rolloff_label.set_text("T mode")
|
|
|
|
|
# GuardInterval -> Pilot
|
|
|
|
|
pilot_label = self._builder.get_object("pilot_label")
|
|
|
|
|
pilot_label.set_text("Guard Interval")
|
|
|
|
|
# Hierarchy -> Pls Mode
|
|
|
|
|
pls_mode_label = self._builder.get_object("pls_mode_label")
|
|
|
|
|
pls_mode_label.set_text("Hierarchy")
|
2019-01-20 00:25:02 +03:00
|
|
|
# Models
|
2019-01-21 18:04:46 +03:00
|
|
|
fec_model, modulation_model, sys_model = self.get_models_for_non_satellite()
|
|
|
|
|
pol_model = self._pol_combo_box.get_model()
|
|
|
|
|
roll_off_model = self._rolloff_combo_box.get_model()
|
|
|
|
|
pilot_model = self._pilot_combo_box.get_model()
|
|
|
|
|
pls_model = self._pls_mode_combo_box.get_model()
|
|
|
|
|
# Models clearing
|
|
|
|
|
for m in pol_model, roll_off_model, pilot_model, pls_model:
|
|
|
|
|
m.clear()
|
|
|
|
|
|
|
|
|
|
self.init_terrestrial_models((pol_model, modulation_model, roll_off_model, pilot_model, pls_model, sys_model),
|
|
|
|
|
(BANDWIDTH, T_MODULATION, TRANSMISSION_MODE, GUARD_INTERVAL, HIERARCHY, T_SYSTEM))
|
|
|
|
|
|
2019-01-20 00:25:02 +03:00
|
|
|
# Removing the latest FEC elements from the model
|
|
|
|
|
for itr in [fec_model.get_iter(Gtk.TreePath.new_from_string(str(i))) for i in range(7, 11)]:
|
|
|
|
|
fec_model.remove(itr)
|
2019-01-21 18:04:46 +03:00
|
|
|
# Extra
|
2019-01-24 10:04:27 +03:00
|
|
|
self._namespace_entry.set_max_width_chars(15)
|
|
|
|
|
self._sys_combo_box.set_hexpand(False)
|
2019-01-20 00:25:02 +03:00
|
|
|
|
2019-01-21 18:04:46 +03:00
|
|
|
def init_terrestrial_models(self, models, properties):
|
|
|
|
|
for index, model in enumerate(models):
|
|
|
|
|
for v in properties[index].values():
|
|
|
|
|
model.append((v,))
|
2019-01-20 00:25:02 +03:00
|
|
|
|
|
|
|
|
def update_ui_for_cable(self):
|
|
|
|
|
tr_grid = self.get_transponder_grid_for_non_satellite()
|
2019-01-18 18:35:22 +03:00
|
|
|
tr_box = self._builder.get_object("tr_box")
|
2019-01-20 00:25:02 +03:00
|
|
|
# Models
|
|
|
|
|
fec_model, modulation_model, system_model = self.get_models_for_non_satellite()
|
|
|
|
|
|
2019-01-18 18:35:22 +03:00
|
|
|
extra_tr_grid = self._builder.get_object("extra_transponder_grid")
|
2019-01-21 18:04:46 +03:00
|
|
|
for child in extra_tr_grid.get_children():
|
2019-01-18 18:35:22 +03:00
|
|
|
extra_tr_grid.remove(child)
|
2019-01-21 18:04:46 +03:00
|
|
|
tr_grid.remove(extra_tr_grid)
|
2019-01-18 18:35:22 +03:00
|
|
|
|
|
|
|
|
tr_grid.insert_column(3)
|
|
|
|
|
tr_grid.insert_column(4)
|
2019-01-20 00:25:02 +03:00
|
|
|
tr_grid.insert_column(5)
|
2019-01-18 18:35:22 +03:00
|
|
|
# Modulation
|
2019-01-21 18:04:46 +03:00
|
|
|
tr_grid.attach(self._builder.get_object("mod_label"), 3, 0, 1, 1)
|
2019-01-18 18:35:22 +03:00
|
|
|
tr_grid.attach(self._mod_combo_box, 3, 1, 1, 1)
|
2019-01-20 00:25:02 +03:00
|
|
|
for v in C_MODULATION.values():
|
|
|
|
|
modulation_model.append((v,))
|
2019-01-18 18:35:22 +03:00
|
|
|
# Inversion
|
2019-01-21 18:04:46 +03:00
|
|
|
tr_grid.attach(self._builder.get_object("inversion_label"), 4, 0, 1, 1)
|
2019-01-18 18:35:22 +03:00
|
|
|
tr_grid.attach(self._invertion_combo_box, 4, 1, 1, 1)
|
2019-01-20 00:25:02 +03:00
|
|
|
# System
|
2019-01-21 18:04:46 +03:00
|
|
|
tr_grid.attach(self._builder.get_object("system_label"), 5, 0, 1, 1)
|
2019-01-20 00:25:02 +03:00
|
|
|
tr_grid.attach(self._sys_combo_box, 5, 1, 1, 1)
|
|
|
|
|
system_model.append((SystemCable.ANNEX_A.name,))
|
|
|
|
|
system_model.append((SystemCable.ANNEX_C.name,))
|
|
|
|
|
# FEC
|
|
|
|
|
fec_model.append(("None",))
|
|
|
|
|
# Extra
|
|
|
|
|
tr_box.remove(self._tr_extra_expander)
|
|
|
|
|
tr_grid.set_margin_bottom(5)
|
|
|
|
|
self._freq_entry.set_width_chars(10)
|
|
|
|
|
self._freq_entry.set_max_width_chars(10)
|
|
|
|
|
self._rate_entry.set_width_chars(10)
|
|
|
|
|
self._rate_entry.set_max_width_chars(10)
|
|
|
|
|
self._transponder_id_entry.set_max_width_chars(8)
|
|
|
|
|
self._network_id_entry.set_max_width_chars(8)
|
|
|
|
|
|
2021-04-01 09:01:08 +03:00
|
|
|
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)
|
|
|
|
|
|
2019-01-20 00:25:02 +03:00
|
|
|
def get_transponder_grid_for_non_satellite(self):
|
|
|
|
|
self._pids_grid.set_visible(False)
|
|
|
|
|
tr_grid = self._builder.get_object("tr_grid")
|
|
|
|
|
tr_grid.remove_column(0)
|
|
|
|
|
tr_grid.remove_column(2)
|
|
|
|
|
return tr_grid
|
2019-01-18 18:35:22 +03:00
|
|
|
|
2019-01-20 00:25:02 +03:00
|
|
|
def get_models_for_non_satellite(self):
|
|
|
|
|
fec_model = self._fec_combo_box.get_model()
|
|
|
|
|
modulation_model = self._mod_combo_box.get_model()
|
|
|
|
|
modulation_model.clear()
|
|
|
|
|
system_model = self._sys_combo_box.get_model()
|
|
|
|
|
system_model.clear()
|
|
|
|
|
return fec_model, modulation_model, system_model
|
2018-10-15 11:39:33 +03:00
|
|
|
|
2018-02-25 17:52:21 +03:00
|
|
|
|
|
|
|
|
class TransponderServicesDialog:
|
2021-01-21 15:03:01 +03:00
|
|
|
def __init__(self, transient, services_view, transponder, tr_iters):
|
2021-04-28 14:12:59 +03:00
|
|
|
builder = get_builder(_UI_PATH, use_str=True, objects=("tr_services_dialog", "transponder_services_liststore"))
|
2018-02-25 17:52:21 +03:00
|
|
|
self._dialog = builder.get_object("tr_services_dialog")
|
|
|
|
|
self._dialog.set_transient_for(transient)
|
|
|
|
|
self._srv_model = builder.get_object("transponder_services_liststore")
|
2021-01-21 15:03:01 +03:00
|
|
|
self.append_services(services_view, transponder, tr_iters)
|
2019-01-21 18:04:46 +03:00
|
|
|
builder.get_object("srv_list_dialog_info_bar").connect("response", lambda bar, resp: bar.hide())
|
2018-02-25 17:52:21 +03:00
|
|
|
|
2021-01-21 15:03:01 +03:00
|
|
|
def append_services(self, view, transponder, tr_iters):
|
|
|
|
|
model = view.get_model()
|
|
|
|
|
filter_model = model.get_model()
|
2018-02-25 22:59:36 +03:00
|
|
|
for row in model:
|
2018-12-17 18:31:57 +03:00
|
|
|
if row[Column.SRV_TRANSPONDER] == transponder:
|
|
|
|
|
self._srv_model.append((row[Column.SRV_SERVICE], row[Column.SRV_PACKAGE], row[Column.SRV_TYPE],
|
|
|
|
|
row[Column.SRV_SSID], row[Column.SRV_FREQ], row[Column.SRV_POS]))
|
2021-01-21 15:03:01 +03:00
|
|
|
itr = model.get_iter(row.path)
|
|
|
|
|
tr_iters.append(filter_model.convert_iter_to_child_iter(model.convert_iter_to_child_iter(itr)))
|
2018-02-25 17:52:21 +03:00
|
|
|
|
|
|
|
|
def show(self):
|
|
|
|
|
response = self._dialog.run()
|
|
|
|
|
self._dialog.destroy()
|
|
|
|
|
return response
|
2018-02-23 23:56:19 +03:00
|
|
|
|
2018-02-14 00:00:52 +03:00
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2018-02-20 00:20:32 +03:00
|
|
|
pass
|