Рефактор.
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
@tool
|
||||
extends Panel
|
||||
|
||||
## Выполнение функций информационного ЭМС (ЭМС-ТГ)
|
||||
|
||||
#region Определяемое при использовании
|
||||
## Индекс -> Имя устройства. Нужен для предсказуемого
|
||||
## порядка отображения: верх->вниз или лево->право.
|
||||
@@ -53,11 +55,8 @@ var table_cell_row: Array
|
||||
var yems_info: Dictionary[StringName, Dictionary] ## Доклады
|
||||
var yems_cmd: Dictionary[StringName, Dictionary] ## Команды
|
||||
## Порядок следования кластеров в таблице.
|
||||
## {имя_устройства: { имя_кластера: индекс_в_таблице } }
|
||||
## {имя_устройства: {имя_кластера: индекс_в_таблице}}
|
||||
var cnames_table: Dictionary[StringName, Dictionary]
|
||||
## Порядок следования кластеров на шкале.
|
||||
## {имя_устройства: { индекс_на_шкале } }
|
||||
var pnames_scale: Dictionary[StringName, int]
|
||||
## Текущее выбранное оператором устройство на шкале
|
||||
var selected_unit: Dictionary[StringName, bool]
|
||||
## Состояния кластеров в соответствии с докладами и командами
|
||||
@@ -79,7 +78,8 @@ enum ClasterMode {
|
||||
}
|
||||
|
||||
|
||||
## Состояние кластера. Значения должны соответствовать состояниям [b]six-state-button[/b]
|
||||
## Состояние кластера. Значения должны соответствовать
|
||||
## состояниям [b]six-state-button[/b]
|
||||
enum ClasterResult {
|
||||
WAITING = 0, ## Ожидание даннных
|
||||
DONE = 1, ## Выполнено
|
||||
@@ -129,8 +129,8 @@ func _ready() -> void:
|
||||
var ctable: = $'таблица/сетка'
|
||||
ctable.set_header(header_row)
|
||||
ctable.set_header_text(table_header_text)
|
||||
ctable.set_header_property(6, 'image_file', image_file_rx)
|
||||
ctable.set_header_property(7, 'image_file', image_file_tx)
|
||||
ctable.set_header_property(column_cmd_rx, 'image_file', image_file_rx)
|
||||
ctable.set_header_property(column_cmd_tx, 'image_file', image_file_tx)
|
||||
ctable.set_headers_min_size(table_header_widths)
|
||||
ctable.set_columns_min_size(table_column_widths)
|
||||
ctable.set_rows_min_hight(table_rows_hight)
|
||||
@@ -139,6 +139,7 @@ func _ready() -> void:
|
||||
|
||||
|
||||
## Вызывается при выборе оператором устройства на шкале
|
||||
## [param val] - состояние кнопки переключателя устройств
|
||||
## [param nm] - имя выбранного устройства
|
||||
func _on_scale_selected(val: bool, nm: StringName):
|
||||
selected_unit[nm] = val
|
||||
@@ -157,12 +158,13 @@ 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(new_indexes, ctable, unit_info)
|
||||
update_table(unit_info, ctable, new_indexes)
|
||||
map_yems_info_to_table(unit_info, ctable, indexes)
|
||||
connect_cmd_handlers(new_indexes, ctable, nm)
|
||||
connect_cmd_handlers(nm, ctable, new_indexes)
|
||||
|
||||
|
||||
## Обновляет состояние выполнения команды оператора
|
||||
## [param nm] - имя устройства
|
||||
func update_cvi(nm: StringName):
|
||||
var unit_info = yems_info[nm]
|
||||
var unit_cmd = yems_cmd[nm]
|
||||
@@ -188,10 +190,10 @@ func update_cvi(nm: StringName):
|
||||
|
||||
|
||||
## Подключает обработчики команд к таблице кластеров
|
||||
## [param nm] - имя устройства
|
||||
## [param new_indexes] - новые индексы рядов таблицы
|
||||
## [param cls_table] - таблица для отображения кластеров
|
||||
## [param nm] - имя устройства
|
||||
func connect_cmd_handlers(new_indexes: Array, ctable: GDTable, nm: StringName):
|
||||
func connect_cmd_handlers(nm: StringName, ctable: GDTable, new_indexes: Array):
|
||||
for icls in new_indexes:
|
||||
var i_row = icls[0]
|
||||
# Имя устройства и имя кластера
|
||||
@@ -204,6 +206,7 @@ func connect_cmd_handlers(new_indexes: Array, ctable: GDTable, nm: StringName):
|
||||
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):
|
||||
var unit_cmd = yems_cmd[nm]
|
||||
if cname in unit_cmd:
|
||||
@@ -213,30 +216,35 @@ func _on_user_cmd(val: bool, nm: StringName, cname: String, param_name: StringNa
|
||||
|
||||
|
||||
## Обрабатывает событие [b]data_received[/b]
|
||||
## [param data] - данные принятые от устройства
|
||||
## [param nm] - имя устройства
|
||||
func on_data_received(data: Dictionary, nm: StringName):
|
||||
set_timeouts(nm, data)
|
||||
var unit_info: = yems_info[nm]
|
||||
unit_info_merge(unit_info, data)
|
||||
if not unit_info:
|
||||
# для устройства нет данных
|
||||
return
|
||||
var ctable: GDTable = $'таблица/сетка'
|
||||
var claster_scale: = name_to_scale[nm] as GridContainer
|
||||
var indexes: = cnames_table[nm] # Индексы строк в таблице
|
||||
var cscale: = 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)
|
||||
update_table(unit_info, ctable, new_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)
|
||||
var inters: = find_inters(yems_info)
|
||||
connect_cmd_handlers(nm, ctable, new_indexes)
|
||||
map_yems_info_to_scale(unit_info, cscale)
|
||||
var inters: = find_inters()
|
||||
reset_matrix()
|
||||
map_inters_to_matrix(inters, $'матрица')
|
||||
cmd_to_unit(nm)
|
||||
|
||||
|
||||
## Создаёт новые ряды в таблице
|
||||
func update_table(new_indexes: Array, ctable: GDTable, unit_info: Dictionary):
|
||||
func update_table(unit_info: Dictionary, ctable: GDTable, new_indexes: Array):
|
||||
# Добавить новые ряды. Два прохода нужно для того,
|
||||
# что порядок элементов в словаре не определён.
|
||||
for icls in new_indexes:
|
||||
@@ -254,7 +262,8 @@ func update_table(new_indexes: Array, ctable: GDTable, unit_info: Dictionary):
|
||||
ctable.set_node_property(column_cmd_tx, i_row, 'state', cls.result_txe)
|
||||
|
||||
|
||||
func update_indexes(unit_info, indexes) -> Array:
|
||||
## Обновляет индексы строк в таблице
|
||||
func update_indexes(unit_info: Dictionary, indexes: Dictionary) -> Array:
|
||||
var new_indexes: = []
|
||||
for cls in unit_info.mcls:
|
||||
# Проверить, есть ли уже такой индекс
|
||||
@@ -356,7 +365,9 @@ func map_inters_to_matrix(inters: Array, matrix: GridContainer) -> void:
|
||||
|
||||
|
||||
## Отображает кластеры в таблицу
|
||||
## [param nm] - имя устройства
|
||||
## [param unit_info] - доклад от устройства
|
||||
## [param ctable] - таблица
|
||||
## [param indexes] - индексы в таблице
|
||||
func map_yems_info_to_table(unit_info: Dictionary, ctable: GDTable, indexes: Dictionary):
|
||||
# Обойти все кластеры устройства
|
||||
for cls in unit_info.mcls:
|
||||
@@ -372,16 +383,17 @@ func map_yems_info_to_table(unit_info: Dictionary, ctable: GDTable, indexes: Dic
|
||||
ctable.set_node_property(column_cmd_tx, i_row, 'state', cls.result_txe)
|
||||
|
||||
|
||||
## Находит пересечения диапазонов
|
||||
func find_inters(info: Dictionary) -> Array:
|
||||
## Находит пересечения диапазонов всех устройств и кластеров
|
||||
func find_inters() -> Array:
|
||||
var result = []
|
||||
var all_clusters = []
|
||||
# Собираем все кластеры из всех устройств в один массив
|
||||
for nm in info:
|
||||
for nm in yems_info:
|
||||
# nm - имя устройства
|
||||
var unit_data = info[nm]
|
||||
var unit_data = yems_info[nm]
|
||||
if not unit_data: continue
|
||||
var clasters = 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)
|
||||
@@ -399,8 +411,8 @@ func find_inters(info: Dictionary) -> Array:
|
||||
var max1 = cl1[3]
|
||||
var txe1 = cl1[4]
|
||||
var rxe1 = cl1[5]
|
||||
|
||||
# Сравниваем текущий кластер со всеми последующими, чтобы избежать дублей и самопересечений
|
||||
# Сравниваем текущий кластер со всеми последующими,
|
||||
# чтобы избежать дублей и самопересечений
|
||||
for j in all_clusters.size():
|
||||
var cl2 = all_clusters[j]
|
||||
var dev2 = cl2[0]
|
||||
@@ -409,26 +421,24 @@ func find_inters(info: Dictionary) -> Array:
|
||||
var max2 = cl2[3]
|
||||
var txe2 = cl2[4]
|
||||
var rxe2 = cl2[5]
|
||||
|
||||
#Если нет пары TR(RT) то пропускаем эту комбинацию
|
||||
# Если нет пары TR(RT) то пропускаем эту комбинацию
|
||||
if not ((txe1 and rxe2) or (rxe1 and txe2)):
|
||||
continue
|
||||
|
||||
# Проверка на пересечение диапазонов, пересечение есть если начало одного диапазона меньше конца другого
|
||||
# Проверка на пересечение диапазонов, пересечение
|
||||
# есть если начало одного диапазона меньше конца другого
|
||||
if max1 > min2 and max2 > min1:
|
||||
#Вычисляем точные границы пересечения
|
||||
var inter_start = max(min1, min2)
|
||||
var inter_end = min(max1, max2)
|
||||
|
||||
# Формируем результат в требуемом формате
|
||||
result.append([dev1, dev2, name1, name2, inter_start, inter_end])
|
||||
# заглушка для возвращаемых данных
|
||||
return result
|
||||
|
||||
|
||||
## Отображает кластеры на шкале
|
||||
## [param nm] - имя устройства
|
||||
func map_yems_info_to_scale(unit_info: Dictionary, claster_scale: GridContainer):
|
||||
## [param unit_info] - доклад устройства
|
||||
## [param cscale] - шкала кластера
|
||||
func map_yems_info_to_scale(unit_info: Dictionary, cscale: GridContainer):
|
||||
# Обойти все кластеры устройства
|
||||
for cls in unit_info.mcls:
|
||||
# Преобразовать диапазоны частот в диапазоны отображения
|
||||
@@ -440,9 +450,9 @@ func map_yems_info_to_scale(unit_info: Dictionary, claster_scale: GridContainer)
|
||||
var l: = clampf(c - w, 0.0, 1.0)
|
||||
var h: = clampf(c + w, 0.0, 1.0)
|
||||
# Получить шкалу приёмника
|
||||
var scale_rx: = claster_scale.get_node('panel_rx')
|
||||
var scale_rx: = cscale.get_node('panel_rx')
|
||||
# Получить шкалу передатчика
|
||||
var scale_tx: = claster_scale.get_node('panel_tx')
|
||||
var scale_tx: = cscale.get_node('panel_tx')
|
||||
# Диапазон работает (информация обновляется)
|
||||
if cls.status == ClasterStatus.RUNNING:
|
||||
# Отобразить диапазон приёмника, в соответствии с разрешением
|
||||
|
||||
Reference in New Issue
Block a user