From 1633a45c9bae46158e3585d89192d04a9c37ad52 Mon Sep 17 00:00:00 2001
From: TotMaxim
Date: Thu, 9 Apr 2026 14:24:05 +0300
Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?=
=?UTF-8?q?=D0=BA=D0=B0=20=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81=D0=B0=20?=
=?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D1=8F=20=D0=A0=D0=A2?=
=?UTF-8?q?=D0=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
scenes/контроль/контроль.tscn | 9 +-
scripts/rtr.gd | 170 +++++++++++++++++++++++++++++-----
2 files changed, 152 insertions(+), 27 deletions(-)
diff --git a/scenes/контроль/контроль.tscn b/scenes/контроль/контроль.tscn
index 11944fa8..fedeb937 100644
--- a/scenes/контроль/контроль.tscn
+++ b/scenes/контроль/контроль.tscn
@@ -129,8 +129,9 @@ func _ready():
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):
@@ -198,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
diff --git a/scripts/rtr.gd b/scripts/rtr.gd
index 5f7e18f2..a38ef061 100644
--- a/scripts/rtr.gd
+++ b/scripts/rtr.gd
@@ -25,6 +25,10 @@ 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 Константы
@@ -71,14 +75,17 @@ 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 = '' # 'afsp' или 'bpo'
+var current_device_type: String = ''
#endregion
#region Инициализация
@@ -154,7 +161,7 @@ func _update_online_status(device: String, side: String, is_online: bool) -> voi
var unit_name = ''
if device == 'afsp':
unit_name = 'уарэп-афсп-' + ('левый' if side == 'left' else 'правый')
- else: # bpo
+ else:
unit_name = 'уарэп-бпо-' + ('1' if side == 'left' else '2')
var unit_instance = network.get_unit_instance(unit_name)
@@ -180,7 +187,9 @@ func _on_start_contol_device() -> void:
last_error_bpo_left = ''
last_error_bpo_right = ''
- # Загружаем URL адреса из ProjectSettings
+ 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' % 'Адрес БПО левого борта')
@@ -194,7 +203,7 @@ func _on_start_contol_device() -> void:
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()
@@ -207,29 +216,20 @@ func _on_request_completed(result: int, response_code: int, _headers: PackedStri
var response_text = body.get_string_from_utf8()
_save_response(response_text)
- # Быстрый подсчёт только для АФСП
- if is_afsp:
- var json = JSON.new()
- if json.parse(response_text) == OK:
- var data = json.data
- var self_tests = data.get('SelfTest', [])
- var total = 0
- var passed = 0
- for test in self_tests:
- for system in test.get('SystemList', []):
- for dev in system.get('DevList', []):
- total += 1
- if dev.get('TestPassed', false):
- passed += 1
- print('[rtr] Ответ от АФСП %s: %d/%d тестов пройдено' % ['левого' if is_left else 'правого', passed, total])
- else:
- print('[rtr] Ответ от БПО %s получен успешно' % ['левого' if is_left else 'правого'])
+ var test_passed_all = _check_all_tests_passed(response_text)
- # Обновляем статус online и время
_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)]
@@ -239,8 +239,112 @@ func _on_request_completed(result: int, response_code: int, _headers: PackedStri
_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:
+ print('[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('[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
@@ -257,6 +361,12 @@ func _on_timeout() -> void:
_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
@@ -265,7 +375,6 @@ 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'
- # Определяем URL для текущего состояния
match current_state:
State.REQUESTING_AFSP_LEFT:
current_url = addresses.get('Адрес АФСП левого борта', '')
@@ -291,10 +400,15 @@ func _request_next(next_state: State) -> void:
_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)
@@ -320,6 +434,12 @@ func _request_next(next_state: State) -> void:
_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: