Merge remote-tracking branch 'origin/master' into master-prd
This commit is contained in:
BIN
data/кнопка-внешние-0.png
Normal file
BIN
data/кнопка-внешние-0.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 48 KiB |
34
data/кнопка-внешние-0.png.import
Normal file
34
data/кнопка-внешние-0.png.import
Normal file
@@ -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
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
17
scenes/pribor-externals/externals.gd
Normal file
17
scenes/pribor-externals/externals.gd
Normal file
@@ -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)
|
||||
1
scenes/pribor-externals/externals.gd.uid
Normal file
1
scenes/pribor-externals/externals.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://beb41qdahkdp5
|
||||
16
scenes/pribor-externals/externals.tscn
Normal file
16
scenes/pribor-externals/externals.tscn
Normal file
@@ -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
|
||||
@@ -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]
|
||||
|
||||
@@ -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'],
|
||||
|
||||
@@ -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"]
|
||||
|
||||
163
scenes/контроль/элемент-ю.tscn
Normal file
163
scenes/контроль/элемент-ю.tscn
Normal file
@@ -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"]
|
||||
@@ -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:
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user