diff --git a/project.godot b/project.godot index 899f9c2..5a6acf4 100644 --- a/project.godot +++ b/project.godot @@ -60,6 +60,7 @@ spt25="*res://scripts/spt25.gd" astrakb="*res://scripts/astra-kb.gd" prd="*res://scripts/prd.gd" navi="*res://scripts/navigation.gd" +trassa="*res://scripts/trassa.gd" [debug] diff --git a/scenes/pribor-externals/externals.gd b/scenes/pribor-externals/externals.gd deleted file mode 100644 index 2f708c6..0000000 --- a/scenes/pribor-externals/externals.gd +++ /dev/null @@ -1,17 +0,0 @@ -@tool -class_name pribor_externals extends 'res://scenes/контроль/прибор.gd' -var UnitPanel = load('res://scenes/контроль/элемент-ю.tscn') - - -func on_line_changed(unit_inst: unit.Unit, unit_panel: Control): unit_panel.state = unit_inst.online - - -func _ready() -> void: - if Engine.is_editor_hint(): - return - for unit_inst in network.units.values(): - var unit_panel = UnitPanel.instantiate() - unit_panel.fname = unit_inst.name - $grid.add_child(unit_panel) - unit_inst.connect('line_changed', on_line_changed.bind(unit_panel)) - on_line_changed(unit_inst, unit_panel) diff --git a/scenes/pribor-externals/externals.gd.uid b/scenes/pribor-externals/externals.gd.uid deleted file mode 100644 index ff00f2c..0000000 --- a/scenes/pribor-externals/externals.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://beb41qdahkdp5 diff --git a/scenes/pribor-externals/externals.tscn b/scenes/pribor-externals/externals.tscn index 830053f..238339f 100644 --- a/scenes/pribor-externals/externals.tscn +++ b/scenes/pribor-externals/externals.tscn @@ -1,16 +1,34 @@ [gd_scene load_steps=3 format=3 uid="uid://dwgvv4b4a5t1"] -[ext_resource type="Script" uid="uid://beb41qdahkdp5" path="res://scenes/pribor-externals/externals.gd" id="1_pacm1"] - [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_pacm1"] +[sub_resource type="GDScript" id="GDScript_dk54t"] +script/source = "@tool +class_name externals extends 'res://scenes/контроль/прибор.gd' + +var UnitPanel = load('res://scenes/контроль/элемент-ю.tscn') + +func on_line_changed(unit_inst: unit.Unit, unit_panel: Control): unit_panel.state = unit_inst.online + + +func _ready() -> void: + if Engine.is_editor_hint(): + return + for unit_inst in network.units.values(): + var unit_panel = UnitPanel.instantiate() + unit_panel.fname = unit_inst.name + $grid.add_child(unit_panel) + unit_inst.connect('line_changed', on_line_changed.bind(unit_panel)) + on_line_changed(unit_inst, unit_panel) +" + [node name="externals" type="PanelContainer"] offset_left = 71.0 offset_top = 75.0 offset_right = 756.0 offset_bottom = 964.0 theme_override_styles/panel = SubResource("StyleBoxEmpty_pacm1") -script = ExtResource("1_pacm1") +script = SubResource("GDScript_dk54t") [node name="grid" type="GridContainer" parent="."] layout_mode = 2 diff --git a/scenes/pribor-uyep/sch3-view.gd b/scenes/pribor-uyep/sch3-view.gd index 546bb3c..22fee33 100644 --- a/scenes/pribor-uyep/sch3-view.gd +++ b/scenes/pribor-uyep/sch3-view.gd @@ -69,7 +69,7 @@ func on_toggled_switch(val: bool, meta: Array, unit_sch3): func _enter_tree() -> void: super._enter_tree() if Engine.is_editor_hint(): return - var unit_sch3 = network.get_unit_instance(unit_name) + var unit_sch3: = network.get_unit_instance(unit_name) unit_sch3.base_holding_address = base_holding_address unit_sch3.regs_holding_count = regs_holding_count unit_sch3.base_input_address = base_input_address @@ -82,7 +82,7 @@ func _enter_tree() -> void: func _ready() -> void: - var unit_sch3 = network.get_unit_instance(unit_name) + var unit_sch3: = network.get_unit_instance(unit_name) var items = get_tree().get_nodes_in_group('bits_items_switch') for item in items: var meta = item.get_meta('bits') diff --git a/scenes/контроль/внешний.gd b/scenes/контроль/внешний.gd new file mode 100644 index 0000000..0596fd2 --- /dev/null +++ b/scenes/контроль/внешний.gd @@ -0,0 +1,12 @@ +extends TextureRect + +@export var unit_name: StringName = '' + + +func _ready() -> void: + var unit_instance = network.get_unit_instance(unit_name) + unit_instance.connect('line_changed', on_line_changed) + + +func on_line_changed(unit_instance: unit.Unit): + $connect_pribor.set_val(unit_instance.online) diff --git a/scenes/контроль/внешний.gd.uid b/scenes/контроль/внешний.gd.uid new file mode 100644 index 0000000..dff0cac --- /dev/null +++ b/scenes/контроль/внешний.gd.uid @@ -0,0 +1 @@ +uid://q3gmpsqspjfp diff --git a/scenes/контроль/кнопка-прибора.gd b/scenes/контроль/кнопка-прибора.gd index d8418b6..13d337b 100644 --- a/scenes/контроль/кнопка-прибора.gd +++ b/scenes/контроль/кнопка-прибора.gd @@ -5,7 +5,7 @@ extends Node @export var state_colors: Array func _on_toggled(toggled_on): $frame.visible = toggled_on -func _enter_tree() -> void: $label.self_modulate = state +func _enter_tree() -> void: $label.self_modulate = state_colors[state] @export var state: int: diff --git a/scenes/контроль/контроль.gd b/scenes/контроль/контроль.gd deleted file mode 100644 index 24ade4c..0000000 --- a/scenes/контроль/контроль.gd +++ /dev/null @@ -1,81 +0,0 @@ -extends Panel - -""" -Режим контроль -""" -#TODO: рефактор: заменить подчёркивание на тире -const PRIBORS_RES = \ - { - 'externals': ['res://scenes/pribor-externals/externals.tscn', 'Контроль подключения внешних систем'], - 'pribor_prd_k_1': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 1'], - 'pribor_prd_k_2': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 2'], - 'pribor_prd_k_3': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 3'], - 'pribor_prd_k_4': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 4'], - 'pribor_prd_n_1': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 1'], - 'pribor_prd_n_2': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 2'], - 'pribor_prd_n_3': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 3'], - 'pribor_prd_n_4': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 4'], - 'pribor_prd_v_1': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 1'], - 'pribor_prd_v_2': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 2'], - 'pribor_prd_v_3': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 3'], - 'pribor_prd_v_4': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 4'], - 'pribor_rtr': ['res://scenes/pribor-afsp/pribor-bpo.tscn', 'Контроль исправности прибора РТР'], - 'pribor_afsp_1': ['res://scenes/pribor-afsp/pribor-afsp-1.tscn', 'Контроль исправности прибора АФСП 1'], - 'pribor_afsp_2': ['res://scenes/pribor-afsp/pribor-afsp-2.tscn', 'Контроль исправности прибора АФСП 2'], - 'pribor_uf': ['res://scenes/pribor-uf/pribor-uf.tscn', 'Контроль исправности прибора УФ'], - 'pribor_uyep': ['res://scenes/pribor-uyep/pribor-uyep.tscn', 'Контроль исправности устройства У-ЭП'], - } - - -func on_line_changed(u, conn_node, _pribor_meta): conn_node.set_val(u.online) - - -func _ready(): - var group = ButtonGroup.new() - for k in PRIBORS_RES: - var pribor_node = get_node(k) - var pribor_path = PRIBORS_RES[k][0] - var header_text = PRIBORS_RES[k][1] - pribor_node.set_button_group(group) - pribor_node.connect('button_down', Callable(self, 'on_pribor_press').bind(pribor_path, header_text, pribor_node)) - var conn_node = pribor_node.get_node('connect_pribor') - var pribor_meta = pribor_node.get_meta('unit_name', []) - var pribor_proc = pribor_node.get_meta('online_proc', '') - if pribor_proc == '': - continue - if pribor_meta.size(): - for i in pribor_meta.size(): - var unit_pribor = network.get_unit_instance(pribor_meta[i]) - unit_pribor.connect('line_changed', Callable(self, pribor_proc).bind(conn_node, pribor_meta)) - - -func online_change_arr(_u, conn_node, pribor_meta): - var state_online = true - for i in pribor_meta.size(): - var unit_pribor = network.get_unit_instance(pribor_meta[i]) - if not unit_pribor.online: - state_online = false - break - conn_node.set_val(state_online) - - -func on_pribor_press(pribor_path, header_text, pribor_node): - var items = get_tree().get_nodes_in_group('pribor_items') - for item in items: - remove_child(item) - item.queue_free() - var pribor_obj = load(pribor_path) - if not pribor_obj: - push_error('не загружено: \"%s\" (%s)' % [pribor_path, header_text]) - return - var pribor = pribor_obj.instantiate() - if not pribor: - push_error('экземпляр не создан: \"%s\" (%s)' % [pribor_path, header_text]) - return - $lbl_header.text = header_text - var meta_list = pribor_node.get_meta_list() - if meta_list.find('unit_name') > -1: - var unit_name = pribor_node.get_meta('unit_name') - pribor.set_meta('unit_name', unit_name) - pribor.add_to_group('pribor_items') - add_child(pribor) diff --git a/scenes/контроль/контроль.gd.uid b/scenes/контроль/контроль.gd.uid deleted file mode 100644 index 274dfa2..0000000 --- a/scenes/контроль/контроль.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://b0wcp76bbl2jx diff --git a/scenes/контроль/контроль.tscn b/scenes/контроль/контроль.tscn index 461f07c..b62b858 100644 --- a/scenes/контроль/контроль.tscn +++ b/scenes/контроль/контроль.tscn @@ -1,7 +1,7 @@ -[gd_scene load_steps=17 format=3 uid="uid://lwmw4egynmd1"] +[gd_scene load_steps=18 format=3 uid="uid://lwmw4egynmd1"] -[ext_resource type="Script" uid="uid://b0wcp76bbl2jx" path="res://scenes/контроль/контроль.gd" id="1_x5d6w"] [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"] [ext_resource type="Texture2D" uid="uid://bb80aigvv648i" path="res://data/кнопка-внешние-0.png" id="2_oysma"] [ext_resource type="Script" uid="uid://bj4nndrurbunl" path="res://scenes/контроль/кнопка-прибора.gd" id="3_4pt7j"] [ext_resource type="Texture2D" uid="uid://dkqlvd750pplc" path="res://data/СПТ.png" id="3_hhadv"] @@ -16,6 +16,89 @@ [ext_resource type="Texture2D" uid="uid://c6booa8753u5t" path="res://data/состояние-исправности-2.png" id="9_ll0vs"] [ext_resource type="Script" uid="uid://bncy1x53jp73d" path="res://scenes/контроль/connect_pribor.gd" id="11_u7tym"] +[sub_resource type="GDScript" id="GDScript_iqgf5"] +script/source = "extends Panel + +\"\"\" +Режим контроль +\"\"\" +#TODO: рефактор: заменить подчёркивание на тире +const PRIBORS_RES = \\ + { + 'pribor_prd_k_1': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 1'], + 'pribor_prd_k_2': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 2'], + 'pribor_prd_k_3': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 3'], + 'pribor_prd_k_4': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 4'], + 'pribor_prd_n_1': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 1'], + 'pribor_prd_n_2': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 2'], + 'pribor_prd_n_3': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 3'], + 'pribor_prd_n_4': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 4'], + 'pribor_prd_v_1': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 1'], + 'pribor_prd_v_2': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 2'], + 'pribor_prd_v_3': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 3'], + 'pribor_prd_v_4': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 4'], + 'pribor_rtr': ['res://scenes/pribor-afsp/pribor-bpo.tscn', 'Контроль исправности прибора РТР'], + 'pribor_afsp_1': ['res://scenes/pribor-afsp/pribor-afsp-1.tscn', 'Контроль исправности прибора АФСП 1'], + 'pribor_afsp_2': ['res://scenes/pribor-afsp/pribor-afsp-2.tscn', 'Контроль исправности прибора АФСП 2'], + 'pribor_uf': ['res://scenes/pribor-uf/pribor-uf.tscn', 'Контроль исправности прибора УФ'], + 'pribor_uyep': ['res://scenes/pribor-uyep/pribor-uyep.tscn', 'Контроль исправности устройства У-ЭП'], + } + + +func on_line_changed(u, conn_node, _pribor_meta): conn_node.set_val(u.online) + + +func _ready(): + var group = ButtonGroup.new() + for k in PRIBORS_RES: + var pribor_node = get_node(k) + var pribor_path = PRIBORS_RES[k][0] + var header_text = PRIBORS_RES[k][1] + pribor_node.set_button_group(group) + pribor_node.connect('button_down', Callable(self, 'on_pribor_press').bind(pribor_path, header_text, pribor_node)) + var conn_node = pribor_node.get_node('connect_pribor') + var pribor_meta = pribor_node.get_meta('unit_name', []) + var pribor_proc = pribor_node.get_meta('online_proc', '') + if pribor_proc == '': + continue + if pribor_meta.size(): + for i in pribor_meta.size(): + var unit_pribor = network.get_unit_instance(pribor_meta[i]) + unit_pribor.connect('line_changed', Callable(self, pribor_proc).bind(conn_node, pribor_meta)) + + +func online_change_arr(_u, conn_node, pribor_meta): + var state_online = true + for i in pribor_meta.size(): + var unit_pribor = network.get_unit_instance(pribor_meta[i]) + if not unit_pribor.online: + state_online = false + break + conn_node.set_val(state_online) + + +func on_pribor_press(pribor_path, header_text, pribor_node): + var items = get_tree().get_nodes_in_group('pribor_items') + for item in items: + remove_child(item) + item.queue_free() + var pribor_obj = load(pribor_path) + if not pribor_obj: + push_error('не загружено: \\\"%s\\\" (%s)' % [pribor_path, header_text]) + return + var pribor = pribor_obj.instantiate() + if not pribor: + push_error('экземпляр не создан: \\\"%s\\\" (%s)' % [pribor_path, header_text]) + return + $lbl_header.text = header_text + var meta_list = pribor_node.get_meta_list() + if meta_list.find('unit_name') > -1: + var unit_name = pribor_node.get_meta('unit_name') + pribor.set_meta('unit_name', unit_name) + pribor.add_to_group('pribor_items') + add_child(pribor) +" + [sub_resource type="SpriteFrames" id="SpriteFrames_foasq"] animations = [{ "frames": [{ @@ -36,58 +119,174 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -script = ExtResource("1_x5d6w") +script = SubResource("GDScript_iqgf5") metadata/_edit_lock_ = true -[node name="externals" type="TextureButton" parent="." groups=["pribor_buttons"]] +[node name="capsrpb" type="TextureRect" parent="."] editor_description = "Кнопка для отображения внешних соединений." +self_modulate = Color(0.788235, 0.788235, 0.788235, 1) layout_mode = 0 -offset_left = 1435.0 -offset_top = 32.0 -offset_right = 1691.0 -offset_bottom = 288.0 -scale = Vector2(0.5, 0.5) +offset_left = 959.0 +offset_top = 1021.0 +offset_right = 1215.0 +offset_bottom = 1277.0 +scale = Vector2(0.25, 0.25) size_flags_horizontal = 15 size_flags_vertical = 15 -toggle_mode = true -action_mode = 0 -texture_normal = ExtResource("2_oysma") -stretch_mode = 0 -script = ExtResource("3_4pt7j") -state_colors = [Color(1, 1, 1, 1), Color(0, 0.74, 0.37, 1), Color(0.854902, 0.0705882, 0.0705882, 1)] +texture = ExtResource("2_oysma") +script = ExtResource("2_8r80x") +unit_name = &"уарэп-капсрпб" -[node name="label" type="Label" parent="externals"] -self_modulate = Color(0, 0, 0, 0) +[node name="label" type="Label" parent="capsrpb"] layout_mode = 0 -offset_left = 58.0 -offset_top = -26.0 -offset_right = 219.0 -offset_bottom = -7.0 -text = "Внешние подключения" +offset_left = -44.0 +offset_top = -128.0 +offset_right = 41.0 +offset_bottom = -109.0 +scale = Vector2(4, 4) +text = "КАПС РПБ" horizontal_alignment = 1 vertical_alignment = 1 -[node name="frame" type="NinePatchRect" parent="externals"] -visible = false -self_modulate = Color(0.890196, 0.486275, 0.196078, 1) -layout_mode = 0 -offset_left = -32.0 -offset_top = -12.0 -offset_right = 123.0 -offset_bottom = 111.0 -scale = Vector2(2, 2) -texture = ExtResource("4_rasbe") -region_rect = Rect2(-3, -3, 89, 89) -patch_margin_left = 16 -patch_margin_top = 16 -patch_margin_right = 16 -patch_margin_bottom = 16 - -[node name="connect_pribor" type="AnimatedSprite2D" parent="externals"] -modulate = Color(0.498039, 0.498039, 0.498039, 1) +[node name="connect_pribor" type="AnimatedSprite2D" parent="capsrpb"] light_mask = 3 -position = Vector2(47.9999, 30) -scale = Vector2(1.23077, 1.25) +position = Vector2(56, -4) +scale = Vector2(2.6, 2.6) +sprite_frames = SubResource("SpriteFrames_foasq") +script = ExtResource("11_u7tym") + +[node name="5p28" type="TextureRect" parent="."] +editor_description = "Кнопка для отображения внешних соединений." +self_modulate = Color(0.788235, 0.788235, 0.788235, 1) +layout_mode = 0 +offset_left = 1088.0 +offset_top = 1021.0 +offset_right = 1344.0 +offset_bottom = 1277.0 +scale = Vector2(0.25, 0.25) +size_flags_horizontal = 15 +size_flags_vertical = 15 +texture = ExtResource("2_oysma") +script = ExtResource("2_8r80x") +unit_name = &"уарэп-5п28" + +[node name="label" type="Label" parent="5p28"] +layout_mode = 0 +offset_left = 16.0 +offset_top = -128.0 +offset_right = 68.0 +offset_bottom = -109.0 +scale = Vector2(4, 4) +text = "5П28" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="connect_pribor" type="AnimatedSprite2D" parent="5p28"] +light_mask = 3 +position = Vector2(52, -4) +scale = Vector2(2.6, 2.6) +sprite_frames = SubResource("SpriteFrames_foasq") +frame_progress = 0.72355 +script = ExtResource("11_u7tym") + +[node name="akng" type="TextureRect" parent="."] +editor_description = "Кнопка для отображения внешних соединений." +self_modulate = Color(0.788235, 0.788235, 0.788235, 1) +layout_mode = 0 +offset_left = 1216.0 +offset_top = 1021.0 +offset_right = 1472.0 +offset_bottom = 1277.0 +scale = Vector2(0.25, 0.25) +size_flags_horizontal = 15 +size_flags_vertical = 15 +texture = ExtResource("2_oysma") +script = ExtResource("2_8r80x") +unit_name = &"навигация" + +[node name="label" type="Label" parent="akng"] +layout_mode = 0 +offset_left = 4.0 +offset_top = -128.0 +offset_right = 53.0 +offset_bottom = -109.0 +scale = Vector2(4, 4) +text = "АКНГ" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="connect_pribor" type="AnimatedSprite2D" parent="akng"] +light_mask = 3 +position = Vector2(47.9999, -4) +scale = Vector2(2.6, 2.6) +sprite_frames = SubResource("SpriteFrames_foasq") +frame_progress = 0.72355 +script = ExtResource("11_u7tym") + +[node name="maps" type="TextureRect" parent="."] +editor_description = "Кнопка для отображения внешних соединений." +self_modulate = Color(0.788235, 0.788235, 0.788235, 1) +layout_mode = 0 +offset_left = 1344.0 +offset_top = 1021.0 +offset_right = 1600.0 +offset_bottom = 1277.0 +scale = Vector2(0.25, 0.25) +size_flags_horizontal = 15 +size_flags_vertical = 15 +texture = ExtResource("2_oysma") +script = ExtResource("2_8r80x") +unit_name = &"навигация" + +[node name="label" type="Label" parent="maps"] +layout_mode = 0 +offset_left = 4.0 +offset_top = -128.0 +offset_right = 53.0 +offset_bottom = -109.0 +scale = Vector2(4, 4) +text = "Карты" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="connect_pribor" type="AnimatedSprite2D" parent="maps"] +light_mask = 3 +position = Vector2(47.9999, -4) +scale = Vector2(2.6, 2.6) +sprite_frames = SubResource("SpriteFrames_foasq") +frame_progress = 0.72355 +script = ExtResource("11_u7tym") + +[node name="trassa" type="TextureRect" parent="."] +editor_description = "Кнопка для отображения внешних соединений." +self_modulate = Color(0.788235, 0.788235, 0.788235, 1) +layout_mode = 0 +offset_left = 1472.0 +offset_top = 1021.0 +offset_right = 1728.0 +offset_bottom = 1277.0 +scale = Vector2(0.25, 0.25) +size_flags_horizontal = 15 +size_flags_vertical = 15 +texture = ExtResource("2_oysma") +script = ExtResource("2_8r80x") +unit_name = &"уарэп-трасса" + +[node name="label" type="Label" parent="trassa"] +layout_mode = 0 +offset_left = 4.0 +offset_top = -128.0 +offset_right = 53.0 +offset_bottom = -109.0 +scale = Vector2(4, 4) +text = "Трасса" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="connect_pribor" type="AnimatedSprite2D" parent="trassa"] +light_mask = 3 +position = Vector2(47.9999, -4) +scale = Vector2(2.6, 2.6) sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.72355 script = ExtResource("11_u7tym") @@ -95,9 +294,9 @@ script = ExtResource("11_u7tym") [node name="pribor_uf" type="TextureButton" parent="." groups=["pribor_buttons"]] editor_description = "Кнопка для выбора прибора." layout_mode = 0 -offset_left = 1150.0 +offset_left = 1183.0 offset_top = 565.0 -offset_right = 1261.0 +offset_right = 1294.0 offset_bottom = 750.0 size_flags_horizontal = 15 size_flags_vertical = 15 @@ -111,7 +310,6 @@ metadata/unit_name = ["уарэп-эмс"] metadata/online_proc = "on_line_changed" [node name="label" type="Label" parent="pribor_uf"] -self_modulate = Color(0, 0, 0, 0) layout_mode = 0 offset_left = 15.0 offset_top = -34.0 @@ -123,7 +321,6 @@ vertical_alignment = 1 [node name="frame" type="NinePatchRect" parent="pribor_uf"] visible = false -self_modulate = Color(0.890196, 0.486275, 0.196078, 1) layout_mode = 0 offset_left = -14.0 offset_top = -30.0 @@ -137,7 +334,6 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_uf"] -modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(52, -6) scale = Vector2(0.625, 0.625) @@ -148,9 +344,9 @@ script = ExtResource("11_u7tym") [node name="pribor_rtr" type="TextureButton" parent="." groups=["pribor_buttons"]] editor_description = "Кнопка для выбора прибора." layout_mode = 0 -offset_left = 1025.0 +offset_left = 1058.0 offset_top = 595.0 -offset_right = 1131.0 +offset_right = 1164.0 offset_bottom = 751.0 pivot_offset = Vector2(-10, -65) size_flags_horizontal = 15 @@ -162,6 +358,16 @@ stretch_mode = 0 script = ExtResource("3_4pt7j") state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)] +[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 +text = "РТР" +horizontal_alignment = 1 +vertical_alignment = 1 + [node name="frame" type="NinePatchRect" parent="pribor_rtr"] visible = false self_modulate = Color(0.890196, 0.486275, 0.196078, 1) @@ -177,8 +383,7 @@ patch_margin_top = 16 patch_margin_right = 16 patch_margin_bottom = 16 -[node name="label" type="Label" parent="pribor_rtr"] -self_modulate = Color(0, 0, 0, 0) +[node name="label2" type="Label" parent="pribor_rtr"] layout_mode = 0 offset_left = 12.0 offset_top = -54.0 @@ -189,7 +394,6 @@ horizontal_alignment = 1 vertical_alignment = 1 [node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_rtr"] -modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(55, -15) scale = Vector2(0.625, 0.625) @@ -200,10 +404,10 @@ script = ExtResource("11_u7tym") [node name="pribor_afsp_1" type="TextureButton" parent="." groups=["pribor_buttons"]] editor_description = "Кнопка для выбора прибора." layout_mode = 0 -offset_left = 1020.0 -offset_top = 420.0 -offset_right = 1853.0 -offset_bottom = 1060.0 +offset_left = 1053.0 +offset_top = 432.0 +offset_right = 1886.0 +offset_bottom = 1072.0 scale = Vector2(0.2, 0.2) pivot_offset = Vector2(-10, -65) size_flags_horizontal = 15 @@ -215,6 +419,17 @@ stretch_mode = 0 script = ExtResource("3_4pt7j") state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)] +[node name="label" 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="frame" type="NinePatchRect" parent="pribor_afsp_1"] visible = false self_modulate = Color(0.890196, 0.486275, 0.196078, 1) @@ -231,8 +446,7 @@ patch_margin_top = 16 patch_margin_right = 16 patch_margin_bottom = 16 -[node name="label" type="Label" parent="pribor_afsp_1"] -self_modulate = Color(0, 0, 0, 0) +[node name="label2" type="Label" parent="pribor_afsp_1"] layout_mode = 0 offset_left = 165.0 offset_top = -245.0 @@ -244,7 +458,6 @@ horizontal_alignment = 1 vertical_alignment = 1 [node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_afsp_1"] -modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(415, -40) scale = Vector2(3, 3) @@ -255,10 +468,10 @@ script = ExtResource("11_u7tym") [node name="pribor_afsp_2" type="TextureButton" parent="." groups=["pribor_buttons"]] editor_description = "Кнопка для выбора прибора." layout_mode = 0 -offset_left = 1210.0 -offset_top = 420.0 -offset_right = 2043.0 -offset_bottom = 1060.0 +offset_left = 1243.0 +offset_top = 432.0 +offset_right = 2076.0 +offset_bottom = 1072.0 scale = Vector2(0.2, 0.2) pivot_offset = Vector2(-10, -65) size_flags_horizontal = 15 @@ -271,6 +484,17 @@ flip_h = true script = ExtResource("3_4pt7j") state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)] +[node name="label" 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="frame" type="NinePatchRect" parent="pribor_afsp_2"] visible = false self_modulate = Color(0.890196, 0.486275, 0.196078, 1) @@ -287,8 +511,7 @@ patch_margin_top = 16 patch_margin_right = 16 patch_margin_bottom = 16 -[node name="label" type="Label" parent="pribor_afsp_2"] -self_modulate = Color(0, 0, 0, 0) +[node name="label2" type="Label" parent="pribor_afsp_2"] layout_mode = 0 offset_left = 200.0 offset_top = -240.0 @@ -300,7 +523,6 @@ horizontal_alignment = 1 vertical_alignment = 1 [node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_afsp_2"] -modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(425, -40) scale = Vector2(3, 3) @@ -311,9 +533,9 @@ script = ExtResource("11_u7tym") [node name="pribor_uyep" type="TextureButton" parent="." groups=["pribor_buttons"]] editor_description = "Кнопка для выбора прибора." layout_mode = 0 -offset_left = 1280.0 +offset_left = 1313.0 offset_top = 565.0 -offset_right = 1374.0 +offset_right = 1407.0 offset_bottom = 751.0 size_flags_horizontal = 15 size_flags_vertical = 15 @@ -327,7 +549,6 @@ metadata/unit_name = ["уарэп-щ3", "уарэп-спт25-1", "уарэп-с metadata/online_proc = "online_change_arr" [node name="label" type="Label" parent="pribor_uyep"] -self_modulate = Color(0, 0, 0, 0) layout_mode = 0 offset_left = 26.8566 offset_top = -38.3276 @@ -353,7 +574,6 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_uyep"] -modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(45, -10) scale = Vector2(0.625, 0.625) @@ -364,9 +584,9 @@ script = ExtResource("11_u7tym") [node name="pribor_prd_v_2" type="TextureButton" parent="." groups=["pribor_buttons"]] editor_description = "Кнопка для выбора прибора." layout_mode = 0 -offset_left = 1435.0 +offset_left = 1440.0 offset_top = 680.0 -offset_right = 1512.0 +offset_right = 1517.0 offset_bottom = 796.0 size_flags_horizontal = 15 size_flags_vertical = 15 @@ -381,7 +601,6 @@ metadata/unit_name = ["уарэп-яу07-2в"] metadata/online_proc = "on_line_changed" [node name="label" type="Label" parent="pribor_prd_v_2"] -self_modulate = Color(0, 0, 0, 0) layout_mode = 0 offset_left = 14.0 offset_top = -38.0 @@ -407,7 +626,6 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_prd_v_2"] -modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(40, -10) scale = Vector2(0.625, 0.625) @@ -418,9 +636,9 @@ script = ExtResource("11_u7tym") [node name="pribor_prd_n_2" type="TextureButton" parent="." groups=["pribor_buttons"]] editor_description = "Кнопка для выбора прибора." layout_mode = 0 -offset_left = 1435.0 +offset_left = 1440.0 offset_top = 345.0 -offset_right = 1512.0 +offset_right = 1517.0 offset_bottom = 461.0 size_flags_horizontal = 15 size_flags_vertical = 15 @@ -435,7 +653,6 @@ metadata/unit_name = ["уарэп-яу07-2н"] metadata/online_proc = "on_line_changed" [node name="label" type="Label" parent="pribor_prd_n_2"] -self_modulate = Color(0, 0, 0, 0) layout_mode = 0 offset_left = 15.0 offset_top = -38.0 @@ -463,7 +680,6 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_prd_n_2"] -modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(40, -10) scale = Vector2(0.625, 0.625) @@ -474,9 +690,9 @@ script = ExtResource("11_u7tym") [node name="pribor_prd_k_2" type="TextureButton" parent="." groups=["pribor_buttons"]] editor_description = "Кнопка для выбора прибора." layout_mode = 0 -offset_left = 1435.0 +offset_left = 1440.0 offset_top = 515.0 -offset_right = 1512.0 +offset_right = 1517.0 offset_bottom = 631.0 size_flags_horizontal = 15 size_flags_vertical = 15 @@ -491,7 +707,6 @@ metadata/unit_name = ["уарэп-яу07-2к"] metadata/online_proc = "on_line_changed" [node name="label" type="Label" parent="pribor_prd_k_2"] -self_modulate = Color(0, 0, 0, 0) layout_mode = 0 offset_left = 17.0 offset_top = -38.0 @@ -517,7 +732,6 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_prd_k_2"] -modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(43, -10) scale = Vector2(0.625, 0.625) @@ -528,10 +742,10 @@ script = ExtResource("11_u7tym") [node name="pribor_prd_v_3" type="TextureButton" parent="." groups=["pribor_buttons"]] editor_description = "Кнопка для выбора прибора." layout_mode = 0 -offset_left = 1015.0 -offset_top = 865.0 -offset_right = 1092.0 -offset_bottom = 981.0 +offset_left = 1048.0 +offset_top = 802.0 +offset_right = 1125.0 +offset_bottom = 918.0 size_flags_horizontal = 15 size_flags_vertical = 15 toggle_mode = true @@ -545,7 +759,6 @@ metadata/unit_name = ["уарэп-яу07-3в"] metadata/online_proc = "on_line_changed" [node name="label" type="Label" parent="pribor_prd_v_3"] -self_modulate = Color(0, 0, 0, 0) layout_mode = 0 offset_left = 9.0 offset_top = -38.0 @@ -571,7 +784,6 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_prd_v_3"] -modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(34, -10) scale = Vector2(0.625, 0.625) @@ -582,10 +794,10 @@ script = ExtResource("11_u7tym") [node name="pribor_prd_n_3" type="TextureButton" parent="." groups=["pribor_buttons"]] editor_description = "Кнопка для выбора прибора." layout_mode = 0 -offset_left = 1290.0 -offset_top = 865.0 -offset_right = 1367.0 -offset_bottom = 981.0 +offset_left = 1323.0 +offset_top = 802.0 +offset_right = 1400.0 +offset_bottom = 918.0 size_flags_horizontal = 15 size_flags_vertical = 15 toggle_mode = true @@ -599,7 +811,6 @@ metadata/unit_name = ["уарэп-яу07-3н"] metadata/online_proc = "on_line_changed" [node name="label" type="Label" parent="pribor_prd_n_3"] -self_modulate = Color(0, 0, 0, 0) layout_mode = 0 offset_left = 8.0 offset_top = -38.0 @@ -625,7 +836,6 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_prd_n_3"] -modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(33, -10) scale = Vector2(0.625, 0.625) @@ -636,10 +846,10 @@ script = ExtResource("11_u7tym") [node name="pribor_prd_k_3" type="TextureButton" parent="." groups=["pribor_buttons"]] editor_description = "Кнопка для выбора прибора." layout_mode = 0 -offset_left = 1155.0 -offset_top = 865.0 -offset_right = 1232.0 -offset_bottom = 981.0 +offset_left = 1188.0 +offset_top = 802.0 +offset_right = 1265.0 +offset_bottom = 918.0 size_flags_horizontal = 15 size_flags_vertical = 15 toggle_mode = true @@ -653,7 +863,6 @@ metadata/unit_name = ["уарэп-яу07-3к"] metadata/online_proc = "on_line_changed" [node name="label" type="Label" parent="pribor_prd_k_3"] -self_modulate = Color(0, 0, 0, 0) layout_mode = 0 offset_left = 9.0 offset_top = -38.0 @@ -679,7 +888,6 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_prd_k_3"] -modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(35, -10) scale = Vector2(0.625, 0.625) @@ -690,10 +898,10 @@ script = ExtResource("11_u7tym") [node name="pribor_prd_v_1" type="TextureButton" parent="." groups=["pribor_buttons"]] editor_description = "Кнопка для выбора прибора." layout_mode = 0 -offset_left = 1295.0 -offset_top = 180.0 -offset_right = 1372.0 -offset_bottom = 296.0 +offset_left = 1328.0 +offset_top = 198.0 +offset_right = 1405.0 +offset_bottom = 314.0 size_flags_horizontal = 15 size_flags_vertical = 15 toggle_mode = true @@ -707,7 +915,6 @@ metadata/unit_name = ["уарэп-яу07-1в"] metadata/online_proc = "on_line_changed" [node name="label" type="Label" parent="pribor_prd_v_1"] -self_modulate = Color(0, 0, 0, 0) layout_mode = 0 offset_left = 8.0 offset_top = -38.0 @@ -733,7 +940,6 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_prd_v_1"] -modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(34, -10) scale = Vector2(0.625, 0.625) @@ -744,10 +950,10 @@ script = ExtResource("11_u7tym") [node name="pribor_prd_n_1" type="TextureButton" parent="." groups=["pribor_buttons"]] editor_description = "Кнопка для выбора прибора." layout_mode = 0 -offset_left = 1015.0 -offset_top = 175.0 -offset_right = 1092.0 -offset_bottom = 291.0 +offset_left = 1048.0 +offset_top = 193.0 +offset_right = 1125.0 +offset_bottom = 309.0 size_flags_horizontal = 15 size_flags_vertical = 15 toggle_mode = true @@ -761,7 +967,6 @@ metadata/online_proc = "on_line_changed" metadata/unit_name = ["уарэп-яу07-1н"] [node name="label" type="Label" parent="pribor_prd_n_1"] -self_modulate = Color(0, 0, 0, 0) layout_mode = 0 offset_left = 8.0 offset_top = -38.0 @@ -787,7 +992,6 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_prd_n_1"] -modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(35, -10) scale = Vector2(0.625, 0.625) @@ -798,10 +1002,10 @@ script = ExtResource("11_u7tym") [node name="pribor_prd_k_1" type="TextureButton" parent="." groups=["pribor_buttons"]] editor_description = "Кнопка для выбора прибора." layout_mode = 0 -offset_left = 1150.0 -offset_top = 175.0 -offset_right = 1227.0 -offset_bottom = 291.0 +offset_left = 1183.0 +offset_top = 193.0 +offset_right = 1260.0 +offset_bottom = 309.0 size_flags_horizontal = 15 size_flags_vertical = 15 toggle_mode = true @@ -815,7 +1019,6 @@ metadata/unit_name = ["уарэп-яу07-1к"] metadata/online_proc = "on_line_changed" [node name="label" type="Label" parent="pribor_prd_k_1"] -self_modulate = Color(0, 0, 0, 0) layout_mode = 0 offset_left = 9.0 offset_top = -38.0 @@ -841,7 +1044,6 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_prd_k_1"] -modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(35, -10) scale = Vector2(0.625, 0.625) @@ -852,9 +1054,9 @@ script = ExtResource("11_u7tym") [node name="pribor_prd_v_4" type="TextureButton" parent="." groups=["pribor_buttons"]] editor_description = "Кнопка для выбора прибора." layout_mode = 0 -offset_left = 890.0 +offset_left = 946.0 offset_top = 345.0 -offset_right = 967.0 +offset_right = 1023.0 offset_bottom = 461.0 size_flags_horizontal = 15 size_flags_vertical = 15 @@ -868,7 +1070,6 @@ metadata/unit_name = ["уарэп-яу07-4в"] metadata/online_proc = "on_line_changed" [node name="label" type="Label" parent="pribor_prd_v_4"] -self_modulate = Color(0, 0, 0, 0) layout_mode = 0 offset_left = 17.0 offset_top = -38.0 @@ -894,7 +1095,6 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_prd_v_4"] -modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(41, -10) scale = Vector2(0.625, 0.625) @@ -905,9 +1105,9 @@ script = ExtResource("11_u7tym") [node name="pribor_prd_n_4" type="TextureButton" parent="." groups=["pribor_buttons"]] editor_description = "Кнопка для выбора прибора." layout_mode = 0 -offset_left = 885.0 +offset_left = 941.0 offset_top = 685.0 -offset_right = 962.0 +offset_right = 1018.0 offset_bottom = 801.0 size_flags_horizontal = 15 size_flags_vertical = 15 @@ -921,7 +1121,6 @@ metadata/unit_name = ["уарэп-яу07-4н"] metadata/online_proc = "on_line_changed" [node name="label" type="Label" parent="pribor_prd_n_4"] -self_modulate = Color(0, 0, 0, 0) layout_mode = 0 offset_left = 14.0 offset_top = -38.0 @@ -947,7 +1146,6 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_prd_n_4"] -modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(40, -10) scale = Vector2(0.625, 0.625) @@ -958,9 +1156,9 @@ script = ExtResource("11_u7tym") [node name="pribor_prd_k_4" type="TextureButton" parent="." groups=["pribor_buttons"]] editor_description = "Кнопка для выбора прибора." layout_mode = 0 -offset_left = 890.0 +offset_left = 946.0 offset_top = 515.0 -offset_right = 967.0 +offset_right = 1023.0 offset_bottom = 631.0 size_flags_horizontal = 15 size_flags_vertical = 15 @@ -974,7 +1172,6 @@ metadata/unit_name = ["уарэп-яу07-4к"] metadata/online_proc = "on_line_changed" [node name="label" type="Label" parent="pribor_prd_k_4"] -self_modulate = Color(0, 0, 0, 0) layout_mode = 0 offset_left = 17.0 offset_top = -38.0 @@ -1000,7 +1197,6 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_prd_k_4"] -modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(42, -10) scale = Vector2(0.625, 0.625) @@ -1011,9 +1207,9 @@ script = ExtResource("11_u7tym") [node name="txr_legend0" type="TextureRect" parent="."] layout_mode = 0 offset_left = 219.0 -offset_top = 1135.0 +offset_top = 1141.0 offset_right = 443.0 -offset_bottom = 1359.0 +offset_bottom = 1365.0 scale = Vector2(0.1, 0.1) texture = ExtResource("7_6j01w") @@ -1021,9 +1217,9 @@ texture = ExtResource("7_6j01w") self_modulate = Color(1, 1, 1, 0.627451) layout_mode = 0 offset_left = 247.0 -offset_top = 1136.0 +offset_top = 1142.0 offset_right = 403.0 -offset_bottom = 1156.0 +offset_bottom = 1162.0 theme_override_font_sizes/font_size = 17 text = "Ожидание результата" @@ -1031,27 +1227,27 @@ text = "Ожидание результата" self_modulate = Color(1, 1, 1, 0.627451) layout_mode = 0 offset_left = 52.0 -offset_top = 1136.0 +offset_top = 1142.0 offset_right = 125.0 -offset_bottom = 1156.0 +offset_bottom = 1162.0 theme_override_font_sizes/font_size = 17 text = "Исправно" [node name="txr_legend1" type="TextureRect" parent="."] layout_mode = 0 offset_left = 26.0001 -offset_top = 1135.0 +offset_top = 1141.0 offset_right = 250.0 -offset_bottom = 1359.0 +offset_bottom = 1365.0 scale = Vector2(0.1, 0.1) texture = ExtResource("8_isjua") [node name="txr_legend2" type="TextureRect" parent="."] layout_mode = 0 offset_left = 476.0 -offset_top = 1135.0 +offset_top = 1141.0 offset_right = 700.0 -offset_bottom = 1359.0 +offset_bottom = 1365.0 scale = Vector2(0.1, 0.1) texture = ExtResource("9_ll0vs") @@ -1059,24 +1255,76 @@ texture = ExtResource("9_ll0vs") self_modulate = Color(1, 1, 1, 0.627451) layout_mode = 0 offset_left = 504.0 -offset_top = 1136.0 +offset_top = 1142.0 offset_right = 548.0 -offset_bottom = 1156.0 +offset_bottom = 1162.0 theme_override_font_sizes/font_size = 17 text = "Сбой" [node name="lbl_header" type="Label" parent="."] layout_mode = 0 -offset_left = 75.0 -offset_top = 15.0 -offset_right = 653.0 -offset_bottom = 43.0 +offset_left = 78.0 +offset_top = 27.0 +offset_right = 656.0 +offset_bottom = 58.0 theme_override_font_sizes/font_size = 22 text = "Контроль исправности прибора" horizontal_alignment = 1 vertical_alignment = 1 -[connection signal="toggled" from="externals" to="externals" method="_on_toggled"] +[node name="connect_legend0" type="AnimatedSprite2D" parent="."] +light_mask = 3 +position = Vector2(1219, 1151) +scale = Vector2(0.65, 0.65) +sprite_frames = SubResource("SpriteFrames_foasq") +frame_progress = 0.72355 +script = ExtResource("11_u7tym") + +[node name="Label" type="Label" parent="connect_legend0"] +offset_left = 36.9231 +offset_top = -15.3846 +offset_right = 103.923 +offset_bottom = 3.61538 +scale = Vector2(1.54, 1.54) +text = "Отключен" +metadata/_edit_use_anchors_ = true + +[node name="connect_legend1" type="AnimatedSprite2D" parent="."] +self_modulate = Color(0, 1, 0, 1) +light_mask = 3 +position = Vector2(975, 1152) +scale = Vector2(0.65, 0.65) +sprite_frames = SubResource("SpriteFrames_foasq") +frame = 1 +script = ExtResource("11_u7tym") + +[node name="Label" type="Label" parent="connect_legend1"] +offset_left = 36.9231 +offset_top = -13.8462 +offset_right = 99.9231 +offset_bottom = 5.15385 +scale = Vector2(1.54, 1.54) +text = "На связи" +metadata/_edit_use_anchors_ = true + +[node name="line0" type="Line2D" parent="."] +position = Vector2(936, 950) +points = PackedVector2Array(-8, 0, 608, 0) +width = 2.0 +default_color = Color(1, 1, 1, 0.352941) + +[node name="line1" type="Line2D" parent="."] +position = Vector2(936, 1128) +points = PackedVector2Array(-8, 0, 608, 0) +width = 2.0 +default_color = Color(1, 1, 1, 0.352941) + +[node name="line2" type="Line2D" parent="."] +position = Vector2(32, 1128) +points = PackedVector2Array(-8, 0, 608, 0) +width = 2.0 +default_color = Color(1, 1, 1, 0.352941) + [connection signal="toggled" from="pribor_uf" to="pribor_uf" method="_on_toggled"] [connection signal="toggled" from="pribor_rtr" to="pribor_rtr" method="_on_toggled"] [connection signal="toggled" from="pribor_afsp_1" to="pribor_afsp_1" method="_on_toggled"] diff --git a/scenes/контроль/элемент-я.gd.uid b/scenes/контроль/элемент-я.gd.uid index a3f3d5e..aeb87e0 100644 --- a/scenes/контроль/элемент-я.gd.uid +++ b/scenes/контроль/элемент-я.gd.uid @@ -1 +1 @@ -uid://cwurf51vh7ylm +uid://blnakmwyvinxm diff --git a/scenes/контроль/элемент-я.tscn b/scenes/контроль/элемент-я.tscn index 3ca3f7a..5f9719b 100644 --- a/scenes/контроль/элемент-я.tscn +++ b/scenes/контроль/элемент-я.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=12 format=3 uid="uid://btpc78gucr57f"] -[ext_resource type="Script" uid="uid://cwurf51vh7ylm" path="res://scenes/контроль/элемент-я.gd" id="1_fwxi0"] +[ext_resource type="Script" uid="uid://blnakmwyvinxm" path="res://scenes/контроль/элемент-я.gd" id="1_ajips"] [ext_resource type="Texture2D" uid="uid://c6nve6f8sfyj2" path="res://data/состояние-исправности-0.png" id="3_dktys"] [ext_resource type="Texture2D" uid="uid://dnreyfh3cd1k2" path="res://data/состояние-исправности-1.png" id="3_t4y6r"] [ext_resource type="Texture2D" uid="uid://c6booa8753u5t" path="res://data/состояние-исправности-2.png" id="4_bdhnj"] @@ -48,7 +48,7 @@ layout_mode = 3 anchors_preset = 0 offset_right = 180.0 offset_bottom = 155.0 -script = ExtResource("1_fwxi0") +script = ExtResource("1_ajips") textures = [ExtResource("3_dktys"), ExtResource("3_t4y6r"), ExtResource("4_bdhnj")] [node name="rect" type="NinePatchRect" parent="."] diff --git a/scenes/настройки/настройки.gd b/scenes/настройки/настройки.gd deleted file mode 100644 index dce0203..0000000 --- a/scenes/настройки/настройки.gd +++ /dev/null @@ -1,269 +0,0 @@ -class_name setting extends Panel - -const TableHeader = preload('res://table/header.tscn') -const TableToggle = preload('res://table/settings-toggle.tscn') -const TableEdit = preload('res://table/ячейка-2.tscn') - -const ALIGNMENT = [HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER] -const HEADER_ROW = [TableHeader, TableHeader] -const HEADER_ROW_TEXT = ['Параметр', 'Значение'] -const SETTING_TABLE = [ - ['Ограниченный режим', TableEdit, TableToggle, 'Ограничть возможности по постановке помех'], - ['Кнопка «ПД-М4»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «ПД-М2»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «ОЗП-1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «МЧМ-1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «ОРН-И1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «ОРН-М2»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «ЛЧМ-1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «ПД-М4С»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «ПД-ЧМ»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «СВ-И1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «К1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «СВ-М2»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «ОРН»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «JTIDS»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Кнопка «КУПД»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Внешнее управление', TableEdit, TableToggle, 'Передать управление в 5П28'], - ['Кнопка «Подавление»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], - ['Виртуальная клавиатура', TableEdit, TableToggle, 'Включить отображение экранной клавиатуры'], - ['Скрыть вкладку ЭМС 2', TableEdit, TableToggle, 'Отображать вкладку \"ЭМС-2\"'], - ['Текущая версия ПО УАРЭП', TableEdit, TableEdit, 'Время сборки, версия и номер фиксации'], - ['уарэп-яу07-частный', TableEdit, TableEdit, 'IP-адрес для получения частных сообщений от ЯУ-07'], - ['уарэп-яу07-общий', TableEdit, TableEdit, 'IP-адрес для получения широковещательных сообщений от ЯУ-07'], - ['уарэп-капсрпб', TableEdit, TableEdit, 'IP-адрес для связи с КАПС-РПБ'], - ['уарэп-эмс', TableEdit, TableEdit, 'IP-адрес для связи с ЭМС'], - ['уарэп-яу07-2в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 2'], - ['уарэп-яу07-2н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 2'], - ['уарэп-яу07-2к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 2'], - ['уарэп-яу07-4в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 4'], - ['уарэп-яу07-4н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 4'], - ['уарэп-яу07-4к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 4'], - ['уарэп-яу07-1в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 1'], - ['уарэп-яу07-1н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 1'], - ['уарэп-яу07-1к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 1'], - ['уарэп-яу07-3в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 3'], - ['уарэп-яу07-3н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 3'], - ['уарэп-яу07-3к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 3'], - ['уарэп-5п28', TableEdit, TableEdit, 'IP-адрес для связи с 5П28'], - ['навигация', TableEdit, TableEdit, 'Порт назначения для получения данных от АКНГ'], - ['уарэп-щ3', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором Щ3'], - ['уарэп-спт25-1', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором СПТ-25 1'], - ['уарэп-спт25-2', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором СПТ-25 2'], - ['Шаблон адреса сервера карт', TableEdit, TableEdit, 'Шаблон URL-адреса сервера карт, должен содержать поля \"{x}\", \"{y}\", \"{z}\" для подстановки индекса плитки'], - ['Адрес АФСП левого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора АФСП'], - ['Адрес АФСП правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора АФСП'], - ['Адрес БПО левого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'], - ['Адрес БПО правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'] ] - -const EXTERNAL_CU = 16 ## Внешнее целееуказание -const SUPPRESS = 17 ## Строка - Подавление -const KEYBOARD = 18 ## Строка - Виртуальная клавиатура -const HIDE_EMS2 = 19 ## Строка - Скрыть вкладку ЭМС 2 -const COMMIT = 20 ## Строка - Версия УАРЭП - -var name_to_line_index: = {} ## Для преобразования названия параметра в номер строки - -func on_checkbutton_pressed(i_row: int): on_row_pressed(i_row) - - -## Вызывается, когда узел впервые попадает в дерево сцены. -func _ready() -> void: - setting_tab() - if not OS.get_cmdline_args().has('++ограниченный'): - return - $Label2.text = 'Текущий режим доступа: ограниченный' - for node in $GridContainer.get_children().filter(func(b): return b is Button): - node.disabled = true - - -func on_external_cu_btn_pressed(btn) -> void: - var state = btn.button_pressed - ProjectSettings.set_setting('application/config/Внешнее управление', state) - if state: - signaller.emit_signal('interfer_off_all') - - -func on_vk_pressed(btn) -> void: - var state = btn.button_pressed - signaller.emit_signal('kb_pressed', state) - - -func on_ems2_pressed(btn) -> void: - var state = btn.button_pressed - signaller.emit_signal('ems2_hide_pressed', state) - - -func on_row_pressed(i_row: int): - $scroll_set/table.clear_rows_selected() - $scroll_set/table.set_row_selected(i_row, true) - - -func parse_cmd_line_args(settings_data: Dictionary): - var args = OS.get_cmdline_args() - for i in range(0, args.size(), 2): - var key: String = args[i] - key = key.lstrip('\'\" ').rstrip('\'\" ').strip_edges().strip_escapes() - if not settings_data.has(key): - continue - if not ((i + 1) < args.size()): - push_error('для аргумента \"%s\" не указано значение.' % key) - break - var val0 = args[i + 1] - var val1 = settings_data[key] - val0 = val0.lstrip('\'\" ').rstrip('\'\" ').strip_edges().strip_escapes() - if typeof(val1) == TYPE_BOOL: - if val0 not in ['yes', 'true', 'да', 'no', 'false', 'нет']: - push_error('для аргумента \"%s\" указано неверное значение \"%s\".' % [key, val0]) - break - settings_data[key] = true if val0 in ['yes', 'true', 'да'] else false - elif typeof(val1) == TYPE_ARRAY: - var val0s = val0.split(',') - if val0s.size() != val1.size(): - push_error('для аргумента \"%s\" указано неверное значение \"%s\" (исходное: \"%s\").' % [key, val0, val1]) - break - for j in val0s.size(): - var val: String = val0s[j] - val = val.lstrip('\'\" ').rstrip('\'\" ').strip_edges().strip_escapes() - if tools.type_is_num(val): - val0s[j] = int(val) - elif val in ['true', 'false']: - val0s[j] = true if val == 'true' else false - else: - val0s[j] = val - elif typeof(val1) == TYPE_STRING: - settings_data[key] = val0 - - -## Загружает настройки из файла -func load_settings(settings_data: Dictionary): - var settings_file = settings.get_settings_file_path() - var file = FileAccess.open(settings_file, FileAccess.READ) - var abs_path = ProjectSettings.globalize_path(settings_file) - if file: - var read = file.get_as_text() - file.close() - var json_conv = JSON.new() - if json_conv.parse(read) == OK: - settings_data.merge(json_conv.get_data()) - else: - log.warning('Не удалось разобрать \"%s\", будут использованы настройки по умолчанию' % abs_path) - else: - log.warning('Файл \"%s\" не найден, будут использованы настройки по умолчанию' % abs_path) - - -func setting_tab(): - $heard_table.set_header(HEADER_ROW) - $heard_table.set_header_text(HEADER_ROW_TEXT) - $heard_table.set_columns_min_size([600, 950]) - $heard_table.set_columns_alignments(ALIGNMENT) - var settings_data = {} - load_settings(settings_data) - parse_cmd_line_args(settings_data) - for key in settings_data: - ProjectSettings.set_setting('application/config/%s' % key, settings_data[key]) - for i in SETTING_TABLE.size(): - var tbl_row = SETTING_TABLE[i] - var param_name = tbl_row[0] - var node_label = tbl_row[1] - var node_value = tbl_row[2] - var tootip_text = tbl_row[3] - name_to_line_index[param_name] = i - $scroll_set/table.add_row([node_label, node_value]) - var label_instance = $scroll_set/table.get_node2(0, i) - label_instance.text = param_name - label_instance.tooltip_text = tootip_text - $scroll_set/table.set_node_editable(0, i, false) - var node_values = $scroll_set/table.get_node2(1, i).get_children() - var edit_node = $scroll_set/table.get_node2(1, i) - if node_values.size(): - var child = node_values[0] - if child is CheckButton: - child.connect('pressed', Callable(self, 'on_checkbutton_pressed').bind(i)) - var val = settings_data[param_name] if settings_data.has(param_name) else false - child.set_pressed(val) - else: - if settings_data.has(param_name): - var val = settings_data[param_name] - if typeof(val) == TYPE_STRING: - $scroll_set/table.get_node2(1, i).text = settings_data[param_name] - if edit_node: - if edit_node is LineEdit: - $scroll_set/table.set_node_control(1, i, true) - $scroll_set/table.set_node_editable(1, COMMIT, false) - $scroll_set/table.set_columns_min_size([600, 950]) - $scroll_set/table.set_columns_alignments(ALIGNMENT) - $scroll_set/table.connect('row_pressed', Callable(self, 'on_row_pressed')) - var commit_instance = $scroll_set/table.get_node2(1, COMMIT) - commit_instance.text = '%s' % commit.VCS_HEAD - for i in SETTING_TABLE.size(): - var param_name = SETTING_TABLE[i][0] - if not settings.UnitProfiles.has(param_name): - continue - var unit_data = settings.UnitProfiles[param_name] - var profile = $scroll_set/table.get_node2(1, i) - var joined_data = '' - for j in unit_data[2].size(): - joined_data += str(unit_data[2][j]) - if j < unit_data[2].size() - 1: - joined_data += ',' - profile.text = '%s : %s' % [str(unit_data[1]), joined_data] - button_settings() - - -func button_settings(): - var extern_cu_node = $scroll_set/table.get_node2(1, EXTERNAL_CU).get_children()[0] - extern_cu_node.connect('pressed', on_external_cu_btn_pressed.bind(extern_cu_node)) - on_external_cu_btn_pressed(extern_cu_node) - var vk_node = $scroll_set/table.get_node2(1, KEYBOARD).get_children()[0] - vk_node.connect('pressed', on_vk_pressed.bind(vk_node)) - var ems2_hide_node = $scroll_set/table.get_node2(1, HIDE_EMS2).get_children()[0] - ems2_hide_node.connect('pressed', on_ems2_pressed.bind(ems2_hide_node)) - ems2_hide_node.set_pressed(true) - on_ems2_pressed(ems2_hide_node) - - -func _on_btn_save_settings_pressed(): - var json_data = {} - for i in SETTING_TABLE.size(): - var parameter = SETTING_TABLE[i][0] - if parameter in settings.UnitProfiles: - var profiles = $scroll_set/table.get_node2(1, i) - var value = profiles.get_text() - if parameter not in json_data: - json_data[parameter] = [] - if value.find(':') != -1: - var parts = value.split(':') - var ip = parts[0].strip_edges() - var ports = parts[1].split(',') - json_data[parameter].append(ip) - for port in ports: - if port == 'true': - json_data[parameter].append(true) - elif port == 'false': - json_data[parameter].append(false) - else: - port = port.strip_edges() - if port.is_valid_int(): - port = int(port) - json_data[parameter].append(port) - else: - var children = $scroll_set/table.get_node2(1, i).get_children() - if len(children): - var child = children[0] - json_data[parameter] = child.is_pressed() - else: - var row = $scroll_set/table.get_row(i) - json_data[parameter] = row[1].text - for key in json_data: - ProjectSettings.set_setting('application/config/%s' % key, json_data[key]) - var settings_file = settings.get_settings_file_path() - var file = FileAccess.open(settings_file, FileAccess.WRITE) - var abs_path = ProjectSettings.globalize_path(settings_file) - if not file: - log.error('Не удалось открыть файл для записи \"%s\"' % abs_path) - return - var json_string = JSON.stringify(json_data, ' ', true) - if file.store_string(json_string): - log.info('Настройки сохранены в файл \"%s\"' % abs_path) - file.close() diff --git a/scenes/настройки/настройки.gd.uid b/scenes/настройки/настройки.gd.uid deleted file mode 100644 index eceb337..0000000 --- a/scenes/настройки/настройки.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://deq4pmm4iy6ip diff --git a/scenes/настройки/настройки.tscn b/scenes/настройки/настройки.tscn index 8949ebd..b69067f 100644 --- a/scenes/настройки/настройки.tscn +++ b/scenes/настройки/настройки.tscn @@ -1,9 +1,266 @@ [gd_scene load_steps=7 format=3 uid="uid://bnptm4rlp60dq"] -[ext_resource type="Script" uid="uid://deq4pmm4iy6ip" path="res://scenes/настройки/настройки.gd" id="1_2l3rd"] [ext_resource type="Script" uid="uid://c5pq0hbrij34d" path="res://table/table.gd" id="2_6sx73"] [ext_resource type="Texture2D" uid="uid://csnts8f155sf7" path="res://data/save1.png" id="3_dbpks"] +[sub_resource type="GDScript" id="GDScript_fc87o"] +script/source = "class_name configure extends Panel + +const TableHeader = preload('res://table/header.tscn') +const TableToggle = preload('res://table/settings-toggle.tscn') +const TableEdit = preload('res://table/ячейка-2.tscn') + +const ALIGNMENT = [HORIZONTAL_ALIGNMENT_CENTER, HORIZONTAL_ALIGNMENT_CENTER] +const HEADER_ROW = [TableHeader, TableHeader] +const HEADER_ROW_TEXT = ['Параметр', 'Значение'] +const SETTING_TABLE = [ + ['Ограниченный режим', TableEdit, TableToggle, 'Ограничть возможности по постановке помех'], + ['Кнопка «ПД-М4»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «ПД-М2»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «ОЗП-1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «МЧМ-1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «ОРН-И1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «ОРН-М2»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «ЛЧМ-1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «ПД-М4С»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «ПД-ЧМ»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «СВ-И1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «К1»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «СВ-М2»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «ОРН»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «JTIDS»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Кнопка «КУПД»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Внешнее управление', TableEdit, TableToggle, 'Передать управление в 5П28'], + ['Кнопка «Подавление»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], + ['Виртуальная клавиатура', TableEdit, TableToggle, 'Включить отображение экранной клавиатуры'], + ['Скрыть вкладку ЭМС 2', TableEdit, TableToggle, 'Отображать вкладку \\\"ЭМС-2\\\"'], + ['Текущая версия ПО УАРЭП', TableEdit, TableEdit, 'Время сборки, версия и номер фиксации'], + ['уарэп-яу07-частный', TableEdit, TableEdit, 'IP-адрес для получения частных сообщений от ЯУ-07'], + ['уарэп-яу07-общий', TableEdit, TableEdit, 'IP-адрес для получения широковещательных сообщений от ЯУ-07'], + ['уарэп-капсрпб', TableEdit, TableEdit, 'IP-адрес для связи с КАПС-РПБ'], + ['уарэп-эмс', TableEdit, TableEdit, 'IP-адрес для связи с ЭМС'], + ['уарэп-яу07-2в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 2'], + ['уарэп-яу07-2н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 2'], + ['уарэп-яу07-2к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 2'], + ['уарэп-яу07-4в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 4'], + ['уарэп-яу07-4н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 4'], + ['уарэп-яу07-4к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 4'], + ['уарэп-яу07-1в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 1'], + ['уарэп-яу07-1н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 1'], + ['уарэп-яу07-1к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 1'], + ['уарэп-яу07-3в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 3'], + ['уарэп-яу07-3н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 3'], + ['уарэп-яу07-3к', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-К 3'], + ['уарэп-5п28', TableEdit, TableEdit, 'IP-адрес для связи с 5П28'], + ['навигация', TableEdit, TableEdit, 'Порт назначения для получения данных от АКНГ'], + ['уарэп-щ3', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором Щ3'], + ['уарэп-спт25-1', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором СПТ-25 1'], + ['уарэп-спт25-2', TableEdit, TableEdit, 'Путь к UART-устройству для связи с прибором СПТ-25 2'], + ['Шаблон адреса сервера карт', TableEdit, TableEdit, 'Шаблон URL-адреса сервера карт, должен содержать поля \\\"{x}\\\", \\\"{y}\\\", \\\"{z}\\\" для подстановки индекса плитки'], + ['Адрес АФСП левого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора АФСП'], + ['Адрес АФСП правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора АФСП'], + ['Адрес БПО левого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'], + ['Адрес БПО правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'] ] + +const EXTERNAL_CU = 16 ## Внешнее целеуказание +const SUPPRESS = 17 ## Строка - Подавление +const KEYBOARD = 18 ## Строка - Виртуальная клавиатура +const HIDE_EMS2 = 19 ## Строка - Скрыть вкладку ЭМС 2 +const COMMIT = 20 ## Строка - Версия УАРЭП + +var name_to_line_index: = {} ## Для преобразования названия параметра в номер строки + +func on_checkbutton_pressed(i_row: int): on_row_pressed(i_row) + + +## Вызывается, когда узел впервые попадает в дерево сцены. +func _ready() -> void: + setting_tab() + if not OS.get_cmdline_args().has('++ограниченный'): + return + $Label2.text = 'Текущий режим доступа: ограниченный' + for node in $GridContainer.get_children().filter(func(b): return b is Button): + node.disabled = true + + +func on_external_cu_btn_pressed(btn) -> void: + var state = btn.button_pressed + ProjectSettings.set_setting('application/config/Внешнее управление', state) + if state: + signaller.emit_signal('interfer_off_all') + + +func on_vk_pressed(btn) -> void: + var state = btn.button_pressed + signaller.emit_signal('kb_pressed', state) + + +func on_ems2_pressed(btn) -> void: + var state = btn.button_pressed + signaller.emit_signal('ems2_hide_pressed', state) + + +func on_row_pressed(i_row: int): + $scroll_set/table.clear_rows_selected() + $scroll_set/table.set_row_selected(i_row, true) + + +func parse_cmd_line_args(settings_data: Dictionary): + var args = OS.get_cmdline_args() + for i in range(0, args.size(), 2): + var key: String = args[i] + key = key.lstrip('\\'\\\" ').rstrip('\\'\\\" ').strip_edges().strip_escapes() + if not settings_data.has(key): + continue + if not ((i + 1) < args.size()): + push_error('для аргумента \\\"%s\\\" не указано значение.' % key) + break + var val0 = args[i + 1] + var val1 = settings_data[key] + val0 = val0.lstrip('\\'\\\" ').rstrip('\\'\\\" ').strip_edges().strip_escapes() + if typeof(val1) == TYPE_BOOL: + if val0 not in ['yes', 'true', 'да', 'no', 'false', 'нет']: + push_error('для аргумента \\\"%s\\\" указано неверное значение \\\"%s\\\".' % [key, val0]) + break + settings_data[key] = true if val0 in ['yes', 'true', 'да'] else false + elif typeof(val1) == TYPE_ARRAY: + var val0s = val0.split(',') + if val0s.size() != val1.size(): + push_error('для аргумента \\\"%s\\\" указано неверное значение \\\"%s\\\" (исходное: \\\"%s\\\").' % [key, val0, val1]) + break + for j in val0s.size(): + var val: String = val0s[j] + val = val.lstrip('\\'\\\" ').rstrip('\\'\\\" ').strip_edges().strip_escapes() + if tools.type_is_num(val): + val0s[j] = int(val) + elif val in ['true', 'false']: + val0s[j] = true if val == 'true' else false + else: + val0s[j] = val + elif typeof(val1) == TYPE_STRING: + settings_data[key] = val0 + + +func setting_tab(): + $heard_table.set_header(HEADER_ROW) + $heard_table.set_header_text(HEADER_ROW_TEXT) + $heard_table.set_columns_min_size([600, 950]) + $heard_table.set_columns_alignments(ALIGNMENT) + var settings_data = {} + parse_cmd_line_args(settings_data) + for key in settings_data: + ProjectSettings.set_setting('application/config/%s' % key, settings_data[key]) + for i in SETTING_TABLE.size(): + var tbl_row = SETTING_TABLE[i] + var param_name = tbl_row[0] + var node_label = tbl_row[1] + var node_value = tbl_row[2] + var tootip_text = tbl_row[3] + name_to_line_index[param_name] = i + $scroll_set/table.add_row([node_label, node_value]) + var label_instance = $scroll_set/table.get_node2(0, i) + label_instance.text = param_name + label_instance.tooltip_text = tootip_text + $scroll_set/table.set_node_editable(0, i, false) + var node_values = $scroll_set/table.get_node2(1, i).get_children() + var edit_node = $scroll_set/table.get_node2(1, i) + if node_values.size(): + var child = node_values[0] + if child is CheckButton: + child.connect('pressed', Callable(self, 'on_checkbutton_pressed').bind(i)) + var val = settings_data[param_name] if settings_data.has(param_name) else false + child.set_pressed(val) + else: + if settings_data.has(param_name): + var val = settings_data[param_name] + if typeof(val) == TYPE_STRING: + $scroll_set/table.get_node2(1, i).text = settings_data[param_name] + if edit_node: + if edit_node is LineEdit: + $scroll_set/table.set_node_control(1, i, true) + $scroll_set/table.set_node_editable(1, COMMIT, false) + $scroll_set/table.set_columns_min_size([600, 950]) + $scroll_set/table.set_columns_alignments(ALIGNMENT) + $scroll_set/table.connect('row_pressed', Callable(self, 'on_row_pressed')) + var commit_instance = $scroll_set/table.get_node2(1, COMMIT) + commit_instance.text = '%s' % commit.VCS_HEAD + for i in SETTING_TABLE.size(): + var param_name = SETTING_TABLE[i][0] + var profile = $scroll_set/table.get_node2(1, i) + if settings.UnitProfiles.has(param_name): + var unit_data = settings.UnitProfiles[param_name][1] + profile.text = '' + for val in unit_data: + profile.text += str(val) + ',' + profile.text = profile.text.trim_suffix(',') + continue + var psk = 'application/config/%s' % param_name + if ProjectSettings.has_setting(psk): + var unit_data = ProjectSettings.get_setting(psk) + if is_instance_of(unit_data, TYPE_STRING): + profile.text = unit_data + button_settings() + + +func button_settings(): + var extern_cu_node = $scroll_set/table.get_node2(1, EXTERNAL_CU).get_children()[0] + extern_cu_node.connect('pressed', on_external_cu_btn_pressed.bind(extern_cu_node)) + on_external_cu_btn_pressed(extern_cu_node) + var vk_node = $scroll_set/table.get_node2(1, KEYBOARD).get_children()[0] + vk_node.connect('pressed', on_vk_pressed.bind(vk_node)) + var ems2_hide_node = $scroll_set/table.get_node2(1, HIDE_EMS2).get_children()[0] + ems2_hide_node.connect('pressed', on_ems2_pressed.bind(ems2_hide_node)) + ems2_hide_node.set_pressed(true) + on_ems2_pressed(ems2_hide_node) + + +func _on_btn_save_settings_pressed(): + var json_data = {} + for i in SETTING_TABLE.size(): + var parameter = SETTING_TABLE[i][0] + if parameter in settings.UnitProfiles: + var ref_profile = settings.UnitProfiles[parameter][1] + var profiles = $scroll_set/table.get_node2(1, i) + var value = profiles.get_text() + if parameter not in json_data: + var row: = [] + for token in value.split(','): + var j: = row.size() + if token.is_valid_int(): + token = int(token) + elif token == 'false': + token = false + elif token == 'true': + token = true + if typeof(ref_profile[j]) == typeof(token): + row.append(token) + else: + # TODO: Это надо вывести на экран пользователю + push_error([parameter, j, type_string(typeof(ref_profile[j])), type_string(typeof(token))]) + row.append(ref_profile[j]) + json_data[parameter] = row + else: + var children = $scroll_set/table.get_node2(1, i).get_children() + if len(children): + var child = children[0] + json_data[parameter] = child.is_pressed() + else: + var row = $scroll_set/table.get_row(i) + json_data[parameter] = row[1].text + for key in json_data: + ProjectSettings.set_setting('application/config/%s' % key, json_data[key]) + var settings_file: = settings.get_settings_file_path() + var file: = FileAccess.open(settings_file, FileAccess.WRITE) + var abs_path: = ProjectSettings.globalize_path(settings_file) + if not file: + log.error('Не удалось открыть файл для записи \\\"%s\\\"' % abs_path) + return + var json_string: = JSON.stringify(json_data, ' ', true) + if file.store_string(json_string): + log.info('Настройки сохранены в файл \\\"%s\\\"' % abs_path) + file.close() +" + [sub_resource type="StyleBoxTexture" id="StyleBoxTexture_pyq6h"] texture = ExtResource("3_dbpks") modulate_color = Color(0.8, 0.533333, 0.27451, 1) @@ -18,7 +275,7 @@ modulate_color = Color(0.8, 0.533333, 0.27451, 1) texture = ExtResource("3_dbpks") [node name="Настройки" type="Panel"] -script = ExtResource("1_2l3rd") +script = SubResource("GDScript_fc87o") [node name="heard_table" type="GridContainer" parent="."] layout_mode = 0 @@ -39,7 +296,7 @@ offset_bottom = 988.0 layout_mode = 2 script = ExtResource("2_6sx73") -[node name="btn_save_settings" type="Button" parent="."] +[node name="btn_save" type="Button" parent="."] layout_mode = 0 offset_left = 1523.0 offset_top = 1057.0 @@ -55,4 +312,4 @@ theme_override_styles/hover = SubResource("StyleBoxTexture_pyq6h") theme_override_styles/pressed = SubResource("StyleBoxTexture_l5g3r") theme_override_styles/normal = SubResource("StyleBoxTexture_tbxk6") -[connection signal="pressed" from="btn_save_settings" to="." method="_on_btn_save_settings_pressed"] +[connection signal="pressed" from="btn_save" to="." method="_on_btn_save_settings_pressed"] diff --git a/scripts/capsrpb.gd b/scripts/capsrpb.gd index 31f2ec1..d889997 100644 --- a/scripts/capsrpb.gd +++ b/scripts/capsrpb.gd @@ -14,6 +14,7 @@ class CapsRpb extends unit.Unit: var json_dic: Dictionary var tick: = 0 ## Тик время последнего обновления, мс. var tx_stack: Array ## Массив пакетов для отправки. + var source_addr: Array ## Адрес отправителя данных func _to_string() -> String: return String('CapsRpb(\"%s\")' % self.name) func _init(nm): self.name = nm @@ -23,7 +24,7 @@ class CapsRpb extends unit.Unit: if not online: online = true emit_signal('line_changed', self) - var utf8_data = data.get_string_from_utf8() + var utf8_data: = data.get_string_from_utf8() if Error.OK == json_conv.parse(utf8_data): json_dic.merge(json_conv.get_data(), true) emit_signal('data_received', self) diff --git a/scripts/interfer.gd b/scripts/interfer.gd index 2b6b311..b7d6881 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -249,6 +249,9 @@ func on_data_capsrpb_received(unit0: capsrpb.CapsRpb, ecms: Dictionary) -> void: if not (dic_msvk is Dictionary): continue if dic_msvk.has('ispp'): var ispp = int(dic_msvk['ispp']) + var errmsg = dic_msvk.get('errmsg', '') + if errmsg: + log.error('сеанс %d: \"%s\"' % [ispp, errmsg]) if ecms.has(ispp): var ecm = ecms[ispp] ecm.set_from_dic(dic_msvk) diff --git a/scripts/network.gd b/scripts/network.gd index 7028487..31f1957 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -1,23 +1,74 @@ class_name Network extends Node -const UDPTX_PROTO: = {'yau07tx': yau07.YaU07} -const UDPJSON_PROTO: = {'json-capsrpb': capsrpb.CapsRpb} +const YAU07_PROTO: = {'yau07tx': yau07.YaU07} +const UDP_PROTO: = {'capsrpb': capsrpb.CapsRpb, 'trassa': trassa.Trassa} const TCP_PROTO: = {'5p28': tcp5p28.TCP5P28} -const SERIAL_PROTO: = {'uart': spt25.SPT25} +const SERIAL_PROTO: = {'spt25': spt25.SPT25} const MODBUS_PROTO: = {'mbcs': sch3.Sch3} -const UDPRX_PROTO: = {'udprx': navi.NaviSource} +const NAVI_PROTO: = {'navi': navi.NaviSource} var tick: int = 0 -class Serial extends SerialPort: - func send_to(data: PackedByteArray): return write_raw(data) +class SocketSerial extends SerialPort: + const P_DIV: = 0x8408 + const FLAG: = 0x7e + const FLAG_MASK: = 0x20 + const FSC_MASK: = 0x8000 + const parity_code = { + 'N': SerialPort.PARITY_NONE, + 'E': SerialPort.PARITY_EVEN, + 'O': SerialPort.PARITY_ODD } + + var tx_buffer: PackedByteArray + + func _init() -> void: + tx_buffer.resize(256) + + func send_to(data: PackedByteArray): + tx_buffer[0] = 0x7e + var i: = 1 + for v in data: + if v != 0x7e: + tx_buffer[i] = v + i += 1 + else: + tx_buffer[i] = FLAG + i += 1 + tx_buffer[i] = FLAG ^ FLAG_MASK + i += 1 + var v_sum: = get_check_sum(data) + tx_buffer.encode_u16(i, v_sum) + i += 2 + tx_buffer[i] = FLAG + i += 1 + # Эта последовательность для запроса состояния, получена от разработчиков СПТ-25 + const tx_tula = [0x7e, 0x01, 0x04, 0xbb, 0x50, 0x7e] + write_raw(tx_tula) + func _to_string() -> String: return 'последовательный порт \"%s\" @ %d (%s)' % [self.port, self.baudrate, 'открыт' if is_open() else 'закрыт'] + func get_check_sum(src: PackedByteArray) -> int: + var fcs: = (~((src[1] << 8) + src[0])) & 0xffff + for i: int in range(2, src.size()): + var chr: = src[i] + for j: int in 8: + if chr & 1: + if fcs & 1: + fcs = ((fcs >> 1) | FSC_MASK) ^ P_DIV + else: + fcs = ((fcs >> 1) | FSC_MASK) + else: + fcs = (fcs >> 1) ^ P_DIV if fcs & 1 else fcs >> 1 + chr >>= 1 + for j: int in 16: + fcs = (fcs >> 1) ^ P_DIV if fcs & 1 else fcs >> 1 + return (~fcs) & 0xffff + func try_open(parsing_proc: Callable): if is_open(): return Error.OK - var rc = open(port) + var rc: = open(port) if rc == Error.OK: data_received.connect(parsing_proc) start_monitoring(timeout) @@ -63,17 +114,15 @@ class SocketTCP extends TCPServer: var poll_sockets: Array[SocketUDP] ## Сокеты для непрерывного опроса наличия новых данных var tcp_sockets: Array[Array] ## Сокеты для TCP-соединений var units: Dictionary[StringName, unit.Unit] ## Экземпляры всех сетевых устройств -var units_udp: Dictionary[StringName, unit.Unit] ## Экземпляры устройств с udp-соединением которым нужно передавать данные +var units_udptx: Dictionary[StringName, unit.Unit] ## Экземпляры устройств с udp-соединением которым нужно передавать данные var units_udprx: Dictionary[StringName, unit.Unit] ## Экземпляры устройств с udp-соединением от которых приходят данные var units_tcp: Dictionary[StringName, unit.Unit] ## Экземпляры устройств с tcp-соединением var units_serial: Dictionary[StringName, unit.Unit] ## Экземпляры устройств с uart-соединением var units_modbus: Dictionary[StringName, unit.Unit] ## Экземпляры устройств с modbusserial-соединением -var serials: Dictionary[StringName, Serial] ## Последовательные порты (uart) +var serials: Dictionary[StringName, SocketSerial] ## Последовательные порты (uart) var dst_ports: Dictionary[StringName, int] ## Преобразование имя устройства в порт назначения var dst_addrs: Dictionary[StringName, StringName] ## Преобразование имя устройства в адрес назначения -var unit_keys: Dictionary[int, StringName] ## Преобразование порта назначения в имя устройства -var sock_unicast: SocketUDP ## Сокет для приёма широковещательных сообщений от ЯУ-07 -var sock_capsrpb: SocketUDP ## Сокет для приёма сообщений от КАСПРПБ +var port_to_unit_name: Dictionary[int, StringName] ## Преобразование порта назначения в имя устройства var logger_page: Node ## Ссылка на журнал работы var send_sockets: Dictionary[StringName, SocketUDP] ## Таблица <имяустройста>: <сокет> для отправки сообщений var addr_port_to_unit_name: Dictionary[StringName, StringName] ## Преобразование адрес:порт в имя устройства @@ -84,22 +133,41 @@ func on_serial_data(data, unit): unit.parse(data, tick) ## [param unit_name] - Уникальное имя устройства[br] func create_socket_udp(unit_name: StringName) -> SocketUDP: - var addr = settings.UnitProfiles[unit_name][1] - var port = settings.UnitProfiles[unit_name][2][0] - var broad = settings.UnitProfiles[unit_name][3] - var bind = settings.UnitProfiles[unit_name][4] + var st = settings.UnitProfiles[unit_name][1] + var addr = st[0] + var port = st[1] + var broad = st[2] + var bind = st[3] var sock: = SocketUDP.new() sock.set_broadcast_enabled(broad) - var rc = Error.OK if not bind else sock.bind(port, addr) - var errlevel = log.INFO if rc == Error.OK else log.ERROR - log.message(errlevel, '\"%s\" привязан к %s:%d? - %s, результат: %s' % [unit_name, addr, port, ['нет', 'да'][int(bind)], error_string(rc)]) + var rc: = sock.bind(port, addr) + if rc == Error.OK: + log.info('\"%s\" привязан к %s:%d' % [unit_name, addr, port]) + else: + var errmsg: = error_string(rc) + log.error('привязка \"%s\" к %s:%d не удалась: \"%s\"' % [unit_name, addr, port, errmsg]) + return sock + + +func create_socket_caps(unit_name: StringName) -> SocketUDP: + var st = settings.UnitProfiles[unit_name][1] + var addr = st[0] + var port = st[1] + var sock: = SocketUDP.new() + var rc: = sock.bind(port, addr) + if rc == Error.OK: + log.info('\"%s\" привязан к %s:%d' % [unit_name, addr, port]) + else: + var errmsg = error_string(rc) + log.error('привязка \"%s\" к %s:%d не удалась: \"%s\"' % [unit_name, addr, port, errmsg]) return sock ## [param unit_name] - Уникальное имя устройства[br] func create_socket_tcp(unit_name: StringName) -> SocketTCP: - var addr = settings.UnitProfiles[unit_name][1] - var port = settings.UnitProfiles[unit_name][2][0] + var st = settings.UnitProfiles[unit_name][1] + var addr = st[0] + var port = st[1] var sock: = SocketTCP.new() sock.unit_name = unit_name var rc: = sock.listen(port, addr) @@ -111,13 +179,15 @@ func create_socket_tcp(unit_name: StringName) -> SocketTCP: ## [param unit_name] - Уникальное имя устройства[br] -func create_serial(unit_name: StringName) -> Serial: - var port = settings.UnitProfiles[unit_name][1] - var baud = settings.UnitProfiles[unit_name][2][0] - var serial: = Serial.new() - serial.port = port - serial.baudrate = baud +func create_serial(unit_name: StringName) -> SocketSerial: + var st = settings.UnitProfiles[unit_name][1] + var serial: = SocketSerial.new() + serial.port = st[0] + serial.baudrate = st[2] + serial.parity = SocketSerial.parity_code.get(st[3], SocketSerial.PARITY_NONE) serial.timeout = 20000 + serial.bytesize = st[4] + serial.stopbits = st[5] return serial @@ -128,16 +198,16 @@ func create_modbus(unit_name: StringName) -> sch_3.Sch3: func _ready() -> void: - poll_sockets.append(create_socket_udp('уарэп-яу07-частный')) - poll_sockets.append(create_socket_udp('уарэп-яу07-общий')) - poll_sockets.append(create_socket_udp('уарэп-капсрпб')) - poll_sockets.append(create_socket_udp('навигация')) - sock_unicast = poll_sockets[0] - sock_capsrpb = poll_sockets[2] - + var sock_unicast: = create_socket_udp('уарэп-яу07-частный') + var sock_broadcast: = create_socket_udp('уарэп-яу07-общий') + var sock_navi: = create_socket_udp('навигация') + var sock_caps: = create_socket_caps('уарэп-капсрпб') + var sock_trassa: = create_socket_caps('уарэп-трасса') + poll_sockets = [sock_unicast, sock_broadcast, sock_caps, sock_navi, sock_trassa] send_sockets['уарэп-яу07-частный'] = sock_unicast - send_sockets['уарэп-яу07-общий'] = poll_sockets[1] - send_sockets['уарэп-капсрпб'] = sock_capsrpb + send_sockets['уарэп-яу07-общий'] = sock_broadcast + send_sockets['уарэп-капсрпб'] = sock_caps + send_sockets['уарэп-трасса'] = sock_trassa send_sockets['уарэп-эмс'] = sock_unicast send_sockets['уарэп-яу07-2в'] = sock_unicast send_sockets['уарэп-яу07-2н'] = sock_unicast @@ -156,28 +226,30 @@ func _ready() -> void: var bind_modbuses: = [] for unit_name in settings.UnitProfiles: - var unit_profile = settings.UnitProfiles[unit_name] - var proto = unit_profile[0] + var unit_profile = settings.UnitProfiles[unit_name][1] + var proto = settings.UnitProfiles[unit_name][0] - if proto in UDPRX_PROTO: - var new_unit = UDPRX_PROTO[proto].new(unit_name) + if proto in NAVI_PROTO: + var new_unit = NAVI_PROTO[proto].new(unit_name) units[unit_name] = new_unit units_udprx[unit_name] = new_unit - dst_ports[unit_name] = unit_profile[2][0] + dst_ports[unit_name] = unit_profile[1] - if proto in UDPTX_PROTO: - var new_unit = UDPTX_PROTO[proto].new(unit_name) + if proto in YAU07_PROTO: + var new_unit = YAU07_PROTO[proto].new(unit_name) units[unit_name] = new_unit - units_udp[unit_name] = new_unit - dst_ports[unit_name] = unit_profile[2][0] - dst_addrs[unit_name] = unit_profile[1] + units_udptx[unit_name] = new_unit + dst_addrs[unit_name] = unit_profile[0] + dst_ports[unit_name] = unit_profile[1] + var addr_port: = StringName('%s:%d' % [unit_profile[0], unit_profile[1]]) + addr_port_to_unit_name[addr_port] = unit_name - if proto in UDPJSON_PROTO: - var new_unit = UDPJSON_PROTO[proto].new(unit_name) + if proto in UDP_PROTO: + var new_unit = UDP_PROTO[proto].new(unit_name) units[unit_name] = new_unit - units_udp[unit_name] = new_unit - dst_ports[unit_name] = unit_profile[2][1] - dst_addrs[unit_name] = unit_profile[1] + units_udptx[unit_name] = new_unit + dst_addrs[unit_name] = unit_profile[0] + dst_ports[unit_name] = unit_profile[2] if proto in TCP_PROTO: var unit_tcp = TCP_PROTO[proto].new(unit_name) @@ -186,8 +258,8 @@ func _ready() -> void: if proto in MODBUS_PROTO: var unit_modbus = MODBUS_PROTO[proto].new(unit_name) - unit_modbus.port = unit_profile[1] - unit_modbus.params = unit_profile[2] + unit_modbus.port = unit_profile[0] + unit_modbus.params = unit_profile.slice(1) units[unit_name] = unit_modbus units_modbus[unit_name] = unit_modbus bind_modbuses.append([unit_modbus, unit_name]) @@ -198,23 +270,19 @@ func _ready() -> void: units_serial[unit_name] = unit_serial units[unit_name] = unit_serial serials[unit_name] = serial + bind_serials.append([serial, unit_serial, unit_name]) ProjectSettings.connect('settings_changed', Callable(self, '_on_settings_changed_serial').bind(bind_serials)) tcp_sockets.append([create_socket_tcp('уарэп-5п28'), units_tcp['уарэп-5п28']]) for key: StringName in dst_ports: - unit_keys[dst_ports[key]] = key + port_to_unit_name[dst_ports[key]] = key if logger_page: for key in units: var u = units[key] u.connect('line_changed', Callable(logger_page, 'on_line_changed')) u.connect('command_fail', Callable(logger_page, 'on_command_fail')) - for key in settings.UnitProfiles: - var item = settings.UnitProfiles[key] - var addr_port: = StringName('%s:%d' % [item[1], item[2][0]]) - addr_port_to_unit_name[addr_port] = StringName(key) - func _on_settings_changed_modbus(bind_modbuses: Array): var _external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false) @@ -248,14 +316,14 @@ func poll_receive_udp(sock: SocketUDP) -> bool: var unit_name: = addr_port_to_unit_name[addr_port] units[unit_name].parse(data, tick) continue - if unit_keys.has(port): - var unit_name: = unit_keys[port] + if port_to_unit_name.has(port): + var unit_name: = port_to_unit_name[port] if units.has(unit_name): units[unit_name].parse(data, tick) continue var local_port: = sock.get_local_port() - if unit_keys.has(local_port): - var unit_name: = unit_keys[local_port] + if port_to_unit_name.has(local_port): + var unit_name: = port_to_unit_name[local_port] var unit_udprx: = units[unit_name] unit_udprx.source_addr = [addr, port] unit_udprx.parse(data, tick) @@ -267,7 +335,7 @@ func poll_receive_tcp(sock: SocketTCP) -> bool: if sock.is_connection_available(): # Проверить, если кто то пытается подключиться var client: = sock.take_connection() # Принять соединение sock.peerstream.set_stream_peer(client) # Привязать поток к новому клиенту - log.info('подключен: %s:%d к порту: %d' % [ client.get_connected_host(), client.get_connected_port(), client.get_local_port() ] ) + log.info('подключен: %s:%d к порту: %d' % [ client.get_connected_host(), client.get_connected_port(), client.get_local_port() ]) var peer = sock.peerstream.get_stream_peer() if peer: while true: @@ -315,11 +383,11 @@ func get_tcp_data(sock: SocketTCP, peer: StreamPeer, len_rx: int): func _process(_delta: float) -> void: tick = Time.get_ticks_msec() RenderingServer.global_shader_parameter_set('tick_curent', tick) - for unit_name: StringName in units_udp: - var unit_udp: = units_udp[unit_name] - if Error.OK == unit_udp.process(tick): - var sock: = send_sockets[unit_udp.name] - var tx_data: = unit_udp.tx_data.slice(0, unit_udp.tx_len) + for unit_name: StringName in units_udptx: + var unit_udptx: = units_udptx[unit_name] + if Error.OK == unit_udptx.process(tick): + var sock: = send_sockets[unit_name] + var tx_data: = unit_udptx.tx_data.slice(0, unit_udptx.tx_len) var dst_port: = dst_ports[unit_name] var dst_addr: = dst_addrs[unit_name] sock.send_to([dst_addr, dst_port], tx_data) diff --git a/scripts/pribor-prd.gd b/scripts/pribor-prd.gd index 57b145c..27c8a65 100644 --- a/scripts/pribor-prd.gd +++ b/scripts/pribor-prd.gd @@ -69,7 +69,7 @@ class TestPRD extends Node: var ems_6666_timer: Timer = Timer.new() signal control_is_over(control_results, power_result) - + var ecms: Dictionary ## Словарь помеховых воздействий ## Инициализация аргуметнов @@ -139,14 +139,9 @@ class TestPRD extends Node: STATE_MASHINE.CHEK_KASSETA_Y5: if block_kasseta_y5_config['yau07']: state = STATE_MASHINE.WRITE_ISA - else: - print_debug('Яу-07Б: нет связи ', block_kasseta_y5_config) STATE_MASHINE.WRITE_ISA: _handle_ug_set_state(0x6) state = STATE_MASHINE.READ_ISA - #STATE_MASHINE.IN_EMS_RUN: - #ems_6666_timer.start() - #state = STATE_MASHINE.READ_ISA STATE_MASHINE.READ_ISA: if (unit_prd.cmd_state == unit_prd.CmdState.DONE) or (unit_prd.cmd_state == unit_prd.CmdState.FAIL): _handle_read_isa(module_prd, unit_prd, [constants.ADDR_UG_LITERA_1, constants.ADDR_UG_LITERA_2, constants.ADDR_UG_LITERA_3]) diff --git a/scripts/sch3.gd b/scripts/sch3.gd index b43c97c..baa615a 100644 --- a/scripts/sch3.gd +++ b/scripts/sch3.gd @@ -15,7 +15,7 @@ class Sch3 extends unit.Unit: var step_fsm: Sch3Fsm = Sch3Fsm.CONNECT var base_input_address: int = 0 - var regs_input_count: int = 0 + var regs_input_count: int = 5 var base_holding_address: int = 0 var regs_holding_count: int = 0 var request_period: int = 300 @@ -39,11 +39,11 @@ class Sch3 extends unit.Unit: var rc: = mbc.open(port, params[0], params[1], params[2], params[3], params[4]) if rc != Error.OK: # TODO: убрать это отсюда (неуместный вывод сообщения) if not reconnect_failed: - push_error('%s: невозможно открыть \"%s\" %s' % [name, port, params]) + log.error('%s: невозможно открыть \"%s\" %s' % [name, port, params]) reconnect_failed = true return false if reconnect_failed: # TODO: убрать это отсюда (неуместный вывод сообщения) - push_warning('%s: открыто после сбоя \"%s\" %s' % [name, port, params]) + log.warning('%s: открыто после сбоя \"%s\" %s' % [name, port, params]) reconnect_failed = false mbc.set_response_timeout(params[5]) mbc.thread_run() @@ -51,7 +51,7 @@ class Sch3 extends unit.Unit: func push_write_holding(regs: Dictionary): - var keys = regs.keys() + var keys: = regs.keys() keys.sort() var data: = [] for k in keys: @@ -91,8 +91,8 @@ class Sch3 extends unit.Unit: signal error(msg: String) ## Вызывается при получении сообщения об исключительной ситуации. - func _init(nm: String): - name = nm + func _init(unit_name: String): + name = unit_name mbc.connect('read', on_read) mbc.connect('read_input', on_read_input) mbc.connect('write', on_write) diff --git a/scripts/settings.gd b/scripts/settings.gd index 904f9c9..2ac22b7 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -5,35 +5,36 @@ class_name uarep_settings extends Node var settings_program: Dictionary -@export var UnitProfiles: Dictionary[StringName, Array] = { \ - # Название | Протокол | Адрес | Порт | Широковещательное | Привязывать к адресу | Комментарий - 'уарэп-яу07-частный': ['yau07rx', '10.1.1.2', [50002], false, true, 'IP-адрес на котором принимают частные сообщения от ЯУ-07'], - 'уарэп-яу07-общий': ['yau07rx', '*', [50000], true, true, 'IP-адрес на котором принимают широковещательные сообщения от ЯУ-07'], - 'уарэп-капсрпб': ['json-capsrpb', '127.0.0.1', [42023, 42022], false, true, 'IP-адрес на котором принимают сообщения от КАПС РПБ'], - 'уарэп-эмс': ['yau07tx', '10.1.1.52', [50052], false, false, 'IP-адрес ЯУ-07 прибора УФ'], - 'уарэп-яу07-2в': ['yau07tx', '10.1.1.22', [50022], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], - 'уарэп-яу07-2н': ['yau07tx', '10.1.1.21', [50021], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - 'уарэп-яу07-2к': ['yau07tx', '10.1.1.23', [50023], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'], - 'уарэп-яу07-4в': ['yau07tx', '10.1.1.42', [50042], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], - 'уарэп-яу07-4н': ['yau07tx', '10.1.1.41', [50041], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - 'уарэп-яу07-4к': ['yau07tx', '10.1.1.43', [50043], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'], - 'уарэп-яу07-1в': ['yau07tx', '10.1.1.12', [50012], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], - 'уарэп-яу07-1н': ['yau07tx', '10.1.1.11', [50011], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - 'уарэп-яу07-1к': ['yau07tx', '10.1.1.13', [50013], false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'], - 'уарэп-яу07-3в': ['yau07tx', '10.1.1.32', [50032], false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], - 'уарэп-яу07-3н': ['yau07tx', '10.1.1.31', [50031], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - 'уарэп-яу07-3к': ['yau07tx', '10.1.1.33', [50033], false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - 'навигация': ['udprx','*', [60000], true, true, 'IP-адрес на котором принимают сообщения от навигации'], +var UnitProfiles: Dictionary[StringName, Array] = { \ + # < Название: Протокол, Адрес, <Порт>|[, Порт], Широковещательное, Привязывать, Комментарий > + 'уарэп-яу07-частный': ['yau07rx', ['10.1.1.2', 50002, false, true], 'IP-адрес для приёма частных сообщений от ЯУ-07'], + 'уарэп-яу07-общий': ['yau07rx', ['*', 50000, true, true], 'IP-адрес для приёма широковещательных сообщений от ЯУ-07'], + 'уарэп-капсрпб': ['capsrpb', ['127.0.0.1', 42023, 42022, false, true], 'IP-адрес для обмена сообщениями со службой \"МП550\" (СТЦ)'], + 'уарэп-трасса': ['trassa', ['127.0.0.1', 50200, 50200, false, true], 'IP-адрес для обмена сообщениями с \"Трассой\"'], + 'уарэп-эмс': ['yau07tx', ['10.1.1.52', 50052, false, false], 'IP-адрес прибора УФ'], + 'уарэп-яу07-2в': ['yau07tx', ['10.1.1.22', 50022, false, false], 'IP-адрес прибора ПРД-В2'], + 'уарэп-яу07-2н': ['yau07tx', ['10.1.1.21', 50021, false, false], 'IP-адрес прибора ПРД-Н2'], + 'уарэп-яу07-2к': ['yau07tx', ['10.1.1.23', 50023, false, false], 'IP-адрес прибора ПРД-К2'], + 'уарэп-яу07-4в': ['yau07tx', ['10.1.1.42', 50042, false, false], 'IP-адрес прибора ПРД-В4'], + 'уарэп-яу07-4н': ['yau07tx', ['10.1.1.41', 50041, false, false], 'IP-адрес прибора ПРД-Н4'], + 'уарэп-яу07-4к': ['yau07tx', ['10.1.1.43', 50043, false, false], 'IP-адрес прибора ПРД-К4'], + 'уарэп-яу07-1в': ['yau07tx', ['10.1.1.12', 50012, false, false], 'IP-адрес прибора ПРД-В1'], + 'уарэп-яу07-1н': ['yau07tx', ['10.1.1.11', 50011, false, false], 'IP-адрес прибора ПРД-Н1'], + 'уарэп-яу07-1к': ['yau07tx', ['10.1.1.13', 50013, false, false], 'IP-адрес прибора ПРД-К1'], + 'уарэп-яу07-3в': ['yau07tx', ['10.1.1.32', 50032, false, false], 'IP-адрес прибора ПРД-В3'], + 'уарэп-яу07-3н': ['yau07tx', ['10.1.1.31', 50031, false, false], 'IP-адрес прибора ПРД-Н3'], + 'уарэп-яу07-3к': ['yau07tx', ['10.1.1.33', 50033, false, false], 'IP-адрес прибора ПРД-К3'], + 'навигация': ['navi', ['*', 60000, true, true ], 'IP-адрес на котором принимают сообщения от навигации'], - # Название: [ Протокол, Адрес, Порт получения, Комментарий ] - 'уарэп-5п28': [ '5p28', '127.0.0.1', [50000], 'IP-адрес комплекса 5П-28'], + # < Название: Протокол, < Адрес, Порт получения >, Комментарий > + 'уарэп-5п28': ['5p28', ['127.0.0.1', 50000], 'IP-адрес комплекса 5П-28'], - # Название: [ протокол, путь, [адрес modbus, скорость, чётность, бит на символ, стоп битов, время на ожидание ответа в мкс] комментарий ] - 'уарэп-щ3': ['mbcs', '/dev/ttyUSB0', [7, 19200, 'N', 8, 1, 50000], 'Параметры клиента Modbus Serial'], + # < Название: Протокол, < Имя порта, Адрес modbus, Скорость, Чётность, Бит на символ, Стоп битов, Время на ожидание ответа в мкс >, Комментарий > + 'уарэп-щ3': ['mbcs', ['/dev/ttyUSB0', 7, 19200, 'N', 8, 1, 50000], 'Параметры клиента Modbus Serial'], - # Название: [ Протокол, Имя порта, Скорость, Чётность, ??, Комментарий - 'уарэп-спт25-1': ['uart', '/dev/ttyUSB1', [19200, false, false], 'Адрес прибора СПТ-25 (G1)'], - 'уарэп-спт25-2': ['uart', '/dev/ttyUSB2', [19200, false, false], 'Адрес прибора СПТ-25 (G2)'], + # < Название: Протокол, < Имя порта, Адрес СПТ-25, Скорость, Чётность, Бит на символ, Стоп битов >, Комментарий > + 'уарэп-спт25-1': ['spt25', ['/dev/ttyUSB1', 0, 19200, 'N', 8, 1], 'Прибор СПТ-25 (G1)'], + 'уарэп-спт25-2': ['spt25', ['/dev/ttyUSB2', 0, 19200, 'N', 8, 1], 'Прибор СПТ-25 (G2)'], } ## Параметры цели. @@ -56,54 +57,55 @@ func _ready() -> void: if Engine.is_editor_hint(): return var settings_file = get_settings_file_path() - var abs_path = ProjectSettings.globalize_path(settings_file) + var abs_path: = ProjectSettings.globalize_path(settings_file) log.info('Путь к файлу настроек: \"%s\"' % abs_path) - var file = FileAccess.open(settings_file, FileAccess.READ) + var file: = FileAccess.open(settings_file, FileAccess.READ) if not file: - log.info('Не удалось открыть файл настроек, будут использованы настройики по умолчанию') + log.error('Не удалось открыть файл настроек.') + log.warning('Будут использованы настройики по умолчанию.') return - var read = file.get_as_text() + var read: = file.get_as_text() file.close() var json_conv: = JSON.new() if Error.OK != json_conv.parse(read): - log.info('Не удалось разобрать файл настроек: ошибка в содержании, будут использованы настройики по умолчанию') + var jse: = json_conv.get_error_message() + var jsl: = json_conv.get_error_line() + log.error('Не удалось разобрать файл настроек. Строка %d: \"%s\"' % [jsl, jse]) + log.warning('Будут использованы настройики по умолчанию.') return var json_data = json_conv.get_data() settings_program.merge(json_data) - for key in UnitProfiles.keys(): + for key in settings_program: + ProjectSettings.set_setting('application/config/%s' % key, settings_program[key]) + for key: StringName in UnitProfiles.keys(): if not json_data.has(key): continue - var temp_array = [] - var set_from_file = true - if typeof(json_data[key][0]) == typeof(UnitProfiles[key][1]): - temp_array.append(json_data[key][0]) - else: - set_from_file = false - if len(json_data[key]) < len(UnitProfiles[key][2]): - log.info('Не удалось прочитать значение \"%s\", ошибка в содержании файла настроек' % key) + var vj = json_data[key] + var vp = UnitProfiles[key][1] + if vp.size() != vj.size(): + log.error('Не удалось прочитать настройки для \"%s\"' % key) continue - temp_array.append([]) - for i in len(json_data[key]) - 1: - if tools.type_is_num(json_data[key][i+1]) and tools.type_is_num(UnitProfiles[key][2][i]): - if typeof(UnitProfiles[key][2][i]) == TYPE_INT: - temp_array[1].append(int(json_data[key][i+1])) - elif typeof(UnitProfiles[key][2][i]) == TYPE_FLOAT: - temp_array[1].append(float(json_data[key][i+1])) - else: - set_from_file = false - elif typeof(json_data[key][i+1]) == typeof(UnitProfiles[key][2][i]): - temp_array[1].append(json_data[key][i+1]) + var parse_ok: = true + for i in vp.size(): + if tools.type_is_num(vj[i]) and tools.type_is_num(vp[i]): + if typeof(vp[i]) == TYPE_INT: + vp[i] = int(vj[i]) + elif typeof(vp[i]) == TYPE_FLOAT: + vp[i] = float(vj[i]) + elif typeof(vp[i]) == typeof(vj[i]): + vp[i] = vj[i] else: - set_from_file = false - if set_from_file: - UnitProfiles[key][1] = temp_array[0] - UnitProfiles[key][2] = temp_array[1] - else: - log.info('Не удалось прочитать значение \"%s\" из файла настроек, будет использовано значение по умолчанию' % key) + var tp: = type_string(typeof(vp[i])) + var tj: = type_string(typeof(vj[i])) + log.error('%s: ожидается тип \"%s\", но получен тип \"%s\" [%d]' % [key, tp, tj, i]) + parse_ok = false + break + if parse_ok: + UnitProfiles[key][1].assign(vp) ## Возвращает полный путь к файлу с настройками -func get_settings_file_path(): +func get_settings_file_path() -> String: return ProjectSettings.get_setting( 'application/config/settings_path', 'user://settings.json') diff --git a/scripts/spt25.gd b/scripts/spt25.gd index b00b420..5e826f2 100644 --- a/scripts/spt25.gd +++ b/scripts/spt25.gd @@ -41,15 +41,12 @@ class SPT25 extends unit.Unit: func _init(nm) -> void: self.name = nm - tx_data.resize(8) - tx_data[0] = 0x7e # Флаги синхронизации пакета - tx_data[1] = 0 # Адрес абонента, которому предназначен пакет - tx_data[2] = CmdCode.INFO # Тип пакета, КОД КОМАНДЫ - Получить информацию о состоянии преобразователя + tx_data.resize(5) + tx_data[0] = 0 # Адрес абонента, которому предназначен пакет + tx_data[1] = CmdCode.INFO # Тип пакета, КОД КОМАНДЫ - Получить информацию о состоянии преобразователя + tx_data[2] = 0 # Данные tx_data[3] = 0 # Данные tx_data[4] = 0 # Данные - tx_data[5] = 0 # Данные - tx_data[6] = 0 # Контрольная сумма - tx_data[7] = 0x7e # Флаги синхронизации пакета func parse(rx_data: PackedByteArray, tick: int): diff --git a/scripts/tools.gd b/scripts/tools.gd index ec7d553..6b061c6 100644 --- a/scripts/tools.gd +++ b/scripts/tools.gd @@ -29,6 +29,8 @@ func hypot(x: float, y: float) -> float: return sqrt(x * x + y * y) func is_overlap(x1, x2, y1, y2) -> bool: return max(x1, y1) <= min(x2, y2) +## Закрывает программу если [param val] установлен в [b]false[/b][br] +## [param msg] - сообщение об ошибке func allways(val: bool, msg: String = '<не указано>'): if val: return push_error('ошибка: %s\n' % msg) @@ -129,10 +131,12 @@ func get_members_names(obj: Object) -> Array: return names -## Проверяет, что заданный массив [param val] похож на ip-адрес. +## Проверяет, что заданный массив [param val] похож на ip-адрес, +## в формате ['0.0.0.0', 1000] func is_array_ipaddr(val: Array): return (val.size() == 2) \ and (val[0] is String) \ + and (val[0].split('.').size() == 4) \ and (val[1] is int) \ and (0 < val[1]) \ and (val[1] < 65536) @@ -198,22 +202,22 @@ func fill_files_table(tbl: table, folder: String, rows_types: Array): if dir == null: return var exclude_names: = ['.', '..'] - dir.list_dir_begin() # TODOGODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547 + dir.list_dir_begin() # TODO: GODOT4 fill missing arguments https://github.com/godotengine/godot/pull/40547 while true: var file: = dir.get_next() if file == '': break if file in exclude_names: continue - var file_name = folder + file - var fd = FileAccess.open(file_name, FileAccess.READ) + var file_name: = folder + file + var fd: = FileAccess.open(file_name, FileAccess.READ) if not fd: continue - var glob_path = ProjectSettings.globalize_path(file_name) - var sz = fd.get_length() - var ut = FileAccess.get_modified_time(file_name) + var glob_path: = ProjectSettings.globalize_path(file_name) + var sz: = fd.get_length() + var ut: = FileAccess.get_modified_time(file_name) fd.close() - var mt = Time.get_datetime_dict_from_unix_time(ut) + var mt: = Time.get_datetime_dict_from_unix_time(ut) var file_row = [file, '%d' % sz, '%d-%02d-%02d %02d:%02d' % [mt.year, mt.month, mt.day, mt.hour, mt.minute]] tbl.add_row(rows_types) var i_row: = tbl.get_rows_count() - 1 diff --git a/scripts/trassa.gd b/scripts/trassa.gd new file mode 100644 index 0000000..faee683 --- /dev/null +++ b/scripts/trassa.gd @@ -0,0 +1,13 @@ +class_name trassa_unit extends Node + + +class Trassa extends unit.Unit: + var source_addr: = [] + func process(tick: int): + return Error.ERR_BUSY + + func _init(unit_name: StringName): + self.name = unit_name + + func parse(data: PackedByteArray, now_tick: int): + pass diff --git a/scripts/trassa.gd.uid b/scripts/trassa.gd.uid new file mode 100644 index 0000000..49fe708 --- /dev/null +++ b/scripts/trassa.gd.uid @@ -0,0 +1 @@ +uid://s0xvnch1r63u diff --git a/settings.json b/settings.json new file mode 100644 index 0000000..f3eee9d --- /dev/null +++ b/settings.json @@ -0,0 +1,160 @@ +{ + "Адрес АФСП левого борта": "http://172.22.246.13:8081/selftest", + "Адрес АФСП правого борта": "http://172.22.246.11:8082/selftest", + "Адрес БПО левого борта": "http://172.22.246.13:8081/selftest", + "Адрес БПО правого борта": "http://172.22.246.11:8082/selftest", + "Виртуальная клавиатура": false, + "Внешнее управление": false, + "Кнопка «JTIDS»": false, + "Кнопка «К1»": false, + "Кнопка «КУПД»": false, + "Кнопка «ЛЧМ-1»": false, + "Кнопка «МЧМ-1»": false, + "Кнопка «ОЗП-1»": false, + "Кнопка «ОРН-И1»": false, + "Кнопка «ОРН-М2»": false, + "Кнопка «ОРН»": false, + "Кнопка «ПД-М2»": false, + "Кнопка «ПД-М4»": false, + "Кнопка «ПД-М4С»": false, + "Кнопка «ПД-ЧМ»": false, + "Кнопка «Подавление»": false, + "Кнопка «СВ-И1»": false, + "Кнопка «СВ-М2»": false, + "Ограниченный режим": false, + "Скрыть вкладку ЭМС 2": true, + "Текущая версия ПО УАРЭП": "HEAD 48353cc Fri Sep 5 14:44:15 2025 +0300", + "Шаблон адреса сервера карт": "http://169.254.27.71:8001/osm_tiles/{z}/{x}/{y}.png", + "навигация": [ + "*", + 60000, + true, + true + ], + "уарэп-5п28": [ + "127.0.0.1", + 50000 + ], + "уарэп-капсрпб": [ + "127.0.0.1", + 42023, + 42022, + false, + true + ], + "уарэп-спт25-1": [ + "/dev/ttyUSB1", + 0, + 19200, + "N", + 8, + 1 + ], + "уарэп-спт25-2": [ + "/dev/ttyUSB2", + 0, + 19200, + "N", + 8, + 1 + ], + "уарэп-щ3": [ + "/dev/ttyUSB0", + 7, + 19200, + "N", + 8, + 1, + 50000 + ], + "уарэп-эмс": [ + "10.1.1.52", + 50052, + false, + false + ], + "уарэп-яу07-1в": [ + "10.1.1.12", + 50012, + false, + false + ], + "уарэп-яу07-1к": [ + "10.1.1.13", + 50013, + false, + false + ], + "уарэп-яу07-1н": [ + "10.1.1.11", + 50011, + false, + false + ], + "уарэп-яу07-2в": [ + "10.1.1.22", + 50022, + false, + false + ], + "уарэп-яу07-2к": [ + "10.1.1.23", + 50023, + false, + false + ], + "уарэп-яу07-2н": [ + "10.1.1.21", + 50021, + false, + false + ], + "уарэп-яу07-3в": [ + "10.1.1.32", + 50032, + false, + false + ], + "уарэп-яу07-3к": [ + "10.1.1.33", + 50033, + false, + false + ], + "уарэп-яу07-3н": [ + "10.1.1.31", + 50031, + false, + false + ], + "уарэп-яу07-4в": [ + "10.1.1.42", + 50042, + false, + false + ], + "уарэп-яу07-4к": [ + "10.1.1.43", + 50043, + false, + false + ], + "уарэп-яу07-4н": [ + "10.1.1.41", + 50041, + false, + false + ], + "уарэп-яу07-общий": [ + "*", + 50000, + true, + true + ], + "уарэп-яу07-частный": [ + "10.1.1.2", + 50002, + false, + true + ] +} \ No newline at end of file