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() }