From 67f35b7ffdd7cd66292c006cdd2678c62fdfd387 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Wed, 27 Aug 2025 13:45:02 +0300 Subject: [PATCH] =?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=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=B0=D1=87?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=BE=D0=BC=D0=B5=D1=80=D0=B0=20=D0=B1=D0=BB?= =?UTF-8?q?=D0=BE=D0=BA=D0=B0=20=D1=84=D1=81=20=D0=B2=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=B0=D0=BD=D0=B4=D0=B5=20=D0=BF=D0=BE=D1=81=D1=82=D0=B0=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D0=BA=D0=B8=20=D0=BF=D0=BE=D0=BC=D0=B5=D1=85=D0=B8?= =?UTF-8?q?.=20=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=B0=D1=87=D0=B0=20=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B8=20=D0=B2=D0=BE=D1=81=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D0=B8=D0=BC=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/tabs-switch/tab-switch.tscn | 4 +- scenes/работа/работа.tscn | 2 +- scripts/interfer.gd | 127 +++++++++++++++++++++++++---- scripts/prd.gd | 13 ++- 4 files changed, 122 insertions(+), 24 deletions(-) diff --git a/scenes/tabs-switch/tab-switch.tscn b/scenes/tabs-switch/tab-switch.tscn index 44dafe7..f60771c 100644 --- a/scenes/tabs-switch/tab-switch.tscn +++ b/scenes/tabs-switch/tab-switch.tscn @@ -36,15 +36,15 @@ theme_override_styles/tab_focus = SubResource("StyleBoxEmpty_41d34") theme_override_styles/tab_disabled = SubResource("StyleBoxEmpty_cw2ss") theme_override_styles/tabbar_background = SubResource("StyleBoxEmpty_nmdfd") theme_override_styles/panel = SubResource("StyleBoxEmpty_vap7n") -current_tab = 1 +current_tab = 0 script = ExtResource("1_fg0vd") [node name="Работа" parent="tab_switch" instance=ExtResource("2_u7p16")] -visible = false layout_mode = 2 metadata/_tab_index = 0 [node name="Контроль" parent="tab_switch" instance=ExtResource("3_txp0s")] +visible = false layout_mode = 2 metadata/_tab_index = 1 diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 6d64518..64b1bbd 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -305,6 +305,6 @@ text = "Масштаб:" [connection signal="drag_continue" from="." to="." method="_on_drag_continue"] [connection signal="toggled" from="btn_view" to="." method="on_button_view_toggled"] [connection signal="toggled" from="chk_auto" to="." method="on_value_changed"] -[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate"] [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"] diff --git a/scripts/interfer.gd b/scripts/interfer.gd index b3025d1..e9b8bb4 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -4,22 +4,38 @@ class_name Iterfer extends Node ## Режимы помехи. const ITERFER_MODE = { - 'off': ['Откл', ['freq', 'width'], 0], - 'srni1': ['СРН-И1', ['freq', 'width'], 1], - 'srnm2': ['СРН-М2', ['freq', 'width'], 2], - 'srngps': ['СРН-GPS', ['freq', 'width'], 3], - 'lchm1': ['ЛЧМ-1', ['freq', 'width'], 10], - 'lchm2': ['ЛЧМ-2', ['freq', 'width'], 16], - 'mchm1': ['МЧМ-1', ['freq', 'width'], 11], - 'pdm2': ['ПД-М2', ['freq', 'width'], 12], - 'pdm4': ['ПД-М4', ['freq', 'width'], 13], - 'pdm4s': ['ПД-М4С', ['freq', 'width'], 14], - 'pdchm': ['ПД-ЧМ', ['freq', 'width'], 15], - 'svi1': ['СВ-И1', ['freq', 'width'], 20], - 'svm2': ['СВ-М2', ['freq', 'width'], 21], - 'k1': ['K1', ['freq', 'width', 'dur', 'period'], 50], - 'ozp1': ['ОЗП-1', ['freq', 'width'], 51] } + 'off': ['Откл', {}, 0], + 'srni1': ['СРН-И1', {}, 1], + 'srnm2': ['СРН-М2', {}, 2], + 'srngps': ['СРН-GPS', {}, 3], + 'lchm1': ['ЛЧМ-1', {}, 10], + 'lchm2': ['ЛЧМ-2', {}, 16], + 'mchm1': ['МЧМ-1', {}, 11], + 'pdm2': ['ПД-М2', {}, 12], + 'pdm4': ['ПД-М4', {}, 13], + 'pdm4s': ['ПД-М4С', {}, 14], + 'pdchm': ['ПД-ЧМ', {}, 15], + 'svi1': ['СВ-И1', SVI1_PARAMS, 20], + 'svm2': ['СВ-М2', SVM2_PARAMS, 21], + 'k1': ['K1', K1_PARAMS, 50], + 'ozp1': ['ОЗП-1', OZP1_PARAMS, 51] } +const K1_PARAMS = {'files': ['K1'], + 'call_proc': 'call_all_diap'} +const OZP1_PARAMS = {'files': ['OZP1'], + 'call_proc': 'call_all_diap'} +# Файл : Диапазон: ['имя файла', частота] +const SVI1_PARAMS = {'files': {1: ['SVI1_LIT2', 1017], + 2: ['SVI1_LIT3', 1156]}, + 'call_proc': 'call_diap'} +const SVM2_PARAMS = {'files': {1: ['SVM2_LIT2', 1017], + 2: ['SVM2_LIT3', 1156]}, + 'call_proc': 'call_diap'} + +const PD_CHM = {'files': { + + }, + 'call_proc': 'call_pd_chm'} const SOURCE_INTERFER = ['th','fs','cu'] const ID_INTERFERS_LEN = 63 ## Размер пула номеров целей. @@ -31,6 +47,7 @@ var id_array: Array ## Массив id воздействий. var thrs: Dictionary ## Словарь воздействия для целей, ключ - id воздействия. var fs: Dictionary ## Словарь воздействий для секторов, ключ - id воздействия. var cu: Dictionary ## Словарь воздействий для 5П-28, ключ - id воздействия. +var thrs_dict: Dictionary ## Ссылка на словарь целей var auto_enabled: bool = false ## Режим автомата var emit_enable: bool = true ## Разрешить излучение @@ -48,6 +65,7 @@ class Interfer: var source_interfer: String = '' ## Тип объекта по которой поставлена помеха. var modulation: bool ## Модуляция для включения усилителей var um: float ## Угол места для помехи. + var nmfs: int = 0 ## Номер модуля ФС в нумерации СТЦ func _to_string() -> String: return 'номер: %d название: %s частота: %0.1f МГц пеленг: %0.1f гр.' % [ispp, ITERFER_MODE[krp][0], params['freq'], kni] @@ -58,9 +76,10 @@ class Interfer: data_to_json['ss'] = msg_num data_to_json['ispp'] = ispp data_to_json['krp'] = krp + data_to_json['nmfs'] = nmfs if krp != INTERFER_OFF: data_to_json['kni'] = kni - data_to_json['powp'] = powp # TODO: Необходимо добавить управление мощностью + data_to_json['powp'] = powp data_to_json['params'] = params data_to_json['get'] = get_params var pac = JSON.stringify(data_to_json).to_utf8_buffer() @@ -128,6 +147,8 @@ func _ready() -> void: signaller.connect('interfer_prinuditelno', Callable(self, 'on_interfer_prinuditelno')) signaller.connect('emit_changed', Callable(self, 'on_emit_changed').bind(ecms)) threats.connect('threat_lost', Callable(self, 'on_threats_lost').bind(ecms, unit_caps)) + threats.connect('threats_resized', Callable(self, 'on_threats_resized')) + threats.connect('threat_update', Callable(self, 'on_threats_update').bind(ecms)) var key = settings.get_unit_key('навигация') var unit_nav = network.units[key] unit_nav.connect('data_received', on_nav_data_received.bind(unit_caps)) @@ -295,6 +316,13 @@ func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interf ecm.source_interfer = source_interfer ecm.modulation = emit_enable ecm.um = param.get('um', 15.0) # Значение по умолчанию + var ecm_params = ITERFER_MODE[interfer_name][1] + if ecm_params.has('call_proc'): + var call_set_params = Callable(self, ecm_params['call_proc']).bind(ecm, ecm_params) + call_set_params.call() + var set_nmfs_ok = set_nmfs(ecm) + if set_nmfs_ok != Error.OK: + log.error('Ошибка выбора модуля ФС для помехи: %s' %[ecm.ispp]) signaller.emit_signal('interfer_new', ecm) if interfer_name == 'off': signaller.emit_signal('interfer_off', ecm, ecms, thrs) @@ -344,5 +372,70 @@ func push_id(id: int) -> void: id_array.sort() -func on_emit_changed(state, ecms) -> void: +func on_emit_changed(state, _ecms) -> void: emit_enable = state + + +func call_all_diap(ecm, ecm_params: Dictionary): + ecm.params['filename'] = ecm_params['files'] + + +func call_diap(ecm, ecm_params: Dictionary): + var fs_index_arr: Array + prd.get_fs_index(ecm, fs_index_arr) + if len(fs_index_arr): + var band = fs_index_arr[0] / 4 + if ecm_params['files'].has(band): + ecm.params['filename'] = ecm_params['files'][band][0] + ecm.params['freq'] = ecm_params['files'][band][1] + + +func set_nmfs(ecm): + var fs_index_arr: Array + prd.get_fs_index(ecm, fs_index_arr) + if len(fs_index_arr): + ecm.nmfs = prd.FS_PRD[fs_index_arr[0]][1] + return Error.OK + else: + return Error.FAILED + + +func on_threats_resized(th_dic): + thrs_dict = th_dic + + +func on_threats_update(threat, ecms): + if threat.tmod != 'fm': return + var th_fm_dict: Dictionary + for th_index in thrs_dict: + if thrs_dict[th_index].tmod != 'fm': continue + var fs_index_arr: Array + prd.find_fs_index(thrs_dict[th_index].aoa, thrs_dict[th_index].freq, fs_index_arr) + if fs_index_arr.size() == 0: continue + if th_fm_dict.has(fs_index_arr[0]): + th_fm_dict[fs_index_arr[0]][th_index] = thrs_dict[th_index] + else: + var th_dict: Dictionary + th_fm_dict[fs_index_arr[0]] = th_dict + th_fm_dict[fs_index_arr[0]][th_index] = thrs_dict[th_index] + for key in th_fm_dict: + if len(th_fm_dict[key]) < 2: continue + var nmfs = prd.FS_PRD[key][1] + for ecm in ecms.values(): + if nmfs != ecm.nmfs: continue + if ecm.krp != 'pdchm': continue + + +func get_freq_range(freq_range_dict: Dictionary, th_dict: Dictionary): + var min_range_abs: int = 6000 + var max_range_abs: int = 0 + for key_i in th_dict: + var min_range: int = 6000 + var max_range: int = 0 + for key_j in th_dict: + if key_i == key_j: continue + var freq_range = abs(th_dict[key_i].freq - th_dict[key_j].freq) + if freq_range < min_range: min_range = freq_range + if freq_range > max_range: max_range = freq_range + if min_range < min_range_abs: min_range_abs = min_range + if max_range > max_range_abs: max_range_abs = max_range diff --git a/scripts/prd.gd b/scripts/prd.gd index 5bf1ae0..c5866d7 100644 --- a/scripts/prd.gd +++ b/scripts/prd.gd @@ -297,18 +297,23 @@ func get_fs_param(index: int) -> Array: ## Функция возвращает массив с индексами модулей ФС для выбранной помехи func get_fs_index(ecm, fs_index_arr): + var angle: float = ecm.kni + 45.0 + if ecm.params.has('freq'): + find_fs_index(angle, ecm.params['freq'], fs_index_arr) + + +func find_fs_index(aoa: float, freq: int, fs_index_arr: Array): var sector: int var band: Array - var angle: float = ecm.kni + 45.0 + var angle = aoa if angle > 360.0: angle -= 360.0 for sec in FS_SECTORS.values(): if float(angle) >= sec[0] and float(angle) <= sec[1]: sector = FS_SECTORS.find_key(sec) for diap in FS_FREQ.values(): - if ecm.params.has('freq'): - if ecm.params['freq'] >= diap[0] and ecm.params['freq'] <= diap[1]: - band.append(FS_FREQ.find_key(diap)) + if freq >= diap[0] and freq <= diap[1]: + band.append(FS_FREQ.find_key(diap)) for item in band: fs_index_arr.append(item * 4 + sector)