diff --git a/project.godot b/project.godot index f5fe532c..a8f8d413 100644 --- a/project.godot +++ b/project.godot @@ -25,7 +25,7 @@ config/icon="res://data/icon.png" signaller="*res://scripts/signaller.gd" Log="*res://addons/godot-logger/scripts/logger.gd" Tools="*res://scripts/tools.gd" -REPSettings="*res://scripts/repsettings.gd" +repsettings="*res://scripts/repsettings.gd" REPNetwork="*res://scripts/repnetwork.gd" yau07="*res://scripts/yau07.gd" capsrpb="*res://scripts/capsrpb.gd" diff --git a/scenes/bip.tscn b/scenes/bip.tscn index 18854c9c..66305c67 100644 --- a/scenes/bip.tscn +++ b/scenes/bip.tscn @@ -1,22 +1,16 @@ -[gd_scene load_steps=5 format=3 uid="uid://nl1vklubr5kr"] +[gd_scene load_steps=4 format=3 uid="uid://nl1vklubr5kr"] [ext_resource type="Shader" path="res://shaders/bip.gdshader" id="1_k6vue"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_2dulj"] shader = ExtResource("1_k6vue") shader_parameter/color = Color(1, 0.101961, 0.494118, 1) +shader_parameter/color_up = Color(1, 1, 1, 1) +shader_parameter/tick_update = 0 [sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_tgf76"] -[sub_resource type="GDScript" id="GDScript_4xy3s"] -script/source = "extends Sprite2D - -func set_bip_color(col: Color): material.set('shader_parameter/color', col) -func get_bip_color() -> Color: return material.get('shader_parameter/color') -" - [node name="bip" type="Sprite2D"] material = SubResource("ShaderMaterial_2dulj") scale = Vector2(10, 10) texture = SubResource("PlaceholderTexture2D_tgf76") -script = SubResource("GDScript_4xy3s") diff --git a/scenes/scroll-params.gd b/scenes/scroll-params.gd index 48bf8717..eb7f9fba 100644 --- a/scenes/scroll-params.gd +++ b/scenes/scroll-params.gd @@ -30,23 +30,19 @@ func on_threat_selected(th): func init_table(): - $table.set_header(TABLE_HEADER) - $table.set_header_text(TABLE_HEADERS_TEXT) - $table.set_columns_min_size(TABLE_COLUMN_SIZE) - $table.pin_header(self, get_parent()) - $table.connect('row_pressed', Callable(self, 'on_row_pressed')) for i in TABLE_PARAMS.size(): $table.add_row(TABLE_ROW) for p in TABLE_PARAMS.values(): $table.set_node_text(0, p[0], p[1]) $table.set_node_alligment(0, p[0], HORIZONTAL_ALIGNMENT_LEFT) $table.set_node_editable(0, p[0], false) $table.set_node_editable(1, p[0], false) + $table.set_columns_min_size(TABLE_COLUMN_SIZE) $table.set_meta('id', 0) func _ready() -> void: signaller.connect('threat_selected', Callable(self, 'on_threat_selected')) - Threats.connect('threat_update', Callable(self, 'on_threat_update')) + Threats.connect('threat_update', Callable(self, 'on_threat_update')) call_deferred('init_table') diff --git a/scenes/работа.gd b/scenes/работа.gd index 77673878..e2f62ca4 100644 --- a/scenes/работа.gd +++ b/scenes/работа.gd @@ -1,19 +1,24 @@ +@tool + extends Panel ## Основной скрипт для режима "Работа" -@export var Bip: PackedScene ## Сцена точки индикатора излучения цели +@export var Bip: PackedScene ## Индикатор излучения цели @export var col_grey: Color ## Второй цвет для фона @export var col_red: Color ## Первый цвет для фона @export var drag_scale_band: float ## Масштаб изменения параметра от движения мыши для строба по радиальному размеру @export var drag_scale_width: float ## Масштаб изменения параметра от движения мыши для строба по угловому размеру +@export var freq_high: float ## Верхняя рабочая частота, МГЦ. +@export var freq_low: float ## Нижняя рабочая частота, МГЦ. +@export var radius_center: Vector2 ## Координаты центра диаграммы пеленг-частота @export var radius_internal: float ## Внутренний радиус диаграммы пеленг-частота @export var radius_outter: float ## Внешний радиус диаграммы пеленг-частота @export var strob_max_band: float ## Максимальная ширина строба по углу @export var strob_max_width: float ## Максимальная ширина строба по углу @export var strob_min_band: float ## Минимальная ширина строба по частоте @export var strob_min_width: float ## Минимальная ширина строба по углу -@export var window_0_id: int ## Идетификатор окна. Присваивается godot от 0 до количесва созданных окон +@export var window_0_id: int ## Идетификатор окна. Присваивается godot от 0 до количества созданных окон var drag_button: MouseButton ## Кнопка мыши нажатая при перетаскивании @@ -21,7 +26,6 @@ var drag_fsm: DragFSM = DragFSM.IDLE ## Текущее состояние пе var drag_pos_begin: Vector2 ## Точка начала перетаскивания var shift_pressed: bool ## Кнопка SHIFT нажата var strob_band_begin: float ## Ширина строба в момент начала перетаскивания -var strob_center: Vector2 ## Центр антенн var strob_dir_begin: float ## Направление антенны в момент начала перетаскивания var strob_width_begin: float ## Ширина строба по углу в момент начала перетаскивания @@ -52,7 +56,6 @@ func on_threats_resized(threats: Dictionary): $count_all_pad/count_all.text = '% func _ready(): $btn_strobe.button_connect('pressed', Callable(self, 'on_button_strobe_pressed')) $btn_off.set_pressed(true) - strob_center = $canvas.get_strob_center() on_button_strobe_pressed() drag_fsm = DragFSM.OFF var nodes: = get_tree().get_nodes_in_group('группа-режим-помехи') @@ -68,11 +71,11 @@ func map_threat_to_bip(th: Threats.Threat, bip: Sprite2D): bip.position = Tools.pos_calc( th.freq, th.aoa, - REPSettings.ThreatParams.radius_center, - REPSettings.ThreatParams.radius_inner, - REPSettings.ThreatParams.radius_outter, - REPSettings.ThreatParams.freq_low, - REPSettings.ThreatParams.freq_high) + radius_center, + radius_internal, + radius_outter, + freq_low, + freq_high) ## Обработчик сигнала обновления цели @@ -127,7 +130,7 @@ func get_strob_band(pos: Vector2, prev: float) -> float: ## Устанавливает центр строба по частоте и направлению func set_strob(pos: Vector2) -> void: - var radp: Vector2 = Tools.map_dec_to_rad(strob_center, pos) + var radp: Vector2 = Tools.map_dec_to_rad(radius_center, pos) if radp.y < $canvas.get_radius_outter(): $canvas.set_strob_dir(radp.x) $canvas.set_strob_radius(radp.y) @@ -156,7 +159,7 @@ func _on_drag_begin(event) -> void: strob_band_begin = $canvas.get_strob_band() -## Обработчик событий вввода. Вызывается godot +## Обработчик событий ввода. Вызывается godot func _input(event) -> void: if not is_visible_in_tree(): return if event is InputEventMouseMotion: diff --git a/scenes/работа.tscn b/scenes/работа.tscn index c8faf5df..a038cc1a 100644 --- a/scenes/работа.tscn +++ b/scenes/работа.tscn @@ -17,6 +17,11 @@ col_grey = Color(0.34902, 0.643137, 0.772549, 0.168627) col_red = Color(1, 0.568627, 0.431373, 0.239216) drag_scale_band = 0.05 drag_scale_width = 0.5 +freq_high = 6000.0 +freq_low = 200.0 +radius_center = Vector2(560, 560) +radius_internal = 200.0 +radius_outter = 550.0 strob_max_band = 15.538 strob_max_width = 90.0 strob_min_band = 0.1 @@ -91,7 +96,7 @@ vertical_alignment = 1 [node name="scroll" type="ScrollContainer" parent="grd_side/frm_params"] layout_mode = 0 offset_left = 4.0 -offset_top = 54.0 +offset_top = 27.0 offset_right = 476.0 offset_bottom = 282.0 script = ExtResource("6_l01tb") @@ -318,6 +323,7 @@ offset_top = 1118.0 offset_right = 205.0 offset_bottom = 1168.0 text = "Откл." +pressed = true metadata/rfi_name = "" [node name="btn_auto_rfi" parent="." groups=["группа-режим-помехи"] instance=ExtResource("8_2hm8b")] diff --git a/scripts/interfer.gd b/scripts/interfer.gd index 3ac2b4de..66786130 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -45,12 +45,12 @@ class Interfer: names.any(func(vn): if dic.has(vn): set(vn, dic[vn]); return false) -signal interfer_preparing(ecm: Interfer) ## Вызывается при запуске помехи -signal interfer_run(ecm: Interfer) ## Вызывается в момент начала работы помехи -signal interfer_error(ecm: Interfer, msg: String) ## Вызывается при ошибке -signal interfer_update(ecm: Interfer) ## Вызывается при обновлении помехи -signal interfer_new(ecm: Interfer) ## Вызывается при новой помехе -signal interfer_resized(ecms: Dictionary) ## Вызывается при изменении количества сеансов помех +signal interfer_preparing(ecm: Interfer) ## Вызывается в момент запуска помехи. +signal interfer_run(ecm: Interfer) ## Вызывается в момент начала работы помехи. +signal interfer_error(ecm: Interfer, msg: String) ## Вызывается при ошибке. +signal interfer_update(ecm: Interfer) ## Вызывается при обновлении помехи. +signal interfer_new(ecm: Interfer) ## Вызывается при создании новой помехи. +signal interfer_resized(ecms: Dictionary) ## Вызывается при изменении количества сеансов помех. ## Производит приём состояния помех. [param unit] -> [param ecms] diff --git a/scripts/repnetwork.gd b/scripts/repnetwork.gd index 3947d92a..f06c3cb8 100644 --- a/scripts/repnetwork.gd +++ b/scripts/repnetwork.gd @@ -18,10 +18,10 @@ var logger_page: Node func create_socket(nm) -> Socket: - var addr = REPSettings.UnitProfiles[nm][1] - var port = REPSettings.UnitProfiles[nm][2] - var broad = REPSettings.UnitProfiles[nm][3] - var bind = REPSettings.UnitProfiles[nm][4] + var addr = repsettings.UnitProfiles[nm][1] + var port = repsettings.UnitProfiles[nm][2] + var broad = repsettings.UnitProfiles[nm][3] + var bind = repsettings.UnitProfiles[nm][4] var sock: = Socket.new() sock.set_broadcast_enabled(broad) var rc = Error.OK if not bind else sock.bind(port, addr) @@ -39,12 +39,12 @@ func _ready() -> void: sock_unicast = poll_sockets[0] sock_capsrpb = poll_sockets[2] - for unit_name in REPSettings.UnitProfiles: - var setting = REPSettings.UnitProfiles[unit_name] + for unit_name in repsettings.UnitProfiles: + var setting = repsettings.UnitProfiles[unit_name] var proto = setting[0] if proto in PROTOCOL_TYPES: var unit = PROTOCOL_TYPES[proto].new(unit_name) - var unit_key = REPSettings.get_unit_key(unit_name) + var unit_key = repsettings.get_unit_key(unit_name) units[unit_key] = unit unit.connect('line_changed', Callable(logger_page, 'on_line_changed').bind(unit_key)) unit.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(unit_key)) diff --git a/scripts/repsettings.gd b/scripts/repsettings.gd index 6f4cce8c..1566757b 100644 --- a/scripts/repsettings.gd +++ b/scripts/repsettings.gd @@ -33,12 +33,7 @@ extends Node ## Параметры цели @export var ThreatParams = { - 'radius_center': Vector2(560, 560), ## Координаты центра диаграммы в пикселях для отображения частота-пеленг. - 'time_lost': 5000, ## Время после последнего обновления в мс, через которое цель считается потерянной. - 'freq_low': 200.0, ## Нижняя рабочая частота, МГЦ. - 'freq_high': 6000.0, ## Верхняя рабочая частота, МГЦ. - 'radius_inner': 200, ## Внутренний радиус диаграммы в пикселях для отображения частота-пеленг. - 'radius_outter': 550 ## Наружний радиус диаграммы в пикселях для отображения частота-пеленг. + 'time_lost': 5000 ## Время после последнего обновления в мс, через которое цель считается потерянной. } diff --git a/scripts/threats.gd b/scripts/threats.gd index 00ac6c15..3d1f033f 100644 --- a/scripts/threats.gd +++ b/scripts/threats.gd @@ -45,13 +45,13 @@ signal threats_resized(th: Dictionary) func _ready() -> void: Log.info('Модуль обработки целей готов') var threats = {} ## Список целей. Индекс - <номер цели> - var unit_key = REPSettings.get_unit_key('уарэп-капсрпб-отп') + var unit_key = repsettings.get_unit_key('уарэп-капсрпб-отп') var unit = REPNetwork.units[unit_key] var timer_check_lost: = Timer.new() add_child(timer_check_lost) unit.connect('data_received', Callable(self, 'on_data_capsrpb_received').bind(threats)) - timer_check_lost.connect('timeout', Callable(self, 'on_timer_check_lost').bind(REPSettings.ThreatParams.time_lost, threats)) - timer_check_lost.start(REPSettings.ThreatParams.time_lost / 1000.0) + timer_check_lost.connect('timeout', Callable(self, 'on_timer_check_lost').bind(repsettings.ThreatParams.time_lost, threats)) + timer_check_lost.start(repsettings.ThreatParams.time_lost / 1000.0) ## Периодически удаляет устаревшие цели @@ -75,19 +75,20 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb, threats: Dictionary): var mis = unit.json_dic['mis'] var sz: = threats.size() for dic_th in mis: - if dic_th.has('id'): - var id = int(dic_th['id']) - if threats.has(id): - var th = threats[id] - th.clear_fflags() - th.set_from_dic(dic_th) - th.tick_rx = unit.tick - call_deferred('emit_signal', 'threat_update', th) - else: - var th = Threat.new() - th.set_from_dic(dic_th) - threats[id] = th - th.tick_rx = unit.tick - call_deferred('emit_signal', 'threat_new', th) + if dic_th is Dictionary: + if dic_th.has('id'): + var id = int(dic_th['id']) + if threats.has(id): + var th = threats[id] + th.clear_fflags() + th.set_from_dic(dic_th) + th.tick_rx = unit.tick + call_deferred('emit_signal', 'threat_update', th) + else: + var th = Threat.new() + th.set_from_dic(dic_th) + threats[id] = th + th.tick_rx = unit.tick + call_deferred('emit_signal', 'threat_new', th) if sz != threats.size(): call_deferred('emit_signal', 'threats_resized', threats) diff --git a/scripts/yau07.gd b/scripts/yau07.gd index aec65d17..b299b701 100644 --- a/scripts/yau07.gd +++ b/scripts/yau07.gd @@ -93,6 +93,7 @@ class YaU07: var ports_count = ports_data.size() tx_len = ports_count * 2 + 8 + tx_data.encode_u16(0, cmd_retry) # Исправление для сетевого стека "nm-callback" процессоров STM tx_data.encode_u16(2, cmd_num_tx) if cmd_code == CmdCode.WRITE_ISA: diff --git a/shaders/bip.gdshader b/shaders/bip.gdshader index a46d779a..56ead0a5 100644 --- a/shaders/bip.gdshader +++ b/shaders/bip.gdshader @@ -3,9 +3,12 @@ shader_type canvas_item; /* Закрашенная окружность */ uniform vec4 color: source_color = vec4(1, 1, 1, 1); -const float ds = 0.01; /* Относительное расстояние на котором выполняется сглаживание краёв */ -const vec2 center = vec2(0.125, 0.125); /* Центр должен быть в (0.5, 0.5), но это не так */ -const float radius = 0.125 - ds * 2.0; /* Радиус должен быть 0.5, но это не так */ +uniform vec4 color_up: source_color = vec4(1, 1, 1, 1); /* Цвет вспышки при обновлении */ +uniform uint tick_update = 0; /* Время последнего обновления, мс */ +const float time_delta = 0.1; /* Время вспышки при обновлении, c */ +const float ds = 0.01; /* Относительное расстояние на котором выполняется сглаживание краёв */ +const vec2 center = vec2(0.125, 0.125); /* Центр должен быть в (0.5, 0.5), но это не так */ +const float radius = 0.125 - ds * 2.0; /* Радиус должен быть 0.5, но это не так */ float smooth_px(float r, float R) diff --git a/table/table.gd b/table/table.gd index bfd022db..56743d55 100644 --- a/table/table.gd +++ b/table/table.gd @@ -176,10 +176,12 @@ func get_key_indexes(key: String) -> Array: ## func set_columns_min_size(sizes: Array) -> void: + assert((columns == 1) or (columns == sizes.size())) + columns = sizes.size() var rows_count: = get_rows_count() - for i_row in rows_count: - set_nodes_min_size(i_row, sizes) - set_nodes_min_size(0, sizes, HEAD_KEY_FORMAT) + for i_row in rows_count: set_nodes_min_size(i_row, sizes) + if nodes.has(HEAD_KEY_FORMAT % [0, 0]): + set_nodes_min_size(0, sizes, HEAD_KEY_FORMAT) ## @@ -320,12 +322,9 @@ func add_row(row_types: Array) -> void: var node_type = row_types[i_col] var node = node_type.instantiate() assert(node.name == node.name, 'ошибка: экземпляр не имеет поля \"name\"') - var head = nodes[HEAD_KEY_FORMAT % [0, i_col]] var node_key: String = NODE_KEY_FORMAT % [i_row, i_col] node.name = node_key add_child(node) - node.custom_minimum_size.x = head.custom_minimum_size.x - node.set_deferred('size.x', head.size.x) nodes[node_key] = node var conn = Callable(self, '_on_focus_entered').bind(node) node.connect('focus_entered', conn)