From f817056fbb83fef11c502076c707d2468880bb29 Mon Sep 17 00:00:00 2001 From: lepshiy Date: Fri, 26 Sep 2025 14:47:03 +0300 Subject: [PATCH] =?UTF-8?q?=D1=82=D1=80=D0=B0=D1=81=D1=81=D0=B0.=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BC=D0=B5=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/настройки/настройки.tscn | 20 +++- scenes/работа/работа.tscn | 2 +- scripts/settings.gd | 2 +- scripts/trassa.gd | 186 +++++++++++++++++++++----------- 4 files changed, 140 insertions(+), 70 deletions(-) diff --git a/scenes/настройки/настройки.tscn b/scenes/настройки/настройки.tscn index b69067fc..64267b01 100644 --- a/scenes/настройки/настройки.tscn +++ b/scenes/настройки/настройки.tscn @@ -31,6 +31,7 @@ const SETTING_TABLE = [ ['Кнопка «JTIDS»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], ['Кнопка «КУПД»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], ['Внешнее управление', TableEdit, TableToggle, 'Передать управление в 5П28'], + ['Внешнее указание Трасса', TableEdit, TableToggle, 'Разрешить постановку помех от Трасса'], ['Кнопка «Подавление»', TableEdit, TableToggle, 'Разрешить отображение кнопки'], ['Виртуальная клавиатура', TableEdit, TableToggle, 'Включить отображение экранной клавиатуры'], ['Скрыть вкладку ЭМС 2', TableEdit, TableToggle, 'Отображать вкладку \\\"ЭМС-2\\\"'], @@ -63,10 +64,11 @@ const SETTING_TABLE = [ ['Адрес БПО правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'] ] const EXTERNAL_CU = 16 ## Внешнее целеуказание -const SUPPRESS = 17 ## Строка - Подавление -const KEYBOARD = 18 ## Строка - Виртуальная клавиатура -const HIDE_EMS2 = 19 ## Строка - Скрыть вкладку ЭМС 2 -const COMMIT = 20 ## Строка - Версия УАРЭП +const TRASSA = 17 +const SUPPRESS = 18 ## Строка - Подавление +const KEYBOARD = 19 ## Строка - Виртуальная клавиатура +const HIDE_EMS2 = 20 ## Строка - Скрыть вкладку ЭМС 2 +const COMMIT = 21 ## Строка - Версия УАРЭП var name_to_line_index: = {} ## Для преобразования названия параметра в номер строки @@ -90,6 +92,11 @@ func on_external_cu_btn_pressed(btn) -> void: signaller.emit_signal('interfer_off_all') +func on_trassa_btn_pressed(btn) -> void: + var state = btn.button_pressed + ProjectSettings.set_setting('application/config/Внешнее указание Трасса', state) + + func on_vk_pressed(btn) -> void: var state = btn.button_pressed signaller.emit_signal('kb_pressed', state) @@ -206,6 +213,11 @@ func button_settings(): var extern_cu_node = $scroll_set/table.get_node2(1, EXTERNAL_CU).get_children()[0] extern_cu_node.connect('pressed', on_external_cu_btn_pressed.bind(extern_cu_node)) on_external_cu_btn_pressed(extern_cu_node) + + var trassa_node = $scroll_set/table.get_node2(1, TRASSA).get_children()[0] + trassa_node.connect('pressed', on_trassa_btn_pressed.bind(trassa_node)) + on_trassa_btn_pressed(trassa_node) + var vk_node = $scroll_set/table.get_node2(1, KEYBOARD).get_children()[0] vk_node.connect('pressed', on_vk_pressed.bind(vk_node)) var ems2_hide_node = $scroll_set/table.get_node2(1, HIDE_EMS2).get_children()[0] diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 64b1bbd5..6d645182 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -305,6 +305,6 @@ text = "Масштаб:" [connection signal="drag_continue" from="." to="." method="_on_drag_continue"] [connection signal="toggled" from="btn_view" to="." method="on_button_view_toggled"] [connection signal="toggled" from="chk_auto" to="." method="on_value_changed"] -[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"] [connection signal="toggled" from="btn_activate" to="." method="on_btn_activate"] +[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"] [connection signal="toggled" from="btn_center" to="." method="on_btn_center_toggled"] diff --git a/scripts/settings.gd b/scripts/settings.gd index 09246d63..2ac22b72 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', 42023, 42022, false, true], 'IP-адрес для обмена сообщениями со службой \"МП550\" (СТЦ)'], - 'уарэп-трасса': ['capsrpb', ['127.0.0.1', 50200, 40241, false, true], 'IP-адрес для обмена сообщениями с \"Трассой\"'], + 'уарэп-трасса': ['trassa', ['127.0.0.1', 50200, 50200, 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'], diff --git a/scripts/trassa.gd b/scripts/trassa.gd index d623a480..fd1404bc 100644 --- a/scripts/trassa.gd +++ b/scripts/trassa.gd @@ -1,84 +1,142 @@ -class_name trassa_unit extends Node +class_name trassa_unit +extends Node -const ONLINE_TIMEOUT: int = 5000 ## Время ожидания данных -const REQUEST_PERIOD: int = 3000 ## Переиод запроса, мс +const ONLINE_TIMEOUT: int = 5000 # Время ожидания данных +const REQUEST_PERIOD: int = 3000 # Период отправки, мс +const WORDS_TOTAL: int = 75 +const NOINFO: int = 0x80000000 class Trassa extends unit.Unit: - - enum CmdCode { - START = 1, - STOP = 0, - INFO = 4, - } - - - func sciCalcFCS(src: PackedByteArray) -> int: - var fcs: int = 0 - for b in src: - fcs ^= b - print("FCS: ", fcs) - return fcs & 0xFF + var source_addr: Array + var tx_stack: Array[PackedByteArray] = [] + var _msg_counter: int = 0 + var ecms: Dictionary = {} # Словарь всех активных помех + var srn = 0 + var jtids = 0 func _init(nm: StringName) -> void: self.name = nm - tx_data.resize(10) - tx_data[0] = 0 #ID - tx_data[1] = 0 #Nc - tx_data[2] = 0 #RKS - tx_data[3] = 0 #RR - tx_data[4] = 0 #Td - tx_data[5] = 0 #Nt - tx_data[6] = 0 #Пакет от uarep-ctl - tx_data[7] = CmdCode.INFO #SRN - tx_data[8] = CmdCode.INFO #JTIDS - tx_data[9] = 0 #CRC - print("INIT: ", self.name) + tx_data.resize(WORDS_TOTAL) + tx_data.fill(NOINFO) + interfer.connect("interfer_update", Callable(self, "_on_interfer_update")) + interfer.connect("interfer_resized", Callable(self, "_on_interfer_resized")) + # Обработка полученного пакета func parse(rx_data: PackedByteArray, tick: int): - print("PARSE: ", tick, "size:", rx_data.size()) - if rx_data.size() != 40: - print("PARSE: ") - emit_signal("parse_failed", self) + rx_tick = tick + if not online: + online = true + emit_signal("line_changed", self) + var spb := StreamPeerBuffer.new() + spb.big_endian = true + spb.data_array = rx_data + var words: Array[int] = [] + while spb.get_position() < spb.data_array.size(): + words.append(spb.get_u32()) + if words.size() < 10: + emit_signal('parse_failed', self) return - var expected_fcs = sciCalcFCS(rx_data.slice(0, 39)) - if expected_fcs != rx_data[39]: - print("PARSE: ", expected_fcs, "Got:", rx_data[39]) - emit_signal("parse_failed", self) - return - var strings := [] - for i in range(10): - var offset = i * 4 - var line = rx_data.slice(offset, offset + 4) - print("PARSE: ", i, ":", line) - strings.append(line) - print("PARSE: ") - emit_signal("data_received", strings) + _msg_counter += 1 + tx_data.fill(NOINFO) + tx_data[0] = words[0] # ID + tx_data[1] = _msg_counter # Nc + tx_data[2] = 0x01 # Nб + tx_data[3] = 0x00 # Ск + tx_data[4] = 0x0194 # НТС + tx_data[5] = (0x0001 << 16) | 0x0080 # Ии + tx_data[6] = 0x01 # РКС + srn = words[7] # SRN + jtids = words[8] # JTIDS + + btn_trassa_pressed() + + tx_data[74] = _calc_crc(tx_data) + emit_signal("data_received", self) + # Проверка активности помехи + func _is_interfer_active(interfer_name: String) -> bool: + for ecm in ecms.values(): + if ecm.krp and ecm.krp == interfer_name: + return ecm.svk == 1 + return false + + + # Основной процесс отправки func process(tick: int) -> int: - var rc: = Error.ERR_BUSY + var rc := Error.ERR_BUSY if (tick - tx_tick) > REQUEST_PERIOD: tx_tick = tick rc = Error.OK - print("PROCESS: ", tick) - if online: - if (tick - rx_tick) > ONLINE_TIMEOUT: - online = false - emit_signal('line_changed', self) + var packet := PackedByteArray() + packet.resize(WORDS_TOTAL * 4) + for i in range(WORDS_TOTAL): + packet.encode_u32(i * 4, tx_data[i]) + tx_stack.append(packet) + + print(packet) + return rc + if online and (tick - rx_tick) > ONLINE_TIMEOUT: + online = false + emit_signal("line_changed", self) return rc - func build_packet() -> PackedByteArray: - var packet := PackedByteArray() - packet.resize(40) - for i in range(10): - var offset = i * 4 - packet[offset + 0] = i - packet[offset + 1] = i + 1 - packet[offset + 2] = i + 2 - packet[offset + 3] = i + 3 - packet[39] = sciCalcFCS(packet.slice(0, 39)) - print("BUILD: ", packet) - return packet + # CRC вычисление + func _calc_crc(data: Array) -> int: + var acc: int = 0 + for i in range(data.size() - 1): # кроме CRC + if i in [0, 1]: + continue + acc = (acc + (data[i] & 0xFFFFFFFF)) & 0xFFFFFFFF + return acc + + + # Обновление конкретной помехи + func _on_interfer_update(ecm_object: Object) -> void: + var ecm_data = { + "krp": ecm_object.krp, + "svk": ecm_object.svk, + "nmfs": ecm_object.nmfs + } + #prd.fs_caps_id[] + if ecm_data.krp: + ecms[ecm_data.krp] = ecm_data + print("Обновление krp:", ecm_data.krp, "svk:", ecm_data.svk, "fs:", ecm_data.nmfs) + + + # Обновление всех активных помех при изменении размера + func _on_interfer_resized(ecms_objects: Dictionary) -> void: + ecms.clear() + for ecm_id in ecms_objects: + var ecm_object = ecms_objects[ecm_id] + var ecm_data = { + "krp": ecm_object.krp, + "svk": ecm_object.svk, + "nmfs": ecm_object.nmfs + } + if ecm_data.krp: + ecms[ecm_data.krp] = ecm_data + print("Обновлен список: ") + for ecm_key in ecms: + var ecm = ecms[ecm_key] + if ecm.krp: + print("krp:", ecm.krp, "svk:", ecm.svk, "fs:", ecm.nmfs) + + + func btn_trassa_pressed() -> void: + var state = ProjectSettings.get_setting('application/config/Внешнее указание Трасса', false) + if state == true: + if srn == 1: + tx_data[65] = 1 + signaller.emit_signal('interfer_prinuditelno', frm_ecm_list.srn_sectors) + else: + tx_data[65] = 0 + + if jtids == 1: + tx_data[66] = 1 + signaller.emit_signal('interfer_prinuditelno', frm_ecm_list.jtids_sectors) + else: + tx_data[66] = 0