@@ -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