Доработка. Изменение алгоритма отправки помехи. Теперь таймер для каждой помехи свой. Добавлена настройка времени повторной отправки.

This commit is contained in:
MaD_CaT
2025-12-17 11:09:02 +03:00
parent ef33862d37
commit cd72001881
5 changed files with 34 additions and 43 deletions

View File

@@ -29,7 +29,6 @@ interfer/default_color0=Color(0.38, 0.47, 0.51, 1)
interfer/default_color1=Color(0.39, 0.44, 0.5, 1)
interfer/select_color=Color(1, 1, 1, 1)
interfer/interfer_color=Color(0.9, 0.1, 0.25, 0.9)
interfer/resend_timeout=1000.0
config/external_cu=false
config/unit_rr_request_period=20.0
config/kems_files_path="user://kems/"

View File

@@ -64,7 +64,8 @@ const SETTING_TABLE = [
['Включить работу по своим целям', TableEdit, TableToggle, 'Разрешает работу в секторе со своей целью'],
['Список своих протоколов', TableEdit, TableEdit, 'Список протоколов целей, по которым запрещено работать' ],
['Цвет кнопки \"Подавление\"', TableEdit, TableColorPick, 'Цвет кнопки. Введено по требованию ПЗ' ],
['Коэффициент ширины полосы излучения', TableEdit, TableEdit, 'Изменение ширины полосы излучения помехи в зависимости от цели'], ]
['Коэффициент ширины полосы излучения', TableEdit, TableEdit, 'Изменение ширины полосы излучения помехи в зависимости от цели'],
['Время повторной отправки помехи', TableEdit, TableEdit, 'Время повторной отправки помехи, с'], ]
## TODO: Придумать как избавиться от индексов
## Индексы строк таблицы.

View File

@@ -179,7 +179,6 @@ size_flags_vertical = 3
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
strips_rotation = 25.0
text = "Строб"
btn_tooltip = null
metadata/state = 0
[node name="btn_threats" parent="btns_select" groups=["группа-режим-выбора"] instance=ExtResource("8_k0iv2")]
@@ -189,7 +188,6 @@ size_flags_vertical = 3
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
strips_rotation = 25.0
text = "Цель"
btn_tooltip = null
metadata/state = 1
[node name="btn_fs_sector" parent="btns_select" groups=["группа-режим-выбора"] instance=ExtResource("8_k0iv2")]
@@ -199,7 +197,6 @@ size_flags_vertical = 3
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
strips_rotation = 25.0
text = "Сектор"
btn_tooltip = null
pressed = true
metadata/state = 2
@@ -354,7 +351,6 @@ size_flags_vertical = 3
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
strips_rotation = 25.0
text = "Сек. запрета"
btn_tooltip = null
metadata/state = 0
[node name="btn_work" parent="." instance=ExtResource("8_k0iv2")]
@@ -368,7 +364,6 @@ size_flags_vertical = 3
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
strips_rotation = 25.0
text = "Сек. работы"
btn_tooltip = null
metadata/state = 0
[node name="btn_all_work" type="TextureButton" parent="."]

View File

@@ -81,7 +81,6 @@ offset_right = 1583.0
offset_bottom = 85.0
strips_rotation = 10.0
text = "Прочитать"
btn_tooltip = ""
[node name="btn_flash_write" parent="." instance=ExtResource("2_eju8r")]
layout_mode = 0
@@ -91,7 +90,6 @@ offset_right = 1583.0
offset_bottom = 129.0
strips_rotation = 10.0
text = "Записать"
btn_tooltip = ""
[node name="btn_save" type="Button" parent="."]
layout_mode = 0

View File

@@ -95,6 +95,7 @@ const INTERFER_IQFILE = 'IQ-файл'
const POW_DEFAULT: float = 50.0
const PERIOD_DEFAULT = 7.5
const MIN_WIDTH_COEF = 1.0
const MIN_RESEND_TIMEOUT = 0.05
var msg6_num: int = 0 ## Счётчик сообщений "тип 6"
var msg8_num: int = 0 ## Счётчик сообщений "тип 8"
@@ -112,7 +113,10 @@ var gos_protocols: PackedStringArray ## Список протокол
var gos_nmfs: Array ## Список номеров блоков ФС для которых запрещена работа
var fs_closed: Dictionary ## Словарь секторов запрета
var width_coef: float = 1.5 ## Коэффициент расширения полосы
var now: = 0.0 ## Время с момента запуска
var resend_timeout: float = 1.0 ## Время повторной отправки команды
signal send_ecms(time_now) ## Сигнал отправки помех, если настало время
## Режимы работы АФСП и БПО (Протокол ТНИИС-СТЦ, пункт 2.5.10)
enum AFSP_BPO_MODE {
@@ -130,7 +134,7 @@ class Interfer:
var params: = {} ## Параметры помехи.
var get_params: Array[String] ## Запрос массива параметров (список запрошенных параметров).
var retss: int ## Значение счётчика сообщения в котором был произведён запрос массива параметров.
var tick_tx: int ## Тик время обновления цели, мс.
var tick_tx: float ## Тик время обновления цели, мс.
var source_interfer: String = '' ## Тип объекта по которой поставлена помеха.
var modulation: bool ## Модуляция для включения усилителей
var um: float ## Угол места для помехи.
@@ -202,20 +206,15 @@ func _ready() -> void:
id_array.append(i + 1)
var unit_caps = network.get_unit_instance('уарэп-капсрпб')
var unit_5p28 = network.get_unit_instance('уарэп-5п28')
var timer_check_state: = Timer.new()
add_child(timer_check_state)
var resend_timeout = ProjectSettings.get_setting('application/interfer/resend_timeout', 1000.0)
var ecms: Dictionary = {} ## Словарь помех.
var seczaps: Dictionary = {} ## Словарь секторов запрета
timer_check_state.connect('timeout', Callable(self, 'on_timer_check_state').bind(unit_caps, ecms, resend_timeout))
timer_check_state.start(resend_timeout / 1000.0)
unit_caps.connect('data_received', Callable(self, 'on_data_capsrpb_received').bind(ecms, seczaps))
unit_5p28.connect('get_interfers', Callable(self, 'on_get_interfers').bind(unit_5p28, ecms))
signaller.connect('interfer_create', Callable(self, 'on_interfer_create').bind(unit_caps, ecms))
signaller.connect('interfer_rcv', Callable(self, 'on_interfer_rcv').bind(unit_5p28, unit_caps, ecms))
signaller.connect('interfer_new', Callable(self, 'on_interfer_new').bind(unit_caps))
signaller.connect('interfer_new', Callable(self, 'on_interfer_new'))
signaller.connect('interfer_off_all', Callable(self, 'on_interfer_off_all').bind(unit_caps, ecms))
signaller.connect('th_aoa_update', Callable(self, 'on_th_aoa_update').bind(ecms, unit_caps))
signaller.connect('th_aoa_update', Callable(self, 'on_th_aoa_update').bind(ecms))
signaller.connect('interfer_off', Callable(self, 'on_interfer_off').bind(ecms, unit_caps))
signaller.connect('manual_control', Callable(self, 'on_manual_control'))
signaller.connect('full_auto', Callable(self, 'on_full_auto'))
@@ -227,10 +226,11 @@ func _ready() -> void:
signaller.connect('update_fs_closed', Callable(self, 'on_update_fs_closed'))
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, unit_caps))
threats.connect('threat_update', Callable(self, 'on_threats_update').bind(ecms))
ProjectSettings.connect('settings_changed', on_settings_changed)
var unit_nav: = network.get_unit_instance('навигация')
unit_nav.connect('data_received', on_nav_data_received.bind(unit_caps))
connect('send_ecms', Callable(self, 'on_send_ecms').bind(ecms, unit_caps))
call_deferred('emit_signal', 'interfer_resized', ecms)
@@ -263,16 +263,7 @@ func on_nav_data_received(coords: Dictionary, unit_caps):
msg8_num %= 0xffffffff
## Проверяет состояние отправки пакета и если не доставлен, повторяет отправку.
func on_timer_check_state(unit_instance, ecms, resend_timeout) -> void:
var tick = Time.get_ticks_msec()
for ecm in ecms.values():
if (tick - ecm.tick_tx) >= resend_timeout:
send_ecm(ecm, unit_instance)
ecm.tick_tx = tick
func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> void:
func on_th_aoa_update(threats: Dictionary, ecms: Dictionary) -> void:
gos_nmfs.clear()
for thr in threats.values():
var fs_arr: Array = []
@@ -304,12 +295,8 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> v
ecm.params['freq'] = thr.freq
ecm.kni = fposmod(thr.aoa - course, 360)
call_ecm_proc(ecm)
if ecm.nmfs in gos_nmfs:
if ecm.nmfs in gos_nmfs or prd.fs_caps_id[ecm.nmfs] in fs_closed:
signaller.emit_signal('interfer_off', ecm)
elif prd.fs_caps_id[ecm.nmfs] in fs_closed:
signaller.emit_signal('interfer_off', ecm)
else:
send_ecm(ecm, unit_instance)
signaller.emit_signal('fs_update_color', ecms)
prd.update_fs_state(ecms, trenazh_mode)
@@ -459,7 +446,7 @@ func on_interfer_rcv(interfer_params: Array, unit0, unit_caps, ecms) -> void:
unit0.on_interfer_accept(err)
func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interfer, power) -> void:
func interfer_create(_u, interfer_name, ecms, param, kni, id, dict, source_interfer, power) -> void:
var sz = ecms.size()
var ispp: int = 0
param['dur'] = 1.0 # Необходимо добавить параметры управления
@@ -502,13 +489,13 @@ func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interf
if interfer_name == 'off':
signaller.emit_signal('interfer_off', ecm)
thrs.erase(ispp)
ecm.tick_tx = Time.get_ticks_msec()
send_ecm(ecm, u)
if sz != ecms.size():
call_deferred('emit_signal', 'interfer_resized', ecms)
func send_ecm(ecm, unit0) -> void:
var time_now = Time.get_ticks_msec()
print_debug(time_now)
if ecm.krp != INTERFER_OFF:
if not ecm.modulation:
call_deferred('emit_signal', 'interfer_update', ecm)
@@ -518,6 +505,7 @@ func send_ecm(ecm, unit0) -> void:
unit0.tx_stack.append(json_data)
func on_interfer_off_all(_unit0, ecms: Dictionary) -> void:
for ecm in ecms.values():
signaller.emit_signal('interfer_off', ecm)
@@ -589,7 +577,7 @@ func on_threats_resized(th_dic):
thrs_dict = th_dic
func on_threats_update(threat, ecms, unit_caps):
func on_threats_update(threat, ecms):
var th_id = threat.id
var ecm = null
for ecm_i in thrs.keys():
@@ -613,8 +601,6 @@ func on_threats_update(threat, ecms, unit_caps):
if ecm.kni < 0:
ecm.kni += 360
set_nmfs(ecm)
if ecm != null:
send_ecm(ecm, unit_caps)
func find_threat(freq: int, aoa: float):
@@ -687,9 +673,8 @@ func on_interfer_off(ecm: Interfer, ecms, unit_caps):
interfer.call_deferred('emit_signal', 'interfer_resized', ecms)
func on_interfer_new(ecm, unit_caps):
func on_interfer_new(ecm):
call_ecm_proc(ecm)
send_ecm(ecm, unit_caps)
func on_settings_changed():
@@ -697,8 +682,9 @@ func on_settings_changed():
var protocols: String = ProjectSettings.get_setting('application/config/Список своих протоколов', '')
gos_protocols = protocols.split(",", true)
width_coef = float(ProjectSettings.get_setting('application/config/Коэффициент ширины полосы излучения', 1.5))
if width_coef < MIN_WIDTH_COEF:
width_coef = MIN_WIDTH_COEF
if width_coef < MIN_WIDTH_COEF: width_coef = MIN_WIDTH_COEF
resend_timeout = float(ProjectSettings.get_setting('application/config/Время повторной отправки помехи', 1.0))
if resend_timeout < MIN_RESEND_TIMEOUT: resend_timeout = MIN_RESEND_TIMEOUT
func call_ecm_proc(ecm):
@@ -727,3 +713,15 @@ func set_th_emit(th: threats.Threat, ecm: Interfer):
func check_width(param: Dictionary):
if (param['width'] < settings.WIDTH_MIN): param['width'] = settings.WIDTH_MIN
elif (param['width'] > settings.WIDTH_MAX): param['width'] = settings.WIDTH_MAX
func on_send_ecms(time_now, ecms, unit_caps):
for ecm in ecms.values():
if (time_now - ecm.tick_tx) >= resend_timeout:
send_ecm(ecm, unit_caps)
ecm.tick_tx = time_now
func _process(delta: float) -> void:
now += delta
emit_signal('send_ecms', now)