Доработка. WIP Формирование команд оператором

This commit is contained in:
sasha80
2026-03-27 12:10:47 +03:00
parent 6f7bf0a5be
commit 21a0c0c012

View File

@@ -81,7 +81,7 @@ enum ClasterMode {
## Состояние кластера. Значения должны соответствовать состояниям [b]six-state-button[/b]
enum ClasterState {
enum ClasterResult {
WAITING = 0, ## Ожидание даннных
DONE = 1, ## Выполнено
MISSMATCH = 2 ## Несоответствие
@@ -166,36 +166,36 @@ func _on_scale_selected(val: bool, nm: StringName):
func map_cvi_to_table(unit_cvi: Dictionary, ctable: GDTable, indexes: Dictionary):
for cname in indexes:
var i_row = indexes[cname]
var state_rxe: = ClasterState.WAITING
var state_txe: = ClasterState.WAITING
var result_rxe: = ClasterResult.WAITING
var result_txe: = ClasterResult.WAITING
if unit_cvi.has(cname):
state_rxe = unit_cvi[cname]['state_rxe']
state_txe = unit_cvi[cname]['state_txe']
ctable.set_node_property(column_cmd_rx, i_row, 'state', int(state_rxe))
ctable.set_node_property(column_cmd_tx, i_row, 'state', int(state_txe))
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_cmd_vs_info(nm: StringName):
if yems_info.has(nm):
return
var unit_info = yems_info[nm]
if not unit_info.has('mcls'):
return
if not yems_cmd.has(nm):
return
var unit_cvi = {}
var unit_cmd = yems_cmd[nm]
for cls_info in unit_info.mcls:
var claster_cvi = {}
claster_cvi['state_txe'] = ClasterState.WAITING
claster_cvi['state_rxe'] = ClasterState.WAITING
var unit_cmd = yems_cmd[nm]
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]
claster_cvi['state_rxe'] = ClasterState.DONE if cls_info.rxe == cls_cmd.rxe else ClasterState.MISSMATCH
claster_cvi['state_txe'] = ClasterState.DONE if cls_info.txe == cls_cmd.txe else ClasterState.MISSMATCH
unit_cvi[cls_info.cname] = claster_cvi
cmd_vs_info[nm] = unit_cvi
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)
## Подключает обработчики команд к таблице кластеров
@@ -247,7 +247,7 @@ func on_data_received(data: Dictionary, nm: StringName):
map_cvi_to_table(unit_cvi, ctable, indexes)
# Объединяет списки кластеров принятых от устройства
# Объединяет список кластеров принятых от устройства со списком сохранённым
func unit_info_merge(unit_info: Dictionary, data_rx: Dictionary):
var drx: = {}
for cls in data_rx.mcls:
@@ -256,23 +256,30 @@ func unit_info_merge(unit_info: Dictionary, data_rx: Dictionary):
for cls in unit_info.mcls:
dinfo[cls.cname] = cls
dinfo.merge(drx, true)
unit_info.merge(data_rx, true)
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 cmd = yems_info[nm]
# Переписать новыми значениями из команды заданной оператором
cmd['mtype'] = 'cmd'
# Сформировать команду из докладов (данных принятых из сети от устройств)
var unit_info_copy = yems_info[nm].duplicate(true)
var unit_cmd = yems_cmd[nm]
for cls_info in cmd.mcls:
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)
unit_yemstg.cmd.merge(cmd, true)
cls_info.erase('status')
# Передать команду сетевому стеку
unit_yemstg.cmd.merge(unit_info_copy, true)
unit_yemstg.cmd_state = unit.Unit.CmdState.SEND
@@ -352,6 +359,8 @@ func map_yems_info_to_table(unit_info: Dictionary, ctable: GDTable, indexes: Dic
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)
## Находит пересечения диапазонов
@@ -363,8 +372,9 @@ func find_inters(info: Dictionary) -> Array:
# nm - имя устройства
var unit_data = info[nm]
if not unit_data: continue
# cls - один кластер
for cls in unit_data.mcls.filter(func(c): return c.status == ClasterStatus.RUNNING):
var clasters = unit_data.mcls.filter(func(c): return c.status == ClasterStatus.RUNNING)
for cls in clasters:
# cls - один кластер
var cfb = float(cls.cfb)
var wfb = float(cls.wfb) / 2.0
# расчёт границ частотных диапазонов
@@ -424,14 +434,15 @@ func map_yems_info_to_scale(unit_info: Dictionary, claster_scale: GridContainer)
var scale_rx: = claster_scale.get_node('panel_rx')
# Получить шкалу передатчика
var scale_tx: = claster_scale.get_node('panel_tx')
# Проверить что диапазон работает
if cls.status == ClasterStatus.RUNNING: # Диапазон работает (информация обновляется)
# Диапазон работает (информация обновляется)
if cls.status == ClasterStatus.RUNNING:
# Отобразить диапазон приёмника, в соответствии с разрешением
var color_rxe: = color_enabled if cls.get('rxe', false) else color_disabled
scale_rx.set_range(cls.cname, l, h, color_rxe)
# Отобразить диапазон передатчика, в соответствии с разрешением
var color_txe: = color_enabled if cls.get('txe', false) else color_disabled
scale_tx.set_range(cls.cname, l, h, color_txe)
elif cls.status == ClasterStatus.DELETED: # Диапазон удалён (информация не обновляется)
# Диапазон удалён (информация не обновляется)
elif cls.status == ClasterStatus.DELETED:
scale_rx.del_range(cls.cname)
scale_tx.del_range(cls.cname)