From 94cc2411726e7cbb993065dd532d457a2b4a73b6 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 15 Aug 2023 13:36:51 +0300 Subject: [PATCH 1/6] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0.=20=D0=9D=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=BE=D0=BD?= =?UTF-8?q?=D0=BD=D0=BE=D0=B9=20=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/журнал.gd | 1 + 1 file changed, 1 insertion(+) diff --git a/scenes/журнал.gd b/scenes/журнал.gd index d6e6b358..5b9e6250 100644 --- a/scenes/журнал.gd +++ b/scenes/журнал.gd @@ -7,6 +7,7 @@ func on_command_fail(unit, addr): Log.message(Logger.ERROR, 'Ошибка: ко func _ready() -> void: Log.info('Модуль журнала работы готов') + Log.info('Операционная система: %s' % [OS.get_distribution_name()]) Threats.connect('threat_new', Callable(self, 'on_threats_changed').bind('Цель обнаружена')) Threats.connect('threat_lost', Callable(self, 'on_threats_changed').bind('Цель потеряна')) From af5fcfa2a6b0b1b65462ed23dcbbb3db26987227 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 15 Aug 2023 13:45:33 +0300 Subject: [PATCH 2/6] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/кнопка-эмс.gd | 33 ++++++++++++++++----------------- scenes/работа.gd | 2 +- scripts/capsrpb.gd | 22 +++++++++++----------- scripts/repsettings.gd | 4 ++-- scripts/threats.gd | 42 +++++++++++++++++++++--------------------- 5 files changed, 51 insertions(+), 52 deletions(-) diff --git a/scenes/кнопка-эмс.gd b/scenes/кнопка-эмс.gd index 1e63c76e..37bcaf7d 100644 --- a/scenes/кнопка-эмс.gd +++ b/scenes/кнопка-эмс.gd @@ -4,28 +4,28 @@ extends PanelContainer @export var texture_state0: Texture2D = preload('res://data/кнопка-эмс-1.png'): - set(val): $state.set_texture(val) + set(val): $state.set_texture(val) @export var texture_state1: Texture2D = preload('res://data/кнопка-эмс-0.png'): - set(val): $state.set_texture(val) + set(val): $state.set_texture(val) @export var text: String = '': - set(val): $button.set_text(val) - get: return $button.get_text() + set(val): $button.set_text(val) + get: return $button.get_text() @export var pressed: bool = false: - set(val): $button.set_pressed(val) - get: return $button.is_pressed() + set(val): $button.set_pressed(val) + get: return $button.is_pressed() @export var toggle_mode: bool = false: - set(val): - if is_inside_tree(): - $button.set_toggle_mode(val) - get: return $button.is_toggle_mode() + set(val): + if is_inside_tree(): + $button.set_toggle_mode(val) + get: return $button.is_toggle_mode() func set_text (val: String): $button.set_text(val) @@ -33,8 +33,8 @@ func set_pressed (val: bool): $button.set_pressed(val) func set_toggle_mode (val: bool): - if is_inside_tree(): - $button.set_toggle_mode(val) + if is_inside_tree(): + $button.set_toggle_mode(val) func get_text(): return $button.get_text() @@ -43,14 +43,13 @@ func is_toggle_mode(): return $button.is_toggle_mode() func _on_button_toggled(val: bool): - if val: $state.set_texture(texture_state1) - else: $state.set_texture(texture_state0) + if val: $state.set_texture(texture_state1) + else: $state.set_texture(texture_state0) func button_connect(button_signal: String, proc: Callable): - $button.connect(button_signal, proc) + $button.connect(button_signal, proc) func _on_button_mouse_entered(): - emit_signal("mouse_entered") - + emit_signal("mouse_entered") diff --git a/scenes/работа.gd b/scenes/работа.gd index 4cb6917d..336859f6 100644 --- a/scenes/работа.gd +++ b/scenes/работа.gd @@ -129,7 +129,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) - if radp.y < $canvas.get_radius_max(): + if radp.y < $canvas.get_radius_outter(): $canvas.set_strob_dir(radp.x) $canvas.set_strob_radius(radp.y) diff --git a/scripts/capsrpb.gd b/scripts/capsrpb.gd index 8478e7d4..ac3b93ab 100644 --- a/scripts/capsrpb.gd +++ b/scripts/capsrpb.gd @@ -3,22 +3,22 @@ extends Node ## Реализация "Протокол информационного сопряжения ## СПО АСУ изделия «МП‑550» с СПО «Управления КАПС РПБ»" -const ONLINE_TIMEOUT = 5.0 ## Время ожидания пакета от ячейки, секунды -const BUFFER_SIZE = 2048 ## Размер приёмного буфера для датаграмм + +const ONLINE_TIMEOUT = 3000 ## Время ожидания пакета от КАПС РПБ, мс +const BUFFER_SIZE = 2048 ## Размер приёмного буфера для датаграмм class CapsRpb: - signal line_changed(unit: CapsRpb) - signal data_received(unit: CapsRpb) - signal command_fail(unit: CapsRpb) - signal parse_error(unit: CapsRpb, msg: String) + signal line_changed(unit: CapsRpb) ## Сигнал состояние связи изменилось + signal data_received(unit: CapsRpb) ## Сигнал данные приняты + signal command_fail(unit: CapsRpb) ## Сигнал при не выполнении команды + signal parse_error(unit: CapsRpb, msg: String) ## Сигнал ошибки разбора сообщения static var json_conv: = JSON.new() - var online: = false - var name: String - var json_dic: Dictionary - var tick: = 0.0 - var tick_rx: = 0.0 + var online: = false ## Состояние на связи + var name: String ## Имя экземпляра + var json_dic: Dictionary ## Аппарат для разбора сообщений + var tick: = 0 ## Тик время последнего обновления, мс func _to_string() -> String: return String('капсрпб: "%s" %s ' % [self.name, ['отключен', 'на связи'][int(online)]]) func _init(nm): self.name = nm diff --git a/scripts/repsettings.gd b/scripts/repsettings.gd index d9261c4d..c060ef81 100644 --- a/scripts/repsettings.gd +++ b/scripts/repsettings.gd @@ -31,8 +31,8 @@ extends Node 'time_lost': 5000, ## Время после последнего обновления в мс, через которое цель считается потерянной 'freq_low': 200.0, ## Нижняя рабочая частота, МГЦ 'freq_high': 6000.0, ## Нижняя рабочая частота, МГЦ - 'radius_inner': 100, ## Внутренний радиус диаграммы в пикселях для отображения частота-пеленг - 'radius_outter': 800 ## Наружний радиус диаграммы в пикселях для отображения частота-пеленг + 'radius_inner': 200, ## Внутренний радиус диаграммы в пикселях для отображения частота-пеленг + 'radius_outter': 550 ## Наружний радиус диаграммы в пикселях для отображения частота-пеленг } diff --git a/scripts/threats.gd b/scripts/threats.gd index 778b0f9b..0353ebe1 100644 --- a/scripts/threats.gd +++ b/scripts/threats.gd @@ -5,26 +5,26 @@ extends Node ## Цель class Threat: - var alt: float ## Текущая высота, метры. - var aoa: float ## Курсовой угол на источник сигнала, градусы. - var atick: float ## Тик обнаружения. - var baud: float ## Модуляционная скорость. - var fflags: Dictionary ## Флаги достоверности полей. - var freq: float ## Частота несущей или центральная частота, МГц. - var freqm: String ## Режим смены частоты. - var lat: float ## Текущие координаты, долгота в градусах. - var lon: float ## Текущие координаты, широта в градусах. - var power: float ## Уровень принимаемого сигнала, дБм. - var proto: String ## Тип протокола источника сигнала. - var rkrp: String ## Рекомендуемый режим помехи. - var rparams: String ## Рекомендуемые параметры помехи. - var salt: float ## Координаты старта, высота от уровня моря, м. - var slat: float ## Координаты старта, широта в градусах. - var slon: float ## Координаты старта, долгота в градусах. - var tick: int ## Время приёма сигнала, мс. - var tmod: String ## Тип модуляции. - var width: float ## Ширина занимаемого диапазона частот, МГц. - var id: int ## Идентификатор цели. + var alt: float ## Текущая высота, метры. + var aoa: float ## Курсовой угол на источник сигнала, градусы. + var atick: float ## Тик обнаружения. + var baud: float ## Модуляционная скорость. + var fflags: Dictionary ## Флаги достоверности полей. + var freq: float ## Частота несущей или центральная частота, МГц. + var freqm: String ## Режим смены частоты. + var lat: float ## Текущие координаты, долгота в градусах. + var lon: float ## Текущие координаты, широта в градусах. + var power: float ## Уровень принимаемого сигнала, дБм. + var proto: String ## Тип протокола источника сигнала. + var rkrp: String ## Рекомендуемый режим помехи. + var rparams: String ## Рекомендуемые параметры помехи. + var salt: float ## Координаты старта, высота от уровня моря, м. + var slat: float ## Координаты старта, широта в градусах. + var slon: float ## Координаты старта, долгота в градусах. + var tick: int ## Тик время приёма сигнала, мс. + var tmod: String ## Тип модуляции. + var width: float ## Ширина занимаемого диапазона частот, МГц. + var id: int ## Идентификатор цели. func _init(): Tools.get_members_names(self).any(func(vn): fflags[vn] = false) func _to_string() -> String: return 'номер:%d пеленг:%0.1f частота:%0.1f МГц' % [id, aoa, freq] @@ -50,7 +50,7 @@ func _ready() -> void: add_child(timer_check_lost) unit.connect('data_received', Callable(self, 'on_data_capsrpb_received')) timer_check_lost.connect('timeout', Callable(self, 'on_timer_check_lost').bind(REPSettings.ThreatParams.time_lost)) - timer_check_lost.start(REPSettings.ThreatParams.time_lost / 2.0) + timer_check_lost.start(REPSettings.ThreatParams.time_lost / 1000.0) ## Периодически проверяет приборы на связи From 21497246389a3f7e354b783180e1461bed28e9b8 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 15 Aug 2023 13:45:54 +0300 Subject: [PATCH 3/6] godot4 --- scenes/работа.tscn | 6 +++--- shaders/sector.gdshader | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scenes/работа.tscn b/scenes/работа.tscn index 40e059e8..56ce1a72 100644 --- a/scenes/работа.tscn +++ b/scenes/работа.tscn @@ -5,8 +5,8 @@ [ext_resource type="PackedScene" uid="uid://b5kjdyxuwsot5" path="res://scenes/canvas.tscn" id="2_bl0yt"] [ext_resource type="PackedScene" uid="uid://bq7haw1ypiv48" path="res://scenes/frame.tscn" id="3_l1omj"] [ext_resource type="PackedScene" uid="uid://da7w3vkhadfwe" path="res://scenes/button_flat.tscn" id="4_5es2r"] -[ext_resource type="Script" path="res://scenes/frm_threats.gd" id="4_hg23i"] [ext_resource type="Script" path="res://table/table.gd" id="4_mqhcf"] +[ext_resource type="Script" path="res://scenes/scrl_threats.gd" id="6_nr8d7"] [ext_resource type="FontFile" uid="uid://befva8r034a4v" path="res://data/DSEG7Classic-Regular.ttf" id="7_22fjb"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5ugj8"] @@ -34,8 +34,7 @@ offset_left = 1121.0 offset_top = 6.0 offset_right = 1594.0 offset_bottom = 642.0 -script = ExtResource("4_hg23i") -text = "Список целей" +script = null metadata/_edit_lock_ = true [node name="рамка-параметры-цели" parent="frm_threats" instance=ExtResource("3_l1omj")] @@ -204,6 +203,7 @@ offset_top = 57.0 offset_right = 464.0 offset_bottom = 306.0 horizontal_scroll_mode = 0 +script = ExtResource("6_nr8d7") [node name="tbl_threats" type="GridContainer" parent="frm_threats/scrl_threats"] layout_mode = 2 diff --git a/shaders/sector.gdshader b/shaders/sector.gdshader index 6597b4d0..e8d8cf50 100644 --- a/shaders/sector.gdshader +++ b/shaders/sector.gdshader @@ -11,7 +11,7 @@ uniform float dir: hint_range(0.0, 360.0) = 0.0; uniform float inner_clip: hint_range(0.0, 0.125) = 0.045; -const vec2 center = vec2(0.125, 0.125); /* Центр должен быть в (0.5, 0.5), но это не так */ +const vec2 center = vec2(0.125, 0.125); /* Центр. Должен быть в (0.5, 0.5), но это не так */ const float dsa = 0.0025; /* Относительное расстояние на котором выполняется сглаживание краёв по радиальным линиям */ const float dsr = 0.00025; /* Относительное расстояние на котором выполняется сглаживание краёв по круговым линиям */ From ae16989c3b89c55d2c8f94fbbdc88a1beb4f775b Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 15 Aug 2023 13:46:31 +0300 Subject: [PATCH 4/6] =?UTF-8?q?=D0=A7=D0=B8=D1=81=D1=82=D0=BA=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/frm_threats.gd | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100644 scenes/frm_threats.gd diff --git a/scenes/frm_threats.gd b/scenes/frm_threats.gd deleted file mode 100644 index ae162802..00000000 --- a/scenes/frm_threats.gd +++ /dev/null @@ -1,24 +0,0 @@ -extends "res://scenes/рамка.gd" - -var TableHeader = preload('res://table/header.tscn') -var TableNode = preload('res://table/node.tscn') -var db_th_id = 0 - - -func on_row_pressed(i_row: int): - var selected = $scrl_threats/tbl_threats.is_row_selected(i_row) - $scrl_threats/tbl_threats.set_row_selected(i_row, not selected) - - -func _ready() -> void: - assert(TableHeader) - assert(TableNode) - call_deferred('init_table') - - -func init_table(): - $scrl_threats/tbl_threats.set_header([TableHeader, TableHeader, TableHeader, TableHeader]) - $scrl_threats/tbl_threats.set_header_text(['Номер', 'Пеленг', 'Частота, МГц', 'Назначено']) - $scrl_threats/tbl_threats.set_columns_min_size([50, 140, 140, 100]) - $scrl_threats/tbl_threats.pin_header($scrl_threats, self) - $scrl_threats/tbl_threats.connect('row_pressed', Callable(self, 'on_row_pressed')) From a715287bfde327a236eb5a2ce179ee74b15bbfaf Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 15 Aug 2023 13:46:57 +0300 Subject: [PATCH 5/6] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0.=20=D0=9E=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=86=D0=B5=D0=BB=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=B2=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/scrl_threats.gd | 61 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 scenes/scrl_threats.gd diff --git a/scenes/scrl_threats.gd b/scenes/scrl_threats.gd new file mode 100644 index 00000000..bb28aad9 --- /dev/null +++ b/scenes/scrl_threats.gd @@ -0,0 +1,61 @@ +extends ScrollContainer + +const CellLineEdit = preload('res://scenes/ячейка-2.tscn') +const TableHeader = preload('res://table/header.tscn') +const TableNode = preload('res://table/node.tscn') + + +const TABLE_ROW = [CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit] +const TABLE_COLUMN_PARAM = ['id', 'aoa', 'freq', 'proto'] ## Параметры цели отображаемые в таблице. +const TABLE_HEADERS_TEXT = ['Номер', 'Пеленг', 'Частота, МГц', 'Протокол'] ## + + +func on_row_pressed(i_row: int): + var selected = $tbl_threats.is_row_selected(i_row) + $tbl_threats.set_row_selected(i_row, not selected) + + +func init_table(): + $tbl_threats.set_header([TableHeader, TableHeader, TableHeader, TableHeader]) + $tbl_threats.set_header_text(TABLE_HEADERS_TEXT) + $tbl_threats.set_columns_min_size([50, 140, 140, 100]) + $tbl_threats.pin_header(self, get_parent()) + $tbl_threats.connect('row_pressed', Callable(self, 'on_row_pressed')) + + +func _ready() -> void: + var th_table_id: = Dictionary() + Threats.connect('threat_new', Callable(self, 'on_threat_new').bind(th_table_id)) + Threats.connect('threat_lost', Callable(self, 'on_threat_lost').bind(th_table_id)) + call_deferred('init_table') + + +func rehash(th_table_id: Dictionary): + var rows_count = $tbl_threats.get_rows_count() + for i_row in rows_count: + var item = $tbl_threats.get_node2(0, i_row) + th_table_id[int(item.text)] = i_row + + +func on_threat_lost(_threats, th, th_table_id: Dictionary): + $tbl_threats.remove_row(th_table_id[th.id]) + th_table_id.clear() + rehash(th_table_id) + + +func on_threat_new(_threats, th, th_table_id): + var i_row = $tbl_threats.get_rows_count() + $tbl_threats.add_row(TABLE_ROW) + var row = map_th_to_row(th) + $tbl_threats.set_row_text(i_row, row) + th_table_id[th.id] = i_row + + +func map_th_to_row(th): + var row: = 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) + i_col += 1 + return row From 2f179b2745440d08413d9256cffe14b1ee585d8c Mon Sep 17 00:00:00 2001 From: sasha80 Date: Tue, 15 Aug 2023 14:36:01 +0300 Subject: [PATCH 6/6] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0.=20=D0=9E=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=86=D0=B5=D0=BB=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=B2=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/canvas.tscn | 4 ++-- table/table.gd | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/scenes/canvas.tscn b/scenes/canvas.tscn index de171bdd..a6d08416 100644 --- a/scenes/canvas.tscn +++ b/scenes/canvas.tscn @@ -8,7 +8,7 @@ [sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_2bft1"] size = Vector2(1600, 1200) -[sub_resource type="ShaderMaterial" id="ShaderMaterial_laka7"] +[sub_resource type="ShaderMaterial" id="ShaderMaterial_ogspn"] resource_local_to_scene = true shader = ExtResource("4_gb4a1") shader_parameter/color = Color(1, 1, 1, 0.168627) @@ -26,6 +26,6 @@ centered = false script = ExtResource("2_vkwmy") [node name="строб" parent="." instance=ExtResource("3_uhdvc")] -material = SubResource("ShaderMaterial_laka7") +material = SubResource("ShaderMaterial_ogspn") position = Vector2(560, 560) scale = Vector2(1100, 1100) diff --git a/table/table.gd b/table/table.gd index 68001e55..f7d64372 100644 --- a/table/table.gd +++ b/table/table.gd @@ -48,7 +48,7 @@ func pin_header(scrl: ScrollContainer, prnt: Control): scrl.remove_child(header) prnt.add_child(header) ## TODO: Это значение следует получить из темы - var v_separation: = 3.0 + var v_separation = get_theme_constant('v_separation') header.position = scrl.position - Vector2(0, header.size.y + v_separation) scroll = scrl scroll_adj = scrl.position @@ -466,6 +466,7 @@ func connect_columns(dest_node: Node, event_name: String, callback: String, clmn assert (OK == node.connect(event_name, conn)) node.set_meta(META_NAME_CALLEBLE, conn) + ## func set_rows_text(rows: Array) -> void: for i_row in rows.size():