Compare commits
12 Commits
2e6be9b4f1
...
56e6aa4bb0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
56e6aa4bb0 | ||
|
|
5032115b5d | ||
|
|
caebd4f05b | ||
|
|
b4e81218ab | ||
|
|
1633a45c9b | ||
|
|
65a0164ec0 | ||
|
|
0c30572f1e | ||
|
|
08597ff7ce | ||
|
|
6294730bf8 | ||
|
|
f407578a44 | ||
|
|
ec21282ba0 | ||
|
|
38529ac0cc |
@@ -123,6 +123,7 @@ prd="*res://scripts/prd.gd"
|
||||
navi="*res://scripts/navigation.gd"
|
||||
trassa="*res://scripts/trassa.gd"
|
||||
yemstg="*res://scripts/yemstg.gd"
|
||||
scouting="*res://scripts/rtr.gd"
|
||||
|
||||
[debug]
|
||||
|
||||
|
||||
@@ -97,8 +97,8 @@ name_min_size0 = Vector2i(35, 20)
|
||||
name_min_size1 = Vector2i(35, 20)
|
||||
name_min_size2 = Vector2i(35, 20)
|
||||
fname = "Канал 2"
|
||||
metadata/value0 = "SelfTest[1].SystemList[1].DevList[1].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[2].SystemList[1].DevList[1].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value0 = "SelfTest[0].SystemList[1].DevList[1].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[0].SystemList[1].DevList[1].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value2 = "SelfTest[0].SystemList[1].DevList[1]['TestPassed']"
|
||||
metadata/state = ["SelfTest[0].SystemList[1].DevList[1]['TestPassed']"]
|
||||
|
||||
@@ -122,8 +122,8 @@ name_min_size0 = Vector2i(35, 20)
|
||||
name_min_size1 = Vector2i(35, 20)
|
||||
name_min_size2 = Vector2i(35, 20)
|
||||
fname = "Канал 3"
|
||||
metadata/value0 = "SelfTest[1].SystemList[1].DevList[2].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[2].SystemList[1].DevList[2].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value0 = "SelfTest[0].SystemList[1].DevList[2].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[0].SystemList[1].DevList[2].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value2 = "SelfTest[0].SystemList[1].DevList[2]['TestPassed']"
|
||||
metadata/state = ["SelfTest[0].SystemList[1].DevList[2]['TestPassed']"]
|
||||
|
||||
@@ -147,8 +147,8 @@ name_min_size0 = Vector2i(35, 20)
|
||||
name_min_size1 = Vector2i(35, 20)
|
||||
name_min_size2 = Vector2i(35, 20)
|
||||
fname = "Канал 4"
|
||||
metadata/value0 = "SelfTest[1].SystemList[1].DevList[3].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[2].SystemList[1].DevList[3].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value0 = "SelfTest[0].SystemList[1].DevList[3].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[0].SystemList[1].DevList[3].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value2 = "SelfTest[0].SystemList[1].DevList[3]['TestPassed']"
|
||||
metadata/state = ["SelfTest[0].SystemList[1].DevList[3]['TestPassed']"]
|
||||
|
||||
@@ -172,8 +172,8 @@ name_min_size0 = Vector2i(35, 20)
|
||||
name_min_size1 = Vector2i(35, 20)
|
||||
name_min_size2 = Vector2i(35, 20)
|
||||
fname = "Канал 5"
|
||||
metadata/value0 = "SelfTest[1].SystemList[1].DevList[4].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[2].SystemList[1].DevList[4].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value0 = "SelfTest[0].SystemList[1].DevList[4].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[0].SystemList[1].DevList[4].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value2 = "SelfTest[0].SystemList[1].DevList[4]['TestPassed']"
|
||||
metadata/state = ["SelfTest[0].SystemList[1].DevList[4]['TestPassed']"]
|
||||
|
||||
@@ -197,8 +197,8 @@ name_min_size0 = Vector2i(35, 20)
|
||||
name_min_size1 = Vector2i(35, 20)
|
||||
name_min_size2 = Vector2i(35, 20)
|
||||
fname = "Канал 6"
|
||||
metadata/value0 = "SelfTest[1].SystemList[1].DevList[5].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[2].SystemList[1].DevList[5].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value0 = "SelfTest[0].SystemList[1].DevList[5].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[0].SystemList[1].DevList[5].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value2 = "SelfTest[0].SystemList[1].DevList[5]['TestPassed']"
|
||||
metadata/state = ["SelfTest[0].SystemList[1].DevList[5]['TestPassed']"]
|
||||
|
||||
@@ -222,8 +222,8 @@ name_min_size0 = Vector2i(35, 20)
|
||||
name_min_size1 = Vector2i(35, 20)
|
||||
name_min_size2 = Vector2i(35, 20)
|
||||
fname = "Канал 7"
|
||||
metadata/value0 = "SelfTest[1].SystemList[1].DevList[6].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[2].SystemList[1].DevList[6].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value0 = "SelfTest[0].SystemList[1].DevList[6].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[0].SystemList[1].DevList[6].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value2 = "SelfTest[0].SystemList[1].DevList[6]['TestPassed']"
|
||||
metadata/state = ["SelfTest[0].SystemList[1].DevList[6]['TestPassed']"]
|
||||
|
||||
@@ -247,8 +247,8 @@ name_min_size0 = Vector2i(35, 20)
|
||||
name_min_size1 = Vector2i(35, 20)
|
||||
name_min_size2 = Vector2i(35, 20)
|
||||
fname = "Канал 8"
|
||||
metadata/value0 = "SelfTest[1].SystemList[1].DevList[7].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[2].SystemList[1].DevList[7].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value0 = "SelfTest[0].SystemList[1].DevList[7].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[0].SystemList[1].DevList[7].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value2 = "SelfTest[0].SystemList[1].DevList[7]['TestPassed']"
|
||||
metadata/state = ["SelfTest[0].SystemList[1].DevList[7]['TestPassed']"]
|
||||
|
||||
@@ -800,7 +800,7 @@ offset_right = 580.0
|
||||
offset_bottom = 115.0
|
||||
tooltip_text = "Плата АЦП ADCS500"
|
||||
fname = "АЦП"
|
||||
metadata/state = ["SelfTest[4].SystemList[0].DevList[1]['TestPassed']"]
|
||||
metadata/state = ["SelfTest[0].SystemList[0].DevList[1]['TestPassed']"]
|
||||
|
||||
[node name="dsp" parent="." instance=ExtResource("4_mtf2n")]
|
||||
layout_mode = 0
|
||||
@@ -809,7 +809,7 @@ offset_right = 580.0
|
||||
offset_bottom = 60.0
|
||||
tooltip_text = "Плата цифровой обработки сигналов BPL"
|
||||
fname = "Сигн. проц."
|
||||
metadata/state = ["SelfTest[4].SystemList[0].DevList[0]['TestPassed']"]
|
||||
metadata/state = ["SelfTest[0].SystemList[0].DevList[0]['TestPassed']"]
|
||||
|
||||
[node name="gen" parent="." instance=ExtResource("2_dmhrm")]
|
||||
layout_mode = 2
|
||||
@@ -827,8 +827,8 @@ name_min_size0 = Vector2i(35, 20)
|
||||
name_min_size1 = Vector2i(35, 20)
|
||||
name_min_size2 = Vector2i(35, 20)
|
||||
fname = "Генератор"
|
||||
metadata/value0 = "SelfTest[1].SystemList[2].DevList[0].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[2].SystemList[2].DevList[0].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value0 = "SelfTest[0].SystemList[2].DevList[0].TestedParamList[0]['CurrentValue']"
|
||||
metadata/value1 = "SelfTest[0].SystemList[2].DevList[0].TestedParamList[0]['CurrentValue']"
|
||||
metadata/state = ["SelfTest[0].SystemList[2].DevList[0]['TestPassed']"]
|
||||
|
||||
[node name="rpu" parent="." instance=ExtResource("2_dmhrm")]
|
||||
@@ -848,8 +848,8 @@ name_min_size0 = Vector2i(35, 20)
|
||||
name_min_size1 = Vector2i(35, 20)
|
||||
name_min_size2 = Vector2i(35, 20)
|
||||
fname = "Приёмник 20...1000 МГц"
|
||||
metadata/value0 = "SelfTest[1].SystemList[0].DevList[0]['TestPassed']"
|
||||
metadata/value1 = "SelfTest[2].SystemList[0].DevList[0]['TestPassed']"
|
||||
metadata/value0 = "SelfTest[0].SystemList[0].DevList[0]['TestPassed']"
|
||||
metadata/value1 = "SelfTest[0].SystemList[0].DevList[0]['TestPassed']"
|
||||
metadata/state = ["SelfTest[0].SystemList[0].DevList[3]['TestPassed']"]
|
||||
|
||||
[connection signal="pressed" from="konverter/grid/kanal1" to="." method="_on_item_pressed"]
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://8ll27id5ajq1"]
|
||||
[gd_scene load_steps=3 format=3 uid="uid://8ll27id5ajq1"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://d0jwv5opi3mrl" path="res://scenes/pribor-afsp/pribor-afsp.gd" id="1_151rh"]
|
||||
[ext_resource type="Script" uid="uid://bux47vkw71w1t" path="res://scenes/контроль/request.gd" id="2_4vyhj"]
|
||||
[ext_resource type="PackedScene" uid="uid://dnxq870xf6pkh" path="res://scenes/pribor-afsp/bort-afsp.tscn" id="3_d7iti"]
|
||||
|
||||
[node name="pribor_afsp" type="Control"]
|
||||
@@ -20,13 +19,6 @@ settings_path_to_url = "Адрес АФСП левого борта"
|
||||
settings_path_to_wait_time = "Период опроса состояния АФСП, секунды"
|
||||
metadata/DeviceName = &"Устройство РР левого борта"
|
||||
|
||||
[node name="request" type="HTTPRequest" parent="."]
|
||||
use_threads = true
|
||||
script = ExtResource("2_4vyhj")
|
||||
|
||||
[node name="timer" type="Timer" parent="request"]
|
||||
autostart = true
|
||||
|
||||
[node name="bort" parent="." instance=ExtResource("3_d7iti")]
|
||||
layout_mode = 0
|
||||
offset_left = 24.0
|
||||
@@ -35,7 +27,4 @@ offset_right = 604.0
|
||||
offset_bottom = 1216.78
|
||||
metadata/DeviceName = &"Устройство РР левого борта"
|
||||
|
||||
[connection signal="child_entered_tree" from="request" to="request" method="_on_child_entered_tree"]
|
||||
[connection signal="request_completed" from="request" to="." method="_on_request_completed"]
|
||||
[connection signal="timeout" from="request/timer" to="request" method="_on_request_timer"]
|
||||
[connection signal="pressed" from="bort" to="." method="_on_item_pressed"]
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://5uv1idl3lqet"]
|
||||
[gd_scene load_steps=3 format=3 uid="uid://5uv1idl3lqet"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://d0jwv5opi3mrl" path="res://scenes/pribor-afsp/pribor-afsp.gd" id="1_tfses"]
|
||||
[ext_resource type="Script" uid="uid://bux47vkw71w1t" path="res://scenes/контроль/request.gd" id="2_miwrd"]
|
||||
[ext_resource type="PackedScene" uid="uid://dnxq870xf6pkh" path="res://scenes/pribor-afsp/bort-afsp.tscn" id="3_xpxb5"]
|
||||
|
||||
[node name="pribor_afsp" type="Control"]
|
||||
@@ -20,13 +19,6 @@ settings_path_to_url = "Адрес АФСП правого борта"
|
||||
settings_path_to_wait_time = "Период опроса состояния АФСП, секунды"
|
||||
metadata/DeviceName = &"Устройство РР правого борта"
|
||||
|
||||
[node name="request" type="HTTPRequest" parent="."]
|
||||
use_threads = true
|
||||
script = ExtResource("2_miwrd")
|
||||
|
||||
[node name="timer" type="Timer" parent="request"]
|
||||
autostart = true
|
||||
|
||||
[node name="bort" parent="." instance=ExtResource("3_xpxb5")]
|
||||
layout_mode = 0
|
||||
offset_left = 12.0
|
||||
@@ -35,7 +27,4 @@ offset_right = 592.0
|
||||
offset_bottom = 1130.0
|
||||
metadata/DeviceName = &"Устройство РР правого борта"
|
||||
|
||||
[connection signal="child_entered_tree" from="request" to="request" method="_on_child_entered_tree"]
|
||||
[connection signal="request_completed" from="request" to="." method="_on_request_completed"]
|
||||
[connection signal="timeout" from="request/timer" to="request" method="_on_request_timer"]
|
||||
[connection signal="pressed" from="bort" to="." method="_on_item_pressed"]
|
||||
|
||||
@@ -7,98 +7,145 @@ class_name pribor_afsp extends 'res://scenes/контроль/прибор.gd'
|
||||
@export var settings_path_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: Node
|
||||
static var node_request_timer: Node
|
||||
var ctrl_pos = 0
|
||||
# SystemName: "gen" DevList - там состояние связи с генератором по кан шине
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
ProjectSettings.connect('settings_changed', on_settings_chaged)
|
||||
node_request = $request
|
||||
node_request_timer = $request/timer
|
||||
on_settings_chaged()
|
||||
# Подключаемся к сигналам в зависимости от борта
|
||||
if this_afsp_name == 'Устройство РР левого борта':
|
||||
scouting.response_received_afsp_left.connect(_on_response_received)
|
||||
else:
|
||||
scouting.response_received_afsp_right.connect(_on_response_received)
|
||||
|
||||
# При старте отрисовываем последние данные (если есть)
|
||||
_on_press_device()
|
||||
|
||||
|
||||
func on_settings_chaged():
|
||||
node_request.request_url = ProjectSettings.get_setting('application/config/%s' % settings_path_to_url)
|
||||
node_request_timer.wait_time = float(ProjectSettings.get_setting('application/config/%s' % settings_path_to_wait_time))
|
||||
tools.allways(node_request.request_url != null)
|
||||
|
||||
|
||||
func _on_request_completed(result, _response_code, headers, body: PackedByteArray):
|
||||
|
||||
var unit_instance: = network.get_unit_instance(unit_name)
|
||||
|
||||
if result != 0:
|
||||
var rs = node_request.get_result_string(result)
|
||||
log.error('\"%s\"' % rs)
|
||||
if unit_instance.online:
|
||||
unit_instance.online = false
|
||||
unit_instance.emit_signal('line_changed', unit_instance)
|
||||
# Обработка полученного ответа от rtr
|
||||
func _on_response_received(response: String, success: bool) -> void:
|
||||
if not success:
|
||||
log.error('Ошибка запроса или нет связи: %s' % response)
|
||||
_reset_ui_to_zero()
|
||||
return
|
||||
|
||||
var json_str: String = body.get_string_from_utf8()
|
||||
if not json_str:
|
||||
push_error('не удаётся получить строку utf8 из данных (%s)' % headers)
|
||||
if unit_instance.online:
|
||||
unit_instance.online = false
|
||||
unit_instance.emit_signal('line_changed', unit_instance)
|
||||
|
||||
# Парсим 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
|
||||
|
||||
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])
|
||||
if unit_instance.online:
|
||||
unit_instance.online = false
|
||||
unit_instance.emit_signal('line_changed', unit_instance)
|
||||
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:
|
||||
# TODO: Сюда попадаем, когда приходит от другого борта
|
||||
#push_error('не известное устройство: \"%s\", ожидадось: \"%s\"' % [received_afsp_name, this_afsp_name])
|
||||
# Ответ от другого борта - игнорируем
|
||||
return
|
||||
|
||||
# Обновляем UI элементы из JSON
|
||||
_update_ui(json_conv.data)
|
||||
|
||||
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)
|
||||
|
||||
# Обновление интерфейса из 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_conv.data, child, 'value0')
|
||||
node_maper.map_value_to_item(json_conv.data, child, 'value1')
|
||||
node_maper.map_value_to_item(json_conv.data, child, 'value2')
|
||||
node_maper.map_error_codes_to_item(json_conv.data, child, 'state', 0)
|
||||
node_maper.map_value_to_item_animated(json_data, child, 'value0')
|
||||
node_maper.map_value_to_item_animated(json_data, child, 'value1')
|
||||
node_maper.map_value_to_item_animated(json_data, child, 'value2')
|
||||
node_maper.map_error_codes_to_item_animated(json_data, child, 'state', 0)
|
||||
|
||||
# Антенна 1
|
||||
for child in $bort.get_node('antenna1/grid').get_children():
|
||||
node_maper.map_value_to_item(json_conv.data, child, 'value0')
|
||||
node_maper.map_value_to_item(json_conv.data, child, 'value1')
|
||||
node_maper.map_error_codes_to_item(json_conv.data, child, 'state', 0)
|
||||
node_maper.map_value_to_item_animated(json_data, child, 'value0')
|
||||
node_maper.map_value_to_item_animated(json_data, child, 'value1')
|
||||
node_maper.map_error_codes_to_item_animated(json_data, child, 'state', 0)
|
||||
|
||||
# Антенна 2
|
||||
for child in $bort.get_node('antenna2/grid').get_children():
|
||||
node_maper.map_value_to_item(json_conv.data, child, 'value0')
|
||||
node_maper.map_value_to_item(json_conv.data, child, 'value1')
|
||||
node_maper.map_error_codes_to_item(json_conv.data, child, 'state', 0)
|
||||
node_maper.map_value_to_item_animated(json_data, child, 'value0')
|
||||
node_maper.map_value_to_item_animated(json_data, child, 'value1')
|
||||
node_maper.map_error_codes_to_item_animated(json_data, child, 'state', 0)
|
||||
|
||||
# Остальные элементы
|
||||
for child in $bort.get_children():
|
||||
node_maper.map_value_to_item(json_conv.data, child, 'value0')
|
||||
node_maper.map_value_to_item(json_conv.data, child, 'value1')
|
||||
node_maper.map_error_codes_to_item(json_conv.data, child, 'state', 0)
|
||||
node_maper.map_value_to_item_animated(json_data, child, 'value0')
|
||||
node_maper.map_value_to_item_animated(json_data, child, 'value1')
|
||||
node_maper.map_error_codes_to_item_animated(json_data, child, 'state', 0)
|
||||
|
||||
emit_signal('receive_response_afp_bpo')
|
||||
|
||||
# Сброс всех 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_afsp_left_success()
|
||||
if has_data: last_response = scouting.get_afsp_left_response()
|
||||
else:
|
||||
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():
|
||||
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()
|
||||
|
||||
|
||||
## Вызывается при клике мыши на элементе.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -12,6 +12,13 @@ enum DEVICE_STATUS {
|
||||
CONTROL # Контроль завершен
|
||||
}
|
||||
|
||||
# Состояния сервиса для RTR устройств
|
||||
enum RTR_SERVICEABILITY {
|
||||
NO_CONNECTION = 0, # Нет связи
|
||||
PASSED = 1, # Все тесты пройдены
|
||||
ERROR = 2 # Есть ошибки
|
||||
}
|
||||
|
||||
const STATUS_CONFIG := {
|
||||
DEVICE_STATE.NONE: {'text': 'Нет связи', 'color': Color.WHITE, 'font_color': Color.BLACK},
|
||||
DEVICE_STATE.GOOD: {'text': 'Исправно', 'color': Color.GREEN, 'font_color': Color.BLACK},
|
||||
@@ -22,6 +29,9 @@ class DeviceObserver:
|
||||
var device_name: String
|
||||
var status: Array = [false, false, false] # [online, operational, control_complete]
|
||||
var last_results: Dictionary = {}
|
||||
|
||||
# Для RTR устройств
|
||||
var rtr_serviceability: int = RTR_SERVICEABILITY.NO_CONNECTION
|
||||
|
||||
func update_online_state(online: bool) -> bool:
|
||||
if status[DEVICE_STATUS.ONLINE] != online:
|
||||
@@ -55,11 +65,28 @@ class DeviceObserver:
|
||||
status[DEVICE_STATUS.CONTROL] = false
|
||||
changed = true
|
||||
return changed
|
||||
|
||||
func update_rtr_serviceability(state: int) -> bool:
|
||||
if rtr_serviceability != state:
|
||||
rtr_serviceability = state
|
||||
# Обновляем operational статус на основе RTR
|
||||
var new_operational = (state == RTR_SERVICEABILITY.PASSED)
|
||||
if status[DEVICE_STATUS.STATUS] != new_operational:
|
||||
status[DEVICE_STATUS.STATUS] = new_operational
|
||||
return true
|
||||
return false
|
||||
|
||||
var device_observers: Dictionary = {}
|
||||
var overall_prd_state: DEVICE_STATE = DEVICE_STATE.NONE
|
||||
var status_uf: int = DEVICE_STATE.NONE # Статус УФ (УАРЭП-ЭМС)
|
||||
|
||||
# Добавляем наблюдателей для RTR устройств
|
||||
var rtr_device_names := [
|
||||
'rtr_afsp_left',
|
||||
'rtr_afsp_right',
|
||||
'rtr_bpo' # Общий для левого и правого БПО
|
||||
]
|
||||
|
||||
func _ready() -> void:
|
||||
tooltip_text = 'Нет связи с приборами комплекса'
|
||||
add_theme_color_override('font_color', Color.BLACK)
|
||||
@@ -78,11 +105,20 @@ func _ready() -> void:
|
||||
|
||||
# Подписка на УФ
|
||||
signaller.connect('update_uf_serviceability', _on_uf_status_receive)
|
||||
|
||||
# Подписка на сигналы RTR (через signaller или напрямую)
|
||||
_connect_rtr_signals()
|
||||
|
||||
# Инициализация начального состояния
|
||||
_recalculate_overall_state()
|
||||
|
||||
|
||||
func _connect_rtr_signals() -> void:
|
||||
scouting.connect('serviceability_rtr_afsp_left', Callable(self, '_on_rtr_afsp_left_serviceability'))
|
||||
scouting.connect('serviceability_rtr_afsp_right', Callable(self, '_on_rtr_afsp_right_serviceability'))
|
||||
scouting.connect('serviceability_rtr_bpo', Callable(self, '_on_rtr_bpo_serviceability'))
|
||||
|
||||
|
||||
func _initialize_observers() -> void:
|
||||
var device_names := [
|
||||
'уарэп-яу07-1н', 'уарэп-яу07-1в', 'уарэп-яу07-1к',
|
||||
@@ -94,6 +130,69 @@ func _initialize_observers() -> void:
|
||||
for device_name in device_names:
|
||||
device_observers[device_name] = DeviceObserver.new()
|
||||
device_observers[device_name].device_name = device_name
|
||||
|
||||
# Инициализируем наблюдателей для RTR устройств
|
||||
for rtr_name in rtr_device_names:
|
||||
device_observers[rtr_name] = DeviceObserver.new()
|
||||
device_observers[rtr_name].device_name = rtr_name
|
||||
|
||||
|
||||
# Обработчики сигналов RTR
|
||||
func _on_rtr_afsp_left_serviceability(state: int) -> void:
|
||||
var observer: DeviceObserver = device_observers.get('rtr_afsp_left')
|
||||
if not observer:
|
||||
return
|
||||
|
||||
var changed = false
|
||||
if observer.update_rtr_serviceability(state):
|
||||
changed = true
|
||||
|
||||
var is_online = (state != RTR_SERVICEABILITY.NO_CONNECTION)
|
||||
if observer.update_online_state(is_online):
|
||||
changed = true
|
||||
|
||||
if changed:
|
||||
_recalculate_overall_state()
|
||||
else:
|
||||
_update_display()
|
||||
|
||||
|
||||
func _on_rtr_afsp_right_serviceability(state: int) -> void:
|
||||
var observer: DeviceObserver = device_observers.get('rtr_afsp_right')
|
||||
if not observer:
|
||||
return
|
||||
|
||||
var changed = false
|
||||
if observer.update_rtr_serviceability(state):
|
||||
changed = true
|
||||
|
||||
var is_online = (state != RTR_SERVICEABILITY.NO_CONNECTION)
|
||||
if observer.update_online_state(is_online):
|
||||
changed = true
|
||||
|
||||
if changed:
|
||||
_recalculate_overall_state()
|
||||
else:
|
||||
_update_display()
|
||||
|
||||
|
||||
func _on_rtr_bpo_serviceability(state: int) -> void:
|
||||
var observer: DeviceObserver = device_observers.get('rtr_bpo')
|
||||
if not observer:
|
||||
return
|
||||
|
||||
var changed = false
|
||||
if observer.update_rtr_serviceability(state):
|
||||
changed = true
|
||||
|
||||
var is_online = (state != RTR_SERVICEABILITY.NO_CONNECTION)
|
||||
if observer.update_online_state(is_online):
|
||||
changed = true
|
||||
|
||||
if changed:
|
||||
_recalculate_overall_state()
|
||||
else:
|
||||
_update_display()
|
||||
|
||||
|
||||
func _on_prd_online_changed(line_status: Object, prd_module: Object) -> void:
|
||||
@@ -123,7 +222,12 @@ func _recalculate_overall_state() -> void:
|
||||
var has_online_prd := false
|
||||
var all_prd_operational := true
|
||||
|
||||
for observer in device_observers.values():
|
||||
for observer_key in device_observers.keys():
|
||||
# Пропускаем RTR устройства при подсчете ПРД
|
||||
if observer_key.begins_with('rtr_'):
|
||||
continue
|
||||
|
||||
var observer = device_observers[observer_key]
|
||||
if observer.status[DEVICE_STATUS.ONLINE]:
|
||||
has_online_prd = true
|
||||
|
||||
@@ -142,15 +246,35 @@ func _recalculate_overall_state() -> void:
|
||||
prd_state = DEVICE_STATE.ERR
|
||||
else:
|
||||
prd_state = DEVICE_STATE.NONE
|
||||
|
||||
# Проверяем статус RTR устройств
|
||||
var rtr_state := DEVICE_STATE.NONE
|
||||
var has_online_rtr := false
|
||||
var all_rtr_operational := true
|
||||
|
||||
for rtr_name in rtr_device_names:
|
||||
var observer = device_observers.get(rtr_name)
|
||||
if observer and observer.status[DEVICE_STATUS.ONLINE]:
|
||||
has_online_rtr = true
|
||||
if not observer.status[DEVICE_STATUS.STATUS]:
|
||||
all_rtr_operational = false
|
||||
|
||||
if has_online_rtr:
|
||||
if all_rtr_operational:
|
||||
rtr_state = DEVICE_STATE.GOOD
|
||||
else:
|
||||
rtr_state = DEVICE_STATE.ERR
|
||||
else:
|
||||
rtr_state = DEVICE_STATE.NONE
|
||||
|
||||
# Комбинируем статусы по правилу:
|
||||
# 1. Если хоть один ERROR → ERROR
|
||||
# 2. Если нет ERROR и хоть один GOOD → GOOD
|
||||
# 3. Иначе → NONE
|
||||
|
||||
if prd_state == DEVICE_STATE.ERR or status_uf == DEVICE_STATE.ERR:
|
||||
if prd_state == DEVICE_STATE.ERR or status_uf == DEVICE_STATE.ERR or rtr_state == DEVICE_STATE.ERR:
|
||||
new_state = DEVICE_STATE.ERR
|
||||
elif prd_state == DEVICE_STATE.GOOD or status_uf == DEVICE_STATE.GOOD:
|
||||
elif prd_state == DEVICE_STATE.GOOD or status_uf == DEVICE_STATE.GOOD or rtr_state == DEVICE_STATE.GOOD:
|
||||
new_state = DEVICE_STATE.GOOD
|
||||
else:
|
||||
new_state = DEVICE_STATE.NONE
|
||||
@@ -174,6 +298,7 @@ func _get_tooltip_text() -> String:
|
||||
# Получаем статистику по ПРД
|
||||
var prd_summary = _get_prd_summary()
|
||||
var uf_status_str = _get_uf_status_text()
|
||||
var rtr_summary = _get_rtr_summary()
|
||||
|
||||
match overall_prd_state:
|
||||
DEVICE_STATE.NONE:
|
||||
@@ -185,6 +310,7 @@ func _get_tooltip_text() -> String:
|
||||
|
||||
tooltip += '\n\nСтатус ПРД систем: ' + prd_summary
|
||||
tooltip += '\nСтатус УФ: ' + uf_status_str
|
||||
tooltip += '\nСтатус RTR: ' + rtr_summary
|
||||
|
||||
# Детализация по источникам статуса
|
||||
tooltip += '\n\nСостояние систем:'
|
||||
@@ -192,7 +318,10 @@ func _get_tooltip_text() -> String:
|
||||
# ПРД системы
|
||||
var prd_ok_count = 0
|
||||
var prd_total = 0
|
||||
for observer in device_observers.values():
|
||||
for observer_key in device_observers.keys():
|
||||
if observer_key.begins_with('rtr_'):
|
||||
continue
|
||||
var observer = device_observers[observer_key]
|
||||
if observer.status[DEVICE_STATUS.ONLINE]:
|
||||
prd_total += 1
|
||||
if observer.status[DEVICE_STATUS.STATUS]:
|
||||
@@ -202,15 +331,67 @@ func _get_tooltip_text() -> String:
|
||||
|
||||
# УФ система
|
||||
tooltip += '\nУФ: ' + _get_uf_status_text()
|
||||
|
||||
|
||||
# RTR системы
|
||||
tooltip += '\nRTR:'
|
||||
for rtr_name in rtr_device_names:
|
||||
var observer = device_observers.get(rtr_name)
|
||||
if observer:
|
||||
var status_text = _get_rtr_status_text(observer.rtr_serviceability)
|
||||
var display_name = _get_rtr_display_name(rtr_name)
|
||||
tooltip += '\n - %s: %s' % [display_name, status_text]
|
||||
return tooltip
|
||||
|
||||
|
||||
func _get_rtr_summary() -> String:
|
||||
var online_count := 0
|
||||
var operational_count := 0
|
||||
|
||||
for rtr_name in rtr_device_names:
|
||||
var observer = device_observers.get(rtr_name)
|
||||
if observer and observer.status[DEVICE_STATUS.ONLINE]:
|
||||
online_count += 1
|
||||
if observer.status[DEVICE_STATUS.STATUS]:
|
||||
operational_count += 1
|
||||
|
||||
if online_count == 0:
|
||||
return 'Нет связи'
|
||||
else:
|
||||
return '%d/%d исправно' % [operational_count, online_count]
|
||||
|
||||
|
||||
func _get_rtr_status_text(state: int) -> String:
|
||||
match state:
|
||||
RTR_SERVICEABILITY.NO_CONNECTION:
|
||||
return 'Нет связи'
|
||||
RTR_SERVICEABILITY.PASSED:
|
||||
return 'Исправен'
|
||||
RTR_SERVICEABILITY.ERROR:
|
||||
return 'Ошибка'
|
||||
_:
|
||||
return 'Неизвестно'
|
||||
|
||||
|
||||
func _get_rtr_display_name(rtr_key: String) -> String:
|
||||
match rtr_key:
|
||||
'rtr_afsp_left':
|
||||
return 'АФСП Л'
|
||||
'rtr_afsp_right':
|
||||
return 'АФСП П'
|
||||
'rtr_bpo':
|
||||
return 'РТР'
|
||||
_:
|
||||
return rtr_key.replace('rtr_', '')
|
||||
|
||||
|
||||
func _get_prd_summary() -> String:
|
||||
var online_count := 0
|
||||
var operational_count := 0
|
||||
|
||||
for observer in device_observers.values():
|
||||
for observer_key in device_observers.keys():
|
||||
if observer_key.begins_with('rtr_'):
|
||||
continue
|
||||
var observer = device_observers[observer_key]
|
||||
if observer.status[DEVICE_STATUS.ONLINE]:
|
||||
online_count += 1
|
||||
if observer.status[DEVICE_STATUS.STATUS]:
|
||||
@@ -235,14 +416,20 @@ func _get_uf_status_text() -> String:
|
||||
|
||||
|
||||
func _has_prd_errors() -> bool:
|
||||
for observer in device_observers.values():
|
||||
for observer_key in device_observers.keys():
|
||||
if observer_key.begins_with('rtr_'):
|
||||
continue
|
||||
var observer = device_observers[observer_key]
|
||||
if observer.status[DEVICE_STATUS.ONLINE] and not observer.status[DEVICE_STATUS.STATUS]:
|
||||
return true
|
||||
return false
|
||||
|
||||
|
||||
func _has_operational_prd() -> bool:
|
||||
for observer in device_observers.values():
|
||||
for observer_key in device_observers.keys():
|
||||
if observer_key.begins_with('rtr_'):
|
||||
continue
|
||||
var observer = device_observers[observer_key]
|
||||
if observer.status[DEVICE_STATUS.ONLINE] and observer.status[DEVICE_STATUS.STATUS]:
|
||||
return true
|
||||
return false
|
||||
@@ -257,7 +444,8 @@ func get_device_status(device_name: String) -> Dictionary:
|
||||
'operational': observer.status[DEVICE_STATUS.STATUS],
|
||||
'control_complete': observer.status[DEVICE_STATUS.CONTROL],
|
||||
'last_results': observer.last_results.duplicate(),
|
||||
'status_uf': status_uf
|
||||
'status_uf': status_uf,
|
||||
'rtr_serviceability': observer.rtr_serviceability if device_name.begins_with('rtr_') else -1
|
||||
}
|
||||
return {}
|
||||
|
||||
@@ -267,7 +455,10 @@ func get_overall_status() -> Dictionary:
|
||||
var operational_count := 0
|
||||
var control_complete_count := 0
|
||||
|
||||
for observer in device_observers.values():
|
||||
for observer_key in device_observers.keys():
|
||||
if observer_key.begins_with('rtr_'):
|
||||
continue
|
||||
var observer = device_observers[observer_key]
|
||||
if observer.status[DEVICE_STATUS.ONLINE]:
|
||||
online_count += 1
|
||||
if observer.status[DEVICE_STATUS.STATUS]:
|
||||
@@ -279,7 +470,8 @@ func get_overall_status() -> Dictionary:
|
||||
'overall_state': overall_prd_state,
|
||||
'online_devices': online_count,
|
||||
'operational_devices': operational_count,
|
||||
'total_devices': device_observers.size(),
|
||||
'total_devices': device_observers.size() - len(rtr_device_names), # Исключаем RTR
|
||||
'control_complete_devices': control_complete_count,
|
||||
'uf_status': status_uf
|
||||
'uf_status': status_uf,
|
||||
'rtr_status': _get_rtr_summary()
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
extends Node
|
||||
|
||||
|
||||
static func map_value_to_item(data, item, value_name: StringName):
|
||||
var meta = item.get_meta(value_name, '')
|
||||
if meta == '':
|
||||
@@ -17,7 +16,6 @@ static func map_value_to_item(data, item, value_name: StringName):
|
||||
else:
|
||||
push_error('не найден путь %s (%s) для $%s.%s (%s)' % [paths_copy, ret_val[2], item.name, value_name, item.tooltip_text])
|
||||
|
||||
|
||||
static func map_error_codes_to_item(data, item, value_name: StringName, value_init: int):
|
||||
var metas = item.get_meta(value_name, '')
|
||||
if not (metas is Array):
|
||||
@@ -38,3 +36,52 @@ static func map_error_codes_to_item(data, item, value_name: StringName, value_in
|
||||
item.set(value_name, test_res)
|
||||
else:
|
||||
item.set(value_name, value_init)
|
||||
|
||||
# Плавное обновление с анимацией
|
||||
static func map_value_to_item_animated(data, item, value_name: StringName):
|
||||
var meta = item.get_meta(value_name, '')
|
||||
if meta == '' or not (meta is String): return
|
||||
|
||||
var paths: = Array()
|
||||
tools.map_solid_to_array(meta, paths)
|
||||
var ret_val: = [null, false, 0]
|
||||
tools.get_value_by_path(data, paths, ret_val)
|
||||
|
||||
if ret_val[1]:
|
||||
_animate_property(item, value_name, ret_val[0])
|
||||
else:
|
||||
push_error('не найден путь для $%s.%s' % [item.name, value_name])
|
||||
|
||||
static func map_error_codes_to_item_animated(data, item, value_name: StringName, value_init: int):
|
||||
var metas = item.get_meta(value_name, '')
|
||||
if not (metas is Array): return
|
||||
|
||||
var paths: = Array()
|
||||
var values: = Array()
|
||||
for meta in metas:
|
||||
tools.map_solid_to_array(meta, paths)
|
||||
var ret_val: = [null, false, 0]
|
||||
tools.get_value_by_path(data, paths, ret_val)
|
||||
if ret_val[1]:
|
||||
values.append(ret_val[0])
|
||||
else:
|
||||
push_error('не найден путь для $%s.%s' % [item.name, value_name])
|
||||
|
||||
var target_value: int
|
||||
if values.size() == metas.size():
|
||||
target_value = 1 if values.count(true) == values.size() else 2
|
||||
else:
|
||||
target_value = value_init
|
||||
|
||||
_animate_property(item, value_name, target_value)
|
||||
|
||||
static func _animate_property(item, property: StringName, target_value):
|
||||
var current = item.get(property)
|
||||
if typeof(current) != typeof(target_value): return
|
||||
if current == target_value: return
|
||||
|
||||
# Исправление: преобразуем StringName в String для NodePath
|
||||
var tween = item.create_tween()
|
||||
tween.set_trans(Tween.TRANS_QUINT)
|
||||
tween.set_ease(Tween.EASE_OUT)
|
||||
tween.tween_property(item, NodePath(String(property)), target_value, 0.3)
|
||||
|
||||
@@ -29,6 +29,7 @@ func get_result_string(result: Result):
|
||||
|
||||
|
||||
func _on_request_timer():
|
||||
print('_on_request_timer: ', Time.get_ticks_msec())
|
||||
if HTTPClient.Status.STATUS_DISCONNECTED != get_http_client_status():
|
||||
return
|
||||
var rc: = request(request_url)
|
||||
|
||||
@@ -123,6 +123,15 @@ 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_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))
|
||||
scouting.serviceability_rtr_afsp_left.connect(on_serviceability_rtr.bind($pribor_afsp_1))
|
||||
scouting.serviceability_rtr_afsp_right.connect(on_serviceability_rtr.bind($pribor_afsp_2))
|
||||
scouting.serviceability_rtr_bpo.connect(on_serviceability_rtr.bind($pribor_rtr))
|
||||
|
||||
|
||||
func online_change_arr(_u, conn_node, pribor_meta):
|
||||
@@ -166,24 +175,17 @@ func on_pribor_press(pribor_path, header_text, pribor_node):
|
||||
pribor.add_to_group('pribor_items')
|
||||
add_child(pribor)
|
||||
update_pribor_items_visibility()
|
||||
if pribor_node.get_meta('unit_name')[0] == 'уарэп-афсп-левый' or pribor_node.get_meta('unit_name')[0] == 'уарэп-афсп-правый':
|
||||
pribor.node_request.connect('send_http_request', Callable(self, 'on_send_http_request').bind(pribor_node, pribor.node_request_timer.wait_time))
|
||||
pribor.connect('receive_response_afp_bpo', Callable(self, 'on_receive_response_afp_bpo').bind(pribor_node))
|
||||
if pribor_node.get_meta('unit_name')[0] == 'уарэп-бпо-1' or pribor_node.get_meta('unit_name')[0] == 'уарэп-бпо-2':
|
||||
pribor.node_request_1.connect('send_http_request', Callable(self, 'on_send_http_request').bind(pribor_node, pribor.node_request_timer_1.wait_time))
|
||||
pribor.connect('receive_response_afp_bpo', Callable(self, 'on_receive_response_afp_bpo').bind(pribor_node))
|
||||
#signal receive_response_afp_bpo
|
||||
|
||||
|
||||
# Вызов при отправке запроса на селфтест АФСП
|
||||
func on_send_http_request(node: Node, time_req: float) -> void:
|
||||
# Вызов при отправке запроса на селфтест АФСП и РТР
|
||||
func _on_request_sent_left(_url: String, node: Node) -> void:
|
||||
node.progress_max_value = 100
|
||||
node.progress_value = 0
|
||||
node.progress_visible = true
|
||||
node.timeout_tween = time_req
|
||||
node.timeout_tween = float(ProjectSettings.get_setting('application/config/%s' % 'Период опроса состояния АФСП, секунды'))
|
||||
|
||||
|
||||
func on_receive_response_afp_bpo(node: Node) -> void:
|
||||
func _on_response_received(_response: String, _success: bool, node: Node):
|
||||
node.progress_value = 100
|
||||
node.progress_visible = false
|
||||
|
||||
@@ -197,6 +199,10 @@ func on_update_uf_serviceability(uf_serviceaability: int, uf_pribor: Node) -> vo
|
||||
uf_pribor.state = uf_serviceaability
|
||||
|
||||
|
||||
func on_serviceability_rtr(state: int, node_rtr: Node)-> void:
|
||||
node_rtr.state = state
|
||||
|
||||
|
||||
func _on_chk_show_functional_toggled(toggled_on: bool) -> void:
|
||||
if cur_pribor_node:
|
||||
cur_pribor_node.show_functional = toggled_on
|
||||
|
||||
@@ -445,12 +445,11 @@ func _handle_fs_work_state() -> void:
|
||||
(current_litera == 6 and control_results.fs_6) or \
|
||||
(current_litera == 7 and control_results.fs_7) or \
|
||||
(current_litera == 1 and control_results.fs_1):
|
||||
if not block_kasseta_y5_config['yau07']:
|
||||
_set_status('Ожидание данных от ЯУ-07...')
|
||||
return # НЕ переходим дальше пока нет данных от сервиса МП550
|
||||
|
||||
if flags.only_fs:
|
||||
state = STATE_MACHINE.IN_EMS_STOP
|
||||
elif not block_kasseta_y5_config['yau07']:
|
||||
_set_status('Ожидание данных от МП550 сервиса...')
|
||||
return
|
||||
else:
|
||||
state = STATE_MACHINE.UG_SET_RAY_5 if current_litera == 1 else STATE_MACHINE.UG_SET_RAY_CTRL
|
||||
|
||||
@@ -470,7 +469,7 @@ func _handle_check_kasseta_state() -> void:
|
||||
_set_status('Перегрев УМ')
|
||||
state = STATE_MACHINE.IN_EMS_STOP
|
||||
else:
|
||||
flags.flag_only_fs = true
|
||||
flags.only_fs = true
|
||||
_set_status('Касета У5: ERROR, Проверка ФС.')
|
||||
state = STATE_MACHINE.FS_TURN_ON
|
||||
|
||||
@@ -554,8 +553,7 @@ func _handle_ray_read_mode() -> void:
|
||||
|
||||
## Обработка записи состояния луча
|
||||
func _handle_ray_write_mode(ray_num: int) -> void:
|
||||
if not _can_write_ray():
|
||||
return
|
||||
if not _can_write_ray(): return
|
||||
|
||||
if (ray_num == 6 or ray_num == 5) and not control_timer.is_stopped():
|
||||
control_timer.stop()
|
||||
@@ -1057,9 +1055,9 @@ static func check_block_kasseta_y5(status_prd: PackedByteArray, y5_config: Dicti
|
||||
y5_config.yau07 = not flag_not_trust
|
||||
if y5_config.yau07:
|
||||
y5_config.ems = (status_prd[0] & 1) and ((status_prd[0] >> 4) & 1)
|
||||
y5_config.ug = (status_prd[0] >> 1) & 1
|
||||
y5_config.ukp1 = (status_prd[0] >> 2) & 1
|
||||
y5_config.ukp2 = (status_prd[0] >> 3) & 1
|
||||
y5_config.ug = (status_prd[0] >> 1) & 1 != 0
|
||||
y5_config.ukp1 = (status_prd[0] >> 2) & 1 != 0
|
||||
y5_config.ukp2 = (status_prd[0] >> 3) & 1 != 0
|
||||
return y5_config
|
||||
|
||||
|
||||
|
||||
503
scripts/rtr.gd
Normal file
503
scripts/rtr.gd
Normal file
@@ -0,0 +1,503 @@
|
||||
class_name rtr
|
||||
extends Node
|
||||
|
||||
#region Перечисления
|
||||
enum State {
|
||||
IDLE,
|
||||
REQUESTING_AFSP_LEFT,
|
||||
REQUESTING_AFSP_RIGHT,
|
||||
REQUESTING_BPO_LEFT,
|
||||
REQUESTING_BPO_RIGHT,
|
||||
WAITING_TIMEOUT
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Сигналы
|
||||
# Сигналы отправки запроса
|
||||
signal request_sent_afsp_left(url: String)
|
||||
signal request_sent_afsp_right(url: String)
|
||||
signal request_sent_bpo_left(url: String)
|
||||
signal request_sent_bpo_right(url: String)
|
||||
|
||||
# Сигналы получения ответа
|
||||
signal response_received_afsp_left(response: String, success: bool)
|
||||
signal response_received_afsp_right(response: String, success: bool)
|
||||
signal response_received_bpo_left(response: String, success: bool)
|
||||
signal response_received_bpo_right(response: String, success: bool)
|
||||
|
||||
# Сигналы исправности (0 - нет связи, 1 - всё пройдено, 2 - есть ошибки)
|
||||
signal serviceability_rtr_afsp_left(state: int)
|
||||
signal serviceability_rtr_afsp_right(state: int)
|
||||
signal serviceability_rtr_bpo(state: int) # Общий для левого и правого БПО
|
||||
#endregion
|
||||
|
||||
#region Константы
|
||||
const RESULT_STRINGS = {
|
||||
HTTPRequest.Result.RESULT_SUCCESS: 'Запрос успешен',
|
||||
HTTPRequest.Result.RESULT_CHUNKED_BODY_SIZE_MISMATCH: 'Несоответствие размеров частей сообщения',
|
||||
HTTPRequest.Result.RESULT_CANT_CONNECT: 'Запрос не выполнен при подключении',
|
||||
HTTPRequest.Result.RESULT_CANT_RESOLVE: 'Запрос не выполнен при разрешении',
|
||||
HTTPRequest.Result.RESULT_CONNECTION_ERROR: 'Запрос не выполнен из-за ошибки соединения',
|
||||
HTTPRequest.Result.RESULT_TLS_HANDSHAKE_ERROR: 'Запрос не выполнен на TLS рукопожатии',
|
||||
HTTPRequest.Result.RESULT_NO_RESPONSE: 'Запрос не имеет ответа (пока)',
|
||||
HTTPRequest.Result.RESULT_BODY_SIZE_LIMIT_EXCEEDED: 'Запрос превысил максимальный размер',
|
||||
HTTPRequest.Result.RESULT_BODY_DECOMPRESS_FAILED: 'Не удалось распаковать сообщение',
|
||||
HTTPRequest.Result.RESULT_REQUEST_FAILED: 'Запрос не удался',
|
||||
HTTPRequest.Result.RESULT_DOWNLOAD_FILE_CANT_OPEN: 'Невозможно открыть файл загрузки',
|
||||
HTTPRequest.Result.RESULT_DOWNLOAD_FILE_WRITE_ERROR: 'Невозможно записать в файл загрузки',
|
||||
HTTPRequest.Result.RESULT_REDIRECT_LIMIT_REACHED: 'Достигнут лимит перенаправлений',
|
||||
HTTPRequest.Result.RESULT_TIMEOUT: 'Время истекло'
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Переменные
|
||||
var http_request: HTTPRequest
|
||||
var addresses: Dictionary
|
||||
var current_state: State = State.IDLE
|
||||
var current_url: String = ''
|
||||
var timeout_timer: Timer
|
||||
|
||||
# Результаты запросов АФСП
|
||||
var last_response_afsp_left: String = ''
|
||||
var last_response_afsp_right: String = ''
|
||||
var last_error_afsp_left: String = ''
|
||||
var last_error_afsp_right: String = ''
|
||||
|
||||
# Результаты запросов БПО
|
||||
var last_response_bpo_left: String = ''
|
||||
var last_response_bpo_right: String = ''
|
||||
var last_error_bpo_left: String = ''
|
||||
var last_error_bpo_right: String = ''
|
||||
|
||||
# Статус online для каждого борта
|
||||
var online_afsp_left: bool = false
|
||||
var online_afsp_right: bool = false
|
||||
var online_bpo_left: bool = false
|
||||
var online_bpo_right: bool = false
|
||||
|
||||
# Состояния исправности для БПО
|
||||
var bpo_left_state: int = 0 # 0 - нет связи, 1 - успешно, 2 - ошибка
|
||||
var bpo_right_state: int = 0
|
||||
|
||||
var last_success_time_afsp_left: int = 0
|
||||
var last_success_time_afsp_right: int = 0
|
||||
var last_success_time_bpo_left: int = 0
|
||||
var last_success_time_bpo_right: int = 0
|
||||
|
||||
var timeout: float
|
||||
var current_device_type: String = ''
|
||||
#endregion
|
||||
|
||||
#region Инициализация
|
||||
func _ready() -> void:
|
||||
http_request = HTTPRequest.new()
|
||||
add_child(http_request)
|
||||
http_request.request_completed.connect(_on_request_completed)
|
||||
|
||||
timeout_timer = Timer.new()
|
||||
add_child(timeout_timer)
|
||||
timeout_timer.timeout.connect(_on_timeout)
|
||||
timeout_timer.one_shot = true
|
||||
|
||||
signaller.conn(signaller.start_contol_device, Callable(self, '_on_start_contol_device'))
|
||||
#endregion
|
||||
|
||||
#region Публичные методы
|
||||
func get_result_string(result: int) -> String:
|
||||
return RESULT_STRINGS.get(result, '<неизвестный код результата HTTPRequest - %d>' % result)
|
||||
|
||||
# Геттеры АФСП
|
||||
func get_afsp_left_response() -> String:
|
||||
return last_response_afsp_left
|
||||
|
||||
func get_afsp_right_response() -> String:
|
||||
return last_response_afsp_right
|
||||
|
||||
func get_afsp_left_error() -> String:
|
||||
return last_error_afsp_left
|
||||
|
||||
func get_afsp_right_error() -> String:
|
||||
return last_error_afsp_right
|
||||
|
||||
func has_afsp_left_success() -> bool:
|
||||
return not last_response_afsp_left.is_empty()
|
||||
|
||||
func has_afsp_right_success() -> bool:
|
||||
return not last_response_afsp_right.is_empty()
|
||||
|
||||
func is_afsp_left_online() -> bool:
|
||||
return online_afsp_left
|
||||
|
||||
func is_afsp_right_online() -> bool:
|
||||
return online_afsp_right
|
||||
|
||||
# Геттеры БПО
|
||||
func get_bpo_left_response() -> String:
|
||||
return last_response_bpo_left
|
||||
|
||||
func get_bpo_right_response() -> String:
|
||||
return last_response_bpo_right
|
||||
|
||||
func get_bpo_left_error() -> String:
|
||||
return last_error_bpo_left
|
||||
|
||||
func get_bpo_right_error() -> String:
|
||||
return last_error_bpo_right
|
||||
|
||||
func has_bpo_left_success() -> bool:
|
||||
return not last_response_bpo_left.is_empty()
|
||||
|
||||
func has_bpo_right_success() -> bool:
|
||||
return not last_response_bpo_right.is_empty()
|
||||
|
||||
func is_bpo_left_online() -> bool:
|
||||
return online_bpo_left
|
||||
|
||||
func is_bpo_right_online() -> bool:
|
||||
return online_bpo_right
|
||||
|
||||
# Обновление статуса online
|
||||
func _update_online_status(device: String, side: String, is_online: bool) -> void:
|
||||
var unit_name = ''
|
||||
if device == 'afsp':
|
||||
unit_name = 'уарэп-афсп-' + ('левый' if side == 'left' else 'правый')
|
||||
else:
|
||||
unit_name = 'уарэп-бпо-' + ('1' if side == 'left' else '2')
|
||||
|
||||
var unit_instance = network.get_unit_instance(unit_name)
|
||||
if unit_instance:
|
||||
unit_instance.rx_tick = Time.get_ticks_msec()
|
||||
if unit_instance.online != is_online:
|
||||
unit_instance.online = is_online
|
||||
unit_instance.emit_signal('line_changed', unit_instance)
|
||||
#endregion
|
||||
|
||||
#region Обработчики сигналов
|
||||
func _on_start_contol_device() -> void:
|
||||
if current_state != State.IDLE:
|
||||
return
|
||||
|
||||
# Сбрасываем предыдущие результаты
|
||||
last_response_afsp_left = ''
|
||||
last_response_afsp_right = ''
|
||||
last_error_afsp_left = ''
|
||||
last_error_afsp_right = ''
|
||||
last_response_bpo_left = ''
|
||||
last_response_bpo_right = ''
|
||||
last_error_bpo_left = ''
|
||||
last_error_bpo_right = ''
|
||||
|
||||
bpo_left_state = 0
|
||||
bpo_right_state = 0
|
||||
|
||||
addresses['Адрес АФСП левого борта'] = ProjectSettings.get_setting('application/config/%s' % 'Адрес АФСП левого борта')
|
||||
addresses['Адрес АФСП правого борта'] = ProjectSettings.get_setting('application/config/%s' % 'Адрес АФСП правого борта')
|
||||
addresses['Адрес БПО левого борта'] = ProjectSettings.get_setting('application/config/%s' % 'Адрес БПО левого борта')
|
||||
addresses['Адрес БПО правого борта'] = ProjectSettings.get_setting('application/config/%s' % 'Адрес БПО правого борта')
|
||||
|
||||
timeout = float(ProjectSettings.get_setting('application/config/%s' % 'Период опроса состояния АФСП, секунды'))
|
||||
|
||||
# Начинаем с запроса к АФСП левого борта
|
||||
_request_next(State.REQUESTING_AFSP_LEFT)
|
||||
|
||||
func _on_request_completed(result: int, response_code: int, _headers: PackedStringArray, body: PackedByteArray) -> void:
|
||||
if current_state == State.WAITING_TIMEOUT:
|
||||
return
|
||||
|
||||
timeout_timer.stop()
|
||||
|
||||
var current_time = Time.get_ticks_msec()
|
||||
var is_afsp = (current_state == State.REQUESTING_AFSP_LEFT or current_state == State.REQUESTING_AFSP_RIGHT)
|
||||
var is_left = (current_state == State.REQUESTING_AFSP_LEFT or current_state == State.REQUESTING_BPO_LEFT)
|
||||
var side_str = 'left' if is_left else 'right'
|
||||
var device_str = 'afsp' if is_afsp else 'bpo'
|
||||
|
||||
if response_code == 200:
|
||||
var response_text = body.get_string_from_utf8()
|
||||
_save_response(response_text)
|
||||
|
||||
var test_passed_all = _check_all_tests_passed(response_text)
|
||||
|
||||
_update_success_time(device_str, side_str, current_time)
|
||||
_update_online_status(device_str, side_str, true)
|
||||
_emit_response_signal(device_str, side_str, response_text, true)
|
||||
|
||||
var serviceability_state = 1 if test_passed_all else 2
|
||||
|
||||
if is_afsp:
|
||||
_emit_afsp_serviceability_signal(side_str, serviceability_state)
|
||||
else:
|
||||
_update_bpo_state(side_str, serviceability_state)
|
||||
_emit_bpo_serviceability_signal()
|
||||
|
||||
_on_request_finished()
|
||||
else:
|
||||
var error_msg = 'HTTP ошибка %d: %s' % [response_code, get_result_string(result)]
|
||||
log.message(Logger.ERROR, error_msg)
|
||||
_save_error(error_msg)
|
||||
|
||||
_update_online_status(device_str, side_str, false)
|
||||
_emit_response_signal(device_str, side_str, error_msg, false)
|
||||
|
||||
if is_afsp:
|
||||
_emit_afsp_serviceability_signal(side_str, 0)
|
||||
else:
|
||||
_update_bpo_state(side_str, 0)
|
||||
_emit_bpo_serviceability_signal()
|
||||
|
||||
_on_request_finished()
|
||||
|
||||
func _update_bpo_state(side: String, state: int) -> void:
|
||||
if side == 'left':
|
||||
bpo_left_state = state
|
||||
else:
|
||||
bpo_right_state = state
|
||||
|
||||
func _calculate_bpo_combined_state() -> int:
|
||||
# Если оба не на связи -> 0
|
||||
if bpo_left_state == 0 and bpo_right_state == 0:
|
||||
return 0
|
||||
# Если хоть один с ошибкой -> 2
|
||||
if bpo_left_state == 2 or bpo_right_state == 2:
|
||||
return 2
|
||||
# Если один не на связи (0), а другой успешно (1) -> 1
|
||||
if (bpo_left_state == 0 and bpo_right_state == 1) or (bpo_left_state == 1 and bpo_right_state == 0):
|
||||
return 1
|
||||
# Оба успешно -> 1
|
||||
if bpo_left_state == 1 and bpo_right_state == 1:
|
||||
return 1
|
||||
# По умолчанию
|
||||
return 0
|
||||
|
||||
func _emit_bpo_serviceability_signal() -> void:
|
||||
var combined_state = _calculate_bpo_combined_state()
|
||||
emit_signal('serviceability_rtr_bpo', combined_state)
|
||||
|
||||
|
||||
func _state_to_string(state: int) -> String:
|
||||
match state:
|
||||
0: return 'нет связи'
|
||||
1: return 'успешно'
|
||||
2: return 'ошибка'
|
||||
return 'неизвестно'
|
||||
|
||||
func _emit_afsp_serviceability_signal(side: String, state: int) -> void:
|
||||
if side == 'left':
|
||||
emit_signal('serviceability_rtr_afsp_left', state)
|
||||
else:
|
||||
emit_signal('serviceability_rtr_afsp_right', state)
|
||||
|
||||
func _check_all_tests_passed(response_text: String) -> bool:
|
||||
var json = JSON.new()
|
||||
if json.parse(response_text) != OK:
|
||||
log.message(Logger.ERROR, '[rtr] Ошибка парсинга JSON')
|
||||
return false
|
||||
|
||||
var data = json.data
|
||||
var self_tests = data.get('SelfTest', [])
|
||||
|
||||
var all_passed = true
|
||||
|
||||
for test in self_tests:
|
||||
var system_list = test.get('SystemList', [])
|
||||
for system in system_list:
|
||||
# Рекурсивно проверяем систему и её подсистемы
|
||||
if not _check_system_passed(system):
|
||||
all_passed = false
|
||||
# Не прерываем цикл, чтобы найти все ошибки
|
||||
|
||||
return all_passed
|
||||
|
||||
# Рекурсивная функция для проверки SystemList и вывода ошибок
|
||||
func _check_system_passed(system: Dictionary) -> bool:
|
||||
var system_passed = true
|
||||
|
||||
# Проверяем устройства в текущей системе
|
||||
var dev_list = system.get('DevList', [])
|
||||
for dev in dev_list:
|
||||
var test_passed = dev.get('TestPassed', false)
|
||||
if not test_passed:
|
||||
system_passed = false
|
||||
# Формируем читаемое имя устройства для вывода
|
||||
var dev_name = dev.get('DevName', 'Неизвестное устройство')
|
||||
var dev_id = dev.get('DevId', '?')
|
||||
var error_text = dev.get('ErrorText', 'Нет описания ошибки')
|
||||
print_debug('[rtr] НАЙДЕНА ОШИБКА! Устройство: %s (ID: %s). TestPassed: false. Причина: %s' % [dev_name, dev_id, error_text])
|
||||
|
||||
# Рекурсивно проверяем вложенные подсистемы
|
||||
var sub_systems = system.get('SystemList', [])
|
||||
for sub in sub_systems:
|
||||
if not _check_system_passed(sub):
|
||||
system_passed = false
|
||||
|
||||
return system_passed
|
||||
|
||||
|
||||
# Исправленная функция подсчета (использует Dictionary для передачи по ссылке)
|
||||
func _count_tests_in_system(system: Dictionary, counters: Dictionary) -> void:
|
||||
var dev_list = system.get('DevList', [])
|
||||
for dev in dev_list:
|
||||
counters['total'] += 1
|
||||
if dev.get('TestPassed', false):
|
||||
counters['passed'] += 1
|
||||
|
||||
var sub_systems = system.get('SystemList', [])
|
||||
for sub in sub_systems:
|
||||
_count_tests_in_system(sub, counters)
|
||||
|
||||
func _on_timeout() -> void:
|
||||
var was_state = current_state
|
||||
current_state = State.WAITING_TIMEOUT
|
||||
http_request.cancel_request()
|
||||
|
||||
var is_afsp = (was_state == State.REQUESTING_AFSP_LEFT or was_state == State.REQUESTING_AFSP_RIGHT)
|
||||
var is_left = (was_state == State.REQUESTING_AFSP_LEFT or was_state == State.REQUESTING_BPO_LEFT)
|
||||
var side_str = 'left' if is_left else 'right'
|
||||
var device_str = 'afsp' if is_afsp else 'bpo'
|
||||
|
||||
var timeout_msg = 'Таймаут %.1f секунд - %s' % [timeout, get_result_string(HTTPRequest.Result.RESULT_TIMEOUT)]
|
||||
_save_error(timeout_msg)
|
||||
|
||||
_update_online_status(device_str, side_str, false)
|
||||
_emit_response_signal(device_str, side_str, timeout_msg, false)
|
||||
|
||||
if is_afsp:
|
||||
_emit_afsp_serviceability_signal(side_str, 0)
|
||||
else:
|
||||
_update_bpo_state(side_str, 0)
|
||||
_emit_bpo_serviceability_signal()
|
||||
|
||||
_on_request_finished()
|
||||
#endregion
|
||||
|
||||
#region Управление запросами
|
||||
func _request_next(next_state: State) -> void:
|
||||
current_state = next_state
|
||||
current_device_type = 'afsp' if (next_state == State.REQUESTING_AFSP_LEFT or next_state == State.REQUESTING_AFSP_RIGHT) else 'bpo'
|
||||
|
||||
match current_state:
|
||||
State.REQUESTING_AFSP_LEFT:
|
||||
current_url = addresses.get('Адрес АФСП левого борта', '')
|
||||
State.REQUESTING_AFSP_RIGHT:
|
||||
current_url = addresses.get('Адрес АФСП правого борта', '')
|
||||
State.REQUESTING_BPO_LEFT:
|
||||
current_url = addresses.get('Адрес БПО левого борта', '')
|
||||
State.REQUESTING_BPO_RIGHT:
|
||||
current_url = addresses.get('Адрес БПО правого борта', '')
|
||||
State.IDLE:
|
||||
return
|
||||
|
||||
if current_url.is_empty():
|
||||
push_error('URL не задан для ', current_state)
|
||||
var error_msg = 'URL не задан'
|
||||
_save_error(error_msg)
|
||||
|
||||
var is_afsp = (current_state == State.REQUESTING_AFSP_LEFT or current_state == State.REQUESTING_AFSP_RIGHT)
|
||||
var is_left = (current_state == State.REQUESTING_AFSP_LEFT or current_state == State.REQUESTING_BPO_LEFT)
|
||||
var side_str = 'left' if is_left else 'right'
|
||||
var device_str = 'afsp' if is_afsp else 'bpo'
|
||||
|
||||
_update_online_status(device_str, side_str, false)
|
||||
_emit_response_signal(device_str, side_str, error_msg, false)
|
||||
|
||||
if is_afsp:
|
||||
_emit_afsp_serviceability_signal(side_str, 0)
|
||||
else:
|
||||
_update_bpo_state(side_str, 0)
|
||||
_emit_bpo_serviceability_signal()
|
||||
|
||||
_on_request_finished()
|
||||
return
|
||||
|
||||
match current_state:
|
||||
State.REQUESTING_AFSP_LEFT:
|
||||
emit_signal('request_sent_afsp_left', current_url)
|
||||
State.REQUESTING_AFSP_RIGHT:
|
||||
emit_signal('request_sent_afsp_right', current_url)
|
||||
State.REQUESTING_BPO_LEFT:
|
||||
emit_signal('request_sent_bpo_left', current_url)
|
||||
State.REQUESTING_BPO_RIGHT:
|
||||
emit_signal('request_sent_bpo_right', current_url)
|
||||
|
||||
timeout_timer.start(timeout)
|
||||
var error = http_request.request(current_url)
|
||||
if error != OK:
|
||||
log.message(Logger.ERROR, 'Ошибка запроса: %s' & error)
|
||||
var error_msg = 'Ошибка запроса: ' + error_string(error)
|
||||
_save_error(error_msg)
|
||||
|
||||
var is_afsp = (current_state == State.REQUESTING_AFSP_LEFT or current_state == State.REQUESTING_AFSP_RIGHT)
|
||||
var is_left = (current_state == State.REQUESTING_AFSP_LEFT or current_state == State.REQUESTING_BPO_LEFT)
|
||||
var side_str = 'left' if is_left else 'right'
|
||||
var device_str = 'afsp' if is_afsp else 'bpo'
|
||||
|
||||
_update_online_status(device_str, side_str, false)
|
||||
_emit_response_signal(device_str, side_str, error_msg, false)
|
||||
|
||||
if is_afsp:
|
||||
_emit_afsp_serviceability_signal(side_str, 0)
|
||||
else:
|
||||
_update_bpo_state(side_str, 0)
|
||||
_emit_bpo_serviceability_signal()
|
||||
|
||||
_on_request_finished()
|
||||
|
||||
func _on_request_finished() -> void:
|
||||
match current_state:
|
||||
State.REQUESTING_AFSP_LEFT:
|
||||
_request_next(State.REQUESTING_AFSP_RIGHT)
|
||||
State.REQUESTING_AFSP_RIGHT:
|
||||
_request_next(State.REQUESTING_BPO_LEFT)
|
||||
State.REQUESTING_BPO_LEFT:
|
||||
_request_next(State.REQUESTING_BPO_RIGHT)
|
||||
State.REQUESTING_BPO_RIGHT, State.WAITING_TIMEOUT:
|
||||
current_state = State.IDLE
|
||||
#endregion
|
||||
|
||||
#region Сохранение результатов
|
||||
func _save_response(response: String) -> void:
|
||||
match current_state:
|
||||
State.REQUESTING_AFSP_LEFT:
|
||||
last_response_afsp_left = response
|
||||
State.REQUESTING_AFSP_RIGHT:
|
||||
last_response_afsp_right = response
|
||||
State.REQUESTING_BPO_LEFT:
|
||||
last_response_bpo_left = response
|
||||
State.REQUESTING_BPO_RIGHT:
|
||||
last_response_bpo_right = response
|
||||
|
||||
func _save_error(error: String) -> void:
|
||||
match current_state:
|
||||
State.REQUESTING_AFSP_LEFT:
|
||||
last_error_afsp_left = error
|
||||
State.REQUESTING_AFSP_RIGHT:
|
||||
last_error_afsp_right = error
|
||||
State.REQUESTING_BPO_LEFT:
|
||||
last_error_bpo_left = error
|
||||
State.REQUESTING_BPO_RIGHT:
|
||||
last_error_bpo_right = error
|
||||
|
||||
func _update_success_time(device: String, side: String, time: int) -> void:
|
||||
if device == 'afsp':
|
||||
if side == 'left':
|
||||
last_success_time_afsp_left = time
|
||||
else:
|
||||
last_success_time_afsp_right = time
|
||||
else:
|
||||
if side == 'left':
|
||||
last_success_time_bpo_left = time
|
||||
else:
|
||||
last_success_time_bpo_right = time
|
||||
|
||||
func _emit_response_signal(device: String, side: String, response: String, success: bool) -> void:
|
||||
if device == 'afsp':
|
||||
if side == 'left':
|
||||
emit_signal('response_received_afsp_left', response, success)
|
||||
else:
|
||||
emit_signal('response_received_afsp_right', response, success)
|
||||
else:
|
||||
if side == 'left':
|
||||
emit_signal('response_received_bpo_left', response, success)
|
||||
else:
|
||||
emit_signal('response_received_bpo_right', response, success)
|
||||
#endregion
|
||||
1
scripts/rtr.gd.uid
Normal file
1
scripts/rtr.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://ctqcvjqjb1av3
|
||||
Reference in New Issue
Block a user