трасса. постановка помех
This commit is contained in:
@@ -31,6 +31,7 @@ const SETTING_TABLE = [
|
|||||||
['Кнопка «JTIDS»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
|
['Кнопка «JTIDS»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
|
||||||
['Кнопка «КУПД»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
|
['Кнопка «КУПД»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
|
||||||
['Внешнее управление', TableEdit, TableToggle, 'Передать управление в 5П28'],
|
['Внешнее управление', TableEdit, TableToggle, 'Передать управление в 5П28'],
|
||||||
|
['Внешнее указание Трасса', TableEdit, TableToggle, 'Разрешить постановку помех от Трасса'],
|
||||||
['Кнопка «Подавление»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
|
['Кнопка «Подавление»', TableEdit, TableToggle, 'Разрешить отображение кнопки'],
|
||||||
['Виртуальная клавиатура', TableEdit, TableToggle, 'Включить отображение экранной клавиатуры'],
|
['Виртуальная клавиатура', TableEdit, TableToggle, 'Включить отображение экранной клавиатуры'],
|
||||||
['Скрыть вкладку ЭМС 2', TableEdit, TableToggle, 'Отображать вкладку \\\"ЭМС-2\\\"'],
|
['Скрыть вкладку ЭМС 2', TableEdit, TableToggle, 'Отображать вкладку \\\"ЭМС-2\\\"'],
|
||||||
@@ -63,10 +64,11 @@ const SETTING_TABLE = [
|
|||||||
['Адрес БПО правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'] ]
|
['Адрес БПО правого борта', TableEdit, TableEdit, 'http-адрес для запроса состояния прибора БПО'] ]
|
||||||
|
|
||||||
const EXTERNAL_CU = 16 ## Внешнее целеуказание
|
const EXTERNAL_CU = 16 ## Внешнее целеуказание
|
||||||
const SUPPRESS = 17 ## Строка - Подавление
|
const TRASSA = 17
|
||||||
const KEYBOARD = 18 ## Строка - Виртуальная клавиатура
|
const SUPPRESS = 18 ## Строка - Подавление
|
||||||
const HIDE_EMS2 = 19 ## Строка - Скрыть вкладку ЭМС 2
|
const KEYBOARD = 19 ## Строка - Виртуальная клавиатура
|
||||||
const COMMIT = 20 ## Строка - Версия УАРЭП
|
const HIDE_EMS2 = 20 ## Строка - Скрыть вкладку ЭМС 2
|
||||||
|
const COMMIT = 21 ## Строка - Версия УАРЭП
|
||||||
|
|
||||||
var name_to_line_index: = {} ## Для преобразования названия параметра в номер строки
|
var name_to_line_index: = {} ## Для преобразования названия параметра в номер строки
|
||||||
|
|
||||||
@@ -90,6 +92,11 @@ func on_external_cu_btn_pressed(btn) -> void:
|
|||||||
signaller.emit_signal('interfer_off_all')
|
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:
|
func on_vk_pressed(btn) -> void:
|
||||||
var state = btn.button_pressed
|
var state = btn.button_pressed
|
||||||
signaller.emit_signal('kb_pressed', state)
|
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]
|
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))
|
extern_cu_node.connect('pressed', on_external_cu_btn_pressed.bind(extern_cu_node))
|
||||||
on_external_cu_btn_pressed(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]
|
var vk_node = $scroll_set/table.get_node2(1, KEYBOARD).get_children()[0]
|
||||||
vk_node.connect('pressed', on_vk_pressed.bind(vk_node))
|
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]
|
var ems2_hide_node = $scroll_set/table.get_node2(1, HIDE_EMS2).get_children()[0]
|
||||||
|
|||||||
@@ -305,6 +305,6 @@ text = "Масштаб:"
|
|||||||
[connection signal="drag_continue" from="." to="." method="_on_drag_continue"]
|
[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="btn_view" to="." method="on_button_view_toggled"]
|
||||||
[connection signal="toggled" from="chk_auto" to="." method="on_value_changed"]
|
[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"]
|
||||||
|
[connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"]
|
||||||
[connection signal="toggled" from="btn_center" to="." method="on_btn_center_toggled"]
|
[connection signal="toggled" from="btn_center" to="." method="on_btn_center_toggled"]
|
||||||
|
|||||||
@@ -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\" (СТЦ)'],
|
||||||
'уарэп-трасса': ['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-адрес прибора УФ'],
|
'уарэп-эмс': ['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'],
|
||||||
|
|||||||
@@ -1,84 +1,142 @@
|
|||||||
class_name trassa_unit extends Node
|
class_name trassa_unit
|
||||||
|
extends Node
|
||||||
|
|
||||||
const ONLINE_TIMEOUT: int = 5000 ## Время ожидания данных
|
const ONLINE_TIMEOUT: int = 5000 # Время ожидания данных
|
||||||
const REQUEST_PERIOD: int = 3000 ## Переиод запроса, мс
|
const REQUEST_PERIOD: int = 3000 # Период отправки, мс
|
||||||
|
const WORDS_TOTAL: int = 75
|
||||||
|
const NOINFO: int = 0x80000000
|
||||||
|
|
||||||
class Trassa extends unit.Unit:
|
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:
|
func _init(nm: StringName) -> void:
|
||||||
self.name = nm
|
self.name = nm
|
||||||
tx_data.resize(10)
|
tx_data.resize(WORDS_TOTAL)
|
||||||
tx_data[0] = 0 #ID
|
tx_data.fill(NOINFO)
|
||||||
tx_data[1] = 0 #Nc
|
interfer.connect("interfer_update", Callable(self, "_on_interfer_update"))
|
||||||
tx_data[2] = 0 #RKS
|
interfer.connect("interfer_resized", Callable(self, "_on_interfer_resized"))
|
||||||
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)
|
|
||||||
|
|
||||||
|
|
||||||
|
# Обработка полученного пакета
|
||||||
func parse(rx_data: PackedByteArray, tick: int):
|
func parse(rx_data: PackedByteArray, tick: int):
|
||||||
print("PARSE: ", tick, "size:", rx_data.size())
|
rx_tick = tick
|
||||||
if rx_data.size() != 40:
|
if not online:
|
||||||
print("PARSE: ")
|
online = true
|
||||||
emit_signal("parse_failed", self)
|
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
|
return
|
||||||
var expected_fcs = sciCalcFCS(rx_data.slice(0, 39))
|
_msg_counter += 1
|
||||||
if expected_fcs != rx_data[39]:
|
tx_data.fill(NOINFO)
|
||||||
print("PARSE: ", expected_fcs, "Got:", rx_data[39])
|
tx_data[0] = words[0] # ID
|
||||||
emit_signal("parse_failed", self)
|
tx_data[1] = _msg_counter # Nc
|
||||||
return
|
tx_data[2] = 0x01 # Nб
|
||||||
var strings := []
|
tx_data[3] = 0x00 # Ск
|
||||||
for i in range(10):
|
tx_data[4] = 0x0194 # НТС
|
||||||
var offset = i * 4
|
tx_data[5] = (0x0001 << 16) | 0x0080 # Ии
|
||||||
var line = rx_data.slice(offset, offset + 4)
|
tx_data[6] = 0x01 # РКС
|
||||||
print("PARSE: ", i, ":", line)
|
srn = words[7] # SRN
|
||||||
strings.append(line)
|
jtids = words[8] # JTIDS
|
||||||
print("PARSE: ")
|
|
||||||
emit_signal("data_received", strings)
|
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:
|
func process(tick: int) -> int:
|
||||||
var rc: = Error.ERR_BUSY
|
var rc := Error.ERR_BUSY
|
||||||
if (tick - tx_tick) > REQUEST_PERIOD:
|
if (tick - tx_tick) > REQUEST_PERIOD:
|
||||||
tx_tick = tick
|
tx_tick = tick
|
||||||
rc = Error.OK
|
rc = Error.OK
|
||||||
print("PROCESS: ", tick)
|
var packet := PackedByteArray()
|
||||||
if online:
|
packet.resize(WORDS_TOTAL * 4)
|
||||||
if (tick - rx_tick) > ONLINE_TIMEOUT:
|
for i in range(WORDS_TOTAL):
|
||||||
online = false
|
packet.encode_u32(i * 4, tx_data[i])
|
||||||
emit_signal('line_changed', self)
|
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
|
return rc
|
||||||
|
|
||||||
|
|
||||||
func build_packet() -> PackedByteArray:
|
# CRC вычисление
|
||||||
var packet := PackedByteArray()
|
func _calc_crc(data: Array) -> int:
|
||||||
packet.resize(40)
|
var acc: int = 0
|
||||||
for i in range(10):
|
for i in range(data.size() - 1): # кроме CRC
|
||||||
var offset = i * 4
|
if i in [0, 1]:
|
||||||
packet[offset + 0] = i
|
continue
|
||||||
packet[offset + 1] = i + 1
|
acc = (acc + (data[i] & 0xFFFFFFFF)) & 0xFFFFFFFF
|
||||||
packet[offset + 2] = i + 2
|
return acc
|
||||||
packet[offset + 3] = i + 3
|
|
||||||
packet[39] = sciCalcFCS(packet.slice(0, 39))
|
|
||||||
print("BUILD: ", packet)
|
# Обновление конкретной помехи
|
||||||
return packet
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user