Merge remote-tracking branch 'MaD_CaT/master'
This commit is contained in:
@@ -425,14 +425,10 @@ func sel_fs_sector(event):
|
||||
|
||||
|
||||
func set_fs_color(ecm):
|
||||
var fs_index_arr: Array = []
|
||||
prd.get_fs_index(ecm, fs_index_arr)
|
||||
if ecm.krp != interfer.INTERFER_OFF:
|
||||
for item in fs_index_arr:
|
||||
fs_active[item] = null
|
||||
fs_active[prd.fs_caps_id[ecm.nmfs]] = null
|
||||
else:
|
||||
for item in fs_index_arr:
|
||||
fs_active.erase(item)
|
||||
fs_active.erase(prd.fs_caps_id[ecm.nmfs])
|
||||
update_fs_colors()
|
||||
|
||||
|
||||
|
||||
@@ -4,42 +4,71 @@ class_name Iterfer extends Node
|
||||
|
||||
## Режимы помехи.
|
||||
const ITERFER_MODE = {
|
||||
'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] }
|
||||
INTERFER_OFF: [INTERFER_OFF, {}, 0],
|
||||
'srni1': ['ПСП + ФМ-2', SRNI1_PARAMS, 1],
|
||||
'srnm2': ['Линейная ЧМ', SRNM2_PARAMS, 2],
|
||||
'srngps': [INTERFER_IQFILE, SRNGPS_PARAMS, 3],
|
||||
'lchm1': ['Линейная ЧМ', LCHM1_PARAMS, 10],
|
||||
'lchm2': ['Линейная ЧМ', LCHM2_PARAMS, 16],
|
||||
'mchm1': [INTERFER_IQFILE, MCHM1_PARAMS, 11],
|
||||
'pdm2': [INTERFER_IQFILE, PDM2_PARAMS, 12],
|
||||
'pdm4': [INTERFER_IQFILE, PDM4_PARAMS, 13],
|
||||
'pdm4s': [INTERFER_IQFILE, PDM4S_PARAMS, 14],
|
||||
'pdchm': [INTERFER_IQFILE, PDCHM_PARAMS, 15],
|
||||
'svi1': [INTERFER_IQFILE, SVI1_PARAMS, 20],
|
||||
'svm2': [INTERFER_IQFILE, SVM2_PARAMS, 21],
|
||||
'k1': [INTERFER_IQFILE, K1_PARAMS, 50],
|
||||
'ozp1': [INTERFER_IQFILE, OZP1_PARAMS, 51] }
|
||||
|
||||
const K1_PARAMS = {'files': ['K1'],
|
||||
const SRNI1_PARAMS = {'par_names' : ['freq', 'width']}
|
||||
const SRNM2_PARAMS = {'par_names' : ['freq', 'width', 'period']}
|
||||
const SRNGPS_PARAMS = {'par_names' : ['freq', 'filename'],
|
||||
'files': 'SRNGPS.pcm',
|
||||
'call_proc': 'call_all_diap'}
|
||||
const OZP1_PARAMS = {'files': ['OZP1'],
|
||||
const LCHM1_PARAMS = {'par_names' : ['freq', 'width', 'period']}
|
||||
const LCHM2_PARAMS = {'par_names' : ['freq', 'width', 'period']}
|
||||
const MCHM1_PARAMS = {'par_names' : ['freq', 'filename'],
|
||||
'files': 'MCHM1.pcm',
|
||||
'call_proc': 'call_all_diap'}
|
||||
const PDM2_PARAMS = {'par_names' : ['freq', 'filename'],
|
||||
'files': 'PDM2_20.pcm',
|
||||
'call_proc': 'call_all_diap'}
|
||||
const PDM4_PARAMS = {'par_names' : ['freq', 'filename'],
|
||||
'files': 'PDM4_20.pcm',
|
||||
'call_proc': 'call_all_diap'}
|
||||
const PDM4S_PARAMS = {'par_names' : ['freq', 'filename'],
|
||||
'files': 'PDM4S_5.pcm',
|
||||
'call_proc': 'call_all_diap'}
|
||||
const K1_PARAMS = {'files' : 'K1.pcm',
|
||||
'call_proc' : 'call_all_diap',
|
||||
'par_names' : ['freq', 'filename']}
|
||||
const OZP1_PARAMS = {'files': 'OZP1.pcm',
|
||||
'call_proc': 'call_all_diap',
|
||||
'par_names' : ['freq', 'filename']}
|
||||
# Файл : Диапазон: ['имя файла', частота]
|
||||
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 SVI1_PARAMS = {'files': {1: ['SVI1_LIT2.pcm', 1017],
|
||||
2: ['SVI1_LIT3.pcm', 1156]},
|
||||
'call_proc': 'call_diap',
|
||||
'par_names' : ['freq', 'filename']}
|
||||
const SVM2_PARAMS = {'files': {1: ['SVM2_LIT2.pcm', 1017],
|
||||
2: ['SVM2_LIT3.pcm', 1156]},
|
||||
'call_proc': 'call_diap',
|
||||
'par_names' : ['freq', 'filename']}
|
||||
|
||||
const PD_CHM = {'files': {
|
||||
|
||||
},
|
||||
'call_proc': 'call_pd_chm'}
|
||||
# Файл : Ключ (ширина): ['имя файла']
|
||||
const PDCHM_PARAMS = {'files': {
|
||||
5 : 'pdchm_5.pcm',
|
||||
10: 'pdchm__0.pcm',
|
||||
20: 'pdchm_20.pcm',
|
||||
40: 'pdchm_40.pcm' },
|
||||
'call_proc': 'call_pdchm',
|
||||
'par_names' : ['freq', 'filename'],}
|
||||
|
||||
const SOURCE_INTERFER = ['th','fs','cu']
|
||||
const EXCLUDE_INTERFER = ['srni1', 'srnm2', 'srngps', 'svi1', 'svm2']
|
||||
const ID_INTERFERS_LEN = 63 ## Размер пула номеров целей.
|
||||
const INTERFER_OFF = 'off'
|
||||
const INTERFER_IQFILE = 'IQ-файл'
|
||||
const POW_DEFAULT: float = 100.0
|
||||
var msg6_num: int = 0 ## Счётчик сообщений "тип 6"
|
||||
var msg8_num: int = 0 ## Счётчик сообщений "тип 8"
|
||||
@@ -75,12 +104,15 @@ class Interfer:
|
||||
data_to_json['ts'] = 6
|
||||
data_to_json['ss'] = msg_num
|
||||
data_to_json['ispp'] = ispp
|
||||
data_to_json['krp'] = krp
|
||||
data_to_json['krp'] = ITERFER_MODE[krp][0]
|
||||
data_to_json['nmfs'] = nmfs
|
||||
if krp != INTERFER_OFF:
|
||||
data_to_json['kni'] = kni
|
||||
data_to_json['powp'] = powp
|
||||
data_to_json['params'] = params
|
||||
data_to_json['params'] = {}
|
||||
for key in ITERFER_MODE[krp][1]['par_names']:
|
||||
if params.has(key):
|
||||
data_to_json['params'][key] = params[key]
|
||||
data_to_json['get'] = get_params
|
||||
var pac = JSON.stringify(data_to_json).to_utf8_buffer()
|
||||
return pac
|
||||
@@ -148,10 +180,11 @@ func _ready() -> void:
|
||||
var unit_nav = network.get_unit_instance('навигация')
|
||||
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))
|
||||
threats.connect('threat_update', Callable(self, 'on_threats_update').bind(ecms, unit_caps))
|
||||
|
||||
|
||||
func on_nav_data_received(coords: Dictionary, unit_caps):
|
||||
var ship_time = Time.get_datetime_dict_from_system()
|
||||
var data_to_json = {
|
||||
'ts': 8,
|
||||
'ss': msg8_num,
|
||||
@@ -160,7 +193,13 @@ func on_nav_data_received(coords: Dictionary, unit_caps):
|
||||
'long': coords.get('longitude', 0),
|
||||
'lat': coords.get('latitude', 0),
|
||||
'course': coords.get('k', 0),
|
||||
'speed': coords.get('speed', 0) }
|
||||
'speed': coords.get('speed', 0),
|
||||
'year': ship_time['year'],
|
||||
'month': ship_time['month'],
|
||||
'day': ship_time['day'],
|
||||
'hour': ship_time['hour'],
|
||||
'minute': ship_time['minute'],
|
||||
'second': ship_time['second'],}
|
||||
var json_data = JSON.stringify(data_to_json).to_utf8_buffer()
|
||||
unit_caps.tx_stack.append(json_data)
|
||||
msg8_num += 1
|
||||
@@ -242,14 +281,24 @@ func on_interfer_create(interfer_name, sel_threats, fs_arr, power, u, ecms) -> v
|
||||
var param: Dictionary = {}
|
||||
var kni: float = item[0]
|
||||
var id = item[3]
|
||||
param['freq'] = item[1]
|
||||
param['width'] = item[2]
|
||||
var th = null
|
||||
if not interfer_name in EXCLUDE_INTERFER:
|
||||
th = find_threat(item[1], kni)
|
||||
if th != null:
|
||||
param['freq'] = th.freq
|
||||
param['width'] = th.width
|
||||
else:
|
||||
param['freq'] = item[1]
|
||||
param['width'] = item[2]
|
||||
if (param['width'] < settings.WIDTH_MIN):
|
||||
param['width'] = settings.WIDTH_MIN
|
||||
elif (param['width'] > settings.WIDTH_MAX):
|
||||
param['width'] = settings.WIDTH_MAX
|
||||
interfer_create(u, interfer_name, ecms, param, kni, id, fs, SOURCE_INTERFER[1], power)
|
||||
|
||||
if th == null:
|
||||
interfer_create(u, interfer_name, ecms, param, kni, id, fs, SOURCE_INTERFER[1], power)
|
||||
else:
|
||||
id = th.id
|
||||
interfer_create(u, interfer_name, ecms, param, kni, id, thrs, SOURCE_INTERFER[0], power)
|
||||
|
||||
func on_interfer_rcv(interfer_params: Array, unit0, ecms) -> void:
|
||||
var err: bool = false
|
||||
@@ -284,9 +333,8 @@ func on_interfer_rcv(interfer_params: Array, unit0, ecms) -> void:
|
||||
func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interfer, power) -> void:
|
||||
var sz = ecms.size()
|
||||
var ispp: int = 0
|
||||
if interfer_name == 'k1':
|
||||
param['dur'] = 1.0 # Необходимо добавить параметры управления
|
||||
param['period'] = 1.0 # Необходимо добавить параметры управления
|
||||
param['dur'] = 1.0 # Необходимо добавить параметры управления
|
||||
param['period'] = 1.0 # Необходимо добавить параметры управления
|
||||
var key = dict.find_key(id)
|
||||
if source_interfer != SOURCE_INTERFER[2]:
|
||||
if key != null:
|
||||
@@ -390,6 +438,17 @@ func call_diap(ecm, ecm_params: Dictionary):
|
||||
ecm.params['freq'] = ecm_params['files'][band][1]
|
||||
|
||||
|
||||
func call_pdchm(ecm, ecm_params: Dictionary):
|
||||
var temp_key: float = settings.WIDTH_MIN
|
||||
for key in ecm_params['files'].keys():
|
||||
if key > temp_key: temp_key = key
|
||||
for key in ecm_params['files'].keys():
|
||||
if key < ecm.params['width']: continue
|
||||
if key < temp_key:
|
||||
temp_key = key
|
||||
ecm.params['filename'] = ecm_params['files'][int(temp_key)]
|
||||
|
||||
|
||||
func set_nmfs(ecm):
|
||||
var fs_index_arr: Array
|
||||
prd.get_fs_index(ecm, fs_index_arr)
|
||||
@@ -404,38 +463,78 @@ func on_threats_resized(th_dic):
|
||||
thrs_dict = th_dic
|
||||
|
||||
|
||||
func on_threats_update(threat, ecms):
|
||||
if threat.tmod != 'fm': return
|
||||
func on_threats_update(threat, ecms, unit_caps):
|
||||
var th_id = threat.id
|
||||
var ecm = null
|
||||
for ecm_i in thrs.keys():
|
||||
if thrs[ecm_i] == th_id:
|
||||
ecm = ecms[ecm_i]
|
||||
ecm.params['freq'] = threat.freq
|
||||
ecm.kni = threat.aoa
|
||||
set_nmfs(ecm)
|
||||
if threat.tmod != 'fm':
|
||||
if ecm != null:
|
||||
send_ecm(ecm, unit_caps)
|
||||
return
|
||||
var th_fm_dict: Dictionary
|
||||
var fs_index_arr: Array
|
||||
prd.find_fs_index(threat.aoa, threat.freq, fs_index_arr)
|
||||
if fs_index_arr.size() == 0:
|
||||
if ecm != null:
|
||||
send_ecm(ecm, unit_caps)
|
||||
return
|
||||
var fs_index = fs_index_arr[0]
|
||||
var nmfs = prd.FS_PRD[fs_index][1]
|
||||
if ecm == null:
|
||||
for ecm_i in ecms.values():
|
||||
if nmfs != ecm_i.nmfs: continue
|
||||
if ecm_i.svk != 1: continue
|
||||
ecm = ecm_i
|
||||
if ecm == null: return
|
||||
|
||||
for th_index in thrs_dict:
|
||||
if thrs_dict[th_index].tmod != 'fm': continue
|
||||
var fs_index_arr: Array
|
||||
fs_index_arr = []
|
||||
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
|
||||
if fs_index_arr[0] != fs_index: continue
|
||||
th_fm_dict[th_index] = thrs_dict[th_index]
|
||||
if len(th_fm_dict) > 1:
|
||||
pass
|
||||
send_ecm(ecm, unit_caps)
|
||||
|
||||
|
||||
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
|
||||
var key_min = null
|
||||
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
|
||||
var width = (th_dict[key_i].width / 2) + (th_dict[key_j].width / 2)
|
||||
var freq_range = abs(th_dict[key_i].freq - th_dict[key_j].freq) + width
|
||||
if freq_range < min_range:
|
||||
key_min = key_j
|
||||
min_range = freq_range
|
||||
var max_width = 0
|
||||
for key in PDCHM_PARAMS['files'].keys():
|
||||
if max_width < key: max_width = key
|
||||
if min_range > max_width:
|
||||
th_dict.erase(key_i)
|
||||
continue
|
||||
else:
|
||||
if key_min == null: continue
|
||||
freq_range_dict[key_i] = [th_dict[key_i], th_dict[key_min], min_range]
|
||||
|
||||
|
||||
func find_threat(freq: int, aoa: float):
|
||||
var fs_index_arr = []
|
||||
prd.find_fs_index(aoa, freq, fs_index_arr)
|
||||
if not fs_index_arr.size(): return null
|
||||
var fs_index = fs_index_arr[0]
|
||||
for th in thrs_dict.values():
|
||||
fs_index_arr = []
|
||||
prd.find_fs_index(th.aoa, th.freq, fs_index_arr)
|
||||
if not fs_index_arr.size(): continue
|
||||
if fs_index_arr[0] == fs_index:
|
||||
return th
|
||||
return null
|
||||
|
||||
@@ -296,7 +296,7 @@ func get_fs_param(index: int) -> Array:
|
||||
|
||||
## Функция возвращает массив с индексами модулей ФС для выбранной помехи
|
||||
func get_fs_index(ecm, fs_index_arr):
|
||||
var angle: float = ecm.kni + 45.0
|
||||
var angle: float = ecm.kni
|
||||
if ecm.params.has('freq'):
|
||||
find_fs_index(angle, ecm.params['freq'], fs_index_arr)
|
||||
|
||||
@@ -304,7 +304,7 @@ func get_fs_index(ecm, fs_index_arr):
|
||||
func find_fs_index(aoa: float, freq: int, fs_index_arr: Array):
|
||||
var sector: int
|
||||
var band: Array
|
||||
var angle = aoa
|
||||
var angle = aoa + 45.0
|
||||
if angle > 360.0:
|
||||
angle -= 360.0
|
||||
for sec in FS_SECTORS.values():
|
||||
|
||||
Reference in New Issue
Block a user