Исправление. Обновление индикаторов результаты выполнения команды оператора

This commit is contained in:
sasha80
2026-03-31 10:20:15 +03:00
parent 49d7b71072
commit 9fd258a745

View File

@@ -61,7 +61,6 @@ var pnames_scale: Dictionary[StringName, int]
## Текущее выбранное оператором устройство на шкале ## Текущее выбранное оператором устройство на шкале
var selected_unit: Dictionary[StringName, bool] var selected_unit: Dictionary[StringName, bool]
## Состояния кластеров в соответствии с докладами и командами ## Состояния кластеров в соответствии с докладами и командами
var cmd_vs_info: Dictionary[StringName, Dictionary]
#endregion #endregion
@@ -99,7 +98,6 @@ func _ready() -> void:
yems_cmd[nm] = {} yems_cmd[nm] = {}
cnames_table[nm] = {} cnames_table[nm] = {}
selected_unit[nm] = false selected_unit[nm] = false
cmd_vs_info[nm] = {}
var btns_scales = get_tree().get_nodes_in_group('кнопки-шкалы') var btns_scales = get_tree().get_nodes_in_group('кнопки-шкалы')
for node in btns_scales: for node in btns_scales:
var nm: = node.get_meta('unit_name') as StringName var nm: = node.get_meta('unit_name') as StringName
@@ -157,65 +155,53 @@ func _on_scale_selected(val: bool, nm: StringName):
$label_msg.hide() $label_msg.hide()
var ctable = $'таблица/сетка' var ctable = $'таблица/сетка'
var indexes = cnames_table[nm] 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) update_cvi(nm)
map_cvi_to_table(unit_cvi, ctable, indexes) var new_indexes = update_indexes(unit_info, indexes)
update_table(new_indexes, ctable, unit_info)
map_yems_info_to_table(unit_info, ctable, indexes)
func map_cvi_to_table(unit_cvi: Dictionary, ctable: GDTable, indexes: Dictionary): connect_cmd_handlers(new_indexes, ctable, nm)
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))
## Обновляет состояние выполнения команды оператора
func update_cvi(nm: StringName): func update_cvi(nm: StringName):
var unit_info = yems_info[nm] var unit_info = yems_info[nm]
var unit_cvi = {}
var unit_cmd = yems_cmd[nm] var unit_cmd = yems_cmd[nm]
for cls_info in unit_info.mcls: for cls_info in unit_info.mcls:
var result_rxe = ClasterResult.DONE var result_rxe: = ClasterResult.WAITING
var result_txe = ClasterResult.DONE var result_txe: = ClasterResult.WAITING
if not unit_cmd.has(cls_info.cname): if unit_cmd.has(cls_info.cname):
unit_cvi[cls_info.cname] = \ var cls_cmd = unit_cmd[cls_info.cname]
{ 'result_rxe': ClasterResult.DONE, if cls_info.status == ClasterStatus.RUNNING:
'result_txe': ClasterResult.DONE } if cls_cmd.has('rxe'):
continue result_rxe = ClasterResult.DONE if (cls_info.rxe == cls_cmd.rxe) else ClasterResult.MISSMATCH
var cls_cmd = unit_cmd[cls_info.cname] else:
if cls_cmd.has('rxe'): result_rxe = ClasterResult.DONE
result_rxe = ClasterResult.DONE if (cls_info.rxe == cls_cmd.rxe) else ClasterResult.MISSMATCH if cls_cmd.has('txe'):
if cls_cmd.has('txe'): result_txe = ClasterResult.DONE if (cls_info.txe == cls_cmd.txe) else ClasterResult.MISSMATCH
result_txe = ClasterResult.DONE if (cls_info.txe == cls_cmd.txe) else ClasterResult.MISSMATCH else:
unit_cvi[cls_info.cname] = \ result_txe = ClasterResult.DONE
{ 'result_rxe': result_rxe, else:
'result_txe': result_txe } result_rxe = ClasterResult.DONE
cmd_vs_info[nm].merge(unit_cvi, true) result_txe = ClasterResult.DONE
cls_info['result_rxe'] = result_rxe
cls_info['result_txe'] = result_txe
## Подключает обработчики команд к таблице кластеров ## Подключает обработчики команд к таблице кластеров
## [param new_indexes] - новые индексы рядов таблицы
## [param cls_table] - таблица для отображения кластеров ## [param cls_table] - таблица для отображения кластеров
## [param nm] - имя устройства ## [param nm] - имя устройства
func connect_cmd_handlers(cls_table: GDTable, nm: StringName, indexes: Dictionary): func connect_cmd_handlers(new_indexes: Array, ctable: GDTable, nm: StringName):
var rows_count = cls_table.get_rows_count() for icls in new_indexes:
if indexes.size() != rows_count: var i_row = icls[0]
push_error('indexes.size() != rows_count')
return
for cname in indexes:
# Имя устройства и имя кластера # Имя устройства и имя кластера
var i_row = indexes[cname] var cls = icls[1]
# Подключить обработчки разрешения приёмников # Подключить обработчки разрешения приёмников
var node = cls_table.get_node2(column_cmd_rx, i_row) var node = ctable.get_node2(column_cmd_rx, i_row)
node.connect_check('toggled', _on_user_cmd.bind(nm, cname, 'rxe')) node.connect_check('toggled', _on_user_cmd.bind(nm, cls.cname, 'rxe'))
# Подключить обработчки разрешения приёмников # Подключить обработчки разрешения приёмников
node = cls_table.get_node2(column_cmd_tx, i_row) node = ctable.get_node2(column_cmd_tx, i_row)
node.connect_check('toggled', _on_user_cmd.bind(nm, cname, 'txe')) 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): 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 ctable: GDTable = $'таблица/сетка'
var claster_scale: = name_to_scale[nm] as GridContainer var claster_scale: = name_to_scale[nm] as GridContainer
var indexes: = cnames_table[nm] # Индексы строк в таблице var indexes: = cnames_table[nm] # Индексы строк в таблице
update_cvi(nm)
if selected_unit[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) 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) map_yems_info_to_scale(unit_info, claster_scale)
var inters: = find_inters(yems_info) var inters: = find_inters(yems_info)
var unit_cvi = cmd_vs_info[nm]
reset_matrix() reset_matrix()
map_inters_to_matrix(inters, $'матрица') map_inters_to_matrix(inters, $'матрица')
cmd_to_unit(nm) 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() unit_info.mcls = dinfo.values()
## Отправляет команду в сетевой стек
func cmd_to_unit(nm: StringName): func cmd_to_unit(nm: StringName):
var unit_yemstg: = network.get_unit_instance(nm) var unit_yemstg: = network.get_unit_instance(nm)
# Проверить, что предидущие отправлены # Проверить, что сетевой стек отправил предидущую команду
if unit_yemstg.cmd_state != unit.Unit.CmdState.DONE: if unit_yemstg.cmd_state != unit.Unit.CmdState.DONE:
return return
# Сформировать команду из докладов (данных принятых из сети от устройств) # Сформировать команду из докладов (данных принятых из сети от устройств)
var unit_info_copy = yems_info[nm].duplicate(true) var unit_info_copy = yems_info[nm].duplicate(true)
var unit_cmd = yems_cmd[nm] 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) var mcls = unit_info_copy.mcls.filter(func(c): return c.status == ClasterStatus.RUNNING)
for cls_info in mcls: for cls_info in mcls:
# Если для это кластера есть команда оператора # Если для этого кластера есть команда оператора ...
if unit_cmd.has(cls_info.cname): if unit_cmd.has(cls_info.cname):
# Переписать новыми значениями из команды заданной оператором # ... переписать значениями из команды оператора
var cmd_cls = unit_cmd[cls_info.cname] var cmd_cls = unit_cmd[cls_info.cname]
cls_info.merge(cmd_cls, true) cls_info.rxe = unit_cmd.get('rxe', cls_info.rxe)
cls_info.erase('status') cls_info.txe = unit_cmd.get('txe', cls_info.txe)
# Передать команду сетевому стеку # Передать команду сетевому стеку
unit_yemstg.cmd.merge(unit_info_copy, true) unit_yemstg.cmd.merge(unit_info_copy, true)
unit_yemstg.cmd_state = unit.Unit.CmdState.SEND 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 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]] 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]
# Получить индекс строки кластера в таблице # Установить новый текст
var i_row = indexes[cls.cname] ctable.set_row_text(i_row, row_text)
# Установить новый текст # Результат выполнения
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)
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)
## Находит пересечения диапазонов ## Находит пересечения диапазонов