Files
uarep-ctl/scenes/pribor-afsp/pribor-afsp.gd
TotMaxim ec21282ba0
Some checks failed
Локальный тест / test (push) Has been cancelled
Обновление индикатора онлайн в контроле
2026-04-05 16:29:57 +03:00

161 lines
6.3 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@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_left.connect(_on_response_received)
else:
scouting.response_received_right.connect(_on_response_received)
# При старте отрисовываем последние данные (если есть)
_on_press_device()
# Обработка полученного ответа от rtr
func _on_response_received(response: String, success: bool) -> void:
var unit_instance = network.get_unit_instance(unit_name)
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(json_data, child, 'value0')
node_maper.map_value_to_item(json_data, child, 'value1')
node_maper.map_value_to_item(json_data, child, 'value2')
node_maper.map_error_codes_to_item(json_data, child, 'state', 0)
# Антенна 1
for child in $bort.get_node('antenna1/grid').get_children():
node_maper.map_value_to_item(json_data, child, 'value0')
node_maper.map_value_to_item(json_data, child, 'value1')
node_maper.map_error_codes_to_item(json_data, child, 'state', 0)
# Антенна 2
for child in $bort.get_node('antenna2/grid').get_children():
node_maper.map_value_to_item(json_data, child, 'value0')
node_maper.map_value_to_item(json_data, child, 'value1')
node_maper.map_error_codes_to_item(json_data, child, 'state', 0)
# Остальные элементы
for child in $bort.get_children():
node_maper.map_value_to_item(json_data, child, 'value0')
node_maper.map_value_to_item(json_data, child, 'value1')
node_maper.map_error_codes_to_item(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_left_success()
if has_data:
last_response = scouting.get_left_response()
else:
has_data = scouting.has_right_success()
if has_data:
last_response = scouting.get_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)