трасса. парсинг полученного пакета от трассы, кнопка трассы в настройках, постановка/снятие помех, сборка и отправление пакета в трассу
This commit is contained in:
@@ -57,7 +57,7 @@ size_flags_vertical = 3
|
|||||||
tooltip_text = "Включает принудительную помеху"
|
tooltip_text = "Включает принудительную помеху"
|
||||||
strips_rotation = 15.0
|
strips_rotation = 15.0
|
||||||
text = "СРН"
|
text = "СРН"
|
||||||
font_size = null
|
font_size = 1
|
||||||
metadata/rfi_name = "srn"
|
metadata/rfi_name = "srn"
|
||||||
|
|
||||||
[node name="btn_jtids" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")]
|
[node name="btn_jtids" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")]
|
||||||
@@ -67,7 +67,7 @@ size_flags_horizontal = 3
|
|||||||
size_flags_vertical = 3
|
size_flags_vertical = 3
|
||||||
strips_rotation = 15.0
|
strips_rotation = 15.0
|
||||||
text = "СПРС"
|
text = "СПРС"
|
||||||
font_size = null
|
font_size = 1
|
||||||
metadata/rfi_name = "sprs"
|
metadata/rfi_name = "sprs"
|
||||||
|
|
||||||
[node name="btn_kupd" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")]
|
[node name="btn_kupd" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")]
|
||||||
@@ -77,7 +77,7 @@ size_flags_vertical = 3
|
|||||||
tooltip_text = "Кнопка для принудительного включения группы секторов в режим КУПД"
|
tooltip_text = "Кнопка для принудительного включения группы секторов в режим КУПД"
|
||||||
strips_rotation = 15.0
|
strips_rotation = 15.0
|
||||||
text = "КУПД"
|
text = "КУПД"
|
||||||
font_size = null
|
font_size = 1
|
||||||
metadata/rfi_name = "kupd"
|
metadata/rfi_name = "kupd"
|
||||||
|
|
||||||
[node name="btn_panika" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")]
|
[node name="btn_panika" parent="grd_forced" groups=["группа-принудительно"] instance=ExtResource("4_7ys3c")]
|
||||||
@@ -87,7 +87,7 @@ size_flags_vertical = 3
|
|||||||
tooltip_text = "Кнопка для принудительного включения группы секторов в режим КУПД"
|
tooltip_text = "Кнопка для принудительного включения группы секторов в режим КУПД"
|
||||||
strips_rotation = 15.0
|
strips_rotation = 15.0
|
||||||
text = "Паника"
|
text = "Паника"
|
||||||
font_size = null
|
font_size = 1
|
||||||
metadata/rfi_name = "<off>"
|
metadata/rfi_name = "<off>"
|
||||||
|
|
||||||
[node name="btn_cancel" parent="grd_forced" groups=["прин-секторы-срн"] instance=ExtResource("4_7ys3c")]
|
[node name="btn_cancel" parent="grd_forced" groups=["прин-секторы-срн"] instance=ExtResource("4_7ys3c")]
|
||||||
@@ -96,5 +96,5 @@ size_flags_horizontal = 3
|
|||||||
size_flags_vertical = 3
|
size_flags_vertical = 3
|
||||||
strips_rotation = 15.0
|
strips_rotation = 15.0
|
||||||
text = "Очистить"
|
text = "Очистить"
|
||||||
font_size = null
|
font_size = 1
|
||||||
metadata/rfi_name = "<off>"
|
metadata/rfi_name = "<off>"
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ size_flags_vertical = 3
|
|||||||
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
|
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
|
||||||
strips_rotation = 25.0
|
strips_rotation = 25.0
|
||||||
text = "Строб"
|
text = "Строб"
|
||||||
font_size = null
|
font_size = 1
|
||||||
metadata/state = 0
|
metadata/state = 0
|
||||||
|
|
||||||
[node name="btn_threats" parent="btns_select" groups=["группа-режим-выбора"] instance=ExtResource("8_k0iv2")]
|
[node name="btn_threats" parent="btns_select" groups=["группа-режим-выбора"] instance=ExtResource("8_k0iv2")]
|
||||||
@@ -184,7 +184,7 @@ size_flags_vertical = 3
|
|||||||
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
|
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
|
||||||
strips_rotation = 25.0
|
strips_rotation = 25.0
|
||||||
text = "Цель"
|
text = "Цель"
|
||||||
font_size = null
|
font_size = 1
|
||||||
metadata/state = 1
|
metadata/state = 1
|
||||||
|
|
||||||
[node name="btn_fs_sector" parent="btns_select" groups=["группа-режим-выбора"] instance=ExtResource("8_k0iv2")]
|
[node name="btn_fs_sector" parent="btns_select" groups=["группа-режим-выбора"] instance=ExtResource("8_k0iv2")]
|
||||||
@@ -194,7 +194,7 @@ size_flags_vertical = 3
|
|||||||
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
|
tooltip_text = "Кнопка для выбора сектора при помощи клика мышкой"
|
||||||
strips_rotation = 25.0
|
strips_rotation = 25.0
|
||||||
text = "Сектор"
|
text = "Сектор"
|
||||||
font_size = null
|
font_size = 1
|
||||||
metadata/state = 2
|
metadata/state = 2
|
||||||
|
|
||||||
[node name="chk_auto" type="CheckBox" parent="."]
|
[node name="chk_auto" type="CheckBox" parent="."]
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ var UnitProfiles: Dictionary[StringName, Array] = { \
|
|||||||
'уарэп-яу07-частный': ['yau07rx', ['10.1.1.2', 50002, false, true], 'IP-адрес для приёма частных сообщений от ЯУ-07'],
|
'уарэп-яу07-частный': ['yau07rx', ['10.1.1.2', 50002, false, true], 'IP-адрес для приёма частных сообщений от ЯУ-07'],
|
||||||
'уарэп-яу07-общий': ['yau07rx', ['*', 50000, true, 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', 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-адрес прибора УФ'],
|
'уарэп-эмс': ['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.22', 50022, false, false], 'IP-адрес прибора ПРД-В2'],
|
||||||
'уарэп-яу07-2н': ['yau07tx', ['10.1.1.21', 50021, false, false], 'IP-адрес прибора ПРД-Н2'],
|
'уарэп-яу07-2н': ['yau07tx', ['10.1.1.21', 50021, false, false], 'IP-адрес прибора ПРД-Н2'],
|
||||||
|
|||||||
@@ -8,19 +8,20 @@ const NOINFO: int = 0x80000000
|
|||||||
|
|
||||||
class Trassa extends unit.Unit:
|
class Trassa extends unit.Unit:
|
||||||
|
|
||||||
|
var unit_caps = network.get_unit_instance('уарэп-капсрпб')
|
||||||
var source_addr: Array
|
var source_addr: Array
|
||||||
var tx_stack: Array[PackedByteArray] = []
|
var tx_stack: Array[int] = []
|
||||||
var _msg_counter: int = 0
|
var msg_counter: int = 0
|
||||||
var ecms: Dictionary = {} # Словарь всех активных помех
|
var ecms: Dictionary = {} # Словарь всех активных помех
|
||||||
var srn = 0
|
var srn = 0
|
||||||
var jtids = 0
|
var jtids = 0
|
||||||
|
|
||||||
|
# Инициализация
|
||||||
func _init(nm: StringName) -> void:
|
func _init(nm: StringName) -> void:
|
||||||
self.name = nm
|
self.name = nm
|
||||||
tx_data.resize(WORDS_TOTAL)
|
tx_stack.resize(WORDS_TOTAL)
|
||||||
tx_data.fill(NOINFO)
|
tx_stack.fill(NOINFO)
|
||||||
interfer.connect("interfer_update", Callable(self, "_on_interfer_update"))
|
interfer.connect("interfer_resized", Callable(self, "on_interfer_resized"))
|
||||||
interfer.connect("interfer_resized", Callable(self, "_on_interfer_resized"))
|
|
||||||
|
|
||||||
|
|
||||||
# Обработка полученного пакета
|
# Обработка полученного пакета
|
||||||
@@ -29,59 +30,72 @@ class Trassa extends unit.Unit:
|
|||||||
if not online:
|
if not online:
|
||||||
online = true
|
online = true
|
||||||
emit_signal("line_changed", self)
|
emit_signal("line_changed", self)
|
||||||
var spb := StreamPeerBuffer.new()
|
|
||||||
spb.big_endian = true
|
|
||||||
spb.data_array = rx_data
|
|
||||||
var words: Array[int] = []
|
var words: Array[int] = []
|
||||||
while spb.get_position() < spb.data_array.size():
|
var offset: int = 0
|
||||||
words.append(spb.get_u32())
|
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:
|
if words.size() < 10:
|
||||||
emit_signal('parse_failed', self)
|
emit_signal('parse_failed', self)
|
||||||
return
|
tx_stack.fill(NOINFO)
|
||||||
_msg_counter += 1
|
tx_stack[0] = words[0] # ID
|
||||||
tx_data.fill(NOINFO)
|
tx_stack[1] = msg_counter # Nc
|
||||||
tx_data[0] = words[0] # ID
|
tx_stack[2] = 0x01 # Nб
|
||||||
tx_data[1] = _msg_counter # Nc
|
tx_stack[3] = 0x00 # Ск
|
||||||
tx_data[2] = 0x01 # Nб
|
tx_stack[4] = 0x0194 # НТС
|
||||||
tx_data[3] = 0x00 # Ск
|
tx_stack[5] = (0x0001 << 16) | 0x0080 # Ии
|
||||||
tx_data[4] = 0x0194 # НТС
|
tx_stack[6] = 0x01 # РКС
|
||||||
tx_data[5] = (0x0001 << 16) | 0x0080 # Ии
|
srn = words[7] # SRN
|
||||||
tx_data[6] = 0x01 # РКС
|
jtids = words[8] # JTIDS
|
||||||
srn = words[7] # SRN
|
|
||||||
jtids = words[8] # JTIDS
|
|
||||||
|
|
||||||
btn_trassa_pressed()
|
btn_trassa_pressed()
|
||||||
|
interfer_data()
|
||||||
tx_data[74] = _calc_crc(tx_data)
|
tx_stack[74] = _calc_crc(tx_stack)
|
||||||
emit_signal("data_received", self)
|
emit_signal("data_received", self)
|
||||||
|
|
||||||
|
|
||||||
# Проверка активности помехи
|
func interfer_data() -> void:
|
||||||
func _is_interfer_active(interfer_name: String) -> bool:
|
for i in range(67, 74):
|
||||||
|
tx_stack[i] = 0
|
||||||
for ecm in ecms.values():
|
for ecm in ecms.values():
|
||||||
if ecm.krp and ecm.krp == interfer_name:
|
if ecm.svk == 1:
|
||||||
return ecm.svk == 1
|
var nmfs_value = ecm.nmfs
|
||||||
return false
|
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:
|
func get_fs_key(nmfs_value: int) -> int:
|
||||||
var rc := Error.ERR_BUSY
|
if prd.fs_caps_id.has(nmfs_value):
|
||||||
if (tick - tx_tick) > REQUEST_PERIOD:
|
return prd.fs_caps_id[nmfs_value]
|
||||||
tx_tick = tick
|
return NOINFO
|
||||||
rc = Error.OK
|
|
||||||
var packet := PackedByteArray()
|
|
||||||
packet.resize(WORDS_TOTAL * 4)
|
# Отправка пакета от uarep-ctl
|
||||||
for i in range(WORDS_TOTAL):
|
func process(now_tick: int) -> int:
|
||||||
packet.encode_u32(i * 4, tx_data[i])
|
if online and ((now_tick - rx_tick) > ONLINE_TIMEOUT):
|
||||||
tx_stack.append(packet)
|
|
||||||
|
|
||||||
print(packet)
|
|
||||||
return rc
|
|
||||||
if online and (tick - rx_tick) > ONLINE_TIMEOUT:
|
|
||||||
online = false
|
online = false
|
||||||
emit_signal("line_changed", self)
|
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 вычисление
|
# CRC вычисление
|
||||||
@@ -94,49 +108,42 @@ class Trassa extends unit.Unit:
|
|||||||
return acc
|
return acc
|
||||||
|
|
||||||
|
|
||||||
# Обновление конкретной помехи
|
# Обновление всех активных помех
|
||||||
func _on_interfer_update(ecm_object: Object) -> void:
|
func on_interfer_resized(ecms_dic: Dictionary) -> void: ecms = ecms_dic
|
||||||
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 interfer_uarep() -> void:
|
||||||
func _on_interfer_resized(ecms_objects: Dictionary) -> void:
|
tx_stack[65] = 0
|
||||||
ecms.clear()
|
tx_stack[66] = 0
|
||||||
for ecm_id in ecms_objects:
|
for ecm in ecms.values():
|
||||||
var ecm_object = ecms_objects[ecm_id]
|
if ecm.krp == "srni1" and ecm.svk == 1:
|
||||||
var ecm_data = {
|
tx_stack[65] = 1
|
||||||
"krp": ecm_object.krp,
|
if ecm.krp == "svi1" and ecm.svk == 1:
|
||||||
"svk": ecm_object.svk,
|
tx_stack[66] = 1
|
||||||
"nmfs": ecm_object.nmfs
|
tx_stack[1] = msg_counter
|
||||||
}
|
|
||||||
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:
|
func btn_trassa_pressed() -> void:
|
||||||
var state = ProjectSettings.get_setting('application/config/Внешнее указание Трасса', false)
|
var state = ProjectSettings.get_setting('application/config/Внешнее указание Трасса', false)
|
||||||
if state == true:
|
if state == true:
|
||||||
if srn == 1:
|
if srn == 1:
|
||||||
tx_data[65] = 1
|
tx_stack[65] = 1
|
||||||
signaller.emit_signal('interfer_prinuditelno', frm_ecm_list.srn_sectors)
|
signaller.emit_signal('interfer_prinuditelno', frm_ecm_list.srn_sectors)
|
||||||
else:
|
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:
|
if jtids == 1:
|
||||||
tx_data[66] = 1
|
tx_stack[66] = 1
|
||||||
signaller.emit_signal('interfer_prinuditelno', frm_ecm_list.jtids_sectors)
|
signaller.emit_signal('interfer_prinuditelno', frm_ecm_list.jtids_sectors)
|
||||||
else:
|
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)
|
||||||
|
|||||||
Reference in New Issue
Block a user