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: