209 lines
8.1 KiB
GDScript
209 lines
8.1 KiB
GDScript
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 = {}
|
||
|
||
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
|
||
|
||
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:
|
||
# Логика для УФ (раскомментируй если нужно)
|
||
# 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 uf_operational = KEMS_B and EMS_B_1 and EMS_B_2 and IP27B
|
||
# signaller.emit_signal('update_uf_serviceability', uf_operational)
|
||
pass
|
||
|
||
|
||
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:
|
||
new_state = PRD_STATE.GOOD if all_operational else 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:
|
||
match overall_prd_state:
|
||
PRD_STATE.NONE:
|
||
return "Нет связи с приборами комплекса"
|
||
PRD_STATE.GOOD:
|
||
return "Все приборы комплекса исправны"
|
||
PRD_STATE.ERR:
|
||
return "Обнаружены неисправности в комплексе"
|
||
_:
|
||
return "Неизвестное состояние"
|
||
|
||
|
||
# Публичные методы для получения информации
|
||
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()
|
||
}
|
||
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
|
||
}
|