This commit is contained in:
170
scripts/rtr.gd
170
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:
|
||||
|
||||
Reference in New Issue
Block a user