85 lines
4.3 KiB
GDScript
85 lines
4.3 KiB
GDScript
extends Node
|
|
|
|
##
|
|
|
|
|
|
## Цель
|
|
class Threat:
|
|
var alt: float ## Текущая высота, метры.
|
|
var aoa: float ## Курсовой угол на источник сигнала, градусы.
|
|
var atick: float ## Тик обнаружения.
|
|
var baud: float ## Модуляционная скорость.
|
|
var fflags: Dictionary ## Флаги достоверности полей.
|
|
var freq: float ## Частота несущей или центральная частота, МГц.
|
|
var freqm: String ## Режим смены частоты.
|
|
var lat: float ## Текущие координаты, долгота в градусах.
|
|
var lon: float ## Текущие координаты, широта в градусах.
|
|
var power: float ## Уровень принимаемого сигнала, дБм.
|
|
var proto: String ## Тип протокола источника сигнала.
|
|
var rkrp: String ## Рекомендуемый режим помехи.
|
|
var rparams: String ## Рекомендуемые параметры помехи.
|
|
var salt: float ## Координаты старта, высота от уровня моря, м.
|
|
var slat: float ## Координаты старта, широта в градусах.
|
|
var slon: float ## Координаты старта, долгота в градусах.
|
|
var tick: int ## Время приёма сигнала, мс.
|
|
var tmod: String ## Тип модуляции.
|
|
var utime: Dictionary ## Время крайнего обновления.
|
|
var width: float ## Ширина занимаемого диапазона частот, МГц.
|
|
var id: int ## Идентификатор цели.
|
|
|
|
func _init(): Tools.get_members_names(self).any(func(vn): fflags[vn] = false)
|
|
func _to_string() -> String: return 'номер:%d пеленг:%0.1f частота:%0.1f МГц' % [id, aoa, freq]
|
|
|
|
func set_from_dic(dic_vals: Dictionary):
|
|
var items: = fflags.keys().filter(func(vn): return vn in dic_vals)
|
|
items.any(func(vn): set(vn, dic_vals[vn]); fflags[vn] = true; return false)
|
|
|
|
|
|
signal threat_new(threats: Dictionary, th: Threat)
|
|
signal threat_lost(threats: Dictionary, th: Threat)
|
|
signal threat_update(threats: Dictionary, th: Threat)
|
|
|
|
var threats = {} ## Список целей. Индекс - <источник цели>:<номер цели> Источник цели может быть: 'RPB', 'SIGMA', 'RLKS', 'MP405'
|
|
|
|
|
|
func _ready() -> void:
|
|
Log.info('Модуль обработки целей готов')
|
|
var unit_key = REPSettings.get_unit_key('уарэп-капсрпб-отп')
|
|
var unit = REPNetwork.units[unit_key]
|
|
unit.connect('data_received', Callable(self, 'on_data_capsrpb_received'))
|
|
var timer_check_lost: = Timer.new()
|
|
add_child(timer_check_lost)
|
|
timer_check_lost.connect('timeout', Callable(self, 'on_timer_check_lost').bind(unit, REPSettings.ThreatParams.time_lost[0]))
|
|
timer_check_lost.start(REPSettings.ThreatParams.time_lost[0] / 2.0)
|
|
|
|
|
|
## Периодически проверяет приборы на связи
|
|
func on_timer_check_lost(unit, time_lost: int):
|
|
""" Периодически проверяет приборы на связи """
|
|
for th in threats.values():
|
|
if (unit.tick - th.atick) >= time_lost:
|
|
threats.erase(th.id)
|
|
call_deferred('emit_signal', 'threat_lost', threats, th)
|
|
|
|
|
|
## Приём целей
|
|
func on_data_capsrpb_received(unit: capsrpb.CapsRpb):
|
|
if 'mis' not in unit.json_dic:
|
|
return
|
|
var mis = unit.json_dic['mis']
|
|
for dic_th in mis:
|
|
if dic_th.has('id'):
|
|
var id = int(dic_th['id'])
|
|
if threats.has(id):
|
|
var th = threats[id]
|
|
th.set_from_dic(dic_th)
|
|
th.atick = unit.tick
|
|
call_deferred('emit_signal', threat_update, threats, th)
|
|
else:
|
|
var th = Threat.new()
|
|
th.set_from_dic(dic_th)
|
|
th.atick = unit.tick
|
|
th.fflags['atick'] = true
|
|
threats[id] = th
|
|
call_deferred('emit_signal', 'threat_new', threats, th)
|