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 Сохранение результатов