Merge remote-tracking branch 'refs/remotes/sasha/master'
# Conflicts: # scenes/tilemap/tilemap.gd # scenes/работа/работа.gd # scripts/settings.gd # scripts/signaller.gd # scripts/trassa.gd
This commit is contained in:
2
generate-sertificate.sh
Normal file
2
generate-sertificate.sh
Normal file
@@ -0,0 +1,2 @@
|
||||
#openssl req -x509 -newkey rsa:4096 -keyout key.pem -nodes -out cert.pem -sha256 -days 365 -subj "/C=RU/ST=NTC/L=TNIIS/O=Company Name/OU=Org/CN=www.example.com"
|
||||
openssl req -new -x509 -keyout "html/server.pem" -out "html/server.pem" -days 365 -nodes
|
||||
17
https-server.py
Normal file
17
https-server.py
Normal file
@@ -0,0 +1,17 @@
|
||||
#!/usr/bin/env python3
|
||||
from http import server # Python 3
|
||||
import ssl
|
||||
import os
|
||||
|
||||
|
||||
class MyHTTPRequestHandler(server.SimpleHTTPRequestHandler):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
html_dir = os.path.join(os.path.dirname(__file__), 'html')
|
||||
os.chdir(html_dir)
|
||||
srv = server.HTTPServer(('', 8000), MyHTTPRequestHandler)
|
||||
sdc = ssl.create_default_context()
|
||||
srv.serve_forever()
|
||||
@@ -28,7 +28,7 @@ interfer/center_offset=Vector2(200, 225)
|
||||
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.58, 0.47, 0.51, 1)
|
||||
interfer/interfer_color=Color(0.90, 0.1, 0.25, 0.9)
|
||||
interfer/resend_timeout=1000.0
|
||||
config/external_cu=false
|
||||
config/unit_rr_request_period=20.0
|
||||
@@ -36,7 +36,7 @@ config/kems_files_path="user://kems/"
|
||||
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_color=Color(0.9, 0.1, 0.25, 0.5)
|
||||
interfer/closed_sectors=Color(0, 0, 0, 1)
|
||||
|
||||
[autoload]
|
||||
|
||||
@@ -6,6 +6,10 @@ var selected: bool
|
||||
func set_track_visible(value: bool): $track.visible = value
|
||||
|
||||
|
||||
## Задаёт цвет точки
|
||||
func set_bip_color(val: Color): $bip.set_instance_shader_parameter('color', val)
|
||||
|
||||
|
||||
## Присваивает заданное значение видимости индикатору выполнения.
|
||||
func set_ecm_visible(value: bool): $ecm_done.visible = value
|
||||
|
||||
|
||||
@@ -7,8 +7,8 @@ const TableHeader = preload('res://table/header.tscn') ## Ячейка за
|
||||
|
||||
const TABLE_HEADER = [ TableHeader, TableHeader, TableHeader , TableHeader ] ## Описание ряда заголовка.
|
||||
const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit , CellLineEdit ] ## Описание ряда.
|
||||
const TABLE_HEADERS_TEXT = ['Номер', 'Название', 'Пеленг', 'Состояние' ] ## Заголовки таблицы.
|
||||
const TABLE_COLUMN_SIZE = [ 75, 100, 90, 170 ] ## Ширины колонок.
|
||||
const TABLE_HEADERS_TEXT = ['№', 'Название', 'Пеленг', 'Состояние' ] ## Заголовки таблицы.
|
||||
const TABLE_COLUMN_SIZE = [ 65, 100, 90, 170 ] ## Ширины колонок.
|
||||
|
||||
## Состояние выполнения сеанса помехи
|
||||
const INTERFER_STATE = {
|
||||
@@ -122,6 +122,7 @@ func on_interfer_new(ecm, table_index):
|
||||
# Будем надеяться, что отложенные вызовы производятся в том же порядке
|
||||
$table.call_deferred('clear_rows_selected')
|
||||
$table.call_deferred('set_row_selected', i_row, true)
|
||||
if not interfer.auto_enabled:
|
||||
signaller.emit_signal('interfer_selected', ecm)
|
||||
|
||||
|
||||
|
||||
23
scenes/frame-threats/emit-led.tscn
Normal file
23
scenes/frame-threats/emit-led.tscn
Normal file
@@ -0,0 +1,23 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://d012h4hxf2anf"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://b3woliae871je" path="res://data/отметка-неопред.png" id="1_0a4l0"]
|
||||
|
||||
[node name="emit-led" type="Control"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 0
|
||||
offset_right = 40.0
|
||||
offset_bottom = 40.0
|
||||
|
||||
[node name="texture-led" type="TextureButton" parent="."]
|
||||
visible = false
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
offset_left = 26.0
|
||||
offset_top = 11.0
|
||||
offset_right = 3.0
|
||||
offset_bottom = -12.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
texture_normal = ExtResource("1_0a4l0")
|
||||
@@ -35,5 +35,5 @@ script = ExtResource("2_empn3")
|
||||
|
||||
[node name="table" type="GridContainer" parent="scroll"]
|
||||
layout_mode = 2
|
||||
columns = 4
|
||||
columns = 5
|
||||
script = ExtResource("3_4bupu")
|
||||
|
||||
@@ -5,14 +5,16 @@ class_name scroll_threats extends ScrollContainer
|
||||
|
||||
const CellLineEdit = preload('res://table/ячейка-2.tscn') ## Ячейка таблицы.
|
||||
const TableHeader = preload('res://table/header.tscn') ## Ячейка заголовок таблицы.
|
||||
const EmitLed = preload('res://scenes/frame-threats/emit-led.tscn') ## Ячейка заголовок таблицы.
|
||||
|
||||
const TABLE_HEADER = [ TableHeader, TableHeader, TableHeader, TableHeader , TableHeader ] ## Описание ряда заголовка.
|
||||
const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit, EmitLed ] ## Описание ряда.
|
||||
const TABLE_COLUMN_PARAM = ['id', 'aoa', 'freq', 'proto', 'emit' ] ## Параметры цели отображаемые в таблице.
|
||||
const TABLE_HEADERS_TEXT = ['№', 'Пеленг', 'Частота, МГц', 'Протокол', 'Помеха' ] ## Заголовки таблицы.
|
||||
const TABLE_COLUMN_SIZE = [ 65, 70, 110, 140, 65] ## Ширины колонок.
|
||||
|
||||
const TABLE_HEADER = [ TableHeader, TableHeader, TableHeader, TableHeader ] ## Описание ряда заголовка.
|
||||
const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit ] ## Описание ряда.
|
||||
const TABLE_COLUMN_PARAM = ['id', 'aoa', 'freq', 'proto' ] ## Параметры цели отображаемые в таблице.
|
||||
const TABLE_HEADERS_TEXT = ['Номер', 'Пеленг', 'Частота, МГц', 'Протокол' ] ## Заголовки таблицы.
|
||||
const TABLE_COLUMN_SIZE = [ 65, 145, 145, 90 ] ## Ширины колонок.
|
||||
|
||||
const TABLE_TEXT_ROWS = 4
|
||||
const EMIT_STATE_COL = 4
|
||||
|
||||
## Снимает выделение цели.
|
||||
func on_rto_threat_unsel(_th_id): $table.clear_rows_selected()
|
||||
@@ -63,6 +65,17 @@ func on_threat_update(th, table_index: Dictionary):
|
||||
var row = map_th_to_row(th)
|
||||
var i_row = table_index[th.id]
|
||||
$table.set_row_text(i_row, row)
|
||||
var emit_node = $table.get_node2(EMIT_STATE_COL, i_row)
|
||||
var emit_txr = emit_node.get_node('texture-led')
|
||||
if th.emit_state == 0:
|
||||
emit_txr.visible = false
|
||||
elif th.emit_state == 1:
|
||||
emit_txr.visible = true
|
||||
emit_txr.self_modulate = Color.ORANGE
|
||||
elif th.emit_state == 2:
|
||||
emit_txr.visible = true
|
||||
emit_txr.self_modulate = Color.RED
|
||||
|
||||
|
||||
|
||||
## Обрабатывает сигнал [b]threat_lost[/b].
|
||||
@@ -78,7 +91,7 @@ func on_threat_new(th, table_index):
|
||||
$table.add_row(TABLE_ROW)
|
||||
var row = map_th_to_row(th)
|
||||
$table.set_row_text(i_row, row)
|
||||
$table.set_row_editable(i_row, false)
|
||||
disable_edit($table, TABLE_TEXT_ROWS, i_row)
|
||||
$table.set_node_user_data(0, i_row, th)
|
||||
table_index[th.id] = i_row
|
||||
|
||||
@@ -86,10 +99,11 @@ func on_threat_new(th, table_index):
|
||||
## Преобразует цель в строку таблицы.
|
||||
func map_th_to_row(th) -> Array:
|
||||
var row: = Array()
|
||||
row.resize(TABLE_COLUMN_PARAM.size())
|
||||
row.resize(TABLE_TEXT_ROWS)
|
||||
var i_col: int = 0
|
||||
for param_name in TABLE_COLUMN_PARAM:
|
||||
var val = th.get(param_name)
|
||||
if val == null: continue
|
||||
row[i_col] = '%0.1f' % val if val is float else '%s' % val
|
||||
if not th.fflags[param_name]:
|
||||
row[i_col] = ''
|
||||
@@ -104,3 +118,13 @@ func on_rto_threat_sel(th_id, tbl):
|
||||
if node.text.to_int() == th_id:
|
||||
row_pressed(i)
|
||||
break
|
||||
|
||||
|
||||
## Отключает возможность редактирования LineEdit в таблице.[br]
|
||||
## [param tbl] - таблица,[br]
|
||||
## [param num_col] - номер колонки,[br]
|
||||
## [param i_row] - номер столбца.[br]
|
||||
func disable_edit(tbl, num_col: int, i_row: int):
|
||||
for col in num_col:
|
||||
var node: LineEdit = tbl.get_node2(col, i_row)
|
||||
node.editable = false
|
||||
|
||||
@@ -95,15 +95,13 @@ script = ExtResource("8_tidwt")
|
||||
metadata/_edit_lock_ = true
|
||||
|
||||
[node name="remote_control" type="Label" parent="."]
|
||||
visible = false
|
||||
layout_mode = 2
|
||||
offset_left = 1358.0
|
||||
offset_right = 1501.0
|
||||
offset_left = 1244.0
|
||||
offset_right = 1401.0
|
||||
offset_bottom = 27.0
|
||||
tooltip_text = "Комплекс находится под внешним управлением"
|
||||
mouse_filter = 0
|
||||
theme_override_colors/font_color = Color(0, 0, 0, 1)
|
||||
theme_override_font_sizes/font_size = 14
|
||||
theme_override_styles/normal = SubResource("StyleBoxFlat_o1r22")
|
||||
text = "Внешнее управление"
|
||||
horizontal_alignment = 1
|
||||
|
||||
@@ -717,7 +717,7 @@ func set_coordinates(lon: float, lat: float, course: float) -> void:
|
||||
add_mark_from_lon_lat(ship_id, lon, lat, ship_instance, 0.0)
|
||||
else:
|
||||
_marks[ship_id].position = lonlat_to_world(lon, lat)
|
||||
ship_instance.rotation_degrees = fmod(course, 360.0)
|
||||
ship_instance.rotation_degrees = fmod(270.0 + course, 360.0)
|
||||
queue_redraw()
|
||||
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@ const SETTING_TABLE = [
|
||||
['Адрес БПО правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'],
|
||||
['Период опроса состояния БПО, секунды', TableEdit, TableEdit, 'Время в секундах' ],
|
||||
['Период опроса состояния АФСП, секунды', TableEdit, TableEdit, 'Время в секундах' ],
|
||||
['уареп-трасса', TableEdit, TableEdit, 'IP-адрес для связи с Трассой [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'],
|
||||
['уарэп-трасса', TableEdit, TableEdit, 'IP-адрес для связи с Трассой [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'],
|
||||
['Включить работу по своим целям', TableEdit, TableToggle, 'Разрешает работу в секторе со своей целью'],
|
||||
['Список своих протоколов', TableEdit, TableEdit, 'Список протоколов целей, по которым запрещено работать' ], ]
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@ var strob_dir_begin: float ## Направление антенны
|
||||
var strob_width_begin: float ## Ширина строба по углу в момент начала перетаскивания.
|
||||
var view_mode: MapViewMode ## Режим отображения карты
|
||||
var thrs_dict: Dictionary ## Ссылка на словарь целей
|
||||
var gos_flag = true ## Флаг работать по своим целям
|
||||
var color_ecm: Color
|
||||
var color_select: Color
|
||||
var color_emit: Color
|
||||
@@ -92,6 +93,7 @@ func on_enter_tree() -> void: call_deferred('on_button_strobe_pressed')
|
||||
|
||||
|
||||
func on_settings_changed():
|
||||
gos_flag = ProjectSettings.get_setting('application/config/Включить работу по своим целям', true)
|
||||
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))
|
||||
@@ -109,9 +111,7 @@ func on_settings_changed():
|
||||
|
||||
## Обработчик сигнала изменения списка целей.
|
||||
func on_threats_resized(ths: Dictionary):
|
||||
$count_all_pad/count_all.text = '%02d' % ths.size()
|
||||
var c: int = ths.values().filter(func(th: threats.Threat): return th.proto != '').size()
|
||||
$count_danger_pad/count_danger.text = '%02d' % c
|
||||
count_threats(ths)
|
||||
thrs_dict = ths
|
||||
|
||||
|
||||
@@ -167,6 +167,7 @@ func _ready():
|
||||
signaller.connect('threat_selected', Callable(self, 'on_threat_selected').bind(nodes))
|
||||
signaller.connect('interfer_selected', Callable(self, 'on_interfer_selected').bind(nodes))
|
||||
signaller.connect('interfer_new', Callable(self, 'on_interfer_new'))
|
||||
signaller.connect('on_prog_ecm_off', Callable(self, 'on_interfer_new'))
|
||||
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'))
|
||||
@@ -179,6 +180,7 @@ func _ready():
|
||||
signaller.connect('update_scale_map', Callable(self, 'on_update_scale_label'))
|
||||
signaller.connect('sector_klaster', Callable(self, 'sector_klaster'))
|
||||
signaller.connect('clear_klaster', Callable(self, 'clear_all_klaster'))
|
||||
signaller.connect('th_aoa_update', Callable(self, 'on_th_aoa_update'))
|
||||
var unit_nav = network.get_unit_instance('навигация')
|
||||
unit_nav.connect('data_received', on_navi_data_received)
|
||||
on_btn_center_toggled(true)
|
||||
@@ -252,9 +254,10 @@ func map_threat_to_bip(th: threats.Threat, bip: Control) -> bool:
|
||||
|
||||
|
||||
## Обработчик сигнала обновления цели.
|
||||
func on_threat_update(th):
|
||||
func on_threat_update(th: threats.Threat):
|
||||
var bip = get_node('%d' % th.id)
|
||||
bip.update(th.tick_rx)
|
||||
bip.set_bip_color(Color.CORAL if th.proto else Color.WHITE)
|
||||
bip.visible = map_threat_to_bip(th, bip)
|
||||
|
||||
|
||||
@@ -519,6 +522,13 @@ func update_fs_colors():
|
||||
else:
|
||||
fs_colors[key] = color_select
|
||||
$canvas.set_band_colors(fs_colors)
|
||||
if fs_emit.size():
|
||||
if $btn_activate.pressed:
|
||||
$btn_activate.self_modulate = Color.RED
|
||||
else:
|
||||
$btn_activate.self_modulate = Color.WHITE
|
||||
else:
|
||||
$btn_activate.self_modulate = Color.WHITE
|
||||
|
||||
|
||||
func unsel_fs_all(need_btns_off: bool):
|
||||
@@ -579,6 +589,8 @@ func on_btn_center_toggled(toggled_on: bool) -> void:
|
||||
func on_btn_activate_toggled(toggled_on: bool) -> void:
|
||||
$btn_activate.tooltip_text = 'Включает подавление (%s)' % ('включено' if toggled_on else 'отключено')
|
||||
signaller.emit_signal('emit_changed', toggled_on)
|
||||
if not toggled_on:
|
||||
$btn_activate.self_modulate = Color.WHITE
|
||||
|
||||
|
||||
func on_update_coordinates_label(coordinates_label) -> void:
|
||||
@@ -595,6 +607,7 @@ func on_btn_close(btn):
|
||||
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
|
||||
@@ -604,6 +617,21 @@ func on_btn_work(btn):
|
||||
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)
|
||||
|
||||
|
||||
func on_th_aoa_update(ths):
|
||||
count_threats(ths)
|
||||
|
||||
|
||||
func count_threats(ths):
|
||||
$count_all_pad/count_all.text = '%02d' % ths.size()
|
||||
var c: int = 0
|
||||
if gos_flag:
|
||||
c = ths.values().filter(func(th: threats.Threat): return th.proto != '').size()
|
||||
else:
|
||||
c = ths.values().filter(func(th: threats.Threat): return ((th.proto != '') and th.proto not in interfer.gos_protocols)).size()
|
||||
$count_danger_pad/count_danger.text = '%02d' % c
|
||||
|
||||
@@ -383,8 +383,8 @@ texture_normal = ExtResource("14_ggrwd")
|
||||
[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate"]
|
||||
[connection signal="toggled" from="btn_center" to="." method="on_btn_center_toggled"]
|
||||
[connection signal="button_down" from="zoom_plus" to="tilemap" method="_on_zoom_plus_button_down"]
|
||||
[connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_plus_button_up"]
|
||||
[connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_button_up"]
|
||||
[connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_plus_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"]
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
[gd_scene load_steps=34 format=3 uid="uid://musb21x2u0xs"]
|
||||
[gd_scene load_steps=35 format=3 uid="uid://musb21x2u0xs"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://hkcvl2waf63s" path="res://scenes/эмс2/вид сверху.png" id="1_b7vcf"]
|
||||
[ext_resource type="Script" uid="uid://bvlqgv7aapebl" path="res://scenes/эмс2/эмс_тг.gd" id="1_l3ueu"]
|
||||
[ext_resource type="Texture2D" uid="uid://0w6q4vfst0ry" path="res://scenes/эмс2/OP-63.png" id="3_8gk36"]
|
||||
[ext_resource type="Texture2D" uid="uid://coxhivvc6uibs" path="res://scenes/эмс2/Состояние РЭС 40.png" id="4_b3mus"]
|
||||
[ext_resource type="Texture2D" uid="uid://073el51yholj" path="res://scenes/эмс2/454.png" id="4_nqi0i"]
|
||||
@@ -39,6 +40,7 @@ load_path = "res://.godot/imported/Окно частот0.png-6b01791c971bddb013
|
||||
load_path = "res://.godot/imported/Скруглённый квадрат серый.png-4655829309cca3b1dec2c9ae01376d54.ctex"
|
||||
|
||||
[node name="Panel" type="Panel"]
|
||||
script = ExtResource("1_l3ueu")
|
||||
|
||||
[node name="Sprite2D" type="Sprite2D" parent="."]
|
||||
modulate = Color(1, 0.596078, 0.4, 1)
|
||||
@@ -106,6 +108,15 @@ position = Vector2(275.641, 38.4615)
|
||||
scale = Vector2(3.20513, 3.20513)
|
||||
texture = ExtResource("6_m57px")
|
||||
|
||||
[node name="lbl_trassa" type="Label" parent="454"]
|
||||
layout_mode = 0
|
||||
offset_left = -42.0
|
||||
offset_top = -135.0
|
||||
offset_right = 221.0
|
||||
offset_bottom = -36.0
|
||||
theme_override_font_sizes/font_size = 100
|
||||
text = "Трасса"
|
||||
|
||||
[node name="Го" type="TextureRect" parent="."]
|
||||
layout_mode = 0
|
||||
offset_left = 488.0
|
||||
|
||||
37
scenes/эмс2/эмс_тг.gd
Normal file
37
scenes/эмс2/эмс_тг.gd
Normal file
@@ -0,0 +1,37 @@
|
||||
extends Panel
|
||||
|
||||
func _ready() -> void:
|
||||
var unit_trassa = network.get_unit_instance('уарэп-трасса')
|
||||
unit_trassa.connect('line_changed', Callable(self, 'on_trassa_line_changed'))
|
||||
signaller.connect('sector_klaster', Callable(self, 'on_sector_klaster').bind(unit_trassa))
|
||||
|
||||
|
||||
func on_trassa_line_changed(unit_trassa):
|
||||
if unit_trassa.online:
|
||||
$"454/СостояниеРэс3".self_modulate = Color.WEB_GREEN
|
||||
$"СкруглённыйПрямоугольникБелый/Label3".text = 'Трасса'
|
||||
$"СкруглённыйПрямоугольникБелый/Label4".text = 'Трасса'
|
||||
$"СкруглённыйПрямоугольникБелый/Label5".text = 'Активный'
|
||||
$"СкруглённыйПрямоугольникБелый/Label6".text = str(unit_trassa.daa)
|
||||
$"СкруглённыйПрямоугольникБелый/Label7".text = str(unit_trassa.dap)
|
||||
$"СкруглённыйПрямоугольникБелый/Label8".text = '1'
|
||||
$"СкруглённыйПрямоугольникБелый/Label9".text = str(unit_trassa.lfb)
|
||||
$"СкруглённыйПрямоугольникБелый/Label10".text = str(unit_trassa.lfb)
|
||||
else:
|
||||
$"454/СостояниеРэс3".self_modulate = Color.WHITE
|
||||
$"СкруглённыйПрямоугольникБелый/Label3".text = '-'
|
||||
$"СкруглённыйПрямоугольникБелый/Label4".text = '-'
|
||||
$"СкруглённыйПрямоугольникБелый/Label5".text = '-'
|
||||
$"СкруглённыйПрямоугольникБелый/Label6".text = '-'
|
||||
$"СкруглённыйПрямоугольникБелый/Label7".text = '-'
|
||||
$"СкруглённыйПрямоугольникБелый/Label8".text = '-'
|
||||
$"СкруглённыйПрямоугольникБелый/Label9".text = '-'
|
||||
$"СкруглённыйПрямоугольникБелый/Label10".text = '-'
|
||||
|
||||
|
||||
func on_sector_klaster(data, unit_trassa):
|
||||
$"СкруглённыйПрямоугольникБелый/Label6".text = str(unit_trassa.dap)
|
||||
$"СкруглённыйПрямоугольникБелый/Label7".text = str(unit_trassa.daa)
|
||||
$"СкруглённыйПрямоугольникБелый/Label8".text = '1'
|
||||
$"СкруглённыйПрямоугольникБелый/Label9".text = str(unit_trassa.lfb)
|
||||
$"СкруглённыйПрямоугольникБелый/Label10".text = str(unit_trassa.hfb)
|
||||
1
scenes/эмс2/эмс_тг.gd.uid
Normal file
1
scenes/эмс2/эмс_тг.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bvlqgv7aapebl
|
||||
@@ -125,6 +125,7 @@ class Interfer:
|
||||
var modulation: bool ## Модуляция для включения усилителей
|
||||
var um: float ## Угол места для помехи.
|
||||
var nmfs: int = 0 ## Номер модуля ФС в нумерации СТЦ
|
||||
var priority: int = 0 ## Приоритет помехи
|
||||
|
||||
func _to_string() -> String:
|
||||
return 'номер: %d название: %s частота: %0.1f МГц пеленг: %0.1f гр.' % [ispp, ITERFER_MODE[krp][0], params['freq'], kni]
|
||||
@@ -257,22 +258,34 @@ 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)
|
||||
var th_aoa = fposmod(thr.aoa - course, 360)
|
||||
prd.find_fs_index(th_aoa, thr.freq, fs_arr)
|
||||
if fs_arr.size():
|
||||
for item in fs_arr:
|
||||
var nmfs = prd.FS_PRD[item][1]
|
||||
thr.nmfs = nmfs
|
||||
if (thr.proto in gos_protocols) and thr.fflags.proto and (not gos_flag):
|
||||
gos_nmfs.append(nmfs)
|
||||
|
||||
thr.emit_state = 0
|
||||
for ecm in ecms.values():
|
||||
if thr.nmfs == ecm.nmfs:
|
||||
set_th_emit(thr, ecm)
|
||||
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)
|
||||
|
||||
var th_id = thr.id
|
||||
for ecm_i in thrs.keys():
|
||||
if thrs[ecm_i] == th_id:
|
||||
var ecm = ecms[ecm_i]
|
||||
ecm.params['freq'] = thr.freq
|
||||
ecm.kni = thr.aoa - course
|
||||
if ecm.kni < 0:
|
||||
ecm.kni += 360
|
||||
ecm.kni = fposmod(thr.aoa - course, 360)
|
||||
call_ecm_proc(ecm)
|
||||
if ecm.nmfs in gos_nmfs:
|
||||
interfer_off(ecm, unit_instance)
|
||||
@@ -283,23 +296,11 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> v
|
||||
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)
|
||||
var th_aoa = fposmod(thr.aoa - course, 360)
|
||||
prd.find_fs_index(th_aoa, thr.freq, fs_arr)
|
||||
if fs_arr.size():
|
||||
var need_continue = false
|
||||
for item in fs_arr:
|
||||
@@ -366,13 +367,23 @@ func map_mpchf_to_seczaps(unit_instance: unit.Unit, _seczaps: Dictionary):
|
||||
## Вызыватся, когда пользователь выбрал помеху и выбраны цели.
|
||||
func on_interfer_create(interfer_name, sel_threats, fs_arr, power, u, ecms) -> void:
|
||||
for item in sel_threats:
|
||||
if auto_enabled:
|
||||
var need_continue = false
|
||||
for ecm in ecms.values():
|
||||
if ecm.nmfs == item.nmfs:
|
||||
if item.priority > ecm.priority:
|
||||
interfer_off(ecm, u)
|
||||
elif item.priority < ecm.priority:
|
||||
need_continue = true
|
||||
break
|
||||
if need_continue: continue
|
||||
var param: Dictionary = {}
|
||||
var kni: float = item.aoa - course
|
||||
if kni < 0:
|
||||
kni += 360.0
|
||||
var id = item.id
|
||||
param['freq'] = item.freq
|
||||
param['width'] = item.width
|
||||
param['width'] = item.width * 1.5
|
||||
if (item.rkrp != '') and item.fflags.rkrp and auto_enabled:
|
||||
var krp = get_krp(item)
|
||||
if krp != '':
|
||||
@@ -454,13 +465,16 @@ func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interf
|
||||
ecm = Interfer.new()
|
||||
ecm.ispp = ispp
|
||||
ecms[ispp] = ecm
|
||||
ecm.modulation = emit_enable
|
||||
ecm.kni = kni
|
||||
ecm.krp = interfer_name
|
||||
ecm.params = param
|
||||
ecm.powp = power
|
||||
ecm.source_interfer = source_interfer
|
||||
ecm.modulation = emit_enable
|
||||
ecm.um = param.get('um', 15.0) # Значение по умолчанию
|
||||
if source_interfer == SOURCE_INTERFER[0]:
|
||||
if thrs_dict.has(dict[ispp]):
|
||||
ecm.priority = thrs_dict[dict[ispp]].priority
|
||||
call_ecm_proc(ecm)
|
||||
var set_nmfs_ok = set_nmfs(ecm)
|
||||
if set_nmfs_ok != Error.OK:
|
||||
@@ -477,7 +491,7 @@ func interfer_create(u, interfer_name, ecms, param, kni, id, dict, source_interf
|
||||
|
||||
func send_ecm(ecm, unit0) -> void:
|
||||
if ecm.krp != INTERFER_OFF:
|
||||
if not emit_enable:
|
||||
if not ecm.modulation:
|
||||
ecm.svk = 0
|
||||
call_deferred('emit_signal', 'interfer_update', ecm)
|
||||
return
|
||||
@@ -512,8 +526,10 @@ func push_id(id: int) -> void:
|
||||
id_array.sort()
|
||||
|
||||
|
||||
func on_emit_changed(state, _ecms) -> void:
|
||||
func on_emit_changed(state, ecms) -> void:
|
||||
emit_enable = state
|
||||
for ecm in ecms.values():
|
||||
ecm.modulation = state
|
||||
|
||||
|
||||
func call_all_diap(ecm, ecm_params: Dictionary):
|
||||
@@ -561,8 +577,12 @@ func on_threats_update(threat, ecms, unit_caps):
|
||||
for ecm_i in thrs.keys():
|
||||
if thrs[ecm_i] == th_id:
|
||||
ecm = ecms[ecm_i]
|
||||
ecm.priority = threat.priority
|
||||
ecm.params['freq'] = threat.freq
|
||||
ecm.params['width'] = threat.width
|
||||
var width = threat.width * 1.5
|
||||
if width < settings.WIDTH_MIN:
|
||||
width = settings.WIDTH_MIN
|
||||
ecm.params['width'] = width
|
||||
if (threat.rkrp != '') and threat.fflags.rkrp and auto_enabled:
|
||||
var krp = get_krp(threat)
|
||||
if krp != '':
|
||||
@@ -576,58 +596,8 @@ func on_threats_update(threat, ecms, unit_caps):
|
||||
if ecm.kni < 0:
|
||||
ecm.kni += 360
|
||||
set_nmfs(ecm)
|
||||
if threat.tmod != 'fm':
|
||||
if ecm != null:
|
||||
send_ecm(ecm, unit_caps)
|
||||
return
|
||||
var th_fm_dict: Dictionary
|
||||
var fs_index_arr: Array
|
||||
prd.find_fs_index(threat.aoa, threat.freq, fs_index_arr)
|
||||
if fs_index_arr.size() == 0:
|
||||
if ecm != null:
|
||||
send_ecm(ecm, unit_caps)
|
||||
return
|
||||
var fs_index = fs_index_arr[0]
|
||||
var nmfs = prd.FS_PRD[fs_index][1]
|
||||
if ecm == null:
|
||||
for ecm_i in ecms.values():
|
||||
if nmfs != ecm_i.nmfs: continue
|
||||
if ecm_i.svk != 1: continue
|
||||
ecm = ecm_i
|
||||
if ecm == null: return
|
||||
|
||||
for th_index in thrs_dict:
|
||||
if thrs_dict[th_index].tmod != 'fm': continue
|
||||
fs_index_arr = []
|
||||
prd.find_fs_index(thrs_dict[th_index].aoa, thrs_dict[th_index].freq, fs_index_arr)
|
||||
if fs_index_arr.size() == 0: continue
|
||||
if fs_index_arr[0] != fs_index: continue
|
||||
th_fm_dict[th_index] = thrs_dict[th_index]
|
||||
if len(th_fm_dict) > 1:
|
||||
pass
|
||||
send_ecm(ecm, unit_caps)
|
||||
|
||||
|
||||
func get_freq_range(freq_range_dict: Dictionary, th_dict: Dictionary):
|
||||
for key_i in th_dict:
|
||||
var min_range: int = 6000
|
||||
var key_min = null
|
||||
for key_j in th_dict:
|
||||
if key_i == key_j: continue
|
||||
var width = (th_dict[key_i].width / 2) + (th_dict[key_j].width / 2)
|
||||
var freq_range = abs(th_dict[key_i].freq - th_dict[key_j].freq) + width
|
||||
if freq_range < min_range:
|
||||
key_min = key_j
|
||||
min_range = freq_range
|
||||
var max_width = 0
|
||||
for key in PDCHM_PARAMS['files'].keys():
|
||||
if max_width < key: max_width = key
|
||||
if min_range > max_width:
|
||||
th_dict.erase(key_i)
|
||||
continue
|
||||
else:
|
||||
if key_min == null: continue
|
||||
freq_range_dict[key_i] = [th_dict[key_i], th_dict[key_min], min_range]
|
||||
|
||||
|
||||
func find_threat(freq: int, aoa: float):
|
||||
@@ -654,7 +624,7 @@ func set_rparams(threat: threats.Threat, params: Dictionary):
|
||||
if threat.rparams.has('width'):
|
||||
params['width'] = threat.rparams['width']
|
||||
else:
|
||||
params['width'] = threat.width
|
||||
params['width'] = threat.width * 1.5
|
||||
if threat.rparams.has('filename'):
|
||||
params['filename'] = threat.rparams['filename']
|
||||
|
||||
@@ -677,6 +647,7 @@ func get_krp(threat: threats.Threat):
|
||||
|
||||
func on_interfer_off(ecm: Interfer, ecms):
|
||||
var sz = ecms.size()
|
||||
signaller.emit_signal('on_prog_ecm_off', ecm)
|
||||
ecms.erase(ecm.ispp)
|
||||
thrs.erase(ecm.ispp)
|
||||
interfer.cu.erase(ecm.ispp)
|
||||
@@ -712,3 +683,16 @@ func call_ecm_proc(ecm):
|
||||
|
||||
func on_update_fs_closed(fs_dict):
|
||||
fs_closed = fs_dict
|
||||
|
||||
|
||||
func set_th_emit(th: threats.Threat, ecm: Interfer):
|
||||
var freq_min = ecm.params['freq'] - ecm.params.get('width', settings.WIDTH_MAX)/2
|
||||
var freq_max = ecm.params['freq'] + ecm.params.get('width', settings.WIDTH_MAX)/2
|
||||
if (th.freq >= freq_min) and (th.freq <= freq_max):
|
||||
if ecm.svk == 1:
|
||||
th.emit_state = 2
|
||||
elif th.emit_state == 2:
|
||||
return
|
||||
else:
|
||||
th.emit_state = 1
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ var UnitProfiles: Dictionary[StringName, Array] = { \
|
||||
'уарэп-яу07-частный': ['yau07rx', ['10.1.1.2', 50002, false, true], 'IP-адрес для приёма частных сообщений от ЯУ-07'],
|
||||
'уарэп-яу07-общий': ['yau07rx', ['*', 50000, true, true], 'IP-адрес для приёма широковещательных сообщений от ЯУ-07'],
|
||||
'уарэп-капсрпб': ['capsrpb', ['127.0.0.1', '127.0.0.1', 42023, 42022, false, true], 'IP-адрес для обмена сообщениями со службой \"МП550\" (СТЦ)'],
|
||||
'уарэп-трасса': ['trassa', ['127.0.0.1', '127.0.0.1', 50200, 10004, false, true], 'IP-адрес для обмена сообщениями с \"Трассой\"'],
|
||||
'уарэп-трасса': ['trassa', ['192.168.11.34', '192.168.11.105', 50200, 10004, false, true], 'IP-адрес для обмена сообщениями с \"Трассой\"'],
|
||||
'уарэп-эмс': ['yau07tx', ['10.1.1.52', 50052, false, false], 'IP-адрес прибора УФ'],
|
||||
'уарэп-яу07-2в': ['yau07tx', ['10.1.1.22', 50022, false, false], 'IP-адрес прибора ПРД-В2'],
|
||||
'уарэп-яу07-2н': ['yau07tx', ['10.1.1.21', 50021, false, false], 'IP-адрес прибора ПРД-Н2'],
|
||||
@@ -51,7 +51,7 @@ var UnitProfiles: Dictionary[StringName, Array] = { \
|
||||
const FREQ_MAX: = 6000.0
|
||||
const FREQ_MIN: = 400.0
|
||||
const WIDTH_MAX: = 120.0
|
||||
const WIDTH_MIN: = 0.0
|
||||
const WIDTH_MIN: = 5.0
|
||||
const DUR_MAX: = 1000000.0
|
||||
const PERIOD_MAX: = 1000000.0
|
||||
const UM_MIN: = -5.0
|
||||
|
||||
@@ -30,6 +30,8 @@ signal режим_журнал()
|
||||
## Вызывается при переходе в режим [b]ЭМС[/b].
|
||||
signal режим_эмс()
|
||||
|
||||
## Вызывается при переходе в режим [b]ЭМС ТГ[/b].
|
||||
signal режим_эмс2()
|
||||
|
||||
## Вызывается при переходе в режим [b]Настройка[/b].
|
||||
signal режим_настройки()
|
||||
@@ -212,3 +214,8 @@ signal sector_klaster (new_sector_data)
|
||||
|
||||
|
||||
signal clear_klaster ()
|
||||
|
||||
|
||||
## Вызывается при программном отключении помехи.[br]
|
||||
## [param ecm] - выключаемая помеха ([b]true[/b]
|
||||
signal on_prog_ecm_off(ecm: interfer.Interfer)
|
||||
|
||||
@@ -29,9 +29,9 @@ const MOD_TYPES: Array = [
|
||||
const CU_STATE: Dictionary = {
|
||||
0: 2, # Подготовка к выполнению
|
||||
1: 1, # Выполняется
|
||||
2: 9, # Ошибка в команде
|
||||
2: 3, # Ошибка в команде
|
||||
3: 7, # Занят выполнением другого ЦУ
|
||||
4: 9, # Неисправность
|
||||
4: 2, # Неисправность
|
||||
}
|
||||
|
||||
class TCP5P28 extends unit.Unit:
|
||||
@@ -135,7 +135,7 @@ class TCP5P28 extends unit.Unit:
|
||||
continue
|
||||
var cu = ecms[id]
|
||||
cu_data.encode_u16(0, cu.ispp)
|
||||
var state: int = CU_STATE[cu.svk] if CU_STATE.has(cu.svk) else 9
|
||||
var state: int = CU_STATE[cu.svk] if CU_STATE.has(cu.svk) else 8
|
||||
cu_data.encode_u8(2, state) # Состояние выполнения команды
|
||||
cu_data.encode_u8(3, 0xFF) # Эффективность работы помехи
|
||||
data.append_array(cu_data)
|
||||
|
||||
@@ -28,6 +28,9 @@ class Threat:
|
||||
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 ## Приоритет опасности цели
|
||||
|
||||
func _init(): clear_fflags()
|
||||
func _to_string() -> String: return 'номер: %d пеленг: %0.1f частота: %0.1f МГц' % [id, aoa, freq]
|
||||
@@ -140,6 +143,10 @@ func on_data_capsrpb_received(unit: capsrpb.CapsRpb, threats: Dictionary):
|
||||
th.clear_fflags()
|
||||
th.set_from_dic(dic_th)
|
||||
th.tick_rx = unit.tick
|
||||
if th.fflags.proto and th.proto != '':
|
||||
th.priority = 1
|
||||
else:
|
||||
th.priority = 0
|
||||
call_deferred('emit_signal', 'threat_update', th)
|
||||
else:
|
||||
var th: = Threat.new()
|
||||
|
||||
@@ -35,6 +35,10 @@ class Trassa extends unit.Unit:
|
||||
[2000, 6000, 500, 100],
|
||||
[3500, 6000, 524, 50],
|
||||
[390, 6000, 374, 50*7]]
|
||||
var lfb = 0
|
||||
var hfb = 0
|
||||
var dap = 0
|
||||
var daa = 0
|
||||
|
||||
# Инициализация
|
||||
func _init(nm: StringName, buttons: Array = []) -> void:
|
||||
@@ -105,10 +109,10 @@ class Trassa extends unit.Unit:
|
||||
if txe == true or rxe == true:
|
||||
sector_data["draw"] = true
|
||||
if data.has("lfb") and data.has("hfb") and data.has("dap") and data.has("daa"):
|
||||
var lfb = int(data["lfb"])
|
||||
var hfb = int(data["hfb"])
|
||||
var dap = int(data["dap"])
|
||||
var daa = int(data["daa"])
|
||||
lfb = int(data["lfb"])
|
||||
hfb = int(data["hfb"])
|
||||
dap = int(data["dap"])
|
||||
daa = int(data["daa"])
|
||||
for i in range(set_klaster.size()):
|
||||
var mapping = set_klaster[i]
|
||||
if lfb == mapping[0] and hfb == mapping[1]:
|
||||
|
||||
12
uarep-ctl.linux.x86_64
Normal file
12
uarep-ctl.linux.x86_64
Normal file
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
|
||||
|
||||
DATE_TIME=$(date "+%F %H-%M-%S")
|
||||
LOG_PATH="/home/${USER}/$(basename "$0")-${DATE_TIME}.log" # Путь к файлу журнала.
|
||||
|
||||
# { Вывод этого скрипта в файл журнала и консоль одновременно
|
||||
# shellcheck disable=SC2015,SC2086
|
||||
test $1 = x$'\x00' && shift || { set -o pipefail ; ( exec 2>&1 ; $0 $'\x00' "$@" ) | tee "${LOG_PATH}" ; exit $? ; }
|
||||
# }
|
||||
|
||||
/opt/uarep-ctl/bin/uarep-ctl.linux.x86_64 -f -t --screen 1
|
||||
Reference in New Issue
Block a user