Доработка. Режим ЭМС-ТГ. Отображение состояния входов ЭМС
This commit is contained in:
@@ -12,6 +12,8 @@ extends Panel
|
|||||||
@export var freq_min: float
|
@export var freq_min: float
|
||||||
## Максимальная частота, МГЦ
|
## Максимальная частота, МГЦ
|
||||||
@export var freq_max: float
|
@export var freq_max: float
|
||||||
|
## Время достоверности кластера по умолчанию (если не указано в докладе)
|
||||||
|
@export var default_ttl: float
|
||||||
## Цвет диапазона если включен (разрешён)
|
## Цвет диапазона если включен (разрешён)
|
||||||
@export_color_no_alpha var color_enabled: Color
|
@export_color_no_alpha var color_enabled: Color
|
||||||
## Цвет диапазона если выключен (запрещён)
|
## Цвет диапазона если выключен (запрещён)
|
||||||
@@ -49,6 +51,10 @@ extends Panel
|
|||||||
var name_to_index: Dictionary[StringName, int] ## Имя устройства -> Индекс устройства
|
var name_to_index: Dictionary[StringName, int] ## Имя устройства -> Индекс устройства
|
||||||
var name_to_scale: Dictionary[StringName, GridContainer] ## Имя устройства -> Шкала
|
var name_to_scale: Dictionary[StringName, GridContainer] ## Имя устройства -> Шкала
|
||||||
var table_cell_row: Array
|
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
|
#endregion
|
||||||
|
|
||||||
#region Заполняется во время работы
|
#region Заполняется во время работы
|
||||||
@@ -137,6 +143,59 @@ func _ready() -> void:
|
|||||||
ctable.set_header_min_hight(table_rows_hight)
|
ctable.set_header_min_hight(table_rows_hight)
|
||||||
ctable.pin_header2()
|
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] - состояние кнопки переключателя устройств
|
## [param val] - состояние кнопки переключателя устройств
|
||||||
@@ -160,7 +219,7 @@ func _on_scale_selected(val: bool, nm: StringName):
|
|||||||
var indexes: = cnames_table[nm]
|
var indexes: = cnames_table[nm]
|
||||||
update_cvi(nm)
|
update_cvi(nm)
|
||||||
var new_indexes = update_indexes(unit_info, indexes)
|
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)
|
map_yems_info_to_table(unit_info, ctable, indexes)
|
||||||
connect_cmd_handlers(nm, ctable, new_indexes)
|
connect_cmd_handlers(nm, ctable, new_indexes)
|
||||||
|
|
||||||
@@ -239,7 +298,7 @@ func on_data_received(data: Dictionary, nm: StringName):
|
|||||||
# обновить таблицу новыми данными
|
# обновить таблицу новыми данными
|
||||||
if selected_unit[nm]:
|
if selected_unit[nm]:
|
||||||
var new_indexes = update_indexes(unit_info, indexes)
|
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)
|
map_yems_info_to_table(unit_info, ctable, indexes)
|
||||||
connect_cmd_handlers(nm, ctable, new_indexes)
|
connect_cmd_handlers(nm, ctable, new_indexes)
|
||||||
map_yems_info_to_scale(unit_info, cscale)
|
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:
|
for icls in new_indexes:
|
||||||
ctable.add_row(table_cell_row)
|
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):
|
func unit_info_merge(unit_info: Dictionary, data_rx: Dictionary):
|
||||||
var drx: = {}
|
var drx: = {}
|
||||||
for cls in data_rx.mcls:
|
for cls_rx in data_rx.mcls:
|
||||||
drx[cls.cname] = cls
|
ref_cls.cname = 'неопр.№%d' % (drx.size() + 1)
|
||||||
|
cls_rx.merge(ref_cls, false) # Объеденить без перезаписи
|
||||||
|
drx[cls_rx.cname] = cls_rx
|
||||||
var dinfo: = {}
|
var dinfo: = {}
|
||||||
for cls in unit_info.mcls:
|
for cls in unit_info.mcls:
|
||||||
dinfo[cls.cname] = cls
|
dinfo[cls.cname] = cls
|
||||||
@@ -327,6 +388,9 @@ func set_timeouts(nm: StringName, unit_info: Dictionary):
|
|||||||
for cls in unit_info.mcls:
|
for cls in unit_info.mcls:
|
||||||
var timer_name = NodePath('%s_%s' % [nm, cls.cname])
|
var timer_name = NodePath('%s_%s' % [nm, cls.cname])
|
||||||
var timer = get_node_or_null(timer_name)
|
var timer = get_node_or_null(timer_name)
|
||||||
|
cls['status'] = ClasterStatus.RUNNING
|
||||||
|
if cls.ttl < 0.0:
|
||||||
|
continue
|
||||||
if not timer:
|
if not timer:
|
||||||
timer = Timer.new()
|
timer = Timer.new()
|
||||||
timer.name = timer_name
|
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))
|
timer.connect('timeout', _on_timeout_ttl.bind(nm, cls.cname))
|
||||||
add_child(timer)
|
add_child(timer)
|
||||||
timer.start(cls.ttl)
|
timer.start(cls.ttl)
|
||||||
cls['status'] = ClasterStatus.RUNNING
|
|
||||||
|
|
||||||
|
|
||||||
## Обработчик истечения времени достоверности кластера
|
## Обработчик истечения времени достоверности кластера
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ script = ExtResource("1_b7tfl")
|
|||||||
index_to_unit_names = Array[StringName]([&"эмс-ор63", &"эмс-454", &"эмс-го", &"эмс-рлс1", &"эмс-рлс2", &"эмс-ннвс", &"эмс-изделие7", &"эмс-изделие8"])
|
index_to_unit_names = Array[StringName]([&"эмс-ор63", &"эмс-454", &"эмс-го", &"эмс-рлс1", &"эмс-рлс2", &"эмс-ннвс", &"эмс-изделие7", &"эмс-изделие8"])
|
||||||
freq_min = 300.0
|
freq_min = 300.0
|
||||||
freq_max = 6000.0
|
freq_max = 6000.0
|
||||||
|
default_ttl = 2.0
|
||||||
color_enabled = Color(0.898039, 0.458824, 0.239216, 0.7)
|
color_enabled = Color(0.898039, 0.458824, 0.239216, 0.7)
|
||||||
color_disabled = Color(0.601223, 0.601223, 0.601223, 0.7)
|
color_disabled = Color(0.601223, 0.601223, 0.601223, 0.7)
|
||||||
color_alpha = 0.7
|
color_alpha = 0.7
|
||||||
|
|||||||
Reference in New Issue
Block a user