From 9fd258a74572f41baf3b241ceebdf80bc347f7ce Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 31 Mar 2026 10:20:15 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5.=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=BD=D0=B4=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0=D1=82=D0=BE=D1=80=D0=BE=D0=B2=20=D1=80=D0=B5=D0=B7=D1=83?= =?UTF-8?q?=D0=BB=D1=8C=D1=82=D0=B0=D1=82=D1=8B=20=D0=B2=D1=8B=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA=D0=BE=D0=BC=D0=B0?= =?UTF-8?q?=D0=BD=D0=B4=D1=8B=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/эмс-тг/эмс-тг.gd | 159 +++++++++++++++++++++------------------- 1 file changed, 82 insertions(+), 77 deletions(-) diff --git a/scenes/эмс-тг/эмс-тг.gd b/scenes/эмс-тг/эмс-тг.gd index 03dfe72a..2bd32703 100644 --- a/scenes/эмс-тг/эмс-тг.gd +++ b/scenes/эмс-тг/эмс-тг.gd @@ -61,7 +61,6 @@ var pnames_scale: Dictionary[StringName, int] ## Текущее выбранное оператором устройство на шкале var selected_unit: Dictionary[StringName, bool] ## Состояния кластеров в соответствии с докладами и командами -var cmd_vs_info: Dictionary[StringName, Dictionary] #endregion @@ -99,7 +98,6 @@ func _ready() -> void: yems_cmd[nm] = {} cnames_table[nm] = {} selected_unit[nm] = false - cmd_vs_info[nm] = {} var btns_scales = get_tree().get_nodes_in_group('кнопки-шкалы') for node in btns_scales: var nm: = node.get_meta('unit_name') as StringName @@ -157,65 +155,53 @@ func _on_scale_selected(val: bool, nm: StringName): $label_msg.hide() var ctable = $'таблица/сетка' var indexes = cnames_table[nm] - var unit_cvi = cmd_vs_info[nm] - map_yems_info_to_table(unit_info, ctable, indexes) - connect_cmd_handlers(ctable, nm, indexes) update_cvi(nm) - map_cvi_to_table(unit_cvi, ctable, indexes) - - -func map_cvi_to_table(unit_cvi: Dictionary, ctable: GDTable, indexes: Dictionary): - for cname in indexes: - var i_row = indexes[cname] - var result_rxe: = ClasterResult.WAITING - var result_txe: = ClasterResult.WAITING - if unit_cvi.has(cname): - result_rxe = unit_cvi[cname].result_rxe - result_txe = unit_cvi[cname].result_txe - ctable.set_node_property(column_cmd_rx, i_row, 'state', int(result_rxe)) - ctable.set_node_property(column_cmd_tx, i_row, 'state', int(result_txe)) + var new_indexes = update_indexes(unit_info, indexes) + update_table(new_indexes, ctable, unit_info) + map_yems_info_to_table(unit_info, ctable, indexes) + connect_cmd_handlers(new_indexes, ctable, nm) +## Обновляет состояние выполнения команды оператора func update_cvi(nm: StringName): var unit_info = yems_info[nm] - var unit_cvi = {} var unit_cmd = yems_cmd[nm] for cls_info in unit_info.mcls: - var result_rxe = ClasterResult.DONE - var result_txe = ClasterResult.DONE - if not unit_cmd.has(cls_info.cname): - unit_cvi[cls_info.cname] = \ - { 'result_rxe': ClasterResult.DONE, - 'result_txe': ClasterResult.DONE } - continue - var cls_cmd = unit_cmd[cls_info.cname] - if cls_cmd.has('rxe'): - result_rxe = ClasterResult.DONE if (cls_info.rxe == cls_cmd.rxe) else ClasterResult.MISSMATCH - if cls_cmd.has('txe'): - result_txe = ClasterResult.DONE if (cls_info.txe == cls_cmd.txe) else ClasterResult.MISSMATCH - unit_cvi[cls_info.cname] = \ - { 'result_rxe': result_rxe, - 'result_txe': result_txe } - cmd_vs_info[nm].merge(unit_cvi, true) + var result_rxe: = ClasterResult.WAITING + var result_txe: = ClasterResult.WAITING + if unit_cmd.has(cls_info.cname): + var cls_cmd = unit_cmd[cls_info.cname] + if cls_info.status == ClasterStatus.RUNNING: + if cls_cmd.has('rxe'): + result_rxe = ClasterResult.DONE if (cls_info.rxe == cls_cmd.rxe) else ClasterResult.MISSMATCH + else: + result_rxe = ClasterResult.DONE + if cls_cmd.has('txe'): + result_txe = ClasterResult.DONE if (cls_info.txe == cls_cmd.txe) else ClasterResult.MISSMATCH + else: + result_txe = ClasterResult.DONE + else: + result_rxe = ClasterResult.DONE + result_txe = ClasterResult.DONE + cls_info['result_rxe'] = result_rxe + cls_info['result_txe'] = result_txe ## Подключает обработчики команд к таблице кластеров +## [param new_indexes] - новые индексы рядов таблицы ## [param cls_table] - таблица для отображения кластеров ## [param nm] - имя устройства -func connect_cmd_handlers(cls_table: GDTable, nm: StringName, indexes: Dictionary): - var rows_count = cls_table.get_rows_count() - if indexes.size() != rows_count: - push_error('indexes.size() != rows_count') - return - for cname in indexes: +func connect_cmd_handlers(new_indexes: Array, ctable: GDTable, nm: StringName): + for icls in new_indexes: + var i_row = icls[0] # Имя устройства и имя кластера - var i_row = indexes[cname] + var cls = icls[1] # Подключить обработчки разрешения приёмников - var node = cls_table.get_node2(column_cmd_rx, i_row) - node.connect_check('toggled', _on_user_cmd.bind(nm, cname, 'rxe')) + var node = ctable.get_node2(column_cmd_rx, i_row) + node.connect_check('toggled', _on_user_cmd.bind(nm, cls.cname, 'rxe')) # Подключить обработчки разрешения приёмников - node = cls_table.get_node2(column_cmd_tx, i_row) - node.connect_check('toggled', _on_user_cmd.bind(nm, cname, 'txe')) + node = ctable.get_node2(column_cmd_tx, i_row) + node.connect_check('toggled', _on_user_cmd.bind(nm, cls.cname, 'txe')) func _on_user_cmd(val: bool, nm: StringName, cname: String, param_name: StringName): @@ -236,16 +222,49 @@ func on_data_received(data: Dictionary, nm: StringName): var ctable: GDTable = $'таблица/сетка' var claster_scale: = name_to_scale[nm] as GridContainer var indexes: = cnames_table[nm] # Индексы строк в таблице + update_cvi(nm) if selected_unit[nm]: + var new_indexes = update_indexes(unit_info, indexes) + update_table(new_indexes, ctable, unit_info) map_yems_info_to_table(unit_info, ctable, indexes) + connect_cmd_handlers(new_indexes, ctable, nm) map_yems_info_to_scale(unit_info, claster_scale) var inters: = find_inters(yems_info) - var unit_cvi = cmd_vs_info[nm] reset_matrix() map_inters_to_matrix(inters, $'матрица') cmd_to_unit(nm) - update_cvi(nm) - map_cvi_to_table(unit_cvi, ctable, indexes) + + +## Создаёт новые ряды в таблице +func update_table(new_indexes: Array, ctable: GDTable, unit_info: Dictionary): + # Добавить новые ряды. Два прохода нужно для того, + # что порядок элементов в словаре не определён. + for icls in new_indexes: + ctable.add_row(table_cell_row) + # Заполнить новые ряды данными + for icls in new_indexes: + var i_row = icls[0] + var cls = icls[1] + # Установить высоту ряда (можно пропустить, если нужная высота будет выставлена по умолчанию) + ctable.set_row_min_hight(i_row, table_rows_hight) + # Установить новый текст + ctable.set_node_property(column_cmd_rx, i_row, 'pressed', cls.rxe) + ctable.set_node_property(column_cmd_tx, i_row, 'pressed', cls.txe) + ctable.set_node_property(column_cmd_rx, i_row, 'state', cls.result_rxe) + ctable.set_node_property(column_cmd_tx, i_row, 'state', cls.result_txe) + + +func update_indexes(unit_info, indexes) -> Array: + var new_indexes: = [] + for cls in unit_info.mcls: + # Проверить, есть ли уже такой индекс + if indexes.has(cls.cname): + continue + # Записать индекс нового ряда (связать с именем кластера) + var i_row = indexes.size() + indexes[cls.cname] = i_row + new_indexes.append([i_row, cls]) + return new_indexes # Объединяет список кластеров принятых от устройства со списком сохранённым @@ -261,24 +280,25 @@ func unit_info_merge(unit_info: Dictionary, data_rx: Dictionary): unit_info.mcls = dinfo.values() +## Отправляет команду в сетевой стек func cmd_to_unit(nm: StringName): var unit_yemstg: = network.get_unit_instance(nm) - # Проверить, что предидущие отправлены + # Проверить, что сетевой стек отправил предидущую команду if unit_yemstg.cmd_state != unit.Unit.CmdState.DONE: return # Сформировать команду из докладов (данных принятых из сети от устройств) var unit_info_copy = yems_info[nm].duplicate(true) var unit_cmd = yems_cmd[nm] - unit_info_copy['mtype'] = 'cmd' + unit_info_copy.mtype = 'cmd' # Выбрать только работающие кластеры (время которых ещё не истекло) var mcls = unit_info_copy.mcls.filter(func(c): return c.status == ClasterStatus.RUNNING) for cls_info in mcls: - # Если для это кластера есть команда оператора + # Если для этого кластера есть команда оператора ... if unit_cmd.has(cls_info.cname): - # Переписать новыми значениями из команды заданной оператором + # ... переписать значениями из команды оператора var cmd_cls = unit_cmd[cls_info.cname] - cls_info.merge(cmd_cls, true) - cls_info.erase('status') + cls_info.rxe = unit_cmd.get('rxe', cls_info.rxe) + cls_info.txe = unit_cmd.get('txe', cls_info.txe) # Передать команду сетевому стеку unit_yemstg.cmd.merge(unit_info_copy, true) unit_yemstg.cmd_state = unit.Unit.CmdState.SEND @@ -343,28 +363,13 @@ func map_yems_info_to_table(unit_info: Dictionary, ctable: GDTable, indexes: Dic # Строки для заполнения ряда var status_str: = 'Активен' if cls.status == ClasterStatus.RUNNING else 'Удалён' var row_text: = [cls.cname, status_str, '%.1f' % cls.ttl, '%.1f' % cls.daa, '%.1f' % cls.dap, '%.1f-%.1f' % [cls.cfb - cls.wfb / 2.0, cls.cfb + cls.wfb / 2.0]] - # Если такой кластер уже есть, обновить его строку в таблице - if cls.cname in indexes: - # Получить индекс строки кластера в таблице - var i_row = indexes[cls.cname] - # Установить новый текст - ctable.set_row_text(i_row, row_text) - # Если такого кластера нет, то создать его строку в таблице - else: - # Добавить новый ряд - ctable.add_row(table_cell_row) - # Получить индекс нового ряда в таблице - var i_row: = indexes.size() - # Записать индекс нового ряда (связать с именем кластера) - indexes[cls.cname] = i_row - # Установить высоту ряда (можно пропустить, если нужная высота будет выставлена по умолчанию) - ctable.set_row_min_hight(i_row, table_rows_hight) - # Установить новый текст - ctable.set_row_text(i_row, row_text) - ctable.set_node_property(column_cmd_rx, i_row, 'pressed', cls.rxe) - ctable.set_node_property(column_cmd_tx, i_row, 'pressed', cls.txe) - ctable.set_node_property(column_cmd_rx, i_row, 'state', ClasterResult.WAITING) - ctable.set_node_property(column_cmd_tx, i_row, 'state', ClasterResult.WAITING) + # Получить индекс строки кластера в таблице + var i_row = indexes[cls.cname] + # Установить новый текст + ctable.set_row_text(i_row, row_text) + # Результат выполнения + ctable.set_node_property(column_cmd_rx, i_row, 'state', cls.result_rxe) + ctable.set_node_property(column_cmd_tx, i_row, 'state', cls.result_txe) ## Находит пересечения диапазонов