161 lines
6.3 KiB
GDScript
161 lines
6.3 KiB
GDScript
@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)
|