Compare commits

...

46 Commits

Author SHA1 Message Date
lepshiy
12628c37fb Merge branch 'refs/heads/master' into sasha
# Conflicts:
#	project.godot
#	scenes/frame-ecm-list/scroll-ecm-list.gd
#	scenes/работа/работа.gd
#	scripts/signaller.gd
#	scripts/threats.gd
2025-11-14 14:15:33 +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
lepshiy
5a7c719c56 Анимация кнопки "Запуск контроля". Доделать. 2025-11-12 16:36:05 +03:00
lepshiy
8754dcc7f0 Line separators - LF 2025-11-12 16:35:27 +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
kira-a-k
3ac243f420 Merge branch 'refs/heads/govno_style'
# Conflicts:
#	scenes/tabs-switch/tab-switch.tscn
#	scenes/эмс2/эмс_тг.gd
2025-11-09 23:31:41 +03:00
kira-a-k
e7440a7eae Line separator - LF 2025-11-09 23:24:01 +03:00
kira-a-k
a886024662 Возврат видимости сцены и прогресса 2025-11-09 23:07:51 +03:00
kira-a-k
c6219254ed Положение приборов по сетке 2025-11-09 22:15:31 +03:00
TotMaxim
2d4fd57789 lineseparators 2025-11-09 22:14:58 +03:00
kira-a-k
fe7ef9a699 Merge remote-tracking branch 'refs/remotes/kotik/prd-control'
# Conflicts:
#	scenes/tabs-switch/tab-switch.tscn
#	scenes/контроль/кнопка-прибора.gd
2025-11-09 20:44:11 +03:00
TotMaxim
71176c4869 Забрал изменения по выбору приборов + отредактировал положение индикаторов внешнее управление, состояния и тренажа 2025-11-09 16:18:31 +03:00
TotMaxim
36e47bbd13 Глобальное изменение: Параллеьный контроль. Новая ветка prd-control. Первый коммит инициализации. 2025-11-09 15:45:22 +03:00
kira-a-k
f3ee8965c0 Доработка контроля - выделение и выбор прибора по стрелкам 2025-11-08 16:54:29 +03:00
kira-a-k
9daae7b6b9 zalupa1 2025-11-08 13:37:26 +03:00
kira-a-k
f002e9125e zalupa 2025-11-08 13:31:48 +03:00
MaD_CaT
cebf645e4d Godot4. Исправление сепараторов на LF 2025-11-08 12:18:38 +03:00
MaD_CaT
77e15627d0 Доработка. Подсчёт опасных целей 1 раз в секунду. 2025-11-06 12:41:46 +03:00
MaD_CaT
effbbb9272 Доработка. Изменение кодов состояния выполнения помехи для 5П-28 2025-11-05 12:28:33 +03:00
MaD_CaT
56343338c2 Доработка. Добавлено отображение информации от Трассы на экране ЭМС ТГ. 2025-11-05 11:22:49 +03:00
sasha80
3bff1cd90f Доработка. Статическая проверка 2025-11-04 15:33:24 +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
31 changed files with 1323 additions and 823 deletions

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

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

@@ -1,131 +1,31 @@
@tool
extends 'res://scenes/контроль/прибор.gd'
const constants_k: Dictionary = {
'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,
}
# Конфигурация параметров для каждого прибора
const 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]},
}
# Конфигурация частот и ширин для каждого ФС
const FS_PARAMS := {
1: {'freq': 450.0, 'width': 80.0},
6: {'freq': 2450.0, 'width': 110.0},
7: {'freq': 4750.0, 'width': 110.0}
}
enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 }
var block_ip_config_k := {
'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],
}
var block_kasseta_y5_prd_config_k: = {
'yau07': false,
'ems': false,
'ug': false,
'ukp1': false,
'ukp2': false,
}
# Основные переменные
var start_litera: int = 1
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 unit_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 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
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
for temp in power_amplifier:
temp.value1 = -70
unit_prd_k.connect('control_is_over', Callable(self, 'on_press_device'))
on_press_device()
initialize_connections()
setup_timer()
func start_control() -> void:
set_default_state()
find_labels(self)
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 setup_timer() -> void:
add_child(mashine_timer)
mashine_timer.connect('timeout', Callable(self, 'on_state_mashine'))
mashine_timer.wait_time = constants_k.STATE_MASHINE_TIMER
mashine_timer.start()
func set_default_state() -> void:
for group in get_tree().get_nodes_in_group('default_reset'):
group.state = STATE_VAL.NONE
@@ -137,44 +37,21 @@ func set_default_state() -> void:
func _enter_tree() -> void:
if Engine.is_editor_hint():
return
$control_result.text = 'Выполняется ...'
$control_result.text = 'Ожидается запуск контроля ...' # TODO: Необходимо сделать пулл сообщений
$control_result.add_theme_color_override('font_color', Color.ALICE_BLUE)
signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false))
signaller.connect('режим_журнал', Callable(self, 'on_mode_changed').bind(false))
signaller.connect('режим_эмс', Callable(self, 'on_mode_changed').bind(false))
signaller.connect('режим_настройки', Callable(self, 'on_mode_changed').bind(false))
signaller.connect('режим_контроль', Callable(self, 'on_mode_changed').bind(true))
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:
if not unit_pribor.online:
set_default_state()
func on_mode_changed(in_tree: bool) -> void:
if not in_tree:
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:
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:
#if not control_prd_k.block_kasseta_y5_config.yau07 or not control_prd_k.block_kasseta_y5_config.ukp1 or not control_prd_k.block_kasseta_y5_config.ukp2:
#return
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
static func power_fill(pow_dic: Dictionary, fs_result: Dictionary, power_amplifier: Array, POWER_THRESHOLD: int) -> void:
for i_powapm in power_amplifier:
var powamp_meta: String = i_powapm.get_meta('um')
var status = STATE_VAL.GOOD if pow_dic else STATE_VAL.NONE
if not pow_dic.has(powamp_meta): return
if pow_dic:
if not pow_dic.has(powamp_meta):
break
@@ -186,15 +63,45 @@ func power_fill(pow_dic: Dictionary, fs_result: Dictionary) -> void:
if powamp_meta in ['um_8', 'um_9', 'um_10', 'um_11', 'um_12', 'um_13'] and not fs_result.fs_7: return
i_powapm.value0 = pow_dic[powamp_meta]
for i_p in pow_dic[powamp_meta]:
if i_p < constants_k.POWER_THRESHOLD:
if i_p < POWER_THRESHOLD:
status = STATE_VAL.ERROR
i_powapm.state = status
func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void:
mashine_timer.stop()
block_kasseta_y5_prd_config_k = control_prd_k.block_kasseta_y5_config
func on_press_device() -> void:
var nodes_y5: Array = get_tree().get_nodes_in_group('y-5')
var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply')
var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group')
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
var module_fs_1: Node = $kasseta_fs_kd/ref_A2
var module_fs_6: Node = $kasseta_fs_kd/ref_A4
var dou_6: Node = $dou6_A7
var module_fs_7: Node = $kasseta_fs_kd/ref_A7
var dou_7: Node = $dou7_A8
var for_control_result: Dictionary = {
'result_dic': unit_prd_k.control_results,
'power_dic': unit_prd_k.power_result,
'block_kasseta_y5_config': unit_prd_k.block_kasseta_y5_config,
'block_ip_config': unit_prd_k.block_ip_config,
'nodes_y5': nodes_y5,
'node_ip_power_arr': node_ip_power_arr,
'fs_nodes': fs_nodes,
'power_amplifier': power_amplifier,
'POWER_THRESHOLD': unit_prd_k.constants.POWER_THRESHOLD,
'name_prd': unit_prd_k.self_name,
'module_fs_1': module_fs_1,
'module_fs_6': module_fs_6,
'dou_6': dou_6,
'module_fs_7': module_fs_7,
'dou_7': dou_7,
}
on_control_result(for_control_result)
func on_control_result(for_result_dic: Dictionary) -> void:
## If control is end
var block_kasseta_y5_prd_config_k: Dictionary = for_result_dic.block_kasseta_y5_config
var nodes_y5: Array = for_result_dic.nodes_y5
for node_y5 in nodes_y5:
var meta_y5 = node_y5.get_meta('y5')
if block_kasseta_y5_prd_config_k.has(meta_y5):
@@ -203,15 +110,15 @@ 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 = control_prd_k.block_ip_config
var block_ip_config_k: Dictionary = unit_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')
if block_ip_config_k.has(meta_ip) and block_kasseta_y5_prd_config_k.ug:
power_supply.state = STATE_VAL.GOOD if block_ip_config_k[meta_ip][1] else STATE_VAL.ERROR
var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group')
for f in fs_nodes:
var result_dic: Dictionary = for_result_dic.result_dic
for f in for_result_dic.fs_nodes:
var fs_meta: String = f.get_meta('fs')
if result_dic.has(fs_meta):
var new_state = result_dic[fs_meta]
@@ -219,34 +126,27 @@ func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void:
result_dic[fs_meta] = new_state
if result_dic.fs_1 == 1:
$kasseta_fs_kd/ref_A2.state = STATE_VAL.GOOD if result_dic.dkm_1 else STATE_VAL.ERROR
for_result_dic.module_fs_1.state = STATE_VAL.GOOD if result_dic.dkm_1 else STATE_VAL.ERROR
else:
result_dic.fs_1 = false
result_dic.fs_1 = 0
if result_dic.fs_6 == 1:
$kasseta_fs_kd/ref_A4.state = STATE_VAL.GOOD if result_dic.dkm_6 else STATE_VAL.ERROR
$dou6_A7.state = STATE_VAL.GOOD if result_dic.dou_6 else STATE_VAL.ERROR
for_result_dic.module_fs_6.state = STATE_VAL.GOOD if result_dic.dkm_6 else STATE_VAL.ERROR
for_result_dic.dou_6.state = STATE_VAL.GOOD if result_dic.dou_6 else STATE_VAL.ERROR
else:
result_dic.fs_6 = false
result_dic.fs_6 = 0
if result_dic.fs_7 == 1:
$kasseta_fs_kd/ref_A7.state = STATE_VAL.GOOD if result_dic.dkm_7 else STATE_VAL.ERROR
$dou7_A8.state = STATE_VAL.GOOD if result_dic.dou_7 else STATE_VAL.ERROR
for_result_dic.module_fs_7.state = STATE_VAL.GOOD if result_dic.dkm_7 else STATE_VAL.ERROR
for_result_dic.dou_7.state = STATE_VAL.GOOD if result_dic.dou_7 else STATE_VAL.ERROR
else:
result_dic.fs_7 = false
result_dic.fs_7 = 0
power_fill(for_result_dic.power_dic, for_result_dic.result_dic, for_result_dic.power_amplifier, for_result_dic.POWER_THRESHOLD)
power_fill(power_dic, result_dic)
var result = true
var result: bool = true
for device in result_dic.values():
if not device:
result = false
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)
log.message(Logger.INFO, 'Прибор ПРД-%s %s' % [for_result_dic.name_prd, ['неисправен', 'исправен'][int(result)]])
func find_labels(node1: Node):

View File

@@ -1,122 +1,31 @@
@tool
extends 'res://scenes/контроль/прибор.gd'
const constants_n = {
'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,
}
# Конфигурация параметров для каждого прибора
const PRIBOR_CONFIG_N := {
'': {'angle': 0.0, 'sectors': [4, 8]},
'': {'angle': 90.0, 'sectors': [7, 11]},
'': {'angle': 180.0, 'sectors': [6, 10]},
'': {'angle': 270.0, 'sectors': [5, 9]},
}
# Конфигурация частот и ширин для каждого ФС
const FS_PARAMS_N := {
2: {'freq': 932.0, 'width': 100.0},
3: {'freq': 1157.0, 'width': 100.0}
}
enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 }
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 start_litera: int = 2
var ug_work_1: int = 2 ## Аттенюация усилителей мощности
var ug_work_2: int = 3 ## Аттенюация усилителей мощности
# Флаги и таймеры
var mashine_timer: Timer = Timer.new()
var prd_n_module: Object
var unit_prd_n: Object
var control_prd_n: Object
# Результаты контроля
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 test_control_n = preload('res://scripts/pribor-prd.gd')
var ctrl_pos = 0
################################
func on_state_mashine() -> void:
control_prd_n.state_control_machine()
func _ready() -> void:
if Engine.is_editor_hint():
return
var unit_name = get_meta('unit_name')[0]
var prd_n_module = prd.prd_dict[unit_name]
unit_prd_n = prd_n_module.unit_control
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
for temp in power_amplifier:
temp.value1 = -70
unit_prd_n.connect('control_is_over', Callable(self, 'on_press_device'))
on_press_device()
initialize_connections()
setup_timer()
func start_control() -> void:
set_default_state()
find_labels(self)
func initialize_connections() -> void:
var unit_name = get_meta('unit_name')[0]
prd_n_module = prd.prd_dict[unit_name]
unit_prd_n = prd_n_module.unit_yau07
unit_prd_n.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_n,
'module_prd' : prd_n_module,
'constants': constants_n,
'prd_config': PRIBOR_CONFIG_N,
'fs_params': FS_PARAMS_N,
'block_ip_prd_config': block_ip_config_n,
'block_kasseta_y5_prd_config': block_kasseta_y5_prd_config_n,
'control_results': control_results_n,
'current_litera': start_litera,
}
control_prd_n = test_control_n.TestPRD.new(init_data)
add_child(control_prd_n)
control_prd_n.connect('control_is_over', Callable(self, 'on_control_result'))
func setup_timer() -> void:
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:
for group in get_tree().get_nodes_in_group('default_reset'):
group.state = STATE_VAL.NONE
@@ -128,44 +37,21 @@ func set_default_state() -> void:
func _enter_tree() -> void:
if Engine.is_editor_hint():
return
$control_result.text = 'Выполняется ...'
$control_result.text = 'Ожидается запуск контроля ...' # TODO: Необходимо сделать пулл сообщений
$control_result.add_theme_color_override('font_color', Color.ALICE_BLUE)
signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false))
signaller.connect('режим_журнал', Callable(self, 'on_mode_changed').bind(false))
signaller.connect('режим_эмс', Callable(self, 'on_mode_changed').bind(false))
signaller.connect('режим_настройки', Callable(self, 'on_mode_changed').bind(false))
signaller.connect('режим_контроль', Callable(self, 'on_mode_changed').bind(true))
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:
if not unit_pribor.online:
set_default_state()
func on_mode_changed(in_tree: bool) -> void:
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:
#if not control_prd_n.block_kasseta_y5_config.yau07 or not control_prd_n.block_kasseta_y5_config.ukp1 or not control_prd_n.block_kasseta_y5_config.ukp2:
#return
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
static func power_fill(pow_dic: Dictionary, fs_result: Dictionary, power_amplifier: Array, POWER_THRESHOLD: int) -> void:
for i_powapm in power_amplifier:
var powamp_meta: String = i_powapm.get_meta('um')
var status = STATE_VAL.GOOD if pow_dic else STATE_VAL.NONE
if not pow_dic.has(powamp_meta): return
if pow_dic[powamp_meta].size() < 6:
status = STATE_VAL.ERROR
else:
@@ -173,15 +59,43 @@ func power_fill(pow_dic: Dictionary, fs_result: Dictionary) -> void:
if powamp_meta in ['um_7', 'um_8', 'um_9', 'um_10', 'um_11', 'um_12'] and not fs_result.fs_3: return
i_powapm.value0 = pow_dic[powamp_meta]
for i_p in pow_dic[powamp_meta]:
if i_p < constants_n.POWER_THRESHOLD:
if i_p < POWER_THRESHOLD:
status = STATE_VAL.ERROR
i_powapm.state = status
func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void:
mashine_timer.stop()
block_kasseta_y5_prd_config_n = control_prd_n.block_kasseta_y5_config
func on_press_device() -> void:
var nodes_y5: Array = get_tree().get_nodes_in_group('y-5')
var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply')
var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group')
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
var module_fs_2: Node = $kasseta_FS_ND/ref_A4
var dou_2: Node = $dou2_A5
var module_fs_3: Node = $kasseta_FS_ND/ref_A3
var dou_3: Node = $dou3_A6
var for_control_result: Dictionary = {
'result_dic': unit_prd_n.control_results,
'power_dic': unit_prd_n.power_result,
'block_kasseta_y5_config': unit_prd_n.block_kasseta_y5_config,
'block_ip_config': unit_prd_n.block_ip_config,
'nodes_y5': nodes_y5,
'node_ip_power_arr': node_ip_power_arr,
'fs_nodes': fs_nodes,
'power_amplifier': power_amplifier,
'POWER_THRESHOLD': unit_prd_n.constants.POWER_THRESHOLD,
'name_prd': unit_prd_n.self_name,
'module_fs_2': module_fs_2,
'dou_2': dou_2,
'module_fs_3': module_fs_3,
'dou_3': dou_3,
}
on_control_result(for_control_result)
func on_control_result(for_result_dic: Dictionary) -> void:
## If control is end
var block_kasseta_y5_prd_config_n: Dictionary = for_result_dic.block_kasseta_y5_config
var nodes_y5: Array = for_result_dic.nodes_y5
for node_y5 in nodes_y5:
var meta_y5 = node_y5.get_meta('y5')
if block_kasseta_y5_prd_config_n.has(meta_y5):
@@ -190,15 +104,15 @@ func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void:
break
node_y5.state = STATE_VAL.GOOD if block_kasseta_y5_prd_config_n[meta_y5] else STATE_VAL.ERROR
block_ip_config_n = control_prd_n.block_ip_config
var block_ip_config_n: Dictionary = unit_prd_n.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')
if block_ip_config_n.has(meta_ip) and block_kasseta_y5_prd_config_n.ug:
power_supply.state = STATE_VAL.GOOD if block_ip_config_n[meta_ip][1] else STATE_VAL.ERROR
var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group')
for f in fs_nodes:
var result_dic: Dictionary = for_result_dic.result_dic
for f in for_result_dic.fs_nodes:
var fs_meta: String = f.get_meta('fs')
if result_dic.has(fs_meta):
var new_state = result_dic[fs_meta]
@@ -206,30 +120,24 @@ func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void:
result_dic[fs_meta] = new_state
if result_dic.fs_2 == 1:
$kasseta_FS_ND/ref_A4.state = STATE_VAL.GOOD if result_dic.dkm_2 else STATE_VAL.ERROR
$dou2_A5.state = STATE_VAL.GOOD if result_dic.dou_2 else STATE_VAL.ERROR
for_result_dic.module_fs_2.state = STATE_VAL.GOOD if result_dic.dkm_2 else STATE_VAL.ERROR
for_result_dic.dou_2.state = STATE_VAL.GOOD if result_dic.dou_2 else STATE_VAL.ERROR
else:
result_dic.fs_2 = 0
if result_dic.fs_3 == 1:
$kasseta_FS_ND/ref_A3.state = STATE_VAL.GOOD if result_dic.dkm_3 else STATE_VAL.ERROR
$dou3_A6.state = STATE_VAL.GOOD if result_dic.dou_3 else STATE_VAL.ERROR
for_result_dic.module_fs_3.state = STATE_VAL.GOOD if result_dic.dkm_3 else STATE_VAL.ERROR
for_result_dic.dou_3.state = STATE_VAL.GOOD if result_dic.dou_3 else STATE_VAL.ERROR
else:
result_dic.fs_3 = 0
power_fill(for_result_dic.power_dic, for_result_dic.result_dic, for_result_dic.power_amplifier, for_result_dic.POWER_THRESHOLD)
power_fill(power_dic, result_dic)
var result = true
var result: bool = true
for device in result_dic.values():
if not device:
result = false
var name_prd = control_prd_n.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)
log.message(Logger.INFO, 'Прибор ПРД-%s %s' % [for_result_dic.name_prd, ['неисправен', 'исправен'][int(result)]])
func find_labels(node1: Node):

View File

@@ -1,123 +1,31 @@
@tool
extends 'res://scenes/контроль/прибор.gd'
const constants_v = {
'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,
}
# Конфигурация параметров для каждого прибора
const PRIBOR_CONFIG_V := {
'': {'angle': 0.0, 'sectors': [12, 16]},
'': {'angle': 90.0, 'sectors': [15, 19]},
'': {'angle': 180.0, 'sectors': [14, 18]},
'': {'angle': 270.0, 'sectors': [13, 17]},
}
# Конфигурация частот и ширин для каждого ФС
const FS_PARAMS_V := {
4: {'freq': 1227.0, 'width': 100.0},
5: {'freq': 1575.0, 'width': 110.0},
}
enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 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,
}
# Основные переменные
var start_litera: int = 4
var ug_work_1: int = 2 ## Аттенюация усилителей мощности
var ug_work_2: int = 3 ## Аттенюация усилителей мощности
# Флаги и таймеры
var mashine_timer: Timer = Timer.new()
var prd_v_module: Object
var unit_prd_v: Object
var control_prd_v: Object
# Результаты контроля
var control_results_v: Dictionary = {
'block_ip': false, # Проверка касет П1 и ИП МА2000
'temperature': true, # Проверка температур УМ
'dkm_4': false,
'dkm_5': false,
'dou_4': false,
'dou_5': false,
'fs_4': 2,
'fs_5': 2,
}
var test_control_v = preload('res://scripts/pribor-prd.gd')
var ctrl_pos = 70
func on_state_mashine() -> void:
control_prd_v.state_control_machine()
func _ready() -> void:
if Engine.is_editor_hint():
return
var unit_name = get_meta('unit_name')[0]
var prd_v_module = prd.prd_dict[unit_name]
unit_prd_v = prd_v_module.unit_control
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
for temp in power_amplifier:
temp.value1 = -70
unit_prd_v.connect('control_is_over', Callable(self, 'on_press_device'))
on_press_device()
initialize_connections()
setup_timer()
func start_control() -> void:
set_default_state()
find_labels(self)
func initialize_connections() -> void:
var unit_name = get_meta('unit_name')[0]
prd_v_module = prd.prd_dict[unit_name]
unit_prd_v = prd_v_module.unit_yau07
unit_prd_v.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_v,
'module_prd' : prd_v_module,
'constants': constants_v,
'prd_config': PRIBOR_CONFIG_V,
'fs_params': FS_PARAMS_V,
'block_ip_prd_config': block_ip_config_v,
'block_kasseta_y5_prd_config': block_kasseta_y5_prd_config_v,
'control_results': control_results_v,
'current_litera': start_litera,
}
control_prd_v = test_control_v.TestPRD.new(init_data)
add_child(control_prd_v)
control_prd_v.connect('control_is_over', Callable(self, 'on_control_result'))
func setup_timer() -> void:
add_child(mashine_timer)
mashine_timer.connect('timeout', Callable(self, 'on_state_mashine'))
mashine_timer.wait_time = constants_v.STATE_MASHINE_TIMER
mashine_timer.start()
func set_default_state() -> void:
for group in get_tree().get_nodes_in_group('default_reset'):
group.state = STATE_VAL.NONE
@@ -129,43 +37,21 @@ func set_default_state() -> void:
func _enter_tree() -> void:
if Engine.is_editor_hint():
return
$control_result.text = 'Выполняется ...'
$control_result.text = 'Ожидается запуск контроля ...' # TODO: Необходимо сделать пулл сообщений
$control_result.add_theme_color_override('font_color', Color.ALICE_BLUE)
signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false))
signaller.connect('режим_журнал', Callable(self, 'on_mode_changed').bind(false))
signaller.connect('режим_эмс', Callable(self, 'on_mode_changed').bind(false))
signaller.connect('режим_настройки', Callable(self, 'on_mode_changed').bind(false))
signaller.connect('режим_контроль', Callable(self, 'on_mode_changed').bind(true))
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:
if not unit_pribor.online:
set_default_state()
func on_mode_changed(in_tree: bool) -> void:
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:
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
static func power_fill(pow_dic: Dictionary, fs_result: Dictionary, power_amplifier: Array, POWER_THRESHOLD: int) -> void:
for i_powapm in power_amplifier:
var powamp_meta: String = i_powapm.get_meta('um')
var status = STATE_VAL.GOOD if pow_dic else STATE_VAL.NONE
if not pow_dic.has(powamp_meta): return
if pow_dic[powamp_meta].size() < 6:
status = STATE_VAL.ERROR
else:
@@ -173,15 +59,43 @@ func power_fill(pow_dic: Dictionary, fs_result: Dictionary) -> void:
if powamp_meta in ['um_7', 'um_8', 'um_9', 'um_10', 'um_11', 'um_12'] and not fs_result.fs_5: return
i_powapm.value0 = pow_dic[powamp_meta]
for i_p in pow_dic[powamp_meta]:
if i_p < constants_v.POWER_THRESHOLD:
if i_p < POWER_THRESHOLD:
status = STATE_VAL.ERROR
i_powapm.state = status
func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void:
mashine_timer.stop()
block_kasseta_y5_prd_config_v = control_prd_v.block_kasseta_y5_config
func on_press_device() -> void:
var nodes_y5: Array = get_tree().get_nodes_in_group('y-5')
var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply')
var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group')
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
var module_fs_4: Node = $kasseta_FS_VD/ref_A6
var dou_4: Node = $dou4_A5
var module_fs_5: Node = $kasseta_FS_VD/ref_A2
var dou_5: Node = $dou5_A6
var for_control_result: Dictionary = {
'result_dic': unit_prd_v.control_results,
'power_dic': unit_prd_v.power_result,
'block_kasseta_y5_config': unit_prd_v.block_kasseta_y5_config,
'block_ip_config': unit_prd_v.block_ip_config,
'nodes_y5': nodes_y5,
'node_ip_power_arr': node_ip_power_arr,
'fs_nodes': fs_nodes,
'power_amplifier': power_amplifier,
'POWER_THRESHOLD': unit_prd_v.constants.POWER_THRESHOLD,
'name_prd': unit_prd_v.self_name,
'module_fs_4': module_fs_4,
'dou_4': dou_4,
'module_fs_5': module_fs_5,
'dou_5': dou_5,
}
on_control_result(for_control_result)
static func on_control_result(for_result_dic: Dictionary) -> void:
## If control is end
var block_kasseta_y5_prd_config_v: Dictionary = for_result_dic.block_kasseta_y5_config
var nodes_y5: Array = for_result_dic.nodes_y5
for node_y5 in nodes_y5:
var meta_y5 = node_y5.get_meta('y5')
if block_kasseta_y5_prd_config_v.has(meta_y5):
@@ -190,15 +104,14 @@ func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void:
break
node_y5.state = STATE_VAL.GOOD if block_kasseta_y5_prd_config_v[meta_y5] else STATE_VAL.ERROR
block_ip_config_v = control_prd_v.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 block_ip_config_v: Dictionary = for_result_dic.block_ip_config
for power_supply in for_result_dic.node_ip_power_arr:
var meta_ip = power_supply.get_meta('ip')
if block_ip_config_v.has(meta_ip) and block_kasseta_y5_prd_config_v.ug:
power_supply.state = STATE_VAL.GOOD if block_ip_config_v[meta_ip][1] else STATE_VAL.ERROR
var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group')
for f in fs_nodes:
var result_dic: Dictionary = for_result_dic.result_dic
for f in for_result_dic.fs_nodes:
var fs_meta: String = f.get_meta('fs')
if result_dic.has(fs_meta):
var new_state = result_dic[fs_meta]
@@ -206,29 +119,24 @@ func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void:
result_dic[fs_meta] = new_state
if result_dic.fs_5 == 1:
$kasseta_FS_VD/ref_A2.state = STATE_VAL.GOOD if result_dic.dkm_5 else STATE_VAL.ERROR
$dou5_A6.state = STATE_VAL.GOOD if result_dic.dou_5 else STATE_VAL.ERROR
for_result_dic.module_fs_5.state = STATE_VAL.GOOD if result_dic.dkm_5 else STATE_VAL.ERROR
for_result_dic.dou_5.state = STATE_VAL.GOOD if result_dic.dou_5 else STATE_VAL.ERROR
else:
result_dic.fs_5 = 0
if result_dic.fs_4 == 1:
$kasseta_FS_VD/ref_A6.state = STATE_VAL.GOOD if result_dic.dkm_4 else STATE_VAL.ERROR
$dou4_A5.state = STATE_VAL.GOOD if result_dic.dou_4 else STATE_VAL.ERROR
for_result_dic.module_fs_4.state = STATE_VAL.GOOD if result_dic.dkm_4 else STATE_VAL.ERROR
for_result_dic.dou_4.state = STATE_VAL.GOOD if result_dic.dou_4 else STATE_VAL.ERROR
else:
result_dic.fs_4 = 0
power_fill(power_dic, result_dic)
power_fill(for_result_dic.power_dic, for_result_dic.result_dic, for_result_dic.power_amplifier, for_result_dic.POWER_THRESHOLD)
var result = true
var result: bool = true
for device in result_dic.values():
if not device:
result = false
var name_prd = control_prd_v.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)
log.message(Logger.INFO, 'Прибор ПРД-%s %s' % [for_result_dic.name_prd, ['неисправен', 'исправен'][int(result)]])
func find_labels(node1: Node):

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 = true
var is_prd_operational: bool = false # true
var is_uf_operational: bool = false
@@ -11,24 +11,45 @@ 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(unit_prd_module: Object) -> void:
func on_serviceability_changed() -> 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 unit_prd_module.serviceability:
if not 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 = 'Результаты обобщенного признака работоспособности изделия'
@@ -36,9 +57,9 @@ func _update_serviceability_display() -> void:
func on_uf_status_receive(unit_uf: Object) -> void:
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 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 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

@@ -1 +1 @@
uid://b5ykwyk5vpi6
uid://b5ykwyk5vpi6

View File

@@ -81,7 +81,7 @@ metadata/_tab_index = 5
[node name="lbl_ready" type="Label" parent="."]
layout_mode = 0
offset_left = 1503.0
offset_left = 1504.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 = 1244.0
offset_right = 1401.0
offset_left = 1242.0
offset_right = 1402.0
offset_bottom = 27.0
tooltip_text = "Комплекс находится под внешним управлением"
mouse_filter = 0
@@ -109,7 +109,7 @@ vertical_alignment = 1
[node name="тренаж_режим" type="Button" parent="."]
layout_mode = 0
offset_left = 1404.0
offset_left = 1405.0
offset_right = 1501.0
offset_bottom = 27.0
tooltip_text = "Задействовать режим Тренаж"
@@ -125,5 +125,35 @@ toggle_mode = true
text = "Тренаж"
script = ExtResource("9_41d34")
[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,11 +1,11 @@
extends Button
func _ready():
connect("toggled", Callable(self, "_on_button_toggled"))
func _on_button_toggled(mode: bool):
if mode:
tooltip_text = "Режим \"Тренаж\" задействован\nТекущее состояние: включено"
else:
tooltip_text = "Задейстовать режим \"Тренаж\"\nТекущее состояние: отключено"
extends Button
func _ready():
connect("toggled", Callable(self, "_on_button_toggled"))
func _on_button_toggled(mode: bool):
if mode:
tooltip_text = "Режим \"Тренаж\" задействован\nТекущее состояние: включено"
else:
tooltip_text = "Задейстовать режим \"Тренаж\"\nТекущее состояние: отключено"

View File

@@ -1 +1 @@
uid://roajn6c6wvc1
uid://roajn6c6wvc1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -3,6 +3,5 @@
[ext_resource type="Texture2D" uid="uid://cj1f2uy6qfvki" path="res://scenes/tilemap/23900.png" id="1_v0nwa"]
[node name="23900" type="Sprite2D"]
rotation = 4.71239
scale = Vector2(0.496934, 0.496934)
texture = ExtResource("1_v0nwa")

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(270.0 + course, 360.0)
ship_instance.rotation_degrees = fmod(course, 360.0)
queue_redraw()

View File

@@ -0,0 +1,65 @@
extends Button
var base_style: StyleBoxFlat
var tween
var pulsing: bool = false
@onready var progress_bars := get_tree().get_nodes_in_group("control_progress")
func _ready():
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
set("theme_override_styles/disabled", base_style)
else:
base_style = get("theme_override_styles/disabled")
connect("pressed", Callable(self, "_on_pressed"))
func _on_pressed():
disabled = true
_start_pulse()
var callback = Callable(self, "_check_progress_end")
for pb in progress_bars:
if not pb.is_connected("value_changed", callback):
pb.connect("value_changed", callback)
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
var callback = Callable(self, "_check_progress_end")
for pb in progress_bars:
if pb.is_connected("value_changed", callback):
pb.disconnect("value_changed", callback)
func _check_progress_end(value):
for pb in progress_bars:
if pb.value < pb.max_value:
return
_stop_pulse()

View File

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

View File

@@ -1,16 +1,85 @@
@tool
extends TextureButton
@onready var tween: Tween
@export var state_colors: Array
func _on_toggled(toggled_on): $frame.visible = toggled_on
func _enter_tree() -> void: $label.self_modulate = state_colors[state]
func _ready():
toggle_mode = true
focus_mode = Control.FOCUS_ALL
connect("focus_entered", _on_focus_entered)
connect("focus_exited", _on_focus_exited)
func _enter_tree() -> void:
if has_node("label"):
$label.self_modulate = state_colors[state]
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 _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)
@export var state: int:
set(v):
v = 0 if v < 0 else v % state_colors.size()
state = v
if is_inside_tree():
if is_inside_tree() and has_node("label"):
$label.self_modulate = state_colors[v]
@export var progress_value: float = 0.0:
set(v):
progress_value = 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

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=18 format=3 uid="uid://lwmw4egynmd1"]
[gd_scene load_steps=22 format=3 uid="uid://lwmw4egynmd1"]
[ext_resource type="Texture2D" uid="uid://bar8k5qef7kch" path="res://data/УФ.png" id="2_0nvm1"]
[ext_resource type="Script" uid="uid://q3gmpsqspjfp" path="res://scenes/контроль/внешний.gd" id="2_8r80x"]
@@ -14,7 +14,10 @@
[ext_resource type="Texture2D" uid="uid://dnreyfh3cd1k2" path="res://data/состояние-исправности-1.png" id="8_isjua"]
[ext_resource type="Texture2D" uid="uid://b4isaggma6q3" path="res://data/Грани22.png" id="9_iqgf5"]
[ext_resource type="Texture2D" uid="uid://c6booa8753u5t" path="res://data/состояние-исправности-2.png" id="9_ll0vs"]
[ext_resource type="Texture2D" uid="uid://00871pb6moln" path="res://data/прогресс-фон-1.png" id="9_w6m6a"]
[ext_resource type="Texture2D" uid="uid://c1k856fxhrjnh" path="res://data/прогресс-заполнение-1.png" id="10_lbx5w"]
[ext_resource type="Script" uid="uid://bncy1x53jp73d" path="res://scenes/контроль/connect_pribor.gd" id="11_u7tym"]
[ext_resource type="Script" uid="uid://cjj7pbbhk8q7c" path="res://scenes/контроль/control_prd.gd" id="18_lbx5w"]
[sub_resource type="GDScript" id="GDScript_iqgf5"]
script/source = "extends Panel
@@ -84,6 +87,8 @@ func _ready():
if prd.prd_dict.has(item):
var prd_module = prd.prd_dict[item]
prd_module.connect('update_serviceability', Callable(self, 'on_serviceability_changed').bind(prd_module, pribor_node))
prd_module.unit_control.connect('update_progress', Callable(self, 'on_update_progress').bind(pribor_node))
prd_module.unit_control.connect('update_max_value_progress', Callable(self, 'on_update_max_value_progress').bind(pribor_node))
if item == 'уарэп-эмс':
signaller.connect('update_uf_serviceability', Callable(self, 'on_update_uf_serviceability').bind(pribor_node))
# Пиктограммы приборов, которые отображают состояние подключения только
@@ -143,8 +148,20 @@ func on_serviceability_changed(prd_module: Object, prd_pribor:Node)-> void:
func on_update_uf_serviceability(uf_serviceaability: bool, uf_pribor: Node)-> void:
uf_pribor.state = 1 if uf_serviceaability else 2
func _on_control_prd_pressed() -> void:
signaller.emit_signal('start_contol_device')
func on_update_progress(value_progress: float, pribor_node: Node) -> void:
pribor_node.progress_value = value_progress
pribor_node.progress_visible = value_progress > 0
func on_update_max_value_progress(max_value_progress: int, pribor_node: Node) -> void:
pribor_node.progress_max_value = max_value_progress
"
[sub_resource type="SpriteFrames" id="SpriteFrames_foasq"]
@@ -161,6 +178,15 @@ animations = [{
"speed": 5.0
}]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_lbx5w"]
bg_color = Color(0.6, 0.6, 0.6, 0)
border_width_left = 10
border_width_top = 10
border_width_right = 10
border_width_bottom = 10
border_color = Color(0.833286, 0.436556, 0.229611, 1)
border_blend = true
[node name="Контроль" type="Panel"]
anchors_preset = 15
anchor_right = 1.0
@@ -348,9 +374,9 @@ script = ExtResource("11_u7tym")
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
offset_left = 1048.0
offset_top = 193.0
offset_top = 179.0
offset_right = 1125.0
offset_bottom = 309.0
offset_bottom = 295.0
size_flags_horizontal = 15
size_flags_vertical = 15
toggle_mode = true
@@ -366,9 +392,9 @@ metadata/unit_name = ["уарэп-яу07-1н"]
[node name="label" type="Label" parent="pribor_prd_n_1"]
layout_mode = 0
offset_left = 8.0
offset_top = -38.0
offset_top = -40.0
offset_right = 60.0
offset_bottom = -19.0
offset_bottom = -21.0
text = "ПРД Н1"
horizontal_alignment = 1
vertical_alignment = 1
@@ -396,13 +422,36 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="control_progress" type="TextureProgressBar" parent="pribor_prd_n_1" groups=["control_progress"]]
visible = false
layout_mode = 0
offset_left = -4.0
offset_top = 124.0
offset_right = 89.0
offset_bottom = 134.0
size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "
Текущее: 0.00"
mouse_filter = 0
max_value = 30.0
nine_patch_stretch = true
stretch_margin_left = 5
stretch_margin_top = 5
stretch_margin_right = 5
stretch_margin_bottom = 5
texture_under = ExtResource("9_w6m6a")
texture_progress = ExtResource("10_lbx5w")
tint_under = Color(1, 1, 1, 0.419608)
tint_progress = Color(0.890196, 0.486275, 0.196078, 1)
[node name="pribor_uf" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
offset_left = 1183.0
offset_top = 565.0
offset_top = 558.0
offset_right = 1294.0
offset_bottom = 750.0
offset_bottom = 743.0
size_flags_horizontal = 15
size_flags_vertical = 15
toggle_mode = true
@@ -416,12 +465,11 @@ metadata/unit_name = ["уарэп-эмс"]
metadata/online_proc = "on_line_changed"
[node name="label" type="Label" parent="pribor_uf"]
self_modulate = Color(0, 1, 0, 1)
layout_mode = 0
offset_left = 15.0
offset_top = -34.0
offset_top = -44.0
offset_right = 91.0
offset_bottom = -15.0
offset_bottom = -25.0
text = "УФ"
horizontal_alignment = 1
vertical_alignment = 1
@@ -453,9 +501,9 @@ script = ExtResource("11_u7tym")
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
offset_left = 1058.0
offset_top = 595.0
offset_top = 588.0
offset_right = 1164.0
offset_bottom = 751.0
offset_bottom = 744.0
pivot_offset = Vector2(-10, -65)
size_flags_horizontal = 15
size_flags_vertical = 15
@@ -470,10 +518,10 @@ metadata/online_proc = "online_change_arr"
[node name="label" type="Label" parent="pribor_rtr"]
layout_mode = 0
offset_left = 12.0
offset_top = -54.0
offset_right = 95.0
offset_bottom = -35.0
offset_left = 11.0
offset_top = -49.0
offset_right = 94.0
offset_bottom = -30.0
text = "РТР"
horizontal_alignment = 1
vertical_alignment = 1
@@ -493,19 +541,9 @@ patch_margin_top = 16
patch_margin_right = 16
patch_margin_bottom = 16
[node name="label2" type="Label" parent="pribor_rtr"]
layout_mode = 0
offset_left = 12.0
offset_top = -54.0
offset_right = 95.0
offset_bottom = -35.0
text = "РТР"
horizontal_alignment = 1
vertical_alignment = 1
[node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_rtr"]
light_mask = 3
position = Vector2(55, -15)
position = Vector2(53, -15)
scale = Vector2(0.625, 0.625)
sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
@@ -515,9 +553,9 @@ script = ExtResource("11_u7tym")
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
offset_left = 1053.0
offset_top = 432.0
offset_top = 425.0
offset_right = 1886.0
offset_bottom = 1072.0
offset_bottom = 1065.0
scale = Vector2(0.2, 0.2)
pivot_offset = Vector2(-10, -65)
size_flags_horizontal = 15
@@ -533,9 +571,9 @@ metadata/online_proc = "on_line_changed"
[node name="label" type="Label" parent="pribor_afsp_1"]
layout_mode = 0
offset_left = 165.0
offset_left = 175.0
offset_top = -245.0
offset_right = 262.0
offset_right = 272.0
offset_bottom = -225.0
scale = Vector2(5, 5)
text = "АФСП 1"
@@ -558,17 +596,6 @@ patch_margin_top = 16
patch_margin_right = 16
patch_margin_bottom = 16
[node name="label2" type="Label" parent="pribor_afsp_1"]
layout_mode = 0
offset_left = 165.0
offset_top = -245.0
offset_right = 262.0
offset_bottom = -225.0
scale = Vector2(5, 5)
text = "АФСП 1"
horizontal_alignment = 1
vertical_alignment = 1
[node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_afsp_1"]
light_mask = 3
position = Vector2(415, -40)
@@ -581,9 +608,9 @@ script = ExtResource("11_u7tym")
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
offset_left = 1243.0
offset_top = 432.0
offset_top = 425.0
offset_right = 2076.0
offset_bottom = 1072.0
offset_bottom = 1065.0
scale = Vector2(0.2, 0.2)
pivot_offset = Vector2(-10, -65)
size_flags_horizontal = 15
@@ -600,9 +627,9 @@ metadata/online_proc = "on_line_changed"
[node name="label" type="Label" parent="pribor_afsp_2"]
layout_mode = 0
offset_left = 200.0
offset_left = 175.0
offset_top = -240.0
offset_right = 297.0
offset_right = 272.0
offset_bottom = -220.0
scale = Vector2(5, 5)
text = "АФСП 2"
@@ -625,20 +652,9 @@ patch_margin_top = 16
patch_margin_right = 16
patch_margin_bottom = 16
[node name="label2" type="Label" parent="pribor_afsp_2"]
layout_mode = 0
offset_left = 200.0
offset_top = -240.0
offset_right = 297.0
offset_bottom = -220.0
scale = Vector2(5, 5)
text = "АФСП 2"
horizontal_alignment = 1
vertical_alignment = 1
[node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_afsp_2"]
light_mask = 3
position = Vector2(425, -40)
position = Vector2(415, -40)
scale = Vector2(3, 3)
sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
@@ -648,9 +664,9 @@ script = ExtResource("11_u7tym")
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
offset_left = 1313.0
offset_top = 565.0
offset_top = 558.0
offset_right = 1407.0
offset_bottom = 751.0
offset_bottom = 744.0
size_flags_horizontal = 15
size_flags_vertical = 15
toggle_mode = true
@@ -665,9 +681,9 @@ metadata/online_proc = "online_change_arr"
[node name="label" type="Label" parent="pribor_uyep"]
layout_mode = 0
offset_left = 26.8566
offset_top = -38.3276
offset_top = -43.3276
offset_right = 66.8566
offset_bottom = -19.3276
offset_bottom = -24.3276
text = "У-ЭП"
horizontal_alignment = 1
vertical_alignment = 1
@@ -699,9 +715,9 @@ script = ExtResource("11_u7tym")
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
offset_left = 1440.0
offset_top = 680.0
offset_top = 687.0
offset_right = 1517.0
offset_bottom = 796.0
offset_bottom = 803.0
size_flags_horizontal = 15
size_flags_vertical = 15
toggle_mode = true
@@ -716,10 +732,10 @@ metadata/online_proc = "on_line_changed"
[node name="label" type="Label" parent="pribor_prd_v_2"]
layout_mode = 0
offset_left = 14.0
offset_top = -38.0
offset_right = 66.0
offset_bottom = -19.0
offset_left = 11.0
offset_top = -42.0
offset_right = 63.0
offset_bottom = -23.0
text = "ПРД В2"
horizontal_alignment = 1
vertical_alignment = 1
@@ -741,19 +757,42 @@ patch_margin_bottom = 16
[node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_prd_v_2"]
light_mask = 3
position = Vector2(40, -10)
position = Vector2(37, -10)
scale = Vector2(0.625, 0.625)
sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="control_progress" type="TextureProgressBar" parent="pribor_prd_v_2" groups=["control_progress"]]
visible = false
layout_mode = 0
offset_left = -4.0
offset_top = 124.0
offset_right = 89.0
offset_bottom = 134.0
size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "
Текущее: 0.00"
mouse_filter = 0
max_value = 30.0
nine_patch_stretch = true
stretch_margin_left = 5
stretch_margin_top = 5
stretch_margin_right = 5
stretch_margin_bottom = 5
texture_under = ExtResource("9_w6m6a")
texture_progress = ExtResource("10_lbx5w")
tint_under = Color(1, 1, 1, 0.419608)
tint_progress = Color(0.890196, 0.486275, 0.196078, 1)
[node name="pribor_prd_n_2" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
offset_left = 1440.0
offset_top = 345.0
offset_top = 322.0
offset_right = 1517.0
offset_bottom = 461.0
offset_bottom = 438.0
size_flags_horizontal = 15
size_flags_vertical = 15
toggle_mode = true
@@ -768,10 +807,10 @@ metadata/online_proc = "on_line_changed"
[node name="label" type="Label" parent="pribor_prd_n_2"]
layout_mode = 0
offset_left = 15.0
offset_top = -38.0
offset_right = 67.0
offset_bottom = -19.0
offset_left = 11.0
offset_top = -42.0
offset_right = 63.0
offset_bottom = -23.0
theme_override_colors/font_outline_color = Color(0, 0, 0, 1)
theme_override_constants/outline_size = 0
text = "ПРД Н2"
@@ -795,19 +834,42 @@ patch_margin_bottom = 16
[node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_prd_n_2"]
light_mask = 3
position = Vector2(40, -10)
position = Vector2(37, -10)
scale = Vector2(0.625, 0.625)
sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="control_progress" type="TextureProgressBar" parent="pribor_prd_n_2" groups=["control_progress"]]
visible = false
layout_mode = 0
offset_left = -4.0
offset_top = 124.0
offset_right = 89.0
offset_bottom = 134.0
size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "
Текущее: 0.00"
mouse_filter = 0
max_value = 30.0
nine_patch_stretch = true
stretch_margin_left = 5
stretch_margin_top = 5
stretch_margin_right = 5
stretch_margin_bottom = 5
texture_under = ExtResource("9_w6m6a")
texture_progress = ExtResource("10_lbx5w")
tint_under = Color(1, 1, 1, 0.419608)
tint_progress = Color(0.890196, 0.486275, 0.196078, 1)
[node name="pribor_prd_k_2" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
offset_left = 1440.0
offset_top = 515.0
offset_top = 504.0
offset_right = 1517.0
offset_bottom = 631.0
offset_bottom = 620.0
size_flags_horizontal = 15
size_flags_vertical = 15
toggle_mode = true
@@ -822,10 +884,10 @@ metadata/online_proc = "on_line_changed"
[node name="label" type="Label" parent="pribor_prd_k_2"]
layout_mode = 0
offset_left = 17.0
offset_top = -38.0
offset_right = 69.0
offset_bottom = -19.0
offset_left = 11.0
offset_top = -42.0
offset_right = 63.0
offset_bottom = -23.0
text = "ПРД К2"
horizontal_alignment = 1
vertical_alignment = 1
@@ -847,19 +909,42 @@ patch_margin_bottom = 16
[node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_prd_k_2"]
light_mask = 3
position = Vector2(43, -10)
position = Vector2(37, -10)
scale = Vector2(0.625, 0.625)
sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="control_progress" type="TextureProgressBar" parent="pribor_prd_k_2" groups=["control_progress"]]
visible = false
layout_mode = 0
offset_left = -4.0
offset_top = 124.0
offset_right = 89.0
offset_bottom = 134.0
size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "
Текущее: 0.00"
mouse_filter = 0
max_value = 30.0
nine_patch_stretch = true
stretch_margin_left = 5
stretch_margin_top = 5
stretch_margin_right = 5
stretch_margin_bottom = 5
texture_under = ExtResource("9_w6m6a")
texture_progress = ExtResource("10_lbx5w")
tint_under = Color(1, 1, 1, 0.419608)
tint_progress = Color(0.890196, 0.486275, 0.196078, 1)
[node name="pribor_prd_v_3" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
offset_left = 1048.0
offset_top = 802.0
offset_top = 803.0
offset_right = 1125.0
offset_bottom = 918.0
offset_bottom = 919.0
size_flags_horizontal = 15
size_flags_vertical = 15
toggle_mode = true
@@ -875,9 +960,9 @@ metadata/online_proc = "on_line_changed"
[node name="label" type="Label" parent="pribor_prd_v_3"]
layout_mode = 0
offset_left = 9.0
offset_top = -38.0
offset_top = -41.0
offset_right = 61.0
offset_bottom = -19.0
offset_bottom = -22.0
text = "ПРД В3"
horizontal_alignment = 1
vertical_alignment = 1
@@ -899,19 +984,42 @@ patch_margin_bottom = 16
[node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_prd_v_3"]
light_mask = 3
position = Vector2(34, -10)
position = Vector2(35, -10)
scale = Vector2(0.625, 0.625)
sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="control_progress" type="TextureProgressBar" parent="pribor_prd_v_3" groups=["control_progress"]]
visible = false
layout_mode = 0
offset_left = -8.0
offset_top = 124.0
offset_right = 85.0
offset_bottom = 134.0
size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "
Текущее: 0.00"
mouse_filter = 0
max_value = 30.0
nine_patch_stretch = true
stretch_margin_left = 5
stretch_margin_top = 5
stretch_margin_right = 5
stretch_margin_bottom = 5
texture_under = ExtResource("9_w6m6a")
texture_progress = ExtResource("10_lbx5w")
tint_under = Color(1, 1, 1, 0.419608)
tint_progress = Color(0.890196, 0.486275, 0.196078, 1)
[node name="pribor_prd_n_3" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
offset_left = 1323.0
offset_top = 802.0
offset_top = 803.0
offset_right = 1400.0
offset_bottom = 918.0
offset_bottom = 919.0
size_flags_horizontal = 15
size_flags_vertical = 15
toggle_mode = true
@@ -927,9 +1035,9 @@ metadata/online_proc = "on_line_changed"
[node name="label" type="Label" parent="pribor_prd_n_3"]
layout_mode = 0
offset_left = 8.0
offset_top = -38.0
offset_top = -43.0
offset_right = 60.0
offset_bottom = -19.0
offset_bottom = -24.0
text = "ПРД Н3"
horizontal_alignment = 1
vertical_alignment = 1
@@ -957,13 +1065,36 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="control_progress" type="TextureProgressBar" parent="pribor_prd_n_3" groups=["control_progress"]]
visible = false
layout_mode = 0
offset_left = -7.0
offset_top = 124.0
offset_right = 86.0
offset_bottom = 134.0
size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "
Текущее: 0.00"
mouse_filter = 0
max_value = 30.0
nine_patch_stretch = true
stretch_margin_left = 5
stretch_margin_top = 5
stretch_margin_right = 5
stretch_margin_bottom = 5
texture_under = ExtResource("9_w6m6a")
texture_progress = ExtResource("10_lbx5w")
tint_under = Color(1, 1, 1, 0.419608)
tint_progress = Color(0.890196, 0.486275, 0.196078, 1)
[node name="pribor_prd_k_3" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
offset_left = 1188.0
offset_top = 802.0
offset_top = 803.0
offset_right = 1265.0
offset_bottom = 918.0
offset_bottom = 919.0
size_flags_horizontal = 15
size_flags_vertical = 15
toggle_mode = true
@@ -979,9 +1110,9 @@ metadata/online_proc = "on_line_changed"
[node name="label" type="Label" parent="pribor_prd_k_3"]
layout_mode = 0
offset_left = 9.0
offset_top = -38.0
offset_top = -42.0
offset_right = 61.0
offset_bottom = -19.0
offset_bottom = -23.0
text = "ПРД К3"
horizontal_alignment = 1
vertical_alignment = 1
@@ -1009,13 +1140,36 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="control_progress" type="TextureProgressBar" parent="pribor_prd_k_3" groups=["control_progress"]]
visible = false
layout_mode = 0
offset_left = -8.0
offset_top = 124.0
offset_right = 85.0
offset_bottom = 134.0
size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "
Текущее: 0.00"
mouse_filter = 0
max_value = 30.0
nine_patch_stretch = true
stretch_margin_left = 5
stretch_margin_top = 5
stretch_margin_right = 5
stretch_margin_bottom = 5
texture_under = ExtResource("9_w6m6a")
texture_progress = ExtResource("10_lbx5w")
tint_under = Color(1, 1, 1, 0.419608)
tint_progress = Color(0.890196, 0.486275, 0.196078, 1)
[node name="pribor_prd_v_1" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
offset_left = 1328.0
offset_top = 198.0
offset_top = 179.0
offset_right = 1405.0
offset_bottom = 314.0
offset_bottom = 295.0
size_flags_horizontal = 15
size_flags_vertical = 15
toggle_mode = true
@@ -1031,9 +1185,9 @@ metadata/online_proc = "on_line_changed"
[node name="label" type="Label" parent="pribor_prd_v_1"]
layout_mode = 0
offset_left = 8.0
offset_top = -38.0
offset_top = -44.0
offset_right = 60.0
offset_bottom = -19.0
offset_bottom = -25.0
text = "ПРД В1"
horizontal_alignment = 1
vertical_alignment = 1
@@ -1061,13 +1215,36 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="control_progress" type="TextureProgressBar" parent="pribor_prd_v_1" groups=["control_progress"]]
visible = false
layout_mode = 0
offset_left = -4.0
offset_top = 124.0
offset_right = 89.0
offset_bottom = 134.0
size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "
Текущее: 0.00"
mouse_filter = 0
max_value = 30.0
nine_patch_stretch = true
stretch_margin_left = 5
stretch_margin_top = 5
stretch_margin_right = 5
stretch_margin_bottom = 5
texture_under = ExtResource("9_w6m6a")
texture_progress = ExtResource("10_lbx5w")
tint_under = Color(1, 1, 1, 0.419608)
tint_progress = Color(0.890196, 0.486275, 0.196078, 1)
[node name="pribor_prd_k_1" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
offset_left = 1183.0
offset_top = 193.0
offset_top = 179.0
offset_right = 1260.0
offset_bottom = 309.0
offset_bottom = 295.0
size_flags_horizontal = 15
size_flags_vertical = 15
toggle_mode = true
@@ -1083,9 +1260,9 @@ metadata/online_proc = "on_line_changed"
[node name="label" type="Label" parent="pribor_prd_k_1"]
layout_mode = 0
offset_left = 9.0
offset_top = -38.0
offset_top = -44.0
offset_right = 61.0
offset_bottom = -19.0
offset_bottom = -25.0
text = "ПРД К1"
horizontal_alignment = 1
vertical_alignment = 1
@@ -1113,13 +1290,36 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="control_progress" type="TextureProgressBar" parent="pribor_prd_k_1" groups=["control_progress"]]
visible = false
layout_mode = 0
offset_left = -4.0
offset_top = 124.0
offset_right = 89.0
offset_bottom = 134.0
size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "
Текущее: 0.00"
mouse_filter = 0
max_value = 30.0
nine_patch_stretch = true
stretch_margin_left = 5
stretch_margin_top = 5
stretch_margin_right = 5
stretch_margin_bottom = 5
texture_under = ExtResource("9_w6m6a")
texture_progress = ExtResource("10_lbx5w")
tint_under = Color(1, 1, 1, 0.419608)
tint_progress = Color(0.890196, 0.486275, 0.196078, 1)
[node name="pribor_prd_v_4" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
offset_left = 946.0
offset_top = 345.0
offset_right = 1023.0
offset_bottom = 461.0
offset_left = 940.0
offset_top = 322.0
offset_right = 1017.0
offset_bottom = 438.0
size_flags_horizontal = 15
size_flags_vertical = 15
toggle_mode = true
@@ -1133,10 +1333,10 @@ metadata/online_proc = "on_line_changed"
[node name="label" type="Label" parent="pribor_prd_v_4"]
layout_mode = 0
offset_left = 17.0
offset_top = -38.0
offset_right = 69.0
offset_bottom = -19.0
offset_left = 15.0
offset_top = -41.0
offset_right = 67.0
offset_bottom = -22.0
text = "ПРД В4"
horizontal_alignment = 1
vertical_alignment = 1
@@ -1164,13 +1364,36 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="control_progress" type="TextureProgressBar" parent="pribor_prd_v_4" groups=["control_progress"]]
visible = false
layout_mode = 0
offset_left = -6.0
offset_top = 124.0
offset_right = 87.0
offset_bottom = 134.0
size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "
Текущее: 0.00"
mouse_filter = 0
max_value = 30.0
nine_patch_stretch = true
stretch_margin_left = 5
stretch_margin_top = 5
stretch_margin_right = 5
stretch_margin_bottom = 5
texture_under = ExtResource("9_w6m6a")
texture_progress = ExtResource("10_lbx5w")
tint_under = Color(1, 1, 1, 0.419608)
tint_progress = Color(0.890196, 0.486275, 0.196078, 1)
[node name="pribor_prd_n_4" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
offset_left = 941.0
offset_top = 685.0
offset_top = 687.0
offset_right = 1018.0
offset_bottom = 801.0
offset_bottom = 803.0
size_flags_horizontal = 15
size_flags_vertical = 15
toggle_mode = true
@@ -1185,9 +1408,9 @@ metadata/online_proc = "on_line_changed"
[node name="label" type="Label" parent="pribor_prd_n_4"]
layout_mode = 0
offset_left = 14.0
offset_top = -38.0
offset_top = -41.0
offset_right = 66.0
offset_bottom = -19.0
offset_bottom = -22.0
text = "ПРД Н4"
horizontal_alignment = 1
vertical_alignment = 1
@@ -1215,13 +1438,36 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="control_progress" type="TextureProgressBar" parent="pribor_prd_n_4" groups=["control_progress"]]
visible = false
layout_mode = 0
offset_left = -8.0
offset_top = 124.0
offset_right = 85.0
offset_bottom = 134.0
size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "
Текущее: 0.00"
mouse_filter = 0
max_value = 30.0
nine_patch_stretch = true
stretch_margin_left = 5
stretch_margin_top = 5
stretch_margin_right = 5
stretch_margin_bottom = 5
texture_under = ExtResource("9_w6m6a")
texture_progress = ExtResource("10_lbx5w")
tint_under = Color(1, 1, 1, 0.419608)
tint_progress = Color(0.890196, 0.486275, 0.196078, 1)
[node name="pribor_prd_k_4" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
offset_left = 946.0
offset_top = 515.0
offset_right = 1023.0
offset_bottom = 631.0
offset_left = 941.0
offset_top = 504.0
offset_right = 1018.0
offset_bottom = 620.0
size_flags_horizontal = 15
size_flags_vertical = 15
toggle_mode = true
@@ -1235,10 +1481,10 @@ metadata/online_proc = "on_line_changed"
[node name="label" type="Label" parent="pribor_prd_k_4"]
layout_mode = 0
offset_left = 17.0
offset_top = -38.0
offset_right = 69.0
offset_bottom = -19.0
offset_left = 14.0
offset_top = -40.0
offset_right = 66.0
offset_bottom = -21.0
text = "ПРД К4"
horizontal_alignment = 1
vertical_alignment = 1
@@ -1260,12 +1506,35 @@ patch_margin_bottom = 16
[node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_prd_k_4"]
light_mask = 3
position = Vector2(42, -10)
position = Vector2(39, -10)
scale = Vector2(0.625, 0.625)
sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="control_progress" type="TextureProgressBar" parent="pribor_prd_k_4" groups=["control_progress"]]
visible = false
layout_mode = 0
offset_left = -8.0
offset_top = 124.0
offset_right = 85.0
offset_bottom = 134.0
size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "
Текущее: 0.00"
mouse_filter = 0
max_value = 30.0
nine_patch_stretch = true
stretch_margin_left = 5
stretch_margin_top = 5
stretch_margin_right = 5
stretch_margin_bottom = 5
texture_under = ExtResource("9_w6m6a")
texture_progress = ExtResource("10_lbx5w")
tint_under = Color(1, 1, 1, 0.419608)
tint_progress = Color(0.890196, 0.486275, 0.196078, 1)
[node name="txr_legend0" type="TextureRect" parent="."]
layout_mode = 0
offset_left = 219.0
@@ -1387,6 +1656,17 @@ points = PackedVector2Array(-8, 0, 608, 0)
width = 2.0
default_color = Color(1, 1, 1, 0.352941)
[node name="control_prd" type="Button" parent="." groups=["control_progress"]]
layout_mode = 0
offset_left = 1106.0
offset_top = 64.0
offset_right = 1331.0
offset_bottom = 104.0
focus_mode = 0
theme_override_styles/disabled = SubResource("StyleBoxFlat_lbx5w")
text = "Запуск контроля"
script = ExtResource("18_lbx5w")
[connection signal="toggled" from="pribor_prd_n_1" to="pribor_prd_n_1" method="_on_toggled"]
[connection signal="toggled" from="pribor_uf" to="pribor_uf" method="_on_toggled"]
[connection signal="toggled" from="pribor_rtr" to="pribor_rtr" method="_on_toggled"]
@@ -1404,3 +1684,4 @@ default_color = Color(1, 1, 1, 0.352941)
[connection signal="toggled" from="pribor_prd_v_4" to="pribor_prd_v_4" method="_on_toggled"]
[connection signal="toggled" from="pribor_prd_n_4" to="pribor_prd_n_4" method="_on_toggled"]
[connection signal="toggled" from="pribor_prd_k_4" to="pribor_prd_k_4" method="_on_toggled"]
[connection signal="pressed" from="control_prd" to="." method="_on_control_prd_pressed"]

View File

@@ -64,7 +64,7 @@ const SETTING_TABLE = [
['Адрес БПО правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'],
['Период опроса состояния БПО, секунды', TableEdit, TableEdit, 'Время в секундах' ],
['Период опроса состояния АФСП, секунды', TableEdit, TableEdit, 'Время в секундах' ],
['уареп-трасса', TableEdit, TableEdit, 'IP-адрес для связи с Трассой [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'],
['уарэп-трасса', TableEdit, TableEdit, 'IP-адрес для связи с Трассой [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'],
['Включить работу по своим целям', TableEdit, TableToggle, 'Разрешает работу в секторе со своей целью'],
['Список своих протоколов', TableEdit, TableEdit, 'Список протоколов целей, по которым запрещено работать' ], ]

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
@@ -92,6 +93,7 @@ func on_enter_tree() -> void: call_deferred('on_button_strobe_pressed')
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 +111,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
@@ -589,6 +589,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:
@@ -622,6 +624,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

@@ -379,12 +379,12 @@ texture_normal = ExtResource("14_ggrwd")
[connection signal="drag_continue" from="." to="." method="_on_drag_continue"]
[connection signal="toggled" from="btn_view" to="." method="on_button_view_toggled"]
[connection signal="toggled" from="chk_auto" to="." method="on_value_changed"]
[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"]
[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate"]
[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

@@ -29,7 +29,7 @@ func on_trassa_line_changed(unit_trassa):
$"СкруглённыйПрямоугольникБелый/Label10".text = '-'
func on_sector_klaster(data, unit_trassa):
func on_sector_klaster(_data, unit_trassa):
$"СкруглённыйПрямоугольникБелый/Label6".text = str(unit_trassa.dap)
$"СкруглённыйПрямоугольникБелый/Label7".text = str(unit_trassa.daa)
$"СкруглённыйПрямоугольникБелый/Label8".text = '1'

1
scripts/.gd.uid Normal file
View File

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

View File

@@ -125,6 +125,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]
@@ -257,15 +258,28 @@ 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 = []
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]
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:
@@ -282,19 +296,6 @@ 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 = []
@@ -366,13 +367,23 @@ 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 != '':
@@ -454,13 +465,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 +491,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 +526,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 +577,12 @@ 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
if width < settings.WIDTH_MIN:
width = settings.WIDTH_MIN
ecm.params['width'] = width
if (threat.rkrp != '') and threat.fflags.rkrp and auto_enabled:
var krp = get_krp(threat)
if krp != '':
@@ -576,58 +596,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):
@@ -654,7 +624,7 @@ func set_rparams(threat: threats.Threat, params: Dictionary):
if threat.rparams.has('width'):
params['width'] = threat.rparams['width']
else:
params['width'] = threat.width
params['width'] = threat.width * 1.5
if threat.rparams.has('filename'):
params['filename'] = threat.rparams['filename']
@@ -713,3 +683,16 @@ 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

View File

@@ -153,6 +153,7 @@ 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
@@ -167,6 +168,7 @@ class PRD:
unit_yau07 = u_yau07
init_ems_g()
func init_ems_g():
var in_tbl: Array = []
var out_tbl: Array = []
@@ -283,6 +285,10 @@ func _ready() -> void:
var unit_prd = network.get_unit_instance(prd_name)
var new_prd = PRD.new(prd_name, unit_prd)
prd_dict[prd_name] = new_prd
var control_pribor_prd = preload('res://scripts/pribor-prd.gd')
var unit_control = control_pribor_prd.TestPRD.new({'unit_prd': unit_prd}, new_prd.cmd_array)
add_child(unit_control)
new_prd.unit_control = unit_control
for key in FS_PRD.keys():
var fs = Fs.new(key, FS_PRD[key][0])
fs_dict[key] = fs

View File

@@ -1,4 +1,188 @@
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,
}
var control_results_v: Dictionary = {
'block_ip': false, # Проверка касет П1 и ИП МА2000
'temperature': true, # Проверка температур УМ
'dkm_4': false,
'dkm_5': false,
'dou_4': false,
'dou_5': false,
'fs_4': 2,
'fs_5': 2,
}
####
var block_kasseta_y5_prd_config_k: = {
'yau07': false,
'ems': false,
'ug': false,
'ukp1': false,
'ukp2': false,
}
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 block_ip_config_k := {
'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],
}
####
const RAY_m5:= 'RAY_m5'
const RAY_5:= 'RAY_5'
const RAY_15:= 'RAY_15'
@@ -19,7 +203,7 @@ class TestPRD extends Node:
TEMPERATURE_UKP_2 = 79,
}
enum STATE_MASHINE {
enum STATE_MACHINE {
INIT,
FS_TURN_ON,
FS_WORK,
@@ -56,7 +240,7 @@ class TestPRD extends Node:
'TEMPERATURE_UKP_2': 79,
}
var power_result: Dictionary = {
var power_for_litera: Dictionary = {
1: {RAY_m5: [], RAY_5: [], RAY_15: [], RAY_25: [], RAY_35: [], RAY_45: [],},
2: {RAY_m5: [], RAY_5: [], RAY_15: [], RAY_25: [], RAY_35: [], RAY_45: [],},
3: {RAY_m5: [], RAY_5: [], RAY_15: [], RAY_25: [], RAY_35: [], RAY_45: [],},
@@ -72,39 +256,42 @@ class TestPRD extends Node:
var block_kasseta_y5_config: Dictionary
var control_results: Dictionary
var self_name: String
var state: int = STATE_MASHINE.INIT
var state: int = STATE_MACHINE.INIT
var current_litera: int
var flag_write_isa: bool = false
var flag_fs_status_ok: bool = false
var flag_si_fs_input: bool = false
var flag_si_fs_output: bool = false
var unit_prd: Object
var module_prd: Object
var power_amplify: Array
var control_label: Label
var power_result: Dictionary
#var control_label: Label
var control_timer: Timer = Timer.new()
var ems_6666_timer: Timer = Timer.new()
signal control_is_over(control_results, power_result)
var machine_timer: Timer = Timer.new()
signal control_is_over()
signal update_progress(progress_value: float)
signal update_max_value_progress(max_progress_value: int)
var cc: int = 0
var cmd_array: Array
var progress_value: float:
set(v):
if progress_value != v:
progress_value = v
call_deferred('emit_signal', 'update_progress', v)
var ecms: Dictionary ## Словарь помеховых воздействий
## Инициализация аргуметнов
func _init(init_data: Dictionary) -> void:
control_label = init_data['control_label']
power_amplify = init_data['power_amplifiers']
func _init(init_data: Dictionary, cmd_array_from_prd: Array) -> void:
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']
cmd_array = cmd_array_from_prd
func _ready() -> void:
_determine_self_name()
initialize_connections()
setup_timer()
@@ -115,7 +302,7 @@ class TestPRD extends Node:
## Пакеты от ЯУ-07
func on_data_received(unit_pribor: Object) -> void:
if not is_inside_tree():
if machine_timer.is_stopped():
return
var status: PackedByteArray = unit_pribor.status
@@ -125,11 +312,11 @@ class TestPRD extends Node:
socket_status_ems_g(status)
_process_dkm_status(status)
if current_litera != 0:
var tek_litera: Dictionary = power_result[current_litera]
var tek_litera: Dictionary = power_for_litera[current_litera]
var interes = _get_ray_key(state)
if interes != '':
tek_litera[_get_ray_key(state)] = power_um_ukp(status, current_litera, tek_litera[_get_ray_key(state)])
power_result[current_litera] = tek_litera
power_for_litera[current_litera] = tek_litera
func socket_status_ems_g(packet_form_yau_07: PackedByteArray) -> void:
@@ -157,112 +344,117 @@ 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_MASHINE.INIT:
STATE_MACHINE.INIT:
_handle_init_state()
STATE_MASHINE.FS_TURN_ON:
STATE_MACHINE.FS_TURN_ON:
_handle_fs_turn_on_state()
state = STATE_MASHINE.FS_WORK
STATE_MASHINE.FS_WORK:
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])
if ecms.size() and flag_fs_status_ok:
ems_6666_timer.start()
_handle_fs_work_state()
STATE_MASHINE.CHEK_KASSETA_Y5:
STATE_MACHINE.CHEK_KASSETA_Y5:
if block_kasseta_y5_config['yau07']:
state = STATE_MASHINE.WRITE_ISA
STATE_MASHINE.WRITE_ISA:
state = STATE_MACHINE.WRITE_ISA
STATE_MACHINE.WRITE_ISA:
if not flag_write_isa:
_handle_ug_set_state(0x6)
state = STATE_MASHINE.READ_ISA
STATE_MASHINE.READ_ISA:
state = STATE_MACHINE.READ_ISA
STATE_MACHINE.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])
_handle_read_isa(unit_prd, [constants.ADDR_UG_LITERA_1, constants.ADDR_UG_LITERA_2, constants.ADDR_UG_LITERA_3], cmd_array)
flag_write_isa = false
state = STATE_MASHINE.UG_SET_RAY
STATE_MASHINE.UG_SET_RAY:
state = STATE_MACHINE.UG_SET_RAY
STATE_MACHINE.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_MASHINE.UG_SET_RAY_1
state = STATE_MACHINE.UG_SET_RAY_1
elif unit_prd.isa_ports[addr] & 0x07 == 1:
state = STATE_MASHINE.UG_SET_RAY_2
state = STATE_MACHINE.UG_SET_RAY_2
elif unit_prd.isa_ports[addr] & 0x07 == 2:
state = STATE_MASHINE.UG_SET_RAY_3
state = STATE_MACHINE.UG_SET_RAY_3
elif unit_prd.isa_ports[addr] & 0x07 == 3:
state = STATE_MASHINE.UG_SET_RAY_4
state = STATE_MACHINE.UG_SET_RAY_4
elif unit_prd.isa_ports[addr] & 0x07 == 4:
state = STATE_MASHINE.UG_SET_RAY_5
state = STATE_MACHINE.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_MASHINE.IN_EMS_STOP
control_results = check_dou_result(control_results, power_for_litera, self_name, current_litera, constants)
state = STATE_MACHINE.IN_EMS_STOP
elif unit_prd.isa_ports[addr] & 0x07 == 6:
state = STATE_MASHINE.UG_SET_RAY_0
state = STATE_MACHINE.UG_SET_RAY_0
STATE_MASHINE.UG_SET_RAY_0:
STATE_MACHINE.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_MASHINE.READ_ISA
STATE_MASHINE.UG_SET_RAY_1:
state = STATE_MACHINE.READ_ISA
STATE_MACHINE.UG_SET_RAY_1:
if not flag_write_isa:
_handle_ug_set_state(0x1)
state = STATE_MASHINE.READ_ISA
STATE_MASHINE.UG_SET_RAY_2:
state = STATE_MACHINE.READ_ISA
STATE_MACHINE.UG_SET_RAY_2:
if not flag_write_isa:
_handle_ug_set_state(0x2)
state = STATE_MASHINE.READ_ISA
STATE_MASHINE.UG_SET_RAY_3:
state = STATE_MACHINE.READ_ISA
STATE_MACHINE.UG_SET_RAY_3:
if not flag_write_isa:
_handle_ug_set_state(0x3)
state = STATE_MASHINE.READ_ISA
STATE_MASHINE.UG_SET_RAY_4:
state = STATE_MACHINE.READ_ISA
STATE_MACHINE.UG_SET_RAY_4:
if not flag_write_isa:
_handle_ug_set_state(0x4)
state = STATE_MASHINE.READ_ISA
STATE_MASHINE.UG_SET_RAY_5:
state = STATE_MACHINE.READ_ISA
STATE_MACHINE.UG_SET_RAY_5:
if not flag_write_isa:
_handle_ug_set_state(0x5)
state = STATE_MASHINE.READ_ISA
STATE_MASHINE.IN_EMS_STOP:
state = STATE_MACHINE.READ_ISA
STATE_MACHINE.IN_EMS_STOP:
ems_6666_timer.stop()
state = STATE_MASHINE.FS_TURN_OFF
STATE_MASHINE.FS_TURN_OFF:
state = STATE_MACHINE.FS_TURN_OFF
STATE_MACHINE.FS_TURN_OFF:
ems_6666_timer.stop()
_handle_fs_turn_off_state()
state = STATE_MASHINE.STOP_CONTROL
STATE_MASHINE.STOP_CONTROL:
state = STATE_MACHINE.STOP_CONTROL
STATE_MACHINE.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_MASHINE.FS_TURN_ON
state = STATE_MACHINE.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)
state = STATE_MASHINE.AWAIT
power_result = prep_power(power_for_litera, self_name)
emit_signal('control_is_over')
machine_timer.stop()
##'Выполняется включение ФС-%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 \
@@ -270,7 +462,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_MASHINE.CHEK_KASSETA_Y5
state = STATE_MACHINE.CHEK_KASSETA_Y5
func _handle_ug_set_state(RAY_DOU_NUM: int) -> void:
@@ -292,29 +484,39 @@ class TestPRD extends Node:
elif self_name == '' or self_name == '' or self_name == '' or self_name == '':
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
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)
flag_write_isa = on_ug_setting(unit_prd, dic_att, cmd_array)
## Таймер отправки команды в ЭМС-Г для модуляции
func _on_ems_6666_timer() -> void:
module_prd.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [constants.BASE_ADDR_EMS_G, 6666]])
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_MASHINE.INIT
state = STATE_MACHINE.INIT
func _advance_to_next_fs() -> void:
@@ -330,34 +532,90 @@ 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'))
signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false))
signaller.connect('режим_журнал', Callable(self, 'on_mode_changed').bind(false))
signaller.connect('режим_эмс', Callable(self, 'on_mode_changed').bind(false))
signaller.connect('режим_настройки', Callable(self, 'on_mode_changed').bind(false))
signaller.connect('режим_контроль', Callable(self, 'on_mode_changed').bind(true))
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_v
block_kasseta_y5_config = block_kasseta_y5_prd_config_v
control_results = control_results_v
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_k
block_kasseta_y5_config = block_kasseta_y5_prd_config_n
control_results = control_results_k
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 = 15.0
control_timer.start()
control_timer.wait_time = constants.TIMER_DELAY
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 on_mode_changed(in_tree: bool) -> void:
if not in_tree:
progress_value = 0
machine_timer.stop()
state = STATE_MACHINE.INIT
_handle_fs_turn_off_state()
#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]])
else:
pass
func _process_dkm_status(status: PackedByteArray) -> void:
if not control_results.has(_get_current_fs_key()):
@@ -405,18 +663,18 @@ class TestPRD extends Node:
static func _get_ray_key(machine_state: int) -> String:
match machine_state:
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
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
_: return ''
func on_stop_control() -> void:
_handle_fs_turn_off_state()
state = STATE_MASHINE.FS_TURN_OFF
state = STATE_MACHINE.FS_TURN_OFF
static func on_control_result(ip_config: Dictionary, ctrl_results: Dictionary) -> Dictionary:
@@ -430,10 +688,10 @@ class TestPRD extends Node:
## Установка угла и аттенюации для УМ
static func on_ug_setting(prd_module: Object, prd_unit: Object, settings_ug: Dictionary) -> bool:
static func on_ug_setting(prd_unit: Object, settings_ug: Dictionary, prd_cmd_array: Array) -> bool:
var result_1 = ((settings_ug.ATT_UM_1 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07)
var result_2 = ((settings_ug.ATT_UM_2 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07)
prd_module.cmd_array.append([prd_unit.CmdCode.WRITE_ISA, [ settings_ug.ADDR_UG_LITERA_1, result_1,
prd_cmd_array.append([prd_unit.CmdCode.WRITE_ISA, [ settings_ug.ADDR_UG_LITERA_1, result_1,
settings_ug.ADDR_UG_LITERA_2, result_2,
settings_ug.ADDR_UG_LITERA_3, settings_ug.ATT_UM_3,
]
@@ -441,8 +699,8 @@ class TestPRD extends Node:
return true
static func _handle_read_isa(prd_module: Object, prd_unit: Object, read_isa_ports: Array) -> void:
prd_module.cmd_array.append([prd_unit.CmdCode.READ_ISA, read_isa_ports])
static func _handle_read_isa(prd_unit: Object, read_isa_ports: Array, prd_cmd_array) -> void:
prd_cmd_array.append([prd_unit.CmdCode.READ_ISA, read_isa_ports])
## Управаление модулем фс (включить/отключить излучение)
@@ -511,14 +769,14 @@ class TestPRD extends Node:
for i_temp in 6:
temperature_ukp_1 = status_prd.decode_u16(Constants.TEMPERATURE_UKP_1 + 2 * i_temp)
tmp_1 = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * TEMP + 3)
power_amplifier[i_temp].value1 = tmp_1
#power_amplifier[i_temp].value1 = tmp_1
if tmp_1>70:
all_temp_is_ok = false
if power_amplifier.size() > 12: # Темпуратура от УМ литеры 1
temperature_ukp_1 = status_prd.decode_u16(Constants.TEMPERATURE_UKP_1 + 2 * 7)
tmp_1 = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * TEMP + 3)
power_amplifier[6].value1 = tmp_1
#power_amplifier[6].value1 = tmp_1
if tmp_1>70:
all_temp_is_ok = false
@@ -527,15 +785,16 @@ class TestPRD extends Node:
var temperature_ukp_2: int = status_prd.decode_u16(Constants.TEMPERATURE_UKP_2 + 2 * i_temp)
var tmp_2: int = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_2) * TEMP + 3)
if power_amplifier.size() > 12:
power_amplifier[i_temp+7].value1 = tmp_2
#power_amplifier[i_temp+7].value1 = tmp_2
if tmp_2>70:
all_temp_is_ok = false
else:
power_amplifier[i_temp+6].value1 = tmp_2
#power_amplifier[i_temp+6].value1 = tmp_2
if tmp_2>70:
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

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

@@ -448,6 +448,7 @@ func remove_row(i_row: int):
if nodes.has(sel_key):
var selector = nodes[sel_key]
if selector == null: return
var prnt = selector.get_parent()
prnt.remove_child(selector)
selector.queue_free()
@@ -484,8 +485,11 @@ func next_index(indexes: Array) -> void:
func swap_nodes(nodes_copy, node_key_format, i0, i1) -> void:
var key0 = node_key_format % [i0.y, i0.x]
var key1 = node_key_format % [i1.y, i1.x]
nodes_copy[key1] = nodes[key0]
nodes_copy[key1].name = key1
if is_instance_valid(nodes[key0]):
nodes_copy[key1] = nodes[key0]
nodes_copy[key1].name = key1
else:
print_debug("Ошибка: нод ", key0, " был освобожден")
## Переназначает ключи в соответствии с размерами таблицы.