From 3b1d11af88177d2ef93df83335afbe7e9f05415c Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Fri, 16 Jan 2026 15:05:56 +0300 Subject: [PATCH 1/4] =?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=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=86=D0=B2=D0=B5=D1=82=D0=B0=20=D0=B8=D0=BD?= =?UTF-8?q?=D0=B4=D0=B8=D0=BA=D0=B0=D1=82=D0=BE=D1=80=D0=BE=D0=B2=20=D0=B8?= =?UTF-8?q?=D0=B7=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=87=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B7=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=D0=BA=D1=83=20"=D0=A6=D0=B2=D0=B5=D1=82=20=D0=BA=D0=BD=D0=BE?= =?UTF-8?q?=D0=BF=D0=BA=D0=B8=20=D0=BF=D0=BE=D0=B4=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/frame-threats/scroll-threats.gd | 13 +++++++++++-- scenes/работа/работа.gd | 8 ++++++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/scenes/frame-threats/scroll-threats.gd b/scenes/frame-threats/scroll-threats.gd index c224021b..8308ca39 100644 --- a/scenes/frame-threats/scroll-threats.gd +++ b/scenes/frame-threats/scroll-threats.gd @@ -5,7 +5,7 @@ class_name scroll_threats extends ScrollContainer const CellLineEdit = preload('res://table/ячейка-2.tscn') ## Ячейка таблицы. const TableHeader = preload('res://table/header.tscn') ## Ячейка заголовок таблицы. -const EmitLed = preload('res://scenes/frame-threats/emit-led.tscn') ## Ячейка заголовок таблицы. +const EmitLed = preload('res://scenes/frame-threats/emit-led.tscn') ## Ячейка символа излучения const TABLE_HEADER = [ TableHeader, TableHeader, TableHeader, TableHeader , TableHeader ] ## Описание ряда заголовка. const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit, EmitLed ] ## Описание ряда. @@ -16,6 +16,8 @@ const TABLE_COLUMN_SIZE = [ 65, 70, 110, 140, const TABLE_TEXT_ROWS = 4 const EMIT_STATE_COL = 4 +var color_emit: Color + ## Снимает выделение цели. func on_rto_threat_unsel(_th_id): $table.clear_rows_selected() @@ -49,6 +51,7 @@ func _ready() -> void: signaller.connect('rto_threat_sel', Callable(self, 'on_rto_threat_sel').bind($table)) signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel')) $table.connect('row_pressed', Callable(self, 'on_row_pressed')) + ProjectSettings.connect('settings_changed', on_settings_changed) call_deferred('init_table') @@ -74,7 +77,7 @@ func on_threat_update(th, table_index: Dictionary): emit_txr.self_modulate = Color.ORANGE elif th.emit_state == 2: emit_txr.visible = true - emit_txr.self_modulate = Color.RED + emit_txr.self_modulate = color_emit @@ -128,3 +131,9 @@ func disable_edit(tbl, num_col: int, i_row: int): for col in num_col: var node: LineEdit = tbl.get_node2(col, i_row) node.editable = false + + +func on_settings_changed(): + var json_col = ProjectSettings.get_setting('application/config/%s' % 'Цвет кнопки \"Подавление\"', '[1.0, 1.0, 1.0, 1.0]') + var arr_col = JSON.parse_string(json_col) + color_emit = Color(arr_col[0], arr_col[1], arr_col[2], arr_col[3]) diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index 2fb1bec2..4ed764ac 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -135,9 +135,13 @@ func on_user_panning(): $btn_center.button_pressed = false func on_settings_changed(): + var json_col = ProjectSettings.get_setting('application/config/%s' % 'Цвет кнопки \"Подавление\"', '[1.0, 1.0, 1.0, 1.0]') + var arr_col = JSON.parse_string(json_col) + col_btn_act = Color(arr_col[0], arr_col[1], arr_col[2], arr_col[3]) if arr_col else Color.WHITE + gos_flag = ProjectSettings.get_setting('application/config/Включить работу по своим целям', true) - 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_emit = Color(arr_col[0], arr_col[1], arr_col[2], 1.0) + color_ecm = Color(arr_col[0], arr_col[1], arr_col[2], 1.0) color_select = ProjectSettings.get_setting('application/interfer/select_color', Color(1.0, 1.0, 1.0, 1.0)) color_closed = ProjectSettings.get_setting('application/interfer/closed_sectors', Color(0.0, 0.0, 0.0, 1.0)) min_zoom = ProjectSettings.get_setting('application/config/map_minimum_zoom', 5) From fa8d677d374bdee6129affc8453a2c91da6f7224 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Fri, 16 Jan 2026 15:06:19 +0300 Subject: [PATCH 2/4] =?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=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B7=D0=BD=D0=B0=D1=87=D0=BA=D0=B0=20=D0=B8=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D0=BC=D0=B5=D1=80=D0=B0=20=D0=B8=D0=B7=D1=83?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2=20=D1=82=D0=B0=D0=B1?= =?UTF-8?q?=D0=BB=D0=B8=D1=86=D0=B5=20=D1=86=D0=B5=D0=BB=D0=B5=D0=B9.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/frame-threats/emit-led.tscn | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/scenes/frame-threats/emit-led.tscn b/scenes/frame-threats/emit-led.tscn index da699172..e7aa1f1d 100644 --- a/scenes/frame-threats/emit-led.tscn +++ b/scenes/frame-threats/emit-led.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=2 format=3 uid="uid://d012h4hxf2anf"] -[ext_resource type="Texture2D" uid="uid://b3woliae871je" path="res://data/отметка-неопред.png" id="1_0a4l0"] +[ext_resource type="Texture2D" uid="uid://blx6c1o1nogks" path="res://data/связь.png" id="1_0a4l0"] [node name="emit-led" type="Control"] layout_mode = 3 @@ -14,10 +14,11 @@ layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 -offset_left = 26.0 -offset_top = 11.0 -offset_right = 3.0 -offset_bottom = -12.0 +offset_left = 25.0 +offset_top = 15.0 +offset_right = 17.0 +offset_bottom = 7.0 grow_horizontal = 2 grow_vertical = 2 +scale = Vector2(0.3, 0.3) texture_normal = ExtResource("1_0a4l0") From 309d23ea2c0ea4166ed77ba5f27cab662d47fe90 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Fri, 16 Jan 2026 15:08:21 +0300 Subject: [PATCH 3/4] =?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=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B2=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8?= =?UTF-8?q?=D1=86=D1=83=20=D0=BF=D0=BE=D0=BC=D0=B5=D1=85=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D1=8F=20=D0=B2=D1=8B=D1=85=D0=BE?= =?UTF-8?q?=D0=B4=D0=BD=D0=BE=D0=B9=20=D0=BC=D0=BE=D1=89=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B8=20=D1=81=20=D1=83=D1=81=D0=B8=D0=BB=D0=B8=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D0=B5=D0=B9.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/frame-ecm-list/scroll-ecm-list.gd | 50 +++++++++++++++++++----- scripts/prd.gd | 34 +++++++++++++--- scripts/pribor-prd.gd | 26 ++++++------ 3 files changed, 83 insertions(+), 27 deletions(-) diff --git a/scenes/frame-ecm-list/scroll-ecm-list.gd b/scenes/frame-ecm-list/scroll-ecm-list.gd index 1ff8dc60..39933aae 100644 --- a/scenes/frame-ecm-list/scroll-ecm-list.gd +++ b/scenes/frame-ecm-list/scroll-ecm-list.gd @@ -4,11 +4,13 @@ extends ScrollContainer ## Отображает список помех в таблице. const CellLineEdit = preload('res://table/ячейка-2.tscn') ## Ячейка таблицы. const TableHeader = preload('res://table/header.tscn') ## Ячейка заголовок таблицы. +const EmitLed = preload('res://scenes/frame-threats/emit-led.tscn') ## Ячейка символа излучения + +const TABLE_HEADER = [ TableHeader, TableHeader, TableHeader , TableHeader , TableHeader ] ## Описание ряда заголовка. +const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit , CellLineEdit , EmitLed ] ## Описание ряда. +const TABLE_HEADERS_TEXT = ['№', 'Название', 'Пеленг', 'Состояние' , 'Излучение' ] ## Заголовки таблицы. +const TABLE_COLUMN_SIZE = [ 65, 80, 80, 130 , 90 ] ## Ширины колонок. -const TABLE_HEADER = [ TableHeader, TableHeader, TableHeader , TableHeader ] ## Описание ряда заголовка. -const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit , CellLineEdit ] ## Описание ряда. -const TABLE_HEADERS_TEXT = ['№', 'Название', 'Пеленг', 'Состояние' ] ## Заголовки таблицы. -const TABLE_COLUMN_SIZE = [ 65, 100, 90, 170 ] ## Ширины колонок. ## Состояние выполнения сеанса помехи const INTERFER_STATE = { @@ -45,8 +47,11 @@ const COLUMN_NUMBER = 0 const COLUMN_NAME = 1 const COLUMN_AOA = 2 const COLUMN_STATE = 3 +const COLUMN_EMITED = 4 +const TABLE_TEXT_ROWS = 4 var course = 0.0 ## Курс корабля +var color_emit: Color func on_rto_threat_unsel(_th_id): $table.clear_rows_selected() @@ -91,6 +96,7 @@ func _ready(): call_deferred('init_table') var unit_nav = network.get_unit_instance('навигация') unit_nav.connect('data_received', on_navi_data_received) + ProjectSettings.connect('settings_changed', on_settings_changed) func init_table(): @@ -102,9 +108,19 @@ func init_table(): func on_interfer_update(ecm, table_index): var row = map_th_to_row(ecm) - if table_index.has(ecm.ispp): - var i_row = table_index[ecm.ispp] - $table.set_row_text(i_row, row) + if not table_index.has(ecm.ispp): return + var i_row = table_index[ecm.ispp] + $table.set_row_text(i_row, row) + var power: bool = prd.get_fs_power(ecm.nmfs) + var emit_node = $table.get_node2(COLUMN_EMITED, i_row) + var emit_txr = emit_node.get_node('texture-led') + emit_txr.position.x = 40.0 + ecm.active = power + if power: + emit_txr.visible = true + emit_txr.self_modulate = color_emit + else: + emit_txr.visible = false func on_interfer_new(ecm, table_index): @@ -116,7 +132,7 @@ func on_interfer_new(ecm, table_index): var i_row = $table.get_rows_count() $table.add_row(TABLE_ROW) $table.set_row_text(i_row, row) - $table.set_row_editable(i_row, false) + disable_edit($table, TABLE_TEXT_ROWS, i_row) $table.set_node_user_data(0, i_row, ecm) table_index[ecm.ispp] = i_row $table.clear_rows_selected() @@ -149,7 +165,7 @@ func rehash(table_index: Dictionary): ## Преобразует цель в строку таблицы func map_th_to_row(ecm) -> Array: var row: = Array() - row.resize(TABLE_ROW.size()) + row.resize(TABLE_ROW.size() - 1) row[COLUMN_NUMBER] = '%s' % ecm.ispp row[COLUMN_NAME] = '' if INTERFER_NAMES.has(ecm.krp): @@ -175,3 +191,19 @@ func on_interfer_recommendate(ecm): func on_navi_data_received(data: Dictionary): course = data.get('k', 0.0) + + +func on_settings_changed(): + var json_col = ProjectSettings.get_setting('application/config/%s' % 'Цвет кнопки \"Подавление\"', '[1.0, 1.0, 1.0, 1.0]') + var arr_col = JSON.parse_string(json_col) + color_emit = Color(arr_col[0], arr_col[1], arr_col[2], arr_col[3]) + + +## Отключает возможность редактирования LineEdit в таблице.[br] +## [param tbl] - таблица,[br] +## [param num_col] - номер колонки,[br] +## [param i_row] - номер столбца.[br] +func disable_edit(tbl, num_col: int, i_row: int): + for col in num_col: + var node: LineEdit = tbl.get_node2(col, i_row) + node.editable = false diff --git a/scripts/prd.gd b/scripts/prd.gd index 8a56a356..24d6c0d9 100644 --- a/scripts/prd.gd +++ b/scripts/prd.gd @@ -3,6 +3,7 @@ extends Node enum PrdState {WORK, CONTROL} const TIME_YAU07_SEND = 50 +const MIN_UM_POWER = 200 ## минимальная мощность с усилителя, что бы отобразить значёк излучения ## Границы секторов блоков ФС по частоте в режиме РТО. const FS_BAND_RTO: Dictionary = { @@ -86,10 +87,10 @@ const FS_PRD: Dictionary = { 26: ['уарэп-яу07-3к', 37], 27: ['уарэп-яу07-2к', 27], } -var fs_dict: Dictionary ## Словарь с модулями ФС -var prd_dict: Dictionary ## Словарь с приборами ПРД -var course = 0.0 ## Курс корабля -var fs_caps_id: Dictionary ## Словарь соответствия номеров ФС от КАПС РПБ внутрипрограммной нумерации +var fs_dict: Dictionary ## Словарь с модулями ФС +var prd_dict: Dictionary ## Словарь с приборами ПРД +var course = 0.0 ## Курс корабля +var fs_caps_id: Dictionary ## Словарь соответствия номеров ФС от КАПС РПБ внутрипрограммной нумерации class Fs: @@ -124,14 +125,17 @@ class Fs: var ready: bool = false ## Готовность сектора к излучению var caps_online: bool = false ## Состояние связи с КАПС РПБ var yau_07_online: bool = false ## Состояние связи ЯУ-07 + var lit: int ## Литера ФС + var power: bool = false ## Признак излучения усилителей signal update_modulation(index) func _init(i, p_name): prd_name = p_name index = i - if UM_PORTS.has(index/4): - um_port = UM_PORTS[index/4] + lit = index/4 + if UM_PORTS.has(lit): + um_port = UM_PORTS[lit] func set_modulation(val): modulation = val @@ -158,6 +162,14 @@ class Fs: func set_ready(): ready = isg and caps_online and yau_07_online + func set_power(power_arr: Array): + power = false + for val in power_arr: + if val > MIN_UM_POWER: + power = true + break + + class PRD: enum STATE_DEVICE { NONE, @@ -502,3 +514,13 @@ func on_yau07_line_changed(unit_yau07, prd_pribor): fs.yau_07_online = unit_yau07.online fs.set_ready() signaller.emit_signal('fs_update_state', fs_dict) + + +func get_fs_power(nmfs: int): + if not fs_caps_id.has(nmfs): return false + var fs_index: int = fs_caps_id[nmfs] + var prd_obj: PRD = prd_dict[FS_PRD[fs_index][0]] + var fs: Fs = prd_obj.fs_dic[fs_index] + var power_arr: Array = prd_obj.unit_control.power_um_ukp(prd_obj.unit_yau07.status, fs.lit + 1, [], true) + fs.set_power(power_arr) + return fs.power diff --git a/scripts/pribor-prd.gd b/scripts/pribor-prd.gd index 39577c58..182ca5e1 100644 --- a/scripts/pribor-prd.gd +++ b/scripts/pribor-prd.gd @@ -310,7 +310,7 @@ func on_data_received(unit_pribor: Object) -> void: if interes == 'RAY_CTRL': count_packets_power += 1 elif interes != '': - tek_litera[_get_ray_key(state)] = power_um_ukp(status, current_litera, tek_litera[_get_ray_key(state)]) + tek_litera[_get_ray_key(state)] = power_um_ukp(status, current_litera, tek_litera[_get_ray_key(state)], false) power_for_litera[current_litera] = tek_litera count_packets_power += 1 @@ -1157,50 +1157,52 @@ static func _should_apply_rule(fs_num: int, rule: Dictionary, results: Dictionar ## Получение мощности при выполнении контроля -static func power_um_ukp(status: PackedByteArray, litera: int, pwr_result: Array) -> Array: +static func power_um_ukp(status: PackedByteArray, litera: int, pwr_result: Array, mode_work: bool) -> Array: const Constants: Dictionary = {'POWER_UKP_1' : 31, 'POWER_UKP_2': 63} var power_values: Array = [] var base_offset = 0 var iteration: int = 6 - var ug_valid: bool = (status[0] >> 2) & 1 - + if not len(status): return power_values + var ukp1_valid: bool = (status[0] >> 2) & 1 + var ukp2_valid: bool = (status[0] >> 3) & 1 match litera: 1: var value = status.decode_u16(Constants.POWER_UKP_1 + 2 * 7) - if ug_valid: + if ukp1_valid: power_values = [value] 2: base_offset = Constants.POWER_UKP_1 - if ug_valid: + if ukp1_valid: for i in iteration: power_values.append(status.decode_u16(base_offset + 2 * i)) 3: base_offset = Constants.POWER_UKP_2 - if ug_valid: + if ukp2_valid: for i in iteration: power_values.append(status.decode_u16(base_offset + 2 * i)) 4: base_offset = Constants.POWER_UKP_1 - if ug_valid: + if ukp1_valid: for i in iteration: power_values.append(status.decode_u16(base_offset + 2 * i)) 5: base_offset = Constants.POWER_UKP_2 - if ug_valid: + if ukp2_valid: for i in iteration: power_values.append(status.decode_u16(base_offset + 2 * i)) 6: base_offset = Constants.POWER_UKP_1 - if ug_valid: + if ukp1_valid: for i in iteration: power_values.append(status.decode_u16(base_offset + 2 * i)) 7: base_offset = Constants.POWER_UKP_2 - if ug_valid: + if ukp2_valid: for i in iteration: power_values.append(status.decode_u16(base_offset + 2 * i)) - power_values = update_max_power_values(power_values, pwr_result) + if not mode_work: + power_values = update_max_power_values(power_values, pwr_result) return power_values From e37232280651d9cef979ea1c3583ad1b7290cd1c Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Fri, 16 Jan 2026 15:08:55 +0300 Subject: [PATCH 4/4] =?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=20=D1=81=D0=B5=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B0=D1=85=20=D0=B4=D0=B8=D0=B0=D0=BF=D0=B0=D0=B7=D0=BE?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=20=D1=88=D1=83=D0=BC=20=D0=BF=D1=80=D0=B8=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D1=82=D0=BD=D0=BE=D0=BC=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D0=B5=20=D0=BE=D1=82=20=D1=83?= =?UTF-8?q?=D1=81=D0=B8=D0=BB=D0=B8=D1=82=D0=B5=D0=BB=D0=B5=D0=B9=20=D0=BC?= =?UTF-8?q?=D0=BE=D1=89=D0=BD=D0=BE=D1=81=D1=82=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/работа/работа.gd | 6 +----- scripts/interfer.gd | 1 + 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index 4ed764ac..10d86c7d 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -155,10 +155,6 @@ func on_settings_changed(): color_closed *= Color(1.0, 1.0, 1.0, 0.0) color_closed_emit *= Color(1.0, 1.0, 1.0, 1.0) - var json_col = ProjectSettings.get_setting('application/config/%s' % 'Цвет кнопки \"Подавление\"', '[1.0, 1.0, 1.0, 1.0]') - var arr_col = JSON.parse_string(json_col) - col_btn_act = Color(arr_col[0], arr_col[1], arr_col[2], arr_col[3]) if arr_col else Color.WHITE - ## Обработчик сигнала изменения списка целей. func on_threats_resized(ths: Dictionary): @@ -571,7 +567,7 @@ func set_fs_color(ecms): continue if ecm.krp != interfer.INTERFER_OFF: fs_active[prd.fs_caps_id[ecm.nmfs]] = null - if ecm.svk == SVK_EMIT: + if ecm.active: fs_emit[prd.fs_caps_id[ecm.nmfs]] = null update_fs_colors() diff --git a/scripts/interfer.gd b/scripts/interfer.gd index 77c3ae53..7a23863d 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -135,6 +135,7 @@ class Interfer: var um: float ## Угол места для помехи. var nmfs: int = 0 ## Номер модуля ФС в нумерации СТЦ var priority: int = 0 ## Приоритет помехи + var active: bool = false ## Флаг, что фиксируется мощность на выходном усилителе func _to_string() -> String: return 'номер: %d название: %s частота: %0.1f МГц пеленг: %0.1f гр.' % [ispp, ITERFER_MODE[krp][0], params['freq'], kni]