From 3d9ed1a1498f349ddb4126e168702a52745030f2 Mon Sep 17 00:00:00 2001 From: MaD_CaT Date: Thu, 25 Dec 2025 16:03:36 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0.=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=81=20=D1=82=D0=B8=D0=BF=D0=BE=D0=BC=209=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=9A=D0=90=D0=9F=D0=A1=20=D0=A0=D0=9F=D0=91=20?= =?UTF-8?q?=D1=81=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=D0=BE=D0=BC=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BB?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/threats.gd | 112 ++++++++++++++++++++++++++++----------------- 1 file changed, 71 insertions(+), 41 deletions(-) diff --git a/scripts/threats.gd b/scripts/threats.gd index dd536497..f4d34d5e 100644 --- a/scripts/threats.gd +++ b/scripts/threats.gd @@ -1,45 +1,48 @@ extends Node ## Работа с целями. +const MSG9_RESEND_TIMEOUT = 1.0 ## Время повторной отправки пакета 9 + ## Режимы работы АФСП и БПО (Протокол ТНИИС-СТЦ, пункт 2.5.10) enum AFSP_BPO_MODE { run = 1, test = 2 } -var msg9_num: int = 0 ## Счётчик сообщений "тип 9" -var gos_flag = true ## Флаг работать по своим целям -var gos_protocols: PackedStringArray ## Список протоколов своих целей -var afsp_bpo_mode: = AFSP_BPO_MODE.run ## Режим работы АФСП и БПО +var msg9_num: int = 0 ## Счётчик сообщений "тип 9" +var gos_flag = true ## Флаг работать по своим целям +var gos_protocols: PackedStringArray ## Список протоколов своих целей +var bpo_mode: = AFSP_BPO_MODE.run ## Режим работы АФСП и БПО +var bpo_mode_rx: = AFSP_BPO_MODE.run ## Режим работы БПО полученный от ## Цель 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 pow: float ## Уровень принимаемого сигнала, дБм. - var proto: String ## Тип протокола источника сигнала. - var rkrp: String ## Рекомендуемый режим помехи. - var rparams: Dictionary ## Рекомендуемые параметры помехи. - var salt: float ## Координаты старта, высота от уровня моря, м. - var slat: float ## Координаты старта, широта в градусах. - var slon: float ## Координаты старта, долгота в градусах. - var tick: int ## Тик время приёма сигнала, мс. - var tick_rx: int ## Тик время обновления цели, мс. - var tmod: String ## Тип модуляции. - var width: float ## Ширина занимаемого диапазона частот, МГц. - var selected: bool ## Флаг, что цель выбрана. - var auto_selected: bool = false ## Флаг автомата для целей - var emit_state: int = 0 ## 0 - подавление не назначено, 1 - назначено, 2 - выполняется - var nmfs: int ## Индекс модуля ФС, в зону действия которого попала цель - var priority: int ## Приоритет опасности цели - var gos: bool = false ## Своя или чужая цель + 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 pow: float ## Уровень принимаемого сигнала, дБм. + var proto: String ## Тип протокола источника сигнала. + var rkrp: String ## Рекомендуемый режим помехи. + var rparams: Dictionary ## Рекомендуемые параметры помехи. + var salt: float ## Координаты старта, высота от уровня моря, м. + var slat: float ## Координаты старта, широта в градусах. + var slon: float ## Координаты старта, долгота в градусах. + var tick: int ## Тик время приёма сигнала, мс. + var tick_rx: int ## Тик время обновления цели, мс. + var tmod: String ## Тип модуляции. + var width: float ## Ширина занимаемого диапазона частот, МГц. + var selected: bool ## Флаг, что цель выбрана. + var auto_selected: bool = false ## Флаг автомата для целей + var emit_state: int = 0 ## 0 - подавление не назначено, 1 - назначено, 2 - выполняется + var nmfs: int ## Индекс модуля ФС, в зону действия которого попала цель + var priority: int ## Приоритет опасности цели + var gos: bool = false ## Своя или чужая цель func _init(): clear_fflags() func _to_string() -> String: return 'номер: %d пеленг: %0.1f частота: %0.1f МГц' % [id, aoa, freq] @@ -60,17 +63,21 @@ func _ready() -> void: var unit_caps = network.get_unit_instance('уарэп-капсрпб') var unit_5p28 = network.get_unit_instance('уарэп-5п28') var timer_check_lost: = Timer.new() + var timer_msg9: = Timer.new() var timer_aoa_update: = Timer.new() add_child(timer_check_lost) add_child(timer_aoa_update) + add_child(timer_msg9) var threats = {} ## Список целей. Индекс - <номер цели> unit_caps.connect('data_received', Callable(self, 'on_data_capsrpb_received').bind(threats)) + unit_caps.connect('line_changed', Callable(self, 'on_caps_line_changed').bind(timer_msg9)) unit_5p28.connect('get_threats', Callable(self, 'on_get_threats').bind(unit_5p28, threats)) timer_check_lost.connect('timeout', Callable(self, 'on_timer_check_lost').bind(settings.ThreatParams.time_lost, threats)) timer_check_lost.start(settings.ThreatParams.time_lost / 1000.0) timer_aoa_update.connect('timeout', Callable(self, 'on_timer_aoa_update').bind(threats, timer_aoa_update)) timer_aoa_update.start(3.0) timer_aoa_update.one_shot = true + timer_msg9.connect('timeout', Callable(self, 'on_timer_msg9').bind(unit_caps, timer_msg9)) signaller.connect('rto_threat_sel', Callable(self, 'on_rto_threat_sel').bind(threats)) signaller.connect('rto_threat_unsel', Callable(self, 'on_rto_threat_unsel').bind(threats)) @@ -78,12 +85,11 @@ func _ready() -> void: signaller.connect('threat_selected', Callable(self, 'on_threat_selected').bind(threats)) signaller.connect('interfer_init', Callable(self, 'on_interfer_init').bind(threats)) signaller.connect('connect_work_signal', Callable(self, 'on_connect_work_signal').bind(threats)) - signaller.connect('режим_контроль', on_kontrol_mode) - signaller.connect('режим_работа', on_rabota_mode) + signaller.connect('режим_контроль', Callable(self, 'on_mode_change').bind(unit_caps, timer_msg9, AFSP_BPO_MODE.test)) + signaller.connect('режим_работа', Callable(self, 'on_mode_change').bind(unit_caps, timer_msg9, AFSP_BPO_MODE.run)) ProjectSettings.connect('settings_changed', on_settings_changed.bind(threats)) - ## Периодически удаляет устаревшие цели. func on_timer_check_lost(time_lost: int, threats: Dictionary): var tick: = Time.get_ticks_msec() @@ -143,8 +149,10 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb, threats: Dictionary): if not unit.json_dic.has('ts'): return if unit.json_dic['ts'] != 5: return if not unit.json_dic.has('mis'): return + if not unit.json_dic.has('sa'): return var mis = unit.json_dic['mis'] + bpo_mode_rx = int(unit.json_dic['sa']) var sz: = threats.size() for dic_th in mis: if dic_th is not Dictionary: @@ -183,17 +191,39 @@ func on_settings_changed(ths: Dictionary): set_gos(th) - func set_gos(th: Threat): - if gos_flag: - th.gos = false - elif (th.proto in gos_protocols) and th.fflags.proto: - th.gos = true + if gos_flag: th.gos = false + elif (th.proto in gos_protocols) and th.fflags.proto: th.gos = true func on_connect_work_signal(ths: Dictionary): emit_signal('threats_resized', ths) -func on_kontrol_mode(): afsp_bpo_mode = AFSP_BPO_MODE.test -func on_rabota_mode(): afsp_bpo_mode = AFSP_BPO_MODE.run +func on_mode_change(unit_caps, timer_msg9, state): + bpo_mode = state + send_msg9(unit_caps) + timer_msg9.start(MSG9_RESEND_TIMEOUT) + + +func send_msg9(unit_caps): + msg9_num += 1 + var json_data : Dictionary = {} + json_data['ts'] = 9 + json_data['ss'] = msg9_num + json_data['sa'] = bpo_mode + var pac = JSON.stringify(json_data).to_utf8_buffer() + unit_caps.tx_stack.append(pac) + + +func on_timer_msg9(unit_caps, timer_msg9): + if bpo_mode != bpo_mode_rx: + send_msg9(unit_caps) + else: + timer_msg9.stop() + + +func on_caps_line_changed(unit_caps, timer_msg9): + if unit_caps.online: + send_msg9(unit_caps) + timer_msg9.start(MSG9_RESEND_TIMEOUT)