Compare commits

...

69 Commits

Author SHA1 Message Date
kira-a-k
de876c9a76 Доработка. Кнопка показа схемы и снятие выбора прибора 2025-11-24 20:01:44 +03:00
kira-a-k
d51c16b98e Доработка дебаг 2025-11-23 20:38:53 +03:00
kira-a-k
185b940433 Удаление лишней глобальной группы "debag_control" 2025-11-22 12:40:53 +03:00
kira-a-k
a4fe9409c7 Merge remote-tracking branch 'refs/remotes/kotik/prd-control'
# Conflicts:
#	scenes/pribor-prd-k/pribor-prd-k.tscn
#	scenes/pribor-prd-n/pribor-prd-n.tscn
#	scenes/pribor-prd-v/pribor-prd-v.tscn
#	scenes/контроль/контроль.tscn
2025-11-21 19:49:04 +03:00
kira-a-k
c8f125b1a1 Добавлен переключатель дебаг - "Отладка" в настройках 2025-11-21 18:56:26 +03:00
lepshiy
30dc8a2592 Добавлен переключатель дебаг - в нижнем правом углу режима "Контроль", переключатель "Отладка" 2025-11-19 09:05:33 +03:00
TotMaxim
a8b085a514 Доработка проверки яу 07б
и корректировка температур ум в контроле
2025-11-18 19:59:45 +03:00
TotMaxim
3fb2601aca Доработка мини баров + сообщения оператору 2025-11-18 16:24:05 +03:00
TotMaxim
38c2aa9f80 Рефактор. pribor-prd.gd и позиции сцены 2025-11-17 23:35:43 +03:00
kira-a-k
f3f593a597 Поднятие сцен контроля приборов. Line separator - LF 2025-11-17 23:10:15 +03:00
TotMaxim
f39212232a Модификация провекри и результата контроля ум, если 3 луча проходят по мощности, то ум считается исправным 2025-11-17 21:16:48 +03:00
kira-a-k
2d23772546 Merge branch 'master' of https://totmaxim.ru/velelepie/uarep-ctl
# Conflicts:
#	scripts/pribor-prd.gd
2025-11-17 21:14:40 +03:00
kira-a-k
f0685d70e0 Line separator - LF 2025-11-17 21:13:26 +03:00
kira-a-k
e509f85f5c Merge remote-tracking branch 'refs/remotes/kotik/prd-control' 2025-11-17 21:01:43 +03:00
TotMaxim
dc362ad26f Изменения границ температур на усилителях в контроле 2025-11-17 15:07:29 +03:00
TotMaxim
208406971f Отображение ПРД-К интерфейса в контроле 2025-11-17 14:37:56 +03:00
TotMaxim
9eb31c0d4a После объединения 2025-11-17 14:28:03 +03:00
TotMaxim
033e9869f1 Merge remote-tracking branch 'kitya/Dniissasha' into prd-control
# Conflicts:
#	project.godot
#	scenes/работа/работа.gd
#	scripts/interfer.gd
#	scripts/signaller.gd
#	scripts/threats.gd
2025-11-17 14:08:57 +03:00
TotMaxim
5e78e06626 Доработка индикации прогресс бара, проверку загрузки файла, сброс результатов контроля 2025-11-17 13:58:11 +03:00
TotMaxim
56a0fd8af8 Доработка перехода из одной литеры в дургую, провекра ecm, корректировка подписей 2025-11-17 12:49:35 +03:00
lepshiy
0670bf4b09 Проверка и копирование/создание "config/setting_prd_control.json" 2025-11-17 09:30:51 +03:00
lepshiy
06197096bd Merge remote-tracking branch 'refs/remotes/kot/prd-control'
# Conflicts:
#	scenes/tabs-switch/lbl_ready.gd
#	scenes/tabs-switch/tab-switch.tscn
#	scenes/tilemap/tilemap.gd
#	scenes/контроль/control_prd.gd
#	scenes/контроль/control_prd.gd.uid
#	scenes/контроль/контроль.tscn
2025-11-17 09:04:10 +03:00
kira-a-k
28fea4035c Merge remote-tracking branch 'refs/remotes/kotik/prd-control'
# Conflicts:
#	scenes/tabs-switch/lbl_ready.gd
#	scenes/tabs-switch/tab-switch.tscn
#	scenes/tilemap/tilemap.gd
#	scenes/контроль/control_prd.gd
#	scenes/контроль/control_prd.gd.uid
#	scenes/контроль/контроль.tscn
2025-11-16 22:44:28 +03:00
TotMaxim
5293313f0e Доработка отображения мощностей и конфертацию json парсера 2025-11-16 22:27:38 +03:00
TotMaxim
04da0d0cfd исправления обработки кнопки "тренаж" 2025-11-16 20:50:41 +03:00
TotMaxim
89bc19ec98 добавления файлов конфигурации для контроля прд 2025-11-16 20:17:15 +03:00
TotMaxim
9f32e293a0 доработка нового блока (блок-к.tscn) 2025-11-16 20:12:44 +03:00
TotMaxim
217281ce51 доработка мониторинга температур контроля 2025-11-16 19:30:59 +03:00
TotMaxim
de86d281ca загрузка json 2025-11-16 16:43:32 +03:00
TotMaxim
9727eb04a9 Корректировка интерфейса контроля 2025-11-16 14:05:57 +03:00
lepshiy
e1cd37bcfd Доработка. 2025-11-14 14:05:07 +03:00
lepshiy
dcd806309c Merge remote-tracking branch 'refs/remotes/sasha/master'
# Conflicts:
#	scenes/tilemap/tilemap.gd
#	scenes/работа/работа.gd
#	scripts/settings.gd
#	scripts/signaller.gd
#	scripts/trassa.gd
2025-11-14 13:23:28 +03:00
lepshiy
3915bd59d1 Доработка. 2025-11-14 13:23:15 +03:00
MaD_CaT
ae96a8aa97 [PATCH] Доработка. Счётчик опасных целей не считает свои, если опция работать по своим отключена. 2025-11-13 14:06:32 +03:00
MaD_CaT
9aeacea4d7 [PATCH] Доработка. Добавлен приоритет цели и помехи, в автомате помехи с меньшим приоритетом снимаются. 2025-11-13 14:03:39 +03:00
MaD_CaT
22fe43a062 [PATCH] Доработка. Минимальная ширина полосы 5Мгц. Ширина полосы для цели х1.5. (По результатам испытаний) 2025-11-13 13:56:47 +03:00
MaD_CaT
cee75d02cf [PATCH] Доработка. Колонка со статусом выполнения помехи для конкретной цели. (замечание "комиссии") 2025-11-13 13:17:18 +03:00
MaD_CaT
4f3f4ff7f8 [PATCH] Доработка. Более яркий сектор для которого назначена помеха (замечание "комиссии") 2025-11-13 13:05:51 +03:00
sasha80
3cbba93658 Исправление. Адрес для Трассы не загружается из файла настроек 2025-11-13 11:34:16 +03:00
sasha80
9d476859b1 Рефактор 2025-11-13 11:33:08 +03:00
TotMaxim
69b455f811 Добавление анимации кнопки запуска контроля 2025-11-13 00:23:39 +03:00
TotMaxim
9856e300e9 Отладил отображение контроля фс и зависимости от резальтата 2025-11-12 21:40:57 +03:00
TotMaxim
87e360e1a9 После отладки, добавление индикации состояний эмс ячеек 2025-11-12 20:47:35 +03:00
lepshiy
5a7c719c56 Анимация кнопки "Запуск контроля". Доделать. 2025-11-12 16:36:05 +03:00
lepshiy
8754dcc7f0 Line separators - LF 2025-11-12 16:35:27 +03:00
MaD_CaT
64cbf59ac6 [PATCH] Доработка. При выполняемом сеансе помехи кнопка подавить красная (замечание "комиссии") 2025-11-12 16:34:04 +03:00
MaD_CaT
77b822f3b8 [PATCH] Доработка. Номер цели и номер сеанса помехи в заголовке таблиц теперь отображается значком (замечание "комиссии") 2025-11-12 16:25:48 +03:00
MaD_CaT
eb0978599a [PATCH] Исправление. Обновление состояния выполнения помехи по цели при программном снятии помехи. 2025-11-12 16:22:09 +03:00
MaD_CaT
51f3e961c1 [PATCH] Исправление. Учёт курса при снятии помехи со своей цели. 2025-11-12 16:19:24 +03:00
lepshiy
6fce003c59 Merge remote-tracking branch 'refs/remotes/kot/prd-control' 2025-11-12 09:26:35 +03:00
TotMaxim
2980aa9f15 корректировка объединений 2025-11-11 16:41:39 +03:00
TotMaxim
5b5b5d31c6 Merge remote-tracking branch 'origin/MAD_CAT' into prd-control
# Conflicts:
#	scenes/tabs-switch/tab-switch.tscn
#	scenes/эмс2/эмс_тг.gd
#	scripts/signaller.gd
2025-11-11 16:37:37 +03:00
TotMaxim
1785d23e43 Подтянул прд-н и прд-к 2025-11-11 15:17:25 +03:00
TotMaxim
85c02f3f6c Отлажен прд-в гд, осталась проблема "обращение к удалённому элементу", мониторинг температур 2025-11-11 14:39:39 +03:00
MaD_CaT
3f469935bc Доработка. Колонка со статусом выполнения помехи для конкретной цели. (замечание комиссии) 2025-11-10 16:10:08 +03:00
TotMaxim
15be378743 состояние, где нужна отладка темепературы, мощности, модулей ФС 2025-11-10 14:00:04 +03:00
MaD_CaT
6ea649cf31 Доработка. Более яркий сектор для которого назначена помеха (замечание комиссии) 2025-11-10 12:15:10 +03:00
MaD_CaT
78b6f5a14e Доработка. При выполняемом сеансе помехи кнопка подавить красная (замечание комиссии) 2025-11-10 12:01:56 +03:00
MaD_CaT
1e500dec2c Доработка. Номер цели и номер сеанса помехи в заголовке таблиц теперь отображается значком (замечание комиссии) 2025-11-10 11:51:51 +03:00
MaD_CaT
6a5eae450c Исправление. Обновление состояния выполнения помехи по цели при программном снятии помехи. 2025-11-10 11:31:22 +03:00
MaD_CaT
f6ee2d95a4 Исправление. Учёт курса при снятии помехи со своей цели. 2025-11-10 11:05:05 +03:00
TotMaxim
94f0eccaa1 доработан переход из контроля и позицию приборов в сцене 2025-11-10 10:23:43 +03:00
TotMaxim
2d4fd57789 lineseparators 2025-11-09 22:14:58 +03:00
MaD_CaT
cebf645e4d Godot4. Исправление сепараторов на LF 2025-11-08 12:18:38 +03:00
lepshiy
5657892887 Трасса - кластер 2025-11-01 15:21:59 +03:00
lepshiy
606f5ea689 Merge remote-tracking branch 'refs/remotes/Sasha/master' 2025-10-28 15:33:29 +03:00
lepshiy
6c62419bdb Экран ЭМС ТГ - картинки 2025-10-28 11:10:57 +03:00
sasha80
5991a079c7 Доработка. Важное пояснение 2025-10-24 16:14:29 +03:00
sasha80
2a29e4bd54 Доработка. Важное пояснение 2025-10-24 16:05:42 +03:00
36 changed files with 1519 additions and 1047 deletions

View File

@@ -36,4 +36,4 @@
- После клонирования запустить скрипт `git-hooks-config.sh`
- В среде **Windows** запуск скрипта `git-hooks-config.sh` производить из оболочки `git bash`
- Нужно обновить `settings.json`
- поиск циклических зависимостей
- поиск циклических зависимостей (не реализованно)

View File

@@ -0,0 +1,219 @@
{
"device_constants": {
"PRD_N": {
"constants": {
"POWER_UKP_1": 31,
"POWER_UKP_2": 63,
"DKM_BIT_2": 1,
"DKM_BIT_3": 2,
"BASE_ADDR_EMS_G": 288,
"ADDR_UG_LITERA_1": 262,
"ADDR_UG_LITERA_2": 264,
"ADDR_UG_LITERA_3": 266,
"TEMP_THRESHOLD": 70,
"POWER_THRESHOLD": 40,
"RAY_DOU_NUM": 3,
"ATT_UM_2": 2,
"ATT_UM_3": 3,
"POWER_UM": 100,
"TIMER_DELAY": 10.0,
"STATE_MASHINE_TIMER": 0.3
},
"pribor_config": {
"1н": {"angle": 0.0, "sectors": [4, 8]},
"2н": {"angle": 90.0, "sectors": [7, 11]},
"3н": {"angle": 180.0, "sectors": [6, 10]},
"4н": {"angle": 270.0, "sectors": [5, 9]}
},
"fs_params": {
"2": {"freq": 932.0, "width": 100.0},
"3": {"freq": 1157.0, "width": 100.0}
},
"start_litera": 2,
"progress_max": 20
},
"PRD_V": {
"constants": {
"POWER_UKP_1": 31,
"POWER_UKP_2": 63,
"DKM_BIT_4": 3,
"DKM_BIT_5": 4,
"BASE_ADDR_EMS_G": 288,
"ADDR_UG_LITERA_1": 262,
"ADDR_UG_LITERA_2": 264,
"ADDR_UG_LITERA_3": 266,
"TEMP_THRESHOLD": 70,
"POWER_THRESHOLD": 40,
"RAY_DOU_NUM": 3,
"ATT_UM_4": 2,
"ATT_UM_5": 3,
"POWER_UM": 100,
"TIMER_DELAY": 10.0,
"STATE_MASHINE_TIMER": 0.3
},
"pribor_config": {
"1в": {"angle": 0.0, "sectors": [12, 16]},
"2в": {"angle": 90.0, "sectors": [15, 19]},
"3в": {"angle": 180.0, "sectors": [14, 18]},
"4в": {"angle": 270.0, "sectors": [13, 17]}
},
"fs_params": {
"4": {"freq": 1227.0, "width": 100.0},
"5": {"freq": 1575.0, "width": 110.0}
},
"start_litera": 4,
"progress_max": 20
},
"PRD_K": {
"constants": {
"POWER_UKP_1": 31,
"POWER_UKP_2": 63,
"DKM_BIT_1": 0,
"DKM_BIT_6": 5,
"DKM_BIT_7": 6,
"BASE_ADDR_EMS_G": 288,
"ADDR_UG_LITERA_1": 262,
"ADDR_UG_LITERA_2": 264,
"ADDR_UG_LITERA_3": 266,
"TEMP_THRESHOLD": 40,
"POWER_THRESHOLD": 40,
"RAY_DOU_NUM": 3,
"ATT_UM_1": 0,
"ATT_UM_6": 3,
"ATT_UM_7": 2,
"POWER_UM": 100,
"TIMER_DELAY": 10.0,
"STATE_MASHINE_TIMER": 0.3
},
"pribor_config": {
"1к": {"angle": 0.0, "sectors": [0, 20, 24]},
"2к": {"angle": 90.0, "sectors": [3, 23, 27]},
"3к": {"angle": 180.0, "sectors": [2, 22, 26]},
"4к": {"angle": 270.0, "sectors": [1, 21, 25]}
},
"fs_params": {
"1": {"freq": 450.0, "width": 80.0},
"6": {"freq": 2450.0, "width": 110.0},
"7": {"freq": 4750.0, "width": 110.0}
},
"start_litera": 1,
"progress_max": 30
}
},
"base_configs": {
"block_ip": {
"maa2000_1": [0, false],
"maa2000_2": [1, false],
"ip9_50_1": [2, false],
"ip9_50_2": [3, false],
"ip12_50_1": [4, false],
"ip5_25": [7, false]
},
"block_kasseta": {
"yau07": false,
"ems": false,
"ug": false,
"ukp1": false,
"ukp2": false
}
},
"device_configs": {
"PRD_N": {
"block_ip": "base",
"block_kasseta": "base",
"control_results": {
"block_ip": false,
"temperature": true,
"dkm_2": false,
"dkm_3": false,
"dou_2": false,
"dou_3": false,
"fs_2": 0,
"fs_3": 0
}
},
"PRD_V": {
"block_ip": "base",
"block_kasseta": "base",
"control_results": {
"block_ip": false,
"temperature": true,
"dkm_4": false,
"dkm_5": false,
"dou_4": false,
"dou_5": false,
"fs_4": 0,
"fs_5": 0
}
},
"PRD_K": {
"block_ip": {
"maa2000_1": [0, false],
"maa2000_2": [1, false],
"ip9_50_1": [2, false],
"ip9_50_2": [3, false],
"ip12_50_1": [4, false],
"ip9_50_3": [5, false],
"ip12_50_2": [6, false],
"ip5_25": [7, false]
},
"block_kasseta": "base",
"control_results": {
"block_ip": false,
"temperature": true,
"dkm_1": false,
"dkm_6": false,
"dkm_7": false,
"dou_6": false,
"dou_7": false,
"fs_1": 0,
"fs_6": 0,
"fs_7": 0
}
}
},
"ray_types": ["RAY_m5", "RAY_5", "RAY_15", "RAY_25", "RAY_35", "RAY_45"],
"data_indices": {
"STATUS_BOARD": 0,
"IN_BLANK_PRD": 1,
"IN_IMPULS_PRD": 7,
"OUT_BLANK_PRD": 13,
"OUT_IMPULS_PRD": 19,
"DRY_CONTACT": 27,
"DKM": 28,
"POWER_UKP_1": 31,
"TEMPERATURE_UKP_1": 47,
"POWER_UKP_2": 63,
"TEMPERATURE_UKP_2": 79
},
"fs_keys": {
"1": "fs_1",
"2": "fs_2",
"3": "fs_3",
"4": "fs_4",
"5": "fs_5",
"6": "fs_6",
"7": "fs_7"
},
"temperature_constants": {
"CONST_MIN_TEMP": -25,
"MAXIMUM_CODE_ADC": 3796,
"MINIMUM_CODE_AD": 2660,
"TEMPERATURE_UKP_1": 47,
"TEMPERATURE_UKP_2": 79
},
"ems_input_bits_config": {
"PRD_N": {"bit1": 9, "bit2": 10},
"PRD_V": {"bit1": 11, "bit2": 12},
"PRD_K": {"bit1": 13, "bit2": 14, "bit_lit": 8}
},
"fs_rules":[
{"key": "fs_1", "min": 0, "max": 4},
{"key": "fs_2", "min": 4, "max": 8},
{"key": "fs_3", "min": 8, "max": 12},
{"key": "fs_4", "min": 12, "max": 16},
{"key": "fs_5", "min": 16, "max": 20},
{"key": "fs_6", "min": 20, "max": 24},
{"key": "fs_7", "min": 24, "max": 27}
]
}

View File

@@ -28,7 +28,7 @@ interfer/center_offset=Vector2(200, 225)
interfer/default_color0=Color(0.38, 0.47, 0.51, 1)
interfer/default_color1=Color(0.39, 0.44, 0.5, 1)
interfer/select_color=Color(1, 1, 1, 1)
interfer/interfer_color=Color(0.58, 0.47, 0.51, 1)
interfer/interfer_color=Color(0.9, 0.1, 0.25, 0.9)
interfer/resend_timeout=1000.0
config/external_cu=false
config/unit_rr_request_period=20.0
@@ -36,7 +36,7 @@ config/kems_files_path="user://kems/"
config/emsg_files_path="user://emsg/"
config/settings_path="user://settings.json"
config/unit_bpo_request_period=20.0
interfer/emit_color=Color(0.58, 0.471, 0.51, 0.2)
interfer/emit_color=Color(0.9, 0.1, 0.25, 0.5)
interfer/closed_sectors=Color(0, 0, 0, 1)
[autoload]

View File

@@ -35,8 +35,10 @@ func get_radius_outter() -> float: return material.get('shader_parameter/radius
func get_radius_inner_0() -> float: return material.get('shader_parameter/radius_inner_0')
func get_radius_inner_1() -> float: return material.get('shader_parameter/radius_inner_1')
func get_band_colors(val: Array): return material.get('shader_parameter/ant_band_c')
func get_band_failures(val: Array): return material.get('shader_parameter/ant_band_m')
func set_band_colors(val: Array): material.set('shader_parameter/ant_band_c', val)
func set_band_failures(val: Array): material.set('shader_parameter/ant_band_m', val)
## Добавляет сектор запрета[br]
## [param id] - Индекс сектора запрета.[br]

View File

@@ -7,8 +7,8 @@ const TableHeader = preload('res://table/header.tscn') ## Ячейка за
const TABLE_HEADER = [ TableHeader, TableHeader, TableHeader , TableHeader ] ## Описание ряда заголовка.
const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit , CellLineEdit ] ## Описание ряда.
const TABLE_HEADERS_TEXT = ['Номер', 'Название', 'Пеленг', 'Состояние' ] ## Заголовки таблицы.
const TABLE_COLUMN_SIZE = [ 75, 100, 90, 170 ] ## Ширины колонок.
const TABLE_HEADERS_TEXT = ['', 'Название', 'Пеленг', 'Состояние' ] ## Заголовки таблицы.
const TABLE_COLUMN_SIZE = [ 65, 100, 90, 170 ] ## Ширины колонок.
## Состояние выполнения сеанса помехи
const INTERFER_STATE = {
@@ -122,7 +122,8 @@ func on_interfer_new(ecm, table_index):
# Будем надеяться, что отложенные вызовы производятся в том же порядке
$table.call_deferred('clear_rows_selected')
$table.call_deferred('set_row_selected', i_row, true)
signaller.emit_signal('interfer_selected', ecm)
if not interfer.auto_enabled:
signaller.emit_signal('interfer_selected', ecm)
func on_interfer_off(ecm, table_index):

View File

@@ -0,0 +1,23 @@
[gd_scene load_steps=2 format=3 uid="uid://d012h4hxf2anf"]
[ext_resource type="Texture2D" uid="uid://b3woliae871je" path="res://data/отметка-неопред.png" id="1_0a4l0"]
[node name="emit-led" type="Control"]
layout_mode = 3
anchors_preset = 0
offset_right = 40.0
offset_bottom = 40.0
[node name="texture-led" type="TextureButton" parent="."]
visible = false
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = 26.0
offset_top = 11.0
offset_right = 3.0
offset_bottom = -12.0
grow_horizontal = 2
grow_vertical = 2
texture_normal = ExtResource("1_0a4l0")

View File

@@ -35,5 +35,5 @@ script = ExtResource("2_empn3")
[node name="table" type="GridContainer" parent="scroll"]
layout_mode = 2
columns = 4
columns = 5
script = ExtResource("3_4bupu")

View File

@@ -5,14 +5,16 @@ class_name scroll_threats extends ScrollContainer
const CellLineEdit = preload('res://table/ячейка-2.tscn') ## Ячейка таблицы.
const TableHeader = preload('res://table/header.tscn') ## Ячейка заголовок таблицы.
const EmitLed = preload('res://scenes/frame-threats/emit-led.tscn') ## Ячейка заголовок таблицы.
const TABLE_HEADER = [ TableHeader, TableHeader, TableHeader, TableHeader , TableHeader ] ## Описание ряда заголовка.
const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit, EmitLed ] ## Описание ряда.
const TABLE_COLUMN_PARAM = ['id', 'aoa', 'freq', 'proto', 'emit' ] ## Параметры цели отображаемые в таблице.
const TABLE_HEADERS_TEXT = ['', 'Пеленг', 'Частота, МГц', 'Протокол', 'Помеха' ] ## Заголовки таблицы.
const TABLE_COLUMN_SIZE = [ 65, 70, 110, 140, 65] ## Ширины колонок.
const TABLE_HEADER = [ TableHeader, TableHeader, TableHeader, TableHeader ] ## Описание ряда заголовка.
const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit ] ## Описание ряда.
const TABLE_COLUMN_PARAM = ['id', 'aoa', 'freq', 'proto' ] ## Параметры цели отображаемые в таблице.
const TABLE_HEADERS_TEXT = ['Номер', 'Пеленг', 'Частота, МГц', 'Протокол' ] ## Заголовки таблицы.
const TABLE_COLUMN_SIZE = [ 65, 145, 145, 90 ] ## Ширины колонок.
const TABLE_TEXT_ROWS = 4
const EMIT_STATE_COL = 4
## Снимает выделение цели.
func on_rto_threat_unsel(_th_id): $table.clear_rows_selected()
@@ -63,6 +65,17 @@ func on_threat_update(th, table_index: Dictionary):
var row = map_th_to_row(th)
var i_row = table_index[th.id]
$table.set_row_text(i_row, row)
var emit_node = $table.get_node2(EMIT_STATE_COL, i_row)
var emit_txr = emit_node.get_node('texture-led')
if th.emit_state == 0:
emit_txr.visible = false
elif th.emit_state == 1:
emit_txr.visible = true
emit_txr.self_modulate = Color.ORANGE
elif th.emit_state == 2:
emit_txr.visible = true
emit_txr.self_modulate = Color.RED
## Обрабатывает сигнал [b]threat_lost[/b].
@@ -78,7 +91,7 @@ func on_threat_new(th, table_index):
$table.add_row(TABLE_ROW)
var row = map_th_to_row(th)
$table.set_row_text(i_row, row)
$table.set_row_editable(i_row, false)
disable_edit($table, TABLE_TEXT_ROWS, i_row)
$table.set_node_user_data(0, i_row, th)
table_index[th.id] = i_row
@@ -86,10 +99,11 @@ func on_threat_new(th, table_index):
## Преобразует цель в строку таблицы.
func map_th_to_row(th) -> Array:
var row: = Array()
row.resize(TABLE_COLUMN_PARAM.size())
row.resize(TABLE_TEXT_ROWS)
var i_col: int = 0
for param_name in TABLE_COLUMN_PARAM:
var val = th.get(param_name)
if val == null: continue
row[i_col] = '%0.1f' % val if val is float else '%s' % val
if not th.fflags[param_name]:
row[i_col] = ''
@@ -104,3 +118,13 @@ func on_rto_threat_sel(th_id, tbl):
if node.text.to_int() == th_id:
row_pressed(i)
break
## Отключает возможность редактирования LineEdit в таблице.[br]
## [param tbl] - таблица,[br]
## [param num_col] - номер колонки,[br]
## [param i_row] - номер столбца.[br]
func disable_edit(tbl, num_col: int, i_row: int):
for col in num_col:
var node: LineEdit = tbl.get_node2(col, i_row)
node.editable = false

View File

@@ -59,70 +59,64 @@ var ug_work_1: int = 3 ## Аттенюация усилителей мощно
var ug_work_2: int = 2 ## Аттенюация усилителей мощности
var ug_work_3: int = 0 ## Аттенюация усилителей мощности
var mashine_timer: Timer = Timer.new()
#var prd_k_module: Object
var prd_k_module: Object
var unit_prd_k: Object
#var control_prd_k: Object
var control_prd_k: Object
# Результаты контроля
#var control_results_k: Dictionary = {
#'block_ip': false, # Проверка касет П1 и ИП МА2000
#'temperature': true,
#'dkm_1': false,
#'dkm_6': false,
#'dkm_7': false,
#'dou_6': false,
#'dou_7': false,
#'fs_1': 2,
#'fs_6': 2,
#'fs_7': 2,
#}
var control_results_k: Dictionary = {
'block_ip': false, # Проверка касет П1 и ИП МА2000
'temperature': true,
'dkm_1': false,
'dkm_6': false,
'dkm_7': false,
'dou_6': false,
'dou_7': false,
'fs_1': 2,
'fs_6': 2,
'fs_7': 2,
}
var test_control_k = preload('res://scripts/pribor-prd.gd')
var ctrl_pos = 30
func _ready() -> void:
if Engine.is_editor_hint():
return
var unit_name = get_meta('unit_name')[0]
var prd_k_module = prd.prd_dict[unit_name]
unit_prd_k = prd_k_module.unit_control
unit_prd_k.connect('control_is_over', Callable(self, 'on_control_result'))
func start_control() -> void:
#initialize_connections()
initialize_connections()
setup_timer()
set_default_state()
find_labels(self)
#func on_state_mashine() -> void:
#control_prd_k.state_control_machine()
func on_state_mashine() -> void:
control_prd_k.state_control_machine()
#func initialize_connections() -> void:
#var unit_name = get_meta('unit_name')[0]
#prd_k_module = prd.prd_dict[unit_name]
#unit_prd_k = prd_k_module.unit_yau07
#
#unit_prd_k.connect('line_changed', Callable(self, 'on_line_changed'))
#var power_amplifiers: Array = get_tree().get_nodes_in_group('power_amplifier')
#var init_data: Dictionary = {
#'control_label': $control_result,
#'power_amplifiers': power_amplifiers,
#'unit_prd': unit_prd_k,
#'module_prd' : prd_k_module,
#'constants': constants_k,
#'prd_config': PRIBOR_CONFIG,
#'fs_params': FS_PARAMS,
#'block_ip_prd_config': block_ip_config_k,
#'block_kasseta_y5_prd_config': block_kasseta_y5_prd_config_k,
#'control_results': control_results_k,
#'current_litera': start_litera,
#}
#control_prd_k = test_control_k.TestPRD.new(init_data)
#add_child(control_prd_k)
#control_prd_k.connect('control_is_over', Callable(self, 'on_control_result'))
func initialize_connections() -> void:
var unit_name = get_meta('unit_name')[0]
prd_k_module = prd.prd_dict[unit_name]
unit_prd_k = prd_k_module.unit_yau07
unit_prd_k.connect('line_changed', Callable(self, 'on_line_changed'))
var power_amplifiers: Array = get_tree().get_nodes_in_group('power_amplifier')
var init_data: Dictionary = {
'control_label': $control_result,
'power_amplifiers': power_amplifiers,
'unit_prd': unit_prd_k,
'module_prd' : prd_k_module,
'constants': constants_k,
'prd_config': PRIBOR_CONFIG,
'fs_params': FS_PARAMS,
'block_ip_prd_config': block_ip_config_k,
'block_kasseta_y5_prd_config': block_kasseta_y5_prd_config_k,
'control_results': control_results_k,
'current_litera': start_litera,
}
control_prd_k = test_control_k.TestPRD.new(init_data)
add_child(control_prd_k)
control_prd_k.connect('control_is_over', Callable(self, 'on_control_result'))
func setup_timer() -> void:
@@ -155,7 +149,7 @@ func _enter_tree() -> void:
func _exit_tree() -> void:
if Engine.is_editor_hint():
return
#prd_k_module.cmd_array.append([unit_prd_k.CmdCode.WRITE_ISA, [constants_k.ADDR_UG_LITERA_1, ug_work_1, constants_k.ADDR_UG_LITERA_2, ug_work_2, constants_k.ADDR_UG_LITERA_3, ug_work_3]])
prd_k_module.cmd_array.append([unit_prd_k.CmdCode.WRITE_ISA, [constants_k.ADDR_UG_LITERA_1, ug_work_1, constants_k.ADDR_UG_LITERA_2, ug_work_2, constants_k.ADDR_UG_LITERA_3, ug_work_3]])
func on_line_changed(unit_pribor: Object) -> void:
@@ -165,15 +159,13 @@ func on_line_changed(unit_pribor: Object) -> void:
func on_mode_changed(in_tree: bool) -> void:
if not in_tree:
print_debug('Выход из сцены')
#mashine_timer.stop()
#prd_k_module.cmd_array.append([unit_prd_k.CmdCode.WRITE_ISA, [constants_k.ADDR_UG_LITERA_1, ug_work_1, constants_k.ADDR_UG_LITERA_2, ug_work_2, constants_k.ADDR_UG_LITERA_3, ug_work_3]])
#signaller.emit_signal('interfer_off_all')
mashine_timer.stop()
prd_k_module.cmd_array.append([unit_prd_k.CmdCode.WRITE_ISA, [constants_k.ADDR_UG_LITERA_1, ug_work_1, constants_k.ADDR_UG_LITERA_2, ug_work_2, constants_k.ADDR_UG_LITERA_3, ug_work_3]])
signaller.emit_signal('interfer_off_all')
else:
print_debug('Вход в сцену')
#set_default_state()
#control_prd_k.state = control_prd_k.STATE_MASHINE.INIT
#mashine_timer.start()
set_default_state()
control_prd_k.state = control_prd_k.STATE_MASHINE.INIT
mashine_timer.start()
func power_fill(pow_dic: Dictionary, fs_result: Dictionary) -> void:
@@ -201,7 +193,7 @@ func power_fill(pow_dic: Dictionary, fs_result: Dictionary) -> void:
func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void:
mashine_timer.stop()
block_kasseta_y5_prd_config_k = unit_prd_k.block_kasseta_y5_config
block_kasseta_y5_prd_config_k = control_prd_k.block_kasseta_y5_config
var nodes_y5: Array = get_tree().get_nodes_in_group('y-5')
for node_y5 in nodes_y5:
var meta_y5 = node_y5.get_meta('y5')
@@ -211,7 +203,7 @@ func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void:
break
node_y5.state = STATE_VAL.GOOD if block_kasseta_y5_prd_config_k[meta_y5] else STATE_VAL.ERROR
block_ip_config_k = unit_prd_k.block_ip_config
block_ip_config_k = control_prd_k.block_ip_config
var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply')
for power_supply in node_ip_power_arr:
var meta_ip = power_supply.get_meta('ip')
@@ -248,8 +240,13 @@ func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void:
if not device:
result = false
var name_prd = unit_prd_k.self_name
log.message(Logger.INFO, 'Прибор ПРД-%s %s' % [name_prd, ['неисправен', 'исправен'][int(result)]])
var name_prd = control_prd_k.self_name
if result:
$control_result.text = 'Прибор ПРД-%s исправен' % name_prd
$control_result.add_theme_color_override('font_color', Color.GREEN)
else:
$control_result.text = 'Прибор ПРД-%s неисправен' % name_prd
$control_result.add_theme_color_override('font_color', Color.RED)
func find_labels(node1: Node):

View File

@@ -78,10 +78,7 @@ func on_state_mashine() -> void:
func _ready() -> void:
if Engine.is_editor_hint():
return
print_debug('В сцене ПРД-Н!')
func start_control() -> void:
initialize_connections()
setup_timer()
set_default_state()
@@ -114,11 +111,10 @@ func initialize_connections() -> void:
func setup_timer() -> void:
pass
#add_child(mashine_timer)
#mashine_timer.connect('timeout', Callable(self, 'on_state_mashine'))
#mashine_timer.wait_time = constants_n.STATE_MASHINE_TIMER
#mashine_timer.start()
add_child(mashine_timer)
mashine_timer.connect('timeout', Callable(self, 'on_state_mashine'))
mashine_timer.wait_time = constants_n.STATE_MASHINE_TIMER
mashine_timer.start()
func set_default_state() -> void:
@@ -144,7 +140,7 @@ func _enter_tree() -> void:
func _exit_tree() -> void:
if Engine.is_editor_hint():
return
#prd_n_module.cmd_array.append([unit_prd_n.CmdCode.WRITE_ISA, [constants_n.ADDR_UG_LITERA_1, ug_work_1, constants_n.ADDR_UG_LITERA_2, ug_work_2]])
prd_n_module.cmd_array.append([unit_prd_n.CmdCode.WRITE_ISA, [constants_n.ADDR_UG_LITERA_1, ug_work_1, constants_n.ADDR_UG_LITERA_2, ug_work_2]])
func on_line_changed(unit_pribor: Object) -> void:
@@ -153,15 +149,14 @@ func on_line_changed(unit_pribor: Object) -> void:
func on_mode_changed(in_tree: bool) -> void:
print_debug('Выход из сцены')
#if not in_tree:
#mashine_timer.stop()
#signaller.emit_signal('interfer_off_all')
#prd_n_module.cmd_array.append([unit_prd_n.CmdCode.WRITE_ISA, [constants_n.ADDR_UG_LITERA_1, ug_work_1, constants_n.ADDR_UG_LITERA_2, ug_work_2]])
#else:
#set_default_state()
#control_prd_n.state = control_prd_n.STATE_MASHINE.INIT
#mashine_timer.start()
if not in_tree:
mashine_timer.stop()
signaller.emit_signal('interfer_off_all')
prd_n_module.cmd_array.append([unit_prd_n.CmdCode.WRITE_ISA, [constants_n.ADDR_UG_LITERA_1, ug_work_1, constants_n.ADDR_UG_LITERA_2, ug_work_2]])
else:
set_default_state()
control_prd_n.state = control_prd_n.STATE_MASHINE.INIT
mashine_timer.start()
func power_fill(pow_dic: Dictionary, fs_result: Dictionary) -> void:

View File

@@ -79,10 +79,7 @@ func on_state_mashine() -> void:
func _ready() -> void:
if Engine.is_editor_hint():
return
print_debug('В сцене ПРД-В!')
func start_control() -> void:
initialize_connections()
setup_timer()
set_default_state()
@@ -145,7 +142,7 @@ func _enter_tree() -> void:
func _exit_tree() -> void:
if Engine.is_editor_hint():
return
#prd_v_module.cmd_array.append([unit_prd_v.CmdCode.WRITE_ISA, [constants_v.ADDR_UG_LITERA_1, ug_work_1, constants_v.ADDR_UG_LITERA_2, ug_work_2]])
prd_v_module.cmd_array.append([unit_prd_v.CmdCode.WRITE_ISA, [constants_v.ADDR_UG_LITERA_1, ug_work_1, constants_v.ADDR_UG_LITERA_2, ug_work_2]])
func on_line_changed(unit_pribor: Object) -> void:
@@ -154,15 +151,14 @@ func on_line_changed(unit_pribor: Object) -> void:
func on_mode_changed(in_tree: bool) -> void:
print_debug('Выход из сцены')
#if not in_tree:
#mashine_timer.stop()
#prd_v_module.cmd_array.append([unit_prd_v.CmdCode.WRITE_ISA, [constants_v.ADDR_UG_LITERA_1, ug_work_1, constants_v.ADDR_UG_LITERA_2, ug_work_2]])
#signaller.emit_signal('interfer_off_all')
#else:
#set_default_state()
#control_prd_v.state = control_prd_v.STATE_MASHINE.INIT
#mashine_timer.start()
if not in_tree:
mashine_timer.stop()
prd_v_module.cmd_array.append([unit_prd_v.CmdCode.WRITE_ISA, [constants_v.ADDR_UG_LITERA_1, ug_work_1, constants_v.ADDR_UG_LITERA_2, ug_work_2]])
signaller.emit_signal('interfer_off_all')
else:
set_default_state()
control_prd_v.state = control_prd_v.STATE_MASHINE.INIT
mashine_timer.start()
func power_fill(pow_dic: Dictionary, fs_result: Dictionary) -> void:

View File

@@ -3,7 +3,7 @@ extends Label
const STATUS_GOOD := {"text": "Исправно", "color": Color.GREEN, "font_color": Color.BLACK}
const STATUS_BAD := {"text": "Отказ", "color": Color.RED, "font_color": Color.WHITE}
var _is_uf_status_initialized: bool = false
var is_prd_operational: bool = false # true
var is_prd_operational: bool = true
var is_uf_operational: bool = false
@@ -11,45 +11,24 @@ func _ready() -> void:
tooltip_text = 'Нет связи с приборами комплекса'
for prd_module in prd.prd_dict.values():
prd_module.connect('update_serviceability', Callable(self, 'on_serviceability_changed').bind(prd_module))
var unit_uf = network.get_unit_instance('уарэп-эмс')
var unit_uf: = network.get_unit_instance('уарэп-эмс')
unit_uf.connect('data_received', Callable(self, 'on_uf_status_receive'))
add_theme_color_override("font_color", Color.BLACK)
#func on_serviceability_changed(unit_prd_module: Object) -> void:
func on_serviceability_changed() -> void:
func on_serviceability_changed(unit_prd_module: Object) -> void:
var check_service: bool = true
for prd_module in prd.prd_dict.values():
if prd_module.unit_yau07.online:
#if not unit_prd_module.serviceability:
if not prd_module.serviceability:
if not unit_prd_module.serviceability:
check_service = false
if check_service != is_prd_operational:
is_prd_operational = check_service
_update_serviceability_display()
## Обработчики кнопок
#func _on_button_test_on() -> void:
#print("[TEST] Оба исправны")
#is_prd_operational = true
#is_uf_operational = true
#_update_serviceability_display()
#
#func _on_button_test_off() -> void:
#print("[TEST] Оба неисправны")
#is_prd_operational = false
#is_uf_operational = false
#_update_serviceability_display()
#
#func _on_button_test_mix() -> void:
#is_prd_operational = !is_prd_operational
#is_uf_operational = !is_uf_operational
#print("[TEST] Смешанный режим → UF:", is_uf_operational, "PRD:", is_prd_operational)
#_update_serviceability_display()
func _update_serviceability_display() -> void:
var status = STATUS_GOOD if (is_uf_operational and is_prd_operational) else STATUS_BAD
var status := STATUS_GOOD if (is_uf_operational and is_prd_operational) else STATUS_BAD
text = status.text
modulate = status.color
tooltip_text = 'Результаты обобщенного признака работоспособности изделия'
@@ -57,9 +36,9 @@ func _update_serviceability_display() -> void:
func on_uf_status_receive(unit_uf: Object) -> void:
var KEMS_B = ((unit_uf.status[0] >> 0) & 1) & ((unit_uf.status[0] >> 3) & 1)
var EMS_B_1 = ((unit_uf.status[0] >> 1) & 1) & ((unit_uf.status[0] >> 4) & 1)
var EMS_B_2 = ((unit_uf.status[0] >> 2) & 1) & ((unit_uf.status[0] >> 5) & 1)
var KEMS_B = ((unit_uf.status[0] >> 0) & 1) and ((unit_uf.status[0] >> 3) & 1)
var EMS_B_1 = ((unit_uf.status[0] >> 1) & 1) and ((unit_uf.status[0] >> 4) & 1)
var EMS_B_2 = ((unit_uf.status[0] >> 2) & 1) and ((unit_uf.status[0] >> 5) & 1)
var IP27B = ((unit_uf.status[2] >> 6) & 1)
var check_service: bool = KEMS_B and EMS_B_1 and EMS_B_2 and IP27B
if not _is_uf_status_initialized or check_service != is_uf_operational:

View File

@@ -81,7 +81,7 @@ metadata/_tab_index = 5
[node name="lbl_ready" type="Label" parent="."]
layout_mode = 0
offset_left = 1504.0
offset_left = 1503.0
offset_right = 1600.0
offset_bottom = 27.0
tooltip_text = "Готовность аппаратуры к работе"
@@ -96,8 +96,8 @@ metadata/_edit_lock_ = true
[node name="remote_control" type="Label" parent="."]
layout_mode = 2
offset_left = 1242.0
offset_right = 1402.0
offset_left = 1244.0
offset_right = 1401.0
offset_bottom = 27.0
tooltip_text = "Комплекс находится под внешним управлением"
mouse_filter = 0
@@ -106,11 +106,10 @@ theme_override_styles/normal = SubResource("StyleBoxFlat_o1r22")
text = "Внешнее управление"
horizontal_alignment = 1
vertical_alignment = 1
metadata/_edit_lock_ = true
[node name="тренаж_режим" type="Button" parent="."]
layout_mode = 0
offset_left = 1405.0
offset_left = 1404.0
offset_right = 1501.0
offset_bottom = 27.0
tooltip_text = "Задействовать режим Тренаж"
@@ -125,37 +124,6 @@ theme_override_styles/normal = SubResource("StyleBoxFlat_imu1q")
toggle_mode = true
text = "Тренаж"
script = ExtResource("9_41d34")
metadata/_edit_lock_ = true
[node name="buttontest" type="Button" parent="."]
visible = false
layout_mode = 0
offset_left = 1408.0
offset_top = 64.0
offset_right = 1456.0
offset_bottom = 88.0
text = "mix"
[node name="buttonteston" type="Button" parent="."]
visible = false
layout_mode = 0
offset_left = 1472.0
offset_top = 64.0
offset_right = 1520.0
offset_bottom = 88.0
text = "on"
[node name="buttontestoff" type="Button" parent="."]
visible = false
layout_mode = 0
offset_left = 1536.0
offset_top = 64.0
offset_right = 1584.0
offset_bottom = 88.0
text = "off"
[connection signal="tab_changed" from="tab_switch" to="tab_switch" method="_on_tab_changed"]
[connection signal="toggled" from="тренаж_режим" to="tab_switch" method="_on_button_trenaj_toggled"]
[connection signal="pressed" from="buttontest" to="lbl_ready" method="_on_button_test_mix"]
[connection signal="pressed" from="buttonteston" to="lbl_ready" method="_on_button_test_on"]
[connection signal="pressed" from="buttontestoff" to="lbl_ready" method="_on_button_test_off"]

View File

@@ -1,6 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://ce5mtxqd1ndru"]
[ext_resource type="Texture2D" uid="uid://cgqo5gucd2be0" path="res://scenes/tilemap/dot.png" id="2_rq0y0"]
[ext_resource type="Texture2D" uid="uid://cgqo5gucd2be0" path="res://data/dot.png" id="2_rq0y0"]
[node name="rect" type="TextureRect"]
offset_left = -16.0

View File

@@ -1,6 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://c2523fcn14gn4"]
[ext_resource type="Texture2D" uid="uid://cj1f2uy6qfvki" path="res://scenes/tilemap/23900.png" id="1_v0nwa"]
[ext_resource type="Texture2D" uid="uid://cj1f2uy6qfvki" path="res://data/23900.png" id="1_v0nwa"]
[node name="23900" type="Sprite2D"]
scale = Vector2(0.496934, 0.496934)

View File

@@ -1,6 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://cv342kc1jj5hb"]
[ext_resource type="Texture2D" uid="uid://mobingoxskg1" path="res://scenes/tilemap/threat.png" id="1_pvxsy"]
[ext_resource type="Texture2D" uid="uid://mobingoxskg1" path="res://data/threat.png" id="1_pvxsy"]
[node name="Threat" type="Sprite2D"]
scale = Vector2(0.0244268, 0.0244268)

View File

@@ -367,13 +367,13 @@ func _process(delta) -> void:
_queue.erase(tile.i)
req.request_completed.connect(_response.bind(req, tile))
if req.request(tile.url) != OK:
tile.t = now
remove_child(req)
req.queue_free()
_req_count -= 1
push_error('запрос \"%s\" не отправлен' % tile.url)
if _queue.is_empty():
emit_signal('load_completed')
@@ -717,7 +717,7 @@ func set_coordinates(lon: float, lat: float, course: float) -> void:
add_mark_from_lon_lat(ship_id, lon, lat, ship_instance, 0.0)
else:
_marks[ship_id].position = lonlat_to_world(lon, lat)
ship_instance.rotation_degrees = fmod(course, 360.0)
ship_instance.rotation_degrees = fmod(270.0 + course, 360.0)
queue_redraw()
@@ -727,7 +727,7 @@ func blend_mask(val: bool) -> void:
func update_coordinates_label(lon: float, lat: float) -> void:
coordinates_label = 'Координаты:\nNS:%f\nEW:%f' % [lat, lon]
coordinates_label = 'Координаты: NS:%f, EW:%f' % [lat, lon]
signaller.emit_signal('update_coordinates_map', coordinates_label)

View File

@@ -0,0 +1,80 @@
extends Button
var base_style: StyleBoxFlat
var tween
var pulsing: bool = false
var original_text: String
func _ready():
original_text = text
_setup_styles()
_setup_signals()
func _setup_styles() -> void:
if get("theme_override_styles/disabled") == null:
base_style = StyleBoxFlat.new()
base_style.border_color = Color(1.0, 0.5, 0.0)
base_style.border_width_top = 4
base_style.border_width_bottom = 4
base_style.border_width_left = 4
base_style.border_width_right = 4
base_style.bg_color = Color(0.2, 0.2, 0.2)
set("theme_override_styles/disabled", base_style)
else:
base_style = get("theme_override_styles/disabled")
set("theme_override_colors/font_disabled_color", Color(1.0, 1.0, 1.0))
func _setup_signals() -> void:
connect("pressed", Callable(self, "_on_pressed"))
if not signaller:
return
var signals_to_connect := ["режим_работа", "режим_журнал", "режим_эмс", "режим_настройки", "режим_контроль"]
for signal_name in signals_to_connect:
if signaller.has_signal(signal_name):
signaller.connect(signal_name, Callable(self, "_on_status_change"))
func _on_pressed():
disabled = true
text = "Идет выполнение контроля"
_start_pulse()
func _start_pulse():
if pulsing:
return
pulsing = true
tween = create_tween()
tween.set_loops()
var color1 = Color(1.0, 0.5, 0.0) # оранжевый
var color2 = Color(0.4, 0.4, 0.4) # серый
tween.tween_property(base_style, "border_color", color2, 0.5)\
.set_trans(Tween.TRANS_SINE)\
.set_ease(Tween.EASE_IN_OUT)
tween.tween_property(base_style, "border_color", color1, 0.5)\
.set_trans(Tween.TRANS_SINE)\
.set_ease(Tween.EASE_IN_OUT)
func _stop_pulse():
if tween:
tween.kill()
tween = null
base_style.border_color = Color(1.0, 0.5, 0.0)
pulsing = false
disabled = false
text = original_text
tooltip_text = ''
func _on_status_change():
_stop_pulse()
func _exit_tree() -> void:
if tween:
tween.kill()

View File

@@ -0,0 +1 @@
uid://xjs7owe2iexn

View File

@@ -0,0 +1,410 @@
[gd_scene load_steps=15 format=3 uid="uid://ffi1njkjceb5"]
[ext_resource type="Texture2D" uid="uid://c6nve6f8sfyj2" path="res://data/состояние-исправности-0.png" id="1_uojqc"]
[ext_resource type="Texture2D" uid="uid://dnreyfh3cd1k2" path="res://data/состояние-исправности-1.png" id="2_a8ar3"]
[ext_resource type="Texture2D" uid="uid://c6booa8753u5t" path="res://data/состояние-исправности-2.png" id="3_xwd13"]
[ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="4_eobkx"]
[ext_resource type="Texture2D" uid="uid://00871pb6moln" path="res://data/прогресс-фон-1.png" id="5_mg57e"]
[ext_resource type="Texture2D" uid="uid://c1k856fxhrjnh" path="res://data/прогресс-заполнение-1.png" id="6_of7rd"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_3nd2u"]
[sub_resource type="GDScript" id="GDScript_oj3k3"]
script/source = "@tool
class_name blok_v extends PanelContainer
@export var textures: Array
@export var animation_duration: float = 1.5
signal pressed(control: PanelContainer)
## Значения уровней
@export var value0: Array:
set(v):
value0.assign(v)
var items: Array = get_level_nodes()
var count: int = min(items.size(), v.size())
for i in count:
set_value0_animated(items[i], v[i])
## Значение уровня
@export var value1: float:
set(v):
value1 = v
if not is_inside_tree():
return
$margin/vbox/grid1/level7.value = v
$margin/vbox/grid1/level7.tint_progress = Color.RED if v >= 50 else Color.GOLD if v >= 40 else Color.WHITE
@export var min_value0: float:
set(v):
min_value0 = v
var items: = get_level_nodes()
set_group_param(items, 'min_value', v)
@export var min_value1: float:
set(v):
min_value1 = v
if not is_inside_tree():
return
$margin/vbox/grid1/level7.min_value = v
@export var max_value0: float:
set(v):
max_value0 = v
var items: = get_level_nodes()
set_group_param(items, 'max_value', v)
@export var max_value1: float:
set(v):
max_value1 = v
if not is_inside_tree():
return
$margin/vbox/grid1/level7.max_value = v
@export var step0: float:
set(v):
step0 = v
var items: = get_level_nodes()
set_group_param(items, 'step', v)
@export var step1: float:
set(v):
step1 = v
if not is_inside_tree():
return
$margin/vbox/grid1/level7.step = v
@export var value_name0: String:
set(v):
value_name0 = v
var items: Array = get_name_nodes()
set_group_param(items, 'text', v)
@export var value_name1: String:
set(v):
value_name1 = v
if not is_inside_tree():
return
$margin/vbox/grid2/lbl7.text = v
@export var fname: String:
set(v):
fname = v
if not is_inside_tree():
return
$margin/vbox/grid0/fname.text = v
@export var rname: String:
set(v):
rname = v
if not is_inside_tree():
return
$margin/vbox/grid0/rname.text = v
@export var state: int:
set(v):
state = tools.clip_value(v, 0, textures.size() - 1)
if not is_inside_tree():
return
$margin/vbox/grid0/state.texture = textures[state]
@export var alignment: int:
set(v):
alignment = v
if is_inside_tree():
$margin/vbox.alignment = v
@export var value0_info: String:
set(v):
value0_info = v
@export var value1_info: String:
set(v):
value1_info = v
func _on_button_pressed(): emit_signal('pressed', self)
func set_value0(value: Array): value0.assign(value)
func _enter_tree() -> void: call_deferred('_enter_tree_defered')
func _ready():
var items: Array = get_level_nodes()
for item in items:
item.connect('value_changed', on_level_changed.bind(item, value0_info))
on_level_changed(item.value, item, value0_info)
var level7: = $margin/vbox/grid1/level7
level7.connect('value_changed', on_level_changed.bind(level7, value1_info))
on_level_changed(level7.value, level7, value1_info)
func on_level_changed(_val: float, item: TextureProgressBar, info: String):
item.tooltip_text = '%s\\nТекущее: %0.2f\\nДиапазон: %0.2f…%0.2f' % [info, item.value, item.min_value, item.max_value]
func set_group_param(items: Array, param: StringName, v) -> void:
if not is_inside_tree():
return
if not get_tree():
return
for i in items.size():
items[i].set(param, v)
func set_value0_by_index(index: int, value: float) -> void:
var items: Array = get_level_nodes()
items[index].value = value
func _enter_tree_defered():
var items: Array = get_level_nodes()
var count: int = min(items.size(), value0.size())
for i in count:
items[i].min_value = min_value0
items[i].max_value = 1400 # max_value0: TODO для отладки
items[i].step = step0
items = get_name_nodes()
set_group_param(items, 'text', value_name0)
if is_inside_tree():
$margin/vbox/grid1/level7.value = value1
$margin/vbox/grid1/level7.min_value = min_value1
$margin/vbox/grid1/level7.max_value = max_value1
$margin/vbox/grid1/level7.step = step1
$margin/vbox/grid2/lbl7.text = value_name1
$margin/vbox.alignment = alignment
$margin/vbox/grid0/rname.text = rname
$margin/vbox/grid0/fname.text = fname
$margin/vbox/grid0/state.texture = textures[state]
func get_level_nodes() -> Array:
if not is_inside_tree():
return []
if not get_tree():
return []
return [$margin/vbox/grid1/level1]
func get_name_nodes() -> Array:
if not is_inside_tree():
return []
if not get_tree():
return []
return [$margin/vbox/grid2/lbl1]
func set_value0_animated(target_node, target_value: float) -> void:
var tween: Tween = create_tween()
tween.set_ease(Tween.EASE_OUT)
tween.set_trans(Tween.TRANS_QUINT)
tween.tween_property(target_node, 'value', target_value, animation_duration)
"
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_rceim"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_8yvwo"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_6qu57"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_mlxje"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_3dspb"]
[sub_resource type="GDScript" id="GDScript_45hqb"]
script/source = "@tool
extends MarginContainer
func _enter_tree() -> void:
margins = [8, 8, 8, 8]
@export var margins: Array:
set(vals):
add_theme_constant_override('margin_top', vals[0])
add_theme_constant_override('margin_left', vals[1])
add_theme_constant_override('margin_bottom', vals[2])
add_theme_constant_override('margin_right', vals[3])
get:
var vals = [0, 0, 0, 0]
vals[0] = get_theme_constant('margin_top')
vals[1] = get_theme_constant('margin_left')
vals[2] = get_theme_constant('margin_bottom')
vals[3] = get_theme_constant('margin_right')
return vals
"
[node name="блок-к" type="PanelContainer"]
editor_description = "Элемент замены из ЗИП"
offset_right = 160.0
offset_bottom = 88.0
theme_override_styles/panel = SubResource("StyleBoxEmpty_3nd2u")
script = SubResource("GDScript_oj3k3")
textures = [ExtResource("1_uojqc"), ExtResource("2_a8ar3"), ExtResource("3_xwd13")]
value0 = [20.0, 30.0, 40.0, 50.0, 60.0, 70.0]
value1 = -40.0
min_value1 = -40.0
max_value0 = 1400.0
max_value1 = 55.0
step0 = 1.0
step1 = 1.0
value_name0 = "P,%"
value_name1 = "°C"
fname = "Блок В"
rname = "A1"
[node name="button" type="Button" parent="."]
layout_mode = 2
theme_override_styles/focus = SubResource("StyleBoxEmpty_rceim")
theme_override_styles/disabled = SubResource("StyleBoxEmpty_8yvwo")
theme_override_styles/hover = SubResource("StyleBoxEmpty_6qu57")
theme_override_styles/pressed = SubResource("StyleBoxEmpty_mlxje")
theme_override_styles/normal = SubResource("StyleBoxEmpty_3dspb")
[node name="rect" type="NinePatchRect" parent="."]
layout_mode = 2
texture = ExtResource("4_eobkx")
draw_center = false
region_rect = Rect2(0, 0, 63, 63)
patch_margin_left = 17
patch_margin_top = 17
patch_margin_right = 17
patch_margin_bottom = 15
[node name="margin" type="MarginContainer" parent="."]
layout_mode = 2
theme_override_constants/margin_left = 8
theme_override_constants/margin_top = 8
theme_override_constants/margin_right = 8
theme_override_constants/margin_bottom = 8
script = SubResource("GDScript_45hqb")
margins = [8, 8, 8, 8]
[node name="vbox" type="VBoxContainer" parent="margin"]
layout_mode = 2
[node name="grid0" type="GridContainer" parent="margin/vbox"]
layout_mode = 2
columns = 3
[node name="state" type="TextureRect" parent="margin/vbox/grid0"]
custom_minimum_size = Vector2(24, 24)
layout_mode = 2
size_flags_horizontal = 2
size_flags_vertical = 6
texture = ExtResource("1_uojqc")
expand_mode = 1
[node name="fname" type="Label" parent="margin/vbox/grid0"]
self_modulate = Color(1, 1, 1, 0.627451)
custom_minimum_size = Vector2(0, 20)
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
theme_override_font_sizes/font_size = 17
text = "Блок В"
horizontal_alignment = 1
vertical_alignment = 1
[node name="rname" type="Label" parent="margin/vbox/grid0"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 6
theme_override_font_sizes/font_size = 18
text = "A1"
horizontal_alignment = 2
vertical_alignment = 1
[node name="grid1" type="GridContainer" parent="margin/vbox"]
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 3
columns = 7
[node name="level1" type="TextureProgressBar" parent="margin/vbox/grid1" groups=["уровни"]]
custom_minimum_size = Vector2(30, 0)
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "
Текущее: 0.00
Диапазон: 0.00…1400.00"
mouse_filter = 0
max_value = 1400.0
fill_mode = 3
nine_patch_stretch = true
stretch_margin_left = 8
stretch_margin_top = 8
stretch_margin_right = 8
stretch_margin_bottom = 8
texture_under = ExtResource("5_mg57e")
texture_progress = ExtResource("6_of7rd")
tint_under = Color(1, 1, 1, 0.419608)
tint_progress = Color(0.890196, 0.486275, 0.196078, 1)
[node name="level7" type="TextureProgressBar" parent="margin/vbox/grid1"]
custom_minimum_size = Vector2(30, 0)
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "
Текущее: -40.00
Диапазон: -40.00…60.00"
mouse_filter = 0
min_value = -40.0
max_value = 55.0
value = -40.0
fill_mode = 3
nine_patch_stretch = true
stretch_margin_left = 8
stretch_margin_top = 8
stretch_margin_right = 8
stretch_margin_bottom = 8
texture_under = ExtResource("5_mg57e")
texture_progress = ExtResource("6_of7rd")
tint_under = Color(0.890196, 0.486275, 0.196078, 1)
tint_over = Color(0.890196, 0.486275, 0.196078, 1)
[node name="grid2" type="GridContainer" parent="margin/vbox"]
clip_contents = true
layout_mode = 2
size_flags_horizontal = 4
size_flags_vertical = 4
columns = 7
[node name="lbl1" type="Label" parent="margin/vbox/grid2" groups=["названия"]]
clip_contents = true
custom_minimum_size = Vector2(30, 0)
layout_mode = 2
size_flags_horizontal = 3
theme_override_font_sizes/font_size = 8
text = "P,%"
horizontal_alignment = 1
[node name="lbl7" type="Label" parent="margin/vbox/grid2"]
clip_contents = true
custom_minimum_size = Vector2(30, 0)
layout_mode = 2
size_flags_horizontal = 3
theme_override_font_sizes/font_size = 8
text = "°C"
horizontal_alignment = 1
[connection signal="pressed" from="button" to="." method="_on_button_pressed"]

View File

@@ -1,85 +1,39 @@
@tool
extends TextureButton
@onready var tween: Tween
@export var state_colors: Array
func _ready():
toggle_mode = true
focus_mode = Control.FOCUS_ALL
connect("focus_entered", _on_focus_entered)
connect("focus_exited", _on_focus_exited)
func _on_toggled(toggled_on): $frame.visible = toggled_on
func _enter_tree() -> void:
if has_node("label"):
$label.self_modulate = state_colors[state]
$label.self_modulate = state_colors[state]
ProjectSettings.connect('settings_changed', _on_settings_changed)
func update_progress_bar(target_value) -> void:
if tween:
tween.kill()
tween = create_tween()
tween.tween_property($control_progress, "value", target_value, 0.3)
func _exit_tree() -> void:
ProjectSettings.disconnect('settings_changed', _on_settings_changed)
func _on_toggled(toggled_on):
if has_node("frame"):
$frame.visible = toggled_on
func _on_focus_entered():
button_pressed = true
#enter_press() TODO: Пока что без выбора прибора
func _on_focus_exited():
pass
func enter_press():
var enter_event = InputEventAction.new()
enter_event.action = "ui_accept"
enter_event.pressed = true
Input.parse_input_event(enter_event)
func _on_settings_changed():
if not is_inside_tree(): return
var white_color = ProjectSettings.get_setting('Схема прибора. Белый цвет', Color.DIM_GRAY)
var black_color = ProjectSettings.get_setting('Схема прибора. Чёрный цвет', Color.CORAL)
$pic_functional.material.set('shader_parameter/white', white_color)
$pic_functional.material.set('shader_parameter/black', black_color)
@export var state: int:
set(v):
v = 0 if v < 0 else v % state_colors.size()
state = v
if is_inside_tree() and has_node("label"):
if is_inside_tree():
$label.self_modulate = state_colors[v]
@export var progress_value: float = 0.0:
@export var show_functional: bool:
set(v):
progress_value = v
show_functional = v
if is_inside_tree():
update_progress_bar(v)
var max_val = $control_progress.get('max_value')
var percentage = (v / max_val) * 100.0
$control_progress.tooltip_text = 'Процесс контроля %01d%%' % percentage
@export var progress_visible: bool:
set(v):
progress_visible = v
if is_inside_tree():
$control_progress.visible = v
@export var progress_max_value: int:
set(v):
progress_max_value = v
if is_inside_tree():
$control_progress.max_value = v
@export var progress_min_value: int:
set(v):
progress_min_value = v
if is_inside_tree():
$control_progress.min_value = v
$pic_functional.visible = v

File diff suppressed because it is too large Load Diff

View File

@@ -9,6 +9,7 @@ script/source = "class_name configure extends Panel
const TableHeader = preload('res://table/header.tscn')
const TableToggle = preload('res://table/settings-toggle.tscn')
const TableEdit = preload('res://table/ячейка-2.tscn')
const TableColor = preload('res://table/color-picker.tscn')
const ALIGNMENT = [HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER]
const HEADER_ROW = [TableHeader, TableHeader]
@@ -64,9 +65,11 @@ const SETTING_TABLE = [
['Адрес БПО правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'],
['Период опроса состояния БПО, секунды', TableEdit, TableEdit, 'Время в секундах' ],
['Период опроса состояния АФСП, секунды', TableEdit, TableEdit, 'Время в секундах' ],
['уареп-трасса', TableEdit, TableEdit, 'IP-адрес для связи с Трассой [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'],
['уарэп-трасса', TableEdit, TableEdit, 'IP-адрес для связи с Трассой [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'],
['Включить работу по своим целям', TableEdit, TableToggle, 'Разрешает работу в секторе со своей целью'],
['Список своих протоколов', TableEdit, TableEdit, 'Список протоколов целей, по которым запрещено работать' ], ]
['Список своих протоколов', TableEdit, TableEdit, 'Список протоколов целей, по которым запрещено работать' ],
['Схема прибора. Белый цвет', TableEdit, TableColor, 'Настройка отображаемого цвета фона' ],
['Схема прибора. Чёрный цвет', TableEdit, TableColor, 'Настройка отображаемого цвета схемы' ], ]
const EXTERNAL_CU = 16 ## Внешнее целеуказание
const TRASSA = 17

View File

@@ -31,7 +31,8 @@ var strob_band_begin: float ## Ширина строба в моме
var strob_dir_begin: float ## Направление антенны в момент начала перетаскивания.
var strob_width_begin: float ## Ширина строба по углу в момент начала перетаскивания.
var view_mode: MapViewMode ## Режим отображения карты
var thrs_dict: Dictionary ## Ссылка на словарь целей
var thrs_dict: Dictionary ## Ссылка на словарь целей
var gos_flag = true ## Флаг работать по своим целям
var color_ecm: Color
var color_select: Color
var color_emit: Color
@@ -55,6 +56,7 @@ var fs_selected: Dictionary ## Словарь выбранных сектор
var fs_active: Dictionary ## Словарь секторов назначенных на подавление
var fs_emit: Dictionary ## Словарь секторов назначенных на подавление
var fs_closed: Dictionary ## Словарь для секторов запрета
var fs_failed: Array ## Индикация сломанных секторов (модули ФС). AntBandState.ANT_BAND_READY - исправен, AntBandState.ANT_BAND_FAILURE - сломан.
## Состояние перетаскивания.
enum DragFSM {
@@ -78,6 +80,11 @@ enum MapViewMode {
}
enum AntBandState {
ANT_BAND_READY = 1,
ANT_BAND_FAILED = 0
}
const VAL_TO_EVENT = {
false: 'manual_control', ## Выбор целей и установка помех вручную.
true: 'full_auto' } ## Выбор целей и установка помех автоматически.
@@ -91,7 +98,14 @@ func on_threat_selected(th, ecm_btns): on_rto_threat_sel(th.id, ecm_btns)
func on_enter_tree() -> void: call_deferred('on_button_strobe_pressed')
func clear_all_klaster(): $canvas.clear_all_seczap()
func on_user_panning(): $btn_center.button_pressed = false
func on_settings_changed():
gos_flag = ProjectSettings.get_setting('application/config/Включить работу по своим целям', true)
color_emit = ProjectSettings.get_setting('application/interfer/emit_color', Color(0.58, 0.47, 0.51, 1.0))
color_ecm = ProjectSettings.get_setting('application/interfer/interfer_color', Color(0.58, 0.47, 0.51, 1.0))
color_select = ProjectSettings.get_setting('application/interfer/select_color', Color(1.0, 1.0, 1.0, 1.0))
@@ -109,9 +123,7 @@ func on_settings_changed():
## Обработчик сигнала изменения списка целей.
func on_threats_resized(ths: Dictionary):
$count_all_pad/count_all.text = '%02d' % ths.size()
var c: int = ths.values().filter(func(th: threats.Threat): return th.proto != '').size()
$count_danger_pad/count_danger.text = '%02d' % c
count_threats(ths)
thrs_dict = ths
@@ -144,10 +156,18 @@ func _exit_tree() -> void:
timer1.queue_free()
func init_fs_failed():
var sectors_count = $canvas.fs_default_colors.size()
fs_failed.resize(sectors_count)
for i in fs_failed.size():
fs_failed[i] = AntBandState.ANT_BAND_READY
## Производит инициализацию.
func _ready():
ProjectSettings.connect('settings_changed', on_settings_changed)
on_settings_changed()
init_fs_failed()
min_zoom = ProjectSettings.get_setting('application/config/map_minimum_zoom', 5)
max_zoom = ProjectSettings.get_setting('application/config/map_maximum_zoom', 19)
drag_fsm = DragFSM.OFF
@@ -167,6 +187,7 @@ func _ready():
signaller.connect('threat_selected', Callable(self, 'on_threat_selected').bind(nodes))
signaller.connect('interfer_selected', Callable(self, 'on_interfer_selected').bind(nodes))
signaller.connect('interfer_new', Callable(self, 'on_interfer_new'))
signaller.connect('on_prog_ecm_off', Callable(self, 'on_interfer_new'))
signaller.connect('interfer_off_all', Callable(self, 'on_interfer_off_all'))
signaller.connect('interfer_prinuditelno', Callable(self, 'on_interfer_prinuditelno').bind(nodes))
signaller.connect('fs_selected', Callable(self, 'on_fs_selected'))
@@ -187,16 +208,13 @@ func _ready():
func sector_klaster(sector_data):
if sector_data["draw"]:
var rect: Rect2 = sector_data["rect"]
var color: Color = sector_data["color"]
var id: int = sector_data["index"]
if sector_data['draw']:
var rect: Rect2 = sector_data['rect']
var color: Color = sector_data['color']
var id: int = sector_data['index']
$canvas.add_seczap(id, Vector4(rect.position.x, rect.position.y, rect.size.x, rect.size.y))
$canvas.set_seczap_color(id, color)
else:
pass
func clear_all_klaster(): $canvas.clear_all_seczap()
func on_navi_data_received(data: Dictionary):
var k = data.get('k', 0.0)
@@ -204,10 +222,6 @@ func on_navi_data_received(data: Dictionary):
course = k
func on_user_panning():
$btn_center.button_pressed = false
func on_chk_interfer_prinuditelno(_interfer_sectors):
$chk_auto.set_pressed_no_signal(false)
on_value_changed(false)
@@ -521,6 +535,14 @@ func update_fs_colors():
else:
fs_colors[key] = color_select
$canvas.set_band_colors(fs_colors)
$canvas.set_band_failures(fs_failed)
if fs_emit.size():
if $btn_activate.pressed:
$btn_activate.self_modulate = Color.RED
else:
$btn_activate.self_modulate = Color.WHITE
else:
$btn_activate.self_modulate = Color.WHITE
func unsel_fs_all(need_btns_off: bool):
@@ -569,8 +591,9 @@ func on_interfer_prinuditelno (prenuditelno_sectors, btns):
## Вызывается при получении информации о состоянии модулей ФС от КАПС РПБ.
func on_fs_update_state(_fs_dict: Dictionary):
pass
func on_fs_update_state(fs_dict: Dictionary):
for key in fs_dict.keys():
fs_failed[key] = fs_dict[key].isg
func on_btn_center_toggled(toggled_on: bool) -> void:
@@ -581,6 +604,8 @@ func on_btn_center_toggled(toggled_on: bool) -> void:
func on_btn_activate_toggled(toggled_on: bool) -> void:
$btn_activate.tooltip_text = 'Включает подавление (%s)' % ('включено' if toggled_on else 'отключено')
signaller.emit_signal('emit_changed', toggled_on)
if not toggled_on:
$btn_activate.self_modulate = Color.WHITE
func on_update_coordinates_label(coordinates_label) -> void:
@@ -614,6 +639,14 @@ func _on_btn_all_work_pressed() -> void:
func on_th_aoa_update(ths):
count_threats(ths)
func count_threats(ths):
$count_all_pad/count_all.text = '%02d' % ths.size()
var c: int = ths.values().filter(func(th: threats.Threat): return th.proto != '').size()
var c: int = 0
if gos_flag:
c = ths.values().filter(func(th: threats.Threat): return th.proto != '').size()
else:
c = ths.values().filter(func(th: threats.Threat): return ((th.proto != '') and th.proto not in interfer.gos_protocols)).size()
$count_danger_pad/count_danger.text = '%02d' % c

View File

@@ -306,18 +306,18 @@ vertical_alignment = 1
[node name="coordinates_map" type="Label" parent="."]
layout_mode = 0
offset_left = 999.0
offset_top = 128.0
offset_right = 1111.0
offset_bottom = 147.0
offset_left = 660.0
offset_top = -24.0
offset_right = 772.0
offset_bottom = -5.0
text = "Координаты:"
[node name="scale_map" type="Label" parent="."]
layout_mode = 0
offset_left = 999.0
offset_top = 202.0
offset_right = 1109.0
offset_bottom = 223.0
offset_left = 1003.0
offset_top = -24.0
offset_right = 1113.0
offset_bottom = -3.0
text = "Масштаб:"
[node name="zoom_plus" type="Button" parent="."]
@@ -383,8 +383,8 @@ texture_normal = ExtResource("14_ggrwd")
[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"]
[connection signal="toggled" from="btn_center" to="." method="on_btn_center_toggled"]
[connection signal="button_down" from="zoom_plus" to="tilemap" method="_on_zoom_plus_button_down"]
[connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_button_up"]
[connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_plus_button_up"]
[connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_button_up"]
[connection signal="button_down" from="zoom_minus" to="tilemap" method="_on_zoom_minus_button_down"]
[connection signal="button_up" from="zoom_minus" to="tilemap" method="_on_zoom_button_up"]
[connection signal="pressed" from="btn_all_work" to="." method="_on_btn_all_work_pressed"]

View File

@@ -1,5 +1,6 @@
extends Panel
func _ready() -> void:
var unit_trassa = network.get_unit_instance('уарэп-трасса')
unit_trassa.connect('line_changed', Callable(self, 'on_trassa_line_changed'))
@@ -8,30 +9,30 @@ func _ready() -> void:
func on_trassa_line_changed(unit_trassa):
if unit_trassa.online:
$"454/СостояниеРэс3".self_modulate = Color.WEB_GREEN
$"СкруглённыйПрямоугольникБелый/Label3".text = 'Трасса'
$"СкруглённыйПрямоугольникБелый/Label4".text = 'Трасса'
$"СкруглённыйПрямоугольникБелый/Label5".text = 'Активный'
$"СкруглённыйПрямоугольникБелый/Label6".text = str(unit_trassa.daa)
$"СкруглённыйПрямоугольникБелый/Label7".text = str(unit_trassa.dap)
$"СкруглённыйПрямоугольникБелый/Label8".text = '1'
$"СкруглённыйПрямоугольникБелый/Label9".text = str(unit_trassa.lfb)
$"СкруглённыйПрямоугольникБелый/Label10".text = str(unit_trassa.lfb)
$'454/СостояниеРэс3'.self_modulate = Color.WEB_GREEN
$'СкруглённыйПрямоугольникБелый/Label3'.text = 'Трасса'
$'СкруглённыйПрямоугольникБелый/Label4'.text = 'Трасса'
$'СкруглённыйПрямоугольникБелый/Label5'.text = 'Активный'
$'СкруглённыйПрямоугольникБелый/Label6'.text = str(unit_trassa.daa)
$'СкруглённыйПрямоугольникБелый/Label7'.text = str(unit_trassa.dap)
$'СкруглённыйПрямоугольникБелый/Label8'.text = '1'
$'СкруглённыйПрямоугольникБелый/Label9'.text = str(unit_trassa.lfb)
$'СкруглённыйПрямоугольникБелый/Label10'.text = str(unit_trassa.lfb)
else:
$"454/СостояниеРэс3".self_modulate = Color.WHITE
$"СкруглённыйПрямоугольникБелый/Label3".text = '-'
$"СкруглённыйПрямоугольникБелый/Label4".text = '-'
$"СкруглённыйПрямоугольникБелый/Label5".text = '-'
$"СкруглённыйПрямоугольникБелый/Label6".text = '-'
$"СкруглённыйПрямоугольникБелый/Label7".text = '-'
$"СкруглённыйПрямоугольникБелый/Label8".text = '-'
$"СкруглённыйПрямоугольникБелый/Label9".text = '-'
$"СкруглённыйПрямоугольникБелый/Label10".text = '-'
$'454/СостояниеРэс3'.self_modulate = Color.WHITE
$'СкруглённыйПрямоугольникБелый/Label3'.text = '-'
$'СкруглённыйПрямоугольникБелый/Label4'.text = '-'
$'СкруглённыйПрямоугольникБелый/Label5'.text = '-'
$'СкруглённыйПрямоугольникБелый/Label6'.text = '-'
$'СкруглённыйПрямоугольникБелый/Label7'.text = '-'
$'СкруглённыйПрямоугольникБелый/Label8'.text = '-'
$'СкруглённыйПрямоугольникБелый/Label9'.text = '-'
$'СкруглённыйПрямоугольникБелый/Label10'.text = '-'
func on_sector_klaster(_data, unit_trassa):
$"СкруглённыйПрямоугольникБелый/Label6".text = str(unit_trassa.dap)
$"СкруглённыйПрямоугольникБелый/Label7".text = str(unit_trassa.daa)
$"СкруглённыйПрямоугольникБелый/Label8".text = '1'
$"СкруглённыйПрямоугольникБелый/Label9".text = str(unit_trassa.lfb)
$"СкруглённыйПрямоугольникБелый/Label10".text = str(unit_trassa.hfb)
func on_sector_klaster(data, unit_trassa):
$'СкруглённыйПрямоугольникБелый/Label6'.text = str(unit_trassa.dap)
$'СкруглённыйПрямоугольникБелый/Label7'.text = str(unit_trassa.daa)
$'СкруглённыйПрямоугольникБелый/Label8'.text = '1'
$'СкруглённыйПрямоугольникБелый/Label9'.text = str(unit_trassa.lfb)
$'СкруглённыйПрямоугольникБелый/Label10'.text = str(unit_trassa.hfb)

1
scripts/.gd.uid Normal file
View File

@@ -0,0 +1 @@
uid://durllxmhtejp1

View File

@@ -93,6 +93,7 @@ const ID_INTERFERS_LEN = 63 ## Размер пула номеров целе
const INTERFER_OFF = 'off'
const INTERFER_IQFILE = 'IQ-файл'
const POW_DEFAULT: float = 50.0
const PERIOD_DEFAULT = 7.5
var msg6_num: int = 0 ## Счётчик сообщений "тип 6"
var msg8_num: int = 0 ## Счётчик сообщений "тип 8"
var id_array: Array ## Массив id воздействий.
@@ -125,6 +126,7 @@ class Interfer:
var modulation: bool ## Модуляция для включения усилителей
var um: float ## Угол места для помехи.
var nmfs: int = 0 ## Номер модуля ФС в нумерации СТЦ
var priority: int = 0 ## Приоритет помехи
func _to_string() -> String:
return 'номер: %d название: %s частота: %0.1f МГц пеленг: %0.1f гр.' % [ispp, ITERFER_MODE[krp][0], params['freq'], kni]
@@ -214,7 +216,7 @@ func _ready() -> void:
threats.connect('threats_resized', Callable(self, 'on_threats_resized'))
threats.connect('threat_update', Callable(self, 'on_threats_update').bind(ecms, unit_caps))
ProjectSettings.connect('settings_changed', on_settings_changed)
var unit_nav = network.get_unit_instance('навигация')
var unit_nav: = network.get_unit_instance('навигация')
unit_nav.connect('data_received', on_nav_data_received.bind(unit_caps))
@@ -257,22 +259,34 @@ func on_timer_check_state(unit_instance, ecms, resend_timeout) -> void:
func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> void:
gos_nmfs.clear()
for thr in threats.values():
if not gos_flag: # Составляется список запретных секторов работы
if (thr.proto in gos_protocols) and thr.fflags.proto:
var fs_arr: Array = []
prd.find_fs_index(thr.aoa, thr.freq, fs_arr)
if fs_arr.size():
for item in fs_arr:
var nmfs = prd.FS_PRD[item][1]
gos_nmfs.append(nmfs)
var fs_arr: Array = []
var th_aoa = fposmod(thr.aoa - course, 360)
prd.find_fs_index(th_aoa, thr.freq, fs_arr)
if fs_arr.size():
for item in fs_arr:
var nmfs = prd.FS_PRD[item][1]
thr.nmfs = nmfs
if (thr.proto in gos_protocols) and thr.fflags.proto and (not gos_flag):
gos_nmfs.append(nmfs)
thr.emit_state = 0
for ecm in ecms.values():
if thr.nmfs == ecm.nmfs:
set_th_emit(thr, ecm)
var ecm_active = true
if not gos_flag:
if ecm.nmfs in gos_nmfs:
interfer_off(ecm, unit_instance)
ecm_active = false
if ecm_active and (prd.fs_caps_id[ecm.nmfs] in fs_closed):
interfer_off(ecm, unit_instance)
var th_id = thr.id
for ecm_i in thrs.keys():
if thrs[ecm_i] == th_id:
var ecm = ecms[ecm_i]
ecm.params['freq'] = thr.freq
ecm.kni = thr.aoa - course
if ecm.kni < 0:
ecm.kni += 360
ecm.kni = fposmod(thr.aoa - course, 360)
call_ecm_proc(ecm)
if ecm.nmfs in gos_nmfs:
interfer_off(ecm, unit_instance)
@@ -283,23 +297,11 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> v
signaller.emit_signal('fs_update_color', ecms)
prd.update_fs_state(ecms, trenazh_mode)
for ecm in ecms.values():
var ecm_active = true
if not gos_flag:
if ecm.nmfs in gos_nmfs:
interfer_off(ecm, unit_instance)
ecm_active = false
if ecm_active and (prd.fs_caps_id[ecm.nmfs] in fs_closed):
interfer_off(ecm, unit_instance)
if not auto_enabled:
return
if auto_enabled:
for thr in threats.values():
var fs_arr: Array = []
prd.find_fs_index(thr.aoa, thr.freq, fs_arr)
var th_aoa = fposmod(thr.aoa - course, 360)
prd.find_fs_index(th_aoa, thr.freq, fs_arr)
if fs_arr.size():
var need_continue = false
for item in fs_arr:
@@ -366,22 +368,29 @@ func map_mpchf_to_seczaps(unit_instance: unit.Unit, _seczaps: Dictionary):
## Вызыватся, когда пользователь выбрал помеху и выбраны цели.
func on_interfer_create(interfer_name, sel_threats, fs_arr, power, u, ecms) -> void:
for item in sel_threats:
if auto_enabled:
var need_continue = false
for ecm in ecms.values():
if ecm.nmfs == item.nmfs:
if item.priority > ecm.priority:
interfer_off(ecm, u)
elif item.priority < ecm.priority:
need_continue = true
break
if need_continue: continue
var param: Dictionary = {}
var kni: float = item.aoa - course
if kni < 0:
kni += 360.0
var id = item.id
param['freq'] = item.freq
param['width'] = item.width
param['width'] = item.width * 1.5
if (item.rkrp != '') and item.fflags.rkrp and auto_enabled:
var krp = get_krp(item)
if krp != '':
interfer_name = krp
set_rparams(item, param)
if (param['width'] < settings.WIDTH_MIN):
param['width'] = settings.WIDTH_MIN
elif (param['width'] > settings.WIDTH_MAX):
param['width'] = settings.WIDTH_MAX
check_width(param)
interfer_create(u, interfer_name, ecms, param, kni, id, thrs, SOURCE_INTERFER[0], power)
for item in fs_arr:
@@ -390,10 +399,7 @@ func on_interfer_create(interfer_name, sel_threats, fs_arr, power, u, ecms) -> v
var id = item[3]
param['freq'] = item[1]
param['width'] = item[2]
if (param['width'] < settings.WIDTH_MIN):
param['width'] = settings.WIDTH_MIN
elif (param['width'] > settings.WIDTH_MAX):
param['width'] = settings.WIDTH_MAX
check_width(param)
interfer_create(u, interfer_name, ecms, param, kni, id, fs, SOURCE_INTERFER[1], power)
@@ -433,7 +439,7 @@ func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interf
var sz = ecms.size()
var ispp: int = 0
param['dur'] = 1.0 # Необходимо добавить параметры управления
param['period'] = 1.0 # Необходимо добавить параметры управления
param['period'] = param.get('period', PERIOD_DEFAULT)
var key = dict.find_key(id)
if source_interfer != SOURCE_INTERFER[2]:
if key != null:
@@ -454,13 +460,16 @@ func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interf
ecm = Interfer.new()
ecm.ispp = ispp
ecms[ispp] = ecm
ecm.modulation = emit_enable
ecm.kni = kni
ecm.krp = interfer_name
ecm.params = param
ecm.powp = power
ecm.source_interfer = source_interfer
ecm.modulation = emit_enable
ecm.um = param.get('um', 15.0) # Значение по умолчанию
if source_interfer == SOURCE_INTERFER[0]:
if thrs_dict.has(dict[ispp]):
ecm.priority = thrs_dict[dict[ispp]].priority
call_ecm_proc(ecm)
var set_nmfs_ok = set_nmfs(ecm)
if set_nmfs_ok != Error.OK:
@@ -477,7 +486,7 @@ func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interf
func send_ecm(ecm, unit0) -> void:
if ecm.krp != INTERFER_OFF:
if not emit_enable:
if not ecm.modulation:
ecm.svk = 0
call_deferred('emit_signal', 'interfer_update', ecm)
return
@@ -512,8 +521,10 @@ func push_id(id: int) -> void:
id_array.sort()
func on_emit_changed(state, _ecms) -> void:
func on_emit_changed(state, ecms) -> void:
emit_enable = state
for ecm in ecms.values():
ecm.modulation = state
func call_all_diap(ecm, ecm_params: Dictionary):
@@ -561,8 +572,11 @@ func on_threats_update(threat, ecms, unit_caps):
for ecm_i in thrs.keys():
if thrs[ecm_i] == th_id:
ecm = ecms[ecm_i]
ecm.priority = threat.priority
ecm.params['freq'] = threat.freq
ecm.params['width'] = threat.width
var width = threat.width * 1.5
ecm.params['width'] = width
check_width(ecm.params)
if (threat.rkrp != '') and threat.fflags.rkrp and auto_enabled:
var krp = get_krp(threat)
if krp != '':
@@ -576,58 +590,8 @@ func on_threats_update(threat, ecms, unit_caps):
if ecm.kni < 0:
ecm.kni += 360
set_nmfs(ecm)
if threat.tmod != 'fm':
if ecm != null:
send_ecm(ecm, unit_caps)
return
var th_fm_dict: Dictionary
var fs_index_arr: Array
prd.find_fs_index(threat.aoa, threat.freq, fs_index_arr)
if fs_index_arr.size() == 0:
if ecm != null:
send_ecm(ecm, unit_caps)
return
var fs_index = fs_index_arr[0]
var nmfs = prd.FS_PRD[fs_index][1]
if ecm == null:
for ecm_i in ecms.values():
if nmfs != ecm_i.nmfs: continue
if ecm_i.svk != 1: continue
ecm = ecm_i
if ecm == null: return
for th_index in thrs_dict:
if thrs_dict[th_index].tmod != 'fm': continue
fs_index_arr = []
prd.find_fs_index(thrs_dict[th_index].aoa, thrs_dict[th_index].freq, fs_index_arr)
if fs_index_arr.size() == 0: continue
if fs_index_arr[0] != fs_index: continue
th_fm_dict[th_index] = thrs_dict[th_index]
if len(th_fm_dict) > 1:
pass
send_ecm(ecm, unit_caps)
func get_freq_range(freq_range_dict: Dictionary, th_dict: Dictionary):
for key_i in th_dict:
var min_range: int = 6000
var key_min = null
for key_j in th_dict:
if key_i == key_j: continue
var width = (th_dict[key_i].width / 2) + (th_dict[key_j].width / 2)
var freq_range = abs(th_dict[key_i].freq - th_dict[key_j].freq) + width
if freq_range < min_range:
key_min = key_j
min_range = freq_range
var max_width = 0
for key in PDCHM_PARAMS['files'].keys():
if max_width < key: max_width = key
if min_range > max_width:
th_dict.erase(key_i)
continue
else:
if key_min == null: continue
freq_range_dict[key_i] = [th_dict[key_i], th_dict[key_min], min_range]
if ecm != null:
send_ecm(ecm, unit_caps)
func find_threat(freq: int, aoa: float):
@@ -649,12 +613,11 @@ func set_rparams(threat: threats.Threat, params: Dictionary):
params['freq'] = threat.rparams['freq']
else:
params['freq'] = threat.freq
if threat.rparams.has('period'):
params['period'] = threat.rparams['period']
if threat.rparams.has('width'):
params['width'] = threat.rparams['width']
params['width'] = threat.rparams['width'] * 1.5
else:
params['width'] = threat.width
params['width'] = threat.width * 1.5
check_width(params)
if threat.rparams.has('filename'):
params['filename'] = threat.rparams['filename']
@@ -677,6 +640,7 @@ func get_krp(threat: threats.Threat):
func on_interfer_off(ecm: Interfer, ecms):
var sz = ecms.size()
signaller.emit_signal('on_prog_ecm_off', ecm)
ecms.erase(ecm.ispp)
thrs.erase(ecm.ispp)
interfer.cu.erase(ecm.ispp)
@@ -712,3 +676,20 @@ func call_ecm_proc(ecm):
func on_update_fs_closed(fs_dict):
fs_closed = fs_dict
func set_th_emit(th: threats.Threat, ecm: Interfer):
var freq_min = ecm.params['freq'] - ecm.params.get('width', settings.WIDTH_MAX)/2
var freq_max = ecm.params['freq'] + ecm.params.get('width', settings.WIDTH_MAX)/2
if (th.freq >= freq_min) and (th.freq <= freq_max):
if ecm.svk == 1:
th.emit_state = 2
elif th.emit_state == 2:
return
else:
th.emit_state = 1
func check_width(param: Dictionary):
if (param['width'] < settings.WIDTH_MIN): param['width'] = settings.WIDTH_MIN
elif (param['width'] > settings.WIDTH_MAX): param['width'] = settings.WIDTH_MAX

View File

@@ -153,7 +153,6 @@ class Fs:
class PRD:
var prd_name: String ## Имя прибора
var unit_yau07 ## Юнит эмс
var unit_control: Object ## Класс проверки прибора ПРД
var fs_dic: Dictionary ## Массив блоков ФС
var yemsg_board: yemsboards.EmsBoard ## Плата ЭМС-Г
var state = PrdState.WORK
@@ -163,13 +162,11 @@ class PRD:
var set_ug_state: bool = true ## Необходимо ли записать в УГ настройки
signal update_serviceability()
func _init(u_name, u_yau07, u_control: Object):
func _init(u_name, u_yau07):
prd_name = u_name
unit_yau07 = u_yau07
unit_control = u_control
init_ems_g()
func init_ems_g():
var in_tbl: Array = []
var out_tbl: Array = []
@@ -284,10 +281,7 @@ func _ready() -> void:
check_dir()
for prd_name in PRD_NAMES:
var unit_prd = network.get_unit_instance(prd_name)
var control_pribor_prd = preload('res://scripts/pribor-prd.gd')
var unit_control = control_pribor_prd.TestPRD.new({'unit_prd': unit_prd})
add_child(unit_control)
var new_prd = PRD.new(prd_name, unit_prd, unit_control)
var new_prd = PRD.new(prd_name, unit_prd)
prd_dict[prd_name] = new_prd
for key in FS_PRD.keys():
var fs = Fs.new(key, FS_PRD[key][0])

View File

@@ -1,149 +1,4 @@
class TestPRD extends Node:
const DEVICE_CONSTANT: Dictionary = {
'PRD_N': {
CONSTANTS = {
'POWER_UKP_1': 31,
'POWER_UKP_2': 63,
'DKM_BIT_2': 1,
'DKM_BIT_3': 2,
'BASE_ADDR_EMS_G': 0x120,
'ADDR_UG_LITERA_1': 0x106,
'ADDR_UG_LITERA_2': 0x108,
'ADDR_UG_LITERA_3': 0x10A,
'TEMP_THRESHOLD': 70,
'POWER_THRESHOLD': 40,
'RAY_DOU_NUM': 0x3,
'ATT_UM_2': 0x2,
'ATT_UM_3': 0x3,
'POWER_UM': 100,
'TIMER_DELAY': 10.0,
'STATE_MASHINE_TIMER': 0.3,
},
PRIBOR_CONFIG = {
'': {'angle': 0.0, 'sectors': [4, 8]},
'': {'angle': 90.0, 'sectors': [7, 11]},
'': {'angle': 180.0, 'sectors': [6, 10]},
'': {'angle': 270.0, 'sectors': [5, 9]},
},
FS_PARAMS = {
2: {'freq': 932.0, 'width': 100.0},
3: {'freq': 1157.0, 'width': 100.0}
},
START_LITERA = 2
},
'PRD_V': {
CONSTANTS = {
'POWER_UKP_1': 31,
'POWER_UKP_2': 63,
'DKM_BIT_4': 3,
'DKM_BIT_5': 4,
'BASE_ADDR_EMS_G': 0x120,
'ADDR_UG_LITERA_1': 0x106,
'ADDR_UG_LITERA_2': 0x108,
'ADDR_UG_LITERA_3': 0x10A,
'TEMP_THRESHOLD': 70,
'POWER_THRESHOLD': 40,
'RAY_DOU_NUM': 0x3,
'ATT_UM_4': 0x2,
'ATT_UM_5': 0x3,
'POWER_UM': 100,
'TIMER_DELAY': 10.0,
'STATE_MASHINE_TIMER': 0.3,
},
PRIBOR_CONFIG = {
'': {'angle': 0.0, 'sectors': [12, 16]},
'': {'angle': 90.0, 'sectors': [15, 19]},
'': {'angle': 180.0, 'sectors': [14, 18]},
'': {'angle': 270.0, 'sectors': [13, 17]},
},
FS_PARAMS = {
4: {'freq': 1227.0, 'width': 100.0},
5: {'freq': 1575.0, 'width': 110.0},
},
START_LITERA = 4
},
'PRD_K': {
CONSTANTS = {
'POWER_UKP_1': 31,
'POWER_UKP_2': 63,
'DKM_BIT_1': 0,
'DKM_BIT_6': 5,
'DKM_BIT_7': 6,
'BASE_ADDR_EMS_G': 0x120,
'ADDR_UG_LITERA_1': 0x106,
'ADDR_UG_LITERA_2': 0x108,
'ADDR_UG_LITERA_3': 0x10A,
'TEMP_THRESHOLD': 40,
'POWER_THRESHOLD': 40,
'RAY_DOU_NUM': 0x3,
'ATT_UM_1': 0x0,
'ATT_UM_6': 0x3,
'ATT_UM_7': 0x2,
'POWER_UM': 100,
'TIMER_DELAY': 10.0,
'STATE_MASHINE_TIMER': 0.3,
},
PRIBOR_CONFIG = { # Конфигурация параметров для каждого прибора
'': {'angle': 0.0, 'sectors': [0, 20, 24]},
'': {'angle': 90.0, 'sectors': [3, 23, 27]},
'': {'angle': 180.0, 'sectors': [2, 22, 26]},
'': {'angle': 270.0, 'sectors': [1, 21, 25]},
},
FS_PARAMS = { # Конфигурация частот и ширин для каждого ФС
1: {'freq': 450.0, 'width': 80.0},
6: {'freq': 2450.0, 'width': 110.0},
7: {'freq': 4750.0, 'width': 110.0}
},
START_LITERA = 1
}
}
var block_ip_config_n:= {
'maa2000_1': [0, false],
'maa2000_2': [1, false],
'ip9_50_1': [2, false],
'ip9_50_2': [3, false],
'ip12_50_1': [4, false],
'ip5_25': [7, false],
}
var block_kasseta_y5_prd_config_n: = {
'yau07': false,
'ems': false,
'ug': false,
'ukp1': false,
'ukp2': false,
}
# Результаты контроля
var control_results_n: Dictionary = {
'block_ip': false, # Проверка касет П1 и ИП МА2000
'temperature': true, # Проверка температур УМ
'dkm_2': false,
'dkm_3': false,
'dou_2': false,
'dou_3': false,
'fs_2': 2,
'fs_3': 2,
}
####
var block_ip_config_v := {
'maa2000_1': [0, false],
'maa2000_2': [1, false],
'ip9_50_1': [2, false],
'ip9_50_2': [3, false],
'ip12_50_1': [4, false],
'ip5_25': [7, false],
}
var block_kasseta_y5_prd_config_v: = {
'yau07': false,
'ems': false,
'ug': false,
'ukp1': false,
'ukp2': false,
}
####
const RAY_m5:= 'RAY_m5'
const RAY_5:= 'RAY_5'
const RAY_15:= 'RAY_15'
@@ -164,7 +19,7 @@ class TestPRD extends Node:
TEMPERATURE_UKP_2 = 79,
}
enum STATE_MACHINE {
enum STATE_MASHINE {
INIT,
FS_TURN_ON,
FS_WORK,
@@ -217,7 +72,7 @@ class TestPRD extends Node:
var block_kasseta_y5_config: Dictionary
var control_results: Dictionary
var self_name: String
var state: int = STATE_MACHINE.INIT
var state: int = STATE_MASHINE.INIT
var current_litera: int
var flag_write_isa: bool = false
var flag_fs_status_ok: bool = false
@@ -226,32 +81,31 @@ class TestPRD extends Node:
var unit_prd: Object
var module_prd: Object
var power_amplify: Array
#var control_label: Label
var control_label: Label
var control_timer: Timer = Timer.new()
var ems_6666_timer: Timer = Timer.new()
var machine_timer: Timer = Timer.new()
signal control_is_over(control_results: Dictionary, power_result: Dictionary)
signal update_progress(progress_value: float)
signal update_max_value_progress(max_progress_value: int)
var cc: int = 0
var progress_value: float:
set(v):
if progress_value != v:
progress_value = v
call_deferred('emit_signal', 'update_progress', v)
signal control_is_over(control_results, power_result)
var ecms: Dictionary ## Словарь помеховых воздействий
## Инициализация аргуметнов
func _init(init_data: Dictionary) -> void:
control_label = init_data['control_label']
power_amplify = init_data['power_amplifiers']
unit_prd = init_data['unit_prd']
module_prd = init_data['module_prd']
constants = init_data['constants']
pribor_config = init_data['prd_config']
fs_parameters = init_data['fs_params']
block_ip_config = init_data['block_ip_prd_config']
block_kasseta_y5_config = init_data['block_kasseta_y5_prd_config']
control_results = init_data['control_results']
current_litera = init_data['current_litera']
func _ready() -> void:
initialize_connections()
_determine_self_name()
setup_timer()
@@ -303,117 +157,112 @@ class TestPRD extends Node:
fs_result = on_fs_state(packet_type_7, fs_mapping, fs_result)
control_results[fs_key] = fs_result[fs_key]
flag_fs_status_ok = control_results[fs_key] == 1
##
func state_control_machine() -> void:
match state:
STATE_MACHINE.INIT:
STATE_MASHINE.INIT:
_handle_init_state()
STATE_MACHINE.FS_TURN_ON:
STATE_MASHINE.FS_TURN_ON:
_handle_fs_turn_on_state()
state = STATE_MACHINE.FS_WORK
STATE_MACHINE.FS_WORK:
for key in ecms.keys():
pass
#print([fs_parameters, current_litera])
#print('ecms: %s %s' % [ecms[key].kni, ecms[key].params.freq])
state = STATE_MASHINE.FS_WORK
STATE_MASHINE.FS_WORK:
if ecms.size() and flag_fs_status_ok:
ems_6666_timer.start()
_handle_fs_work_state()
STATE_MACHINE.CHEK_KASSETA_Y5:
STATE_MASHINE.CHEK_KASSETA_Y5:
if block_kasseta_y5_config['yau07']:
state = STATE_MACHINE.WRITE_ISA
STATE_MACHINE.WRITE_ISA:
state = STATE_MASHINE.WRITE_ISA
STATE_MASHINE.WRITE_ISA:
if not flag_write_isa:
_handle_ug_set_state(0x6)
state = STATE_MACHINE.READ_ISA
STATE_MACHINE.READ_ISA:
state = STATE_MASHINE.READ_ISA
STATE_MASHINE.READ_ISA:
if (unit_prd.cmd_state == unit_prd.CmdState.DONE) or (unit_prd.cmd_state == unit_prd.CmdState.FAIL):
_handle_read_isa(module_prd, unit_prd, [constants.ADDR_UG_LITERA_1, constants.ADDR_UG_LITERA_2, constants.ADDR_UG_LITERA_3])
flag_write_isa = false
state = STATE_MACHINE.UG_SET_RAY
STATE_MACHINE.UG_SET_RAY:
state = STATE_MASHINE.UG_SET_RAY
STATE_MASHINE.UG_SET_RAY:
var addr: int = constants.ADDR_UG_LITERA_1
if current_litera == 3 or current_litera == 5 or current_litera == 7:
addr = constants.ADDR_UG_LITERA_2
if unit_prd.isa_ports.has(addr) and (unit_prd.cmd_state == unit_prd.CmdState.DONE):
if unit_prd.isa_ports[addr] & 0x07 == 0:
state = STATE_MACHINE.UG_SET_RAY_1
state = STATE_MASHINE.UG_SET_RAY_1
elif unit_prd.isa_ports[addr] & 0x07 == 1:
state = STATE_MACHINE.UG_SET_RAY_2
state = STATE_MASHINE.UG_SET_RAY_2
elif unit_prd.isa_ports[addr] & 0x07 == 2:
state = STATE_MACHINE.UG_SET_RAY_3
state = STATE_MASHINE.UG_SET_RAY_3
elif unit_prd.isa_ports[addr] & 0x07 == 3:
state = STATE_MACHINE.UG_SET_RAY_4
state = STATE_MASHINE.UG_SET_RAY_4
elif unit_prd.isa_ports[addr] & 0x07 == 4:
state = STATE_MACHINE.UG_SET_RAY_5
state = STATE_MASHINE.UG_SET_RAY_5
elif unit_prd.isa_ports[addr] & 0x07 == 5:
if not current_litera == 1:
control_results = check_dou_result(control_results, power_result, self_name, current_litera, constants)
state = STATE_MACHINE.IN_EMS_STOP
state = STATE_MASHINE.IN_EMS_STOP
elif unit_prd.isa_ports[addr] & 0x07 == 6:
state = STATE_MACHINE.UG_SET_RAY_0
state = STATE_MASHINE.UG_SET_RAY_0
STATE_MACHINE.UG_SET_RAY_0:
STATE_MASHINE.UG_SET_RAY_0:
if flag_si_fs_input and not flag_write_isa:
control_timer.stop()
_handle_ug_set_state(0x0)
await get_tree().create_timer(0.5).timeout
state = STATE_MACHINE.READ_ISA
STATE_MACHINE.UG_SET_RAY_1:
state = STATE_MASHINE.READ_ISA
STATE_MASHINE.UG_SET_RAY_1:
if not flag_write_isa:
_handle_ug_set_state(0x1)
state = STATE_MACHINE.READ_ISA
STATE_MACHINE.UG_SET_RAY_2:
state = STATE_MASHINE.READ_ISA
STATE_MASHINE.UG_SET_RAY_2:
if not flag_write_isa:
_handle_ug_set_state(0x2)
state = STATE_MACHINE.READ_ISA
STATE_MACHINE.UG_SET_RAY_3:
state = STATE_MASHINE.READ_ISA
STATE_MASHINE.UG_SET_RAY_3:
if not flag_write_isa:
_handle_ug_set_state(0x3)
state = STATE_MACHINE.READ_ISA
STATE_MACHINE.UG_SET_RAY_4:
state = STATE_MASHINE.READ_ISA
STATE_MASHINE.UG_SET_RAY_4:
if not flag_write_isa:
_handle_ug_set_state(0x4)
state = STATE_MACHINE.READ_ISA
STATE_MACHINE.UG_SET_RAY_5:
state = STATE_MASHINE.READ_ISA
STATE_MASHINE.UG_SET_RAY_5:
if not flag_write_isa:
_handle_ug_set_state(0x5)
state = STATE_MACHINE.READ_ISA
STATE_MACHINE.IN_EMS_STOP:
state = STATE_MASHINE.READ_ISA
STATE_MASHINE.IN_EMS_STOP:
ems_6666_timer.stop()
state = STATE_MACHINE.FS_TURN_OFF
STATE_MACHINE.FS_TURN_OFF:
state = STATE_MASHINE.FS_TURN_OFF
STATE_MASHINE.FS_TURN_OFF:
ems_6666_timer.stop()
_handle_fs_turn_off_state()
state = STATE_MACHINE.STOP_CONTROL
STATE_MACHINE.STOP_CONTROL:
state = STATE_MASHINE.STOP_CONTROL
STATE_MASHINE.STOP_CONTROL:
_handle_stop_control_state()
## В машине состояний вызов изменения состояния контроля
progressbar_status()
## 'Выполняется инициализация ФС-%s' % current_litera
func _handle_init_state() -> void:
control_label.text = 'Выполняется инициализация ФС-%s' % current_litera
if current_litera in [1, 2, 3, 4, 5, 6, 7]:
if not ecms.size():
state = STATE_MACHINE.FS_TURN_ON
state = STATE_MASHINE.FS_TURN_ON
else:
control_results = on_control_result(block_ip_config, control_results)
var send_power_pack = prep_power(power_result, self_name)
emit_signal('control_is_over', control_results, send_power_pack)
machine_timer.stop()
state = STATE_MASHINE.AWAIT
##'Выполняется включение ФС-%s' % current_litera
func _handle_fs_turn_on_state() -> void:
control_label.text = 'Выполняется включение ФС-%s' % current_litera
manage_fs(true, self_name, pribor_config, fs_parameters, current_litera, constants.POWER_UM)
control_timer.wait_time = constants.TIMER_DELAY
control_timer.start()
##'Выполняется проверка ФС-%s' % current_litera
func _handle_fs_work_state() -> void:
control_label.text = 'Выполняется проверка ФС-%s' % current_litera
if (current_litera == 2 and control_results.fs_2) or \
(current_litera == 3 and control_results.fs_3) or \
(current_litera == 4 and control_results.fs_4) or \
@@ -421,7 +270,7 @@ class TestPRD extends Node:
(current_litera == 6 and control_results.fs_6) or \
(current_litera == 7 and control_results.fs_7) or \
(current_litera == 1 and control_results.fs_1):
state = STATE_MACHINE.CHEK_KASSETA_Y5
state = STATE_MASHINE.CHEK_KASSETA_Y5
func _handle_ug_set_state(RAY_DOU_NUM: int) -> void:
@@ -444,41 +293,28 @@ class TestPRD extends Node:
dic_att['ATT_UM_1'] = constants.ATT_UM_2
dic_att['ATT_UM_2'] = constants.ATT_UM_3
##var log_text = dic_att.ATT_UM_3 if current_litera == 1 else dic_att.ATT_UM_1 if current_litera in [2, 4, 6] else dic_att.ATT_UM_2
## 'Выполняется настройка угла (%s) и атт (0x0%s)' % [dic_att.RAY_DOU_NUM, log_text]
var log_text = dic_att.ATT_UM_3 if current_litera == 1 else dic_att.ATT_UM_1 if current_litera in [2, 4, 6] else dic_att.ATT_UM_2
control_label.text = 'Выполняется настройка угла (%s) и атт (0x0%s)' % [
dic_att.RAY_DOU_NUM,
log_text
]
flag_write_isa = on_ug_setting(module_prd, unit_prd, dic_att)
## Таймер отправки команды в ЭМС-Г для модуляции
func _on_ems_6666_timer() -> void:
module_prd.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [constants.BASE_ADDR_EMS_G, 6666]])
## Таймер вызова машины состояний
func on_state_mashine():
state_control_machine()
func progressbar_status() -> void:
match state:
STATE_MACHINE.INIT:
cc += 10 if current_litera in [3, 5, 6, 7] else 0
if control_timer.get_time_left() > 0:
progress_value = cc + control_timer.get_wait_time() - control_timer.get_time_left()
if current_litera == 0:
progress_value = 0
##'Выполняется отключение ФС-%s' % current_litera
func _handle_fs_turn_off_state() -> void:
control_label.text = 'Выполняется отключение ФС-%s' % current_litera
flag_fs_status_ok = false
manage_fs(false, self_name, pribor_config, fs_parameters, current_litera, constants.POWER_UM)
##'Выполняется завершение проверки ФС-%s' % current_litera
func _handle_stop_control_state() -> void:
control_label.text = 'Выполняется завершение проверки ФС-%s' % current_litera
_advance_to_next_fs()
state = STATE_MACHINE.INIT
state = STATE_MASHINE.INIT
func _advance_to_next_fs() -> void:
@@ -494,74 +330,33 @@ class TestPRD extends Node:
######################################
func initialize_connections() -> void:
_determine_self_name()
var fs_mapping = _create_fs_mapping(self_name)
signaller.conn(signaller.fs_update_state, Callable(self, 'on_fs_update_state').bind(fs_mapping))
signaller.conn(signaller.start_contol_device, Callable(self, '_on_start_contol_device'))
interfer.connect('interfer_resized', Callable(self, 'on_interfer_resized'))
unit_prd.connect('data_received', Callable(self, 'on_data_received'))
func on_interfer_resized(ecms_dic: Dictionary) -> void:
ecms = ecms_dic
func _on_start_contol_device()-> void:
_determine_self_name()
machine_timer.wait_time = constants.STATE_MASHINE_TIMER
machine_timer.start()
func _determine_self_name() -> void:
cc = 0
state = STATE_MACHINE.INIT
var current_unit = unit_prd.name
var parts = current_unit.split('-')
self_name = parts[-1]
if self_name == '' or self_name == '' or self_name == '' or self_name == '':
progress_value = 0
call_deferred('emit_signal', 'update_max_value_progress', 20)
constants = DEVICE_CONSTANT.PRD_N.CONSTANTS
pribor_config = DEVICE_CONSTANT.PRD_N.PRIBOR_CONFIG
fs_parameters = DEVICE_CONSTANT.PRD_N.FS_PARAMS
block_ip_config = block_ip_config_n
block_kasseta_y5_config = block_kasseta_y5_prd_config_n
control_results = control_results_n
current_litera = DEVICE_CONSTANT.PRD_N.START_LITERA
if self_name == '' or self_name == '' or self_name == '' or self_name == '':
progress_value = 0
call_deferred('emit_signal', 'update_max_value_progress', 20)
constants = DEVICE_CONSTANT.PRD_V.CONSTANTS
pribor_config = DEVICE_CONSTANT.PRD_V.PRIBOR_CONFIG
fs_parameters = DEVICE_CONSTANT.PRD_V.FS_PARAMS
block_ip_config = block_ip_config_n
block_kasseta_y5_config = block_kasseta_y5_prd_config_v
control_results = control_results_n
current_litera = DEVICE_CONSTANT.PRD_V.START_LITERA
if self_name == '' or self_name == '' or self_name == '' or self_name == '':
progress_value = 0
call_deferred('emit_signal', 'update_max_value_progress', 30)
constants = DEVICE_CONSTANT.PRD_K.CONSTANTS
pribor_config = DEVICE_CONSTANT.PRD_K.PRIBOR_CONFIG
fs_parameters = DEVICE_CONSTANT.PRD_K.FS_PARAMS
block_ip_config = block_ip_config_n
block_kasseta_y5_config = block_kasseta_y5_prd_config_n
control_results = control_results_n
current_litera = DEVICE_CONSTANT.PRD_K.START_LITERA
func setup_timer() -> void:
add_child(control_timer)
control_timer.timeout.connect(on_stop_control)
control_timer.one_shot = true
control_timer.wait_time = constants.TIMER_DELAY
control_timer.wait_time = 15.0
control_timer.start()
add_child(ems_6666_timer)
ems_6666_timer.timeout.connect(_on_ems_6666_timer)
ems_6666_timer.wait_time = 1.0
add_child(machine_timer)
machine_timer.connect('timeout', Callable(self, 'on_state_mashine'))
func _process_dkm_status(status: PackedByteArray) -> void:
@@ -610,18 +405,18 @@ class TestPRD extends Node:
static func _get_ray_key(machine_state: int) -> String:
match machine_state:
STATE_MACHINE.UG_SET_RAY_0: return RAY_m5
STATE_MACHINE.UG_SET_RAY_1: return RAY_5
STATE_MACHINE.UG_SET_RAY_2: return RAY_15
STATE_MACHINE.UG_SET_RAY_3: return RAY_25
STATE_MACHINE.UG_SET_RAY_4: return RAY_35
STATE_MACHINE.UG_SET_RAY_5: return RAY_45
STATE_MASHINE.UG_SET_RAY_0: return RAY_m5
STATE_MASHINE.UG_SET_RAY_1: return RAY_5
STATE_MASHINE.UG_SET_RAY_2: return RAY_15
STATE_MASHINE.UG_SET_RAY_3: return RAY_25
STATE_MASHINE.UG_SET_RAY_4: return RAY_35
STATE_MASHINE.UG_SET_RAY_5: return RAY_45
_: return ''
func on_stop_control() -> void:
_handle_fs_turn_off_state()
state = STATE_MACHINE.FS_TURN_OFF
state = STATE_MASHINE.FS_TURN_OFF
static func on_control_result(ip_config: Dictionary, ctrl_results: Dictionary) -> Dictionary:
@@ -741,7 +536,6 @@ class TestPRD extends Node:
all_temp_is_ok = false
return all_temp_is_ok
## Проверка ДКМ
static func check_dkm(status_prd: PackedByteArray, bit_dkm: int) -> bool:
var dkm: int = 28

View File

@@ -51,7 +51,7 @@ var UnitProfiles: Dictionary[StringName, Array] = { \
const FREQ_MAX: = 6000.0
const FREQ_MIN: = 400.0
const WIDTH_MAX: = 120.0
const WIDTH_MIN: = 0.0
const WIDTH_MIN: = 5.0
const DUR_MAX: = 1000000.0
const PERIOD_MAX: = 1000000.0
const UM_MIN: = -5.0

View File

@@ -216,5 +216,6 @@ signal sector_klaster (new_sector_data)
signal clear_klaster ()
## Вызывается при нажатии на кнопку "Запуск контроля".[br]
signal start_contol_device()
## Вызывается при программном отключении помехи.[br]
## [param ecm] - выключаемая помеха ([b]true[/b]
signal on_prog_ecm_off(ecm: interfer.Interfer)

View File

@@ -28,6 +28,9 @@ class Threat:
var width: float ## Ширина занимаемого диапазона частот, МГц.
var selected: bool ## Флаг, что цель выбрана.
var auto_selected: bool = false ## Флаг автомата для целей
var emit_state: int = 0 ## 0 - подавление не назначено, 1 - назначено, 2 - выполняется
var nmfs: int ## Индекс модуля ФС, в зону действия которого попала цель
var priority: int ## Приоритет опасности цели
func _init(): clear_fflags()
func _to_string() -> String: return 'номер: %d пеленг: %0.1f частота: %0.1f МГц' % [id, aoa, freq]
@@ -140,6 +143,10 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb, threats: Dictionary):
th.clear_fflags()
th.set_from_dic(dic_th)
th.tick_rx = unit.tick
if th.fflags.proto and th.proto != '':
th.priority = 1
else:
th.priority = 0
call_deferred('emit_signal', 'threat_update', th)
else:
var th: = Threat.new()

View File

@@ -4,6 +4,7 @@
"Адрес БПО левого борта": "http://172.22.246.13:8081/selftest?presetType=bpo&400000000",
"Адрес БПО правого борта": "http://172.22.246.11:8082/selftest?presetType=bpo&400000000",
"Виртуальная клавиатура": false,
"Включить работу по своим целям": true,
"Внешнее указание Трасса": false,
"Внешнее управление": false,
"Кнопка «JTIDS»": false,
@@ -26,29 +27,31 @@
"Период опроса состояния АФСП, секунды": "30",
"Период опроса состояния БПО, секунды": "30",
"Скрыть вкладку ЭМС 2": true,
"Список своих протоколов": "j11",
"Схема прибора. Белый цвет": [1.0, 1.0, 1.0],
"Схема прибора. Чёрный цвет": [0.0, 0.0, 0.0],
"Текущая версия ПО УАРЭП": "master b2633d8 Thu Sep 11 16:26:39 2025 +0300",
"Шаблон адреса сервера карт": "http://10.1.1.2:8001/osm_tiles/{z}/{x}/{y}.png",
"Шаблон адреса сервера карт": "http://169.254.27.71:8001/osm_tiles/{z}/{x}/{y}.png",
"навигация": [
"*",
60000,
true,
true
],
"уареп-трасса": "127.0.0.1,127.0.0.1,50200,10004",
"уарэп-5п28": [
"127.0.0.1",
50777
],
"уарэп-капсрпб": [
"192.168.11.102",
"192.168.11.105",
"127.0.0.1",
"127.0.0.1",
42023,
42022,
false,
true
],
"уарэп-спт25-1": [
"/home/user/tty0",
"/home/sasha/dev/tty0",
0,
19200,
"N",
@@ -56,15 +59,23 @@
1
],
"уарэп-спт25-2": [
"/home/user/tty1",
"/home/sasha/dev/tty4",
0,
19200,
"N",
8,
1
],
"уарэп-трасса": [
"127.0.0.1",
"127.0.0.1",
50200,
10004,
false,
true
],
"уарэп-щ3": [
"/home/user/tty3",
"/home/sasha/dev/tty2",
7,
19200,
"N",

View File

@@ -7,6 +7,9 @@ code = "shader_type canvas_item;
#define RADIUS_INNER_0 200.0 /* Радиус внутренний для режима приоритет РТО */
#define RADIUS_INNER_1 480.0 /* Радиус внутренний для режима приоритет РЛС */
#define ANTENAS_COUNT 28 /* Количество антенн */
#define ANT_BAND_READY 1U /* Антенна (модуль ФС) готова или исправна */
#define ANT_BAND_FAILED 0U /* Антенна (модуль ФС) не исправно */
uniform vec2 pc0 = vec2(560, 560); /* Центр сетки антенн */
uniform float rotation: hint_range(0.0, 360.0) = 0.0; /* */
@@ -14,9 +17,13 @@ uniform vec4 color0: source_color = vec4(0.38, 0.47, 0.51, 0.4);
uniform vec4 color1: source_color = vec4(0.39, 0.44, 0.50, 0.4);
uniform float radius_inner_0 = RADIUS_INNER_0;
uniform float radius_inner_1 = RADIUS_INNER_1;
uniform float radius_outter = 550.0; /* Радиус внешний. Должно быть равно ant_band_r1_6 */
uniform float radius_outter = 550.0; /* Радиус внешний. Должно быть равно ant_band_r1_6 */
uniform float alpha: hint_range(0.0, 1.0) = 0.5;
uniform int mode = 0; /* Режим отображения. Приоритет РТО - 0, приоритет РЛС - 1 */
uniform int mode = 0; /* Режим отображения. Приоритет РТО - 0, приоритет РЛС - 1 */
uniform float ffr: hint_range(0.0, 1.0) = 0.2; /* Индикация неисправности модулей ФС. Заметность штриховки. */
uniform float sfr: hint_range(0.0, 10.0) = 0.0; /* Индикация неисправности модулей ФС. Скорость движения штрховки */
uniform float afr: hint_range(0.0, 180.0) = 0.0; /* Индикация неисправности модулей ФС. Наклон штрховки */
uniform float pfr: hint_range(1.0, 20.0) = 10.0; /* Индикация неисправности модулей ФС. Частота штриховки */
const int ant_band_count_0 = 2;
const int ant_band_count_1 = 2;
@@ -42,7 +49,8 @@ const float ant_band_r1_4[] = {450.0, 530.0};
const float ant_band_r1_5[] = {500.0, 540.0};
const float ant_band_r1_6[] = {550.0, 550.0};
uniform vec4 ant_band_c[28];
uniform vec4 ant_band_c[ANTENAS_COUNT];
uniform uint ant_band_m[ANTENAS_COUNT];
const float d4 = 90.0;
const float ds = 1.0;
@@ -79,6 +87,12 @@ void antenas(inout vec4 c, vec2 uv, vec2 p0, int cnt, float r0, float r1, inout
col.rgb = ant_band_c[j].rgb;
index++;
col.a = alpha + (random_timed(uv) - 0.5f) * ant_band_c[j].a;
if (ant_band_m[j] == ANT_BAND_FAILED)
{
vec2 uvr = uv;
rotate_vec2(uvr, radians(afr), pc0);
col.a *= (1.0 - ffr) + tanh(10.0 * sin(TIME * sfr + 2.0 * PI * uvr.x / pfr)) * ffr;
}
float v = float(i & 1);
vec4 color = v * col + (1.0f - v) * col;
sector(c, uv, p0, float(i) * da, da, r0, r1, color);
@@ -120,4 +134,9 @@ shader_parameter/radius_inner_1 = 480.0
shader_parameter/radius_outter = 550.0
shader_parameter/alpha = 0.5
shader_parameter/mode = 0
shader_parameter/ffr = 0.2
shader_parameter/sfr = 0.0
shader_parameter/afr = 0.0
shader_parameter/pfr = 10.0
shader_parameter/ant_band_c = PackedVector4Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
shader_parameter/ant_band_m = PackedInt32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)

View File

@@ -326,7 +326,9 @@ func _set_row_selected(i_row: int, selected: bool = true) -> void:
var selector = nodes[selector_key]
nodes.erase(selector_key)
if is_instance_valid(selector):
node.remove_child(selector)
var prnt = selector.get_parent_control()
if prnt:
prnt.remove_child(selector)
selector.queue_free()
else:
push_warning('обращение к удалённому элементу \"%s\"' % selector_key)