@@ -1,48 +1,208 @@
extends Label
# Используем более понятные имена переменных
const STATUS_GOOD : = { " text " : " Исправно " , " color " : Color . GREEN , " font_color " : Color . BLACK }
const STATUS_BAD : = { " text " : " Отказ " , " color " : Color . RED , " font_color " : Color . WHITE }
var _is_uf_status_initialized : bool = false
var is_prd_operational : bool = true
var is_uf_operational : bool = false
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 = ' Нет связи с приборами комплекса '
for prd_module in prd . prd_dict . values ( ) :
prd_module . connect ( ' update_serviceability ' , Callable ( self , ' on_serviceability_changed ' ) . bind ( prd_module ) )
var unit_uf : = network . get_unit_instance ( ' уарэп-эмс ' )
unit_uf . connect ( ' data_received ' , Callable ( self , ' on_uf_status_receive ' ) )
add_theme_color_override ( " font_color " , Color . BLACK )
# Инициализация наблюдателей
_initialize_observers ( )
func on_serviceability_changed ( unit_prd_module : Object ) - > void :
var check_service : bool = true
# Подписка на сигналы ПРД модулей
for prd_module in prd . prd_dict . values ( ) :
if prd_module . unit_yau07 . online :
if not unit_ prd_module. serviceability :
check_service = false
if check_service != is_prd_operational :
is_prd_operational = check_service
_update_serviceability_display ( )
# Подключаемся к контролю ПРД
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 _update_serviceability_display ( ) - > void :
var status : = STATUS_GOOD if ( is_uf_operational and is_prd_operational ) else STATUS_BAD
text = status . text
modulate = status . color
tooltip_text = ' Результаты обобщенного признака работоспособности изделия '
add_theme_color_override ( " font_color " , status . font_color )
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_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 check_service : bool = KEMS_B and EMS_B_1 and EMS_B_2 and IP27B
if not _is_uf_status_initialized or check_service != is_uf_operational :
is_uf_operational = check_service
_update_serviceability_display ( )
signaller . emit_signal ( ' update_uf_serviceability ' , check_service )
_is_uf_status_initialized = true
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
}