Merge remote-tracking branch 'sasha/master'
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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')
|
||||
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 = "<off>"
|
||||
|
||||
[node name="btn_auto_rfi" parent="." groups=["группа-режим-помехи"] instance=ExtResource("8_2hm8b")]
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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 ## Время после последнего обновления в мс, через которое цель считается потерянной.
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user