Merge remote-tracking branch 'MaD_CaT/master'
# Conflicts: # scripts/interfer.gd
This commit is contained in:
@@ -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()
|
||||
@@ -127,7 +146,11 @@ func _ready() -> void:
|
||||
signaller.connect('emit_changed', Callable(self, 'on_emit_changed').bind(ecms))
|
||||
threats.connect('threat_lost', Callable(self, 'on_threats_lost').bind(ecms, unit_caps))
|
||||
var unit_nav = network.get_unit_instance('навигация')
|
||||
var unit_nav = network.units[key]
|
||||
unit_nav.connect('data_received', on_nav_data_received.bind(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('навигация')
|
||||
|
||||
|
||||
func on_nav_data_received(coords: Dictionary, unit_caps):
|
||||
@@ -292,6 +315,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)
|
||||
@@ -341,5 +371,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
|
||||
|
||||
@@ -295,18 +295,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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user