трасса. парсинг полученного пакета от трассы, кнопка трассы в настройках, постановка/снятие помех, сборка и отправление пакета в трассу

This commit is contained in:
lepshiy
2025-10-01 16:44:40 +03:00
parent a273a26e7c
commit 321a6b9810
4 changed files with 97 additions and 90 deletions

View File

@@ -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 = "<off>"
[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 = "<off>"

View File

@@ -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="."]

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

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