diff --git a/data/кнопка-внешние-0.png b/data/кнопка-внешние-0.png new file mode 100644 index 00000000..9e33a0ad Binary files /dev/null and b/data/кнопка-внешние-0.png differ diff --git a/data/кнопка-внешние-0.png.import b/data/кнопка-внешние-0.png.import new file mode 100644 index 00000000..96a43a8e --- /dev/null +++ b/data/кнопка-внешние-0.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bb80aigvv648i" +path="res://.godot/imported/кнопка-внешние-0.png-e1c8d55052eea7718633f8a54303eafa.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://data/кнопка-внешние-0.png" +dest_files=["res://.godot/imported/кнопка-внешние-0.png-e1c8d55052eea7718633f8a54303eafa.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/project.godot b/project.godot index c8cecac8..899f9c22 100644 --- a/project.godot +++ b/project.godot @@ -117,6 +117,7 @@ folder_colors={ "res://scenes/grid-buttons-ecm/": "blue", "res://scenes/grid-side-panel/": "blue", "res://scenes/pribor-afsp/": "purple", +"res://scenes/pribor-externals/": "purple", "res://scenes/pribor-prd-k/": "purple", "res://scenes/pribor-prd-n/": "purple", "res://scenes/pribor-prd-v/": "purple", diff --git a/scenes/frame-ecm-params/scroll-ecm-params.gd b/scenes/frame-ecm-params/scroll-ecm-params.gd index 6ce798d2..37697318 100644 --- a/scenes/frame-ecm-params/scroll-ecm-params.gd +++ b/scenes/frame-ecm-params/scroll-ecm-params.gd @@ -45,7 +45,6 @@ func init_table(): $table.set_meta('id', 0) signaller.connect('interfer_selected', Callable(self, 'on_interfer_selected').bind(toggle_btn)) signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel')) - signaller.connect('emit_changed', Callable(self, 'on_emit_changed').bind(toggle_btn)) ## Called when the node enters the scene tree for the first time. @@ -113,8 +112,3 @@ func on_toggle_btn(toggle_btn): if not $table.has_meta('ecm'): return var ecm: interfer.Interfer = $table.get_meta('ecm') ecm.modulation = toggle_btn.button_pressed - - -func on_emit_changed(state, toggle_btn): - if not toggle_btn.disabled: - toggle_btn.button_pressed = state diff --git a/scenes/pribor-externals/externals.gd b/scenes/pribor-externals/externals.gd new file mode 100644 index 00000000..2f708c67 --- /dev/null +++ b/scenes/pribor-externals/externals.gd @@ -0,0 +1,17 @@ +@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 new file mode 100644 index 00000000..ff00f2c0 --- /dev/null +++ b/scenes/pribor-externals/externals.gd.uid @@ -0,0 +1 @@ +uid://beb41qdahkdp5 diff --git a/scenes/pribor-externals/externals.tscn b/scenes/pribor-externals/externals.tscn new file mode 100644 index 00000000..830053fe --- /dev/null +++ b/scenes/pribor-externals/externals.tscn @@ -0,0 +1,16 @@ +[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"] + +[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") + +[node name="grid" type="GridContainer" parent="."] +layout_mode = 2 diff --git a/scenes/контроль/кнопка-прибора.gd b/scenes/контроль/кнопка-прибора.gd index 4575a6ca..d8418b6d 100644 --- a/scenes/контроль/кнопка-прибора.gd +++ b/scenes/контроль/кнопка-прибора.gd @@ -5,9 +5,12 @@ extends Node @export var state_colors: Array func _on_toggled(toggled_on): $frame.visible = toggled_on +func _enter_tree() -> void: $label.self_modulate = state + @export var state: int: set(v): v = 0 if v < 0 else v % state_colors.size() state = v - $label.self_modulate = state_colors[v] + if is_inside_tree(): + $label.self_modulate = state_colors[v] diff --git a/scenes/контроль/контроль.gd b/scenes/контроль/контроль.gd index 46283e2f..24ade4cf 100644 --- a/scenes/контроль/контроль.gd +++ b/scenes/контроль/контроль.gd @@ -6,6 +6,7 @@ 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'], diff --git a/scenes/контроль/контроль.tscn b/scenes/контроль/контроль.tscn index a6c4fb8b..8c151127 100644 --- a/scenes/контроль/контроль.tscn +++ b/scenes/контроль/контроль.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=16 format=3 uid="uid://lwmw4egynmd1"] +[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"] [ext_resource type="Texture2D" uid="uid://dkqlvd750pplc" path="res://data/СПТ.png" id="3_hhadv"] [ext_resource type="Texture2D" uid="uid://b0o8jhb5jbrev" path="res://data/рамка-1.png" id="4_rasbe"] @@ -38,6 +39,59 @@ grow_vertical = 2 script = ExtResource("1_x5d6w") metadata/_edit_lock_ = true +[node name="externals" type="TextureButton" parent="." groups=["pribor_buttons"]] +editor_description = "Кнопка для отображения внешних соединений." +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) +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="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 +text = "Внешние подключения" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="frame" type="NinePatchRect" parent="externals"] +visible = false +self_modulate = Color(0.890196, 0.486275, 0.196078, 1) +layout_mode = 0 +offset_left = -32.0 +offset_top = -12.0 +offset_right = 123.0 +offset_bottom = 111.0 +scale = Vector2(2, 2) +texture = ExtResource("4_rasbe") +region_rect = Rect2(-3, -3, 89, 89) +patch_margin_left = 16 +patch_margin_top = 16 +patch_margin_right = 16 +patch_margin_bottom = 16 + +[node name="connect_pribor" type="AnimatedSprite2D" parent="externals"] +modulate = Color(0.498039, 0.498039, 0.498039, 1) +light_mask = 3 +position = Vector2(47.9999, 30) +scale = Vector2(1.23077, 1.25) +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 @@ -85,7 +139,7 @@ patch_margin_bottom = 16 modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(52, -6) -scale = Vector2(0.615385, 0.625) +scale = Vector2(0.625, 0.625) sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.72355 script = ExtResource("11_u7tym") @@ -136,7 +190,7 @@ vertical_alignment = 1 modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(55, -15) -scale = Vector2(0.615385, 0.625) +scale = Vector2(0.625, 0.625) sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.72355 script = ExtResource("11_u7tym") @@ -190,7 +244,7 @@ vertical_alignment = 1 modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(415, -40) -scale = Vector2(3.07692, 3.125) +scale = Vector2(3.0, 3.0) sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.72355 script = ExtResource("11_u7tym") @@ -245,7 +299,7 @@ vertical_alignment = 1 modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(425, -40) -scale = Vector2(3.07692, 3.125) +scale = Vector2(3.0, 3.0) sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.72355 script = ExtResource("11_u7tym") @@ -297,7 +351,7 @@ patch_margin_bottom = 16 modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(45, -10) -scale = Vector2(0.615385, 0.625) +scale = Vector2(0.625, 0.625) sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.872305 script = ExtResource("11_u7tym") @@ -350,7 +404,7 @@ patch_margin_bottom = 16 modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(40, -10) -scale = Vector2(0.615385, 0.625) +scale = Vector2(0.625, 0.625) sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.72355 script = ExtResource("11_u7tym") @@ -405,7 +459,7 @@ patch_margin_bottom = 16 modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(40, -10) -scale = Vector2(0.615385, 0.625) +scale = Vector2(0.625, 0.625) sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.72355 script = ExtResource("11_u7tym") @@ -458,7 +512,7 @@ patch_margin_bottom = 16 modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(43, -10) -scale = Vector2(0.615385, 0.625) +scale = Vector2(0.625, 0.625) sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.72355 script = ExtResource("11_u7tym") @@ -511,7 +565,7 @@ patch_margin_bottom = 16 modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(34, -10) -scale = Vector2(0.615385, 0.625) +scale = Vector2(0.625, 0.625) sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.72355 script = ExtResource("11_u7tym") @@ -564,7 +618,7 @@ patch_margin_bottom = 16 modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(33, -10) -scale = Vector2(0.615385, 0.625) +scale = Vector2(0.625, 0.625) sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.72355 script = ExtResource("11_u7tym") @@ -617,7 +671,7 @@ patch_margin_bottom = 16 modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(35, -10) -scale = Vector2(0.615385, 0.625) +scale = Vector2(0.625, 0.625) sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.72355 script = ExtResource("11_u7tym") @@ -670,7 +724,7 @@ patch_margin_bottom = 16 modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(34, -10) -scale = Vector2(0.615385, 0.625) +scale = Vector2(0.625, 0.625) sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.72355 script = ExtResource("11_u7tym") @@ -723,7 +777,7 @@ patch_margin_bottom = 16 modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(35, -10) -scale = Vector2(0.615385, 0.625) +scale = Vector2(0.625, 0.625) sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.72355 script = ExtResource("11_u7tym") @@ -776,7 +830,7 @@ patch_margin_bottom = 16 modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(35, -10) -scale = Vector2(0.615385, 0.625) +scale = Vector2(0.625, 0.625) sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.72355 script = ExtResource("11_u7tym") @@ -828,7 +882,7 @@ patch_margin_bottom = 16 modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(41, -10) -scale = Vector2(0.615385, 0.625) +scale = Vector2(0.625, 0.625) sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.72355 script = ExtResource("11_u7tym") @@ -880,7 +934,7 @@ patch_margin_bottom = 16 modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(40, -10) -scale = Vector2(0.615385, 0.625) +scale = Vector2(0.625, 0.625) sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.72355 script = ExtResource("11_u7tym") @@ -932,16 +986,16 @@ patch_margin_bottom = 16 modulate = Color(0.498039, 0.498039, 0.498039, 1) light_mask = 3 position = Vector2(42, -10) -scale = Vector2(0.615385, 0.625) +scale = Vector2(0.625, 0.625) sprite_frames = SubResource("SpriteFrames_foasq") frame_progress = 0.72355 script = ExtResource("11_u7tym") [node name="txr_legend0" type="TextureRect" parent="."] layout_mode = 0 -offset_left = 1198.0 +offset_left = 219.0 offset_top = 1135.0 -offset_right = 1422.0 +offset_right = 443.0 offset_bottom = 1359.0 scale = Vector2(0.1, 0.1) texture = ExtResource("7_6j01w") @@ -949,9 +1003,9 @@ texture = ExtResource("7_6j01w") [node name="lbl_legend0" type="Label" parent="."] self_modulate = Color(1, 1, 1, 0.627451) layout_mode = 0 -offset_left = 1226.0 +offset_left = 247.0 offset_top = 1136.0 -offset_right = 1382.0 +offset_right = 403.0 offset_bottom = 1156.0 theme_override_font_sizes/font_size = 17 text = "Ожидание результата" @@ -959,27 +1013,27 @@ text = "Ожидание результата" [node name="lbl_legend1" type="Label" parent="."] self_modulate = Color(1, 1, 1, 0.627451) layout_mode = 0 -offset_left = 1031.0 +offset_left = 52.0 offset_top = 1136.0 -offset_right = 1104.0 +offset_right = 125.0 offset_bottom = 1156.0 theme_override_font_sizes/font_size = 17 text = "Исправно" [node name="txr_legend1" type="TextureRect" parent="."] layout_mode = 0 -offset_left = 1005.0 +offset_left = 26.0001 offset_top = 1135.0 -offset_right = 1229.0 +offset_right = 250.0 offset_bottom = 1359.0 scale = Vector2(0.1, 0.1) texture = ExtResource("8_isjua") [node name="txr_legend2" type="TextureRect" parent="."] layout_mode = 0 -offset_left = 1455.0 +offset_left = 476.0 offset_top = 1135.0 -offset_right = 1679.0 +offset_right = 700.0 offset_bottom = 1359.0 scale = Vector2(0.1, 0.1) texture = ExtResource("9_ll0vs") @@ -987,9 +1041,9 @@ texture = ExtResource("9_ll0vs") [node name="lbl_legend2" type="Label" parent="."] self_modulate = Color(1, 1, 1, 0.627451) layout_mode = 0 -offset_left = 1483.0 +offset_left = 504.0 offset_top = 1136.0 -offset_right = 1527.0 +offset_right = 548.0 offset_bottom = 1156.0 theme_override_font_sizes/font_size = 17 text = "Сбой" @@ -1005,6 +1059,7 @@ text = "Контроль исправности прибора" horizontal_alignment = 1 vertical_alignment = 1 +[connection signal="toggled" from="externals" to="externals" 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 new file mode 100644 index 00000000..5a37e844 --- /dev/null +++ b/scenes/контроль/элемент-ю.tscn @@ -0,0 +1,163 @@ +[gd_scene load_steps=13 format=3 uid="uid://xj4vbivv3xwp"] + +[ext_resource type="Texture2D" uid="uid://c6nve6f8sfyj2" path="res://data/состояние-исправности-0.png" id="2_isu4f"] +[ext_resource type="Texture2D" uid="uid://dnreyfh3cd1k2" path="res://data/состояние-исправности-1.png" id="3_07yc3"] +[ext_resource type="Texture2D" uid="uid://c6booa8753u5t" path="res://data/состояние-исправности-2.png" id="4_348cs"] +[ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="5_qwfg5"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_hu2vd"] + +[sub_resource type="GDScript" id="GDScript_3rlfa"] +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) +func _ready() -> void: call_deferred('_on_resized') + + +@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[state] + + +@export var fname: String: + set(v): + fname = v + if is_inside_tree(): + $margin/vbox/grid/fname.text = v + + +func _on_resized() -> void: + $rect.size = size + $margin.size = size + + +func _enter_tree() -> void: + if Engine.is_editor_hint(): return + $margin/vbox/grid/fname.text = fname + $margin/vbox/grid/state.texture = textures[state] + + +func _exit_tree() -> void: + if Engine.is_editor_hint(): return + pass +" + +[sub_resource type="GDScript" id="GDScript_45hqb"] +script/source = "@tool + +extends MarginContainer + + +func _enter_tree() -> void: + margins = [8, 8, 8, 8] + + +@export var margins: Array: + set(vals): + add_theme_constant_override('margin_top', vals[0]) + add_theme_constant_override('margin_left', vals[1]) + add_theme_constant_override('margin_bottom', vals[2]) + add_theme_constant_override('margin_right', vals[3]) + get: + var vals = [0, 0, 0, 0] + vals[0] = get_theme_constant('margin_top') + vals[1] = get_theme_constant('margin_left') + vals[2] = get_theme_constant('margin_bottom') + vals[3] = get_theme_constant('margin_right') + return vals +" + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_evx06"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_emtms"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_xxyaa"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_cd4fw"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ox0yw"] + +[node name="yelement_yu" type="PanelContainer"] +editor_description = "Элемент замены из ЗИП" +custom_minimum_size = Vector2(32, 32) +offset_right = 264.0 +offset_bottom = 55.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_styles/panel = SubResource("StyleBoxEmpty_hu2vd") +script = SubResource("GDScript_3rlfa") +textures = [ExtResource("2_isu4f"), ExtResource("3_07yc3"), ExtResource("4_348cs")] + +[node name="rect" type="NinePatchRect" parent="."] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +texture = ExtResource("5_qwfg5") +draw_center = false +region_rect = Rect2(0, 0, 63, 63) +patch_margin_left = 17 +patch_margin_top = 17 +patch_margin_right = 17 +patch_margin_bottom = 15 + +[node name="margin" type="MarginContainer" parent="."] +layout_mode = 2 +theme_override_constants/margin_left = 8 +theme_override_constants/margin_top = 8 +theme_override_constants/margin_right = 8 +theme_override_constants/margin_bottom = 8 +script = SubResource("GDScript_45hqb") +margins = [8, 8, 8, 8] + +[node name="vbox" type="VBoxContainer" parent="margin"] +layout_mode = 2 + +[node name="grid" type="GridContainer" parent="margin/vbox"] +layout_mode = 2 +size_flags_vertical = 3 +columns = 3 + +[node name="state" type="TextureRect" parent="margin/vbox/grid"] +custom_minimum_size = Vector2(24, 24) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 4 +texture = ExtResource("2_isu4f") +expand_mode = 1 + +[node name="fname" type="Label" parent="margin/vbox/grid"] +self_modulate = Color(1, 1, 1, 0.627451) +layout_mode = 2 +size_flags_horizontal = 2 +size_flags_vertical = 6 +theme_override_font_sizes/font_size = 17 +text = "<Название>" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="button" type="Button" parent="."] +custom_minimum_size = Vector2(100, 32) +layout_mode = 2 +theme_override_styles/focus = SubResource("StyleBoxEmpty_evx06") +theme_override_styles/disabled = SubResource("StyleBoxEmpty_emtms") +theme_override_styles/hover = SubResource("StyleBoxEmpty_xxyaa") +theme_override_styles/pressed = SubResource("StyleBoxEmpty_cd4fw") +theme_override_styles/normal = SubResource("StyleBoxEmpty_ox0yw") + +[connection signal="resized" from="." to="." method="_on_resized"] +[connection signal="pressed" from="button" to="." method="_on_button_pressed"] diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index 724eef04..31db96ca 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -84,9 +84,6 @@ func on_threat_selected(th, ecm_btns): on_rto_threat_sel(th.id, ecm_btns) func on_enter_tree() -> void: call_deferred('on_button_strobe_pressed') -func on_btn_activate(val: bool): signaller.emit_signal('emit_changed', val) - - ## Обработчик нажатия на кнопку вид. func on_button_view_toggled(toggled: bool): signaller.emit_signal('map_mode_changed', int(toggled)) @@ -144,7 +141,7 @@ func _ready(): signaller.connect('update_coordinates_map', Callable(self, 'on_update_coordinates_label')) signaller.connect('update_scale_map', Callable(self, 'on_update_scale_label')) on_btn_center_toggled(true) - on_btn_activate_toggled(false) + on_btn_activate_toggled(true) func on_user_panning(): @@ -308,7 +305,6 @@ func on_button_pressed(btn_this, btn_others) -> void: var interfer_name: String = btn_this.get_meta('rfi_name') for key in fs_selected.keys(): fs_arr.append(prd.get_fs_param(key)) - print(fs_arr) signaller.emit_signal('interfer_init', interfer_name, fs_arr, interfer.POW_DEFAULT) @@ -514,6 +510,7 @@ func on_btn_center_toggled(toggled_on: bool) -> void: func on_btn_activate_toggled(toggled_on: bool) -> void: $btn_activate.tooltip_text = 'Включает подавление (%s)' % ('включено' if toggled_on else 'отключено') + signaller.emit_signal('emit_changed', toggled_on) func on_update_coordinates_label(coordinates_label) -> void: diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 1336c77b..64b1bbd5 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -257,6 +257,7 @@ offset_right = 1136.0 offset_bottom = 1127.0 scale = Vector2(0.5, 0.5) toggle_mode = true +button_pressed = true action_mode = 0 texture_normal = ExtResource("10_cnr1s") texture_pressed = ExtResource("11_xp4y6") diff --git a/scenes/эмс/yems-boards.gd b/scenes/эмс/yems-boards.gd index 4b818f47..eac8030a 100644 --- a/scenes/эмс/yems-boards.gd +++ b/scenes/эмс/yems-boards.gd @@ -297,15 +297,17 @@ class EmsBoard: if not check_dev_number(): continue if ports.has('%d'%(base_addr_isa + 4)): cur_dev.ports_data[base_addr_isa + 4] = int(ports['%d'%(base_addr_isa + 4)]) - else: continue + else: return false if ports.has('%d'%(base_addr_isa + 6)): - cur_dev.ports_data[base_addr_isa + 6] = int(ports['%d'%(base_addr_isa + 6)]) - else: continue + cur_dev.ports_data[base_addr_isa + 6] = int(ports['%d'%(base_addr_isa + 6)]) + else: return false if ports.has('%d'%(base_addr_isa + 8)): - cur_dev.ports_data[base_addr_isa + 8] = int(ports['%d'%(base_addr_isa + 8)]) - else: continue + cur_dev.ports_data[base_addr_isa + 8] = int(ports['%d'%(base_addr_isa + 8)]) + else: return false if ports.has('%d'%(base_addr_isa + 10)): - cur_dev.ports_data[base_addr_isa + 10] = int(ports['%d'%(base_addr_isa + 10)]) + cur_dev.ports_data[base_addr_isa + 10] = int(ports['%d'%(base_addr_isa + 10)]) + else: return false + return true func set_load_done(): state_board = LOADING diff --git a/scenes/эмс/эмс.gd b/scenes/эмс/эмс.gd index 5d394d5b..ebb6d212 100644 --- a/scenes/эмс/эмс.gd +++ b/scenes/эмс/эмс.gd @@ -654,6 +654,9 @@ func _on_btn_load_pressed() -> void: if not json_data.has(str(board.id_board)): return var data = json_data[str(board.id_board)] - board.btn_load(data) - board.need_write = true - log.message(log.INFO, 'Произведено чтение настроек ЭМС из файла: %s' %fl_name) + var read_ok = board.btn_load(data) + if read_ok: + board.need_write = true + log.message(log.INFO, 'Произведено чтение настроек ЭМС из файла: %s, для платы %s' %[fl_name, board.id_board]) + else: + log.message(log.ERROR, 'Ошибка чтение настроек ЭМС из файла: %s' %fl_name) diff --git a/scripts/interfer.gd b/scripts/interfer.gd index 3600d964..f3c38ef9 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -4,22 +4,38 @@ class_name Iterfer extends Node ## Режимы помехи. const ITERFER_MODE = { - 'off': ['Откл', ['freq', 'width'], 0], - 'srni1': ['СРН-И1', ['freq', 'width'], 1], - 'srnm2': ['СРН-М2', ['freq', 'width'], 2], - 'srngps': ['СРН-GPS', ['freq', 'width'], 3], - 'lchm1': ['ЛЧМ-1', ['freq', 'width'], 10], - 'lchm2': ['ЛЧМ-2', ['freq', 'width'], 16], - 'mchm1': ['МЧМ-1', ['freq', 'width'], 11], - 'pdm2': ['ПД-М2', ['freq', 'width'], 12], - 'pdm4': ['ПД-М4', ['freq', 'width'], 13], - 'pdm4s': ['ПД-М4С', ['freq', 'width'], 14], - 'pdchm': ['ПД-ЧМ', ['freq', 'width'], 15], - 'svi1': ['СВ-И1', ['freq', 'width'], 20], - 'svm2': ['СВ-М2', ['freq', 'width'], 21], - 'k1': ['K1', ['freq', 'width', 'dur', 'period'], 50], - 'ozp1': ['ОЗП-1', ['freq', 'width'], 51] } + 'off': ['Откл', {}, 0], + 'srni1': ['СРН-И1', {}, 1], + 'srnm2': ['СРН-М2', {}, 2], + 'srngps': ['СРН-GPS', {}, 3], + 'lchm1': ['ЛЧМ-1', {}, 10], + 'lchm2': ['ЛЧМ-2', {}, 16], + 'mchm1': ['МЧМ-1', {}, 11], + 'pdm2': ['ПД-М2', {}, 12], + 'pdm4': ['ПД-М4', {}, 13], + 'pdm4s': ['ПД-М4С', {}, 14], + 'pdchm': ['ПД-ЧМ', {}, 15], + 'svi1': ['СВ-И1', SVI1_PARAMS, 20], + 'svm2': ['СВ-М2', SVM2_PARAMS, 21], + 'k1': ['K1', K1_PARAMS, 50], + 'ozp1': ['ОЗП-1', OZP1_PARAMS, 51] } +const K1_PARAMS = {'files': ['K1'], + 'call_proc': 'call_all_diap'} +const OZP1_PARAMS = {'files': ['OZP1'], + 'call_proc': 'call_all_diap'} +# Файл : Диапазон: ['имя файла', частота] +const SVI1_PARAMS = {'files': {1: ['SVI1_LIT2', 1017], + 2: ['SVI1_LIT3', 1156]}, + 'call_proc': 'call_diap'} +const SVM2_PARAMS = {'files': {1: ['SVM2_LIT2', 1017], + 2: ['SVM2_LIT3', 1156]}, + 'call_proc': 'call_diap'} + +const PD_CHM = {'files': { + + }, + 'call_proc': 'call_pd_chm'} const SOURCE_INTERFER = ['th','fs','cu'] const ID_INTERFERS_LEN = 63 ## Размер пула номеров целей. @@ -31,6 +47,7 @@ var id_array: Array ## Массив id воздействий. var thrs: Dictionary ## Словарь воздействия для целей, ключ - id воздействия. var fs: Dictionary ## Словарь воздействий для секторов, ключ - id воздействия. var cu: Dictionary ## Словарь воздействий для 5П-28, ключ - id воздействия. +var thrs_dict: Dictionary ## Ссылка на словарь целей var auto_enabled: bool = false ## Режим автомата var emit_enable: bool = true ## Разрешить излучение @@ -48,6 +65,7 @@ class Interfer: var source_interfer: String = '' ## Тип объекта по которой поставлена помеха. var modulation: bool ## Модуляция для включения усилителей var um: float ## Угол места для помехи. + var nmfs: int = 0 ## Номер модуля ФС в нумерации СТЦ func _to_string() -> String: return 'номер: %d название: %s частота: %0.1f МГц пеленг: %0.1f гр.' % [ispp, ITERFER_MODE[krp][0], params['freq'], kni] @@ -58,9 +76,10 @@ class Interfer: data_to_json['ss'] = msg_num data_to_json['ispp'] = ispp data_to_json['krp'] = krp + data_to_json['nmfs'] = nmfs if krp != INTERFER_OFF: data_to_json['kni'] = kni - data_to_json['powp'] = powp # TODO: Необходимо добавить управление мощностью + data_to_json['powp'] = powp data_to_json['params'] = params data_to_json['get'] = get_params var pac = JSON.stringify(data_to_json).to_utf8_buffer() @@ -128,6 +147,8 @@ func _ready() -> void: threats.connect('threat_lost', Callable(self, 'on_threats_lost').bind(ecms, unit_caps)) var unit_nav = network.get_unit_instance('навигация') unit_nav.connect('data_received', on_nav_data_received.bind(unit_caps)) + threats.connect('threats_resized', Callable(self, 'on_threats_resized')) + threats.connect('threat_update', Callable(self, 'on_threats_update').bind(ecms)) func on_nav_data_received(coords: Dictionary, unit_caps): @@ -292,6 +313,13 @@ func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interf ecm.source_interfer = source_interfer ecm.modulation = emit_enable ecm.um = param.get('um', 15.0) # Значение по умолчанию + var ecm_params = ITERFER_MODE[interfer_name][1] + if ecm_params.has('call_proc'): + var call_set_params = Callable(self, ecm_params['call_proc']).bind(ecm, ecm_params) + call_set_params.call() + var set_nmfs_ok = set_nmfs(ecm) + if set_nmfs_ok != Error.OK: + log.error('Ошибка выбора модуля ФС для помехи: %s' %[ecm.ispp]) signaller.emit_signal('interfer_new', ecm) if interfer_name == 'off': signaller.emit_signal('interfer_off', ecm, ecms, thrs) @@ -301,6 +329,11 @@ func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interf func send_ecm(ecm, unit0) -> void: + if ecm.krp != INTERFER_OFF: + if not emit_enable: + return + elif not ecm.modulation: + return msg6_num += 1 var json_data = ecm.get_msg6_data(msg6_num) unit0.tx_stack.append(json_data) @@ -336,7 +369,70 @@ func push_id(id: int) -> void: id_array.sort() -func on_emit_changed(state, ecms) -> void: +func on_emit_changed(state, _ecms) -> void: emit_enable = state - for ecm in ecms.values(): - ecm.modulation = state + + +func call_all_diap(ecm, ecm_params: Dictionary): + ecm.params['filename'] = ecm_params['files'] + + +func call_diap(ecm, ecm_params: Dictionary): + var fs_index_arr: Array + prd.get_fs_index(ecm, fs_index_arr) + if len(fs_index_arr): + var band = fs_index_arr[0] / 4 + if ecm_params['files'].has(band): + ecm.params['filename'] = ecm_params['files'][band][0] + ecm.params['freq'] = ecm_params['files'][band][1] + + +func set_nmfs(ecm): + var fs_index_arr: Array + prd.get_fs_index(ecm, fs_index_arr) + if len(fs_index_arr): + ecm.nmfs = prd.FS_PRD[fs_index_arr[0]][1] + return Error.OK + else: + return Error.FAILED + + +func on_threats_resized(th_dic): + thrs_dict = th_dic + + +func on_threats_update(threat, ecms): + if threat.tmod != 'fm': return + var th_fm_dict: Dictionary + for th_index in thrs_dict: + if thrs_dict[th_index].tmod != 'fm': continue + var fs_index_arr: Array + prd.find_fs_index(thrs_dict[th_index].aoa, thrs_dict[th_index].freq, fs_index_arr) + if fs_index_arr.size() == 0: continue + if th_fm_dict.has(fs_index_arr[0]): + th_fm_dict[fs_index_arr[0]][th_index] = thrs_dict[th_index] + else: + var th_dict: Dictionary + th_fm_dict[fs_index_arr[0]] = th_dict + th_fm_dict[fs_index_arr[0]][th_index] = thrs_dict[th_index] + for key in th_fm_dict: + if len(th_fm_dict[key]) < 2: continue + var nmfs = prd.FS_PRD[key][1] + for ecm in ecms.values(): + if nmfs != ecm.nmfs: continue + if ecm.krp != 'pdchm': continue + + +func get_freq_range(freq_range_dict: Dictionary, th_dict: Dictionary): + var min_range_abs: int = 6000 + var max_range_abs: int = 0 + for key_i in th_dict: + var min_range: int = 6000 + var max_range: int = 0 + for key_j in th_dict: + if key_i == key_j: continue + var freq_range = abs(th_dict[key_i].freq - th_dict[key_j].freq) + if freq_range < min_range: min_range = freq_range + if freq_range > max_range: max_range = freq_range + if min_range < min_range_abs: min_range_abs = min_range + if max_range > max_range_abs: max_range_abs = max_range diff --git a/scripts/network.gd b/scripts/network.gd index b060e89c..70284874 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -1,7 +1,7 @@ class_name Network extends Node - -const UDP_PROTO: = {'yau07tx': yau07.YaU07, 'json-capsrpb': capsrpb.CapsRpb} +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 MODBUS_PROTO: = {'mbcs': sch3.Sch3} @@ -34,8 +34,8 @@ class Serial extends SerialPort: return Error.OK -class Socket extends PacketPeerUDP: - func send_to(addr, data): +class SocketUDP extends PacketPeerUDP: + func send_to(addr: Array, data: PackedByteArray): set_dest_address(addr[0], addr[1]) var rc: = put_packet(data) if rc != Error.OK: @@ -45,7 +45,7 @@ class Socket extends PacketPeerUDP: class SocketTCP extends TCPServer: const RX_TIMEOUT: int = 1000 ## Время сброса счётчика принятия части пакета. var peerstream: = PacketPeerStream.new() - var unit_key: StringName ## Ключ юнита. + var unit_name: StringName ## Уникальное имя устройства var head_len: int = 8 ## Длина заголовка команды. var len_place: int = 4 ## Номер начального байта с длинной блока данных. var type_len: int = 4 ## Количество байт в размере длинны. @@ -55,52 +55,53 @@ class SocketTCP extends TCPServer: var rx_data: PackedByteArray ## Принятые данные. var data_len: int ## Размер ожидаемых данных. - func send_to(data): + func send_to(data: PackedByteArray): var peer = peerstream.get_stream_peer() peer.put_data(data) -var poll_sockets: Array[Socket] -var tcp_sockets: Array[Array] -var units: Dictionary[StringName, unit.Unit] -var units_udp: Dictionary[StringName, unit.Unit] -var units_udprx: Dictionary[StringName, unit.Unit] -var units_tcp: Dictionary[StringName, unit.Unit] -var units_serial: Dictionary[StringName, unit.Unit] -var units_modbus: Dictionary[StringName, unit.Unit] -var serials: Dictionary[StringName, Serial] # Последовательные порты -var mbcs: Dictionary[StringName, unit.Unit] # Клиенты modbus -var dst_ports: Dictionary[StringName, int] -var dst_addrs: Dictionary[StringName, StringName] -var unit_keys: Dictionary[int, StringName] -var sock_unicast: Socket -var sock_capsrpb: Socket -var logger_page: Node -var send_sockets: Dictionary[StringName, Socket] # Таблица <имяустройста>: <сокет> для отправки сообщений -var addr_port_to_unit_name: Dictionary[StringName, StringName] +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_udprx: Dictionary[StringName, unit.Unit] ## Экземпляры устройств с udp-соединением от которых приходят данные +var units_tcp: Dictionary[StringName, unit.Unit] ## Экземпляры устройств с tcp-соединением +var units_serial: Dictionary[StringName, unit.Unit] ## Экземпляры устройств с uart-соединением +var units_modbus: Dictionary[StringName, unit.Unit] ## Экземпляры устройств с modbusserial-соединением +var serials: Dictionary[StringName, Serial] ## Последовательные порты (uart) +var 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 logger_page: Node ## Ссылка на журнал работы +var send_sockets: Dictionary[StringName, SocketUDP] ## Таблица <имяустройста>: <сокет> для отправки сообщений +var addr_port_to_unit_name: Dictionary[StringName, StringName] ## Преобразование адрес:порт в имя устройства func on_serial_data(data, unit): unit.parse(data, tick) -func create_socket(nm) -> Socket: - var addr = settings.UnitProfiles[nm][1] - var port = settings.UnitProfiles[nm][2][0] - var broad = settings.UnitProfiles[nm][3] - var bind = settings.UnitProfiles[nm][4] - var sock: = Socket.new() +## [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 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' % [nm, addr, port, ['нет', 'да'][int(bind)], error_string(rc)]) + log.message(errlevel, '\"%s\" привязан к %s:%d? - %s, результат: %s' % [unit_name, addr, port, ['нет', 'да'][int(bind)], error_string(rc)]) return sock -func create_tcpsocket(unit_name: StringName) -> SocketTCP: +## [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 sock = SocketTCP.new() - sock.unit_key = unit_name + var sock: = SocketTCP.new() + sock.unit_name = unit_name var rc: = sock.listen(port, addr) if rc == Error.OK: log.message(log.INFO, '\"%s\" слушает на %s:%d' % [unit_name, addr, port]) @@ -109,26 +110,28 @@ func create_tcpsocket(unit_name: StringName) -> SocketTCP: return sock -func create_serial(nm) -> Serial: - var port = settings.UnitProfiles[nm][1] - var baud = settings.UnitProfiles[nm][2][0] - var sp: = Serial.new() - sp.port = port - sp.baudrate = baud - sp.timeout = 20000 - return sp +## [param unit_name] - Уникальное имя устройства[br] +func create_serial(unit_name: StringName) -> Serial: + var port = settings.UnitProfiles[unit_name][1] + var baud = settings.UnitProfiles[unit_name][2][0] + var serial: = Serial.new() + serial.port = port + serial.baudrate = baud + serial.timeout = 20000 + return serial -func create_modbus(nm) -> sch_3.Sch3: - var unit_sch3: = sch_3.Sch3.new(nm) - return unit_sch3 +## [param unit_name] - Уникальное имя устройства[br] +func create_modbus(unit_name: StringName) -> sch_3.Sch3: + var unit_modbus: = sch_3.Sch3.new(unit_name) + return unit_modbus func _ready() -> void: - poll_sockets.append(create_socket('уарэп-яу07-частный')) - poll_sockets.append(create_socket('уарэп-яу07-общий')) - poll_sockets.append(create_socket('уарэп-капсрпб')) - poll_sockets.append(create_socket('навигация')) + 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] @@ -153,21 +156,28 @@ func _ready() -> void: var bind_modbuses: = [] for unit_name in settings.UnitProfiles: - var st = settings.UnitProfiles[unit_name] - var proto = st[0] + var unit_profile = settings.UnitProfiles[unit_name] + var proto = unit_profile[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] = st[2][0] + dst_ports[unit_name] = unit_profile[2][0] - if proto in UDP_PROTO: - var new_unit = UDP_PROTO[proto].new(unit_name) + 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] = st[2][1] if len(st[2]) > 1 else st[2][0] - dst_addrs[unit_name] = st[1] + dst_ports[unit_name] = unit_profile[2][0] + dst_addrs[unit_name] = unit_profile[1] + + 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] if proto in TCP_PROTO: var unit_tcp = TCP_PROTO[proto].new(unit_name) @@ -176,23 +186,23 @@ func _ready() -> void: if proto in MODBUS_PROTO: var unit_modbus = MODBUS_PROTO[proto].new(unit_name) - unit_modbus.port = settings.UnitProfiles[unit_name][1] # TODO: убрать это отсюда (обращение к глобальным данным из экземпляра) - unit_modbus.params = settings.UnitProfiles[unit_name][2] # TODO: убрать это отсюда (обращение к глобальным данным из экземпляра) + unit_modbus.port = unit_profile[1] + unit_modbus.params = unit_profile[2] units[unit_name] = unit_modbus units_modbus[unit_name] = unit_modbus bind_modbuses.append([unit_modbus, unit_name]) if proto in SERIAL_PROTO: var unit_serial = SERIAL_PROTO[proto].new(unit_name) - var serial = create_serial(unit_name) + var serial: = create_serial(unit_name) units_serial[unit_name] = unit_serial units[unit_name] = unit_serial serials[unit_name] = serial ProjectSettings.connect('settings_changed', Callable(self, '_on_settings_changed_serial').bind(bind_serials)) - tcp_sockets.append([create_tcpsocket('уарэп-5п28'), units_tcp['уарэп-5п28']]) - for key in dst_ports: + tcp_sockets.append([create_socket_tcp('уарэп-5п28'), units_tcp['уарэп-5п28']]) + for key: StringName in dst_ports: unit_keys[dst_ports[key]] = key if logger_page: for key in units: @@ -207,10 +217,10 @@ func _ready() -> void: func _on_settings_changed_modbus(bind_modbuses: Array): - var external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false) + var _external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false) for bm in bind_modbuses: - var unit_modbus = bm[0] - var unit_name = bm[1] + var _unit_modbus = bm[0] + var _unit_name = bm[1] func _on_settings_changed_serial(bind_serials: Array): @@ -228,7 +238,7 @@ func _on_settings_changed_serial(bind_serials: Array): log.message(log.INFO, '%s для \"%s\"' % [serial, unit_name]) -func poll_receive_udp(sock: Socket) -> bool: +func poll_receive_udp(sock: SocketUDP) -> bool: while sock.get_available_packet_count() > 0: var data: = sock.get_packet() var addr: = sock.get_packet_ip() @@ -239,14 +249,14 @@ func poll_receive_udp(sock: Socket) -> bool: units[unit_name].parse(data, tick) continue if unit_keys.has(port): - var unit_key = unit_keys[port] - if units.has(unit_key): - units[unit_key].parse(data, tick) + var unit_name: = unit_keys[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] - var unit_udprx = units[unit_name] + var unit_name: = unit_keys[local_port] + var unit_udprx: = units[unit_name] unit_udprx.source_addr = [addr, port] unit_udprx.parse(data, tick) continue @@ -260,15 +270,17 @@ func poll_receive_tcp(sock: SocketTCP) -> bool: 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: - var peer_len_data = peer.get_available_bytes() - if peer_len_data > 0: - get_client_data(sock, peer_len_data, peer) - if sock.unit_key in units_tcp and sock.rx_all: - units_tcp[sock.unit_key].parse(sock.rx_data, tick) + while true: + var peer_len_data: = peer.get_available_bytes() + if peer_len_data <= 0: + break + get_client_data(sock, peer, peer_len_data) + if sock.unit_name in units_tcp and sock.rx_all: + units_tcp[sock.unit_name].parse(sock.rx_data, tick) return false -func get_client_data(sock: SocketTCP, peer_len_data, peer): +func get_client_data(sock: SocketTCP, peer: StreamPeer, peer_len_data: int) -> void: if tick - sock.rx_tick > sock.RX_TIMEOUT: sock.rx_all = true sock.rx_tick = tick @@ -292,35 +304,35 @@ func get_client_data(sock: SocketTCP, peer_len_data, peer): get_tcp_data(sock, peer, len_rx) -func get_tcp_data(sock: SocketTCP, peer, len_rx): +func get_tcp_data(sock: SocketTCP, peer: StreamPeer, len_rx: int): var temp_data = peer.get_data(len_rx)[1] sock.rx_data.append_array(temp_data) sock.rx_len += len_rx - if sock.rx_len >= sock.head_len + sock.data_len: + if sock.rx_len == sock.head_len + sock.data_len: sock.rx_all = true func _process(_delta: float) -> void: tick = Time.get_ticks_msec() RenderingServer.global_shader_parameter_set('tick_curent', tick) - for key: StringName in units_udp: - var unit_udp = units_udp[key] + 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) - var dst_port = dst_ports[key] - var dst_addr = dst_addrs[key] + var sock: = send_sockets[unit_udp.name] + var tx_data: = unit_udp.tx_data.slice(0, unit_udp.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) - for key: StringName in units_udprx: - var unit_udprx = units_udprx[key] + for unit_name: StringName in units_udprx: + var unit_udprx: = units_udprx[unit_name] unit_udprx.process(tick) - for key: StringName in units_serial: - var unit_serial = units_serial[key] - var serial = serials[key] + for unit_name: StringName in units_serial: + var unit_serial: = units_serial[unit_name] + var serial: = serials[unit_name] if Error.OK == unit_serial.process(tick): serial.send_to(unit_serial.tx_data) - for key: StringName in units_modbus: - var unit_modbus = units_modbus[key] + for unit_name: StringName in units_modbus: + var unit_modbus: = units_modbus[unit_name] unit_modbus.process(tick) for sock_unit: Array in tcp_sockets: var sock = sock_unit[0] @@ -331,6 +343,7 @@ func _process(_delta: float) -> void: poll_sockets.any(poll_receive_udp) +## [param unit_name] - Уникальное имя устройства[br] func get_unit_instance(unit_name: StringName) -> unit.Unit: tools.allways(unit_name in units, 'нет такого устройства: \"%s\"' % unit_name) return units[unit_name] diff --git a/scripts/prd.gd b/scripts/prd.gd index 8a64354b..45ff4ba4 100644 --- a/scripts/prd.gd +++ b/scripts/prd.gd @@ -242,9 +242,14 @@ class PRD: var json_data = json_conv.get_data() yemsg_board.need_write = true yemsg_board.ems_load = yemsg_board.LoadState.IN_PROCESS - yemsg_board.btn_load(json_data) - yemsg_board.state_board = yemsg_board.WRITE - yemsg_board.start_rw_kems(false) + var read_ok = yemsg_board.btn_load(json_data) + if read_ok: + yemsg_board.state_board = yemsg_board.WRITE + yemsg_board.start_rw_kems(false) + else: + yemsg_board.ems_load = yemsg_board.LoadState.FAIL + yemsg_board.set_wait() + log.error('Не удалось прочитать файл настроек ячейки ЭМС-Г %s' %abs_dir) else: yemsg_board.ems_load = yemsg_board.LoadState.FAIL yemsg_board.set_wait() @@ -290,18 +295,23 @@ func get_fs_param(index: int) -> Array: ## Функция возвращает массив с индексами модулей ФС для выбранной помехи func get_fs_index(ecm, fs_index_arr): + var angle: float = ecm.kni + 45.0 + if ecm.params.has('freq'): + find_fs_index(angle, ecm.params['freq'], fs_index_arr) + + +func find_fs_index(aoa: float, freq: int, fs_index_arr: Array): var sector: int var band: Array - var angle: float = ecm.kni + 45.0 + var angle = aoa if angle > 360.0: angle -= 360.0 for sec in FS_SECTORS.values(): if float(angle) >= sec[0] and float(angle) <= sec[1]: sector = FS_SECTORS.find_key(sec) for diap in FS_FREQ.values(): - if ecm.params.has('freq'): - if ecm.params['freq'] >= diap[0] and ecm.params['freq'] <= diap[1]: - band.append(FS_FREQ.find_key(diap)) + if freq >= diap[0] and freq <= diap[1]: + band.append(FS_FREQ.find_key(diap)) for item in band: fs_index_arr.append(item * 4 + sector) diff --git a/scripts/sch3.gd b/scripts/sch3.gd index 095695e0..b43c97cf 100644 --- a/scripts/sch3.gd +++ b/scripts/sch3.gd @@ -36,7 +36,7 @@ class Sch3 extends unit.Unit: mbc.close() func try_connect() -> bool: - var rc = mbc.open(port, params[0], params[1], params[2], params[3], params[4]) + 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]) diff --git a/scripts/yau07.gd b/scripts/yau07.gd index c87107f6..54e02478 100644 --- a/scripts/yau07.gd +++ b/scripts/yau07.gd @@ -46,8 +46,8 @@ class YaU07 extends unit.Unit: func _to_string() -> String: return String('яу07: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]]) - func _init(nm: StringName): - self.name = nm + func _init(unit_name: StringName): + self.name = unit_name tx_data.resize(BUFFER_SIZE) tx_data.fill(0) @@ -236,7 +236,7 @@ class YaU07 extends unit.Unit: var block_data: = [] if rx_data.size() < (ports_count_pos + 7 + (block_len - 1) * 2): return false - for i in block_len: + for i: int in block_len: var shift: int = i * 2 block_data.append(rx_data.decode_u16(ports_count_pos + 7 + shift)) isa_block[block_adr] = block_data