Merge remote-tracking branch 'refs/remotes/Sasha/master'

# Conflicts:
#	scenes/button-flat/nine-patch-button.gd
#	scenes/frame-ecm-list/scroll-ecm-list.gd
#	scenes/grid-buttons-ecm/grid-buttons-ecm.tscn
#	scenes/настройки/настройки.tscn
#	scenes/работа/работа.gd
#	scripts/interfer.gd
#	scripts/settings.gd
#	scripts/trassa.gd
This commit is contained in:
lepshiy
2025-10-23 14:57:29 +03:00
63 changed files with 1450 additions and 720 deletions

View File

@@ -2,11 +2,11 @@ class_name bip_ extends Control
var selected: bool
## Присваивает заданое значение видимости селектору.
## Присваивает заданное значение видимости селектору.
func set_track_visible(value: bool): $track.visible = value
## Присваивает заданое значение видимости индикатору выполнения.
## Присваивает заданное значение видимости индикатору выполнения.
func set_ecm_visible(value: bool): $ecm_done.visible = value
@@ -14,7 +14,7 @@ func update(tick_rx: int):
$bip.set_instance_shader_parameter('tick_update', tick_rx)
## Функция присваивает заданое значение видимости селектору.
## Присваивает заданое значение видимости селектору.
func set_sel_visible(value: bool):
selected = value
$selector.visible = value

View File

@@ -15,17 +15,19 @@ code = "shader_type canvas_item;
uniform vec4 color: source_color = vec4(1, 1, 1, 1);
uniform vec4 color_up: source_color = vec4(1, 1, 1, 1); /* Цвет вспышки при обновлении */
const float ds = 0.00725; /* Относительное расстояние на котором выполняется сглаживание краёв */
const float dsr = 6.125;
const float ds = 0.01; /* Относительное расстояние на котором выполняется сглаживание краёв */
const float dsr = 10.0;
const vec2 center = vec2(0.5, 0.5); /* Центр должен быть в (0.5, 0.5), но это не так */
const float radius = 0.075 - ds * 2.0; /* Радиус должен быть 0.5, но это не так */
uniform float speed: hint_range(-1024.0, 1024.0) = 0.0; /* Время вспышки при обновлении, c */
uniform int ant_band_count_0 = 3;
const float ant_band_r0_0 = 0.3;
const float ant_band_r0_0 = 0.27
const float ant_band_r1_0 = 0.4;
;
const float ant_band_r1_0 = 0.47;
float smooth_px(float r, float R, float dss)
{
@@ -97,7 +99,7 @@ void fragment()
shader = SubResource("Shader_60ho7")
shader_parameter/color = Color(1, 1, 1, 0.968627)
shader_parameter/color_up = Color(1, 1, 1, 0)
shader_parameter/speed = 73.0
shader_parameter/speed = -118.48
shader_parameter/ant_band_count_0 = 3
[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_hqs6j"]
@@ -185,23 +187,14 @@ void fragment()
}
"
[sub_resource type="ShaderMaterial" id="ShaderMaterial_lpmq6"]
shader = SubResource("Shader_81bae")
shader_parameter/color = Color(0.0862745, 0.560784, 0.72549, 0.886275)
shader_parameter/color_up = Color(1, 1, 1, 0)
shader_parameter/speed = -73.0
shader_parameter/ant_band_count_0 = 9
shader_parameter/ant_band_r0_0 = 0.45
shader_parameter/ant_band_r1_0 = 0.5
[sub_resource type="ShaderMaterial" id="ShaderMaterial_h3oo7"]
shader = SubResource("Shader_81bae")
shader_parameter/color = Color(1, 0, 0, 1)
shader_parameter/color_up = Color(1, 1, 1, 0)
shader_parameter/speed = 66.064
shader_parameter/ant_band_count_0 = 3
shader_parameter/ant_band_r0_0 = 0.47
shader_parameter/ant_band_r1_0 = 0.5
shader_parameter/speed = 85.808
shader_parameter/ant_band_count_0 = 4
shader_parameter/ant_band_r0_0 = 0.3
shader_parameter/ant_band_r1_0 = 0.45
[sub_resource type="ShaderMaterial" id="ShaderMaterial_lkrha"]
shader = ExtResource("3_2a1qb")
@@ -213,51 +206,63 @@ shader_parameter/point_5 = Vector2(0.214, 0.125)
shader_parameter/point_6 = Vector2(0.25, 0.125)
shader_parameter/point_7 = Vector2(0.125, 0.214)
shader_parameter/point_8 = Vector2(0.125, 0.25)
shader_parameter/len = 0.264
shader_parameter/speed = 71.0
shader_parameter/len = 0.179
shader_parameter/speed = 63.0
[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_svd33"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_lpmq6"]
shader = SubResource("Shader_81bae")
shader_parameter/color = Color(0.0784314, 0.501961, 0.701961, 0.917647)
shader_parameter/color_up = Color(1, 1, 1, 0)
shader_parameter/speed = 158.179
shader_parameter/ant_band_count_0 = 9
shader_parameter/ant_band_r0_0 = 0.27
shader_parameter/ant_band_r1_0 = 0.45
[node name="threat" type="Control"]
layout_mode = 3
anchors_preset = 0
offset_right = 20.0
offset_bottom = 20.0
offset_left = -12.0
offset_top = -12.0
offset_right = 12.0
offset_bottom = 12.0
script = ExtResource("1_h7l70")
[node name="bip" type="Sprite2D" parent="."]
material = SubResource("ShaderMaterial_qq6yq")
position = Vector2(10, 10)
scale = Vector2(20, 20)
position = Vector2(12, 12)
scale = Vector2(14, 14)
texture = SubResource("PlaceholderTexture2D_xbpqf")
[node name="selector" type="Sprite2D" parent="."]
visible = false
material = SubResource("ShaderMaterial_fkqwb")
scale = Vector2(20, 20)
position = Vector2(-1, -1)
scale = Vector2(26, 26)
texture = SubResource("PlaceholderTexture2D_hqs6j")
centered = false
[node name="recomendation" type="Sprite2D" parent="."]
visible = false
material = SubResource("ShaderMaterial_lpmq6")
scale = Vector2(20, 20)
texture = SubResource("PlaceholderTexture2D_hqs6j")
centered = false
offset = Vector2(0.5, 0.5)
[node name="ecm_done" type="Sprite2D" parent="."]
visible = false
material = SubResource("ShaderMaterial_h3oo7")
position = Vector2(-5, -5)
scale = Vector2(30, 30)
position = Vector2(-2, -2)
scale = Vector2(28, 28)
texture = SubResource("PlaceholderTexture2D_hqs6j")
centered = false
offset = Vector2(0.5, 0.5)
[node name="track" type="Sprite2D" parent="."]
visible = false
material = SubResource("ShaderMaterial_lkrha")
position = Vector2(10, 10)
scale = Vector2(26, 26)
position = Vector2(12, 12)
scale = Vector2(34, 34)
texture = SubResource("PlaceholderTexture2D_svd33")
[node name="recomendation" type="Sprite2D" parent="."]
visible = false
material = SubResource("ShaderMaterial_lpmq6")
scale = Vector2(24, 24)
texture = SubResource("PlaceholderTexture2D_hqs6j")
offset = Vector2(0.5, 0.5)
[connection signal="gui_input" from="." to="." method="_on_bip_gui_input"]

View File

@@ -38,9 +38,10 @@ var _pressed: = false
@export var disabled: bool = false:
set(val):
disabled = val
$button.set_disabled(val)
$back.disabled = val
$state.modulate.a = 0.5 if val else 1.0
if is_inside_tree():
$button.set_disabled(val)
$back.disabled = val
$state.modulate.a = 0.5 if val else 1.0
@export var pressed: bool = false:
@@ -59,7 +60,7 @@ var _pressed: = false
$button.set_toggle_mode(val)
@export var font_size: int = true:
@export var font_size: int = 15:
set(val):
$button.add_theme_font_size_override('theme_override_font_sizes/font_size', val)

View File

@@ -2,7 +2,9 @@ class_name Diagram extends Sprite2D
const NUM_OF_RANGE = 7
const NUM_OF_DIRECTIONS = 4
var fs_default_colors: Array ## Цвета по умолчанию для блоков ФС.
var fs_default_colors: Array[Color] ## Цвета по умолчанию для блоков ФС.
@export var SecZap: PackedScene
func _ready() -> void:
signaller.connect('map_mode_changed', Callable(self, 'set_view_mode'))
@@ -11,20 +13,24 @@ func _ready() -> void:
func sv(val: float) -> float: return val / ($строб.scale.x / 2.0) * 0.125
func set_canvas_rotation(val: float) -> void: material.set('shader_parameter/rotation', val)
func set_strob_visible(val: bool): $строб.visible = val
func set_strob_center(val: Vector2): $строб.position = val
func set_strob_dir(val: float): $строб.material.set('shader_parameter/dir', val)
func set_strob_color(val: Color): $строб.material.set('shader_parameter/color', val)
func set_strob_width(val: float): $строб.material.set('shader_parameter/width', val)
func set_strob_band(val: float): $строб.material.set('shader_parameter/band', val / 125.0)
func set_strob_radius(val: float): $строб.material.set('shader_parameter/radius', sv(val))
func set_strob_dir(val: float): $строб.set_instance_shader_parameter('dir', val)
func set_strob_width(val: float): $строб.set_instance_shader_parameter('width', val)
func set_strob_band(val: float): $строб.set_instance_shader_parameter('band', val / 125.0)
func set_strob_radius(val: float): $строб.set_instance_shader_parameter('radius', sv(val))
func set_strob_color(val: Color): $строб.set_instance_shader_parameter('color', val)
func get_strob_center() -> Vector2: return $строб.position
func get_strob_visible() -> bool: return $строб.visible
func get_strob_width() -> float: return $строб.material.get('shader_parameter/width')
func get_strob_band() -> float: return $строб.material.get('shader_parameter/band') * 125.0
func get_strob_radius() -> float: return $строб.material.get('shader_parameter/radius') * 125.0
func get_strob_center() -> Vector2: return $строб.position
func get_strob_visible() -> bool: return $строб.visible
func get_strob_dir() -> float: return $строб.get_instance_shader_parameter('dir')
func get_strob_width() -> float: return $строб.get_instance_shader_parameter('width')
func get_strob_band() -> float: return $строб.get_instance_shader_parameter('band') * 125.0
func get_strob_radius() -> float: return $строб.get_instance_shader_parameter('radius') * 125.0
func get_strob_color() -> float: return $строб.get_instance_shader_parameter('color')
func get_canvas_rotation() -> float: return material.get('shader_parameter/rotation')
func get_radius_outter() -> float: return material.get('shader_parameter/radius_outter')
func get_radius_inner_0() -> float: return material.get('shader_parameter/radius_inner_0')
func get_radius_inner_1() -> float: return material.get('shader_parameter/radius_inner_1')
@@ -32,6 +38,51 @@ func get_radius_inner_1() -> float: return material.get('shader_parameter/radius
func set_band_colors(val: Array): material.set('shader_parameter/ant_band_c', val)
## Добавляет сектор запрета[br]
## [param id] - Индекс сектора запрета.[br]
## [param szv.x] - Центральная частота (198...546).[br]
## [param szv.w] - Ширина диапазона (198...546).[br]
## [param szv.y] - Угол центра (0...360).[br]
## [param szv.z] - Ширина по углу (0...360).[br]
func add_seczap(id: int, szv: Vector4):
var seczap: = SecZap.instantiate()
seczap.name = StringName('SECZAP%d' % id)
seczap.position = $строб.position
seczap.set_instance_shader_parameter('dir', szv.y - 90.0)
seczap.set_instance_shader_parameter('width', szv.z)
seczap.set_instance_shader_parameter('band', sv(szv.w))
seczap.set_instance_shader_parameter('radius', sv(szv.x))
add_child(seczap)
## Удаляет сектор запрета[br]
## [param id] - Индекс сектора запрета[br]
func remove_seczap(id: int):
var seczap: = get_node_or_null('SECZAP%d' % id)
if not seczap: return
remove_child(seczap)
seczap.queue_free()
## Изменяет сектор запрета[br]
## [param id] - Индекс сектора запрета[br]
## [param szv.x] - Центральная частота[br]
## [param szv.w] - Ширина диапазона[br]
## [param szv.y] - Угол центра[br]
## [param szv.z] - Ширина по углу[br]
func set_seczap(id: int, szv: Vector4):
var seczap: = get_node('SECZAP%d' % id)
seczap.set_instance_shader_parameter('dir', szv.y)
seczap.set_instance_shader_parameter('width', szv.z)
seczap.set_instance_shader_parameter('band', sv(szv.w))
seczap.set_instance_shader_parameter('radius', sv(szv.x))
func set_seczap_color(id: int, color: Color):
var seczap: = get_node('SECZAP%d' % id)
seczap.set_instance_shader_parameter('color', color)
func set_view_mode(val: int):
if val == 1:
$строб.hide()
@@ -42,8 +93,10 @@ func set_view_mode(val: int):
## Закрашивание по умолчанию блоков ФС цветами из настроек.
func set_def_colors():
var color0: Vector3 = ProjectSettings.get_setting('application/interfer/default_color0', Vector3(0.38, 0.47, 0.51))
var color1: Vector3 = ProjectSettings.get_setting('application/interfer/default_color1', Vector3(0.39, 0.44, 0.50))
var color0: Color = ProjectSettings.get_setting('application/interfer/default_color0', Color(0.38, 0.47, 0.51, 1.0))
var color1: Color = ProjectSettings.get_setting('application/interfer/default_color1', Color(0.39, 0.44, 0.50, 1.0))
color0 *= Color(1.0, 1.0, 1.0, 0.0)
color1 *= Color(1.0, 1.0, 1.0, 0.0)
var col_arr: Array = [color0, color1]
var col = false
for i in NUM_OF_RANGE:

View File

@@ -11,19 +11,13 @@ size = Vector2(1600, 1200)
[sub_resource type="ShaderMaterial" id="ShaderMaterial_lniyv"]
resource_local_to_scene = true
shader = ExtResource("4_obn6s")
shader_parameter/color = Color(1, 1, 1, 0.168627)
shader_parameter/clip_color = Color(1, 0.5, 0.5, 1)
shader_parameter/width = 45.0
shader_parameter/band = 0.02
shader_parameter/radius = 0.08
shader_parameter/dir = 0.0
shader_parameter/inner_clip = 0.045
[node name="canvas" type="Sprite2D"]
material = ExtResource("1_newdt")
texture = SubResource("PlaceholderTexture2D_2bft1")
centered = false
script = ExtResource("2_8xjuy")
SecZap = ExtResource("3_tgnog")
[node name="строб" parent="." instance=ExtResource("3_tgnog")]
material = SubResource("ShaderMaterial_lniyv")

View File

@@ -5,18 +5,16 @@
[sub_resource type="ShaderMaterial" id="ShaderMaterial_xo5or"]
resource_local_to_scene = true
shader = ExtResource("1_e0gfn")
shader_parameter/color = Color(1, 1, 1, 0.168627)
shader_parameter/clip_color = Color(1, 0.5, 0.5, 1)
shader_parameter/width = 45.0
shader_parameter/band = 0.02
shader_parameter/radius = 0.08
shader_parameter/dir = 0.0
shader_parameter/inner_clip = 0.045
[sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_2lkm8"]
[node name="sector" type="Sprite2D"]
material = SubResource("ShaderMaterial_xo5or")
instance_shader_parameters/band = 0.02
instance_shader_parameters/color = Color(1, 1, 1, 0.188235)
instance_shader_parameters/inner_clip = 0.045
instance_shader_parameters/radius = 0.08
instance_shader_parameters/width = 45.0
position = Vector2(610, 600)
scale = Vector2(1108, 1108)
texture = SubResource("PlaceholderTexture2D_2lkm8")

View File

@@ -20,7 +20,7 @@ const INTERFER_STATE = {
5: '' }
## Состояние выполнения сеанса помехи
## Названия помех
const INTERFER_NAMES = {
'off': 'Откл',
'mchm1': 'МЧМ-1',
@@ -46,6 +46,7 @@ const COLUMN_NAME = 1
const COLUMN_AOA = 2
const COLUMN_STATE = 3
var course = 0.0 ## Курс корабля
func on_rto_threat_unsel(_th_id): $table.clear_rows_selected()
@@ -88,6 +89,8 @@ func _ready():
interfer.connect('interfer_recommendate', Callable(self, 'on_interfer_recommendate'))
$table.connect('row_pressed', Callable(self, 'on_row_pressed'))
call_deferred('init_table')
var unit_nav = network.get_unit_instance('навигация')
unit_nav.connect('data_received', on_navi_data_received)
func init_table():
@@ -148,7 +151,10 @@ func map_th_to_row(ecm) -> Array:
row[COLUMN_NAME] = ''
if INTERFER_NAMES.has(ecm.krp):
row[COLUMN_NAME] = '%s' % INTERFER_NAMES[ecm.krp]
row[COLUMN_AOA] = '%s' % ecm.kni
var aoa = ecm.kni + course
if aoa > 360.0:
aoa -= 360.0
row[COLUMN_AOA] = '%5.1f' % aoa
row[COLUMN_STATE] = ''
if INTERFER_STATE.has(ecm.svk):
row[COLUMN_STATE] = '%s' % INTERFER_STATE[ecm.svk]
@@ -159,7 +165,10 @@ func on_interfer_recommendate(ecm):
var sel_rows: Array
$table.get_selected_rows(sel_rows)
if not len(sel_rows): return
var row = sel_rows[0]
var sel_ecm = $table.get_node_user_data(0, sel_rows[0])
if ecm == sel_ecm:
signaller.emit_signal('interfer_selected', ecm)
func on_navi_data_received(data: Dictionary):
course = data.get('k', 0.0)

View File

@@ -89,7 +89,8 @@ func map_th_to_row(th) -> Array:
row.resize(TABLE_COLUMN_PARAM.size())
var i_col: int = 0
for param_name in TABLE_COLUMN_PARAM:
row[i_col] = '%s' % th.get(param_name)
var val = th.get(param_name)
row[i_col] = '%0.1f' % val if val is float else '%s' % val
i_col += 1
return row

View File

@@ -14,7 +14,6 @@ size_flags_vertical = 3
strips_rotation = 30.0
text = "Откл."
disabled = true
font_size = 1
metadata/rfi_name = "off"
[node name="btn_p12" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")]
@@ -24,7 +23,6 @@ size_flags_vertical = 3
strips_rotation = 30.0
text = "МЧМ-1"
disabled = true
font_size = 1
metadata/rfi_name = "mchm1"
[node name="btn_p16" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")]
@@ -34,7 +32,6 @@ size_flags_vertical = 3
strips_rotation = 30.0
text = "СРН-И1"
disabled = true
font_size = 1
metadata/rfi_name = "srni1"
[node name="btn_p15" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")]
@@ -44,7 +41,6 @@ size_flags_vertical = 3
strips_rotation = 30.0
text = "СРН-М2"
disabled = true
font_size = 1
metadata/rfi_name = "srnm2"
[node name="btn_p18" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")]
@@ -54,7 +50,6 @@ size_flags_vertical = 3
strips_rotation = 30.0
text = "СРН-GPS"
disabled = true
font_size = 1
metadata/rfi_name = "srngps"
[node name="btn_p14" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")]
@@ -64,7 +59,6 @@ size_flags_vertical = 3
strips_rotation = 30.0
text = "ПД-М4"
disabled = true
font_size = 1
metadata/rfi_name = "pdm4"
[node name="btn_p13" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")]
@@ -74,7 +68,6 @@ size_flags_vertical = 3
strips_rotation = 30.0
text = "ПД-М2"
disabled = true
font_size = 1
metadata/rfi_name = "pdm2"
[node name="btn_p11" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")]
@@ -84,7 +77,6 @@ size_flags_vertical = 3
strips_rotation = 30.0
text = "ЛЧМ-1"
disabled = true
font_size = 1
metadata/rfi_name = "lchm1"
[node name="btn_p17" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")]
@@ -94,7 +86,6 @@ size_flags_vertical = 3
strips_rotation = 30.0
text = "ЛЧМ-2"
disabled = true
font_size = 1
metadata/rfi_name = "lchm2"
[node name="btn_p10" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")]
@@ -104,7 +95,6 @@ size_flags_vertical = 3
strips_rotation = 30.0
text = "ПД-М4С"
disabled = true
font_size = 1
metadata/rfi_name = "pdm4s"
[node name="btn_p9" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")]
@@ -114,7 +104,6 @@ size_flags_vertical = 3
strips_rotation = 30.0
text = "ПД-ЧМ"
disabled = true
font_size = 1
metadata/rfi_name = "pdchm"
[node name="btn_p8" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")]
@@ -124,7 +113,6 @@ size_flags_vertical = 3
strips_rotation = 30.0
text = "СВ-И1"
disabled = true
font_size = 1
metadata/rfi_name = "svi1"
[node name="btn_p7" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")]
@@ -134,7 +122,6 @@ size_flags_vertical = 3
strips_rotation = 30.0
text = "K1"
disabled = true
font_size = 1
metadata/rfi_name = "k1"
[node name="btn_p6" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")]
@@ -144,7 +131,6 @@ size_flags_vertical = 3
strips_rotation = 30.0
text = "СВ-М2"
disabled = true
font_size = 1
metadata/rfi_name = "svm2"
[node name="btn_p5" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")]
@@ -154,7 +140,6 @@ size_flags_vertical = 3
strips_rotation = 30.0
text = "ОЗП-1"
disabled = true
font_size = 1
metadata/rfi_name = "ozp1"
[node name="btn_p19" parent="." groups=["группа-режим-помехи"] instance=ExtResource("1_oy80h")]
@@ -164,5 +149,4 @@ size_flags_vertical = 3
strips_rotation = 30.0
text = "ЕПРЛС"
disabled = true
font_size = 1
metadata/rfi_name = "eprls"

View File

@@ -1,14 +1,8 @@
[gd_scene load_steps=5 format=3 uid="uid://8ll27id5ajq1"]
[gd_scene load_steps=4 format=3 uid="uid://8ll27id5ajq1"]
[ext_resource type="Script" uid="uid://d0jwv5opi3mrl" path="res://scenes/pribor-afsp/pribor-afsp.gd" id="1_151rh"]
[ext_resource type="Script" uid="uid://bux47vkw71w1t" path="res://scenes/контроль/request.gd" id="2_4vyhj"]
[ext_resource type="PackedScene" uid="uid://dnxq870xf6pkh" path="res://scenes/контроль/bort-afsp.tscn" id="3_d7iti"]
[sub_resource type="GDScript" id="GDScript_yhnwg"]
script/source = "extends Timer
func _ready(): wait_time = ProjectSettings.get_setting('application/config/unit_rr_request_period')
"
[ext_resource type="PackedScene" uid="uid://dnxq870xf6pkh" path="res://scenes/pribor-afsp/bort-afsp.tscn" id="3_d7iti"]
[node name="pribor_afsp" type="Control"]
layout_mode = 3
@@ -19,17 +13,20 @@ offset_right = 70.0
offset_bottom = 30.0
scale = Vector2(1, 0.9)
script = ExtResource("1_151rh")
prefix_path = "DeviceDescription[DeviceName]"
this_afsp_name = "Устройство РР левого борта"
unit_name = &"уарэп-афсп-левый"
settings_path_to_url = "Адрес АФСП левого борта"
settings_path_to_wait_time = "Период опроса состояния АФСП, секунды"
metadata/DeviceName = &"Устройство РР левого борта"
[node name="request" type="HTTPRequest" parent="."]
use_threads = true
script = ExtResource("2_4vyhj")
projsettings_path_left = "application/config/Адрес АФСП левого борта"
projsettings_path_right = "application/config/Адрес АФСП правого борта"
request_url = null
[node name="timer" type="Timer" parent="request"]
autostart = true
script = SubResource("GDScript_yhnwg")
[node name="bort" parent="." instance=ExtResource("3_d7iti")]
layout_mode = 0

View File

@@ -1,14 +1,8 @@
[gd_scene load_steps=5 format=3 uid="uid://5uv1idl3lqet"]
[gd_scene load_steps=4 format=3 uid="uid://5uv1idl3lqet"]
[ext_resource type="Script" uid="uid://d0jwv5opi3mrl" path="res://scenes/pribor-afsp/pribor-afsp.gd" id="1_tfses"]
[ext_resource type="Script" uid="uid://bux47vkw71w1t" path="res://scenes/контроль/request.gd" id="2_miwrd"]
[ext_resource type="PackedScene" uid="uid://dnxq870xf6pkh" path="res://scenes/контроль/bort-afsp.tscn" id="3_xpxb5"]
[sub_resource type="GDScript" id="GDScript_yhnwg"]
script/source = "extends Timer
func _ready(): wait_time = ProjectSettings.get_setting('application/config/unit_rr_request_period')
"
[ext_resource type="PackedScene" uid="uid://dnxq870xf6pkh" path="res://scenes/pribor-afsp/bort-afsp.tscn" id="3_xpxb5"]
[node name="pribor_afsp" type="Control"]
layout_mode = 3
@@ -19,17 +13,20 @@ offset_right = 81.0
offset_bottom = 108.0
scale = Vector2(1, 0.9)
script = ExtResource("1_tfses")
prefix_path = "DeviceDescription[DeviceName]"
this_afsp_name = "Устройство РР правого борта"
unit_name = &"уарэп-афсп-правый"
settings_path_to_url = "Адрес АФСП правого борта"
settings_path_to_wait_time = "Период опроса состояния АФСП, секунды"
metadata/DeviceName = &"Устройство РР правого борта"
[node name="request" type="HTTPRequest" parent="."]
use_threads = true
script = ExtResource("2_miwrd")
projsettings_path_left = "application/config/Адрес АФСП левого борта"
projsettings_path_right = "application/config/Адрес АФСП правого борта"
request_url = null
[node name="timer" type="Timer" parent="request"]
autostart = true
script = SubResource("GDScript_yhnwg")
[node name="bort" parent="." instance=ExtResource("3_xpxb5")]
layout_mode = 0

View File

@@ -1,26 +1,57 @@
@tool
class_name pribor_afsp extends 'res://scenes/контроль/прибор.gd'
@export var prefix_path: String = 'DeviceDescripton[DeviceName]'
@export var prefix_path: String = '' ## Должно быть в JSON
@export var this_afsp_name: String = '' ## Должно быть в JSON
@export var unit_name: StringName= '' ## Должно быть в settings.gd
@export var settings_path_to_url: String = '' ## Должно быть в ProjectSettings
@export var settings_path_to_wait_time: String = '' ## Должно быть в ProjectSettings
static var json_conv: JSON = JSON.new()
static var node_maper = load('res://scenes/контроль/node-maper.gd')
var ctrl_pos = 0
# SystemName: "gen" DevList - там состояние связи с генератором по кан шине
func _ready() -> void:
ProjectSettings.connect('settings_changed', on_settings_chaged)
on_settings_chaged()
func on_settings_chaged():
$request.request_url = ProjectSettings.get_setting('application/config/%s' % settings_path_to_url)
$request/timer.wait_time = float(ProjectSettings.get_setting('application/config/%s' % settings_path_to_wait_time))
tools.allways($request.request_url != null)
func _on_request_completed(result, _response_code, headers, body: PackedByteArray):
var unit_instance: = network.get_unit_instance(unit_name)
if result != 0:
var rs = $request.get_result_string(result)
log.error('\"%s\"' % rs)
if unit_instance.online:
unit_instance.online = false
unit_instance.emit_signal('line_changed', unit_instance)
return
var json_str: String = body.get_string_from_utf8()
if not json_str:
push_error('не удаётся получить строку utf8 из данных (%s)' % headers)
if unit_instance.online:
unit_instance.online = false
unit_instance.emit_signal('line_changed', unit_instance)
return
var rc = json_conv.parse(json_str)
var rc: = json_conv.parse(json_str)
if rc != Error.OK:
var err = json_conv.get_error_message()
var err: = json_conv.get_error_message()
push_error('разбор json прерван - \"%s\" (%s)' % [err, headers])
if unit_instance.online:
unit_instance.online = false
unit_instance.emit_signal('line_changed', unit_instance)
return
var pp = []
@@ -32,12 +63,18 @@ func _on_request_completed(result, _response_code, headers, body: PackedByteArra
push_error('путь %s не найден (%s)' % [pp_copy, ret_val[2]])
return
var this_afsp_name: StringName = $bort.get_meta('DeviceName', '')
var received_afsp_name: StringName = ret_val[0]
if this_afsp_name != received_afsp_name:
# TODO: Сюда попадаем, когда приходит от другого борта
#push_error('не известное устройство: \"%s\", ожидадось: \"%s\"' % [received_afsp_name, this_afsp_name])
return
unit_instance.rx_tick = Time.get_ticks_msec()
if not unit_instance.online:
unit_instance.online = true
unit_instance.emit_signal('line_changed', unit_instance)
for child in $bort.get_node('konverter/grid').get_children():
node_maper.map_value_to_item(json_conv.data, child, 'value0')
node_maper.map_value_to_item(json_conv.data, child, 'value1')
@@ -63,4 +100,3 @@ func _on_item_pressed(block_a: Control):
var metas = block_a.get_meta_list()
for n in metas:
var v = block_a.get_meta(n)
print_debug('%s:%s' % [n, v])

View File

@@ -1,29 +1,55 @@
@tool
class_name pribor_rtr extends 'res://scenes/контроль/прибор.gd'
@export var prefix_path: String = 'DeviceDescripton[DeviceName]'
@export var prefix_path: String = '' ## Должно быть в JSON
@export var this_bpo1_name: String = '' ## Должно быть в JSON
@export var this_bpo2_name: String = '' ## Должно быть в JSON
@export var unit_name1: StringName= '' ## Должно быть в settings.gd
@export var unit_name2: StringName= '' ## Должно быть в settings.gd
@export var settings_path1_to_url: String = '' ## Должно быть в ProjectSettings
@export var settings_path2_to_url: String = '' ## Должно быть в ProjectSettings
@export var settings_path_to_wait_time: String = '' ## Должно быть в ProjectSettings
static var json_conv: JSON = JSON.new()
static var node_maper = load('res://scenes/контроль/node-maper.gd')
var ctrl_pos = 110
const bort_to_node_name = {
'Устройство РР левого борта': 'grid_bpo_a1',
'Устройство РР правого борта': 'grid_bpo_a2'}
var bort_to_node_name = {}
var bort_to_unit_name = {}
func _ready() -> void:
ProjectSettings.connect('settings_changed', on_settings_changed)
on_settings_changed()
find_labels(self)
func on_settings_changed():
bort_to_node_name.merge({this_bpo1_name: 'grid_bpo_a1', this_bpo2_name: 'grid_bpo_a2'}, true)
bort_to_unit_name.merge({this_bpo1_name: unit_name1, this_bpo2_name: unit_name2})
$request1.request_url = ProjectSettings.get_setting('application/config/%s' % settings_path1_to_url)
$request1/timer.wait_time = float(ProjectSettings.get_setting('application/config/%s' % settings_path_to_wait_time))
$request2.request_url = ProjectSettings.get_setting('application/config/%s' % settings_path2_to_url)
$request2/timer.wait_time = float(ProjectSettings.get_setting('application/config/%s' % settings_path_to_wait_time))
assert($request1.request_url != null)
assert($request2.request_url != null)
func _on_request_completed(result, _response_code, headers, body: PackedByteArray):
if result != 0:
var rs = $request.get_result_string(result)
log.error('\"%s\"' % rs)
var rs = $request1.get_result_string(result)
push_error('\"%s\"' % rs)
return
var json_str: String = body.get_string_from_utf8()
var json_str: = body.get_string_from_utf8()
if not json_str:
push_error('не удаётся получить строку из utf8-данных (%s)' % headers)
return
var rc = json_conv.parse(json_str)
var rc: = json_conv.parse(json_str)
if rc != Error.OK:
var err = json_conv.get_error_message()
push_error('разбор json прерван - \"%s\" (%s)' % [err, headers])
@@ -39,10 +65,50 @@ func _on_request_completed(result, _response_code, headers, body: PackedByteArra
return
if not bort_to_node_name.has(ret_val[0]):
push_error('не известное устройство: \"%s\"' % ret_val[0])
return
var node_name = bort_to_node_name[ret_val[0]]
var bort_node = get_node(node_name)
var unit_name = bort_to_unit_name[ret_val[0]]
var unit_instance = network.get_unit_instance(unit_name)
unit_instance.rx_tick = Time.get_ticks_msec()
if not unit_instance.online:
unit_instance.online = true
unit_instance.emit_signal('line_changed', unit_instance)
for item in bort_node.get_children():
node_maper.map_value_to_item(json_conv.data, item, 'state')
var items = get_tree().get_nodes_in_group('управляется-по-шине-1')
for node in items:
if node.state == 1:
$yas_bpo_a1.state = 1
break
items = get_tree().get_nodes_in_group('управляется-по-шине-2')
for node in items:
if node.state == 1:
$yas_bpo_a2.state = 1
break
items = get_tree().get_nodes_in_group('потребитель-питания')
for node in items:
if node.state == 1:
$mod_pit_g1.state = 1
break
func find_labels(node1: Node):
if node1 is Label:
if node1.name in ["lbl_rname", "rname"]:
if not node1.has_meta("tooltip_set"):
ctrl_pos += 1
var box_number = ceili(float(ctrl_pos) / 10.0)
var position_number = ctrl_pos % 10
if position_number == 0:
position_number = 10
node1.tooltip_text = "Ящик - %d, Позиция - %d" % [box_number, position_number]
node1.mouse_filter = Control.MOUSE_FILTER_STOP
node1.set_meta("tooltip_set", true)
for child in node1.get_children():
find_labels(child)

View File

@@ -13,6 +13,14 @@ offset_top = 150.0
offset_right = 115.0
offset_bottom = 150.0
script = ExtResource("1_bhc4e")
prefix_path = "DeviceDescription[DeviceName]"
this_bpo1_name = "Устройство БПО левого борта"
this_bpo2_name = "Устройство БПО правого борта"
unit_name1 = &"уарэп-бпо-1"
unit_name2 = &"уарэп-бпо-2"
settings_path1_to_url = "Адрес БПО левого борта"
settings_path2_to_url = "Адрес БПО правого борта"
settings_path_to_wait_time = "Период опроса состояния БПО, секунды"
[node name="mod_pit_g1" parent="." instance=ExtResource("2_jp6m0")]
layout_mode = 2
@@ -43,63 +51,63 @@ offset_right = 498.0
offset_bottom = 320.0
columns = 4
[node name="kanal1" parent="grid_bpo_a1" instance=ExtResource("2_jp6m0")]
[node name="kanal1" parent="grid_bpo_a1" groups=["потребитель-питания"] instance=ExtResource("2_jp6m0")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 1"
metadata/state = "SelfTest[0].SystemList[0].DevList[0]['TestPassed']"
[node name="kanal2" parent="grid_bpo_a1" instance=ExtResource("2_jp6m0")]
[node name="kanal2" parent="grid_bpo_a1" groups=["потребитель-питания", "управляется-по-шине-1"] instance=ExtResource("2_jp6m0")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 2"
metadata/state = "SelfTest[0].SystemList[0].DevList[1]['TestPassed']"
[node name="kanal3" parent="grid_bpo_a1" instance=ExtResource("2_jp6m0")]
[node name="kanal3" parent="grid_bpo_a1" groups=["потребитель-питания", "управляется-по-шине-1"] instance=ExtResource("2_jp6m0")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 3"
metadata/state = "SelfTest[0].SystemList[0].DevList[2]['TestPassed']"
[node name="kanal4" parent="grid_bpo_a1" instance=ExtResource("2_jp6m0")]
[node name="kanal4" parent="grid_bpo_a1" groups=["потребитель-питания", "управляется-по-шине-1"] instance=ExtResource("2_jp6m0")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 4"
metadata/state = "SelfTest[0].SystemList[0].DevList[3]['TestPassed']"
[node name="kanal5" parent="grid_bpo_a1" instance=ExtResource("2_jp6m0")]
[node name="kanal5" parent="grid_bpo_a1" groups=["потребитель-питания", "управляется-по-шине-1"] instance=ExtResource("2_jp6m0")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 5"
metadata/state = "SelfTest[0].SystemList[0].DevList[4]['TestPassed']"
[node name="kanal6" parent="grid_bpo_a1" instance=ExtResource("2_jp6m0")]
[node name="kanal6" parent="grid_bpo_a1" groups=["потребитель-питания", "управляется-по-шине-1"] instance=ExtResource("2_jp6m0")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 6"
metadata/state = "SelfTest[0].SystemList[0].DevList[5]['TestPassed']"
[node name="kanal7" parent="grid_bpo_a1" instance=ExtResource("2_jp6m0")]
[node name="kanal7" parent="grid_bpo_a1" groups=["потребитель-питания", "управляется-по-шине-1"] instance=ExtResource("2_jp6m0")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 7"
metadata/state = "SelfTest[0].SystemList[0].DevList[6]['TestPassed']"
[node name="kanal8" parent="grid_bpo_a1" instance=ExtResource("2_jp6m0")]
[node name="kanal8" parent="grid_bpo_a1" groups=["потребитель-питания", "управляется-по-шине-1"] instance=ExtResource("2_jp6m0")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 8"
metadata/state = "SelfTest[0].SystemList[0].DevList[7]['TestPassed']"
[node name="yas_bpo_a1" parent="." instance=ExtResource("3_jcpjs")]
[node name="yas_bpo_a1" parent="." groups=["потребитель-питания"] instance=ExtResource("3_jcpjs")]
offset_left = 500.0
offset_top = 175.0
offset_right = 550.0
@@ -126,63 +134,63 @@ offset_right = 498.0
offset_bottom = 520.0
columns = 4
[node name="kanal1" parent="grid_bpo_a2" instance=ExtResource("2_jp6m0")]
[node name="kanal1" parent="grid_bpo_a2" groups=["потребитель-питания", "управляется-по-шине-2"] instance=ExtResource("2_jp6m0")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 1"
metadata/state = "SelfTest[0].SystemList[0].DevList[0]['TestPassed']"
[node name="kanal2" parent="grid_bpo_a2" instance=ExtResource("2_jp6m0")]
[node name="kanal2" parent="grid_bpo_a2" groups=["потребитель-питания", "управляется-по-шине-2"] instance=ExtResource("2_jp6m0")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 2"
metadata/state = "SelfTest[0].SystemList[0].DevList[1]['TestPassed']"
[node name="kanal3" parent="grid_bpo_a2" instance=ExtResource("2_jp6m0")]
[node name="kanal3" parent="grid_bpo_a2" groups=["потребитель-питания", "управляется-по-шине-2"] instance=ExtResource("2_jp6m0")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 3"
metadata/state = "SelfTest[0].SystemList[0].DevList[2]['TestPassed']"
[node name="kanal4" parent="grid_bpo_a2" instance=ExtResource("2_jp6m0")]
[node name="kanal4" parent="grid_bpo_a2" groups=["потребитель-питания", "управляется-по-шине-2"] instance=ExtResource("2_jp6m0")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 4"
metadata/state = "SelfTest[0].SystemList[0].DevList[3]['TestPassed']"
[node name="kanal5" parent="grid_bpo_a2" instance=ExtResource("2_jp6m0")]
[node name="kanal5" parent="grid_bpo_a2" groups=["потребитель-питания", "управляется-по-шине-2"] instance=ExtResource("2_jp6m0")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 5"
metadata/state = "SelfTest[0].SystemList[0].DevList[4]['TestPassed']"
[node name="kanal6" parent="grid_bpo_a2" instance=ExtResource("2_jp6m0")]
[node name="kanal6" parent="grid_bpo_a2" groups=["потребитель-питания", "управляется-по-шине-2"] instance=ExtResource("2_jp6m0")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 6"
metadata/state = "SelfTest[0].SystemList[0].DevList[5]['TestPassed']"
[node name="kanal7" parent="grid_bpo_a2" instance=ExtResource("2_jp6m0")]
[node name="kanal7" parent="grid_bpo_a2" groups=["потребитель-питания", "управляется-по-шине-2"] instance=ExtResource("2_jp6m0")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 7"
metadata/state = "SelfTest[0].SystemList[0].DevList[6]['TestPassed']"
[node name="kanal8" parent="grid_bpo_a2" instance=ExtResource("2_jp6m0")]
[node name="kanal8" parent="grid_bpo_a2" groups=["потребитель-питания", "управляется-по-шине-2"] instance=ExtResource("2_jp6m0")]
layout_mode = 2
size_flags_horizontal = 7
size_flags_vertical = 7
fname = "Канал 8"
metadata/state = "SelfTest[0].SystemList[0].DevList[7]['TestPassed']"
[node name="yas_bpo_a2" parent="." instance=ExtResource("3_jcpjs")]
[node name="yas_bpo_a2" parent="." groups=["потребитель-питания"] instance=ExtResource("3_jcpjs")]
offset_left = 500.0
offset_top = 375.0
offset_right = 550.0
@@ -191,14 +199,22 @@ show_rname = false
self_size = Vector2i(50, 145)
fname = "Яч. связи"
[node name="request" type="HTTPRequest" parent="."]
[node name="request1" type="HTTPRequest" parent="."]
use_threads = true
script = ExtResource("4_crej3")
projsettings_path_left = "application/config/Адрес БПО левого борта"
projsettings_path_right = "application/config/Адрес БПО правого борта"
request_url = null
[node name="timer" type="Timer" parent="request"]
[node name="timer" type="Timer" parent="request1"]
autostart = true
[connection signal="request_completed" from="request" to="." method="_on_request_completed"]
[connection signal="timeout" from="request/timer" to="request" method="_on_request_timer"]
[node name="request2" type="HTTPRequest" parent="."]
use_threads = true
script = ExtResource("4_crej3")
[node name="timer" type="Timer" parent="request2"]
autostart = true
[connection signal="request_completed" from="request1" to="." method="_on_request_completed"]
[connection signal="timeout" from="request1/timer" to="request1" method="_on_request_timer"]
[connection signal="request_completed" from="request2" to="." method="_on_request_completed"]
[connection signal="timeout" from="request2/timer" to="request2" method="_on_request_timer"]

View File

@@ -15,10 +15,10 @@ const constants_k: Dictionary = {
'POWER_THRESHOLD': 40,
'RAY_DOU_NUM': 0x3,
'ATT_UM_1': 0x0,
'ATT_UM_6': 0x7,
'ATT_UM_7': 0x7,
'POWER_UM': 85,
'TIMER_DELAY': 5.0,
'ATT_UM_6': 0x3,
'ATT_UM_7': 0x2,
'POWER_UM': 100,
'TIMER_DELAY': 10.0,
'STATE_MASHINE_TIMER': 0.3,
}
# Конфигурация параметров для каждого прибора
@@ -55,9 +55,9 @@ var block_kasseta_y5_prd_config_k: = {
}
# Основные переменные
var start_litera: int = 1
var ug_work_1: int = 0
var ug_work_2: int = 0
var ug_work_3: int = 0
var ug_work_1: int = 3 ## Аттенюация усилителей мощности
var ug_work_2: int = 2 ## Аттенюация усилителей мощности
var ug_work_3: int = 0 ## Аттенюация усилителей мощности
var mashine_timer: Timer = Timer.new()
var prd_k_module: Object
var unit_prd_k: Object
@@ -77,6 +77,7 @@ var control_results_k: Dictionary = {
}
var test_control_k = preload('res://scripts/pribor-prd.gd')
var ctrl_pos = 30
func _ready() -> void:
@@ -86,6 +87,7 @@ func _ready() -> void:
initialize_connections()
setup_timer()
set_default_state()
find_labels(self)
func on_state_mashine() -> void:
@@ -166,7 +168,7 @@ func on_mode_changed(in_tree: bool) -> void:
mashine_timer.start()
func power_fill(pow_dic: Dictionary) -> void:
func power_fill(pow_dic: Dictionary, fs_result: Dictionary) -> void:
#if not control_prd_k.block_kasseta_y5_config.yau07 or not control_prd_k.block_kasseta_y5_config.ukp1 or not control_prd_k.block_kasseta_y5_config.ukp2:
#return
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
@@ -179,6 +181,9 @@ func power_fill(pow_dic: Dictionary) -> void:
if pow_dic[powamp_meta].size() < 6:
status = STATE_VAL.ERROR
else:
if powamp_meta == 'um_7' and not fs_result.fs_1: return
if powamp_meta in ['um_1', 'um_2', 'um_3', 'um_4', 'um_5', 'um_6'] and not fs_result.fs_6: return
if powamp_meta in ['um_8', 'um_9', 'um_10', 'um_11', 'um_12', 'um_13'] and not fs_result.fs_7: return
i_powapm.value0 = pow_dic[powamp_meta]
for i_p in pow_dic[powamp_meta]:
if i_p < constants_k.POWER_THRESHOLD:
@@ -228,7 +233,7 @@ func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void:
else:
result_dic.fs_7 = false
power_fill(power_dic)
power_fill(power_dic, result_dic)
var result = true
for device in result_dic.values():
@@ -242,3 +247,19 @@ func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void:
else:
$control_result.text = 'Прибор ПРД-%s неисправен' % name_prd
$control_result.add_theme_color_override('font_color', Color.RED)
func find_labels(node1: Node):
if node1 is Label:
if node1.name in ["lbl_rname", "rname"]:
if not node1.has_meta("tooltip_set"):
ctrl_pos += 1
var box_number = ceili(float(ctrl_pos) / 10.0)
var position_number = ctrl_pos % 10
if position_number == 0:
position_number = 10
node1.tooltip_text = "Ящик - %d, Позиция - %d" % [box_number, position_number]
node1.mouse_filter = Control.MOUSE_FILTER_STOP
node1.set_meta("tooltip_set", true)
for child in node1.get_children():
find_labels(child)

View File

@@ -13,10 +13,10 @@ const constants_n = {
'TEMP_THRESHOLD': 70,
'POWER_THRESHOLD': 40,
'RAY_DOU_NUM': 0x3,
'ATT_UM_2': 0x7,
'ATT_UM_3': 0x7,
'POWER_UM': 70,
'TIMER_DELAY': 5.0,
'ATT_UM_2': 0x2,
'ATT_UM_3': 0x3,
'POWER_UM': 100,
'TIMER_DELAY': 10.0,
'STATE_MASHINE_TIMER': 0.3,
}
# Конфигурация параметров для каждого прибора
@@ -28,7 +28,7 @@ const PRIBOR_CONFIG_N := {
}
# Конфигурация частот и ширин для каждого ФС
const FS_PARAMS_N := {
2: {'freq': 900.0, 'width': 100.0},
2: {'freq': 932.0, 'width': 100.0},
3: {'freq': 1157.0, 'width': 100.0}
}
enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 }
@@ -50,8 +50,8 @@ var block_kasseta_y5_prd_config_n: = {
# Основные переменные
var start_litera: int = 2
var ug_work_1: int = 0
var ug_work_2: int = 0
var ug_work_1: int = 2 ## Аттенюация усилителей мощности
var ug_work_2: int = 3 ## Аттенюация усилителей мощности
# Флаги и таймеры
var mashine_timer: Timer = Timer.new()
var prd_n_module: Object
@@ -69,8 +69,7 @@ var control_results_n: Dictionary = {
'fs_3': 2,
}
var test_control_n = preload('res://scripts/pribor-prd.gd')
var ctrl_pos = 0
################################
func on_state_mashine() -> void:
control_prd_n.state_control_machine()
@@ -83,6 +82,7 @@ func _ready() -> void:
initialize_connections()
setup_timer()
set_default_state()
find_labels(self)
func initialize_connections() -> void:
@@ -159,7 +159,7 @@ func on_mode_changed(in_tree: bool) -> void:
mashine_timer.start()
func power_fill(pow_dic: Dictionary) -> void:
func power_fill(pow_dic: Dictionary, fs_result: Dictionary) -> void:
#if not control_prd_n.block_kasseta_y5_config.yau07 or not control_prd_n.block_kasseta_y5_config.ukp1 or not control_prd_n.block_kasseta_y5_config.ukp2:
#return
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
@@ -169,6 +169,8 @@ func power_fill(pow_dic: Dictionary) -> void:
if pow_dic[powamp_meta].size() < 6:
status = STATE_VAL.ERROR
else:
if powamp_meta in ['um_1', 'um_2', 'um_3', 'um_4', 'um_5', 'um_6'] and not fs_result.fs_2: return
if powamp_meta in ['um_7', 'um_8', 'um_9', 'um_10', 'um_11', 'um_12'] and not fs_result.fs_3: return
i_powapm.value0 = pow_dic[powamp_meta]
for i_p in pow_dic[powamp_meta]:
if i_p < constants_n.POWER_THRESHOLD:
@@ -207,14 +209,14 @@ func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void:
$kasseta_FS_ND/ref_A4.state = STATE_VAL.GOOD if result_dic.dkm_2 else STATE_VAL.ERROR
$dou2_A5.state = STATE_VAL.GOOD if result_dic.dou_2 else STATE_VAL.ERROR
else:
result_dic.fs_2 = false
result_dic.fs_2 = 0
if result_dic.fs_3 == 1:
$kasseta_FS_ND/ref_A3.state = STATE_VAL.GOOD if result_dic.dkm_3 else STATE_VAL.ERROR
$dou3_A6.state = STATE_VAL.GOOD if result_dic.dou_3 else STATE_VAL.ERROR
else:
result_dic.fs_3 = false
result_dic.fs_3 = 0
power_fill(power_dic)
power_fill(power_dic, result_dic)
var result = true
for device in result_dic.values():
@@ -228,3 +230,19 @@ func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void:
else:
$control_result.text = 'Прибор ПРД-%s неисправен' % name_prd
$control_result.add_theme_color_override('font_color', Color.RED)
func find_labels(node1: Node):
if node1 is Label:
if node1.name in ["lbl_rname", "rname"]:
if not node1.has_meta("tooltip_set"):
ctrl_pos += 1
var box_number = ceili(float(ctrl_pos) / 10.0)
var position_number = ctrl_pos % 10
if position_number == 0:
position_number = 10
node1.tooltip_text = "Ящик - %d, Позиция - %d" % [box_number, position_number]
node1.mouse_filter = Control.MOUSE_FILTER_STOP
node1.set_meta("tooltip_set", true)
for child in node1.get_children():
find_labels(child)

View File

@@ -13,10 +13,10 @@ const constants_v = {
'TEMP_THRESHOLD': 70,
'POWER_THRESHOLD': 40,
'RAY_DOU_NUM': 0x3,
'ATT_UM_4': 0x7,
'ATT_UM_5': 0x7,
'POWER_UM': 75,
'TIMER_DELAY': 5.0,
'ATT_UM_4': 0x2,
'ATT_UM_5': 0x3,
'POWER_UM': 100,
'TIMER_DELAY': 10.0,
'STATE_MASHINE_TIMER': 0.3,
}
# Конфигурация параметров для каждого прибора
@@ -50,8 +50,8 @@ var block_kasseta_y5_prd_config_v: = {
# Основные переменные
var start_litera: int = 4
var ug_work_1: int = 0
var ug_work_2: int = 0
var ug_work_1: int = 2 ## Аттенюация усилителей мощности
var ug_work_2: int = 3 ## Аттенюация усилителей мощности
# Флаги и таймеры
var mashine_timer: Timer = Timer.new()
var prd_v_module: Object
@@ -69,6 +69,7 @@ var control_results_v: Dictionary = {
'fs_5': 2,
}
var test_control_v = preload('res://scripts/pribor-prd.gd')
var ctrl_pos = 70
func on_state_mashine() -> void:
@@ -82,6 +83,7 @@ func _ready() -> void:
initialize_connections()
setup_timer()
set_default_state()
find_labels(self)
func initialize_connections() -> void:
@@ -159,9 +161,7 @@ func on_mode_changed(in_tree: bool) -> void:
mashine_timer.start()
func power_fill(pow_dic: Dictionary) -> void:
#if not control_prd_v.block_kasseta_y5_config.yau07 or not control_prd_v.block_kasseta_y5_config.ukp1 or not control_prd_v.block_kasseta_y5_config.ukp2:
#return
func power_fill(pow_dic: Dictionary, fs_result: Dictionary) -> void:
var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier')
for i_powapm in power_amplifier:
var powamp_meta: String = i_powapm.get_meta('um')
@@ -169,6 +169,8 @@ func power_fill(pow_dic: Dictionary) -> void:
if pow_dic[powamp_meta].size() < 6:
status = STATE_VAL.ERROR
else:
if powamp_meta in ['um_1', 'um_2', 'um_3', 'um_4', 'um_5', 'um_6'] and not fs_result.fs_4: return
if powamp_meta in ['um_7', 'um_8', 'um_9', 'um_10', 'um_11', 'um_12'] and not fs_result.fs_5: return
i_powapm.value0 = pow_dic[powamp_meta]
for i_p in pow_dic[powamp_meta]:
if i_p < constants_v.POWER_THRESHOLD:
@@ -207,13 +209,13 @@ func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void:
$kasseta_FS_VD/ref_A2.state = STATE_VAL.GOOD if result_dic.dkm_5 else STATE_VAL.ERROR
$dou5_A6.state = STATE_VAL.GOOD if result_dic.dou_5 else STATE_VAL.ERROR
else:
result_dic.fs_5 = false
result_dic.fs_5 = 0
if result_dic.fs_4 == 1:
$kasseta_FS_VD/ref_A6.state = STATE_VAL.GOOD if result_dic.dkm_4 else STATE_VAL.ERROR
$dou4_A5.state = STATE_VAL.GOOD if result_dic.dou_4 else STATE_VAL.ERROR
else:
result_dic.fs_4 = false
power_fill(power_dic)
result_dic.fs_4 = 0
power_fill(power_dic, result_dic)
var result = true
for device in result_dic.values():
@@ -227,3 +229,19 @@ func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void:
else:
$control_result.text = 'Прибор ПРД-%s неисправен' % name_prd
$control_result.add_theme_color_override('font_color', Color.RED)
func find_labels(node1: Node):
if node1 is Label:
if node1.name in ["lbl_rname", "rname"]:
if not node1.has_meta("tooltip_set"):
ctrl_pos += 1
var box_number = ceili(float(ctrl_pos) / 10.0)
var position_number = ctrl_pos % 10
if position_number == 0:
position_number = 10
node1.tooltip_text = "Ящик - %d, Позиция - %d" % [box_number, position_number]
node1.mouse_filter = Control.MOUSE_FILTER_STOP
node1.set_meta("tooltip_set", true)
for child in node1.get_children():
find_labels(child)

View File

@@ -5,18 +5,21 @@ enum STATE_VAL {NONE = 0, GOOD = 1, ERROR = 2}
const DEV_LIST = ['00:1f.6', '07:00.0', '08:00.0', '0b:00.0']
const USB_TRACKERBALL = '13ba:0018'
const REVFF = '(rev ff)'
var ctrl_pos = 100
func _ready() -> void:
if Engine.is_editor_hint():
return
var unit_uf = network.get_unit_instance('уарэп-эмс')
var unit_uf: = network.get_unit_instance('уарэп-эмс')
unit_uf.connect('line_changed', on_line_changed)
on_timer.bind(unit_uf)
control_vk()
on_line_changed(unit_uf)
find_labels(self)
func on_timer(unit_uf: unit.Unit):
func on_timer(unit_name: StringName):
var unit_uf = network.get_unit_instance(unit_name)
status_uf() # отслеживание состояния прибора
if unit_uf.online: # проверка ЯУ, внутреннего коммутатора и ИП-5Б
control_ems(unit_uf.status) # проверка ЭМС ячеек
@@ -73,6 +76,8 @@ func control_vk() -> void:
else:
$ref_uf/ref_bu1/ref_A8_BU.state = STATE_VAL.ERROR
$ref_uf/ref_bu1/ref_A8_BU.state = STATE_VAL.GOOD ## заглушка для зеленения ВК-110
func control_ems(status: Array) -> void:
$ref_uf/ref_kassetav13/ref_A4_KEMS.state = STATE_VAL.GOOD if ((status[0] >> 0) & 1) and ((status[0] >> 3) & 1) else STATE_VAL.ERROR
@@ -98,3 +103,19 @@ func status_uf() -> void:
$lbl_header2.text = 'Прибор не исправен'
$lbl_header2.modulate = Color.RED
$lbl_header2.visible = true
func find_labels(node1: Node):
if node1 is Label:
if node1.name in ["lbl_rname", "rname"]:
if not node1.has_meta("tooltip_set"):
ctrl_pos += 1
var box_number = ceili(float(ctrl_pos) / 10.0)
var position_number = ctrl_pos % 10
if position_number == 0:
position_number = 10
node1.tooltip_text = "Ящик - %d, Позиция - %d" % [box_number, position_number]
node1.mouse_filter = Control.MOUSE_FILTER_STOP
node1.set_meta("tooltip_set", true)
for child in node1.get_children():
find_labels(child)

View File

@@ -155,3 +155,6 @@ horizontal_alignment = 1
vertical_alignment = 1
[node name="timer" type="Timer" parent="."]
autostart = true
[connection signal="timeout" from="timer" to="." method="on_timer" binds= [&"уарэп-эмс"]]

View File

@@ -33,6 +33,7 @@ offset_left = 88.0
offset_top = 319.0
offset_right = 343.0
offset_bottom = 749.0
tooltip_text = "Ящик - 11, Позиция - 3"
script = ExtResource("4_v0lil")
unit_name = "уарэп-спт25-1"
fname = "СПТ-25-230-400-3"
@@ -67,6 +68,7 @@ offset_left = 392.0
offset_top = 320.0
offset_right = 642.0
offset_bottom = 750.0
tooltip_text = "Ящик - 11, Позиция - 2"
script = ExtResource("4_v0lil")
unit_name = "уарэп-спт25-2"
fname = "СПТ-25-230-400-3"

View File

@@ -106,7 +106,7 @@ vertical_alignment = 1
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 6
tooltip_text = "Позиционное обозначение"
tooltip_text = "Ящик - 11, Позиция - 1"
mouse_filter = 0
theme_override_font_sizes/font_size = 22
horizontal_alignment = 2

View File

@@ -3,8 +3,8 @@
extends 'res://scenes/контроль/элемент-я.gd'
func on_line_changed(unit0):
if not unit0.online:
func on_line_changed(unit_instance):
if not unit_instance.online:
disable_all()

View File

@@ -0,0 +1,48 @@
extends Label
# Используем более понятные имена переменных
const STATUS_GOOD := {"text": "Исправно", "color": Color.GREEN, "font_color": Color.BLACK}
const STATUS_BAD := {"text": "Отказ", "color": Color.RED, "font_color": Color.WHITE}
var _is_uf_status_initialized: bool = false
var is_prd_operational: bool = true
var is_uf_operational: bool = false
func _ready() -> void:
tooltip_text = 'Нет связи с приборами комплекса'
for prd_module in prd.prd_dict.values():
prd_module.connect('update_serviceability', Callable(self, 'on_serviceability_changed').bind(prd_module))
var unit_uf: = network.get_unit_instance('уарэп-эмс')
unit_uf.connect('data_received', Callable(self, 'on_uf_status_receive'))
add_theme_color_override("font_color", Color.BLACK)
func on_serviceability_changed(unit_prd_module: Object) -> void:
var check_service: bool = true
for prd_module in prd.prd_dict.values():
if prd_module.unit_yau07.online:
if not unit_prd_module.serviceability:
check_service = false
if check_service != is_prd_operational:
is_prd_operational = check_service
_update_serviceability_display()
func _update_serviceability_display() -> void:
var status := STATUS_GOOD if (is_uf_operational and is_prd_operational) else STATUS_BAD
text = status.text
modulate = status.color
tooltip_text = 'Результаты обобщенного признака работоспособности изделия'
add_theme_color_override("font_color", status.font_color)
func on_uf_status_receive(unit_uf: Object) -> void:
var KEMS_B = ((unit_uf.status[0] >> 0) & 1) and ((unit_uf.status[0] >> 3) & 1)
var EMS_B_1 = ((unit_uf.status[0] >> 1) & 1) and ((unit_uf.status[0] >> 4) & 1)
var EMS_B_2 = ((unit_uf.status[0] >> 2) & 1) and ((unit_uf.status[0] >> 5) & 1)
var IP27B = ((unit_uf.status[2] >> 6) & 1)
var check_service: bool = KEMS_B and EMS_B_1 and EMS_B_2 and IP27B
if not _is_uf_status_initialized or check_service != is_uf_operational:
is_uf_operational = check_service
_update_serviceability_display()
signaller.emit_signal('update_uf_serviceability', check_service)
_is_uf_status_initialized = true

View File

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

View File

@@ -9,21 +9,17 @@ const TAB_TOSIGNAL_NAME = {
5: 'режим_настройки' }
func on_ems2_hide_pressed(state): set_tab_hidden(4, state)
func _on_tab_changed(tab) -> void: signaller.emit_signal(TAB_TOSIGNAL_NAME[tab])
func _on_button_trenazh_toggled(toggled_mode: bool) -> void: signaller.emit_signal('режим_тренаж', toggled_mode)
func _enter_tree() -> void:
network.logger_page = $Журнал
signaller.connect('ems2_hide_pressed', on_ems2_hide_pressed)
ProjectSettings.connect('settings_changed', on_setting_changed)
func on_ems2_hide_pressed(state):
set_tab_hidden(4, state)
func _on_tab_changed(tab) -> void:
if TAB_TOSIGNAL_NAME.has(tab):
signaller.emit_signal(TAB_TOSIGNAL_NAME[tab])
func on_setting_changed():
var ext_cu = ProjectSettings.get_setting('application/config/Внешнее управление', false)
get_parent().get_node('remote_control').visible = ext_cu

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=14 format=3 uid="uid://3slb0i3pvowc"]
[gd_scene load_steps=20 format=3 uid="uid://3slb0i3pvowc"]
[ext_resource type="Script" uid="uid://bvo6tcreqyuex" path="res://scenes/tabs-switch/tab-switch.gd" id="1_fg0vd"]
[ext_resource type="PackedScene" uid="uid://b276iygic5itk" path="res://scenes/работа/работа.tscn" id="2_u7p16"]
@@ -7,6 +7,8 @@
[ext_resource type="PackedScene" uid="uid://dab6loryocc73" path="res://scenes/эмс/эмс.tscn" id="5_u71bh"]
[ext_resource type="PackedScene" uid="uid://bnptm4rlp60dq" path="res://scenes/настройки/настройки.tscn" id="6_i8iv3"]
[ext_resource type="PackedScene" uid="uid://musb21x2u0xs" path="res://scenes/эмс2/эмс2.tscn" id="6_rsg03"]
[ext_resource type="Script" uid="uid://b5ykwyk5vpi6" path="res://scenes/tabs-switch/lbl_ready.gd" id="8_tidwt"]
[ext_resource type="Script" uid="uid://roajn6c6wvc1" path="res://scenes/tabs-switch/тренаж_режим.gd" id="9_41d34"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_tidwt"]
@@ -20,6 +22,17 @@
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_o1r22"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_nmdfd"]
bg_color = Color(0.061, 100, 0.051, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_cw2ss"]
bg_color = Color(0.473976, 0.473976, 0.473976, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_41d34"]
bg_color = Color(0.39, 100, 0.327, 1)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_imu1q"]
[node name="panel" type="Panel"]
offset_right = 1600.0
offset_bottom = 1200.0
@@ -56,7 +69,7 @@ visible = false
layout_mode = 2
metadata/_tab_index = 3
[node name="ЭМС2" parent="tab_switch" instance=ExtResource("6_rsg03")]
[node name="ЭМС ТГ" parent="tab_switch" instance=ExtResource("6_rsg03")]
visible = false
layout_mode = 2
metadata/_tab_index = 4
@@ -73,12 +86,13 @@ offset_right = 1600.0
offset_bottom = 27.0
tooltip_text = "Готовность аппаратуры к работе"
mouse_filter = 0
theme_override_colors/font_color = Color(0, 0, 0, 1)
theme_override_font_sizes/font_size = 14
theme_override_styles/normal = SubResource("StyleBoxFlat_o1r22")
text = "Исправно"
text = "Нет связи"
horizontal_alignment = 1
vertical_alignment = 1
script = ExtResource("8_tidwt")
metadata/_edit_lock_ = true
[node name="remote_control" type="Label" parent="."]
visible = false
@@ -95,4 +109,23 @@ text = "Внешнее управление"
horizontal_alignment = 1
vertical_alignment = 1
[node name="тренаж_режим" type="Button" parent="."]
layout_mode = 0
offset_left = 1404.0
offset_right = 1501.0
offset_bottom = 27.0
tooltip_text = "Задействовать режим Тренаж"
focus_mode = 0
theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1)
theme_override_colors/font_color = Color(0, 0, 0, 1)
theme_override_colors/font_pressed_color = Color(0, 0, 0, 1)
theme_override_styles/hover_pressed = SubResource("StyleBoxFlat_nmdfd")
theme_override_styles/hover = SubResource("StyleBoxFlat_cw2ss")
theme_override_styles/pressed = SubResource("StyleBoxFlat_41d34")
theme_override_styles/normal = SubResource("StyleBoxFlat_imu1q")
toggle_mode = true
text = "Тренаж"
script = ExtResource("9_41d34")
[connection signal="tab_changed" from="tab_switch" to="tab_switch" method="_on_tab_changed"]
[connection signal="toggled" from="тренаж_режим" to="tab_switch" method="_on_button_trenaj_toggled"]

View File

@@ -0,0 +1,11 @@
extends Button
func _ready():
connect("toggled", Callable(self, "_on_button_toggled"))
func _on_button_toggled(mode: bool):
if mode:
tooltip_text = "Режим \"Тренаж\" задействован\nТекущее состояние: включено"
else:
tooltip_text = "Задейстовать режим \"Тренаж\"\nТекущее состояние: отключено"

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 122 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

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

View File

@@ -23,6 +23,8 @@ const TILE_REQUEST_NAME: = 'tile_request_%d'
@export_range(0, 20, 1) var min_zoom_level: int = 0
@export_range(0, 20, 1) var max_zoom_level_server: int = 20
@export_color_no_alpha() var back_color: = Color.BLACK
@export var show_ship_radius: bool = true
@export var ship_radius_km: float = 8.0
@onready var scale_label: String
@onready var coordinates_label: String
@onready var threat_mark: PackedScene = load("res://scenes/tilemap/threat.tscn")
@@ -34,6 +36,8 @@ var is_centered: = false
var is_out_border1: = true
var is_out_border2: = true
var threat_markers := {}
var zoom_timer: Timer
var zoom_action: String
@export var animation_time: float = 0.1:
set(val):
@@ -86,7 +90,6 @@ var image: = Image.new()
var image_load_proc: Callable
var now: = 0
var visible_marks_count: = 0
var map_server_available: = false
var border1: ImageTexture
var border2: ImageTexture
@@ -129,6 +132,12 @@ func _ready() -> void:
img.set_pixel(0, 1, Color.CORAL)
border2 = ImageTexture.create_from_image(img)
zoom_timer = Timer.new()
add_child(zoom_timer)
zoom_timer.one_shot = false
zoom_timer.wait_time = 0.1
zoom_timer.timeout.connect(_on_zoom_timeout)
_xyz.z = min_zoom_level
image_type = 'png'
$canvas.connect('mouse_entered', func(): _rollover = true)
@@ -152,7 +161,7 @@ func on_data_received(coords: Dictionary) -> void:
if not is_centered:
return
if coords.has_all(['latitude', 'longitude']):
set_coordinates(coords['longitude'], coords['latitude'])
set_coordinates(coords['longitude'], coords['latitude'], coords['k'])
func _on_resize() -> void:
@@ -252,6 +261,7 @@ func multiply_zoom(multiplier: float, pivot: Vector2) -> void:
var p2: = screen_to_world(_xyz, pivot)
_xyz.x -= p2.x - p1.x
_xyz.y -= p2.y - p1.y
update_scale_label()
func increment_zoom(increment: float, pivot: Vector2) -> void:
@@ -260,6 +270,7 @@ func increment_zoom(increment: float, pivot: Vector2) -> void:
var p2: = screen_to_world(_xyz, pivot)
_xyz.x -= p2.x - p1.x
_xyz.y -= p2.y - p1.y
update_scale_label()
func set_zoom(zoom: float, pivot: Vector2) -> void:
@@ -268,6 +279,7 @@ func set_zoom(zoom: float, pivot: Vector2) -> void:
var p2: = screen_to_world(_xyz, pivot)
_xyz.x -= p2.x - p1.x
_xyz.y -= p2.y - p1.y
update_scale_label()
func _draw() -> void:
@@ -302,6 +314,9 @@ func _draw() -> void:
if is_out_border2 and _dragging:
draw_texture_rect(border2, Rect2(p1, p2), false, Color.WHITE, false)
if should_draw_ship_radius():
draw_ship_radius()
func _clean_all() -> void:
_queue.clear()
@@ -366,21 +381,21 @@ func _process(delta) -> void:
func _response(result, code, _headers: Array, body: PackedByteArray, req, tile: Tile) -> void:
var unit_instance = network.get_unit_instance('уарэп-карта')
_req_count -= 1
remove_child(req)
req.queue_free()
if result != HTTPRequest.RESULT_SUCCESS:
if map_server_available:
map_server_available = false
emit_signal('map_server_offline')
if unit_instance.online:
unit_instance.online = false
unit_instance.emit_signal('line_changed', unit_instance)
_queue[tile.i] = tile
return
if not map_server_available:
map_server_available = true
emit_signal('map_server_online')
if not unit_instance.online:
unit_instance.online = true
unit_instance.emit_signal('line_changed', unit_instance)
if code == 404:
push_error('на сервере нет \"%s\"' % tile.url)
@@ -390,6 +405,11 @@ func _response(result, code, _headers: Array, body: PackedByteArray, req, tile:
push_error('не удалось получить изображение (неверный формат?) из \"%s\"' % tile.url)
return
unit_instance.rx_tick = Time.get_ticks_msec()
if not unit_instance.online:
unit_instance.online = true
unit_instance.emit_signal('line_changed', unit_instance)
tile.texture = ImageTexture.create_from_image(image)
_cache[tile.i] = tile
@@ -677,7 +697,7 @@ func clear() -> void:
queue_redraw()
func set_coordinates(lon: float, lat: float) -> void:
func set_coordinates(lon: float, lat: float, course: float) -> void:
var anim: Animation = $player.get_animation('goto')
var new_pos: Vector2 = lonlat_to_world(lon, lat)
anim.track_insert_key(0, 0, _xyz.x)
@@ -690,7 +710,8 @@ func set_coordinates(lon: float, lat: float) -> void:
ship_instance = ship_mark.instantiate()
add_mark_from_lon_lat(ship_id, lon, lat, ship_instance, 0.0)
else:
_marks[ship_id].position = lonlat_to_world(lon, lat)
ship_instance.position = lonlat_to_world(lon, lat)
ship_instance.rotation_degrees = course - 90
func blend_mask(val: bool) -> void:
@@ -699,7 +720,7 @@ func blend_mask(val: bool) -> void:
func update_coordinates_label(lon: float, lat: float) -> void:
coordinates_label = 'Координаты:\nNS:%f\nEW: %f' % [lat, lon]
coordinates_label = 'Координаты:\nNS:%f\nEW:%f' % [lat, lon]
signaller.emit_signal('update_coordinates_map', coordinates_label)
@@ -731,3 +752,80 @@ func _on_threat_lost(th) -> void:
var target = get_parent().get_node(str(th.id))
if target:
target.queue_free()
func zoom_in() -> void:
if _xyz.z >= max_zoom_level:
return
var center: Vector2 = $canvas.size / 2.0
increment_zoom(zoom_step, center)
queue_redraw()
func zoom_out() -> void:
if _xyz.z <= min_zoom_level:
return
var center: Vector2 = $canvas.size / 2.0
increment_zoom(-zoom_step, center)
queue_redraw()
func _on_zoom_plus_button_down() -> void:
zoom_action = "in"
perform_zoom()
zoom_timer.start(0.3)
func _on_zoom_minus_button_down() -> void:
zoom_action = "out"
perform_zoom()
zoom_timer.start(0.3)
func _on_zoom_button_up() -> void:
zoom_action = ""
zoom_timer.stop()
func _on_zoom_timeout():
perform_zoom()
zoom_timer.wait_time = 0.1
func perform_zoom():
if zoom_action != "":
if zoom_action == "in":
zoom_in()
else:
zoom_out()
update_scale_label()
# Вычисление для радиуса в мировых координатах
func get_ship_radius_world() -> float:
if not _marks.has(ship_id):
return 0.0
var ship_world_pos = _marks[ship_id].position
var ship_lonlat = world_to_lonlat(ship_world_pos.x, ship_world_pos.y)
var earth_radius_km = 6371.0
var distance_deg = (ship_radius_km / earth_radius_km) * (180.0 / PI) / cos(deg_to_rad(ship_lonlat.y))
var east_lon = ship_lonlat.x + distance_deg
var east_point_world = lonlat_to_world(east_lon, ship_lonlat.y)
return abs(east_point_world.x - ship_world_pos.x)
func should_draw_ship_radius() -> bool:
if not show_ship_radius or not _marks.has(ship_id):
return false
return _xyz.z >= 11
func draw_ship_radius() -> void:
var ship_world_pos = _marks[ship_id].position
var ship_screen_pos = world_to_screen(ship_world_pos)
var radius_world = get_ship_radius_world()
var radius_point_world = Vector2(ship_world_pos.x + radius_world, ship_world_pos.y)
var radius_point_screen = world_to_screen(radius_point_world)
var radius_screen = ship_screen_pos.distance_to(radius_point_screen)
#draw_arc(ship_screen_pos, radius_screen, 0, TAU, 64, Color.ORANGE, 2.0) # отрисовка контура
draw_circle(ship_screen_pos, radius_screen, Color.ORANGE_RED * Color(1, 1, 1, 0.1)) # отрисовка заливки

View File

@@ -7,6 +7,7 @@ func on_threats_changed(th: Object, msg: String): log.message(Logger.INFO, '%s:
func on_parse_error(unit_inst, msg: String): log.message(Logger.ERROR, '%s: %s' % [unit_inst.name, msg])
func on_interfer_off(ecm, msg: String): log.message(Logger.INFO, '%s: %s' % [msg, ecm.to_string()])
func on_set_program_mode(msg: String): log.message(Logger.INFO, msg)
func on_mode_trenazh(val: bool): log.message(Logger.INFO, 'Режим \"Тренаж\" %s' % ['отменён', 'задейсвован'][int(val)])
func on_interfer_new(ecm, msg: String):
if ecm.krp != interfer.INTERFER_OFF:
@@ -33,6 +34,7 @@ func _ready() -> void:
signaller.conn(signaller.режим_эмс, Callable(log, 'info').bind('Программа в режиме \"ЭМС\"'))
signaller.conn(signaller.режимурнал, Callable(log, 'info').bind('Программа в режиме \"Журнал\"'))
signaller.conn(signaller.режимонтроль, Callable(log, 'info').bind('Программа в режиме \"Контроль\"'))
signaller.conn(signaller.режимренаж, Callable(self, 'on_mode_trenazh'))
func _on_clear_button_down() -> void:

View File

@@ -36,6 +36,7 @@ colors = {
8: Color(0.91, 0, 0, 1),
16: Color(0.868077, 0.247988, 0.62812, 1)
}
max_lines_count = 256
[node name="btn_save" type="Button" parent="."]
layout_mode = 0
@@ -112,6 +113,12 @@ button_pressed = true
text = "Контроль"
metadata/filter = "Контроль"
[node name="CheckBox_SCROLL" type="CheckBox" parent="filtrs"]
layout_mode = 2
button_pressed = true
text = "Прокручивать до конца"
metadata/filter = "Контроль"
[connection signal="button_down" from="btn_save" to="." method="_on_btn_save_button_down"]
[connection signal="button_down" from="btn_clear" to="." method="_on_clear_button_down" flags=3]
[connection signal="canceled" from="dlg_file" to="." method="_on_dlg_file_confirmed"]
@@ -124,3 +131,4 @@ metadata/filter = "Контроль"
[connection signal="pressed" from="filtrs/CheckBox_FATAL" to="." method="_on_check_box_pressed"]
[connection signal="pressed" from="filtrs/CheckBox_THREAT" to="." method="_on_check_box_pressed"]
[connection signal="pressed" from="filtrs/CheckBox_CONTROL" to="." method="_on_check_box_pressed"]
[connection signal="toggled" from="filtrs/CheckBox_SCROLL" to="content" method="_on_check_box_scroll_toggled"]

View File

@@ -19,32 +19,16 @@ const RESULT_STRINGS = {
RESULT_TIMEOUT: 'Время истекло' }
@export var projsettings_path_left: String = ''
@export var projsettings_path_right: String = ''
var i_bort: int = 0
var addr_left: String
var addr_right: String
func on_settings_changed():
addr_left = ProjectSettings.get_setting(projsettings_path_left)
addr_right = ProjectSettings.get_setting(projsettings_path_right)
@export var request_url: String = ''
func get_result_string(result: Result):
return RESULT_STRINGS[result] if RESULT_STRINGS.has(result) else '<неизвестный код результата HTTPRequest - %d>' % result
func _ready():
ProjectSettings.connect('settings_changed', on_settings_changed)
on_settings_changed()
func _on_request_timer():
var addr = [addr_left, addr_right][i_bort]
var rc = request(addr)
if HTTPClient.Status.STATUS_DISCONNECTED != get_http_client_status():
return
var rc: = request(request_url)
if rc != Error.OK:
var s: String = '%s: %s' % [error_string(rc), addr]
log.error('ошибка: %s' % s)
i_bort = (i_bort + 1) % 2
push_error('%s: \"%s\"' % [error_string(rc), request_url])

View File

@@ -36,7 +36,6 @@ signal pressed(control: PanelContainer)
return
$margin/vbox/grid1/level7.value = v
$margin/vbox/grid1/level7.tint_progress = Color.RED if v > 70 else Color.WHITE
@export var min_value0: float:
@@ -141,16 +140,16 @@ signal pressed(control: PanelContainer)
func _on_button_pressed(): emit_signal('pressed', self)
func _enter_tree() -> void: call_deferred('_enter_tree_defered')
func set_value0(value: Array): value0.assign(value)
func _enter_tree() -> void: call_deferred('_enter_tree_defered')
func _ready():
var items: Array= get_level_nodes()
var items: Array = get_level_nodes()
for item in items:
item.connect('value_changed', on_level_changed.bind(item, value1_info))
item.connect('value_changed', on_level_changed.bind(item, value0_info))
on_level_changed(item.value, item, value0_info)
var level7 = $margin/vbox/grid1/level7
var level7: = $margin/vbox/grid1/level7
level7.connect('value_changed', on_level_changed.bind(level7, value1_info))
on_level_changed(level7.value, level7, value1_info)
@@ -225,11 +224,10 @@ func get_name_nodes() -> Array:
func set_value0_animated(target_node, target_value: float) -> void:
var tween = create_tween()
var tween: Tween = create_tween()
tween.set_ease(Tween.EASE_OUT)
tween.set_trans(Tween.TRANS_QUINT)
tween.tween_property(target_node, \"value\", target_value, animation_duration)
tween.tween_property(target_node, 'value', target_value, animation_duration)
"
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_rceim"]

View File

@@ -1,6 +1,6 @@
@tool
extends Node
extends TextureButton
@export var state_colors: Array

View File

@@ -25,63 +25,99 @@ script/source = "extends Panel
#TODO: рефактор: заменить подчёркивание на тире
const PRIBORS_RES = \\
{
'pribor_prd_k_1': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 1'],
'pribor_prd_k_2': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 2'],
'pribor_prd_k_3': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 3'],
'pribor_prd_k_4': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 4'],
'pribor_prd_n_1': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 1'],
'pribor_prd_n_2': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 2'],
'pribor_prd_n_3': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 3'],
'pribor_prd_n_4': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 4'],
'pribor_prd_v_1': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 1'],
'pribor_prd_v_2': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 2'],
'pribor_prd_v_3': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 3'],
'pribor_prd_v_4': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 4'],
'pribor_rtr': ['res://scenes/pribor-afsp/pribor-bpo.tscn', 'Контроль исправности прибора РТР'],
'pribor_afsp_1': ['res://scenes/pribor-afsp/pribor-afsp-1.tscn', 'Контроль исправности прибора АФСП 1'],
'pribor_afsp_2': ['res://scenes/pribor-afsp/pribor-afsp-2.tscn', 'Контроль исправности прибора АФСП 2'],
'pribor_uf': ['res://scenes/pribor-uf/pribor-uf.tscn', 'Контроль исправности прибора УФ'],
'pribor_uyep': ['res://scenes/pribor-uyep/pribor-uyep.tscn', 'Контроль исправности устройства У-ЭП'],
'pribor_prd_k_1': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 1'],
'pribor_prd_k_2': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 2'],
'pribor_prd_k_3': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 3'],
'pribor_prd_k_4': ['res://scenes/pribor-prd-k/pribor-prd-k.tscn', 'Контроль исправности прибора ПРД-К 4'],
'pribor_prd_n_1': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 1'],
'pribor_prd_n_2': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 2'],
'pribor_prd_n_3': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 3'],
'pribor_prd_n_4': ['res://scenes/pribor-prd-n/pribor-prd-n.tscn', 'Контроль исправности прибора ПРД-Н 4'],
'pribor_prd_v_1': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 1'],
'pribor_prd_v_2': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 2'],
'pribor_prd_v_3': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 3'],
'pribor_prd_v_4': ['res://scenes/pribor-prd-v/pribor-prd-v.tscn', 'Контроль исправности прибора ПРД-В 4'],
'pribor_rtr': ['res://scenes/pribor-afsp/pribor-bpo.tscn', 'Контроль исправности прибора РТР'],
'pribor_afsp_1': ['res://scenes/pribor-afsp/pribor-afsp-1.tscn', 'Контроль исправности прибора АФСП 1'],
'pribor_afsp_2': ['res://scenes/pribor-afsp/pribor-afsp-2.tscn', 'Контроль исправности прибора АФСП 2'],
'pribor_uf': ['res://scenes/pribor-uf/pribor-uf.tscn', 'Контроль исправности прибора УФ'],
'pribor_uyep': ['res://scenes/pribor-uyep/pribor-uyep.tscn', 'Контроль исправности устройства У-ЭП'],
}
func on_line_changed(u, conn_node, _pribor_meta): conn_node.set_val(u.online)
func on_serv_changed(u, pribor_node, _pribor_meta): pribor_node.state = int(u.serviceability)
func on_mode_changed():
clean_pribor_items()
reset_pribor_buttons()
func reset_pribor_buttons():
var pribor_buttons: = get_tree().get_nodes_in_group('pribor_buttons')
for node in pribor_buttons:
node.button_pressed = false
func _ready():
var group = ButtonGroup.new()
# Кнопки приборов, по нажатию на которые отображаеся мнемосхема
for k in PRIBORS_RES:
var pribor_node = get_node(k)
var pribor_node: Node = get_node(k)
var pribor_path = PRIBORS_RES[k][0]
var header_text = PRIBORS_RES[k][1]
pribor_node.set_button_group(group)
pribor_node.connect('button_down', Callable(self, 'on_pribor_press').bind(pribor_path, header_text, pribor_node))
var conn_node = pribor_node.get_node('connect_pribor')
var pribor_meta = pribor_node.get_meta('unit_name', [])
var unit_names = pribor_node.get_meta('unit_name', [])
var pribor_proc = pribor_node.get_meta('online_proc', '')
if pribor_proc == '':
continue
if pribor_meta.size():
for i in pribor_meta.size():
var unit_pribor = network.get_unit_instance(pribor_meta[i])
unit_pribor.connect('line_changed', Callable(self, pribor_proc).bind(conn_node, pribor_meta))
if not unit_names.size():
continue
for i in unit_names.size():
var unit_instance: = network.get_unit_instance(unit_names[i])
unit_instance.connect('line_changed', Callable(self, pribor_proc).bind(conn_node, unit_names))
for item in unit_names:
if prd.prd_dict.has(item):
var prd_module = prd.prd_dict[item]
prd_module.connect('update_serviceability', Callable(self, 'on_serviceability_changed').bind(prd_module, pribor_node))
if item == 'уарэп-эмс':
signaller.connect('update_uf_serviceability', Callable(self, 'on_update_uf_serviceability').bind(pribor_node))
# Пиктограммы приборов, которые отображают состояние подключения только
for pribor_node in get_tree().get_nodes_in_group('pribor_pics'):
var unit_name = pribor_node.get_meta('unit_name')
var unit_instance: = network.get_unit_instance(unit_name)
var conn_node: = pribor_node.get_node('connect_pribor')
unit_instance.connect('line_changed', on_line_changed.bind(conn_node, unit_name))
signaller.conn(signaller.режим_работа, on_mode_changed)
signaller.conn(signaller.режим_журнал, on_mode_changed)
signaller.conn(signaller.режим_настройки, on_mode_changed)
signaller.conn(signaller.режим_эмс, on_mode_changed)
func online_change_arr(_u, conn_node, pribor_meta):
var state_online = true
for i in pribor_meta.size():
var unit_pribor = network.get_unit_instance(pribor_meta[i])
if not unit_pribor.online:
state_online = false
var state_online: = false
for meta in pribor_meta:
var unit_pribor = network.get_unit_instance(meta)
if unit_pribor.online:
state_online = true
break
conn_node.set_val(state_online)
func on_pribor_press(pribor_path, header_text, pribor_node):
func clean_pribor_items():
var items = get_tree().get_nodes_in_group('pribor_items')
for item in items:
remove_child(item)
item.queue_free()
func on_pribor_press(pribor_path, header_text, pribor_node):
clean_pribor_items()
var pribor_obj = load(pribor_path)
if not pribor_obj:
push_error('не загружено: \\\"%s\\\" (%s)' % [pribor_path, header_text])
@@ -97,6 +133,18 @@ func on_pribor_press(pribor_path, header_text, pribor_node):
pribor.set_meta('unit_name', unit_name)
pribor.add_to_group('pribor_items')
add_child(pribor)
func on_serviceability_changed(prd_module: Object, prd_pribor:Node)-> void:
if not prd_module.unit_yau07.online:
prd_pribor.state = 0
return
prd_pribor.state = 1 if prd_module.serviceability else 2
func on_update_uf_serviceability(uf_serviceaability: bool, uf_pribor: Node)-> void:
uf_pribor.state = 1 if uf_serviceaability else 2
"
[sub_resource type="SpriteFrames" id="SpriteFrames_foasq"]
@@ -122,7 +170,7 @@ grow_vertical = 2
script = SubResource("GDScript_iqgf5")
metadata/_edit_lock_ = true
[node name="capsrpb" type="TextureRect" parent="."]
[node name="capsrpb" type="TextureRect" parent="." groups=["pribor_pics"]]
editor_description = "Кнопка для отображения внешних соединений."
self_modulate = Color(0.788235, 0.788235, 0.788235, 1)
layout_mode = 0
@@ -136,6 +184,7 @@ size_flags_vertical = 15
texture = ExtResource("2_oysma")
script = ExtResource("2_8r80x")
unit_name = &"уарэп-капсрпб"
metadata/unit_name = &"уарэп-капсрпб"
[node name="label" type="Label" parent="capsrpb"]
layout_mode = 0
@@ -155,7 +204,7 @@ scale = Vector2(2.6, 2.6)
sprite_frames = SubResource("SpriteFrames_foasq")
script = ExtResource("11_u7tym")
[node name="5p28" type="TextureRect" parent="."]
[node name="5p28" type="TextureRect" parent="." groups=["pribor_pics"]]
editor_description = "Кнопка для отображения внешних соединений."
self_modulate = Color(0.788235, 0.788235, 0.788235, 1)
layout_mode = 0
@@ -169,6 +218,7 @@ size_flags_vertical = 15
texture = ExtResource("2_oysma")
script = ExtResource("2_8r80x")
unit_name = &"уарэп-5п28"
metadata/unit_name = &"уарэп-5п28"
[node name="label" type="Label" parent="5p28"]
layout_mode = 0
@@ -189,7 +239,7 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="akng" type="TextureRect" parent="."]
[node name="akng" type="TextureRect" parent="." groups=["pribor_pics"]]
editor_description = "Кнопка для отображения внешних соединений."
self_modulate = Color(0.788235, 0.788235, 0.788235, 1)
layout_mode = 0
@@ -203,6 +253,7 @@ size_flags_vertical = 15
texture = ExtResource("2_oysma")
script = ExtResource("2_8r80x")
unit_name = &"навигация"
metadata/unit_name = &"навигация"
[node name="label" type="Label" parent="akng"]
layout_mode = 0
@@ -223,7 +274,7 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="maps" type="TextureRect" parent="."]
[node name="maps" type="TextureRect" parent="." groups=["pribor_pics"]]
editor_description = "Кнопка для отображения внешних соединений."
self_modulate = Color(0.788235, 0.788235, 0.788235, 1)
layout_mode = 0
@@ -236,7 +287,8 @@ size_flags_horizontal = 15
size_flags_vertical = 15
texture = ExtResource("2_oysma")
script = ExtResource("2_8r80x")
unit_name = &"навигация"
unit_name = &"уарэп-карта"
metadata/unit_name = &"уарэп-карта"
[node name="label" type="Label" parent="maps"]
layout_mode = 0
@@ -257,7 +309,7 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="trassa" type="TextureRect" parent="."]
[node name="trassa" type="TextureRect" parent="." groups=["pribor_pics"]]
editor_description = "Кнопка для отображения внешних соединений."
self_modulate = Color(0.788235, 0.788235, 0.788235, 1)
layout_mode = 0
@@ -271,6 +323,7 @@ size_flags_vertical = 15
texture = ExtResource("2_oysma")
script = ExtResource("2_8r80x")
unit_name = &"уарэп-трасса"
metadata/unit_name = &"уарэп-трасса"
[node name="label" type="Label" parent="trassa"]
layout_mode = 0
@@ -291,6 +344,58 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="pribor_prd_n_1" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
offset_left = 1048.0
offset_top = 193.0
offset_right = 1125.0
offset_bottom = 309.0
size_flags_horizontal = 15
size_flags_vertical = 15
toggle_mode = true
action_mode = 0
texture_normal = ExtResource("6_i1yfn")
stretch_mode = 4
flip_h = true
script = ExtResource("3_4pt7j")
state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)]
metadata/online_proc = "on_line_changed"
metadata/unit_name = ["уарэп-яу07-1н"]
[node name="label" type="Label" parent="pribor_prd_n_1"]
layout_mode = 0
offset_left = 8.0
offset_top = -38.0
offset_right = 60.0
offset_bottom = -19.0
text = "ПРД Н1"
horizontal_alignment = 1
vertical_alignment = 1
[node name="frame" type="NinePatchRect" parent="pribor_prd_n_1"]
visible = false
self_modulate = Color(0.890196, 0.486275, 0.196078, 1)
layout_mode = 0
offset_left = -10.0
offset_top = -24.0
offset_right = 95.0
offset_bottom = 126.0
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="pribor_prd_n_1"]
light_mask = 3
position = Vector2(35, -10)
scale = Vector2(0.625, 0.625)
sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="pribor_uf" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
@@ -305,7 +410,8 @@ action_mode = 0
texture_normal = ExtResource("2_0nvm1")
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)]
state_colors = [Color(1, 1, 1, 1), Color(0, 1, 0, 1), Color(1, 0, 0, 1)]
state = 1
metadata/unit_name = ["уарэп-эмс"]
metadata/online_proc = "on_line_changed"
@@ -321,6 +427,7 @@ vertical_alignment = 1
[node name="frame" type="NinePatchRect" parent="pribor_uf"]
visible = false
self_modulate = Color(0.890196, 0.486275, 0.196078, 1)
layout_mode = 0
offset_left = -14.0
offset_top = -30.0
@@ -356,7 +463,9 @@ action_mode = 0
texture_normal = ExtResource("3_hhadv")
stretch_mode = 0
script = ExtResource("3_4pt7j")
state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)]
state_colors = [Color(1, 1, 1, 1), Color(0, 1, 0, 1), Color(1, 0, 0, 1)]
metadata/unit_name = [&"уарэп-бпо-1", &"уарэп-бпо-2"]
metadata/online_proc = "online_change_arr"
[node name="label" type="Label" parent="pribor_rtr"]
layout_mode = 0
@@ -417,7 +526,9 @@ action_mode = 0
texture_normal = ExtResource("9_iqgf5")
stretch_mode = 0
script = ExtResource("3_4pt7j")
state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)]
state_colors = [Color(1, 1, 1, 1), Color(0, 1, 0, 1), Color(1, 0, 0, 1)]
metadata/unit_name = [&"уарэп-афсп-левый"]
metadata/online_proc = "on_line_changed"
[node name="label" type="Label" parent="pribor_afsp_1"]
layout_mode = 0
@@ -482,7 +593,9 @@ texture_normal = ExtResource("9_iqgf5")
stretch_mode = 0
flip_h = true
script = ExtResource("3_4pt7j")
state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)]
state_colors = [Color(1, 1, 1, 1), Color(0, 1, 0, 1), Color(1, 0, 0, 1)]
metadata/unit_name = [&"уарэп-афсп-правый"]
metadata/online_proc = "on_line_changed"
[node name="label" type="Label" parent="pribor_afsp_2"]
layout_mode = 0
@@ -544,7 +657,7 @@ action_mode = 0
texture_normal = ExtResource("5_kvnex")
stretch_mode = 0
script = ExtResource("3_4pt7j")
state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)]
state_colors = [Color(1, 1, 1, 1), Color(0, 1, 0, 1), Color(1, 0, 0, 1)]
metadata/unit_name = ["уарэп-щ3", "уарэп-спт25-1", "уарэп-спт25-2"]
metadata/online_proc = "online_change_arr"
@@ -596,7 +709,7 @@ texture_normal = ExtResource("6_i1yfn")
stretch_mode = 4
flip_h = true
script = ExtResource("3_4pt7j")
state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)]
state_colors = [Color(1, 1, 1, 1), Color(0, 1, 0, 1), Color(1, 0, 0, 1)]
metadata/unit_name = ["уарэп-яу07-2в"]
metadata/online_proc = "on_line_changed"
@@ -648,7 +761,7 @@ texture_normal = ExtResource("6_i1yfn")
stretch_mode = 4
flip_h = true
script = ExtResource("3_4pt7j")
state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)]
state_colors = [Color(1, 1, 1, 1), Color(0, 1, 0, 1), Color(1, 0, 0, 1)]
metadata/unit_name = ["уарэп-яу07-2н"]
metadata/online_proc = "on_line_changed"
@@ -702,7 +815,7 @@ texture_normal = ExtResource("6_i1yfn")
stretch_mode = 4
flip_h = true
script = ExtResource("3_4pt7j")
state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)]
state_colors = [Color(1, 1, 1, 1), Color(0, 1, 0, 1), Color(1, 0, 0, 1)]
metadata/unit_name = ["уарэп-яу07-2к"]
metadata/online_proc = "on_line_changed"
@@ -754,7 +867,7 @@ texture_normal = ExtResource("6_i1yfn")
stretch_mode = 4
flip_h = true
script = ExtResource("3_4pt7j")
state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)]
state_colors = [Color(1, 1, 1, 1), Color(0, 1, 0, 1), Color(1, 0, 0, 1)]
metadata/unit_name = ["уарэп-яу07-3в"]
metadata/online_proc = "on_line_changed"
@@ -806,7 +919,7 @@ texture_normal = ExtResource("6_i1yfn")
stretch_mode = 4
flip_h = true
script = ExtResource("3_4pt7j")
state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)]
state_colors = [Color(1, 1, 1, 1), Color(0, 1, 0, 1), Color(1, 0, 0, 1)]
metadata/unit_name = ["уарэп-яу07-3н"]
metadata/online_proc = "on_line_changed"
@@ -858,7 +971,7 @@ texture_normal = ExtResource("6_i1yfn")
stretch_mode = 4
flip_h = true
script = ExtResource("3_4pt7j")
state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)]
state_colors = [Color(1, 1, 1, 1), Color(0, 1, 0, 1), Color(1, 0, 0, 1)]
metadata/unit_name = ["уарэп-яу07-3к"]
metadata/online_proc = "on_line_changed"
@@ -947,58 +1060,6 @@ sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="pribor_prd_n_1" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
offset_left = 1048.0
offset_top = 193.0
offset_right = 1125.0
offset_bottom = 309.0
size_flags_horizontal = 15
size_flags_vertical = 15
toggle_mode = true
action_mode = 0
texture_normal = ExtResource("6_i1yfn")
stretch_mode = 4
flip_h = true
script = ExtResource("3_4pt7j")
state_colors = [Color(1, 1, 1, 1), Color(0, 0.87, 0, 1), Color(0.65, 0.0715, 0.0715, 1)]
metadata/online_proc = "on_line_changed"
metadata/unit_name = ["уарэп-яу07-1н"]
[node name="label" type="Label" parent="pribor_prd_n_1"]
layout_mode = 0
offset_left = 8.0
offset_top = -38.0
offset_right = 60.0
offset_bottom = -19.0
text = "ПРД Н1"
horizontal_alignment = 1
vertical_alignment = 1
[node name="frame" type="NinePatchRect" parent="pribor_prd_n_1"]
visible = false
self_modulate = Color(0.890196, 0.486275, 0.196078, 1)
layout_mode = 0
offset_left = -10.0
offset_top = -24.0
offset_right = 95.0
offset_bottom = 126.0
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="pribor_prd_n_1"]
light_mask = 3
position = Vector2(35, -10)
scale = Vector2(0.625, 0.625)
sprite_frames = SubResource("SpriteFrames_foasq")
frame_progress = 0.72355
script = ExtResource("11_u7tym")
[node name="pribor_prd_k_1" type="TextureButton" parent="." groups=["pribor_buttons"]]
editor_description = "Кнопка для выбора прибора."
layout_mode = 0
@@ -1325,6 +1386,7 @@ points = PackedVector2Array(-8, 0, 608, 0)
width = 2.0
default_color = Color(1, 1, 1, 0.352941)
[connection signal="toggled" from="pribor_prd_n_1" to="pribor_prd_n_1" method="_on_toggled"]
[connection signal="toggled" from="pribor_uf" to="pribor_uf" method="_on_toggled"]
[connection signal="toggled" from="pribor_rtr" to="pribor_rtr" method="_on_toggled"]
[connection signal="toggled" from="pribor_afsp_1" to="pribor_afsp_1" method="_on_toggled"]
@@ -1337,7 +1399,6 @@ default_color = Color(1, 1, 1, 0.352941)
[connection signal="toggled" from="pribor_prd_n_3" to="pribor_prd_n_3" method="_on_toggled"]
[connection signal="toggled" from="pribor_prd_k_3" to="pribor_prd_k_3" method="_on_toggled"]
[connection signal="toggled" from="pribor_prd_v_1" to="pribor_prd_v_1" method="_on_toggled"]
[connection signal="toggled" from="pribor_prd_n_1" to="pribor_prd_n_1" method="_on_toggled"]
[connection signal="toggled" from="pribor_prd_k_1" to="pribor_prd_k_1" method="_on_toggled"]
[connection signal="toggled" from="pribor_prd_v_4" to="pribor_prd_v_4" method="_on_toggled"]
[connection signal="toggled" from="pribor_prd_n_4" to="pribor_prd_n_4" method="_on_toggled"]

View File

@@ -38,7 +38,7 @@ const SETTING_TABLE = [
['Текущая версия ПО УАРЭП', TableEdit, TableEdit, 'Время сборки, версия и номер фиксации'],
['уарэп-яу07-частный', TableEdit, TableEdit, 'IP-адрес для получения частных сообщений от ЯУ-07'],
['уарэп-яу07-общий', TableEdit, TableEdit, 'IP-адрес для получения широковещательных сообщений от ЯУ-07'],
['уарэп-капсрпб', TableEdit, TableEdit, 'IP-адрес для связи с КАПС-РПБ'],
['уарэп-капсрпб', TableEdit, TableEdit, 'IP-адрес для связи с КАПС-РПБ [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'],
['уарэп-эмс', TableEdit, TableEdit, 'IP-адрес для связи с ЭМС'],
['уарэп-яу07-2в', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-В 2'],
['уарэп-яу07-2н', TableEdit, TableEdit, 'IP-адрес для связи с прибором ПРД-Н 2'],
@@ -61,7 +61,10 @@ const SETTING_TABLE = [
['Адрес АФСП левого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора АФСП'],
['Адрес АФСП правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора АФСП'],
['Адрес БПО левого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'],
['Адрес БПО правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'] ]
['Адрес БПО правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'],
['Период опроса состояния БПО, секунды', TableEdit, TableEdit, 'Время в секундах' ],
['Период опроса состояния АФСП, секунды', TableEdit, TableEdit, 'Время в секундах' ],
['уареп-трасса', TableEdit, TableEdit, 'IP-адрес для связи с Трассой [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'] ]
const EXTERNAL_CU = 16 ## Внешнее целеуказание
const TRASSA = 17
@@ -86,20 +89,17 @@ func _ready() -> void:
func on_external_cu_btn_pressed(btn) -> void:
var state = btn.button_pressed
ProjectSettings.set_setting('application/config/Внешнее управление', state)
if state:
ProjectSettings.set_setting('application/config/Внешнее управление', btn.button_pressed)
if btn.button_pressed:
signaller.emit_signal('interfer_off_all')
func on_trassa_btn_pressed(btn) -> void:
var state = btn.button_pressed
ProjectSettings.set_setting('application/config/Внешнее указание Трасса', state)
ProjectSettings.set_setting('application/config/Внешнее указание Трасса', btn.button_pressed)
func on_vk_pressed(btn) -> void:
var state = btn.button_pressed
signaller.emit_signal('kb_pressed', state)
signaller.emit_signal('kb_pressed', btn.button_pressed)
func on_ems2_pressed(btn) -> void:
@@ -175,7 +175,7 @@ func setting_tab():
var child = node_values[0]
if child is CheckButton:
child.connect('pressed', Callable(self, 'on_checkbutton_pressed').bind(i))
var val = settings_data[param_name] if settings_data.has(param_name) else false
var val = ProjectSettings.get_setting('application/config/%s' % param_name)
child.set_pressed(val)
else:
if settings_data.has(param_name):
@@ -213,11 +213,9 @@ func button_settings():
var extern_cu_node = $scroll_set/table.get_node2(1, EXTERNAL_CU).get_children()[0]
extern_cu_node.connect('pressed', on_external_cu_btn_pressed.bind(extern_cu_node))
on_external_cu_btn_pressed(extern_cu_node)
var trassa_node = $scroll_set/table.get_node2(1, TRASSA).get_children()[0]
var trassa_node = $scroll_set/table.get_node2(1, TRASSA).get_children()
trassa_node = trassa_node[0]
trassa_node.connect('pressed', on_trassa_btn_pressed.bind(trassa_node))
on_trassa_btn_pressed(trassa_node)
var vk_node = $scroll_set/table.get_node2(1, KEYBOARD).get_children()[0]
vk_node.connect('pressed', on_vk_pressed.bind(vk_node))
var ems2_hide_node = $scroll_set/table.get_node2(1, HIDE_EMS2).get_children()[0]

View File

@@ -18,6 +18,7 @@ class_name work extends Panel
@export var strob_min_width: float ## Минимальная ширина строба по углу.
@export var window_0_id: int ## Идетификатор окна. Присваивается godot от 0 до количества созданных окон.
const SVK_EMIT = 1 ## Код состояния выполнения помехи - выполняется
var drag_button: MouseButton ## Кнопка мыши нажатая при перетаскивании.
var drag_fsm: DragFSM = DragFSM.IDLE ## Текущее состояние перетаскивания.
@@ -30,7 +31,13 @@ var strob_band_begin: float ## Ширина строба в моме
var strob_dir_begin: float ## Направление антенны в момент начала перетаскивания.
var strob_width_begin: float ## Ширина строба по углу в момент начала перетаскивания.
var view_mode: MapViewMode ## Режим отображения карты
var thrs_dict: Dictionary ## Ссылка на словарь целей
var color_ecm: Color
var color_select: Color
var color_emit: Color
var color_emit_sel: Color
var course = 0.0 ## Курс корабля
signal drag_begin ## Вызывается в момент начала перетаскивания.
signal drag_continue ## Вызывается во время продолжения перетаскивания.
@@ -44,6 +51,7 @@ const map_sizes = [
var fs_band = prd.FS_BAND_RTO ## Текущий режим блоков ФС по частоте
var fs_selected: Dictionary ## Словарь выбранных секторов
var fs_active: Dictionary ## Словарь секторов назначенных на подавление
var fs_emit: Dictionary ## Словарь секторов назначенных на подавление
## Состояние перетаскивания.
enum DragFSM {
@@ -72,10 +80,6 @@ const VAL_TO_EVENT = {
true: 'full_auto' } ## Выбор целей и установка помех автоматически.
## Обработчик сигнала изменения списка целей.
func on_threats_resized(threats: Dictionary): $count_all_pad/count_all.text = '%02d' % threats.size()
## Обработчик выбора цели.
func on_threat_selected(th, ecm_btns): on_rto_threat_sel(th.id, ecm_btns)
@@ -84,6 +88,25 @@ 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_settings_changed():
color_emit_sel = ProjectSettings.get_setting('application/interfer/emit_sel_color', Color(1.0, 1.0, 1.0, 1.0))
color_emit = ProjectSettings.get_setting('application/interfer/emit_color', Color(0.58, 0.47, 0.51, 1.0))
color_ecm = ProjectSettings.get_setting('application/interfer/interfer_color', Color(0.58, 0.47, 0.51, 1.0))
color_select = ProjectSettings.get_setting('application/interfer/select_color', Color(1.0, 1.0, 1.0, 1.0))
color_select *= Color(1.0, 1.0, 1.0, 0.0)
color_ecm *= Color(1.0, 1.0, 1.0, 0.0)
color_emit_sel *= Color(1.0, 1.0, 1.0, 0.2)
## Обработчик сигнала изменения списка целей.
func on_threats_resized(ths: Dictionary):
$count_all_pad/count_all.text = '%02d' % ths.size()
var c: int = ths.values().filter(func(th: threats.Threat): return th.proto != '').size()
$count_danger_pad/count_danger.text = '%02d' % c
thrs_dict = ths
## Обработчик нажатия на кнопку вид.
func on_button_view_toggled(toggled: bool):
signaller.emit_signal('map_mode_changed', int(toggled))
@@ -113,6 +136,8 @@ func _exit_tree() -> void:
## Производит инициализацию.
func _ready():
ProjectSettings.connect('settings_changed', on_settings_changed)
on_settings_changed()
min_zoom = ProjectSettings.get_setting('application/config/map_minimum_zoom', 5)
max_zoom = ProjectSettings.get_setting('application/config/map_maximum_zoom', 19)
drag_fsm = DragFSM.OFF
@@ -120,28 +145,42 @@ func _ready():
btns_select.any(func(btn): btn.button_connect('pressed', Callable(self, 'on_button_select').bind(btn, btns_select)))
var nodes: Array = get_tree().get_nodes_in_group('группа-режим-помехи')
nodes.any(func(btn): btn.button_connect('pressed', Callable(self, 'on_button_pressed').bind(btn, nodes)))
threats.connect('threat_new', Callable(self, 'on_threat_new'))
threats.connect('threat_lost', Callable(self, 'on_threat_lost'))
threats.connect('threats_resized', Callable(self, 'on_threats_resized'))
threats.connect('threat_update', Callable(self, 'on_threat_update'))
signaller.connect('rto_threat_sel', Callable(self, 'on_rto_threat_sel').bind(nodes))
signaller.connect('bip_pressed', Callable(self, 'on_bip_pressed').bind(nodes))
signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel').bind(nodes))
signaller.connect('threat_selected', Callable(self, 'on_threat_selected').bind(nodes))
signaller.connect('interfer_selected', Callable(self, 'on_interfer_selected').bind(nodes))
signaller.connect('interfer_new', Callable(self, 'on_interfer_new'))
signaller.connect('interfer_off_all', Callable(self, 'on_interfer_off_all'))
signaller.connect('interfer_prinuditelno', Callable(self, 'on_interfer_prinuditelno').bind(nodes))
signaller.connect('fs_selected', Callable(self, 'on_fs_selected'))
signaller.connect('fs_update_color', Callable(self, 'on_fs_update_color'))
interfer.connect('interfer_update', Callable(self, 'on_interfer_new'))
signaller.connect('interfer_prinuditelno', Callable(self, 'on_chk_interfer_prinuditelno'))
signaller.connect('fs_update_state', Callable(self, 'on_fs_update_state'))
signaller.connect('map_user_panning', Callable(self, 'on_user_panning'))
threats.connect('threat_new', Callable(self, 'on_threat_new'))
threats.connect('threat_lost', Callable(self, 'on_threat_lost'))
threats.connect('threats_resized', Callable(self, 'on_threats_resized'))
threats.connect('threat_update', Callable(self, 'on_threat_update'))
signaller.connect('rto_threat_sel', Callable(self, 'on_rto_threat_sel').bind(nodes))
signaller.connect('bip_pressed', Callable(self, 'on_bip_pressed').bind(nodes))
signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel').bind(nodes))
signaller.connect('threat_selected', Callable(self, 'on_threat_selected').bind(nodes))
signaller.connect('interfer_selected', Callable(self, 'on_interfer_selected').bind(nodes))
signaller.connect('interfer_new', Callable(self, 'on_interfer_new'))
signaller.connect('interfer_off_all', Callable(self, 'on_interfer_off_all'))
signaller.connect('interfer_prinuditelno', Callable(self, 'on_interfer_prinuditelno').bind(nodes))
signaller.connect('fs_selected', Callable(self, 'on_fs_selected'))
signaller.connect('fs_update_color', Callable(self, 'on_fs_update_color'))
interfer.connect('interfer_update', Callable(self, 'on_interfer_new'))
signaller.connect('interfer_prinuditelno', Callable(self, 'on_chk_interfer_prinuditelno'))
signaller.connect('fs_update_state', Callable(self, 'on_fs_update_state'))
signaller.connect('map_user_panning', Callable(self, 'on_user_panning'))
signaller.connect('update_coordinates_map', Callable(self, 'on_update_coordinates_label'))
signaller.connect('update_scale_map', Callable(self, 'on_update_scale_label'))
signaller.connect('update_scale_map', Callable(self, 'on_update_scale_label'))
var unit_nav = network.get_unit_instance('навигация')
unit_nav.connect('data_received', on_navi_data_received)
on_btn_center_toggled(true)
on_btn_activate_toggled(true)
#$canvas.add_seczap(0, Vector4(372, 0, 30, 348))
#$canvas.add_seczap(1, Vector4(372, 90, 30, 348))
#$canvas.add_seczap(2, Vector4(198 + 348, 180, 30, 5))
#$canvas.add_seczap(3, Vector4(203, 270, 30, 5))
#$canvas.set_seczap_color(2, Color.MAGENTA)
#$canvas.set_seczap_color(3, Color.CHARTREUSE)
func on_navi_data_received(data: Dictionary):
$canvas.set_canvas_rotation(data.get('k', 0.0))
course = data.get('k', 0.0)
func on_user_panning():
@@ -166,7 +205,7 @@ func get_all_nodes(root):
## Производит отображение цели на диаграмму.
func map_threat_to_bip(th: threats.Threat, bip: Control):
func map_threat_to_bip(th: threats.Threat, bip: Control) -> bool:
var freq = th.freq
var sector_key = null
var sector_width = 50.0
@@ -176,7 +215,7 @@ func map_threat_to_bip(th: threats.Threat, bip: Control):
if freq_range[0] <= freq and freq <= freq_range[1]:
sector_key = key
break
if sector_key!= null:
if sector_key != null:
radius_internal = fs_band[sector_key][0]
radius_outter = fs_band[sector_key][1]
freq_low = prd.FS_FREQ[sector_key][0]
@@ -189,33 +228,34 @@ func map_threat_to_bip(th: threats.Threat, bip: Control):
radius_outter,
freq_low,
freq_high) - bip.size / 2
return sector_key != null
## Обработчик сигнала обновления цели.
func on_threat_update(th):
var bip = get_node('%d' % th.id)
bip.update(th.tick_rx)
map_threat_to_bip(th, bip)
bip.visible = map_threat_to_bip(th, bip)
## Обработчик выбора помехи для цели.
func on_interfer_new(ecm):
if interfer.thrs.has(ecm.ispp):
var th_id = interfer.thrs[ecm.ispp]
var bip = get_node('%d' % th_id)
if bip != null:
if ecm.krp!= interfer.INTERFER_OFF:
bip.set_track_visible(true)
if ecm.svk == 1:
bip.set_ecm_visible(true)
else: bip.set_ecm_visible(false)
else:
bip.set_ecm_visible(false)
bip.set_track_visible(false)
if not interfer.thrs.has(ecm.ispp): return
var th_id = interfer.thrs[ecm.ispp]
var bip = get_node('%d' % th_id)
if bip != null:
if ecm.krp!= interfer.INTERFER_OFF:
bip.set_track_visible(true)
if ecm.svk == 1:
bip.set_ecm_visible(true)
else: bip.set_ecm_visible(false)
else:
interfer.thrs.erase(ecm.ispp)
set_fs_color(ecm)
update_fs_colors()
bip.set_ecm_visible(false)
bip.set_track_visible(false)
else:
interfer.thrs.erase(ecm.ispp)
set_fs_color(ecm)
update_fs_colors()
set_fs_color(ecm)
@@ -226,6 +266,7 @@ func on_interfer_off_all():
bip.set_ecm_visible(false)
bip.set_track_visible(false)
fs_active.clear()
fs_emit.clear()
update_fs_colors()
@@ -259,24 +300,33 @@ func on_rto_threat_sel(th_id, ecm_btns):
unsel_fs_all(false)
else:
item.set_sel_visible(false)
var th = thrs_dict[th_id]
var krp = interfer.get_krp(th)
for btn in ecm_btns:
set_btns_disabled(false, btn)
var btn_meta = btn.get_meta('rfi_name')
if krp == btn_meta:
btn.modulate = Color.DEEP_SKY_BLUE
else:
btn.modulate = Color(1.0, 1.0, 1.0, 1.0)
## Обработчик снятия выбора РТО цели.
func on_rto_threat_unsel(th_id, _ecm_btns):
func on_rto_threat_unsel(th_id, ecm_btns):
var bips: Array = get_children().filter(func(item): return item.name.is_valid_int())
for item in bips:
if th_id == item.name.to_int():
item.set_sel_visible(false)
break
set_ecm_btns_state(true)
for btn in ecm_btns:
btn.modulate = Color(1.0, 1.0, 1.0, 1.0)
## Обработчик нажатия кнопки "Строб". Управляет отображением строба.
func on_button_strobe_pressed() -> void:
drag_fsm = DragFSM.IDLE if $btns_select/btn_strob.is_pressed() else DragFSM.OFF
$canvas.set_strob_visible(drag_fsm == DragFSM.IDLE)
$canvas.set_strob_visible((drag_fsm == DragFSM.IDLE) and (view_mode == MapViewMode.RTO))
## Поведение радиокнопок в группе. Управляет состоянием кнопок выбора целей.
@@ -341,6 +391,7 @@ func set_strob(pos: Vector2) -> void:
## Обработка движения мыши для управления стробом. Вызывается во время движения мыши.
func _on_drag_continue(event) -> void:
if not $canvas.get_strob_visible(): return
if drag_button == MOUSE_BUTTON_RIGHT:
if shift_pressed:
var strob_width: float = get_strob_width(event.position, strob_width_begin)
@@ -354,6 +405,7 @@ func _on_drag_continue(event) -> void:
## Обработка движения мыши для управления стробом. Вызывается при нажатии мыши.
func _on_drag_begin(event) -> void:
if not $canvas.get_strob_visible(): return
drag_pos_begin = event.position
if drag_button == MOUSE_BUTTON_LEFT:
set_strob(event.position)
@@ -390,7 +442,7 @@ func sel_fs_sector(event):
if (event.button_index == MOUSE_BUTTON_LEFT) or (event.button_index == MOUSE_BUTTON_RIGHT):
var center: Vector2 = $tilemap.position
var center_offset: Vector2 = ProjectSettings.get_setting('application/interfer/center_offset', Vector2i(0, 25))
var angle: float = event.position.angle_to_point(center + center_offset) * 180/PI - 45.0
var angle: float = event.position.angle_to_point(center + center_offset) * 180/PI - 45.0 - course
if angle < 0:
angle += 360
var distance: float = event.position.distance_to(center + center_offset)
@@ -418,21 +470,31 @@ func sel_fs_sector(event):
func set_fs_color(ecm):
if not prd.fs_caps_id.has(ecm.nmfs):
push_warning('нет такого модуля ФС: %d, но имеется: %s' % [ecm.nmfs, prd.fs_caps_id.keys()])
return
if ecm.krp != interfer.INTERFER_OFF:
fs_active[prd.fs_caps_id[ecm.nmfs]] = null
else:
fs_active.erase(prd.fs_caps_id[ecm.nmfs])
if ecm.svk == SVK_EMIT:
fs_emit[prd.fs_caps_id[ecm.nmfs]] = null
else:
fs_emit.erase(prd.fs_caps_id[ecm.nmfs])
update_fs_colors()
func update_fs_colors():
var fs_colors = $canvas.fs_default_colors.duplicate()
var color_ecm: Vector3 = ProjectSettings.get_setting('application/interfer/interfer_color', Vector3(0.58, 0.47, 0.51))
var color_select: Vector3 = ProjectSettings.get_setting('application/interfer/select_color', Vector3(1.0, 1.0, 1.0))
for key in fs_active.keys():
fs_colors[key] = color_ecm
for key in fs_emit.keys():
fs_colors[key] = color_emit
for key in fs_selected.keys():
fs_colors[key] = color_select
if key in fs_emit:
fs_colors[key] = color_emit_sel
else:
fs_colors[key] = color_select
$canvas.set_band_colors(fs_colors)
@@ -470,6 +532,7 @@ func set_btns_disabled(value: bool, btn):
func on_fs_update_color(ecms):
fs_active.clear()
fs_emit.clear()
for ecm in ecms.values():
set_fs_color(ecm)
update_fs_colors()

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=17 format=3 uid="uid://b276iygic5itk"]
[gd_scene load_steps=18 format=3 uid="uid://b276iygic5itk"]
[ext_resource type="Script" uid="uid://daudc0s3oox3i" path="res://scenes/работа/работа.gd" id="1_niok4"]
[ext_resource type="PackedScene" uid="uid://nl1vklubr5kr" path="res://scenes/bip/bip.tscn" id="2_br3s6"]
@@ -51,6 +51,10 @@ _data = {
offsets = PackedFloat32Array(0.181818, 0.751623)
colors = PackedColorArray(1, 1, 1, 0.352941, 1, 1, 1, 0)
[sub_resource type="SystemFont" id="SystemFont_5ffal"]
generate_mipmaps = true
subpixel_positioning = 0
[node name="Работа" type="Panel"]
script = ExtResource("1_niok4")
Bip = ExtResource("2_br3s6")
@@ -86,6 +90,7 @@ self_modulate = Color(1, 1, 1, 0.415686)
position = Vector2(360, 360)
min_zoom_level = 3
max_zoom_level_server = 11
ship_radius_km = 3.0
az = 3.0
[node name="player" type="AnimationPlayer" parent="tilemap"]
@@ -95,11 +100,10 @@ libraries = {
[node name="grd_side" parent="." instance=ExtResource("3_s2j0e")]
layout_mode = 0
offset_left = 1114.0
offset_left = 1116.0
offset_top = 7.0
offset_right = 1594.0
offset_bottom = 1170.0
metadata/_edit_lock_ = true
[node name="grd_btns" parent="." instance=ExtResource("5_2jnbs")]
layout_mode = 0
@@ -203,6 +207,7 @@ offset_left = 115.0
offset_top = 1085.0
offset_right = 257.0
offset_bottom = 1112.0
tooltip_text = "Автоматический выбор цели и помехи"
action_mode = 0
text = "Автоматически"
@@ -259,6 +264,7 @@ offset_top = 995.0
offset_right = 1136.0
offset_bottom = 1127.0
scale = Vector2(0.5, 0.5)
tooltip_text = "Применение выбранного режима помехи"
toggle_mode = true
button_pressed = true
action_mode = 0
@@ -283,27 +289,58 @@ offset_top = 1005.0
offset_right = 1030.0
offset_bottom = 1121.0
scale = Vector2(0.5, 0.5)
tooltip_text = "Устанавливает центр карты на текущие координаты"
toggle_mode = true
button_pressed = true
texture_normal = ExtResource("12_5ffal")
texture_pressed = ExtResource("13_ggrwd")
[node name="label" type="Label" parent="btn_center"]
layout_mode = 0
offset_left = -32.0
offset_top = 100.0
offset_right = 65.0
offset_bottom = 119.0
scale = Vector2(2, 2)
text = "Центрировать"
horizontal_alignment = 1
vertical_alignment = 1
[node name="coordinates_map" type="Label" parent="."]
layout_mode = 0
offset_left = 1000.0
offset_left = 999.0
offset_top = 128.0
offset_right = 1112.0
offset_right = 1111.0
offset_bottom = 147.0
text = "Координаты:"
[node name="scale_map" type="Label" parent="."]
layout_mode = 0
offset_left = 1000.0
offset_top = 192.0
offset_right = 1110.0
offset_bottom = 213.0
offset_left = 999.0
offset_top = 202.0
offset_right = 1109.0
offset_bottom = 223.0
text = "Масштаб:"
[node name="zoom_plus" type="Button" parent="."]
layout_mode = 0
offset_left = 1056.0
offset_top = 230.0
offset_right = 1088.0
offset_bottom = 262.0
theme_override_fonts/font = SubResource("SystemFont_5ffal")
theme_override_font_sizes/font_size = 20
text = "+"
[node name="zoom_minus" type="Button" parent="."]
layout_mode = 0
offset_left = 1056.0
offset_top = 270.0
offset_right = 1088.0
offset_bottom = 302.0
theme_override_font_sizes/font_size = 20
text = ""
[connection signal="drag_begin" from="." to="." method="_on_drag_begin"]
[connection signal="drag_continue" from="." to="." method="_on_drag_continue"]
[connection signal="toggled" from="btn_view" to="." method="on_button_view_toggled"]
@@ -311,3 +348,8 @@ text = "Масштаб:"
[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"]
[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate"]
[connection signal="toggled" from="btn_center" to="." method="on_btn_center_toggled"]
[connection signal="button_down" from="zoom_plus" to="tilemap" method="_on_zoom_plus_button_down"]
[connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_plus_button_up"]
[connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_button_up"]
[connection signal="button_down" from="zoom_minus" to="tilemap" method="_on_zoom_minus_button_down"]
[connection signal="button_up" from="zoom_minus" to="tilemap" method="_on_zoom_button_up"]