Доработка. Режим ЭМС-ТГ. Отображение состояния входов ЭМС

This commit is contained in:
sasha80
2026-04-02 10:54:51 +03:00
parent 2abe5741eb
commit 57fc201212
2 changed files with 71 additions and 7 deletions

View File

@@ -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
## Обработчик истечения времени достоверности кластера

View File

@@ -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