@tool class_name pribor_afsp extends 'res://scenes/контроль/прибор.gd' @export var prefix_path: String = '' ## Должно быть в JSON @export var this_afsp_name: String = '' ## Должно быть в JSON @export var unit_name: StringName= '' ## Должно быть в settings.gd @export var settings_path_to_url: String = '' ## Должно быть в ProjectSettings @export var settings_path_to_wait_time: String = '' ## Должно быть в ProjectSettings static var json_conv: JSON = JSON.new() static var node_maper = load('res://scenes/контроль/node-maper.gd') var ctrl_pos = 0 # SystemName: "gen" DevList - там состояние связи с генератором по кан шине func _ready() -> void: # Подключаемся к сигналам в зависимости от борта if this_afsp_name == 'Устройство РР левого борта': scouting.response_received_afsp_left.connect(_on_response_received) else: scouting.response_received_afsp_right.connect(_on_response_received) # При старте отрисовываем последние данные (если есть) _on_press_device() # Обработка полученного ответа от rtr func _on_response_received(response: String, success: bool) -> void: if not success: log.error('Ошибка запроса или нет связи: %s' % response) _reset_ui_to_zero() return # Парсим JSON строку var parse_result = json_conv.parse(response) if parse_result != OK: var err = json_conv.get_error_message() push_error('разбор json прерван - "%s"' % err) _reset_ui_to_zero() return # Ищем имя прибора в JSON var pp = [] tools.map_solid_to_array(prefix_path, pp) var ret_val = [null, false, 0] var pp_copy = pp.duplicate(true) tools.get_value_by_path(json_conv.data, pp, ret_val) if not ret_val[1]: push_error('путь %s не найден (%s)' % [pp_copy, ret_val[2]]) _reset_ui_to_zero() return var received_afsp_name: StringName = ret_val[0] # Проверяем, что ответ от нужного прибора if this_afsp_name != received_afsp_name: # Ответ от другого борта - игнорируем return # Обновляем UI элементы из JSON _update_ui(json_conv.data) # Обновление интерфейса из JSON данных func _update_ui(json_data: Dictionary) -> void: # Конвертер for child in $bort.get_node('konverter/grid').get_children(): node_maper.map_value_to_item_animated(json_data, child, 'value0') node_maper.map_value_to_item_animated(json_data, child, 'value1') node_maper.map_value_to_item_animated(json_data, child, 'value2') node_maper.map_error_codes_to_item_animated(json_data, child, 'state', 0) # Антенна 1 for child in $bort.get_node('antenna1/grid').get_children(): node_maper.map_value_to_item_animated(json_data, child, 'value0') node_maper.map_value_to_item_animated(json_data, child, 'value1') node_maper.map_error_codes_to_item_animated(json_data, child, 'state', 0) # Антенна 2 for child in $bort.get_node('antenna2/grid').get_children(): node_maper.map_value_to_item_animated(json_data, child, 'value0') node_maper.map_value_to_item_animated(json_data, child, 'value1') node_maper.map_error_codes_to_item_animated(json_data, child, 'state', 0) # Остальные элементы for child in $bort.get_children(): node_maper.map_value_to_item_animated(json_data, child, 'value0') node_maper.map_value_to_item_animated(json_data, child, 'value1') node_maper.map_error_codes_to_item_animated(json_data, child, 'state', 0) # Сброс всех UI элементов в 0 (при отсутствии данных) func _reset_ui_to_zero() -> void: # Конвертер for child in $bort.get_node('konverter/grid').get_children(): _reset_item_value(child) # Антенна 1 for child in $bort.get_node('antenna1/grid').get_children(): _reset_item_value(child) # Антенна 2 for child in $bort.get_node('antenna2/grid').get_children(): _reset_item_value(child) # Остальные элементы for child in $bort.get_children(): _reset_item_value(child) # Сброс конкретного элемента в 0 func _reset_item_value(item) -> void: item.set('value0', 0) item.set('value1', 0) item.set('value2', 0) item.set('state', 0) # Отрисовывание при нажатии на прибор func _on_press_device() -> void: # Проверяем, есть ли сохраненные данные в rtr var has_data = false var last_response = "" if this_afsp_name == 'Устройство РР левого борта': has_data = scouting.has_afsp_left_success() if has_data: last_response = scouting.get_afsp_left_response() else: has_data = scouting.has_afsp_right_success() if has_data: last_response = scouting.get_afsp_right_response() # Если есть данные - парсим и отображаем if has_data and not last_response.is_empty(): var parse_result = json_conv.parse(last_response) if parse_result == OK: # Проверяем, что это данные именно от этого прибора var pp = [] tools.map_solid_to_array(prefix_path, pp) var ret_val = [null, false, 0] tools.get_value_by_path(json_conv.data, pp, ret_val) if ret_val[1] and ret_val[0] == this_afsp_name: _update_ui(json_conv.data) return # Если данных нет или они не подходят - сбрасываем в 0 _reset_ui_to_zero() ## Вызывается при клике мыши на элементе. ## [param block_a] - Кликнутый элемент. func _on_item_pressed(block_a: Control): var metas = block_a.get_meta_list() for n in metas: var _v = block_a.get_meta(n)