[PATCH] Доработка. Трасса. Сектора запрета
This commit is contained in:
@@ -78,6 +78,13 @@ func set_seczap(id: int, szv: Vector4):
|
|||||||
seczap.set_instance_shader_parameter('radius', sv(szv.x))
|
seczap.set_instance_shader_parameter('radius', sv(szv.x))
|
||||||
|
|
||||||
|
|
||||||
|
func clear_all_seczap():
|
||||||
|
for child in get_children():
|
||||||
|
if child.name.begins_with("SECZAP"):
|
||||||
|
remove_child(child)
|
||||||
|
child.queue_free()
|
||||||
|
|
||||||
|
|
||||||
func set_seczap_color(id: int, color: Color):
|
func set_seczap_color(id: int, color: Color):
|
||||||
var seczap: = get_node('SECZAP%d' % id)
|
var seczap: = get_node('SECZAP%d' % id)
|
||||||
seczap.set_instance_shader_parameter('color', color)
|
seczap.set_instance_shader_parameter('color', color)
|
||||||
|
|||||||
@@ -177,19 +177,25 @@ func _ready():
|
|||||||
signaller.connect('map_user_panning', Callable(self, 'on_user_panning'))
|
signaller.connect('map_user_panning', Callable(self, 'on_user_panning'))
|
||||||
signaller.connect('update_coordinates_map', Callable(self, 'on_update_coordinates_label'))
|
signaller.connect('update_coordinates_map', Callable(self, 'on_update_coordinates_label'))
|
||||||
signaller.connect('update_scale_map', Callable(self, 'on_update_scale_label'))
|
signaller.connect('update_scale_map', Callable(self, 'on_update_scale_label'))
|
||||||
|
signaller.connect('sector_klaster', Callable(self, 'sector_klaster'))
|
||||||
|
signaller.connect('clear_klaster', Callable(self, 'clear_all_klaster'))
|
||||||
var unit_nav = network.get_unit_instance('навигация')
|
var unit_nav = network.get_unit_instance('навигация')
|
||||||
unit_nav.connect('data_received', on_navi_data_received)
|
unit_nav.connect('data_received', on_navi_data_received)
|
||||||
on_btn_center_toggled(true)
|
on_btn_center_toggled(true)
|
||||||
on_btn_activate_toggled(true)
|
on_btn_activate_toggled(true)
|
||||||
#$canvas.add_seczap(0, Vector4(372, 0, 30, 348))
|
|
||||||
#$canvas.add_seczap(1, Vector4(372, 90, 30, 348))
|
|
||||||
#$canvas.add_seczap(2, Vector4(198 + 348, 180, 30, 5))
|
|
||||||
#$canvas.add_seczap(3, Vector4(203, 270, 30, 5))
|
|
||||||
|
|
||||||
#$canvas.set_seczap_color(2, Color.MAGENTA)
|
|
||||||
#$canvas.set_seczap_color(3, Color.CHARTREUSE)
|
|
||||||
|
|
||||||
|
func sector_klaster(sector_data):
|
||||||
|
if sector_data["draw"]:
|
||||||
|
var rect: Rect2 = sector_data["rect"]
|
||||||
|
var color: Color = sector_data["color"]
|
||||||
|
var id: int = sector_data["index"]
|
||||||
|
$canvas.add_seczap(id, Vector4(rect.position.x, rect.position.y, rect.size.x, rect.size.y))
|
||||||
|
$canvas.set_seczap_color(id, color)
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
|
||||||
|
func clear_all_klaster(): $canvas.clear_all_seczap()
|
||||||
|
|
||||||
func on_navi_data_received(data: Dictionary):
|
func on_navi_data_received(data: Dictionary):
|
||||||
var k = data.get('k', 0.0)
|
var k = data.get('k', 0.0)
|
||||||
|
|||||||
@@ -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', '127.0.0.1', 42023, 42022, false, true], 'IP-адрес для обмена сообщениями со службой \"МП550\" (СТЦ)'],
|
'уарэп-капсрпб': ['capsrpb', ['127.0.0.1', '127.0.0.1', 42023, 42022, false, true], 'IP-адрес для обмена сообщениями со службой \"МП550\" (СТЦ)'],
|
||||||
'уарэп-трасса': ['trassa', ['192.168.1.23', '192.168.1.34', 50200, 10004, false, true], 'IP-адрес для обмена сообщениями с \"Трассой\"'],
|
'уарэп-трасса': ['trassa', ['127.0.0.1', '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'],
|
||||||
|
|||||||
@@ -206,3 +206,9 @@ signal tool_tip(new_ctrl_pos)
|
|||||||
## Вызывается при изменении секторов запрета.[br]
|
## Вызывается при изменении секторов запрета.[br]
|
||||||
## [param fs_closed] - обновленное секторов запрета ([b]true[/b]
|
## [param fs_closed] - обновленное секторов запрета ([b]true[/b]
|
||||||
signal update_fs_closed(fs_closed: Dictionary)
|
signal update_fs_closed(fs_closed: Dictionary)
|
||||||
|
|
||||||
|
|
||||||
|
signal sector_klaster (new_sector_data)
|
||||||
|
|
||||||
|
|
||||||
|
signal clear_klaster ()
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ const WORDS_TOTAL: int = 75
|
|||||||
const NOINFO: int = 0x80000000
|
const NOINFO: int = 0x80000000
|
||||||
|
|
||||||
class Trassa extends unit.Unit:
|
class Trassa extends unit.Unit:
|
||||||
|
static var json_conv: = JSON.new() ## Аппарат для разбора JSON сообщений
|
||||||
var source_addr: = []
|
var source_addr: = []
|
||||||
var unit_caps = network.get_unit_instance('уарэп-капсрпб')
|
var unit_caps = network.get_unit_instance('уарэп-капсрпб')
|
||||||
var tx_stack: Array[int] = []
|
var tx_stack: Array[int] = []
|
||||||
@@ -14,7 +15,26 @@ class Trassa extends unit.Unit:
|
|||||||
var srn = 0
|
var srn = 0
|
||||||
var jtids = 0
|
var jtids = 0
|
||||||
var prinud_but: Array = []
|
var prinud_but: Array = []
|
||||||
var forced_buttons: Array = [] # Храним ссылки на кнопки
|
var forced_buttons: Array = [] # Для хранения ссылок на кнопки
|
||||||
|
var json_dic: Dictionary = {} # Для хранения распарсенного JSON
|
||||||
|
var target: bool = false # Флаг наличия значения 21930
|
||||||
|
var data_type: String = "unknown" # Тип полученных данных: "json" или "binary"
|
||||||
|
var current_index: int = 0
|
||||||
|
var set_klaster = [
|
||||||
|
[390, 510, 224, 50],
|
||||||
|
[390, 1065, 250, 100],
|
||||||
|
[800, 1065, 274, 50],
|
||||||
|
[800, 1210, 300, 100],
|
||||||
|
[1065, 1210, 324, 50],
|
||||||
|
[1065, 1380, 350, 100],
|
||||||
|
[1150, 1380, 374, 50],
|
||||||
|
[1150, 2000, 400, 100],
|
||||||
|
[1380, 2000, 424, 50],
|
||||||
|
[1380, 3500, 450, 100],
|
||||||
|
[2000, 3500, 474, 50],
|
||||||
|
[2000, 6000, 500, 100],
|
||||||
|
[3500, 6000, 524, 50],
|
||||||
|
[390, 6000, 374, 50*7]]
|
||||||
|
|
||||||
# Инициализация
|
# Инициализация
|
||||||
func _init(nm: StringName, buttons: Array = []) -> void:
|
func _init(nm: StringName, buttons: Array = []) -> void:
|
||||||
@@ -25,14 +45,95 @@ class Trassa extends unit.Unit:
|
|||||||
interfer.connect('interfer_resized', Callable(self, 'on_interfer_resized'))
|
interfer.connect('interfer_resized', Callable(self, 'on_interfer_resized'))
|
||||||
|
|
||||||
|
|
||||||
# Обработка полученного пакета
|
# Обработка полученного пакета - определение типа
|
||||||
func parse(rx_data: PackedByteArray, tick: int):
|
func parse(rx_data: PackedByteArray, tick: int):
|
||||||
rx_tick = tick
|
rx_tick = tick
|
||||||
if not online:
|
if not online:
|
||||||
online = true
|
online = true
|
||||||
emit_signal('line_changed', self)
|
emit_signal('line_changed', self)
|
||||||
|
data_type = detect_data(rx_data)
|
||||||
|
if data_type == "json":
|
||||||
|
parse_json(rx_data)
|
||||||
|
elif data_type == "binary":
|
||||||
|
parse_byte(rx_data)
|
||||||
|
else:
|
||||||
|
emit_signal('parse_failed', self)
|
||||||
|
|
||||||
|
|
||||||
|
# Определение типа данных
|
||||||
|
func detect_data(data: PackedByteArray) -> String:
|
||||||
|
if data.size() > 0:
|
||||||
|
var first_char = data[0]
|
||||||
|
if first_char == 123 or first_char == 91:
|
||||||
|
return "json"
|
||||||
|
if data.size() >= 2:
|
||||||
|
var potential_json = data.slice(0, min(100, data.size()))
|
||||||
|
var test_string = potential_json.get_string_from_ascii()
|
||||||
|
if test_string and (test_string.begins_with("{") or test_string.begins_with("[")):
|
||||||
|
return "json"
|
||||||
|
return "binary"
|
||||||
|
|
||||||
|
|
||||||
|
# Обработка JSON данных
|
||||||
|
func parse_json(rx_data: PackedByteArray) -> void:
|
||||||
|
var json_string = rx_data.get_string_from_utf8()
|
||||||
|
if json_string:
|
||||||
|
if Error.OK == json_conv.parse(json_string):
|
||||||
|
json_dic = json_conv.get_data()
|
||||||
|
target = check_target(json_dic)
|
||||||
|
sector_draw(json_dic)
|
||||||
|
emit_signal('data_received', self)
|
||||||
|
else:
|
||||||
|
var msg = json_conv.get_error_message()
|
||||||
|
emit_signal('parse_failed', self)
|
||||||
|
else:
|
||||||
|
emit_signal('parse_failed', self)
|
||||||
|
|
||||||
|
|
||||||
|
func sector_draw(data: Dictionary) -> void:
|
||||||
|
var sector_data = {
|
||||||
|
"draw": false,
|
||||||
|
"color": Color.GREEN * Color(1, 1, 1, 0.1),
|
||||||
|
"rect": Rect2(),
|
||||||
|
"index": 0 }
|
||||||
|
if data.get("clean_all", false) == true:
|
||||||
|
current_index = 0
|
||||||
|
signaller.emit_signal('clear_klaster')
|
||||||
|
return
|
||||||
|
if data.has("txe") and data.has("rxe"):
|
||||||
|
var txe = data["txe"]
|
||||||
|
var rxe = data["rxe"]
|
||||||
|
if txe == true or rxe == true:
|
||||||
|
sector_data["draw"] = true
|
||||||
|
if data.has("lfb") and data.has("hfb") and data.has("dap") and data.has("daa"):
|
||||||
|
var lfb = int(data["lfb"])
|
||||||
|
var hfb = int(data["hfb"])
|
||||||
|
var dap = int(data["dap"])
|
||||||
|
var daa = int(data["daa"])
|
||||||
|
var key = str(lfb) + "_" + str(hfb)
|
||||||
|
for i in range(set_klaster.size()):
|
||||||
|
var mapping = set_klaster[i]
|
||||||
|
if lfb == mapping[0] and hfb == mapping[1]:
|
||||||
|
lfb = mapping[2]
|
||||||
|
hfb = mapping[3]
|
||||||
|
break
|
||||||
|
sector_data["rect"] = Rect2(lfb, daa, dap, hfb)
|
||||||
|
sector_data["index"] = sector_index()
|
||||||
|
signaller.emit_signal('sector_klaster', sector_data)
|
||||||
|
|
||||||
|
|
||||||
|
func sector_index() -> int:
|
||||||
|
current_index += 1
|
||||||
|
return current_index - 1
|
||||||
|
|
||||||
|
|
||||||
|
# Обработка бинарных данных
|
||||||
|
func parse_byte(rx_data: PackedByteArray):
|
||||||
var words: Array[int] = []
|
var words: Array[int] = []
|
||||||
var offset: int = 0
|
var offset: int = 0
|
||||||
|
if rx_data.size() < 40:
|
||||||
|
emit_signal('parse_failed', self)
|
||||||
|
return
|
||||||
while offset < rx_data.size():
|
while offset < rx_data.size():
|
||||||
if offset + 4 <= rx_data.size():
|
if offset + 4 <= rx_data.size():
|
||||||
var word = rx_data.decode_u32(offset)
|
var word = rx_data.decode_u32(offset)
|
||||||
@@ -42,6 +143,7 @@ class Trassa extends unit.Unit:
|
|||||||
break
|
break
|
||||||
if words.size() < 10:
|
if words.size() < 10:
|
||||||
emit_signal('parse_failed', self)
|
emit_signal('parse_failed', self)
|
||||||
|
return
|
||||||
tx_stack.fill(NOINFO)
|
tx_stack.fill(NOINFO)
|
||||||
tx_stack[0] = words[0] # ID
|
tx_stack[0] = words[0] # ID
|
||||||
tx_stack[1] = msg_counter # Nc
|
tx_stack[1] = msg_counter # Nc
|
||||||
@@ -58,6 +160,28 @@ class Trassa extends unit.Unit:
|
|||||||
emit_signal("data_received", self)
|
emit_signal("data_received", self)
|
||||||
|
|
||||||
|
|
||||||
|
# Проверка на нужный JSON файл
|
||||||
|
func check_target(data, current_path: String = "root") -> bool:
|
||||||
|
if data == null:
|
||||||
|
return false
|
||||||
|
if data is int or data is float:
|
||||||
|
if int(data) == 21930:
|
||||||
|
return true
|
||||||
|
return false
|
||||||
|
var found = false
|
||||||
|
if data is Dictionary:
|
||||||
|
for key in data:
|
||||||
|
var new_path = current_path + "." + str(key)
|
||||||
|
if check_target(data[key], new_path):
|
||||||
|
found = true
|
||||||
|
elif data is Array:
|
||||||
|
for i in range(data.size()):
|
||||||
|
var new_path = current_path + "[" + str(i) + "]"
|
||||||
|
if check_target(data[i], new_path):
|
||||||
|
found = true
|
||||||
|
return found
|
||||||
|
|
||||||
|
|
||||||
func interfer_data() -> void:
|
func interfer_data() -> void:
|
||||||
for i in range(67, 74):
|
for i in range(67, 74):
|
||||||
tx_stack[i] = 0
|
tx_stack[i] = 0
|
||||||
@@ -99,7 +223,7 @@ class Trassa extends unit.Unit:
|
|||||||
return Error.ERR_BUSY
|
return Error.ERR_BUSY
|
||||||
|
|
||||||
|
|
||||||
# CRC вычисление
|
# Контрольная сумма
|
||||||
func _calc_crc(data: Array) -> int:
|
func _calc_crc(data: Array) -> int:
|
||||||
var acc: int = 0
|
var acc: int = 0
|
||||||
for i in range(data.size() - 1): # кроме CRC
|
for i in range(data.size() - 1): # кроме CRC
|
||||||
@@ -114,17 +238,17 @@ class Trassa extends unit.Unit:
|
|||||||
|
|
||||||
|
|
||||||
func interfer_uarep() -> void:
|
func interfer_uarep() -> void:
|
||||||
tx_stack[65] = 0
|
tx_stack[65] = 0
|
||||||
tx_stack[66] = 0
|
tx_stack[66] = 0
|
||||||
for ecm in ecms.values():
|
for ecm in ecms.values():
|
||||||
if ecm.krp == 'srni' and ecm.svk == 1:
|
if ecm.krp == 'srni1' and ecm.svk == 1:
|
||||||
tx_stack[65] = 1
|
tx_stack[65] = 1
|
||||||
if ecm.krp == 'svi1' and ecm.svk == 1:
|
if ecm.krp == 'svi1' and ecm.svk == 1:
|
||||||
tx_stack[66] = 1
|
tx_stack[66] = 1
|
||||||
tx_stack[1] = msg_counter
|
tx_stack[1] = msg_counter
|
||||||
|
|
||||||
|
|
||||||
# Обработка указаний от Трассы по кнопке
|
# Выполнение указаний по кнопке Трасса
|
||||||
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:
|
||||||
@@ -156,8 +280,3 @@ class Trassa extends unit.Unit:
|
|||||||
ecm.krp = interfer.INTERFER_OFF
|
ecm.krp = interfer.INTERFER_OFF
|
||||||
interfer.send_ecm(ecm, unit_caps)
|
interfer.send_ecm(ecm, unit_caps)
|
||||||
signaller.emit_signal('interfer_off', ecm)
|
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)
|
|
||||||
|
|||||||
Reference in New Issue
Block a user