diff --git a/scenes/эмс-тг/эмс-тг.gd b/scenes/эмс-тг/эмс-тг.gd index 2a6aed10..4ec6a66c 100644 --- a/scenes/эмс-тг/эмс-тг.gd +++ b/scenes/эмс-тг/эмс-тг.gd @@ -12,6 +12,8 @@ extends Panel @export var freq_min: float ## Максимальная частота, МГЦ @export var freq_max: float +## Время достоверности кластера по умолчанию (если не указано в докладе) +@export var default_ttl: float ## Цвет диапазона если включен (разрешён) @export_color_no_alpha var color_enabled: Color ## Цвет диапазона если выключен (запрещён) @@ -49,6 +51,10 @@ extends Panel var name_to_index: Dictionary[StringName, int] ## Имя устройства -> Индекс устройства var name_to_scale: Dictionary[StringName, GridContainer] ## Имя устройства -> Шкала var table_cell_row: Array +## Образец параметров кластера +var ref_cls: = {'cname': '<имя>', 'ttl': 1.0, 'daa': 360.0, 'dap': 0.0, + 'cfb': (freq_min + freq_max) / 2.0, + 'wfb': freq_max - freq_min} #endregion #region Заполняется во время работы @@ -137,6 +143,59 @@ func _ready() -> void: ctable.set_header_min_hight(table_rows_hight) ctable.pin_header2() + # Описатель для отображения импульсного ЭМС: + # { идентификатор_входа: { 'node_path': путь_к_узлу, 'pname': название_устройства, 'dcls': { имя_кластера: {параметры_кластера}}}} + # Здесь поля txe и rxe - отвечают за конфигурацию: + # txe - вход связан с управлением передатчиком + # rxe - вход связан с управлением приёмника + ##TODO: Должна быть возможность для изменения оператором + var imp_yems_descr = { + 0: { 'pname': 'эмс-изделие7', # соответствие названия устройства идентификатору входа + 'dcls': {'УИЗП1': {'wfb': 300.0, 'cfb': 4000, 'ttl': -1.0, 'txe': false, 'rxe': false}} }, + 1: { 'pname': 'эмс-изделие8', # соответствие названия устройства идентификатору входа + 'dcls': {'УИЗП2': {'wfb': 200.0, 'cfb': 5000, 'ttl': -1.0, 'txe': false, 'rxe': false}} } } + signaller.connect('yems_input_changed', _on_yems_input_changed.bind(imp_yems_descr)) + for id in imp_yems_descr: + var descr = imp_yems_descr[id] + var unit_info = yems_info[descr.pname] + for cname in descr.dcls: + var incls = descr.dcls[cname] + var cls = {'cname': cname, 'status': ClasterStatus.RUNNING} + cls.merge(incls) + unit_info.mcls.append(cls) + for id in imp_yems_descr: + var descr = imp_yems_descr[id] + var unit_info = yems_info[descr.pname] + call_deferred('on_data_received', unit_info, descr.pname) + + +## Вызывается при изменении состояния входа ЭМС.[br] +## [param id] - идентификатор входа ЭМС[br] +## [param state] - новое состояние входа ЭМС[br] +## [param imp_yems_sescr] - описатель входов ЭМС[br] +func _on_yems_input_changed(id: int, state: int, imp_yems_descr): + # Проверить, есть ли в описателе этот вход + if not imp_yems_descr.has(id): + return + var descr = imp_yems_descr[id] + # Проверить, есть ли такое устройство + if not yems_info.has(descr.pname): + return + # Получить доклад устройства + var unit_info = yems_info[descr.pname] + # Вход один, но кластеров может быть несколько, + # поэтому нужно пробежать по всем кластерам + for cls in unit_info.mcls: + var incls = descr.dcls[cls.cname] + # Выставить в докладе разрешение работы приёмника + # или передатчика соответственно состоянию входа + if incls.rxe: + cls.rxe = true if state == 1 else false + if incls.txe: + cls.txe = true if state == 1 else false + # Выполнить то же, что и для приёма данных, поэтому: + on_data_received(unit_info, descr.pname) + ## Вызывается при выборе оператором устройства на шкале ## [param val] - состояние кнопки переключателя устройств @@ -160,7 +219,7 @@ func _on_scale_selected(val: bool, nm: StringName): var indexes: = cnames_table[nm] update_cvi(nm) var new_indexes = update_indexes(unit_info, indexes) - update_table(unit_info, ctable, new_indexes) + update_table(ctable, new_indexes) map_yems_info_to_table(unit_info, ctable, indexes) connect_cmd_handlers(nm, ctable, new_indexes) @@ -239,7 +298,7 @@ func on_data_received(data: Dictionary, nm: StringName): # обновить таблицу новыми данными if selected_unit[nm]: var new_indexes = update_indexes(unit_info, indexes) - update_table(unit_info, ctable, new_indexes) + update_table(ctable, new_indexes) map_yems_info_to_table(unit_info, ctable, indexes) connect_cmd_handlers(nm, ctable, new_indexes) map_yems_info_to_scale(unit_info, cscale) @@ -250,8 +309,8 @@ func on_data_received(data: Dictionary, nm: StringName): ## Создаёт новые ряды в таблице -func update_table(unit_info: Dictionary, ctable: GDTable, new_indexes: Array): - # Добавить новые ряды. Два прохода нужно для того, +func update_table(ctable: GDTable, new_indexes: Array): + # Добавить новые ряды. Два прохода нужно потому, # что порядок элементов в словаре не определён. for icls in new_indexes: ctable.add_row(table_cell_row) @@ -285,8 +344,10 @@ func update_indexes(unit_info: Dictionary, indexes: Dictionary) -> Array: # Объединяет список кластеров принятых от устройства со списком сохранённым func unit_info_merge(unit_info: Dictionary, data_rx: Dictionary): var drx: = {} - for cls in data_rx.mcls: - drx[cls.cname] = cls + for cls_rx in data_rx.mcls: + ref_cls.cname = 'неопр.№%d' % (drx.size() + 1) + cls_rx.merge(ref_cls, false) # Объеденить без перезаписи + drx[cls_rx.cname] = cls_rx var dinfo: = {} for cls in unit_info.mcls: dinfo[cls.cname] = cls @@ -327,6 +388,9 @@ func set_timeouts(nm: StringName, unit_info: Dictionary): for cls in unit_info.mcls: var timer_name = NodePath('%s_%s' % [nm, cls.cname]) var timer = get_node_or_null(timer_name) + cls['status'] = ClasterStatus.RUNNING + if cls.ttl < 0.0: + continue if not timer: timer = Timer.new() timer.name = timer_name @@ -334,7 +398,6 @@ func set_timeouts(nm: StringName, unit_info: Dictionary): timer.connect('timeout', _on_timeout_ttl.bind(nm, cls.cname)) add_child(timer) timer.start(cls.ttl) - cls['status'] = ClasterStatus.RUNNING ## Обработчик истечения времени достоверности кластера diff --git a/scenes/эмс-тг/эмс-тг.tscn b/scenes/эмс-тг/эмс-тг.tscn index a71213ce..7e0b4fa9 100644 --- a/scenes/эмс-тг/эмс-тг.tscn +++ b/scenes/эмс-тг/эмс-тг.tscn @@ -36,6 +36,7 @@ script = ExtResource("1_b7tfl") index_to_unit_names = Array[StringName]([&"эмс-ор63", &"эмс-454", &"эмс-го", &"эмс-рлс1", &"эмс-рлс2", &"эмс-ннвс", &"эмс-изделие7", &"эмс-изделие8"]) freq_min = 300.0 freq_max = 6000.0 +default_ttl = 2.0 color_enabled = Color(0.898039, 0.458824, 0.239216, 0.7) color_disabled = Color(0.601223, 0.601223, 0.601223, 0.7) color_alpha = 0.7