Merge remote-tracking branch 'refs/remotes/Sasha/master'

This commit is contained in:
lepshiy
2025-10-28 15:33:29 +03:00
15 changed files with 225 additions and 75 deletions

View File

@@ -4,6 +4,7 @@
- [Проброс последовательных портов через Ethernet](http://gitea.srez.local:3000/sasha80/uart-forwarder)
- [Сборка Godot из исходников](http://gitea.srez.local:3000/sasha80/godot-build)
- [Сервер карт](http://gitea.srez.local:3000/sasha80/map-tiles)
- [Генераторы PCM файлов для модулей ФС](http://gitea.srez.local:3000/danil_tim/Signals_to_the_MP-550)
# Ссылки на имитаторы
@@ -35,4 +36,4 @@
- После клонирования запустить скрипт `git-hooks-config.sh`
- В среде **Windows** запуск скрипта `git-hooks-config.sh` производить из оболочки `git bash`
- Нужно обновить `settings.json`
- При необходимости обновить `settings.json`

View File

@@ -61,8 +61,8 @@ if [[ -z "$IP_PORT_IN" ]]; then
fi
# Дублирование трафика на другой порт. Перенаправить копии входящих UDP-пакетов
# с порта ${IP_PORT_IN} на порт ${IP_PORT_OUT} (или любой другой), чтобы оригинальная программа
# продолжала работать с портом ${IP_PORT_IN}, а копии пакетов отправлялись на ${IP_PORT_OUT}:
# с порта ${IP_PORT_IN} на порт ${IP_PORT_OUT}, чтобы другой процесс продолжал
# работать с портом ${IP_PORT_IN}, а копии пакетов отправлялись на ${IP_PORT_OUT}:
echo "${SUDO_PASS}" | sudo -S iptables -t nat -A PREROUTING -p udp --dport "${IP_PORT_IN}" -j REDIRECT --to-ports "${IP_PORT_OUT}"
echo "${SUDO_PASS}" | sudo -S iptables -A INPUT -p udp --dport "${IP_PORT_IN}" -j ACCEPT
echo "${SUDO_PASS}" | sudo -S iptables -t nat -L -n -v

View File

@@ -37,7 +37,7 @@ config/emsg_files_path="user://emsg/"
config/settings_path="user://settings.json"
config/unit_bpo_request_period=20.0
interfer/emit_color=Color(0.58, 0.471, 0.51, 0.2)
interfer/emit_sel_color=Color(1, 1, 1, 1)
interfer/closed_sectors=Color(0, 0, 0, 1)
[autoload]

View File

@@ -56,7 +56,14 @@ offset_right = 20.0
offset_bottom = 20.0
theme_override_styles/panel = SubResource("1")
script = ExtResource("1_ui6sg")
font_size = null
[node name="recommend" type="ReferenceRect" parent="."]
visible = false
z_as_relative = false
layout_mode = 2
border_color = Color(0, 0.549509, 0.921779, 1)
border_width = 5.0
editor_only = false
[node name="back" type="Sprite2D" parent="."]
material = SubResource("ShaderMaterial_hhdyc")

View File

@@ -4,10 +4,12 @@ extends PanelContainer
func set_text(val: String): $button.set_text(val)
func set_disabled(val: bool): disabled = val
func set_rec_visible(val: bool): $recommend.visible = val
func get_text(): return $button.get_text()
func is_pressed(): return $button.is_pressed()
func is_toggle_mode(): return $button.is_toggle_mode()
var _pressed: = false
@export var texture_state0: Texture2D = preload('res://data/кнопка-квадрат-0.png'):

View File

@@ -57,7 +57,6 @@ size_flags_vertical = 3
tooltip_text = "Включает принудительную помеху"
strips_rotation = 15.0
text = "СРН"
font_size = 1
metadata/rfi_name = "srn"
[node name="btn_jtids" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")]
@@ -67,7 +66,6 @@ size_flags_horizontal = 3
size_flags_vertical = 3
strips_rotation = 15.0
text = "СПРС"
font_size = 1
metadata/rfi_name = "sprs"
[node name="btn_kupd" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")]
@@ -77,7 +75,6 @@ size_flags_vertical = 3
tooltip_text = "Кнопка для принудительного включения группы секторов в режим КУПД"
strips_rotation = 15.0
text = "КУПД"
font_size = 1
metadata/rfi_name = "kupd"
[node name="btn_panika" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")]
@@ -87,7 +84,6 @@ size_flags_vertical = 3
tooltip_text = "Кнопка для принудительного включения группы секторов в режим КУПД"
strips_rotation = 15.0
text = "Паника"
font_size = 1
metadata/rfi_name = "<off>"
[node name="btn_cancel" parent="grd_forced" groups=["прин-секторы-срн"] instance=ExtResource("4_7ys3c")]
@@ -96,5 +92,4 @@ size_flags_horizontal = 3
size_flags_vertical = 3
strips_rotation = 15.0
text = "Очистить"
font_size = 1
metadata/rfi_name = "<off>"

View File

@@ -91,6 +91,8 @@ func map_th_to_row(th) -> Array:
for param_name in TABLE_COLUMN_PARAM:
var val = th.get(param_name)
row[i_col] = '%0.1f' % val if val is float else '%s' % val
if not th.fflags[param_name]:
row[i_col] = ''
i_col += 1
return row

View File

@@ -416,6 +416,7 @@ metadata/unit_name = ["уарэп-эмс"]
metadata/online_proc = "on_line_changed"
[node name="label" type="Label" parent="pribor_uf"]
self_modulate = Color(0, 1, 0, 1)
layout_mode = 0
offset_left = 15.0
offset_top = -34.0

View File

@@ -64,7 +64,9 @@ const SETTING_TABLE = [
['Адрес БПО правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'],
['Период опроса состояния БПО, секунды', TableEdit, TableEdit, 'Время в секундах' ],
['Период опроса состояния АФСП, секунды', TableEdit, TableEdit, 'Время в секундах' ],
['уареп-трасса', TableEdit, TableEdit, 'IP-адрес для связи с Трассой [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'] ]
['уареп-трасса', TableEdit, TableEdit, 'IP-адрес для связи с Трассой [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'],
['Включить работу по своим целям', TableEdit, TableToggle, 'Разрешает работу в секторе со своей целью'],
['Список своих протоколов', TableEdit, TableEdit, 'Список протоколов целей, по которым запрещено работать' ], ]
const EXTERNAL_CU = 16 ## Внешнее целеуказание
const TRASSA = 17
@@ -72,6 +74,7 @@ const SUPPRESS = 18 ## Строка - Подавление
const KEYBOARD = 19 ## Строка - Виртуальная клавиатура
const HIDE_EMS2 = 20 ## Строка - Скрыть вкладку ЭМС 2
const COMMIT = 21 ## Строка - Версия УАРЭП
const GOS_BTN = 51 ## Разрешить работу по своим целям
var name_to_line_index: = {} ## Для преобразования названия параметра в номер строки
@@ -102,6 +105,10 @@ func on_vk_pressed(btn) -> void:
signaller.emit_signal('kb_pressed', btn.button_pressed)
func on_gos_pressed(btn) -> void:
ProjectSettings.set_setting('application/config/Включить работу по своим целям', btn.button_pressed)
func on_ems2_pressed(btn) -> void:
var state = btn.button_pressed
signaller.emit_signal('ems2_hide_pressed', state)
@@ -175,7 +182,7 @@ func setting_tab():
var child = node_values[0]
if child is CheckButton:
child.connect('pressed', Callable(self, 'on_checkbutton_pressed').bind(i))
var val = ProjectSettings.get_setting('application/config/%s' % param_name)
var val = ProjectSettings.get_setting('application/config/%s' % param_name, true)
child.set_pressed(val)
else:
if settings_data.has(param_name):
@@ -222,6 +229,8 @@ func button_settings():
ems2_hide_node.connect('pressed', on_ems2_pressed.bind(ems2_hide_node))
ems2_hide_node.set_pressed(true)
on_ems2_pressed(ems2_hide_node)
var gos_node = $scroll_set/table.get_node2(1, GOS_BTN).get_children()[0]
gos_node.connect('pressed', on_gos_pressed.bind(gos_node))
func _on_btn_save_settings_pressed():

View File

@@ -36,6 +36,8 @@ var color_ecm: Color
var color_select: Color
var color_emit: Color
var color_emit_sel: Color
var color_closed: Color
var color_closed_emit: Color
var course = 0.0 ## Курс корабля
@@ -51,7 +53,8 @@ const map_sizes = [
var fs_band = prd.FS_BAND_RTO ## Текущий режим блоков ФС по частоте
var fs_selected: Dictionary ## Словарь выбранных секторов
var fs_active: Dictionary ## Словарь секторов назначенных на подавление
var fs_emit: Dictionary ## Словарь секторов назначенных на подавление
var fs_emit: Dictionary ## Словарь секторов назначенных на подавление
var fs_closed: Dictionary ## Словарь для секторов запрета
## Состояние перетаскивания.
enum DragFSM {
@@ -89,14 +92,19 @@ func on_enter_tree() -> void: call_deferred('on_button_strobe_pressed')
func on_settings_changed():
color_emit_sel = ProjectSettings.get_setting('application/interfer/emit_sel_color', Color(1.0, 1.0, 1.0, 1.0))
color_emit = ProjectSettings.get_setting('application/interfer/emit_color', Color(0.58, 0.47, 0.51, 1.0))
color_ecm = ProjectSettings.get_setting('application/interfer/interfer_color', Color(0.58, 0.47, 0.51, 1.0))
color_select = ProjectSettings.get_setting('application/interfer/select_color', Color(1.0, 1.0, 1.0, 1.0))
color_closed = ProjectSettings.get_setting('application/interfer/closed_sectors', Color(0.0, 0.0, 0.0, 1.0))
color_emit_sel = color_select
color_closed_emit = color_closed
color_select *= Color(1.0, 1.0, 1.0, 0.0)
color_ecm *= Color(1.0, 1.0, 1.0, 0.0)
color_emit_sel *= Color(1.0, 1.0, 1.0, 0.2)
color_closed *= Color(1.0, 1.0, 1.0, 0.0)
color_closed_emit *= Color(1.0, 1.0, 1.0, 1.0)
## Обработчик сигнала изменения списка целей.
@@ -115,6 +123,8 @@ func on_button_view_toggled(toggled: bool):
$tilemap.size = s.size
$tilemap.position = s.position
view_mode = MapViewMode.RLS if toggled else MapViewMode.RTO
if view_mode != MapViewMode.RTO:
fs_selected.clear()
## Встроенный обратный вызов.
@@ -145,6 +155,8 @@ func _ready():
btns_select.any(func(btn): btn.button_connect('pressed', Callable(self, 'on_button_select').bind(btn, btns_select)))
var nodes: Array = get_tree().get_nodes_in_group('группа-режим-помехи')
nodes.any(func(btn): btn.button_connect('pressed', Callable(self, 'on_button_pressed').bind(btn, nodes)))
$btn_close.button_connect('pressed', Callable(self, 'on_btn_close').bind($btn_close))
$btn_work.button_connect('pressed', Callable(self, 'on_btn_work').bind($btn_work))
threats.connect('threat_new', Callable(self, 'on_threat_new'))
threats.connect('threat_lost', Callable(self, 'on_threat_lost'))
threats.connect('threats_resized', Callable(self, 'on_threats_resized'))
@@ -158,13 +170,14 @@ func _ready():
signaller.connect('interfer_off_all', Callable(self, 'on_interfer_off_all'))
signaller.connect('interfer_prinuditelno', Callable(self, 'on_interfer_prinuditelno').bind(nodes))
signaller.connect('fs_selected', Callable(self, 'on_fs_selected'))
signaller.connect('fs_update_color', Callable(self, 'on_fs_update_color'))
signaller.connect('fs_update_color', Callable(self, 'set_fs_color'))
interfer.connect('interfer_update', Callable(self, 'on_interfer_new'))
signaller.connect('interfer_prinuditelno', Callable(self, 'on_chk_interfer_prinuditelno'))
signaller.connect('fs_update_state', Callable(self, 'on_fs_update_state'))
signaller.connect('map_user_panning', Callable(self, 'on_user_panning'))
signaller.connect('update_coordinates_map', Callable(self, 'on_update_coordinates_label'))
signaller.connect('update_scale_map', Callable(self, 'on_update_scale_label'))
var unit_nav = network.get_unit_instance('навигация')
unit_nav.connect('data_received', on_navi_data_received)
on_btn_center_toggled(true)
@@ -179,8 +192,9 @@ func _ready():
func on_navi_data_received(data: Dictionary):
$canvas.set_canvas_rotation(data.get('k', 0.0))
course = data.get('k', 0.0)
var k = data.get('k', 0.0)
$canvas.set_canvas_rotation(k)
course = k
func on_user_panning():
@@ -254,9 +268,7 @@ func on_interfer_new(ecm):
bip.set_track_visible(false)
else:
interfer.thrs.erase(ecm.ispp)
set_fs_color(ecm)
update_fs_colors()
set_fs_color(ecm)
## Обработчик выключения всех помех.
@@ -306,9 +318,9 @@ func on_rto_threat_sel(th_id, ecm_btns):
set_btns_disabled(false, btn)
var btn_meta = btn.get_meta('rfi_name')
if krp == btn_meta:
btn.modulate = Color.DEEP_SKY_BLUE
btn.set_rec_visible(true)
else:
btn.modulate = Color(1.0, 1.0, 1.0, 1.0)
btn.set_rec_visible(false)
## Обработчик снятия выбора РТО цели.
@@ -320,7 +332,7 @@ func on_rto_threat_unsel(th_id, ecm_btns):
break
set_ecm_btns_state(true)
for btn in ecm_btns:
btn.modulate = Color(1.0, 1.0, 1.0, 1.0)
btn.set_rec_visible(false)
## Обработчик нажатия кнопки "Строб". Управляет отображением строба.
@@ -439,6 +451,7 @@ func _input(event) -> void:
## Обработчик нажатия по сектору формирователя сигналов.
func sel_fs_sector(event):
if view_mode != MapViewMode.RTO: return
if (event.button_index == MOUSE_BUTTON_LEFT) or (event.button_index == MOUSE_BUTTON_RIGHT):
var center: Vector2 = $tilemap.position
var center_offset: Vector2 = ProjectSettings.get_setting('application/interfer/center_offset', Vector2i(0, 25))
@@ -469,18 +482,17 @@ func sel_fs_sector(event):
set_ecm_btns_state(btn_state)
func set_fs_color(ecm):
if not prd.fs_caps_id.has(ecm.nmfs):
push_warning('нет такого модуля ФС: %d, но имеется: %s' % [ecm.nmfs, prd.fs_caps_id.keys()])
return
if ecm.krp != interfer.INTERFER_OFF:
fs_active[prd.fs_caps_id[ecm.nmfs]] = null
else:
fs_active.erase(prd.fs_caps_id[ecm.nmfs])
if ecm.svk == SVK_EMIT:
fs_emit[prd.fs_caps_id[ecm.nmfs]] = null
else:
fs_emit.erase(prd.fs_caps_id[ecm.nmfs])
func set_fs_color(ecms):
fs_active.clear()
fs_emit.clear()
for ecm in ecms.values():
if not prd.fs_caps_id.has(ecm.nmfs):
push_warning('нет такого модуля ФС: %d, но имеется: %s' % [ecm.nmfs, prd.fs_caps_id.keys()])
continue
if ecm.krp != interfer.INTERFER_OFF:
fs_active[prd.fs_caps_id[ecm.nmfs]] = null
if ecm.svk == SVK_EMIT:
fs_emit[prd.fs_caps_id[ecm.nmfs]] = null
update_fs_colors()
@@ -490,6 +502,11 @@ func update_fs_colors():
fs_colors[key] = color_ecm
for key in fs_emit.keys():
fs_colors[key] = color_emit
for key in fs_closed:
if key in fs_emit:
fs_colors[key] = color_closed_emit
else:
fs_colors[key] = color_closed
for key in fs_selected.keys():
if key in fs_emit:
fs_colors[key] = color_emit_sel
@@ -516,6 +533,7 @@ func on_fs_selected(ecm):
var fs_index_arr: Array = []
prd.get_fs_index(ecm, fs_index_arr)
fs_selected.clear()
if view_mode != MapViewMode.RTO: return
for item in fs_index_arr:
fs_selected[item] = null
update_fs_colors()
@@ -530,14 +548,6 @@ func set_btns_disabled(value: bool, btn):
btn.set_disabled(value)
func on_fs_update_color(ecms):
fs_active.clear()
fs_emit.clear()
for ecm in ecms.values():
set_fs_color(ecm)
update_fs_colors()
func on_interfer_prinuditelno (prenuditelno_sectors, btns):
for key in prenuditelno_sectors:
var sectors = []
@@ -571,3 +581,23 @@ func on_update_coordinates_label(coordinates_label) -> void:
func on_update_scale_label(scale_label) -> void:
$scale_map.text = str(scale_label)
func on_btn_close(btn):
await get_tree().create_timer(0.2).timeout
btn.pressed = false
fs_closed.merge(fs_selected)
signaller.emit_signal('update_fs_closed', fs_closed)
func on_btn_work(btn):
await get_tree().create_timer(0.2).timeout
btn.pressed = false
fs_closed.clear()
for fs_index in prd.FS_PRD.keys():
if fs_index in fs_selected: continue
fs_closed[fs_index] = null
signaller.emit_signal('update_fs_closed', fs_closed)
func _on_btn_all_work_pressed() -> void:
fs_closed.clear()
signaller.emit_signal('update_fs_closed', fs_closed)

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=18 format=3 uid="uid://b276iygic5itk"]
[gd_scene load_steps=19 format=3 uid="uid://b276iygic5itk"]
[ext_resource type="Script" uid="uid://daudc0s3oox3i" path="res://scenes/работа/работа.gd" id="1_niok4"]
[ext_resource type="PackedScene" uid="uid://nl1vklubr5kr" path="res://scenes/bip/bip.tscn" id="2_br3s6"]
@@ -13,6 +13,7 @@
[ext_resource type="Texture2D" uid="uid://csdw3q5dtvu4w" path="res://data/power-1.png" id="11_xp4y6"]
[ext_resource type="Texture2D" uid="uid://0sk43ticjaxk" path="res://data/navi-center-0.png" id="12_5ffal"]
[ext_resource type="Texture2D" uid="uid://bk4ssfho1murp" path="res://data/navi-center-1.png" id="13_ggrwd"]
[ext_resource type="Texture2D" uid="uid://c6booa8753u5t" path="res://data/состояние-исправности-2.png" id="14_ggrwd"]
[sub_resource type="Animation" id="Animation_5ffal"]
resource_name = "goto"
@@ -178,7 +179,6 @@ size_flags_vertical = 3
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
strips_rotation = 25.0
text = "Строб"
font_size = 15
metadata/state = 0
[node name="btn_threats" parent="btns_select" groups=["группа-режим-выбора"] instance=ExtResource("8_k0iv2")]
@@ -188,7 +188,6 @@ size_flags_vertical = 3
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
strips_rotation = 25.0
text = "Цель"
font_size = 15
metadata/state = 1
[node name="btn_fs_sector" parent="btns_select" groups=["группа-режим-выбора"] instance=ExtResource("8_k0iv2")]
@@ -198,7 +197,6 @@ size_flags_vertical = 3
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
strips_rotation = 25.0
text = "Сектор"
font_size = 15
metadata/state = 2
[node name="chk_auto" type="CheckBox" parent="."]
@@ -341,6 +339,42 @@ offset_bottom = 302.0
theme_override_font_sizes/font_size = 20
text = ""
[node name="btn_close" parent="." instance=ExtResource("8_k0iv2")]
layout_mode = 0
offset_left = 10.0
offset_top = 917.0
offset_right = 109.0
offset_bottom = 937.0
size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
strips_rotation = 25.0
text = "Сек. запрета"
metadata/state = 0
[node name="btn_work" parent="." instance=ExtResource("8_k0iv2")]
layout_mode = 2
offset_left = 10.0
offset_top = 890.0
offset_right = 109.0
offset_bottom = 910.0
size_flags_horizontal = 3
size_flags_vertical = 3
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
strips_rotation = 25.0
text = "Сек. работы"
metadata/state = 0
[node name="btn_all_work" type="TextureButton" parent="."]
modulate = Color(1, 1, 1, 0.356863)
layout_mode = 0
offset_left = 112.0
offset_top = 920.0
offset_right = 336.0
offset_bottom = 1144.0
scale = Vector2(0.06, 0.06)
texture_normal = ExtResource("14_ggrwd")
[connection signal="drag_begin" from="." to="." method="_on_drag_begin"]
[connection signal="drag_continue" from="." to="." method="_on_drag_continue"]
[connection signal="toggled" from="btn_view" to="." method="on_button_view_toggled"]
@@ -353,3 +387,4 @@ text = ""
[connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_button_up"]
[connection signal="button_down" from="zoom_minus" to="tilemap" method="_on_zoom_minus_button_down"]
[connection signal="button_up" from="zoom_minus" to="tilemap" method="_on_zoom_button_up"]
[connection signal="pressed" from="btn_all_work" to="." method="_on_btn_all_work_pressed"]

View File

@@ -81,7 +81,6 @@ offset_right = 1583.0
offset_bottom = 85.0
strips_rotation = 10.0
text = "Прочитать"
font_size = null
[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 = "Записать"
font_size = null
[node name="btn_save" type="Button" parent="."]
layout_mode = 0

View File

@@ -93,17 +93,22 @@ const ID_INTERFERS_LEN = 63 ## Размер пула номеров целе
const INTERFER_OFF = 'off'
const INTERFER_IQFILE = 'IQ-файл'
const POW_DEFAULT: float = 50.0
var msg6_num: int = 0 ## Счётчик сообщений "тип 6"
var msg8_num: int = 0 ## Счётчик сообщений "тип 8"
var id_array: Array ## Массив id воздействий.
var thrs: Dictionary ## Словарь воздействия для целей, ключ - id воздействия.
var fs: Dictionary ## Словарь воздействий для секторов, ключ - id воздействия.
var cu: Dictionary ## Словарь воздействий для 5П-28, ключ - id воздействия.
var thrs_dict: Dictionary ## Ссылка на словарь целей
var auto_enabled: bool = false ## Режим автомата
var emit_enable: bool = true ## Разрешить излучение
var trenazh_mode: bool = false ## Переключение режима Тренаж
var course = 0.0 ## Курс корабля
var msg6_num: int = 0 ## Счётчик сообщений "тип 6"
var msg8_num: int = 0 ## Счётчик сообщений "тип 8"
var id_array: Array ## Массив id воздействий.
var thrs: Dictionary ## Словарь воздействия для целей, ключ - id воздействия.
var fs: Dictionary ## Словарь воздействий для секторов, ключ - id воздействия.
var cu: Dictionary ## Словарь воздействий для 5П-28, ключ - id воздействия.
var thrs_dict: Dictionary ## Ссылка на словарь целей
var auto_enabled: bool = false ## Режим автомата
var emit_enable: bool = true ## Разрешить излучение
var trenazh_mode: bool = false ## Переключение режима Тренаж
var course = 0.0 ## Курс корабля
var gos_flag = true ## Флаг работать по своим целям
var gos_protocols: PackedStringArray ## Список протоколов своих целей
var gos_nmfs: Array ## Список номеров блоков ФС для которых запрещена работа
var fs_closed: Dictionary ## Словарь секторов запрета
## Сеанс помехи.
class Interfer:
@@ -204,9 +209,11 @@ func _ready() -> void:
signaller.connect('interfer_prinuditelno', Callable(self, 'on_interfer_prinuditelno'))
signaller.connect('emit_changed', Callable(self, 'on_emit_changed').bind(ecms))
signaller.connect('режим_тренаж', on_trenazh_mode)
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))
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))
@@ -248,7 +255,16 @@ func on_timer_check_state(unit_instance, ecms, resend_timeout) -> void:
func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> void:
gos_nmfs.clear()
for thr in threats.values():
if not gos_flag: # Составляется список запретных секторов работы
if (thr.proto in gos_protocols) and thr.fflags.proto:
var fs_arr: Array = []
prd.find_fs_index(thr.aoa, thr.freq, fs_arr)
if fs_arr.size():
for item in fs_arr:
var nmfs = prd.FS_PRD[item][1]
gos_nmfs.append(nmfs)
var th_id = thr.id
for ecm_i in thrs.keys():
if thrs[ecm_i] == th_id:
@@ -257,16 +273,47 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> v
ecm.kni = thr.aoa - course
if ecm.kni < 0:
ecm.kni += 360
send_ecm(ecm, unit_instance)
call_ecm_proc(ecm)
if ecm.nmfs in gos_nmfs:
interfer_off(ecm, unit_instance)
elif prd.fs_caps_id[ecm.nmfs] in fs_closed:
interfer_off(ecm, unit_instance)
else:
send_ecm(ecm, unit_instance)
signaller.emit_signal('fs_update_color', ecms)
prd.update_fs_state(ecms, trenazh_mode)
for ecm in ecms.values():
var ecm_active = true
if not gos_flag:
if ecm.nmfs in gos_nmfs:
interfer_off(ecm, unit_instance)
ecm_active = false
if ecm_active and (prd.fs_caps_id[ecm.nmfs] in fs_closed):
interfer_off(ecm, unit_instance)
if not auto_enabled:
return
if auto_enabled:
for thr in threats.values():
var fs_arr: Array = []
prd.find_fs_index(thr.aoa, thr.freq, fs_arr)
if fs_arr.size():
var need_continue = false
for item in fs_arr:
var nmfs = prd.FS_PRD[item][1]
if (nmfs in gos_nmfs) and (not gos_flag): need_continue = true
if prd.fs_caps_id[nmfs] in fs_closed: need_continue = true
if need_continue: continue
thr.auto_selected = true
if (thr.rkrp != '') and thr.fflags.rkrp and auto_enabled:
var krp = get_krp(thr)
if krp != '':
signaller.emit_signal('interfer_init', krp, [], interfer.POW_DEFAULT)
thr.auto_selected = false
continue
signaller.emit_signal('interfer_init', 'lchm1', [], interfer.POW_DEFAULT)
thr.auto_selected = false
@@ -414,10 +461,7 @@ func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interf
ecm.source_interfer = source_interfer
ecm.modulation = emit_enable
ecm.um = param.get('um', 15.0) # Значение по умолчанию
var ecm_params = ITERFER_MODE[interfer_name][1]
if ecm_params.has('call_proc'):
var call_set_params = Callable(self, ecm_params['call_proc']).bind(ecm, ecm_params)
call_set_params.call()
call_ecm_proc(ecm)
var set_nmfs_ok = set_nmfs(ecm)
if set_nmfs_ok != Error.OK:
log.error('Ошибка выбора модуля ФС для помехи: %s' %[ecm.ispp])
@@ -444,9 +488,7 @@ func send_ecm(ecm, unit0) -> void:
func on_interfer_off_all(unit0, ecms: Dictionary) -> void:
for ecm in ecms.values():
ecm.krp = INTERFER_OFF
send_ecm(ecm, unit0)
signaller.emit_signal('interfer_off', ecm)
interfer_off(ecm, unit0)
func on_threats_lost(th, ecms, unit0) -> void:
@@ -454,9 +496,7 @@ func on_threats_lost(th, ecms, unit0) -> void:
if interfer.thrs[key] == th.id:
var ecm_id = key
var ecm = ecms[ecm_id]
ecm.krp = INTERFER_OFF
send_ecm(ecm, unit0)
signaller.emit_signal('interfer_off', ecm)
interfer_off(ecm, unit0)
func pop_id() -> int:
@@ -528,7 +568,10 @@ func on_threats_update(threat, ecms, unit_caps):
if krp != '':
ecm.krp = krp
set_rparams(threat, ecm.params)
call_ecm_proc(ecm)
emit_signal('interfer_recommendate', ecm)
else:
call_ecm_proc(ecm)
ecm.kni = threat.aoa - course
if ecm.kni < 0:
ecm.kni += 360
@@ -643,9 +686,29 @@ func on_interfer_off(ecm: Interfer, ecms):
interfer.call_deferred('emit_signal', 'interfer_resized', ecms)
func interfer_off(ecm, unit_caps):
ecm.krp = INTERFER_OFF
send_ecm(ecm, unit_caps)
signaller.emit_signal('interfer_off', ecm)
func on_interfer_new(ecm, unit_caps):
call_ecm_proc(ecm)
send_ecm(ecm, unit_caps)
func on_settings_changed():
gos_flag = ProjectSettings.get_setting('application/config/Включить работу по своим целям', true)
var protocols: String = ProjectSettings.get_setting('application/config/Список своих протоколов', '')
gos_protocols = protocols.split(",", true)
func call_ecm_proc(ecm):
var ecm_params = ITERFER_MODE[ecm.krp][1]
if ecm_params.has('call_proc'):
var call_set_params = Callable(self, ecm_params['call_proc']).bind(ecm, ecm_params)
call_set_params.call()
send_ecm(ecm, unit_caps)
func on_update_fs_closed(fs_dict):
fs_closed = fs_dict

View File

@@ -201,3 +201,8 @@ signal update_uf_serviceability(uf_serviceaability: bool)
signal tool_tip(new_ctrl_pos)
## Вызывается при изменении секторов запрета.[br]
## [param fs_closed] - обновленное секторов запрета ([b]true[/b]
signal update_fs_closed(fs_closed: Dictionary)

View File

@@ -111,10 +111,12 @@ func on_threat_selected(th, threats):
func on_interfer_init(interfer_name, fs_arr, power, threats):
var sel_threats: Array = []
for threat in threats.values():
if threat.selected:
sel_threats.append(threat)
if threat.auto_selected:
sel_threats.append(threat)
if interfer.auto_enabled:
if threat.auto_selected:
sel_threats.append(threat)
else:
if threat.selected:
sel_threats.append(threat)
if len(sel_threats) or len(fs_arr):
signaller.emit_signal('interfer_create', interfer_name, sel_threats, fs_arr, power)