Files
uarep-ctl/scenes/pribor-afsp/pribor-bpo.gd

172 lines
6.7 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_rtr extends 'res://scenes/контроль/прибор.gd'
@export var prefix_path: String = '' ## Должно быть в JSON
@export var this_bpo1_name: String = '' ## Должно быть в JSON
@export var this_bpo2_name: String = '' ## Должно быть в JSON
@export var unit_name1: StringName = '' ## Должно быть в settings.gd
@export var unit_name2: StringName = '' ## Должно быть в settings.gd
@export var settings_path1_to_url: String = '' ## Должно быть в ProjectSettings
@export var settings_path2_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 = 110
var bort_to_node_name = {}
var bort_to_unit_name = {}
func _ready() -> void:
scouting.response_received_bpo_left.connect(_on_response_received_left)
scouting.response_received_bpo_right.connect(_on_response_received_right)
on_settings_changed()
find_labels(self)
_on_press_device()
func on_settings_changed():
bort_to_node_name.merge({this_bpo1_name: 'grid_bpo_a1', this_bpo2_name: 'grid_bpo_a2'}, true)
bort_to_unit_name.merge({this_bpo1_name: unit_name1, this_bpo2_name: unit_name2}, true)
# Обработка ответа от первого бпо
func _on_response_received_left(response: String, success: bool) -> void:
if not success:
log.error('Ошибка запроса или нет связи (левый): %s' % response)
_reset_grid('grid_bpo_a1')
return
_parse_and_update_ui(response)
# Обработка ответа от второго бпо
func _on_response_received_right(response: String, success: bool) -> void:
if not success:
log.error('Ошибка запроса или нет связи (правый): %s' % response)
_reset_grid('grid_bpo_a2')
return
_parse_and_update_ui(response)
# Оригинальный парсинг из _on_request_completed
func _parse_and_update_ui(json_str: String) -> void:
var rc: = json_conv.parse(json_str)
if rc != Error.OK:
var err = json_conv.get_error_message()
push_error('разбор json прерван - %s' % err)
return
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]])
return
var device_name: String = ret_val[0]
if not bort_to_node_name.has(device_name):
push_error('не известное устройство: %s' % device_name)
return
var node_name = bort_to_node_name[device_name]
var bort_node = get_node(node_name)
# Обновляем UI только для конкретного грида
for item in bort_node.get_children():
node_maper.map_value_to_item(json_conv.data, item, 'state')
# Обновляем групповые индикаторы
_update_group_indicators_original()
# Оригинальное обновление групповых индикаторов
func _update_group_indicators_original() -> void:
# Сначала сбрасываем все
if has_node('yas_bpo_a1'):
$yas_bpo_a1.state = 0
if has_node('yas_bpo_a2'):
$yas_bpo_a2.state = 0
if has_node('mod_pit_g1'):
$mod_pit_g1.state = 0
# Проверяем обе группы и устанавливаем если есть активные
var items = get_tree().get_nodes_in_group('управляется-по-шине-1')
for node in items:
if node.has_method('get') and node.get('state') == 1:
if has_node('yas_bpo_a1'):
$yas_bpo_a1.state = 1
break
items = get_tree().get_nodes_in_group('управляется-по-шине-2')
for node in items:
if node.has_method('get') and node.get('state') == 1:
if has_node('yas_bpo_a2'):
$yas_bpo_a2.state = 1
break
items = get_tree().get_nodes_in_group('потребитель-питания')
for node in items:
if node.has_method('get') and node.get('state') == 1:
if has_node('mod_pit_g1'):
$mod_pit_g1.state = 1
break
# Сброс конкретного грида
func _reset_grid(grid_name: String) -> void:
if has_node(grid_name):
for item in get_node(grid_name).get_children():
_reset_item_value(item)
_update_group_indicators_original()
# Сброс всех UI элементов в 0 (при отсутствии данных)
func _reset_ui_to_zero() -> void:
_reset_grid('grid_bpo_a1')
_reset_grid('grid_bpo_a2')
# Сброс конкретного элемента в 0
func _reset_item_value(item) -> void:
if item.has_method('set'):
item.set('value0', 0)
item.set('value1', 0)
item.set('value2', 0)
item.set('state', 0)
# Отрисовывание при нажатии на прибор
func _on_press_device() -> void:
# Проверяем левый борт
if scouting.has_bpo_left_success():
var response = scouting.get_bpo_left_response()
if not response.is_empty():
_parse_and_update_ui(response)
else:
_reset_grid('grid_bpo_a1')
# Проверяем правый борт
if scouting.has_bpo_right_success():
var response = scouting.get_bpo_right_response()
if not response.is_empty():
_parse_and_update_ui(response)
else:
_reset_grid('grid_bpo_a2')
func find_labels(node1: Node):
if node1 is Label:
if node1.name in ['lbl_rname', 'rname']:
if not node1.has_meta('tooltip_set'):
ctrl_pos += 1
var box_number = ceili(float(ctrl_pos) / 10.0)
var position_number = ctrl_pos % 10
if position_number == 0:
position_number = 10
node1.tooltip_text = 'Ящик - %d, Позиция - %d' % [box_number, position_number]
node1.mouse_filter = Control.MOUSE_FILTER_STOP
node1.set_meta('tooltip_set', true)
for child in node1.get_children():
find_labels(child)
## Вызывается при клике мыши на элементе.
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)