From ade6db67981e5da419fd5107c365afecb5409cdd Mon Sep 17 00:00:00 2001 From: sasha80 Date: Thu, 28 Aug 2025 09:17:35 +0300 Subject: [PATCH 01/32] =?UTF-8?q?=D0=A0=D0=B5=D0=B3=D1=80=D0=B5=D1=81?= =?UTF-8?q?=D1=81=D0=B8=D1=8F.=20=D0=A0=D0=B5=D0=B6=D0=B8=D0=BC=20"=D0=9A?= =?UTF-8?q?=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D1=8C".=20=D0=9D=D0=B0?= =?UTF-8?q?=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BF=D1=80=D0=B8=D0=B1?= =?UTF-8?q?=D0=BE=D1=80=D0=BE=D0=B2=20=D0=BD=D0=B5=20=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D0=B6=D0=B0=D1=8E=D1=82=D1=81=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/контроль/кнопка-прибора.gd | 2 +- scenes/контроль/контроль.tscn | 87 +++++++++++++++---------------- 2 files changed, 44 insertions(+), 45 deletions(-) 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/контроль/контроль.tscn b/scenes/контроль/контроль.tscn index 8c15112..e54f74f 100644 --- a/scenes/контроль/контроль.tscn +++ b/scenes/контроль/контроль.tscn @@ -57,12 +57,12 @@ 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)] [node name="label" type="Label" parent="externals"] -self_modulate = Color(0, 0, 0, 0) layout_mode = 0 -offset_left = 58.0 -offset_top = -26.0 -offset_right = 219.0 -offset_bottom = -7.0 +offset_left = -40.0 +offset_top = -28.0 +offset_right = 121.0 +offset_bottom = -9.0 +scale = Vector2(2, 2) text = "Внешние подключения" horizontal_alignment = 1 vertical_alignment = 1 @@ -122,7 +122,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 @@ -161,6 +160,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) @@ -176,16 +185,6 @@ patch_margin_top = 16 patch_margin_right = 16 patch_margin_bottom = 16 -[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="connect_pribor" type="AnimatedSprite2D" parent="pribor_rtr"] modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 @@ -213,6 +212,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) @@ -229,22 +239,11 @@ patch_margin_top = 16 patch_margin_right = 16 patch_margin_bottom = 16 -[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="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.0, 3.0) +scale = Vector2(3, 3) sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.72355 script = ExtResource("11_u7tym") @@ -268,6 +267,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) @@ -284,22 +294,11 @@ patch_margin_top = 16 patch_margin_right = 16 patch_margin_bottom = 16 -[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="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.0, 3.0) +scale = Vector2(3, 3) sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.72355 script = ExtResource("11_u7tym") @@ -1050,10 +1049,10 @@ 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 From f66e3f764fdd522f12d3edda52583ba6b157e514 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Thu, 28 Aug 2025 09:18:55 +0300 Subject: [PATCH 02/32] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5.=20=D0=A0=D0=B5=D0=B6=D0=B8?= =?UTF-8?q?=D0=BC=20"=D0=9A=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D1=8C".=20?= =?UTF-8?q?=D0=A1=D0=BE=D1=81=D1=82=D0=BE=D1=8F=D0=BD=D0=B8=D0=B5=20"?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D0=B2=D1=8F=D0=B7=D0=B8"=20=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=B2=D0=B5=D1=80=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/sch3.gd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/sch3.gd b/scripts/sch3.gd index b43c97c..c08702a 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 @@ -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) From 9e0d08771c762881a17bb9f7a7d112825e4d1ccb Mon Sep 17 00:00:00 2001 From: sasha80 Date: Thu, 28 Aug 2025 09:19:10 +0300 Subject: [PATCH 03/32] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-uyep/sch3-view.gd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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') From b3db948eac903a29f607f626c762cb8756619f42 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Thu, 28 Aug 2025 13:55:21 +0300 Subject: [PATCH 04/32] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80.=20=D0=92=D1=81=D1=82=D1=80=D0=BE=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D1=8B=20=D0=B2=20?= =?UTF-8?q?=D1=81=D1=86=D0=B5=D0=BD=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-externals/externals.gd | 17 ----- scenes/pribor-externals/externals.gd.uid | 1 - scenes/pribor-externals/externals.tscn | 24 ++++++- scenes/контроль/контроль.gd | 81 ---------------------- scenes/контроль/контроль.gd.uid | 1 - scenes/контроль/контроль.tscn | 87 +++++++++++++++++++++++- scenes/контроль/элемент-я.gd | 70 ------------------- scenes/контроль/элемент-я.gd.uid | 1 - scenes/контроль/элемент-я.tscn | 76 ++++++++++++++++++++- 9 files changed, 180 insertions(+), 178 deletions(-) delete mode 100644 scenes/pribor-externals/externals.gd delete mode 100644 scenes/pribor-externals/externals.gd.uid delete mode 100644 scenes/контроль/контроль.gd delete mode 100644 scenes/контроль/контроль.gd.uid delete mode 100644 scenes/контроль/элемент-я.gd delete mode 100644 scenes/контроль/элемент-я.gd.uid 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/контроль/контроль.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 e54f74f..330c624 100644 --- a/scenes/контроль/контроль.tscn +++ b/scenes/контроль/контроль.tscn @@ -1,6 +1,5 @@ [gd_scene load_steps=17 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="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"] @@ -16,6 +15,90 @@ [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 = \\ + { + '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) +" + [sub_resource type="SpriteFrames" id="SpriteFrames_foasq"] animations = [{ "frames": [{ @@ -36,7 +119,7 @@ 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"]] diff --git a/scenes/контроль/элемент-я.gd b/scenes/контроль/элемент-я.gd deleted file mode 100644 index fd6a944..0000000 --- a/scenes/контроль/элемент-я.gd +++ /dev/null @@ -1,70 +0,0 @@ -extends Control - -@export var textures: Array -@export var unit_name: String = '' - - -enum STATE_VAL { - NONE = 0, - GOOD = 1, - ERROR = 2 } - - -signal pressed(control: PanelContainer) - - -func _on_button_pressed(): - emit_signal('pressed', self) - - -@export var state: int: - set(v): - state = tools.clip_value(v, 0, textures.size() - 1) - if is_inside_tree(): - $margin/vbox/grid/state.texture = textures[v] - - -@export var fname: String: - set(v): - fname = v - if is_inside_tree(): - $margin/vbox/grid/fname.text = v - - -@export var rname: String: - set(v): - rname = v - if is_inside_tree(): - $margin/vbox/grid/rname.text = v - - -@export var alignment: int: - set(v): - if is_inside_tree(): - $margin/vbox.alignment = v - - -func _ready() -> void: call_deferred('_on_resized') - - -func _on_resized() -> void: - $rect.size = size - $margin.size = size - - -func _enter_tree() -> void: - if Engine.is_editor_hint(): return - var unit_any = network.get_unit_instance(unit_name) - unit_any.connect('data_received', Callable(self, 'on_data_received')) - unit_any.connect('line_changed', Callable(self, 'on_line_changed')) - $margin/vbox.alignment = alignment - $margin/vbox/grid/fname.text = fname - $margin/vbox/grid/rname.text = rname - $margin/vbox/grid/state.texture = textures[state] - - -func _exit_tree() -> void: - if Engine.is_editor_hint(): return - var unit_any = network.get_unit_instance(unit_name) - unit_any.disconnect('data_received', Callable(self, 'on_data_received')) - unit_any.disconnect('line_changed', Callable(self, 'on_line_changed')) diff --git a/scenes/контроль/элемент-я.gd.uid b/scenes/контроль/элемент-я.gd.uid deleted file mode 100644 index a3f3d5e..0000000 --- a/scenes/контроль/элемент-я.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cwurf51vh7ylm diff --git a/scenes/контроль/элемент-я.tscn b/scenes/контроль/элемент-я.tscn index 3ca3f7a..45f5c62 100644 --- a/scenes/контроль/элемент-я.tscn +++ b/scenes/контроль/элемент-я.tscn @@ -1,11 +1,83 @@ [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="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"] [ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="4_or1kj"] +[sub_resource type="GDScript" id="GDScript_rmhe2"] +script/source = "extends Control + +@export var textures: Array +@export var unit_name: String = '' + + +enum STATE_VAL { + NONE = 0, + GOOD = 1, + ERROR = 2 } + + +signal pressed(control: PanelContainer) + + +func _on_button_pressed(): + emit_signal('pressed', self) + + +@export var state: int: + set(v): + state = tools.clip_value(v, 0, textures.size() - 1) + if is_inside_tree(): + $margin/vbox/grid/state.texture = textures[v] + + +@export var fname: String: + set(v): + fname = v + if is_inside_tree(): + $margin/vbox/grid/fname.text = v + + +@export var rname: String: + set(v): + rname = v + if is_inside_tree(): + $margin/vbox/grid/rname.text = v + + +@export var alignment: int: + set(v): + if is_inside_tree(): + $margin/vbox.alignment = v + + +func _ready() -> void: call_deferred('_on_resized') + + +func _on_resized() -> void: + $rect.size = size + $margin.size = size + + +func _enter_tree() -> void: + if Engine.is_editor_hint(): return + var unit_any = network.get_unit_instance(unit_name) + unit_any.connect('data_received', Callable(self, 'on_data_received')) + unit_any.connect('line_changed', Callable(self, 'on_line_changed')) + $margin/vbox.alignment = alignment + $margin/vbox/grid/fname.text = fname + $margin/vbox/grid/rname.text = rname + $margin/vbox/grid/state.texture = textures[state] + + +func _exit_tree() -> void: + if Engine.is_editor_hint(): return + var unit_any = network.get_unit_instance(unit_name) + unit_any.disconnect('data_received', Callable(self, 'on_data_received')) + unit_any.disconnect('line_changed', Callable(self, 'on_line_changed')) +" + [sub_resource type="GDScript" id="GDScript_45hqb"] script/source = "@tool @@ -48,7 +120,7 @@ layout_mode = 3 anchors_preset = 0 offset_right = 180.0 offset_bottom = 155.0 -script = ExtResource("1_fwxi0") +script = SubResource("GDScript_rmhe2") textures = [ExtResource("3_dktys"), ExtResource("3_t4y6r"), ExtResource("4_bdhnj")] [node name="rect" type="NinePatchRect" parent="."] From 5fee3963871cfd6b9b999aa431a4f53a6213d656 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Fri, 29 Aug 2025 10:06:32 +0300 Subject: [PATCH 05/32] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/network.gd | 38 ++++++++++++++++++++++++-------------- scripts/settings.gd | 4 ++-- scripts/tools.gd | 16 +++++++++------- 3 files changed, 35 insertions(+), 23 deletions(-) diff --git a/scripts/network.gd b/scripts/network.gd index 7028487..3a73b13 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -3,15 +3,22 @@ class_name Network extends Node const UDPTX_PROTO: = {'yau07tx': yau07.YaU07} const UDPJSON_PROTO: = {'json-capsrpb': capsrpb.CapsRpb} 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} var tick: int = 0 -class Serial extends SerialPort: - func send_to(data: PackedByteArray): return write_raw(data) +class Spt25Serial extends SerialPort: + func send_to(data: PackedByteArray): + tools.allways(data.size() >= 2, 'длина буфера меньше необходимого') + var i_sum: = data.size() - 3 + var csd: = data.slice(0, i_sum) + var v_sum: = get_check_sum(csd) + data.encode_u16(i_sum, v_sum) + return write_raw(data) + func _to_string() -> String: return 'последовательный порт \"%s\" @ %d (%s)' % [self.port, self.baudrate, 'открыт' if is_open() else 'закрыт'] func try_open(parsing_proc: Callable): @@ -68,7 +75,7 @@ var units_udprx: Dictionary[StringName, unit.Unit] ## Экземпляры 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, Spt25Serial] ## Последовательные порты (uart) var dst_ports: Dictionary[StringName, int] ## Преобразование имя устройства в порт назначения var dst_addrs: Dictionary[StringName, StringName] ## Преобразование имя устройства в адрес назначения var unit_keys: Dictionary[int, StringName] ## Преобразование порта назначения в имя устройства @@ -84,10 +91,11 @@ 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] + var addr = st[1] + var port = st[2][0] + var broad = st[3] + var bind = st[4] var sock: = SocketUDP.new() sock.set_broadcast_enabled(broad) var rc = Error.OK if not bind else sock.bind(port, addr) @@ -98,8 +106,9 @@ func create_socket_udp(unit_name: StringName) -> SocketUDP: ## [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] + var addr = st[1] + var port = st[2][0] var sock: = SocketTCP.new() sock.unit_name = unit_name var rc: = sock.listen(port, addr) @@ -111,10 +120,11 @@ 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() +func create_serial(unit_name: StringName) -> Spt25Serial: + var st = settings.UnitProfiles[unit_name] + var port = st[1] + var baud = st[2][0] + var serial: = Spt25Serial.new() serial.port = port serial.baudrate = baud serial.timeout = 20000 diff --git a/scripts/settings.gd b/scripts/settings.gd index 904f9c9..a7326b0 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -32,8 +32,8 @@ var settings_program: Dictionary 'уарэп-щ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-1': ['spt25', '/dev/ttyUSB1', [19200, false, false], 'Адрес прибора СПТ-25 (G1)'], + 'уарэп-спт25-2': ['spt25', '/dev/ttyUSB2', [19200, false, false], 'Адрес прибора СПТ-25 (G2)'], } ## Параметры цели. diff --git a/scripts/tools.gd b/scripts/tools.gd index ec7d553..2a41a74 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) @@ -198,22 +200,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 From 6b24cd713c4d8e513ba21ce42eebed39fe1cf180 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Fri, 29 Aug 2025 10:10:53 +0300 Subject: [PATCH 06/32] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=9A=D0=BE=D0=BD=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D0=B0=D1=8F=20=D1=81=D1=83=D0=BC=D0=BC=D0=B0?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=A1=D0=9F=D0=A2-25?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/network.gd | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/scripts/network.gd b/scripts/network.gd index 3a73b13..3104223 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -21,6 +21,31 @@ class Spt25Serial extends SerialPort: func _to_string() -> String: return 'последовательный порт \"%s\" @ %d (%s)' % [self.port, self.baudrate, 'открыт' if is_open() else 'закрыт'] + func get_check_sum(src: PackedByteArray) -> int: + var P_DIV: = 0xF0B8 + var FCS = ~((src[2]<<8) + src[1]) + for i in range(3, src.size()): + var C = src[i] + for j in 8: + if C & 1: + if FCS & 1: + FCS = ((FCS >> 1) | 0x8000) ^ P_DIV + else: + FCS = ((FCS >> 1) | 0x8000) + else: + if FCS & 1: + FCS = (FCS >> 1) ^ P_DIV + else: + FCS = FCS >> 1 + C >>= 1 + for j in 16: + if FCS & 1: + FCS = (FCS >> 1) ^ P_DIV + else: + FCS = FCS >> 1 + return ~FCS + + func try_open(parsing_proc: Callable): if is_open(): return Error.OK From 1a18968ec57d42578cd70217bae4e47e7d736da6 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Mon, 1 Sep 2025 12:54:14 +0300 Subject: [PATCH 07/32] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5.=20=D0=A0=D0=B0=D0=B7=D0=BC?= =?UTF-8?q?=D0=B5=D1=80=20=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D0=B2=D0=B5=D1=80=D0=BD=D1=8B=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/контроль/элемент-я.gd | 70 +++++++++++++++++++++++++++++ scenes/контроль/элемент-я.gd.uid | 1 + scenes/контроль/элемент-я.tscn | 76 +------------------------------- scripts/network.gd | 10 ++--- scripts/spt25.gd | 7 +-- 5 files changed, 82 insertions(+), 82 deletions(-) create mode 100644 scenes/контроль/элемент-я.gd create mode 100644 scenes/контроль/элемент-я.gd.uid diff --git a/scenes/контроль/элемент-я.gd b/scenes/контроль/элемент-я.gd new file mode 100644 index 0000000..fd6a944 --- /dev/null +++ b/scenes/контроль/элемент-я.gd @@ -0,0 +1,70 @@ +extends Control + +@export var textures: Array +@export var unit_name: String = '' + + +enum STATE_VAL { + NONE = 0, + GOOD = 1, + ERROR = 2 } + + +signal pressed(control: PanelContainer) + + +func _on_button_pressed(): + emit_signal('pressed', self) + + +@export var state: int: + set(v): + state = tools.clip_value(v, 0, textures.size() - 1) + if is_inside_tree(): + $margin/vbox/grid/state.texture = textures[v] + + +@export var fname: String: + set(v): + fname = v + if is_inside_tree(): + $margin/vbox/grid/fname.text = v + + +@export var rname: String: + set(v): + rname = v + if is_inside_tree(): + $margin/vbox/grid/rname.text = v + + +@export var alignment: int: + set(v): + if is_inside_tree(): + $margin/vbox.alignment = v + + +func _ready() -> void: call_deferred('_on_resized') + + +func _on_resized() -> void: + $rect.size = size + $margin.size = size + + +func _enter_tree() -> void: + if Engine.is_editor_hint(): return + var unit_any = network.get_unit_instance(unit_name) + unit_any.connect('data_received', Callable(self, 'on_data_received')) + unit_any.connect('line_changed', Callable(self, 'on_line_changed')) + $margin/vbox.alignment = alignment + $margin/vbox/grid/fname.text = fname + $margin/vbox/grid/rname.text = rname + $margin/vbox/grid/state.texture = textures[state] + + +func _exit_tree() -> void: + if Engine.is_editor_hint(): return + var unit_any = network.get_unit_instance(unit_name) + unit_any.disconnect('data_received', Callable(self, 'on_data_received')) + unit_any.disconnect('line_changed', Callable(self, 'on_line_changed')) diff --git a/scenes/контроль/элемент-я.gd.uid b/scenes/контроль/элемент-я.gd.uid new file mode 100644 index 0000000..aeb87e0 --- /dev/null +++ b/scenes/контроль/элемент-я.gd.uid @@ -0,0 +1 @@ +uid://blnakmwyvinxm diff --git a/scenes/контроль/элемент-я.tscn b/scenes/контроль/элемент-я.tscn index 45f5c62..5f9719b 100644 --- a/scenes/контроль/элемент-я.tscn +++ b/scenes/контроль/элемент-я.tscn @@ -1,83 +1,11 @@ [gd_scene load_steps=12 format=3 uid="uid://btpc78gucr57f"] +[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"] [ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="4_or1kj"] -[sub_resource type="GDScript" id="GDScript_rmhe2"] -script/source = "extends Control - -@export var textures: Array -@export var unit_name: String = '' - - -enum STATE_VAL { - NONE = 0, - GOOD = 1, - ERROR = 2 } - - -signal pressed(control: PanelContainer) - - -func _on_button_pressed(): - emit_signal('pressed', self) - - -@export var state: int: - set(v): - state = tools.clip_value(v, 0, textures.size() - 1) - if is_inside_tree(): - $margin/vbox/grid/state.texture = textures[v] - - -@export var fname: String: - set(v): - fname = v - if is_inside_tree(): - $margin/vbox/grid/fname.text = v - - -@export var rname: String: - set(v): - rname = v - if is_inside_tree(): - $margin/vbox/grid/rname.text = v - - -@export var alignment: int: - set(v): - if is_inside_tree(): - $margin/vbox.alignment = v - - -func _ready() -> void: call_deferred('_on_resized') - - -func _on_resized() -> void: - $rect.size = size - $margin.size = size - - -func _enter_tree() -> void: - if Engine.is_editor_hint(): return - var unit_any = network.get_unit_instance(unit_name) - unit_any.connect('data_received', Callable(self, 'on_data_received')) - unit_any.connect('line_changed', Callable(self, 'on_line_changed')) - $margin/vbox.alignment = alignment - $margin/vbox/grid/fname.text = fname - $margin/vbox/grid/rname.text = rname - $margin/vbox/grid/state.texture = textures[state] - - -func _exit_tree() -> void: - if Engine.is_editor_hint(): return - var unit_any = network.get_unit_instance(unit_name) - unit_any.disconnect('data_received', Callable(self, 'on_data_received')) - unit_any.disconnect('line_changed', Callable(self, 'on_line_changed')) -" - [sub_resource type="GDScript" id="GDScript_45hqb"] script/source = "@tool @@ -120,7 +48,7 @@ layout_mode = 3 anchors_preset = 0 offset_right = 180.0 offset_bottom = 155.0 -script = SubResource("GDScript_rmhe2") +script = ExtResource("1_ajips") textures = [ExtResource("3_dktys"), ExtResource("3_t4y6r"), ExtResource("4_bdhnj")] [node name="rect" type="NinePatchRect" parent="."] diff --git a/scripts/network.gd b/scripts/network.gd index 3104223..9d9cd46 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -12,17 +12,17 @@ var tick: int = 0 class Spt25Serial extends SerialPort: func send_to(data: PackedByteArray): - tools.allways(data.size() >= 2, 'длина буфера меньше необходимого') + tools.allways(data.size() >= 3, 'длина буфера меньше необходимого') var i_sum: = data.size() - 3 - var csd: = data.slice(0, i_sum) - var v_sum: = get_check_sum(csd) + data.encode_u16(i_sum, 0) + var v_sum: = get_check_sum(data) data.encode_u16(i_sum, v_sum) - return write_raw(data) + write_raw(data) func _to_string() -> String: return 'последовательный порт \"%s\" @ %d (%s)' % [self.port, self.baudrate, 'открыт' if is_open() else 'закрыт'] func get_check_sum(src: PackedByteArray) -> int: - var P_DIV: = 0xF0B8 + var P_DIV: = 0xf0b8 var FCS = ~((src[2]<<8) + src[1]) for i in range(3, src.size()): var C = src[i] diff --git a/scripts/spt25.gd b/scripts/spt25.gd index 965445b..002e5e9 100644 --- a/scripts/spt25.gd +++ b/scripts/spt25.gd @@ -15,15 +15,16 @@ class SPT25 extends unit.Unit: func _init(nm) -> void: self.name = nm - tx_data.resize(8) + tx_data.resize(9) tx_data[0] = 0x7e # Флаги синхронизации пакета tx_data[1] = 0 # Адрес абонента, которому предназначен пакет tx_data[2] = CmdCode.INFO # Тип пакета, КОД КОМАНДЫ - Получить информацию о состоянии преобразователя tx_data[3] = 0 # Данные tx_data[4] = 0 # Данные tx_data[5] = 0 # Данные - tx_data[6] = 0 # Контрольная сумма - tx_data[7] = 0x7e # Флаги синхронизации пакета + tx_data[6] = 0 # Контрольная сумма мл. байт + tx_data[7] = 0 # Контрольная сумма ст. байт + tx_data[8] = 0x7e # Флаги синхронизации пакета func parse(rx_data: PackedByteArray, tick: int): From d0a35082a250b522b06f919ebe3d60967cacda60 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Mon, 1 Sep 2025 13:00:13 +0300 Subject: [PATCH 08/32] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5.=20=D0=9E=D0=B1=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=20=D1=81=20=D0=A1=D0=9F=D0=A2-25=20=D0=BD=D0=B5=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/network.gd | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/network.gd b/scripts/network.gd index 9d9cd46..a6ae1e3 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -233,6 +233,7 @@ 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)) From a8be79b076570ef779522ab1c1690d6b3e81be5f Mon Sep 17 00:00:00 2001 From: sasha80 Date: Mon, 1 Sep 2025 13:28:02 +0300 Subject: [PATCH 09/32] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80.=20=D0=A1=D0=B5=D1=82=D0=B5=D0=B2=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/network.gd | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/network.gd b/scripts/network.gd index a6ae1e3..3a0c46f 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -10,7 +10,7 @@ const UDPRX_PROTO: = {'udprx': navi.NaviSource} var tick: int = 0 -class Spt25Serial extends SerialPort: +class SocketSerial extends SerialPort: func send_to(data: PackedByteArray): tools.allways(data.size() >= 3, 'длина буфера меньше необходимого') var i_sum: = data.size() - 3 @@ -100,7 +100,7 @@ var units_udprx: Dictionary[StringName, unit.Unit] ## Экземпляры 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, Spt25Serial] ## Последовательные порты (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] ## Преобразование порта назначения в имя устройства @@ -145,11 +145,11 @@ func create_socket_tcp(unit_name: StringName) -> SocketTCP: ## [param unit_name] - Уникальное имя устройства[br] -func create_serial(unit_name: StringName) -> Spt25Serial: +func create_serial(unit_name: StringName) -> SocketSerial: var st = settings.UnitProfiles[unit_name] var port = st[1] var baud = st[2][0] - var serial: = Spt25Serial.new() + var serial: = SocketSerial.new() serial.port = port serial.baudrate = baud serial.timeout = 20000 From 519e3ce09311b77b53a861f891dddfe088fc6379 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 2 Sep 2025 14:22:40 +0300 Subject: [PATCH 10/32] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80.=20=D0=A1=D0=BA=D1=80=D0=B8=D0=BF=D1=82=20=D0=B2?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BD=20=D0=B2=20=D1=81=D1=86?= =?UTF-8?q?=D0=B5=D0=BD=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/настройки/настройки.gd | 269 ----------------------------- scenes/настройки/настройки.gd.uid | 1 - scenes/настройки/настройки.tscn | 277 +++++++++++++++++++++++++++++- 3 files changed, 273 insertions(+), 274 deletions(-) delete mode 100644 scenes/настройки/настройки.gd delete mode 100644 scenes/настройки/настройки.gd.uid 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..0b0ec62 100644 --- a/scenes/настройки/настройки.tscn +++ b/scenes/настройки/настройки.tscn @@ -1,9 +1,278 @@ [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 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) + profile.text = '' + for val in unit_data: + profile.text += str(val) + ',' + profile.text.rstrip(',') + 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() +" + [sub_resource type="StyleBoxTexture" id="StyleBoxTexture_pyq6h"] texture = ExtResource("3_dbpks") modulate_color = Color(0.8, 0.533333, 0.27451, 1) @@ -18,7 +287,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 +308,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 +324,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"] From 6fc6be666c5b583cc485a65b5d876b2caa0aedcf Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 2 Sep 2025 14:24:42 +0300 Subject: [PATCH 11/32] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=9F=D0=BE=D0=B4=D1=81=D1=87=D1=91?= =?UTF-8?q?=D1=82=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9=20=D1=81=D1=83=D0=BC=D0=BC=D1=83=20=D1=81=D0=BE?= =?UTF-8?q?=D0=B3=D0=BB=D0=B0=D1=81=D0=BE=D0=B2=D0=B0=D0=BD=20=D1=81=20?= =?UTF-8?q?=D0=A2=D1=83=D0=BB=D0=BE=D0=B9,=20=D1=80=D0=B0=D0=B7=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D1=87=D0=B8=D0=BA=D0=B0=D0=BC=D0=B8=20?= =?UTF-8?q?=D0=A1=D0=9F=D0=A2-25?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/network.gd | 71 ++++++++++++++++++++++++++++++---------------- scripts/spt25.gd | 12 +++----- 2 files changed, 51 insertions(+), 32 deletions(-) diff --git a/scripts/network.gd b/scripts/network.gd index 3a0c46f..8f9dbe2 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -11,40 +11,63 @@ var tick: int = 0 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): - tools.allways(data.size() >= 3, 'длина буфера меньше необходимого') - var i_sum: = data.size() - 3 - data.encode_u16(i_sum, 0) + 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) - data.encode_u16(i_sum, v_sum) - write_raw(data) + tx_buffer.encode_u16(i, v_sum) + i += 2 + tx_buffer[i] = FLAG + i += 1 + write_raw(tx_buffer.slice(0, i)) func _to_string() -> String: return 'последовательный порт \"%s\" @ %d (%s)' % [self.port, self.baudrate, 'открыт' if is_open() else 'закрыт'] func get_check_sum(src: PackedByteArray) -> int: - var P_DIV: = 0xf0b8 - var FCS = ~((src[2]<<8) + src[1]) - for i in range(3, src.size()): - var C = src[i] - for j in 8: - if C & 1: - if FCS & 1: - FCS = ((FCS >> 1) | 0x8000) ^ P_DIV + var fsc: = ~((src[1]<<8) + src[0]) + for i: int in range(2, src.size()): + var chr: = src[i] + for j: int in 8: + if chr & 1: + if fsc & 1: + fsc = ((fsc >> 1) | FSC_MASK) ^ P_DIV else: - FCS = ((FCS >> 1) | 0x8000) + fsc = ((fsc >> 1) | FSC_MASK) else: - if FCS & 1: - FCS = (FCS >> 1) ^ P_DIV + if fsc & 1: + fsc = (fsc >> 1) ^ P_DIV else: - FCS = FCS >> 1 - C >>= 1 - for j in 16: - if FCS & 1: - FCS = (FCS >> 1) ^ P_DIV + fsc = fsc >> 1 + chr >>= 1 + for j: int in 16: + if fsc & 1: + fsc = (fsc >> 1) ^ P_DIV else: - FCS = FCS >> 1 - return ~FCS - + fsc = fsc >> 1 + return ~fsc func try_open(parsing_proc: Callable): if is_open(): diff --git a/scripts/spt25.gd b/scripts/spt25.gd index 002e5e9..632a38f 100644 --- a/scripts/spt25.gd +++ b/scripts/spt25.gd @@ -15,16 +15,12 @@ class SPT25 extends unit.Unit: func _init(nm) -> void: self.name = nm - tx_data.resize(9) - 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] = 0 # Контрольная сумма ст. байт - tx_data[8] = 0x7e # Флаги синхронизации пакета func parse(rx_data: PackedByteArray, tick: int): From 945f621a597d6daf676e5f31a6c02c31142ff4bc Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 2 Sep 2025 14:27:58 +0300 Subject: [PATCH 12/32] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80.=20=D0=A1=D0=B5=D1=82=D0=B5=D0=B2=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20=D0=B8=20=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D0=B0=D1=82=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= =?UTF-8?q?=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/network.gd | 51 ++++++++++++------------ scripts/settings.gd | 95 +++++++++++++++++++++------------------------ 2 files changed, 71 insertions(+), 75 deletions(-) diff --git a/scripts/network.gd b/scripts/network.gd index 8f9dbe2..874d2c9 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -72,7 +72,7 @@ class SocketSerial extends SerialPort: 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) @@ -139,11 +139,11 @@ func on_serial_data(data, unit): unit.parse(data, tick) ## [param unit_name] - Уникальное имя устройства[br] func create_socket_udp(unit_name: StringName) -> SocketUDP: - var st = settings.UnitProfiles[unit_name] - var addr = st[1] - var port = st[2][0] - var broad = st[3] - var bind = st[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) @@ -154,9 +154,9 @@ func create_socket_udp(unit_name: StringName) -> SocketUDP: ## [param unit_name] - Уникальное имя устройства[br] func create_socket_tcp(unit_name: StringName) -> SocketTCP: - var st = settings.UnitProfiles[unit_name] - var addr = st[1] - var port = st[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) @@ -169,13 +169,14 @@ func create_socket_tcp(unit_name: StringName) -> SocketTCP: ## [param unit_name] - Уникальное имя устройства[br] func create_serial(unit_name: StringName) -> SocketSerial: - var st = settings.UnitProfiles[unit_name] - var port = st[1] - var baud = st[2][0] + var st = settings.UnitProfiles[unit_name][1] var serial: = SocketSerial.new() - serial.port = port - serial.baudrate = baud + 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 @@ -214,28 +215,28 @@ 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) 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) 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] + dst_ports[unit_name] = unit_profile[1] + dst_addrs[unit_name] = unit_profile[0] if proto in UDPJSON_PROTO: var new_unit = UDPJSON_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] + dst_ports[unit_name] = unit_profile[1] + dst_addrs[unit_name] = unit_profile[0] if proto in TCP_PROTO: var unit_tcp = TCP_PROTO[proto].new(unit_name) @@ -244,8 +245,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]) @@ -270,8 +271,8 @@ func _ready() -> void: 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]]) + var item = settings.UnitProfiles[key][1] + var addr_port: = StringName('%s:%d' % [item[0], item[1]]) addr_port_to_unit_name[addr_port] = StringName(key) diff --git a/scripts/settings.gd b/scripts/settings.gd index a7326b0..823ecd0 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -6,34 +6,34 @@ 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-адрес на котором принимают сообщения от навигации'], + # Название | Протокол | Адрес | Порт | Широковещательное | Привязывать к адресу | Внешнее | Комментарий + 'уарэп-яу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-адрес для приёма сообщений от службы \"МП550\"'], + 'уарэп-эмс': ['yau07tx', ['10.1.1.52', 50052, false, false], 'IP-адрес прибора УФ'], + 'уарэп-яу07-2в': ['yau07tx', ['10.1.1.22', 50022, false, false], 'IP-адрес прибора ПРД-В'], + 'уарэп-яу07-2н': ['yau07tx', ['10.1.1.21', 50021, false, false], 'IP-адрес прибора ПРД-Н'], + 'уарэп-яу07-2к': ['yau07tx', ['10.1.1.23', 50023, false, false], 'IP-адрес прибора ПРД-К'], + 'уарэп-яу07-4в': ['yau07tx', ['10.1.1.42', 50042, false, false], 'IP-адрес прибора ПРД-В'], + 'уарэп-яу07-4н': ['yau07tx', ['10.1.1.41', 50041, false, false], 'IP-адрес прибора ПРД-Н'], + 'уарэп-яу07-4к': ['yau07tx', ['10.1.1.43', 50043, false, false], 'IP-адрес прибора ПРД-К'], + 'уарэп-яу07-1в': ['yau07tx', ['10.1.1.12', 50012, false, false], 'IP-адрес прибора ПРД-В'], + 'уарэп-яу07-1н': ['yau07tx', ['10.1.1.11', 50011, false, false], 'IP-адрес прибора ПРД-Н'], + 'уарэп-яу07-1к': ['yau07tx', ['10.1.1.13', 50013, false, false], 'IP-адрес прибора ПРД-К'], + 'уарэп-яу07-3в': ['yau07tx', ['10.1.1.32', 50032, false, false], 'IP-адрес прибора ПРД-В'], + 'уарэп-яу07-3н': ['yau07tx', ['10.1.1.31', 50031, false, false], 'IP-адрес прибора ПРД-Н'], + 'уарэп-яу07-3к': ['yau07tx', ['10.1.1.33', 50033, false, false], 'IP-адрес прибора ПРД-Н'], + 'навигация': ['udprx', ['*', 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'], + 'уарэп-щ3': ['mbcs', ['/dev/ttyUSB0', 7, 19200, 'N', 8, 1, 50000], 'Параметры клиента Modbus Serial'], # Название: [ Протокол, Имя порта, Скорость, Чётность, ??, Комментарий - 'уарэп-спт25-1': ['spt25', '/dev/ttyUSB1', [19200, false, false], 'Адрес прибора СПТ-25 (G1)'], - 'уарэп-спт25-2': ['spt25', '/dev/ttyUSB2', [19200, false, false], 'Адрес прибора СПТ-25 (G2)'], + 'уарэп-спт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,9 +56,9 @@ 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('Не удалось открыть файл настроек, будут использованы настройики по умолчанию') return @@ -70,36 +70,31 @@ func _ready() -> void: return var json_data = json_conv.get_data() settings_program.merge(json_data) - for key in UnitProfiles.keys(): + 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) ## Возвращает полный путь к файлу с настройками From 80953ae6ec53893293baee65e64bce14f9dde991 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 2 Sep 2025 14:42:04 +0300 Subject: [PATCH 13/32] =?UTF-8?q?=D0=A7=D0=B8=D1=81=D1=82=D0=BA=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/контроль/контроль.tscn | 6 +++--- scripts/pribor-prd.gd | 7 +------ 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/scenes/контроль/контроль.tscn b/scenes/контроль/контроль.tscn index 4fccfce..1acae6c 100644 --- a/scenes/контроль/контроль.tscn +++ b/scenes/контроль/контроль.tscn @@ -268,7 +268,7 @@ patch_margin_top = 16 patch_margin_right = 16 patch_margin_bottom = 16 -[node name="label" type="Label" parent="pribor_rtr"] +[node name="label2" type="Label" parent="pribor_rtr"] layout_mode = 0 offset_left = 12.0 offset_top = -54.0 @@ -332,7 +332,7 @@ patch_margin_top = 16 patch_margin_right = 16 patch_margin_bottom = 16 -[node name="label" type="Label" parent="pribor_afsp_1"] +[node name="label2" type="Label" parent="pribor_afsp_1"] layout_mode = 0 offset_left = 165.0 offset_top = -245.0 @@ -398,7 +398,7 @@ patch_margin_top = 16 patch_margin_right = 16 patch_margin_bottom = 16 -[node name="label" type="Label" parent="pribor_afsp_2"] +[node name="label2" type="Label" parent="pribor_afsp_2"] layout_mode = 0 offset_left = 200.0 offset_top = -240.0 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]) From 48353cc904a7c2911ffc85ed9dadadf4259a7867 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Thu, 4 Sep 2025 08:56:20 +0300 Subject: [PATCH 14/32] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80.=20=D0=A1=D0=B5=D1=82=D0=B5=D0=B2=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/настройки/настройки.tscn | 2 +- scripts/network.gd | 28 ++++++++--------- scripts/settings.gd | 54 ++++++++++++++++----------------- 3 files changed, 40 insertions(+), 44 deletions(-) diff --git a/scenes/настройки/настройки.tscn b/scenes/настройки/настройки.tscn index 0b0ec62..169f03a 100644 --- a/scenes/настройки/настройки.tscn +++ b/scenes/настройки/настройки.tscn @@ -206,7 +206,7 @@ func setting_tab(): var param_name = SETTING_TABLE[i][0] if not settings.UnitProfiles.has(param_name): continue - var unit_data = settings.UnitProfiles[param_name] + var unit_data = settings.UnitProfiles[param_name][1] var profile = $scroll_set/table.get_node2(1, i) profile.text = '' for val in unit_data: diff --git a/scripts/network.gd b/scripts/network.gd index 874d2c9..cb0dc76 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -42,32 +42,28 @@ class SocketSerial extends SerialPort: i += 2 tx_buffer[i] = FLAG i += 1 - write_raw(tx_buffer.slice(0, i)) + # Эта последовательность для запроса состояния, получена от разработчиков СПТ-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 fsc: = ~((src[1]<<8) + src[0]) + 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 fsc & 1: - fsc = ((fsc >> 1) | FSC_MASK) ^ P_DIV + if fcs & 1: + fcs = ((fcs >> 1) | FSC_MASK) ^ P_DIV else: - fsc = ((fsc >> 1) | FSC_MASK) + fcs = ((fcs >> 1) | FSC_MASK) else: - if fsc & 1: - fsc = (fsc >> 1) ^ P_DIV - else: - fsc = fsc >> 1 + fcs = (fcs >> 1) ^ P_DIV if fcs & 1 else fcs >> 1 chr >>= 1 - for j: int in 16: - if fsc & 1: - fsc = (fsc >> 1) ^ P_DIV - else: - fsc = fsc >> 1 - return ~fsc + 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(): @@ -327,7 +323,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: diff --git a/scripts/settings.gd b/scripts/settings.gd index 823ecd0..92858a4 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -5,35 +5,35 @@ 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-адрес для приёма сообщений от службы \"МП550\"'], - 'уарэп-эмс': ['yau07tx', ['10.1.1.52', 50052, false, false], 'IP-адрес прибора УФ'], - 'уарэп-яу07-2в': ['yau07tx', ['10.1.1.22', 50022, false, false], 'IP-адрес прибора ПРД-В'], - 'уарэп-яу07-2н': ['yau07tx', ['10.1.1.21', 50021, false, false], 'IP-адрес прибора ПРД-Н'], - 'уарэп-яу07-2к': ['yau07tx', ['10.1.1.23', 50023, false, false], 'IP-адрес прибора ПРД-К'], - 'уарэп-яу07-4в': ['yau07tx', ['10.1.1.42', 50042, false, false], 'IP-адрес прибора ПРД-В'], - 'уарэп-яу07-4н': ['yau07tx', ['10.1.1.41', 50041, false, false], 'IP-адрес прибора ПРД-Н'], - 'уарэп-яу07-4к': ['yau07tx', ['10.1.1.43', 50043, false, false], 'IP-адрес прибора ПРД-К'], - 'уарэп-яу07-1в': ['yau07tx', ['10.1.1.12', 50012, false, false], 'IP-адрес прибора ПРД-В'], - 'уарэп-яу07-1н': ['yau07tx', ['10.1.1.11', 50011, false, false], 'IP-адрес прибора ПРД-Н'], - 'уарэп-яу07-1к': ['yau07tx', ['10.1.1.13', 50013, false, false], 'IP-адрес прибора ПРД-К'], - 'уарэп-яу07-3в': ['yau07tx', ['10.1.1.32', 50032, false, false], 'IP-адрес прибора ПРД-В'], - 'уарэп-яу07-3н': ['yau07tx', ['10.1.1.31', 50031, false, false], 'IP-адрес прибора ПРД-Н'], - 'уарэп-яу07-3к': ['yau07tx', ['10.1.1.33', 50033, false, false], 'IP-адрес прибора ПРД-Н'], - 'навигация': ['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'], + 'уарэп-капсрпб': ['json-capsrpb', ['127.0.0.1', 42023, 42022, false, true], 'IP-адрес для приёма сообщений от службы \"МП550\"'], + 'уарэп-эмс': ['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'], + 'навигация': ['udprx', ['*', 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': ['spt25', ['/dev/ttyUSB1', 0, 19200, 'N', 8, 1], 'Прибор СПТ-25 (G1)'], - 'уарэп-спт25-2': ['spt25', ['/dev/ttyUSB2', 0, 19200, 'N', 8, 1], 'Прибор СПТ-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)'], } ## Параметры цели. @@ -66,7 +66,7 @@ func _ready() -> void: file.close() var json_conv: = JSON.new() if Error.OK != json_conv.parse(read): - log.info('Не удалось разобрать файл настроек: ошибка в содержании, будут использованы настройики по умолчанию') + log.info('Не удалось разобрать файл настроек: ошибка в содержании, будут использованы значения по умолчанию') return var json_data = json_conv.get_data() settings_program.merge(json_data) From c9e0e3ae0b5630665ae04a06b16c2c543eaf17ad Mon Sep 17 00:00:00 2001 From: sasha80 Date: Mon, 8 Sep 2025 15:19:03 +0300 Subject: [PATCH 15/32] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/настройки/настройки.tscn | 10 +++++----- scripts/capsrpb.gd | 2 +- scripts/sch3.gd | 6 +++--- scripts/settings.gd | 14 +++++++++----- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/scenes/настройки/настройки.tscn b/scenes/настройки/настройки.tscn index 169f03a..9d845af 100644 --- a/scenes/настройки/настройки.tscn +++ b/scenes/настройки/настройки.tscn @@ -62,7 +62,7 @@ const SETTING_TABLE = [ ['Адрес БПО левого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'], ['Адрес БПО правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'] ] -const EXTERNAL_CU = 16 ## Внешнее целееуказание +const EXTERNAL_CU = 16 ## Внешнее целеуказание const SUPPRESS = 17 ## Строка - Подавление const KEYBOARD = 18 ## Строка - Виртуальная клавиатура const HIDE_EMS2 = 19 ## Строка - Скрыть вкладку ЭМС 2 @@ -261,13 +261,13 @@ func _on_btn_save_settings_pressed(): 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) + 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) + var json_string: = JSON.stringify(json_data, ' ', true) if file.store_string(json_string): log.info('Настройки сохранены в файл \\\"%s\\\"' % abs_path) file.close() diff --git a/scripts/capsrpb.gd b/scripts/capsrpb.gd index 31f2ec1..7c216db 100644 --- a/scripts/capsrpb.gd +++ b/scripts/capsrpb.gd @@ -23,7 +23,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/sch3.gd b/scripts/sch3.gd index c08702a..baa615a 100644 --- a/scripts/sch3.gd +++ b/scripts/sch3.gd @@ -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: diff --git a/scripts/settings.gd b/scripts/settings.gd index 92858a4..e9b7afc 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -60,13 +60,17 @@ func _ready() -> void: log.info('Путь к файлу настроек: \"%s\"' % abs_path) 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) @@ -90,7 +94,7 @@ func _ready() -> void: else: var tp: = type_string(typeof(vp[i])) var tj: = type_string(typeof(vj[i])) - log.error('%s: ожидается тип \"%s\", но прочитан тип \"%s\" [%d]' % [key, tp, tj, i]) + log.error('%s: ожидается тип \"%s\", но получен тип \"%s\" [%d]' % [key, tp, tj, i]) parse_ok = false break if parse_ok: @@ -98,7 +102,7 @@ func _ready() -> void: ## Возвращает полный путь к файлу с настройками -func get_settings_file_path(): +func get_settings_file_path() -> String: return ProjectSettings.get_setting( 'application/config/settings_path', 'user://settings.json') From a2e5013c009a4d12ffa044031b2eb38b3e48feca Mon Sep 17 00:00:00 2001 From: sasha80 Date: Mon, 8 Sep 2025 15:27:06 +0300 Subject: [PATCH 16/32] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80.=20=D0=A1=D0=B5=D1=82=D0=B5=D0=B2=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/настройки/настройки.tscn | 51 ++++++---------- scripts/capsrpb.gd | 1 + scripts/interfer.gd | 3 + scripts/network.gd | 100 ++++++++++++++++++-------------- 4 files changed, 76 insertions(+), 79 deletions(-) diff --git a/scenes/настройки/настройки.tscn b/scenes/настройки/настройки.tscn index 9d845af..3a87ec6 100644 --- a/scenes/настройки/настройки.tscn +++ b/scenes/настройки/настройки.tscn @@ -141,30 +141,12 @@ func parse_cmd_line_args(settings_data: Dictionary): 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]) @@ -211,7 +193,7 @@ func setting_tab(): profile.text = '' for val in unit_data: profile.text += str(val) + ',' - profile.text.rstrip(',') + profile.text = profile.text.trim_suffix(',') button_settings() @@ -232,25 +214,26 @@ func _on_btn_save_settings_pressed(): 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: - 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) + 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: - port = port.strip_edges() - if port.is_valid_int(): - port = int(port) - json_data[parameter].append(port) + # 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): diff --git a/scripts/capsrpb.gd b/scripts/capsrpb.gd index 7c216db..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 diff --git a/scripts/interfer.gd b/scripts/interfer.gd index c1ca8c5..d402555 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -210,6 +210,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 cb0dc76..cd55dff 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -1,7 +1,7 @@ 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 CAPS_PROTO: = {'json-capsrpb': capsrpb.CapsRpb} const TCP_PROTO: = {'5p28': tcp5p28.TCP5P28} const SERIAL_PROTO: = {'spt25': spt25.SPT25} const MODBUS_PROTO: = {'mbcs': sch3.Sch3} @@ -114,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, SocketSerial] ## Последовательные порты (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] ## Преобразование адрес:порт в имя устройства @@ -136,15 +134,32 @@ func on_serial_data(data, unit): unit.parse(data, tick) ## [param unit_name] - Уникальное имя устройства[br] func create_socket_udp(unit_name: StringName) -> SocketUDP: var st = settings.UnitProfiles[unit_name][1] - var addr = st[0] - var port = st[1] + var addr = st[0] + var port = st[1] var broad = st[2] - var bind = st[3] + 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 port0 = st[1] + var sock: = SocketUDP.new() + var rc: = sock.bind(port0, addr) + if rc == Error.OK: + log.info('\"%s\" привязан к %s:%d' % [unit_name, addr, port0]) + else: + var errmsg = error_string(rc) + log.error('привязка \"%s\" к %s:%d не удалась: \"%s\"' % [unit_name, addr, port0, errmsg]) return sock @@ -183,16 +198,14 @@ 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('уарэп-капсрпб') + poll_sockets = [sock_unicast, sock_broadcast, sock_caps, sock_navi] 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_unicast send_sockets['уарэп-яу07-2в'] = sock_unicast send_sockets['уарэп-яу07-2н'] = sock_unicast @@ -220,19 +233,21 @@ func _ready() -> void: units_udprx[unit_name] = new_unit 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[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 CAPS_PROTO: + var new_unit = CAPS_PROTO[proto].new(unit_name) units[unit_name] = new_unit - units_udp[unit_name] = new_unit - dst_ports[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) @@ -259,18 +274,13 @@ func _ready() -> void: 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][1] - var addr_port: = StringName('%s:%d' % [item[0], item[1]]) - 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) @@ -304,14 +314,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) @@ -371,11 +381,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) From 4abf80aefb9f8ef734857be2d33293d3906a12c6 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 9 Sep 2025 11:31:34 +0300 Subject: [PATCH 17/32] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=92=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5?= =?UTF-8?q?=D1=81=D1=81=D0=B5.=20=D0=9E=D1=82=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD?= =?UTF-8?q?=D0=B8=D1=85=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9=20=D0=B2=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=20=D0=9A=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/контроль/контроль.tscn | 351 +++++++++++++++++++++++++--------- scenes/работа/работа.tscn | 2 +- 2 files changed, 265 insertions(+), 88 deletions(-) diff --git a/scenes/контроль/контроль.tscn b/scenes/контроль/контроль.tscn index 1acae6c..6b6eb5e 100644 --- a/scenes/контроль/контроль.tscn +++ b/scenes/контроль/контроль.tscn @@ -24,7 +24,6 @@ script/source = "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'], @@ -122,14 +121,15 @@ grow_vertical = 2 script = SubResource("GDScript_iqgf5") metadata/_edit_lock_ = true -[node name="externals" type="TextureButton" parent="." groups=["pribor_buttons"]] +[node name="capsrpb" type="TextureButton" 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 = 941.0 +offset_top = 992.0 +offset_right = 1197.0 +offset_bottom = 1248.0 +scale = Vector2(0.25, 0.25) size_flags_horizontal = 15 size_flags_vertical = 15 toggle_mode = true @@ -139,18 +139,18 @@ 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)] -[node name="label" type="Label" parent="externals"] +[node name="label" type="Label" parent="capsrpb"] layout_mode = 0 -offset_left = -40.0 -offset_top = -28.0 -offset_right = 121.0 -offset_bottom = -9.0 -scale = Vector2(2, 2) -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"] +[node name="frame" type="NinePatchRect" parent="capsrpb"] visible = false self_modulate = Color(0.890196, 0.486275, 0.196078, 1) layout_mode = 0 @@ -166,11 +166,169 @@ 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") +frame_progress = 0.72355 +script = ExtResource("11_u7tym") + +[node name="5p28" type="TextureButton" parent="."] +editor_description = "Кнопка для отображения внешних соединений." +self_modulate = Color(0.788235, 0.788235, 0.788235, 1) +layout_mode = 0 +offset_left = 1123.0 +offset_top = 992.0 +offset_right = 1379.0 +offset_bottom = 1248.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)] + +[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="frame" type="NinePatchRect" parent="5p28"] +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="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="TextureButton" parent="."] +editor_description = "Кнопка для отображения внешних соединений." +self_modulate = Color(0.788235, 0.788235, 0.788235, 1) +layout_mode = 0 +offset_left = 1299.0 +offset_top = 992.0 +offset_right = 1555.0 +offset_bottom = 1248.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)] + +[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="frame" type="NinePatchRect" parent="akng"] +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="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="TextureButton" parent="."] +editor_description = "Кнопка для отображения внешних соединений." +self_modulate = Color(0.788235, 0.788235, 0.788235, 1) +layout_mode = 0 +offset_left = 1458.0 +offset_top = 992.0 +offset_right = 1714.0 +offset_bottom = 1248.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)] + +[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="frame" type="NinePatchRect" parent="maps"] +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="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") @@ -178,9 +336,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 @@ -218,7 +376,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) @@ -229,9 +386,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 @@ -279,7 +436,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) @@ -290,10 +446,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 @@ -344,7 +500,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) @@ -355,10 +510,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 @@ -410,7 +565,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) @@ -421,9 +575,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 @@ -462,7 +616,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) @@ -473,9 +626,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 @@ -515,7 +668,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) @@ -526,9 +678,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 @@ -570,7 +722,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) @@ -581,9 +732,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 @@ -623,7 +774,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) @@ -634,10 +784,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 @@ -676,7 +826,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) @@ -687,10 +836,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 @@ -729,7 +878,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) @@ -740,10 +888,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 @@ -782,7 +930,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) @@ -793,10 +940,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 @@ -835,7 +982,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) @@ -846,10 +992,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 @@ -888,7 +1034,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) @@ -899,10 +1044,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 @@ -941,7 +1086,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) @@ -952,9 +1096,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 @@ -993,7 +1137,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) @@ -1004,9 +1147,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 @@ -1045,7 +1188,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) @@ -1056,9 +1198,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 @@ -1097,7 +1239,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) @@ -1173,7 +1314,43 @@ 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, 1136) +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 = "Отключен" + +[node name="connect_legend1" type="AnimatedSprite2D" parent="."] +self_modulate = Color(0, 1, 0, 1) +light_mask = 3 +position = Vector2(975, 1136) +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 = "На связи" + +[connection signal="toggled" from="capsrpb" to="capsrpb" method="_on_toggled"] +[connection signal="toggled" from="5p28" to="5p28" method="_on_toggled"] +[connection signal="toggled" from="akng" to="akng" method="_on_toggled"] +[connection signal="toggled" from="maps" to="maps" method="_on_toggled"] [connection signal="toggled" from="pribor_uf" to="pribor_uf" method="_on_toggled"] [connection signal="toggled" from="pribor_rtr" to="pribor_rtr" method="_on_toggled"] [connection signal="toggled" from="pribor_afsp_1" to="pribor_afsp_1" method="_on_toggled"] diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 64b1bbd..6d64518 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -305,6 +305,6 @@ text = "Масштаб:" [connection signal="drag_continue" from="." to="." method="_on_drag_continue"] [connection signal="toggled" from="btn_view" to="." method="on_button_view_toggled"] [connection signal="toggled" from="chk_auto" to="." method="on_value_changed"] -[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"] [connection signal="toggled" from="btn_activate" to="." method="on_btn_activate"] +[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"] [connection signal="toggled" from="btn_center" to="." method="on_btn_center_toggled"] From dca6591b62425a8ab9d20beeb0d69c076a19e0ee Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 9 Sep 2025 11:33:25 +0300 Subject: [PATCH 18/32] =?UTF-8?q?=D0=A0=D0=B5=D0=B3=D1=80=D0=B5=D1=81?= =?UTF-8?q?=D1=81=D0=B8=D1=8F.=20=D0=9F=D0=BE=D1=82=D0=B5=D1=80=D1=8F?= =?UTF-8?q?=D0=BB=D0=B0=D1=81=D1=8C=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B3=D0=BB=D0=BE=D0=B1=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/settings.gd | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/settings.gd b/scripts/settings.gd index e9b7afc..3621ef5 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -74,6 +74,8 @@ func _ready() -> void: return var json_data = json_conv.get_data() settings_program.merge(json_data) + 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 From 7bdfd0e0f1bd1582370c345658dbcdded364cb91 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 9 Sep 2025 11:34:04 +0300 Subject: [PATCH 19/32] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/tools.gd | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/tools.gd b/scripts/tools.gd index 2a41a74..c9742eb 100644 --- a/scripts/tools.gd +++ b/scripts/tools.gd @@ -131,7 +131,8 @@ 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) \ From c6be89d2d2e4ebf0ad75f85f0b79e2b7ecbf8d46 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 9 Sep 2025 11:34:27 +0300 Subject: [PATCH 20/32] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=91=D0=BE=D0=BB=D0=B5=D0=B5=20=D1=82?= =?UTF-8?q?=D0=BE=D1=87=D0=BD=D0=B0=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D0=B0=20=D0=BD=D0=B0=20ip-=D0=B0=D0=B4=D1=80=D0=B5?= =?UTF-8?q?=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/tools.gd | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/tools.gd b/scripts/tools.gd index c9742eb..6b061c6 100644 --- a/scripts/tools.gd +++ b/scripts/tools.gd @@ -136,6 +136,7 @@ func get_members_names(obj: Object) -> Array: 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) From 2138b1da63b60af30f48b709aaee5bf69afa37e2 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 9 Sep 2025 11:54:15 +0300 Subject: [PATCH 21/32] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=91=D0=BE=D0=BB=D0=B5=D0=B5=20=D1=82?= =?UTF-8?q?=D0=BE=D1=87=D0=BD=D0=B0=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D0=B0=20=D0=BD=D0=B0=20ip-=D0=B0=D0=B4=D1=80=D0=B5?= =?UTF-8?q?=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/settings.gd | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/settings.gd b/scripts/settings.gd index 3621ef5..9b1fe7b 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -25,13 +25,13 @@ var UnitProfiles: Dictionary[StringName, Array] = { \ 'уарэп-яу07-3к': ['yau07tx', ['10.1.1.33', 50033, false, false], 'IP-адрес прибора ПРД-К3'], 'навигация': ['udprx', ['*', 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, Скорость, Чётность, Бит на символ, Стоп битов, Время на ожидание ответа в мкс], Комментарий > + # < Название: Протокол, < Имя порта, Адрес modbus, Скорость, Чётность, Бит на символ, Стоп битов, Время на ожидание ответа в мкс >, Комментарий > 'уарэп-щ3': ['mbcs', ['/dev/ttyUSB0', 7, 19200, 'N', 8, 1, 50000], 'Параметры клиента Modbus Serial'], - # < Название: [ Протокол, Имя порта, Адрес СПТ-25, Скорость, Чётность, Бит на символ, Стоп битов, Комментарий > + # < Название: Протокол, < Имя порта, Адрес СПТ-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)'], } From ecf513497aff87d3223e9716561c1657dc049d25 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 9 Sep 2025 14:27:55 +0300 Subject: [PATCH 22/32] =?UTF-8?q?=D0=A0=D0=B5=D0=B3=D1=80=D0=B5=D1=81?= =?UTF-8?q?=D1=81=D0=B8=D1=8F.=20=D0=A0=D0=B5=D0=B6=D0=B8=D0=BC=20=D0=9D?= =?UTF-8?q?=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B8.=20=D0=98?= =?UTF-8?q?=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B0=20=D0=BF=D0=B0=D1=80?= =?UTF-8?q?=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2=20=D0=B2=20=D1=82?= =?UTF-8?q?=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/настройки/настройки.tscn | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/scenes/настройки/настройки.tscn b/scenes/настройки/настройки.tscn index 3a87ec6..b69067f 100644 --- a/scenes/настройки/настройки.tscn +++ b/scenes/настройки/настройки.tscn @@ -186,14 +186,19 @@ func setting_tab(): 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][1] var profile = $scroll_set/table.get_node2(1, i) - profile.text = '' - for val in unit_data: - profile.text += str(val) + ',' - profile.text = profile.text.trim_suffix(',') + 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() From 8132cba86319b00c21008889b5cee2a8388a2597 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 9 Sep 2025 14:37:30 +0300 Subject: [PATCH 23/32] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/network.gd | 6 +++--- scripts/settings.gd | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/network.gd b/scripts/network.gd index cd55dff..a51a789 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -5,7 +5,7 @@ const CAPS_PROTO: = {'json-capsrpb': capsrpb.CapsRpb} const TCP_PROTO: = {'5p28': tcp5p28.TCP5P28} 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 @@ -227,8 +227,8 @@ func _ready() -> void: 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[1] diff --git a/scripts/settings.gd b/scripts/settings.gd index 9b1fe7b..27b8a57 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -23,7 +23,7 @@ var UnitProfiles: Dictionary[StringName, Array] = { \ 'уарэп-яу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'], - 'навигация': ['udprx', ['*', 60000, true, true ], 'IP-адрес на котором принимают сообщения от навигации'], + 'навигация': ['navi', ['*', 60000, true, true ], 'IP-адрес на котором принимают сообщения от навигации'], # < Название: Протокол, < Адрес, Порт получения >, Комментарий > 'уарэп-5п28': ['5p28', ['127.0.0.1', 50000], 'IP-адрес комплекса 5П-28'], From a65ae5655116b72ede7aedc9cd4eaf7fe73340aa Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 9 Sep 2025 14:47:41 +0300 Subject: [PATCH 24/32] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=84=D0=B0=D0=B9=D0=BB=20=D0=BD=D0=B0=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B5=D0=BA,=20=D0=B4=D0=BB=D1=8F=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- settings.json | 160 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 settings.json 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 From 39933fb5b9630c93003a6f6e6b77e2df7e0d1387 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 9 Sep 2025 15:05:29 +0300 Subject: [PATCH 25/32] Godot4.4 --- scenes/работа/работа.tscn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 6d64518..64b1bbd 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -305,6 +305,6 @@ text = "Масштаб:" [connection signal="drag_continue" from="." to="." method="_on_drag_continue"] [connection signal="toggled" from="btn_view" to="." method="on_button_view_toggled"] [connection signal="toggled" from="chk_auto" to="." method="on_value_changed"] -[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate"] [connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"] +[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate"] [connection signal="toggled" from="btn_center" to="." method="on_btn_center_toggled"] From 4dfc526f9d224e3378114cc0657ad6155fe3c9c7 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 9 Sep 2025 15:05:54 +0300 Subject: [PATCH 26/32] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/network.gd | 2 +- scripts/settings.gd | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/network.gd b/scripts/network.gd index a51a789..6369ed2 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -1,7 +1,7 @@ class_name Network extends Node const YAU07_PROTO: = {'yau07tx': yau07.YaU07} -const CAPS_PROTO: = {'json-capsrpb': capsrpb.CapsRpb} +const CAPS_PROTO: = {'capsrpb': capsrpb.CapsRpb} const TCP_PROTO: = {'5p28': tcp5p28.TCP5P28} const SERIAL_PROTO: = {'spt25': spt25.SPT25} const MODBUS_PROTO: = {'mbcs': sch3.Sch3} diff --git a/scripts/settings.gd b/scripts/settings.gd index 27b8a57..c0a2a3c 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -9,7 +9,7 @@ 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-адрес для приёма сообщений от службы \"МП550\"'], + 'уарэп-капсрпб': ['capsrpb', ['127.0.0.1', 42023, 42022, false, true], 'IP-адрес для приёма сообщений от службы \"МП550\"'], 'уарэп-эмс': ['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'], From e48e9c48b037a367e43d4c150ea41e7b8675f9a3 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 9 Sep 2025 16:12:12 +0300 Subject: [PATCH 27/32] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20"=D0=A2=D1=80=D0=B0=D1=81=D1=81=D1=8B"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project.godot | 1 + scripts/network.gd | 18 ++++++++++-------- scripts/settings.gd | 3 ++- scripts/trassa.gd | 12 ++++++++++++ scripts/trassa.gd.uid | 1 + 5 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 scripts/trassa.gd create mode 100644 scripts/trassa.gd.uid 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/scripts/network.gd b/scripts/network.gd index 6369ed2..31f1957 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -1,7 +1,7 @@ class_name Network extends Node const YAU07_PROTO: = {'yau07tx': yau07.YaU07} -const CAPS_PROTO: = {'capsrpb': capsrpb.CapsRpb} +const UDP_PROTO: = {'capsrpb': capsrpb.CapsRpb, 'trassa': trassa.Trassa} const TCP_PROTO: = {'5p28': tcp5p28.TCP5P28} const SERIAL_PROTO: = {'spt25': spt25.SPT25} const MODBUS_PROTO: = {'mbcs': sch3.Sch3} @@ -152,14 +152,14 @@ func create_socket_udp(unit_name: StringName) -> SocketUDP: func create_socket_caps(unit_name: StringName) -> SocketUDP: var st = settings.UnitProfiles[unit_name][1] var addr = st[0] - var port0 = st[1] + var port = st[1] var sock: = SocketUDP.new() - var rc: = sock.bind(port0, addr) + var rc: = sock.bind(port, addr) if rc == Error.OK: - log.info('\"%s\" привязан к %s:%d' % [unit_name, addr, port0]) + log.info('\"%s\" привязан к %s:%d' % [unit_name, addr, port]) else: var errmsg = error_string(rc) - log.error('привязка \"%s\" к %s:%d не удалась: \"%s\"' % [unit_name, addr, port0, errmsg]) + log.error('привязка \"%s\" к %s:%d не удалась: \"%s\"' % [unit_name, addr, port, errmsg]) return sock @@ -202,10 +202,12 @@ func _ready() -> void: var sock_broadcast: = create_socket_udp('уарэп-яу07-общий') var sock_navi: = create_socket_udp('навигация') var sock_caps: = create_socket_caps('уарэп-капсрпб') - poll_sockets = [sock_unicast, sock_broadcast, sock_caps, sock_navi] + 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-общий'] = 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 @@ -242,8 +244,8 @@ func _ready() -> void: var addr_port: = StringName('%s:%d' % [unit_profile[0], unit_profile[1]]) addr_port_to_unit_name[addr_port] = unit_name - if proto in CAPS_PROTO: - var new_unit = CAPS_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_udptx[unit_name] = new_unit dst_addrs[unit_name] = unit_profile[0] diff --git a/scripts/settings.gd b/scripts/settings.gd index c0a2a3c..09246d6 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -9,7 +9,8 @@ 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\"'], + 'уарэп-капсрпб': ['capsrpb', ['127.0.0.1', 42023, 42022, false, true], 'IP-адрес для обмена сообщениями со службой \"МП550\" (СТЦ)'], + 'уарэп-трасса': ['capsrpb', ['127.0.0.1', 50200, 40241, 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'], diff --git a/scripts/trassa.gd b/scripts/trassa.gd new file mode 100644 index 0000000..164afa3 --- /dev/null +++ b/scripts/trassa.gd @@ -0,0 +1,12 @@ +class_name trassa_unit extends Node + + +class Trassa extends unit.Unit: + 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 From ab005a81c5ef27cf494e1c2e9a7e9a9364b685f4 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 9 Sep 2025 16:12:21 +0300 Subject: [PATCH 28/32] Godot4.4 --- scenes/работа/работа.tscn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 64b1bbd..6d64518 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -305,6 +305,6 @@ text = "Масштаб:" [connection signal="drag_continue" from="." to="." method="_on_drag_continue"] [connection signal="toggled" from="btn_view" to="." method="on_button_view_toggled"] [connection signal="toggled" from="chk_auto" to="." method="on_value_changed"] -[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"] [connection signal="toggled" from="btn_activate" to="." method="on_btn_activate"] +[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"] [connection signal="toggled" from="btn_center" to="." method="on_btn_center_toggled"] From 523996bc46daa03abee59d6f171d3240091213de Mon Sep 17 00:00:00 2001 From: sasha80 Date: Wed, 10 Sep 2025 09:46:40 +0300 Subject: [PATCH 29/32] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B2=D0=B8=D0=B4=D0=B0=20=D0=B2=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B6=D0=B8=D0=BC=D0=B5=20=D0=9A=D0=BE=D0=BD=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/контроль/контроль.tscn | 168 ++++++++++------------------------ scenes/работа/работа.tscn | 2 +- 2 files changed, 51 insertions(+), 119 deletions(-) diff --git a/scenes/контроль/контроль.tscn b/scenes/контроль/контроль.tscn index 6b6eb5e..18cbb08 100644 --- a/scenes/контроль/контроль.tscn +++ b/scenes/контроль/контроль.tscn @@ -121,23 +121,18 @@ grow_vertical = 2 script = SubResource("GDScript_iqgf5") metadata/_edit_lock_ = true -[node name="capsrpb" type="TextureButton" parent="."] +[node name="capsrpb" type="TextureRect" parent="."] editor_description = "Кнопка для отображения внешних соединений." self_modulate = Color(0.788235, 0.788235, 0.788235, 1) layout_mode = 0 offset_left = 941.0 -offset_top = 992.0 +offset_top = 1021.0 offset_right = 1197.0 -offset_bottom = 1248.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") [node name="label" type="Label" parent="capsrpb"] layout_mode = 0 @@ -150,22 +145,6 @@ text = "КАПС РПБ" horizontal_alignment = 1 vertical_alignment = 1 -[node name="frame" type="NinePatchRect" parent="capsrpb"] -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="capsrpb"] light_mask = 3 position = Vector2(56, -4) @@ -174,23 +153,18 @@ sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.72355 script = ExtResource("11_u7tym") -[node name="5p28" type="TextureButton" parent="."] +[node name="5p28" type="TextureRect" parent="."] editor_description = "Кнопка для отображения внешних соединений." self_modulate = Color(0.788235, 0.788235, 0.788235, 1) layout_mode = 0 offset_left = 1123.0 -offset_top = 992.0 +offset_top = 1021.0 offset_right = 1379.0 -offset_bottom = 1248.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") [node name="label" type="Label" parent="5p28"] layout_mode = 0 @@ -203,22 +177,6 @@ text = "5П28" horizontal_alignment = 1 vertical_alignment = 1 -[node name="frame" type="NinePatchRect" parent="5p28"] -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="5p28"] light_mask = 3 position = Vector2(52, -4) @@ -227,23 +185,18 @@ sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.72355 script = ExtResource("11_u7tym") -[node name="akng" type="TextureButton" parent="."] +[node name="akng" type="TextureRect" parent="."] editor_description = "Кнопка для отображения внешних соединений." self_modulate = Color(0.788235, 0.788235, 0.788235, 1) layout_mode = 0 offset_left = 1299.0 -offset_top = 992.0 +offset_top = 1021.0 offset_right = 1555.0 -offset_bottom = 1248.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") [node name="label" type="Label" parent="akng"] layout_mode = 0 @@ -256,22 +209,6 @@ text = "АКНГ" horizontal_alignment = 1 vertical_alignment = 1 -[node name="frame" type="NinePatchRect" parent="akng"] -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="akng"] light_mask = 3 position = Vector2(47.9999, -4) @@ -280,23 +217,18 @@ sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.72355 script = ExtResource("11_u7tym") -[node name="maps" type="TextureButton" parent="."] +[node name="maps" type="TextureRect" parent="."] editor_description = "Кнопка для отображения внешних соединений." self_modulate = Color(0.788235, 0.788235, 0.788235, 1) layout_mode = 0 offset_left = 1458.0 -offset_top = 992.0 +offset_top = 1021.0 offset_right = 1714.0 -offset_bottom = 1248.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") [node name="label" type="Label" parent="maps"] layout_mode = 0 @@ -309,22 +241,6 @@ text = "Карты" horizontal_alignment = 1 vertical_alignment = 1 -[node name="frame" type="NinePatchRect" parent="maps"] -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="maps"] light_mask = 3 position = Vector2(47.9999, -4) @@ -1249,9 +1165,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") @@ -1259,9 +1175,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 = "Ожидание результата" @@ -1269,27 +1185,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") @@ -1297,9 +1213,9 @@ 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 = "Сбой" @@ -1316,7 +1232,7 @@ vertical_alignment = 1 [node name="connect_legend0" type="AnimatedSprite2D" parent="."] light_mask = 3 -position = Vector2(1219, 1136) +position = Vector2(1219, 1151) scale = Vector2(0.65, 0.65) sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.72355 @@ -1329,11 +1245,12 @@ 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, 1136) +position = Vector2(975, 1152) scale = Vector2(0.65, 0.65) sprite_frames = SubResource("SpriteFrames_foasq") frame = 1 @@ -1346,11 +1263,26 @@ 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, 936) +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="capsrpb" to="capsrpb" method="_on_toggled"] -[connection signal="toggled" from="5p28" to="5p28" method="_on_toggled"] -[connection signal="toggled" from="akng" to="akng" method="_on_toggled"] -[connection signal="toggled" from="maps" to="maps" method="_on_toggled"] [connection signal="toggled" from="pribor_uf" to="pribor_uf" method="_on_toggled"] [connection signal="toggled" from="pribor_rtr" to="pribor_rtr" method="_on_toggled"] [connection signal="toggled" from="pribor_afsp_1" to="pribor_afsp_1" method="_on_toggled"] diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 6d64518..64b1bbd 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -305,6 +305,6 @@ text = "Масштаб:" [connection signal="drag_continue" from="." to="." method="_on_drag_continue"] [connection signal="toggled" from="btn_view" to="." method="on_button_view_toggled"] [connection signal="toggled" from="chk_auto" to="." method="on_value_changed"] -[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate"] [connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"] +[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate"] [connection signal="toggled" from="btn_center" to="." method="on_btn_center_toggled"] From 85dfa5c56793acb7f66ca03f6aef745095e5d2bc Mon Sep 17 00:00:00 2001 From: sasha80 Date: Wed, 10 Sep 2025 13:11:47 +0300 Subject: [PATCH 30/32] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0.=20=D0=92=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5?= =?UTF-8?q?=D1=81=D1=81=D0=B5.=20=D0=9E=D1=82=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD?= =?UTF-8?q?=D0=B8=D1=85=20=D0=BF=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9=20=D0=B2=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=20=D0=9A=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D1=8C.=20?= =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20"?= =?UTF-8?q?=D0=A2=D1=80=D0=B0=D1=81=D1=81=D0=B0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/контроль/внешний.gd | 12 +++++++ scenes/контроль/внешний.gd.uid | 1 + scenes/контроль/контроль.tscn | 64 ++++++++++++++++++++++++++++------ 3 files changed, 66 insertions(+), 11 deletions(-) create mode 100644 scenes/контроль/внешний.gd create mode 100644 scenes/контроль/внешний.gd.uid 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/контроль/контроль.tscn b/scenes/контроль/контроль.tscn index 18cbb08..b62b858 100644 --- a/scenes/контроль/контроль.tscn +++ b/scenes/контроль/контроль.tscn @@ -1,6 +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="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"] @@ -125,14 +126,16 @@ metadata/_edit_lock_ = true editor_description = "Кнопка для отображения внешних соединений." self_modulate = Color(0.788235, 0.788235, 0.788235, 1) layout_mode = 0 -offset_left = 941.0 +offset_left = 959.0 offset_top = 1021.0 -offset_right = 1197.0 +offset_right = 1215.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="capsrpb"] layout_mode = 0 @@ -150,21 +153,22 @@ light_mask = 3 position = Vector2(56, -4) scale = Vector2(2.6, 2.6) sprite_frames = SubResource("SpriteFrames_foasq") -frame_progress = 0.72355 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 = 1123.0 +offset_left = 1088.0 offset_top = 1021.0 -offset_right = 1379.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 @@ -189,14 +193,16 @@ script = ExtResource("11_u7tym") editor_description = "Кнопка для отображения внешних соединений." self_modulate = Color(0.788235, 0.788235, 0.788235, 1) layout_mode = 0 -offset_left = 1299.0 +offset_left = 1216.0 offset_top = 1021.0 -offset_right = 1555.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 @@ -221,14 +227,16 @@ script = ExtResource("11_u7tym") editor_description = "Кнопка для отображения внешних соединений." self_modulate = Color(0.788235, 0.788235, 0.788235, 1) layout_mode = 0 -offset_left = 1458.0 +offset_left = 1344.0 offset_top = 1021.0 -offset_right = 1714.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 @@ -249,6 +257,40 @@ 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") + [node name="pribor_uf" type="TextureButton" parent="." groups=["pribor_buttons"]] editor_description = "Кнопка для выбора прибора." layout_mode = 0 @@ -1266,7 +1308,7 @@ text = "На связи" metadata/_edit_use_anchors_ = true [node name="line0" type="Line2D" parent="."] -position = Vector2(936, 936) +position = Vector2(936, 950) points = PackedVector2Array(-8, 0, 608, 0) width = 2.0 default_color = Color(1, 1, 1, 0.352941) From 4e42c5d2b00269564f71459cf179293f96a2e727 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Thu, 11 Sep 2025 10:20:14 +0300 Subject: [PATCH 31/32] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5.=20=D0=9D=D0=B5=D1=82=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=D1=91=D0=BC=D0=B0=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20=D0=BE=D1=82=20"=D0=A2=D1=80=D0=B0=D1=81=D1=81=D1=8B"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/settings.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/settings.gd b/scripts/settings.gd index 09246d6..c625d1f 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -10,7 +10,7 @@ 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\" (СТЦ)'], - 'уарэп-трасса': ['capsrpb', ['127.0.0.1', 50200, 40241, false, true], 'IP-адрес для обмена сообщениями с \"Трассой\"'], + 'уарэп-трасса': ['trassa', ['127.0.0.1', 50200, 40241, 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'], From 74562f7ab01fc553d5526b2a7e7bdab7c12d0ab4 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Thu, 11 Sep 2025 10:59:46 +0300 Subject: [PATCH 32/32] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5.=20=D0=9D=D0=B5=D1=82=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=D1=91=D0=BC=D0=B0=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20=D0=BE=D1=82=20"=D0=A2=D1=80=D0=B0=D1=81=D1=81=D1=8B"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/settings.gd | 2 +- scripts/trassa.gd | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/settings.gd b/scripts/settings.gd index c625d1f..2ac22b7 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -10,7 +10,7 @@ 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, 40241, false, true], 'IP-адрес для обмена сообщениями с \"Трассой\"'], + 'уарэп-трасса': ['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'], diff --git a/scripts/trassa.gd b/scripts/trassa.gd index 164afa3..faee683 100644 --- a/scripts/trassa.gd +++ b/scripts/trassa.gd @@ -2,6 +2,7 @@ class_name trassa_unit extends Node class Trassa extends unit.Unit: + var source_addr: = [] func process(tick: int): return Error.ERR_BUSY