diff --git a/generate-sertificate.sh b/generate-sertificate.sh new file mode 100644 index 0000000..f62645d --- /dev/null +++ b/generate-sertificate.sh @@ -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 diff --git a/https-server.py b/https-server.py new file mode 100644 index 0000000..f6eef3f --- /dev/null +++ b/https-server.py @@ -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() diff --git a/project.godot b/project.godot index 39bda02..8697781 100644 --- a/project.godot +++ b/project.godot @@ -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] diff --git a/scenes/bip/bip.gd b/scenes/bip/bip.gd index 3449786..43dc360 100644 --- a/scenes/bip/bip.gd +++ b/scenes/bip/bip.gd @@ -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 diff --git a/scenes/frame-ecm-list/scroll-ecm-list.gd b/scenes/frame-ecm-list/scroll-ecm-list.gd index e0f4234..8ad0a9f 100644 --- a/scenes/frame-ecm-list/scroll-ecm-list.gd +++ b/scenes/frame-ecm-list/scroll-ecm-list.gd @@ -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,7 +122,8 @@ func on_interfer_new(ecm, table_index): # Будем надеяться, что отложенные вызовы производятся в том же порядке $table.call_deferred('clear_rows_selected') $table.call_deferred('set_row_selected', i_row, true) - signaller.emit_signal('interfer_selected', ecm) + if not interfer.auto_enabled: + signaller.emit_signal('interfer_selected', ecm) func on_interfer_off(ecm, table_index): diff --git a/scenes/frame-threats/emit-led.tscn b/scenes/frame-threats/emit-led.tscn new file mode 100644 index 0000000..da69917 --- /dev/null +++ b/scenes/frame-threats/emit-led.tscn @@ -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") diff --git a/scenes/frame-threats/frame-threats.tscn b/scenes/frame-threats/frame-threats.tscn index e357f45..f3cba68 100644 --- a/scenes/frame-threats/frame-threats.tscn +++ b/scenes/frame-threats/frame-threats.tscn @@ -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") diff --git a/scenes/frame-threats/scroll-threats.gd b/scenes/frame-threats/scroll-threats.gd index 377be5b..d20ef2d 100644 --- a/scenes/frame-threats/scroll-threats.gd +++ b/scenes/frame-threats/scroll-threats.gd @@ -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 diff --git a/scenes/tabs-switch/tab-switch.tscn b/scenes/tabs-switch/tab-switch.tscn index 7fd6d96..a148f04 100644 --- a/scenes/tabs-switch/tab-switch.tscn +++ b/scenes/tabs-switch/tab-switch.tscn @@ -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 diff --git a/scenes/tilemap/tilemap.gd b/scenes/tilemap/tilemap.gd index 37e3ae4..c638dfe 100644 --- a/scenes/tilemap/tilemap.gd +++ b/scenes/tilemap/tilemap.gd @@ -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() diff --git a/scenes/настройки/настройки.tscn b/scenes/настройки/настройки.tscn index b77ce24..9a6497d 100644 --- a/scenes/настройки/настройки.tscn +++ b/scenes/настройки/настройки.tscn @@ -64,7 +64,7 @@ const SETTING_TABLE = [ ['Адрес БПО правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'], ['Период опроса состояния БПО, секунды', TableEdit, TableEdit, 'Время в секундах' ], ['Период опроса состояния АФСП, секунды', TableEdit, TableEdit, 'Время в секундах' ], - ['уареп-трасса', TableEdit, TableEdit, 'IP-адрес для связи с Трассой [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'], + ['уарэп-трасса', TableEdit, TableEdit, 'IP-адрес для связи с Трассой [<адрес этого узла>, <адрес удалённого узла>, <порт этого узла>, <порт удалённого узла>]'], ['Включить работу по своим целям', TableEdit, TableToggle, 'Разрешает работу в секторе со своей целью'], ['Список своих протоколов', TableEdit, TableEdit, 'Список протоколов целей, по которым запрещено работать' ], ] diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index 804c031..f0934ec 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -31,7 +31,8 @@ var strob_band_begin: float ## Ширина строба в моме var strob_dir_begin: float ## Направление антенны в момент начала перетаскивания. var strob_width_begin: float ## Ширина строба по углу в момент начала перетаскивания. var view_mode: MapViewMode ## Режим отображения карты -var thrs_dict: Dictionary ## Ссылка на словарь целей +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 diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 8f77b23..08aba72 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -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"] diff --git a/scenes/эмс2/эмс2.tscn b/scenes/эмс2/эмс2.tscn index b88856c..81fd3a0 100644 --- a/scenes/эмс2/эмс2.tscn +++ b/scenes/эмс2/эмс2.tscn @@ -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 diff --git a/scenes/эмс2/эмс_тг.gd b/scenes/эмс2/эмс_тг.gd new file mode 100644 index 0000000..242bda1 --- /dev/null +++ b/scenes/эмс2/эмс_тг.gd @@ -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) diff --git a/scenes/эмс2/эмс_тг.gd.uid b/scenes/эмс2/эмс_тг.gd.uid new file mode 100644 index 0000000..2850227 --- /dev/null +++ b/scenes/эмс2/эмс_тг.gd.uid @@ -0,0 +1 @@ +uid://bvlqgv7aapebl diff --git a/scripts/interfer.gd b/scripts/interfer.gd index 01c7f52..7c9a60c 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -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) - if fs_arr.size(): - for item in fs_arr: - var nmfs = prd.FS_PRD[item][1] - gos_nmfs.append(nmfs) + var fs_arr: Array = [] + 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] + if ecm != null: + send_ecm(ecm, unit_caps) 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 + diff --git a/scripts/settings.gd b/scripts/settings.gd index fe308b9..15d0ddc 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -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 diff --git a/scripts/signaller.gd b/scripts/signaller.gd index c72dcb7..16c703b 100644 --- a/scripts/signaller.gd +++ b/scripts/signaller.gd @@ -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) diff --git a/scripts/tcp5p28.gd b/scripts/tcp5p28.gd index 999c212..a86f775 100644 --- a/scripts/tcp5p28.gd +++ b/scripts/tcp5p28.gd @@ -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) diff --git a/scripts/threats.gd b/scripts/threats.gd index 28f6dea..1070cd2 100644 --- a/scripts/threats.gd +++ b/scripts/threats.gd @@ -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() diff --git a/scripts/trassa.gd b/scripts/trassa.gd index bd94b61..d9b0fbf 100644 --- a/scripts/trassa.gd +++ b/scripts/trassa.gd @@ -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]: diff --git a/uarep-ctl.linux.x86_64 b/uarep-ctl.linux.x86_64 new file mode 100644 index 0000000..e599957 --- /dev/null +++ b/uarep-ctl.linux.x86_64 @@ -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