diff --git a/scenes/diagram/diagram.gd b/scenes/diagram/diagram.gd index d0a346d..97d5035 100644 --- a/scenes/diagram/diagram.gd +++ b/scenes/diagram/diagram.gd @@ -78,6 +78,13 @@ func set_seczap(id: int, szv: Vector4): 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): var seczap: = get_node('SECZAP%d' % id) seczap.set_instance_shader_parameter('color', color) diff --git a/scenes/tilemap/23900.png b/scenes/tilemap/23900.png index b7ca1d1..f8e3ab0 100644 Binary files a/scenes/tilemap/23900.png and b/scenes/tilemap/23900.png differ diff --git a/scenes/tilemap/ship_mark.tscn b/scenes/tilemap/ship_mark.tscn index 888ea82..06aacfd 100644 --- a/scenes/tilemap/ship_mark.tscn +++ b/scenes/tilemap/ship_mark.tscn @@ -3,6 +3,6 @@ [ext_resource type="Texture2D" uid="uid://cj1f2uy6qfvki" path="res://scenes/tilemap/23900.png" id="1_v0nwa"] [node name="23900" type="Sprite2D"] -rotation = 4.71239 +rotation = -6.28319 scale = Vector2(0.496934, 0.496934) texture = ExtResource("1_v0nwa") diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index c4d6a73..469e459 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -177,19 +177,25 @@ func _ready(): signaller.connect('map_user_panning', Callable(self, 'on_user_panning')) signaller.connect('update_coordinates_map', Callable(self, 'on_update_coordinates_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('навигация') unit_nav.connect('data_received', on_navi_data_received) on_btn_center_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): var k = data.get('k', 0.0) diff --git a/scripts/settings.gd b/scripts/settings.gd index 2806910..fe308b9 100644 --- a/scripts/settings.gd +++ b/scripts/settings.gd @@ -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', '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-адрес прибора УФ'], 'уарэп-яу07-2в': ['yau07tx', ['10.1.1.22', 50022, false, false], 'IP-адрес прибора ПРД-В2'], 'уарэп-яу07-2н': ['yau07tx', ['10.1.1.21', 50021, false, false], 'IP-адрес прибора ПРД-Н2'], diff --git a/scripts/signaller.gd b/scripts/signaller.gd index 05663b7..c72dcb7 100644 --- a/scripts/signaller.gd +++ b/scripts/signaller.gd @@ -206,3 +206,9 @@ signal tool_tip(new_ctrl_pos) ## Вызывается при изменении секторов запрета.[br] ## [param fs_closed] - обновленное секторов запрета ([b]true[/b] signal update_fs_closed(fs_closed: Dictionary) + + +signal sector_klaster (new_sector_data) + + +signal clear_klaster () diff --git a/scripts/trassa.gd b/scripts/trassa.gd index fafcff6..e837737 100644 --- a/scripts/trassa.gd +++ b/scripts/trassa.gd @@ -6,6 +6,7 @@ const WORDS_TOTAL: int = 75 const NOINFO: int = 0x80000000 class Trassa extends unit.Unit: + static var json_conv: = JSON.new() ## Аппарат для разбора JSON сообщений var source_addr: = [] var unit_caps = network.get_unit_instance('уарэп-капсрпб') var tx_stack: Array[int] = [] @@ -14,7 +15,26 @@ class Trassa extends unit.Unit: var srn = 0 var jtids = 0 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: @@ -25,14 +45,95 @@ class Trassa extends unit.Unit: 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) + 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 offset: int = 0 + if rx_data.size() < 40: + emit_signal('parse_failed', self) + return while offset < rx_data.size(): if offset + 4 <= rx_data.size(): var word = rx_data.decode_u32(offset) @@ -42,6 +143,7 @@ class Trassa extends unit.Unit: break if words.size() < 10: emit_signal('parse_failed', self) + return tx_stack.fill(NOINFO) tx_stack[0] = words[0] # ID tx_stack[1] = msg_counter # Nc @@ -58,6 +160,28 @@ class Trassa extends unit.Unit: 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: for i in range(67, 74): tx_stack[i] = 0 @@ -79,7 +203,6 @@ class Trassa extends unit.Unit: return NOINFO - # Отправка пакета от uarep-ctl func process(now_tick: int) -> int: if online and ((now_tick - rx_tick) > ONLINE_TIMEOUT): online = false @@ -99,32 +222,32 @@ class Trassa extends unit.Unit: return Error.ERR_BUSY - # CRC вычисление + # Контрольная сумма func _calc_crc(data: Array) -> int: var acc: int = 0 - for i in range(data.size() - 1): # кроме CRC + for i in range(data.size() - 1): 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 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 == 'srni' 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 + 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: @@ -156,8 +279,3 @@ class Trassa extends unit.Unit: 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)