Добавлен результат проверки РТР в панель исправности комплекса
Some checks failed
Локальный тест / test (push) Has been cancelled
Some checks failed
Локальный тест / test (push) Has been cancelled
This commit is contained in:
@@ -12,6 +12,13 @@ enum DEVICE_STATUS {
|
|||||||
CONTROL # Контроль завершен
|
CONTROL # Контроль завершен
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Состояния сервиса для RTR устройств
|
||||||
|
enum RTR_SERVICEABILITY {
|
||||||
|
NO_CONNECTION = 0, # Нет связи
|
||||||
|
PASSED = 1, # Все тесты пройдены
|
||||||
|
ERROR = 2 # Есть ошибки
|
||||||
|
}
|
||||||
|
|
||||||
const STATUS_CONFIG := {
|
const STATUS_CONFIG := {
|
||||||
DEVICE_STATE.NONE: {'text': 'Нет связи', 'color': Color.WHITE, 'font_color': Color.BLACK},
|
DEVICE_STATE.NONE: {'text': 'Нет связи', 'color': Color.WHITE, 'font_color': Color.BLACK},
|
||||||
DEVICE_STATE.GOOD: {'text': 'Исправно', 'color': Color.GREEN, '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 device_name: String
|
||||||
var status: Array = [false, false, false] # [online, operational, control_complete]
|
var status: Array = [false, false, false] # [online, operational, control_complete]
|
||||||
var last_results: Dictionary = {}
|
var last_results: Dictionary = {}
|
||||||
|
|
||||||
|
# Для RTR устройств
|
||||||
|
var rtr_serviceability: int = RTR_SERVICEABILITY.NO_CONNECTION
|
||||||
|
|
||||||
func update_online_state(online: bool) -> bool:
|
func update_online_state(online: bool) -> bool:
|
||||||
if status[DEVICE_STATUS.ONLINE] != online:
|
if status[DEVICE_STATUS.ONLINE] != online:
|
||||||
@@ -55,11 +65,28 @@ class DeviceObserver:
|
|||||||
status[DEVICE_STATUS.CONTROL] = false
|
status[DEVICE_STATUS.CONTROL] = false
|
||||||
changed = true
|
changed = true
|
||||||
return changed
|
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 device_observers: Dictionary = {}
|
||||||
var overall_prd_state: DEVICE_STATE = DEVICE_STATE.NONE
|
var overall_prd_state: DEVICE_STATE = DEVICE_STATE.NONE
|
||||||
var status_uf: int = 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:
|
func _ready() -> void:
|
||||||
tooltip_text = 'Нет связи с приборами комплекса'
|
tooltip_text = 'Нет связи с приборами комплекса'
|
||||||
add_theme_color_override('font_color', Color.BLACK)
|
add_theme_color_override('font_color', Color.BLACK)
|
||||||
@@ -78,11 +105,20 @@ func _ready() -> void:
|
|||||||
|
|
||||||
# Подписка на УФ
|
# Подписка на УФ
|
||||||
signaller.connect('update_uf_serviceability', _on_uf_status_receive)
|
signaller.connect('update_uf_serviceability', _on_uf_status_receive)
|
||||||
|
|
||||||
|
# Подписка на сигналы RTR (через signaller или напрямую)
|
||||||
|
_connect_rtr_signals()
|
||||||
|
|
||||||
# Инициализация начального состояния
|
# Инициализация начального состояния
|
||||||
_recalculate_overall_state()
|
_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:
|
func _initialize_observers() -> void:
|
||||||
var device_names := [
|
var device_names := [
|
||||||
'уарэп-яу07-1н', 'уарэп-яу07-1в', 'уарэп-яу07-1к',
|
'уарэп-яу07-1н', 'уарэп-яу07-1в', 'уарэп-яу07-1к',
|
||||||
@@ -94,6 +130,69 @@ func _initialize_observers() -> void:
|
|||||||
for device_name in device_names:
|
for device_name in device_names:
|
||||||
device_observers[device_name] = DeviceObserver.new()
|
device_observers[device_name] = DeviceObserver.new()
|
||||||
device_observers[device_name].device_name = device_name
|
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:
|
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 has_online_prd := false
|
||||||
var all_prd_operational := true
|
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]:
|
if observer.status[DEVICE_STATUS.ONLINE]:
|
||||||
has_online_prd = true
|
has_online_prd = true
|
||||||
|
|
||||||
@@ -142,15 +246,35 @@ func _recalculate_overall_state() -> void:
|
|||||||
prd_state = DEVICE_STATE.ERR
|
prd_state = DEVICE_STATE.ERR
|
||||||
else:
|
else:
|
||||||
prd_state = DEVICE_STATE.NONE
|
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
|
# 1. Если хоть один ERROR → ERROR
|
||||||
# 2. Если нет ERROR и хоть один GOOD → GOOD
|
# 2. Если нет ERROR и хоть один GOOD → GOOD
|
||||||
# 3. Иначе → NONE
|
# 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
|
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
|
new_state = DEVICE_STATE.GOOD
|
||||||
else:
|
else:
|
||||||
new_state = DEVICE_STATE.NONE
|
new_state = DEVICE_STATE.NONE
|
||||||
@@ -174,6 +298,7 @@ func _get_tooltip_text() -> String:
|
|||||||
# Получаем статистику по ПРД
|
# Получаем статистику по ПРД
|
||||||
var prd_summary = _get_prd_summary()
|
var prd_summary = _get_prd_summary()
|
||||||
var uf_status_str = _get_uf_status_text()
|
var uf_status_str = _get_uf_status_text()
|
||||||
|
var rtr_summary = _get_rtr_summary()
|
||||||
|
|
||||||
match overall_prd_state:
|
match overall_prd_state:
|
||||||
DEVICE_STATE.NONE:
|
DEVICE_STATE.NONE:
|
||||||
@@ -185,6 +310,7 @@ func _get_tooltip_text() -> String:
|
|||||||
|
|
||||||
tooltip += '\n\nСтатус ПРД систем: ' + prd_summary
|
tooltip += '\n\nСтатус ПРД систем: ' + prd_summary
|
||||||
tooltip += '\nСтатус УФ: ' + uf_status_str
|
tooltip += '\nСтатус УФ: ' + uf_status_str
|
||||||
|
tooltip += '\nСтатус RTR: ' + rtr_summary
|
||||||
|
|
||||||
# Детализация по источникам статуса
|
# Детализация по источникам статуса
|
||||||
tooltip += '\n\nСостояние систем:'
|
tooltip += '\n\nСостояние систем:'
|
||||||
@@ -192,7 +318,10 @@ func _get_tooltip_text() -> String:
|
|||||||
# ПРД системы
|
# ПРД системы
|
||||||
var prd_ok_count = 0
|
var prd_ok_count = 0
|
||||||
var prd_total = 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]:
|
if observer.status[DEVICE_STATUS.ONLINE]:
|
||||||
prd_total += 1
|
prd_total += 1
|
||||||
if observer.status[DEVICE_STATUS.STATUS]:
|
if observer.status[DEVICE_STATUS.STATUS]:
|
||||||
@@ -202,15 +331,67 @@ func _get_tooltip_text() -> String:
|
|||||||
|
|
||||||
# УФ система
|
# УФ система
|
||||||
tooltip += '\nУФ: ' + _get_uf_status_text()
|
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
|
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:
|
func _get_prd_summary() -> String:
|
||||||
var online_count := 0
|
var online_count := 0
|
||||||
var operational_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]:
|
if observer.status[DEVICE_STATUS.ONLINE]:
|
||||||
online_count += 1
|
online_count += 1
|
||||||
if observer.status[DEVICE_STATUS.STATUS]:
|
if observer.status[DEVICE_STATUS.STATUS]:
|
||||||
@@ -235,14 +416,20 @@ func _get_uf_status_text() -> String:
|
|||||||
|
|
||||||
|
|
||||||
func _has_prd_errors() -> bool:
|
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]:
|
if observer.status[DEVICE_STATUS.ONLINE] and not observer.status[DEVICE_STATUS.STATUS]:
|
||||||
return true
|
return true
|
||||||
return false
|
return false
|
||||||
|
|
||||||
|
|
||||||
func _has_operational_prd() -> bool:
|
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]:
|
if observer.status[DEVICE_STATUS.ONLINE] and observer.status[DEVICE_STATUS.STATUS]:
|
||||||
return true
|
return true
|
||||||
return false
|
return false
|
||||||
@@ -257,7 +444,8 @@ func get_device_status(device_name: String) -> Dictionary:
|
|||||||
'operational': observer.status[DEVICE_STATUS.STATUS],
|
'operational': observer.status[DEVICE_STATUS.STATUS],
|
||||||
'control_complete': observer.status[DEVICE_STATUS.CONTROL],
|
'control_complete': observer.status[DEVICE_STATUS.CONTROL],
|
||||||
'last_results': observer.last_results.duplicate(),
|
'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 {}
|
return {}
|
||||||
|
|
||||||
@@ -267,7 +455,10 @@ func get_overall_status() -> Dictionary:
|
|||||||
var operational_count := 0
|
var operational_count := 0
|
||||||
var control_complete_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]:
|
if observer.status[DEVICE_STATUS.ONLINE]:
|
||||||
online_count += 1
|
online_count += 1
|
||||||
if observer.status[DEVICE_STATUS.STATUS]:
|
if observer.status[DEVICE_STATUS.STATUS]:
|
||||||
@@ -279,7 +470,8 @@ func get_overall_status() -> Dictionary:
|
|||||||
'overall_state': overall_prd_state,
|
'overall_state': overall_prd_state,
|
||||||
'online_devices': online_count,
|
'online_devices': online_count,
|
||||||
'operational_devices': operational_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,
|
'control_complete_devices': control_complete_count,
|
||||||
'uf_status': status_uf
|
'uf_status': status_uf,
|
||||||
|
'rtr_status': _get_rtr_summary()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user