Files
uarep-ctl/scripts/threats.gd
2023-08-18 08:58:28 +03:00

85 lines
4.2 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 id: int ## Идентификатор цели.
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 width: float ## Ширина занимаемого диапазона частот, МГц.
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 dic_vals.has(vn))
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]
var timer_check_lost: = Timer.new()
add_child(timer_check_lost)
unit.connect('data_received', Callable(self, 'on_data_capsrpb_received'))
timer_check_lost.connect('timeout', Callable(self, 'on_timer_check_lost').bind(REPSettings.ThreatParams.time_lost))
timer_check_lost.start(REPSettings.ThreatParams.time_lost / 1000.0)
## Периодически удаляет устаревшие цели
func on_timer_check_lost(time_lost: int):
var tick = Time.get_ticks_msec()
for th in threats.values():
if (tick - th.tick) >= time_lost:
threats.erase(th.id)
emit_signal('threat_lost', threats, th)
## Производит приём целей
func on_data_capsrpb_received(unit: capsrpb.CapsRpb):
if not unit.json_dic.has('mis'):
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.tick = unit.tick
call_deferred('emit_signal', 'threat_update', threats, th)
else:
var th = Threat.new()
th.set_from_dic(dic_th)
th.tick = unit.tick
th.fflags['tick'] = true
threats[id] = th
call_deferred('emit_signal', 'threat_new', threats, th)