Merge remote-tracking branch 'lepshiy/master'

This commit is contained in:
MaD_CaT
2025-10-06 10:41:04 +03:00
3 changed files with 176 additions and 12 deletions

View File

@@ -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]

View File

@@ -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'],

View File

@@ -1,13 +1,165 @@
class_name trassa_unit extends Node
class_name trassa_unit
extends Node
const ONLINE_TIMEOUT: int = 5000 # Время ожидания данных
const REQUEST_PERIOD: int = 3000 # Период отправки, мс
const WORDS_TOTAL: int = 75
const NOINFO: int = 0x80000000
class Trassa extends unit.Unit:
var source_addr: = []
func process(tick: int):
var unit_caps = network.get_unit_instance('уарэп-капсрпб')
var source_addr: Array
var tx_stack: Array[int] = []
var msg_counter: int = 0
var ecms: Dictionary = {} # Словарь всех активных помех
var srn = 0
var jtids = 0
var prinud_but: Array = []
var forced_buttons: Array = [] # Храним ссылки на кнопки
# Инициализация
func _init(nm: StringName, buttons: Array = []) -> void:
self.name = nm
self.forced_buttons = buttons
tx_stack.resize(WORDS_TOTAL)
tx_stack.fill(NOINFO)
interfer.connect("interfer_resized", Callable(self, "on_interfer_resized"))
# Обработка полученного пакета
func parse(rx_data: PackedByteArray, tick: int):
rx_tick = tick
if not online:
online = true
emit_signal("line_changed", self)
var words: Array[int] = []
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)
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()
interfer_data()
tx_stack[74] = _calc_crc(tx_stack)
emit_signal("data_received", self)
func interfer_data() -> void:
for i in range(67, 74):
tx_stack[i] = 0
for ecm in ecms.values():
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 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)
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
func _init(unit_name: StringName):
self.name = unit_name
func parse(data: PackedByteArray, now_tick: int):
pass
# 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_resized(ecms_dic: Dictionary) -> void: ecms = ecms_dic
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:
var tree: SceneTree = Engine.get_main_loop()
if tree is SceneTree:
var nodes: Array = tree.get_nodes_in_group('группа-принудительно')
for btn in nodes:
if btn.name == 'btn_srn':
btn.pressed = (srn == 1)
elif btn.name == 'btn_jtids':
btn.pressed = (jtids == 1)
if srn == 1:
tx_stack[65] = 1
signaller.emit_signal('interfer_prinuditelno', frm_ecm_list.srn_sectors)
else:
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_stack[66] = 1
signaller.emit_signal('interfer_prinuditelno', frm_ecm_list.jtids_sectors)
else:
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)
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)