From fe318fb88e8e8b506e7fd6ed9238d11e23f8e008 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Fri, 21 Jul 2023 16:32:56 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20=D0=B2?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D1=86=D0=B5=D1=81=D1=81=D0=B5.=20=D0=9E?= =?UTF-8?q?=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D0=B2=D1=8F=D0=B7=D0=B8=20=D0=B2=20=D0=B6?= =?UTF-8?q?=D1=83=D1=80=D0=BD=D0=B0=D0=BB=D0=B5,=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D1=91=D0=BC=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B9=20json=20=D0=B8=20=D1=8F=D1=83-07?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/журнал.gd | 7 +++- scenes/работа.gd | 4 -- scenes/работа.tscn | 19 ++++++++-- scripts/repnetwork.gd | 85 +++++++++++++++++++++++++++++------------- scripts/repsettings.gd | 44 ++++++++++++---------- scripts/threats.gd | 73 +++++++++++++++++++++++++----------- scripts/tools.gd | 7 ++++ scripts/yau07.gd | 54 ++++++++++++++------------- 8 files changed, 192 insertions(+), 101 deletions(-) diff --git a/scenes/журнал.gd b/scenes/журнал.gd index d6cb83d7..9aae89ef 100644 --- a/scenes/журнал.gd +++ b/scenes/журнал.gd @@ -1,9 +1,14 @@ extends Control +func _ready() -> void: Log.info('Модуль журнала работы готов') +func on_line_changed(unit, addr): Log.message(Logger.INFO, 'состоянии связи: %s %s' % [unit, addr]) +func on_command_fail(unit, addr): Log.message(Logger.ERROR, 'команда не выполнена: %s %s' % [unit, addr]) + + func _on_clear_button_down() -> void: $content.clear() - Log.info('содержание журнала очищено оператором') + Log.info('Cодержание журнала очищено оператором') func _on_btn_save_button_down() -> void: diff --git a/scenes/работа.gd b/scenes/работа.gd index 8c492017..1f784d63 100644 --- a/scenes/работа.gd +++ b/scenes/работа.gd @@ -155,9 +155,5 @@ func toggle_full_screen(id: int): func _on_full_screen(): - toggle_full_screen(window_1_id) toggle_full_screen(window_0_id) - -func _on_btn_down(signal_name: String) -> void: - emit_signal(signal_name) diff --git a/scenes/работа.tscn b/scenes/работа.tscn index 2b19fc4c..e9a3cb60 100644 --- a/scenes/работа.tscn +++ b/scenes/работа.tscn @@ -39,7 +39,7 @@ metadata/_edit_lock_ = true layout_mode = 0 offset_left = 5.0 offset_top = 313.0 -offset_right = 467.0 +offset_right = 465.0 offset_bottom = 632.0 text = "Параметры цели" @@ -214,6 +214,19 @@ scale = Vector2(1, 0.6) tooltip_text = "Удалить цель" text = "-" +[node name="scrl_threats" type="ScrollContainer" parent="frm_threats"] +layout_mode = 0 +offset_left = 8.0 +offset_top = 57.0 +offset_right = 464.0 +offset_bottom = 306.0 +horizontal_scroll_mode = 0 + +[node name="tbl_threats" type="GridContainer" parent="frm_threats/scrl_threats"] +layout_mode = 2 +columns = 4 +script = ExtResource("4_mqhcf") + [node name="рамка-сеансы-помех" parent="." instance=ExtResource("3_l1omj")] layout_mode = 0 offset_left = 1121.0 @@ -643,5 +656,5 @@ metadata/rfi_name = "" [connection signal="drag_begin" from="." to="." method="_on_drag_begin"] [connection signal="drag_continue" from="." to="." method="_on_drag_continue"] [connection signal="full_screen" from="." to="." method="_on_full_screen" flags=3] -[connection signal="button_down" from="frm_threats/btn_add_thr" to="." method="_on_btn_down" binds= ["add_imit_threat"]] -[connection signal="button_down" from="frm_threats/btn_del_thr" to="." method="_on_btn_down" binds= ["del_imit_threat"]] +[connection signal="pressed" from="frm_threats/btn_add_thr" to="frm_threats" method="_on_btn_add_thr_pressed"] +[connection signal="pressed" from="frm_threats/btn_del_thr" to="frm_threats" method="_on_btn_del_thr_pressed"] diff --git a/scripts/repnetwork.gd b/scripts/repnetwork.gd index 3f9f59e2..dbbf81ad 100644 --- a/scripts/repnetwork.gd +++ b/scripts/repnetwork.gd @@ -1,36 +1,69 @@ extends Node -var sock_unicast: PacketPeerUDP -var sock_broadcast: PacketPeerUDP -var units_yau07: Dictionary +class Socket extends PacketPeerUDP: + func send_to(addr, data): + self.set_dest_address(addr[0], addr[1]) + self.put_packet(data) + + +const PROTO_TYPE: = {'yau07tx': yau07.YaU07, 'jsontx': capsrpb.CapsRpb} +var poll_sockets: Array[Socket] +var units: Dictionary +var sock_unicast: Socket +var logger_page: Node + + +func create_socket(nm) -> Socket: + var addr = REPSettings.addr[nm][1] + var port = REPSettings.addr[nm][2] + var broad = REPSettings.addr[nm][3] + var bind = REPSettings.addr[nm][4] + var sock: = Socket.new() + sock.set_broadcast_enabled(broad) + var rc = Error.OK if not bind else sock.bind(port, addr) + var errlevel = Log.INFO if rc == Error.OK else Log.ERROR + Log.message(errlevel, '%s: сокет:%s:%d привязанный:%s %s' % [nm, addr, port, ['нет', 'да'][int(bind)], error_string(rc)]) + return sock func _ready() -> void: - var addr = REPSettings.addr['уарэп-яу07-частный'][1] - var port = REPSettings.addr['уарэп-яу07-частный'][2] - sock_unicast = PacketPeerUDP.new() - sock_unicast.bind(port, addr) + Log.info('Сетевой модуль готов') + poll_sockets.append(create_socket('уарэп-яу07-частный')) + poll_sockets.append(create_socket('уарэп-яу07-общий')) + poll_sockets.append(create_socket('уарэп-капсрпб-пол')) + + sock_unicast = poll_sockets[0] + for key in REPSettings.addr: - var prof = REPSettings.addr[key] - if prof[0] == 'yau07': - addr = REPSettings.addr[key][1] - port = REPSettings.addr[key][2] - var unit = yau07.YaU07.new([addr, port]) - var addr_port: String = '%s:%d' % [addr, port] - units_yau07[addr_port] = unit - Log.info('ЯУ-07: %s' % unit) + var setting = REPSettings.addr[key] + var proto = setting[0] + if proto in PROTO_TYPE: + var unit = PROTO_TYPE[proto].new(key) + var addr = Array([setting[1], setting[2]]) + units[addr] = unit + unit.connect('line_changed', Callable(logger_page, 'on_line_changed').bind(addr)) + unit.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(addr)) + + for addr in units: + var unit = units[addr] + Log.info('%s %s:%d' % [unit.name, addr[0], addr[1]]) + + +func poll_receive(sock: Socket): + while sock.get_available_packet_count() > 0: + var data: = sock.get_packet() + var addr: = sock.get_packet_ip() + var port: = sock.get_packet_port() + var addr_port: = [addr, port] + if addr_port in units: units[addr_port].parse(data) func _process(delta: float) -> void: - for unit in units_yau07.values() as Array[yau07.YaU07]: - unit.process(delta, sock_unicast) - - while sock_unicast.get_available_packet_count() > 0: - var data = sock_unicast.get_packet() - var addr = sock_unicast.get_packet_ip() - var port = sock_unicast.get_packet_port() - var addr_port: String = '%s:%d' % [addr, port] - if addr_port in units_yau07: - var unit: yau07.YaU07 = units_yau07[addr_port] - unit.parse(data) + for addr in units: + var unit = units[addr] + match unit.process(delta): + Error.OK: sock_unicast.send_to(addr, unit.data_tx) + Error.FAILED: emit_signal('socket_error', 'ошибка: %s %s:%d' % [unit, addr[0], addr[1]]) + for sock in poll_sockets: + poll_receive(sock) diff --git a/scripts/repsettings.gd b/scripts/repsettings.gd index 7c4db0a0..b7515f6f 100644 --- a/scripts/repsettings.gd +++ b/scripts/repsettings.gd @@ -1,21 +1,27 @@ extends Node -@export var addr: Dictionary = { \ - 'уарэп-яу07-частный': ['udp', '10.1.1.160', 50160, 'IP-адрес ЯУ-07 прибора УФ'], - 'уарэп-яу07-общий': ['udp', '10.1.1.255', 50000, 'IP-адрес для приёма широковещательных пакетов от ЯУ-07'], - 'уарэп-капсрпб-пол': ['udp', 'localhost', 42023, 'IP-адрес получения сообщений от КАПС РПБ'], - 'уарэп-капсрпб-отп': ['udp', 'localhost', 42022, 'IP-адрес отправки сообщений на КАПС РПБ'], - 'уарэп-эмс': ['yau07', '10.1.1.27', 50027, 'IP-адрес ЯУ-07 прибора УФ'], - 'уарэп-яу07-2в': ['yau07', '10.1.1.34', 50034, 'IP-адрес ЯУ-07 прибора ПРД-В'], - 'уарэп-яу07-2н': ['yau07', '10.1.1.33', 50033, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - 'уарэп-яу07-2к': ['yau07', '10.1.1.35', 50035, 'IP-адрес ЯУ-07 прибора ПРД-К'], - 'уарэп-яу07-4в': ['yau07', '10.1.1.66', 50066, 'IP-адрес ЯУ-07 прибора ПРД-В'], - 'уарэп-яу07-4н': ['yau07', '10.1.1.65', 50065, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - 'уарэп-яу07-4к': ['yau07', '10.1.1.67', 50067, 'IP-адрес ЯУ-07 прибора ПРД-К'], - 'уарэп-яу07-1в': ['yau07', '10.1.1.18', 50018, 'IP-адрес ЯУ-07 прибора ПРД-В'], - 'уарэп-яу07-1н': ['yau07', '10.1.1.17', 50017, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - 'уарэп-яу07-1к': ['yau07', '10.1.1.19', 50019, 'IP-адрес ЯУ-07 прибора ПРД-К'], - 'уарэп-яу07-3в': ['yau07', '10.1.1.50', 50050, 'IP-адрес ЯУ-07 прибора ПРД-В'], - 'уарэп-яу07-3н': ['yau07', '10.1.1.49', 50049, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - 'уарэп-яу07-3к': ['yau07', '10.1.1.51', 50051, 'IP-адрес ЯУ-07 прибора ПРД-Н'], - 'уарэп-щ3': ['uart', '/dev/stty0', 115200, 1, 1, false, 1000, 'Прибор Щ3 (скорость, стартовых, стоповых, чётность, таймаут в мкс)'] } + +@export var addr: = { \ +# Название Протокол Адрес Порт Широков. Привяз. Комментарий + 'уарэп-яу07-частный': ['yau07rx', '127.0.0.1', 50079, false, true, 'IP-адрес на котором принимают частные сообщения от ЯУ-07'], + 'уарэп-яу07-общий': ['yau07rx', '127.0.0.255', 50000, true, true, 'IP-адрес на котором принимают широковещательные сообщения от ЯУ-07'], + 'уарэп-капсрпб-пол': ['jsonrx', '127.0.0.1', 42023, false, true, 'IP-адрес на котором принимают сообщения от КАПС РПБ'], + 'уарэп-капсрпб-отп': ['jsontx', '127.0.0.1', 42022, false, false, 'IP-адрес на который отправляют сообщения для КАПС РПБ'], + 'уарэп-эмс': ['yau07tx', '10.1.1.27', 50027, false, false, 'IP-адрес ЯУ-07 прибора УФ'], + 'уарэп-яу07-2в': ['yau07tx', '10.1.1.34', 50034, false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уарэп-яу07-2н': ['yau07tx', '10.1.1.33', 50033, false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-яу07-2к': ['yau07tx', '10.1.1.35', 50035, false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'], + 'уарэп-яу07-4в': ['yau07tx', '10.1.1.66', 50066, false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уарэп-яу07-4н': ['yau07tx', '10.1.1.65', 50065, false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-яу07-4к': ['yau07tx', '10.1.1.67', 50067, false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'], + 'уарэп-яу07-1в': ['yau07tx', '10.1.1.18', 50018, false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уарэп-яу07-1н': ['yau07tx', '10.1.1.17', 50017, false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-яу07-1к': ['yau07tx', '10.1.1.19', 50019, false, false, 'IP-адрес ЯУ-07 прибора ПРД-К'], + 'уарэп-яу07-3в': ['yau07tx', '10.1.1.50', 50050, false, false, 'IP-адрес ЯУ-07 прибора ПРД-В'], + 'уарэп-яу07-3н': ['yau07tx', '10.1.1.49', 50049, false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-яу07-3к': ['yau07tx', '10.1.1.51', 50051, false, false, 'IP-адрес ЯУ-07 прибора ПРД-Н'], + 'уарэп-щ3': ['uart', '/dev/stty0', 115200, 1, 1, false, 1000, 'Прибор Щ3'] } # скорость, стартовых, стоповых, чётность, таймаут в мкс + + +func _ready() -> void: + Log.info('Модуль настроек готов') diff --git a/scripts/threats.gd b/scripts/threats.gd index 355c5d8d..20d0d3ce 100644 --- a/scripts/threats.gd +++ b/scripts/threats.gd @@ -1,29 +1,58 @@ extends Node +enum ThreatSrc { + SIGMA, + RLKS, + RPB, + MP405 } + class Threat: enum FFlags { # Допустимые значения для Threat.fflags - NONE = 0, TMOD = 1, BAUD = 2, PROTO = 4, - SLON = 8, SLAT = 16, SALT = 32, LAT = 64, - LON = 128, ALT = 256 } + TMOD = 1 << 0, + BAUD = 1 << 1, + PROTO = 1 << 2, + SLON = 1 << 3, + SLAT = 1 << 4, + SALT = 1 << 5, + LAT = 1 << 6, + LON = 1 << 7, + ALT = 1 << 8, + AOA = 1 << 9, + FREQ = 1 << 10, + WIDTH = 1 << 11, + } + + var aoa: float # Курсовой угол на источник сигнала, градусы. + var freq: float # Частота несущей или центральная частота, МГц + var width: float # Ширина занимаемого диапазона частот, МГц + var pow_rx: float # Уровень принимаемого сигнала, дБм + var tick: int # Время приёма сигнала, мс + var freqm: String # Режим смены частоты + var rkrp: String # Рекомендуемый режим помехи + var rparams: String # Рекомендуемые параметры помехи + var tmod: String # Тип модуляции + var baud: float # Модуляционная скорость + var proto: String # Тип протокола источника сигнала + var slon: float # Координаты старта, долгота в градусах. Достоверность задана значением Threat.fflags + var slat: float # Координаты старта, широта в градусах. Достоверность задана значением Threat.fflags + var salt: float # Координаты старта, высота от уровня моря. метры. Достоверность задана значением Threat.fflags + var lat: float # Текущие координаты, долгота в градусах. Достоверность задана значением Threat.fflags + var lon: float # Текущие координаты, широта в градусах. Достоверность задана значением Threat.fflags + var alt: float # Текущая высота, метры. Достоверность задана значением Threat.fflags + var atime: Dictionary # Время обнаружения + var utime: Dictionary # Время крайнего обновления + var fflags: FFlags # Флаги достоверности полей + + +var _threats = {} +""" +Список целей. Индекс - <источник цели>:<номер цели> +Источник цели может быть: 'RPB', 'SIGMA', 'RLKS', 'MP405' +""" + + +func _ready() -> void: + Log.info('Модуль обработки целей готов') - var id: int # Идентификатор цели - var aoa: float # Курсовой угол на источник сигнала, градусы. - var freq: float # Частота несущей или центральная частота, МГц - var width: float # Ширина занимаемого диапазона частот, МГц - var pow_rx: float # Уровень принимаемого сигнала, дБм - var tick: int # Уровень принимаемого сигнала, дБм - var freqm: String # Режим смены частоты - var rkrp: String # Рекомендуемый режим помехи - var rparams: String # Рекомендуемые параметры помехи - var tmod: String # Тип модуляции - var baud: float # Модуляционная скорость - var proto: String # Тип протокола источника сигнала - var slon: float # Координаты старта, долгота в градусах. Достоверность задана значением Threat.fflags - var slat: float # Координаты старта, широта в градусах. Достоверность задана значением Threat.fflags - var salt: float # Координаты старта, высота от уровня моря. метры. Достоверность задана значением Threat.fflags - var lat: float # Текущие координаты, долгота в градусах. Достоверность задана значением Threat.fflags - var lon: float # Текущие координаты, широта в градусах. Достоверность задана значением Threat.fflags - var alt: float # Текущая высота, метры. Достоверность задана значением Threat.fflags - var fflags: FFlags # Флаги достоверности полей diff --git a/scripts/tools.gd b/scripts/tools.gd index bf9720ac..cd5e55ad 100644 --- a/scripts/tools.gd +++ b/scripts/tools.gd @@ -1,6 +1,13 @@ extends Node +func assert_array_ipaddr(val: Array): + """ Выкидывает исключение, если массив не содержит ip-адрес """ + assert(val[0] is String) + assert(val[1] is int) + assert((0 < val[1]) and (val[1] < 65536)) + + func map_dec_to_rad(pos0: Vector2, pos: Vector2) -> Vector2: """ Преобразует декартовые координаты в полярные """ var x1: float = pos.x - pos0.x diff --git a/scripts/yau07.gd b/scripts/yau07.gd index d8514181..acda9c0e 100644 --- a/scripts/yau07.gd +++ b/scripts/yau07.gd @@ -1,11 +1,14 @@ extends Node +# Протокол ячейки ЯУ-07 + const ONLINE_TIMEOUT = 5.0 # Время ожидания пакета от ячейки, секунды const RESEND_TIMEOUT = 0.3 # Задержка для повторной отправки команды, секунды const RETRY_COUNT = 5 # Количество повторных отправок -const DEFAULT_ADDR = ['localhost', 50000] const BUFFER_SIZE = 2048 + + # Ячейка ЯУ-07 class YaU07: @@ -20,12 +23,11 @@ class YaU07: DONE, # Команда выполнена FAIL } # Команда не выполнена - signal online_changed(yau07: YaU07) - signal command_done(yau07: YaU07) - signal command_fail(yau07: YaU07) - signal net_error(message: String) + signal line_changed(unit: YaU07) + signal command_done(unit: YaU07) + signal command_fail(unit: YaU07) - var src_addr: = DEFAULT_ADDR # Адрес источника + var name: = String() var cmd_num_rx: = 0 # Номер команды принятый var cmd_num_tx: = 0 # Номер команды переданный var cmd_state = CmdState.UNCK # Состояние выполнения команды @@ -41,39 +43,39 @@ class YaU07: var isa_ports = {} # Результат выполнения команды "читать порт" var online = false - func _to_string() -> String: - return '%s %s:%d cmd_num:%d' % [['отключен', 'на связи'][int(online)], src_addr[0], src_addr[1], cmd_num_rx] + func _to_string() -> String: return String('яу07: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]]) - func _init(addr: Array): - src_addr = addr + func _init(nm): + self.name = nm tx_data.resize(BUFFER_SIZE) tx_data.fill(0) + tick = 0.0 - func process(delta: float, sock: PacketPeerUDP): + func process(delta: float): tick += delta + if online and ((tick - cmd_tick_rx) > ONLINE_TIMEOUT): + online = false + emit_signal('line_changed', self) + + var rc = Error.ERR_BUSY if cmd_state == CmdState.SEND: - sock.set_dest_address(src_addr[0], src_addr[1]) - if sock.put_packet(tx_data.slice(0, tx_len)) == OK: - cmd_tick_tx = tick - cmd_state = CmdState.WAIT - cmd_retry = RETRY_COUNT + rc = rc.OK + cmd_tick_tx = tick + cmd_state = CmdState.WAIT + cmd_retry = RETRY_COUNT elif cmd_state == CmdState.WAIT: if cmd_retry: if (tick - cmd_tick_tx) > RESEND_TIMEOUT: - sock.set_dest_address(src_addr[0], src_addr[1]) - if sock.put_packet(tx_data.slice(0, tx_len)) == OK: - cmd_tick_tx = tick - else: - emit_signal('socket_error', 'ошибка: пакет не отправлен на: %s' % src_addr) + rc = Error.OK + cmd_tick_tx = tick cmd_retry -= 1 else: cmd_state = CmdState.FAIL emit_signal('command_fail', self) - if online and ((tick - cmd_tick_rx) > ONLINE_TIMEOUT): - online = false - emit_signal('online_changed', self) + rc = Error.FAILED + return rc func send_isa(cmd_code: int, ports_data: Array) -> bool: @@ -151,7 +153,7 @@ class YaU07: if not online: online = true - emit_signal('online_changed', self) + emit_signal('line_changed', self) var rx_data_len = rx_data.size() if rx_data_len < 11: @@ -187,7 +189,7 @@ class YaU07: if cmd_result != 1: # Команда не выполнена return false - var cmd_code: CmdCode = rx_data[cmd_code_pos] # "код команды" + var cmd_code: CmdCode = rx_data[cmd_code_pos] as CmdCode # "код команды" if (cmd_code == CmdCode.READ_ISA) or (cmd_code == CmdCode.WRITE_ISA): parse_isa(rx_data, status_len)