diff --git a/scenes/frame-ecm-list/frm-ecm-list.tscn b/scenes/frame-ecm-list/frm-ecm-list.tscn index b1c524e..6508d41 100644 --- a/scenes/frame-ecm-list/frm-ecm-list.tscn +++ b/scenes/frame-ecm-list/frm-ecm-list.tscn @@ -57,7 +57,7 @@ size_flags_vertical = 3 tooltip_text = "Включает принудительную помеху" strips_rotation = 15.0 text = "СРН" -font_size = null +font_size = 1 metadata/rfi_name = "srn" [node name="btn_jtids" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")] @@ -67,7 +67,7 @@ size_flags_horizontal = 3 size_flags_vertical = 3 strips_rotation = 15.0 text = "СПРС" -font_size = null +font_size = 1 metadata/rfi_name = "sprs" [node name="btn_kupd" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")] @@ -77,7 +77,7 @@ size_flags_vertical = 3 tooltip_text = "Кнопка для принудительного включения группы секторов в режим КУПД" strips_rotation = 15.0 text = "КУПД" -font_size = null +font_size = 1 metadata/rfi_name = "kupd" [node name="btn_panika" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")] @@ -87,7 +87,7 @@ size_flags_vertical = 3 tooltip_text = "Кнопка для принудительного включения группы секторов в режим КУПД" strips_rotation = 15.0 text = "Паника" -font_size = null +font_size = 1 metadata/rfi_name = "" [node name="btn_cancel" parent="grd_forced" groups=["прин-секторы-срн"] instance=ExtResource("4_7ys3c")] @@ -96,5 +96,5 @@ size_flags_horizontal = 3 size_flags_vertical = 3 strips_rotation = 15.0 text = "Очистить" -font_size = null +font_size = 1 metadata/rfi_name = "" diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 9e1abc8..a166735 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -174,7 +174,7 @@ size_flags_vertical = 3 tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой" strips_rotation = 25.0 text = "Строб" -font_size = null +font_size = 1 metadata/state = 0 [node name="btn_threats" parent="btns_select" groups=["группа-режим-выбора"] instance=ExtResource("8_k0iv2")] @@ -184,7 +184,7 @@ size_flags_vertical = 3 tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой" strips_rotation = 25.0 text = "Цель" -font_size = null +font_size = 1 metadata/state = 1 [node name="btn_fs_sector" parent="btns_select" groups=["группа-режим-выбора"] instance=ExtResource("8_k0iv2")] @@ -194,7 +194,7 @@ size_flags_vertical = 3 tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой" strips_rotation = 25.0 text = "Сектор" -font_size = null +font_size = 1 metadata/state = 2 [node name="chk_auto" type="CheckBox" parent="."] diff --git a/scripts/settings.gd b/scripts/settings.gd index 2ac22b7..8d716db 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\" (СТЦ)'], - 'уарэп-трасса': ['trassa', ['127.0.0.1', 50200, 50200, false, true], 'IP-адрес для обмена сообщениями с \"Трассой\"'], + 'уарэп-трасса': ['trassa', ['127.0.0.1', 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'], diff --git a/scripts/trassa.gd b/scripts/trassa.gd index fd1404b..428e2e8 100644 --- a/scripts/trassa.gd +++ b/scripts/trassa.gd @@ -8,19 +8,20 @@ const NOINFO: int = 0x80000000 class Trassa extends unit.Unit: + var unit_caps = network.get_unit_instance('уарэп-капсрпб') var source_addr: Array - var tx_stack: Array[PackedByteArray] = [] - var _msg_counter: int = 0 + var tx_stack: Array[int] = [] + 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(WORDS_TOTAL) - tx_data.fill(NOINFO) - interfer.connect("interfer_update", Callable(self, "_on_interfer_update")) - interfer.connect("interfer_resized", Callable(self, "_on_interfer_resized")) + tx_stack.resize(WORDS_TOTAL) + tx_stack.fill(NOINFO) + interfer.connect("interfer_resized", Callable(self, "on_interfer_resized")) # Обработка полученного пакета @@ -29,59 +30,72 @@ class Trassa extends unit.Unit: 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()) + var offset: int = 0 + while offset < rx_data.size(): + if offset + 4 <= rx_data.size(): + var word = rx_data.decode_u32(offset) + words.append(word) + offset += 4 + else: + break if words.size() < 10: emit_signal('parse_failed', self) - return - _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 - + tx_stack.fill(NOINFO) + tx_stack[0] = words[0] # ID + tx_stack[1] = msg_counter # Nc + tx_stack[2] = 0x01 # Nб + tx_stack[3] = 0x00 # Ск + tx_stack[4] = 0x0194 # НТС + tx_stack[5] = (0x0001 << 16) | 0x0080 # Ии + tx_stack[6] = 0x01 # РКС + srn = words[7] # SRN + jtids = words[8] # JTIDS btn_trassa_pressed() - - tx_data[74] = _calc_crc(tx_data) + interfer_data() + tx_stack[74] = _calc_crc(tx_stack) emit_signal("data_received", self) - # Проверка активности помехи - func _is_interfer_active(interfer_name: String) -> bool: + func interfer_data() -> void: + for i in range(67, 74): + tx_stack[i] = 0 for ecm in ecms.values(): - if ecm.krp and ecm.krp == interfer_name: - return ecm.svk == 1 - return false - + if ecm.svk == 1: + var nmfs_value = ecm.nmfs + var fs_key = get_fs_key(nmfs_value) + if fs_key != NOINFO: + var string_index = fs_key / 4 + var bit_position = fs_key % 4 + if string_index >= 0 and string_index < 7: + var target_string = 67 + string_index + tx_stack[target_string] |= (1 << bit_position) - # Основной процесс отправки - func process(tick: int) -> int: - var rc := Error.ERR_BUSY - if (tick - tx_tick) > REQUEST_PERIOD: - tx_tick = tick - rc = Error.OK - 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: + + func get_fs_key(nmfs_value: int) -> int: + if prd.fs_caps_id.has(nmfs_value): + return prd.fs_caps_id[nmfs_value] + return NOINFO + + + # Отправка пакета от uarep-ctl + func process(now_tick: int) -> int: + if online and ((now_tick - rx_tick) > ONLINE_TIMEOUT): online = false emit_signal("line_changed", self) - return rc + if (now_tick - tx_tick) > REQUEST_PERIOD: + tx_tick = now_tick + msg_counter += 1 + interfer_uarep() + interfer_data() + var data = PackedByteArray() + data.resize(WORDS_TOTAL * 4) + for i in range(WORDS_TOTAL): + data.encode_u32(i * 4, tx_stack[i]) + tx_data = data + tx_len = WORDS_TOTAL * 4 + return Error.OK + return Error.ERR_BUSY # CRC вычисление @@ -94,49 +108,42 @@ class Trassa extends unit.Unit: 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_dic: Dictionary) -> void: ecms = ecms_dic - # Обновление всех активных помех при изменении размера - 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 interfer_uarep() -> void: + tx_stack[65] = 0 + tx_stack[66] = 0 + for ecm in ecms.values(): + if ecm.krp == "srni1" and ecm.svk == 1: + tx_stack[65] = 1 + if ecm.krp == "svi1" and ecm.svk == 1: + tx_stack[66] = 1 + tx_stack[1] = msg_counter + # Обработка указаний от Трассы по кнопке func btn_trassa_pressed() -> void: var state = ProjectSettings.get_setting('application/config/Внешнее указание Трасса', false) if state == true: if srn == 1: - tx_data[65] = 1 + tx_stack[65] = 1 signaller.emit_signal('interfer_prinuditelno', frm_ecm_list.srn_sectors) else: - tx_data[65] = 0 - + tx_stack[65] = 0 + for ecm in ecms.values(): + if ecm.krp == "srni1" and ecm.svk == 1: + ecm.krp = interfer.INTERFER_OFF + interfer.send_ecm(ecm, unit_caps) + signaller.emit_signal('interfer_off', ecm) if jtids == 1: - tx_data[66] = 1 + tx_stack[66] = 1 signaller.emit_signal('interfer_prinuditelno', frm_ecm_list.jtids_sectors) else: - tx_data[66] = 0 + tx_stack[66] = 0 + for ecm in ecms.values(): + if ecm.krp == "svi1" and ecm.svk == 1: + ecm.krp = interfer.INTERFER_OFF + interfer.send_ecm(ecm, unit_caps) + signaller.emit_signal('interfer_off', ecm)