Исправление. Обновление индикаторов результаты выполнения команды оператора
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
## Находит пересечения диапазонов
|
||||
|
||||
Reference in New Issue
Block a user