Files
uarep-ctl/scenes/tabs-switch/lbl_ready.gd

244 lines
9.5 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

extends Label
enum PRD_STATE {
NONE, # Нет связи
GOOD, # Исправно
ERR # Отказ
}
enum DEVICE_STATUS {
ONLINE, # Связь есть
STATUS, # Статус исправности
CONTROL # Контроль завершен
}
const STATUS_CONFIG := {
PRD_STATE.NONE: {"text": "Нет связи", "color": Color.WHITE, "font_color": Color.BLACK},
PRD_STATE.GOOD: {"text": "Исправно", "color": Color.GREEN, "font_color": Color.BLACK},
PRD_STATE.ERR: {"text": "Отказ", "color": Color.RED, "font_color": Color.WHITE}
}
class DeviceObserver:
var device_name: String
var status: Array = [false, false, false] # [online, operational, control_complete]
var last_results: Dictionary = {}
var status_uf: bool = false
func update_online_state(online: bool) -> bool:
if status[DEVICE_STATUS.ONLINE] != online:
status[DEVICE_STATUS.ONLINE] = online
return true
return false
func update_control_results(results: Dictionary) -> bool:
var changed := false
last_results = results.duplicate()
if results.get('is_over_control', false):
# Контроль завершен - проверяем все результаты
var all_ok := true
for key in results:
if key != 'is_over_control' and not results[key]:
all_ok = false
break
if status[DEVICE_STATUS.STATUS] != all_ok or status[DEVICE_STATUS.CONTROL] != true:
status[DEVICE_STATUS.STATUS] = all_ok
status[DEVICE_STATUS.CONTROL] = true
changed = true
else:
# Контроль в процессе - проверяем базовые параметры
var basic_ok: bool = results.get('block_kasseta', false) and \
results.get('block_ip', false) and \
results.get('temperature', true)
if status[DEVICE_STATUS.STATUS] != basic_ok or status[DEVICE_STATUS.CONTROL] != false:
status[DEVICE_STATUS.STATUS] = basic_ok
status[DEVICE_STATUS.CONTROL] = false
changed = true
return changed
var device_observers: Dictionary = {}
var overall_prd_state: PRD_STATE = PRD_STATE.NONE
var status_uf: bool = false # Статус УФ (УАРЭП-ЭМС)
func _ready() -> void:
tooltip_text = 'Нет связи с приборами комплекса'
add_theme_color_override("font_color", Color.BLACK)
# Инициализация наблюдателей
_initialize_observers()
# Подписка на сигналы ПРД модулей
for prd_module in prd.prd_dict.values():
# Подключаемся к контролю ПРД
if prd_module.unit_control:
prd_module.unit_control.connect('control_results_updated', Callable(self, '_on_prd_control_results').bind(prd_module))
# Подключаемся к онлайн-статусу ЯУ-07
if prd_module.unit_yau07:
prd_module.unit_yau07.connect('line_changed', Callable(self, '_on_prd_online_changed').bind(prd_module))
# Подписка на УФ
var unit_uf = network.get_unit_instance('уарэп-эмс')
if unit_uf:
unit_uf.data_received.connect(Callable(self, '_on_uf_status_receive'))
# Инициализация начального состояния
_recalculate_overall_state()
func _initialize_observers() -> void:
var device_names := [
'уарэп-яу07-1н', 'уарэп-яу07-1в', 'уарэп-яу07-1к',
'уарэп-яу07-2н', 'уарэп-яу07-2в', 'уарэп-яу07-2к',
'уарэп-яу07-3н', 'уарэп-яу07-3в', 'уарэп-яу07-3к',
'уарэп-яу07-4н', 'уарэп-яу07-4в', 'уарэп-яу07-4к'
]
for device_name in device_names:
device_observers[device_name] = DeviceObserver.new()
device_observers[device_name].device_name = device_name
func _on_prd_online_changed(line_status: Object, prd_module: Object) -> void:
var online: bool = line_status.online
var observer: DeviceObserver = device_observers.get(prd_module.prd_name)
if observer and observer.update_online_state(online):
_recalculate_overall_state()
func _on_prd_control_results(results: Dictionary, prd_module: Object) -> void:
var observer: DeviceObserver = device_observers.get(prd_module.prd_name)
if observer and observer.update_control_results(results):
_recalculate_overall_state()
func _on_uf_status_receive(unit_uf: Object) -> void:
if unit_uf:
var KEMS_B = ((unit_uf.status[0] >> 0) & 1) and ((unit_uf.status[0] >> 3) & 1)
var EMS_B_1 = ((unit_uf.status[0] >> 1) & 1) and ((unit_uf.status[0] >> 4) & 1)
var EMS_B_2 = ((unit_uf.status[0] >> 2) & 1) and ((unit_uf.status[0] >> 5) & 1)
var IP27B = ((unit_uf.status[2] >> 6) & 1)
var new_uf_status = KEMS_B and EMS_B_1 and EMS_B_2 and IP27B
if status_uf != new_uf_status:
status_uf = new_uf_status
_recalculate_overall_state()
func _recalculate_overall_state() -> void:
var new_state := PRD_STATE.NONE
var has_online_devices := false
var all_operational := true
# Проверяем только если есть онлайн устройства
for observer in device_observers.values():
if observer.status[DEVICE_STATUS.ONLINE]:
has_online_devices = true
if observer.status[DEVICE_STATUS.CONTROL]:
# Если контроль завершен - строгая проверка
if not observer.status[DEVICE_STATUS.STATUS]:
all_operational = false
break
else:
# Если контроль в процессе - мягкая проверка
if not observer.status[DEVICE_STATUS.STATUS]:
all_operational = false
# Не прерываем, чтобы проверить все устройства
if has_online_devices:
if all_operational and status_uf:
new_state = PRD_STATE.GOOD
else:
new_state = PRD_STATE.ERR
else:
new_state = PRD_STATE.NONE
if overall_prd_state != new_state:
overall_prd_state = new_state
_update_display()
func _update_display() -> void:
var config: Dictionary = STATUS_CONFIG[overall_prd_state].duplicate()
text = config.text
modulate = config.color
add_theme_color_override("font_color", config.font_color)
tooltip_text = _get_tooltip_text()
func _get_tooltip_text() -> String:
var tooltip := ""
match overall_prd_state:
PRD_STATE.NONE:
tooltip = "Нет связи с приборами комплекса"
PRD_STATE.GOOD:
tooltip = "Все приборы комплекса исправны"
PRD_STATE.ERR:
tooltip = "Обнаружены неисправности в комплексе"
_:
tooltip = "Неизвестное состояние"
# Добавляем информацию о статусе УФ, если есть онлайн устройства
if overall_prd_state != PRD_STATE.NONE:
tooltip += "\n\n"
tooltip += "Статус УФ (УАРЭП-ЭМС): "
tooltip += "Исправен" if status_uf else "Неисправен"
# Добавляем детальную информацию о ПРД устройствах
tooltip += "\n\nДетальный статус ПРД:"
var online_count := 0
var operational_count := 0
for device_name in device_observers:
var observer = device_observers[device_name]
if observer.status[DEVICE_STATUS.ONLINE]:
online_count += 1
if observer.status[DEVICE_STATUS.STATUS]:
operational_count += 1
tooltip += "\nПРД онлайн: %d/%d" % [online_count, device_observers.size()]
tooltip += "\nПРД исправны: %d/%d" % [operational_count, online_count]
return tooltip
# Публичные методы для получения информации
func get_device_status(device_name: String) -> Dictionary:
var observer: DeviceObserver = device_observers.get(device_name)
if observer:
return {
"online": observer.status[DEVICE_STATUS.ONLINE],
"operational": observer.status[DEVICE_STATUS.STATUS],
"control_complete": observer.status[DEVICE_STATUS.CONTROL],
"last_results": observer.last_results.duplicate(),
"status_uf": status_uf
}
return {}
func get_overall_status() -> Dictionary:
var online_count := 0
var operational_count := 0
var control_complete_count := 0
for observer in device_observers.values():
if observer.status[DEVICE_STATUS.ONLINE]:
online_count += 1
if observer.status[DEVICE_STATUS.STATUS]:
operational_count += 1
if observer.status[DEVICE_STATUS.CONTROL]:
control_complete_count += 1
return {
"overall_state": overall_prd_state,
"online_devices": online_count,
"operational_devices": operational_count,
"total_devices": device_observers.size(),
"control_complete_devices": control_complete_count,
"uf_status": status_uf
}