From ec21282ba01e49273e696d7797844d86df61b27e Mon Sep 17 00:00:00 2001 From: TotMaxim Date: Sun, 5 Apr 2026 16:29:57 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=BD=D0=B4=D0=B8=D0=BA=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B0=20=D0=BE=D0=BD=D0=BB=D0=B0=D0=B9=D0=BD=20?= =?UTF-8?q?=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-afsp/pribor-afsp.gd | 17 +---- scripts/rtr.gd | 109 +++++++++++++++++++++--------- 2 files changed, 78 insertions(+), 48 deletions(-) diff --git a/scenes/pribor-afsp/pribor-afsp.gd b/scenes/pribor-afsp/pribor-afsp.gd index fde8c96b..ae0e565a 100644 --- a/scenes/pribor-afsp/pribor-afsp.gd +++ b/scenes/pribor-afsp/pribor-afsp.gd @@ -29,11 +29,7 @@ func _on_response_received(response: String, success: bool) -> void: var unit_instance = network.get_unit_instance(unit_name) if not success: - log.error('Ошибка запроса: %s' % response) - if unit_instance.online: - unit_instance.online = false - unit_instance.emit_signal('line_changed', unit_instance) - # При ошибке сбрасываем UI в 0 + log.error('Ошибка запроса или нет связи: %s' % response) _reset_ui_to_zero() return @@ -42,10 +38,6 @@ func _on_response_received(response: String, success: bool) -> void: if parse_result != OK: var err = json_conv.get_error_message() push_error('разбор json прерван - "%s"' % err) - if unit_instance.online: - unit_instance.online = false - unit_instance.emit_signal('line_changed', unit_instance) - # При ошибке парсинга сбрасываем UI в 0 _reset_ui_to_zero() return @@ -58,7 +50,6 @@ func _on_response_received(response: String, success: bool) -> void: if not ret_val[1]: push_error('путь %s не найден (%s)' % [pp_copy, ret_val[2]]) - # Если путь не найден, сбрасываем UI в 0 _reset_ui_to_zero() return @@ -69,12 +60,6 @@ func _on_response_received(response: String, success: bool) -> void: # Ответ от другого борта - игнорируем return - # Обновляем статус online - 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 элементы из JSON _update_ui(json_conv.data) diff --git a/scripts/rtr.gd b/scripts/rtr.gd index a66be793..a8b95894 100644 --- a/scripts/rtr.gd +++ b/scripts/rtr.gd @@ -13,6 +13,7 @@ signal request_sent_right(url: String) # Отправлен запрос к # Сигналы получения ответа signal response_received_left(response: String, success: bool) # Получен ответ от левого борта signal response_received_right(response: String, success: bool) # Получен ответ от правого борта + #endregion #region Константы @@ -48,6 +49,14 @@ var last_response_right: String = '' # Последний успешный от var last_error_left: String = '' # Последняя ошибка левого борта var last_error_right: String = '' # Последняя ошибка правого борта +# Статус online для каждого борта +var online_left: bool = false +var online_right: bool = false + +# Время последнего успешного ответа +var last_success_time_left: int = 0 +var last_success_time_right: int = 0 + var timeout: float #endregion @@ -59,11 +68,10 @@ func _ready() -> void: 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 # Таймер срабатывает только один раз + timeout_timer.one_shot = true # Подписываемся на сигнал запуска управления устройством signaller.conn(signaller.start_contol_device, Callable(self, '_on_start_contol_device')) @@ -93,6 +101,28 @@ func has_left_success() -> bool: func has_right_success() -> bool: return not last_response_right.is_empty() + +# Геттеры для статуса online +func is_left_online() -> bool: + return online_left + +func is_right_online() -> bool: + return online_right + +# Обновление статуса online +func _update_online_status(side: String, is_online: bool) -> void: + var unit_instance + + # Выбираем нужный экземпляр в зависимости от борта + if side == "left": + unit_instance = network.get_unit_instance('уарэп-афсп-левый') + else: # side == "right" + unit_instance = network.get_unit_instance('уарэп-афсп-правый') + + # Обновляем статус если изменился + if unit_instance and unit_instance.online != is_online: + unit_instance.online = is_online + unit_instance.emit_signal('line_changed', unit_instance) #endregion #region Обработчики сигналов @@ -124,45 +154,55 @@ func _on_request_completed(result: int, response_code: int, _headers: PackedStri # Останавливаем таймер ожидания timeout_timer.stop() + var is_left = (current_state == State.REQUESTING_LEFT) + var current_time = Time.get_ticks_msec() + # Проверяем успешность ответа if response_code == 200: var response_text = body.get_string_from_utf8() _save_response(response_text) - # Испускаем сигнал успешного получения ответа - match current_state: - State.REQUESTING_LEFT: - emit_signal('response_received_left', response_text, true) - State.REQUESTING_RIGHT: - emit_signal('response_received_right', response_text, true) + # Обновляем статус online + if is_left: + last_success_time_left = current_time + _update_online_status("left", true) + emit_signal('response_received_left', response_text, true) + else: + last_success_time_right = current_time + _update_online_status("right", true) + emit_signal('response_received_right', response_text, true) _on_request_finished() else: var error_msg = 'HTTP ошибка %d: %s' % [response_code, get_result_string(result)] _save_error(error_msg) - # Испускаем сигнал с ошибкой - match current_state: - State.REQUESTING_LEFT: - emit_signal('response_received_left', error_msg, false) - State.REQUESTING_RIGHT: - emit_signal('response_received_right', error_msg, false) + # Обновляем статус online (ошибка) + if is_left: + _update_online_status("left", false) + emit_signal('response_received_left', error_msg, false) + else: + _update_online_status("right", false) + emit_signal('response_received_right', error_msg, false) _on_request_finished() # Сигнал от таймера - истекло время ожидания ответа func _on_timeout() -> void: current_state = State.WAITING_TIMEOUT - http_request.cancel_request() # Отменяем текущий запрос + http_request.cancel_request() var timeout_msg = 'Таймаут %.1f секунд - %s' % [timeout, get_result_string(HTTPRequest.Result.RESULT_TIMEOUT)] _save_error(timeout_msg) - # Испускаем сигнал с ошибкой таймаута - match current_state: - State.REQUESTING_LEFT: - emit_signal('response_received_left', timeout_msg, false) - State.REQUESTING_RIGHT: - emit_signal('response_received_right', timeout_msg, false) + var is_left = (current_state == State.REQUESTING_LEFT) + + # Обновляем статус online (таймаут = offline) + if is_left: + _update_online_status("left", false) + emit_signal('response_received_left', timeout_msg, false) + else: + _update_online_status("right", false) + emit_signal('response_received_right', timeout_msg, false) _on_request_finished() #endregion @@ -187,12 +227,15 @@ func _request_next(next_state: State) -> void: var error_msg = 'URL не задан' _save_error(error_msg) + var is_left = (current_state == State.REQUESTING_LEFT) + # Испускаем сигнал с ошибкой - match current_state: - State.REQUESTING_LEFT: - emit_signal('response_received_left', error_msg, false) - State.REQUESTING_RIGHT: - emit_signal('response_received_right', error_msg, false) + if is_left: + _update_online_status("left", false) + emit_signal('response_received_left', error_msg, false) + else: + _update_online_status("right", false) + emit_signal('response_received_right', error_msg, false) _on_request_finished() return @@ -212,12 +255,15 @@ func _request_next(next_state: State) -> void: var error_msg = 'Ошибка запроса: ' + error_string(error) _save_error(error_msg) + var is_left = (current_state == State.REQUESTING_LEFT) + # Испускаем сигнал с ошибкой - match current_state: - State.REQUESTING_LEFT: - emit_signal('response_received_left', error_msg, false) - State.REQUESTING_RIGHT: - emit_signal('response_received_right', error_msg, false) + if is_left: + _update_online_status("left", false) + emit_signal('response_received_left', error_msg, false) + else: + _update_online_status("right", false) + emit_signal('response_received_right', error_msg, false) _on_request_finished() @@ -230,7 +276,6 @@ func _on_request_finished() -> void: State.REQUESTING_RIGHT, State.WAITING_TIMEOUT: # После правого борта или таймаута возвращаемся в IDLE current_state = State.IDLE - print('Цикл запросов завершен') #endregion #region Сохранение результатов