From 5032115b5d483c896b5071b7c94fcf94ae2a6e19 Mon Sep 17 00:00:00 2001
From: TotMaxim
Date: Thu, 9 Apr 2026 18:28:23 +0300
Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?=
=?UTF-8?q?=D0=BD=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82?=
=?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20=D0=A0?=
=?UTF-8?q?=D0=A2=D0=A0=20=D0=B2=20=D0=BF=D0=B0=D0=BD=D0=B5=D0=BB=D1=8C=20?=
=?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BD=D0=BE=D1=81=D1=82?=
=?UTF-8?q?=D0=B8=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BB=D0=B5=D0=BA=D1=81=D0=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
scenes/tabs-switch/lbl_ready.gd | 216 ++++++++++++++++++++++++++++++--
1 file changed, 204 insertions(+), 12 deletions(-)
diff --git a/scenes/tabs-switch/lbl_ready.gd b/scenes/tabs-switch/lbl_ready.gd
index f74b12d2..ceb65961 100644
--- a/scenes/tabs-switch/lbl_ready.gd
+++ b/scenes/tabs-switch/lbl_ready.gd
@@ -12,6 +12,13 @@ enum DEVICE_STATUS {
CONTROL # Контроль завершен
}
+# Состояния сервиса для RTR устройств
+enum RTR_SERVICEABILITY {
+ NO_CONNECTION = 0, # Нет связи
+ PASSED = 1, # Все тесты пройдены
+ ERROR = 2 # Есть ошибки
+}
+
const STATUS_CONFIG := {
DEVICE_STATE.NONE: {'text': 'Нет связи', 'color': Color.WHITE, 'font_color': Color.BLACK},
DEVICE_STATE.GOOD: {'text': 'Исправно', 'color': Color.GREEN, 'font_color': Color.BLACK},
@@ -22,6 +29,9 @@ class DeviceObserver:
var device_name: String
var status: Array = [false, false, false] # [online, operational, control_complete]
var last_results: Dictionary = {}
+
+ # Для RTR устройств
+ var rtr_serviceability: int = RTR_SERVICEABILITY.NO_CONNECTION
func update_online_state(online: bool) -> bool:
if status[DEVICE_STATUS.ONLINE] != online:
@@ -55,11 +65,28 @@ class DeviceObserver:
status[DEVICE_STATUS.CONTROL] = false
changed = true
return changed
+
+ func update_rtr_serviceability(state: int) -> bool:
+ if rtr_serviceability != state:
+ rtr_serviceability = state
+ # Обновляем operational статус на основе RTR
+ var new_operational = (state == RTR_SERVICEABILITY.PASSED)
+ if status[DEVICE_STATUS.STATUS] != new_operational:
+ status[DEVICE_STATUS.STATUS] = new_operational
+ return true
+ return false
var device_observers: Dictionary = {}
var overall_prd_state: DEVICE_STATE = DEVICE_STATE.NONE
var status_uf: int = DEVICE_STATE.NONE # Статус УФ (УАРЭП-ЭМС)
+# Добавляем наблюдателей для RTR устройств
+var rtr_device_names := [
+ 'rtr_afsp_left',
+ 'rtr_afsp_right',
+ 'rtr_bpo' # Общий для левого и правого БПО
+]
+
func _ready() -> void:
tooltip_text = 'Нет связи с приборами комплекса'
add_theme_color_override('font_color', Color.BLACK)
@@ -78,11 +105,20 @@ func _ready() -> void:
# Подписка на УФ
signaller.connect('update_uf_serviceability', _on_uf_status_receive)
+
+ # Подписка на сигналы RTR (через signaller или напрямую)
+ _connect_rtr_signals()
# Инициализация начального состояния
_recalculate_overall_state()
+func _connect_rtr_signals() -> void:
+ scouting.connect('serviceability_rtr_afsp_left', Callable(self, '_on_rtr_afsp_left_serviceability'))
+ scouting.connect('serviceability_rtr_afsp_right', Callable(self, '_on_rtr_afsp_right_serviceability'))
+ scouting.connect('serviceability_rtr_bpo', Callable(self, '_on_rtr_bpo_serviceability'))
+
+
func _initialize_observers() -> void:
var device_names := [
'уарэп-яу07-1н', 'уарэп-яу07-1в', 'уарэп-яу07-1к',
@@ -94,6 +130,69 @@ func _initialize_observers() -> void:
for device_name in device_names:
device_observers[device_name] = DeviceObserver.new()
device_observers[device_name].device_name = device_name
+
+ # Инициализируем наблюдателей для RTR устройств
+ for rtr_name in rtr_device_names:
+ device_observers[rtr_name] = DeviceObserver.new()
+ device_observers[rtr_name].device_name = rtr_name
+
+
+# Обработчики сигналов RTR
+func _on_rtr_afsp_left_serviceability(state: int) -> void:
+ var observer: DeviceObserver = device_observers.get('rtr_afsp_left')
+ if not observer:
+ return
+
+ var changed = false
+ if observer.update_rtr_serviceability(state):
+ changed = true
+
+ var is_online = (state != RTR_SERVICEABILITY.NO_CONNECTION)
+ if observer.update_online_state(is_online):
+ changed = true
+
+ if changed:
+ _recalculate_overall_state()
+ else:
+ _update_display()
+
+
+func _on_rtr_afsp_right_serviceability(state: int) -> void:
+ var observer: DeviceObserver = device_observers.get('rtr_afsp_right')
+ if not observer:
+ return
+
+ var changed = false
+ if observer.update_rtr_serviceability(state):
+ changed = true
+
+ var is_online = (state != RTR_SERVICEABILITY.NO_CONNECTION)
+ if observer.update_online_state(is_online):
+ changed = true
+
+ if changed:
+ _recalculate_overall_state()
+ else:
+ _update_display()
+
+
+func _on_rtr_bpo_serviceability(state: int) -> void:
+ var observer: DeviceObserver = device_observers.get('rtr_bpo')
+ if not observer:
+ return
+
+ var changed = false
+ if observer.update_rtr_serviceability(state):
+ changed = true
+
+ var is_online = (state != RTR_SERVICEABILITY.NO_CONNECTION)
+ if observer.update_online_state(is_online):
+ changed = true
+
+ if changed:
+ _recalculate_overall_state()
+ else:
+ _update_display()
func _on_prd_online_changed(line_status: Object, prd_module: Object) -> void:
@@ -123,7 +222,12 @@ func _recalculate_overall_state() -> void:
var has_online_prd := false
var all_prd_operational := true
- for observer in device_observers.values():
+ for observer_key in device_observers.keys():
+ # Пропускаем RTR устройства при подсчете ПРД
+ if observer_key.begins_with('rtr_'):
+ continue
+
+ var observer = device_observers[observer_key]
if observer.status[DEVICE_STATUS.ONLINE]:
has_online_prd = true
@@ -142,15 +246,35 @@ func _recalculate_overall_state() -> void:
prd_state = DEVICE_STATE.ERR
else:
prd_state = DEVICE_STATE.NONE
+
+ # Проверяем статус RTR устройств
+ var rtr_state := DEVICE_STATE.NONE
+ var has_online_rtr := false
+ var all_rtr_operational := true
+
+ for rtr_name in rtr_device_names:
+ var observer = device_observers.get(rtr_name)
+ if observer and observer.status[DEVICE_STATUS.ONLINE]:
+ has_online_rtr = true
+ if not observer.status[DEVICE_STATUS.STATUS]:
+ all_rtr_operational = false
+
+ if has_online_rtr:
+ if all_rtr_operational:
+ rtr_state = DEVICE_STATE.GOOD
+ else:
+ rtr_state = DEVICE_STATE.ERR
+ else:
+ rtr_state = DEVICE_STATE.NONE
# Комбинируем статусы по правилу:
# 1. Если хоть один ERROR → ERROR
# 2. Если нет ERROR и хоть один GOOD → GOOD
# 3. Иначе → NONE
- if prd_state == DEVICE_STATE.ERR or status_uf == DEVICE_STATE.ERR:
+ if prd_state == DEVICE_STATE.ERR or status_uf == DEVICE_STATE.ERR or rtr_state == DEVICE_STATE.ERR:
new_state = DEVICE_STATE.ERR
- elif prd_state == DEVICE_STATE.GOOD or status_uf == DEVICE_STATE.GOOD:
+ elif prd_state == DEVICE_STATE.GOOD or status_uf == DEVICE_STATE.GOOD or rtr_state == DEVICE_STATE.GOOD:
new_state = DEVICE_STATE.GOOD
else:
new_state = DEVICE_STATE.NONE
@@ -174,6 +298,7 @@ func _get_tooltip_text() -> String:
# Получаем статистику по ПРД
var prd_summary = _get_prd_summary()
var uf_status_str = _get_uf_status_text()
+ var rtr_summary = _get_rtr_summary()
match overall_prd_state:
DEVICE_STATE.NONE:
@@ -185,6 +310,7 @@ func _get_tooltip_text() -> String:
tooltip += '\n\nСтатус ПРД систем: ' + prd_summary
tooltip += '\nСтатус УФ: ' + uf_status_str
+ tooltip += '\nСтатус RTR: ' + rtr_summary
# Детализация по источникам статуса
tooltip += '\n\nСостояние систем:'
@@ -192,7 +318,10 @@ func _get_tooltip_text() -> String:
# ПРД системы
var prd_ok_count = 0
var prd_total = 0
- for observer in device_observers.values():
+ for observer_key in device_observers.keys():
+ if observer_key.begins_with('rtr_'):
+ continue
+ var observer = device_observers[observer_key]
if observer.status[DEVICE_STATUS.ONLINE]:
prd_total += 1
if observer.status[DEVICE_STATUS.STATUS]:
@@ -202,15 +331,67 @@ func _get_tooltip_text() -> String:
# УФ система
tooltip += '\nУФ: ' + _get_uf_status_text()
-
+
+ # RTR системы
+ tooltip += '\nRTR:'
+ for rtr_name in rtr_device_names:
+ var observer = device_observers.get(rtr_name)
+ if observer:
+ var status_text = _get_rtr_status_text(observer.rtr_serviceability)
+ var display_name = _get_rtr_display_name(rtr_name)
+ tooltip += '\n - %s: %s' % [display_name, status_text]
return tooltip
+func _get_rtr_summary() -> String:
+ var online_count := 0
+ var operational_count := 0
+
+ for rtr_name in rtr_device_names:
+ var observer = device_observers.get(rtr_name)
+ if observer and observer.status[DEVICE_STATUS.ONLINE]:
+ online_count += 1
+ if observer.status[DEVICE_STATUS.STATUS]:
+ operational_count += 1
+
+ if online_count == 0:
+ return 'Нет связи'
+ else:
+ return '%d/%d исправно' % [operational_count, online_count]
+
+
+func _get_rtr_status_text(state: int) -> String:
+ match state:
+ RTR_SERVICEABILITY.NO_CONNECTION:
+ return 'Нет связи'
+ RTR_SERVICEABILITY.PASSED:
+ return 'Исправен'
+ RTR_SERVICEABILITY.ERROR:
+ return 'Ошибка'
+ _:
+ return 'Неизвестно'
+
+
+func _get_rtr_display_name(rtr_key: String) -> String:
+ match rtr_key:
+ 'rtr_afsp_left':
+ return 'АФСП Л'
+ 'rtr_afsp_right':
+ return 'АФСП П'
+ 'rtr_bpo':
+ return 'РТР'
+ _:
+ return rtr_key.replace('rtr_', '')
+
+
func _get_prd_summary() -> String:
var online_count := 0
var operational_count := 0
- for observer in device_observers.values():
+ for observer_key in device_observers.keys():
+ if observer_key.begins_with('rtr_'):
+ continue
+ var observer = device_observers[observer_key]
if observer.status[DEVICE_STATUS.ONLINE]:
online_count += 1
if observer.status[DEVICE_STATUS.STATUS]:
@@ -235,14 +416,20 @@ func _get_uf_status_text() -> String:
func _has_prd_errors() -> bool:
- for observer in device_observers.values():
+ for observer_key in device_observers.keys():
+ if observer_key.begins_with('rtr_'):
+ continue
+ var observer = device_observers[observer_key]
if observer.status[DEVICE_STATUS.ONLINE] and not observer.status[DEVICE_STATUS.STATUS]:
return true
return false
func _has_operational_prd() -> bool:
- for observer in device_observers.values():
+ for observer_key in device_observers.keys():
+ if observer_key.begins_with('rtr_'):
+ continue
+ var observer = device_observers[observer_key]
if observer.status[DEVICE_STATUS.ONLINE] and observer.status[DEVICE_STATUS.STATUS]:
return true
return false
@@ -257,7 +444,8 @@ func get_device_status(device_name: String) -> Dictionary:
'operational': observer.status[DEVICE_STATUS.STATUS],
'control_complete': observer.status[DEVICE_STATUS.CONTROL],
'last_results': observer.last_results.duplicate(),
- 'status_uf': status_uf
+ 'status_uf': status_uf,
+ 'rtr_serviceability': observer.rtr_serviceability if device_name.begins_with('rtr_') else -1
}
return {}
@@ -267,7 +455,10 @@ func get_overall_status() -> Dictionary:
var operational_count := 0
var control_complete_count := 0
- for observer in device_observers.values():
+ for observer_key in device_observers.keys():
+ if observer_key.begins_with('rtr_'):
+ continue
+ var observer = device_observers[observer_key]
if observer.status[DEVICE_STATUS.ONLINE]:
online_count += 1
if observer.status[DEVICE_STATUS.STATUS]:
@@ -279,7 +470,8 @@ func get_overall_status() -> Dictionary:
'overall_state': overall_prd_state,
'online_devices': online_count,
'operational_devices': operational_count,
- 'total_devices': device_observers.size(),
+ 'total_devices': device_observers.size() - len(rtr_device_names), # Исключаем RTR
'control_complete_devices': control_complete_count,
- 'uf_status': status_uf
+ 'uf_status': status_uf,
+ 'rtr_status': _get_rtr_summary()
}