Доработка контроля РТР БПО

This commit is contained in:
TotMaxim
2026-04-09 13:14:07 +03:00
parent 0c30572f1e
commit 65a0164ec0
5 changed files with 331 additions and 234 deletions

View File

@@ -16,9 +16,9 @@ var ctrl_pos = 0
func _ready() -> void:
# Подключаемся к сигналам в зависимости от борта
if this_afsp_name == 'Устройство РР левого борта':
scouting.response_received_left.connect(_on_response_received)
scouting.response_received_afsp_left.connect(_on_response_received)
else:
scouting.response_received_right.connect(_on_response_received)
scouting.response_received_afsp_right.connect(_on_response_received)
# При старте отрисовываем последние данные (если есть)
_on_press_device()
@@ -124,13 +124,11 @@ func _on_press_device() -> void:
var last_response = ""
if this_afsp_name == 'Устройство РР левого борта':
has_data = scouting.has_left_success()
if has_data:
last_response = scouting.get_left_response()
has_data = scouting.has_afsp_left_success()
if has_data: last_response = scouting.get_afsp_left_response()
else:
has_data = scouting.has_right_success()
if has_data:
last_response = scouting.get_right_response()
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():

View File

@@ -4,64 +4,53 @@ 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 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
signal receive_response_afp_bpo()
static var json_conv: JSON = JSON.new()
static var node_maper = load('res://scenes/контроль/node-maper.gd')
static var node_request_1: Node
static var node_request_timer_1: Node
static var node_request_2: Node
static var node_request_timer_2: Node
var ctrl_pos = 110
var bort_to_node_name = {}
var bort_to_unit_name = {}
func _ready() -> void:
ProjectSettings.connect('settings_changed', on_settings_changed)
node_request_1 = $request1
node_request_timer_1 = $request1/timer
node_request_2 = $request2
node_request_timer_2 = $request2/timer
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})
node_request_1.request_url = ProjectSettings.get_setting('application/config/%s' % settings_path1_to_url)
node_request_timer_1.wait_time = float(ProjectSettings.get_setting('application/config/%s' % settings_path_to_wait_time))
node_request_2.request_url = ProjectSettings.get_setting('application/config/%s' % settings_path2_to_url)
node_request_timer_2.wait_time = float(ProjectSettings.get_setting('application/config/%s' % settings_path_to_wait_time))
assert(node_request_1.request_url != null)
assert(node_request_2.request_url != null)
bort_to_unit_name.merge({this_bpo1_name: unit_name1, this_bpo2_name: unit_name2}, true)
func _on_request_completed(result, _response_code, headers, body: PackedByteArray):
if result != 0:
var rs = node_request_1.get_result_string(result)
push_error('\"%s\"' % rs)
# Обработка ответа от первого бпо
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)
var json_str: = body.get_string_from_utf8()
if not json_str:
push_error('не удаётся получить строку из utf8-данных (%s)' % headers)
# Обработка ответа от второго бпо
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\" (%s)' % [err, headers])
push_error('разбор json прерван - %s' % err)
return
var pp: = []
@@ -69,45 +58,96 @@ func _on_request_completed(result, _response_code, headers, body: PackedByteArra
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
if not bort_to_node_name.has(ret_val[0]):
push_error('не известное устройство: \"%s\"' % ret_val[0])
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[ret_val[0]]
var node_name = bort_to_node_name[device_name]
var bort_node = get_node(node_name)
var unit_name = bort_to_unit_name[ret_val[0]]
var unit_instance = network.get_unit_instance(unit_name)
unit_instance.rx_tick = Time.get_ticks_msec()
if not unit_instance.online:
unit_instance.online = true
unit_instance.emit_signal('line_changed', unit_instance)
# Обновляем 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.state == 1:
$yas_bpo_a1.state = 1
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.state == 1:
$yas_bpo_a2.state = 1
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.state == 1:
$mod_pit_g1.state = 1
if node.has_method('get') and node.get('state') == 1:
if has_node('mod_pit_g1'):
$mod_pit_g1.state = 1
break
emit_signal('receive_response_afp_bpo')
# Сброс конкретного грида
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:
@@ -123,3 +163,9 @@ func find_labels(node1: Node):
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)

View File

@@ -1,9 +1,8 @@
[gd_scene load_steps=5 format=3 uid="uid://5uv1idl3lqea"]
[gd_scene load_steps=4 format=3 uid="uid://5uv1idl3lqea"]
[ext_resource type="Script" uid="uid://d0jwv5opi3mrk" path="res://scenes/pribor-afsp/pribor-bpo.gd" id="1_bhc4e"]
[ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="2_jp6m0"]
[ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="3_jcpjs"]
[ext_resource type="Script" uid="uid://bux47vkw71w1t" path="res://scenes/контроль/request.gd" id="4_crej3"]
[node name="pribor_bpo" type="Control"]
layout_mode = 3
@@ -198,22 +197,3 @@ offset_bottom = 362.0
show_rname = false
self_size = Vector2i(50, 145)
fname = "Яч. связи"
[node name="request1" type="HTTPRequest" parent="."]
use_threads = true
script = ExtResource("4_crej3")
[node name="timer" type="Timer" parent="request1"]
autostart = true
[node name="request2" type="HTTPRequest" parent="."]
use_threads = true
script = ExtResource("4_crej3")
[node name="timer" type="Timer" parent="request2"]
autostart = true
[connection signal="request_completed" from="request1" to="." method="_on_request_completed"]
[connection signal="timeout" from="request1/timer" to="request1" method="_on_request_timer"]
[connection signal="request_completed" from="request2" to="." method="_on_request_completed"]
[connection signal="timeout" from="request2/timer" to="request2" method="_on_request_timer"]

View File

@@ -123,10 +123,13 @@ func _ready():
signaller.conn(signaller.режим_настройки, on_mode_changed)
signaller.conn(signaller.режим_эмс, on_mode_changed)
signaller.connect('debag_control_pressed', Callable(self, 'on_debag_button_pressed'))
scouting.request_sent_left.connect(_on_request_sent_left.bind($pribor_afsp_1))
scouting.response_received_left.connect(_on_response_received.bind($pribor_afsp_1))
scouting.request_sent_right.connect(_on_request_sent_left.bind($pribor_afsp_2))
scouting.response_received_right.connect(_on_response_received.bind($pribor_afsp_2))
scouting.request_sent_afsp_left.connect(_on_request_sent_left.bind($pribor_afsp_1))
scouting.response_received_afsp_left.connect(_on_response_received.bind($pribor_afsp_1))
scouting.request_sent_afsp_right.connect(_on_request_sent_left.bind($pribor_afsp_2))
scouting.response_received_afsp_right.connect(_on_response_received.bind($pribor_afsp_2))
scouting.request_sent_bpo_left.connect(_on_request_sent_left.bind($pribor_rtr))
scouting.response_received_bpo_left.connect(_on_response_received.bind($pribor_rtr))
@@ -173,7 +176,7 @@ func on_pribor_press(pribor_path, header_text, pribor_node):
update_pribor_items_visibility()
# Вызов при отправке запроса на селфтест АФСП
# Вызов при отправке запроса на селфтест АФСП и РТР
func _on_request_sent_left(_url: String, node: Node) -> void:
node.progress_max_value = 100
node.progress_value = 0
@@ -183,7 +186,7 @@ func _on_request_sent_left(_url: String, node: Node) -> void:
func _on_response_received(_response: String, _success: bool, node: Node):
node.progress_value = 100
#node.progress_visible = false
node.progress_visible = false
## Прием сигналов о текущем состояниях приборах