Files
uarep-ctl/scripts/threats.gd

86 lines
4.1 KiB
GDScript

extends Node
@onready var timer_check_lost: = Timer.new()
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'))
add_child(timer_check_lost)
timer_check_lost.connect('timeout', Callable(self, 'on_timer_check_lost'))
timer_check_lost.start(REPSettings.ThreatParams.time_lost[0] / 2000.0)
func on_timer_check_lost():
var tick = Time.get_ticks_msec()
for id in threats.keys():
var th = threats[id]
if (tick - th.atick) >= REPSettings.ThreatParams.time_lost[0]:
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 'id' in dic_th:
var id = int(dic_th['id'])
if id in threats:
var th = threats[id]
th.set_from_dic(dic_th)
th.atick = Time.get_ticks_msec()
call_deferred('emit_signal', 'threat_update', threats, th)
else:
var th = Threat.new()
th.set_from_dic(dic_th)
th.atick = Time.get_ticks_msec()
th.fflags['atick'] = true
threats[id] = th
call_deferred('emit_signal', 'threat_new', threats, th)