172 lines
6.7 KiB
GDScript
172 lines
6.7 KiB
GDScript
@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)
|