Отладка интегрального контроля УФ

This commit is contained in:
TotMaxim
2025-12-07 20:14:51 +03:00
parent a7c816e6ca
commit c74d5ccdad
5 changed files with 195 additions and 165 deletions

View File

@@ -1,6 +1,6 @@
extends Label
enum PRD_STATE {
enum DEVICE_STATE {
NONE, # Нет связи
GOOD, # Исправно
ERR # Отказ
@@ -13,16 +13,15 @@ enum DEVICE_STATUS {
}
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}
DEVICE_STATE.NONE: {"text": "Нет связи", "color": Color.WHITE, "font_color": Color.BLACK},
DEVICE_STATE.GOOD: {"text": "Исправно", "color": Color.GREEN, "font_color": Color.BLACK},
DEVICE_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:
@@ -59,8 +58,8 @@ class DeviceObserver:
return changed
var device_observers: Dictionary = {}
var overall_prd_state: PRD_STATE = PRD_STATE.NONE
var status_uf: bool = false # Статус УФ (УАРЭП-ЭМС)
var overall_prd_state: DEVICE_STATE = DEVICE_STATE.NONE
var status_uf: int = DEVICE_STATE.NONE # Статус УФ (УАРЭП-ЭМС)
func _ready() -> void:
tooltip_text = 'Нет связи с приборами комплекса'
@@ -79,10 +78,8 @@ func _ready() -> void:
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'))
signaller.connect('update_uf_serviceability', _on_uf_status_receive)
# Инициализация начального состояния
_recalculate_overall_state()
@@ -113,48 +110,52 @@ func _on_prd_control_results(results: Dictionary, prd_module: Object) -> void:
_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 _on_uf_status_receive(unit_uf_status: int) -> void:
if status_uf != unit_uf_status:
status_uf = unit_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
# Проверяем только если есть онлайн устройства
var new_state := DEVICE_STATE.NONE
# Проверяем статус ПРД
var prd_state := DEVICE_STATE.NONE
var has_online_prd := false
var all_prd_operational := true
for observer in device_observers.values():
if observer.status[DEVICE_STATUS.ONLINE]:
has_online_devices = true
has_online_prd = true
if observer.status[DEVICE_STATUS.CONTROL]:
# Если контроль завершен - строгая проверка
if not observer.status[DEVICE_STATUS.STATUS]:
all_operational = false
all_prd_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
all_prd_operational = false
if has_online_prd:
if all_prd_operational:
prd_state = DEVICE_STATE.GOOD
else:
new_state = PRD_STATE.ERR
prd_state = DEVICE_STATE.ERR
else:
new_state = PRD_STATE.NONE
prd_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:
new_state = DEVICE_STATE.ERR
elif prd_state == DEVICE_STATE.GOOD or status_uf == DEVICE_STATE.GOOD:
new_state = DEVICE_STATE.GOOD
else:
new_state = DEVICE_STATE.NONE
if overall_prd_state != new_state:
overall_prd_state = new_state
_update_display()
@@ -171,39 +172,82 @@ func _update_display() -> void:
func _get_tooltip_text() -> String:
var tooltip := ""
# Получаем статистику по ПРД
var prd_summary = _get_prd_summary()
var uf_status_str = _get_uf_status_text()
match overall_prd_state:
PRD_STATE.NONE:
tooltip = "Нет связи с приборами комплекса"
PRD_STATE.GOOD:
tooltip = "Все приборы комплекса исправны"
PRD_STATE.ERR:
DEVICE_STATE.NONE:
tooltip = "Нет исправных систем в комплексе"
DEVICE_STATE.GOOD:
tooltip = "Комплекс исправен"
DEVICE_STATE.ERR:
tooltip = "Обнаружены неисправности в комплексе"
_:
tooltip = "Неизвестное состояние"
tooltip += "\n\nСтатус ПРД систем: " + prd_summary
tooltip += "\nСтатус УФ: " + uf_status_str
# Детализация по источникам статуса
tooltip += "\n\nСостояние систем:"
# ПРД системы
var prd_ok_count = 0
var prd_total = 0
for observer in device_observers.values():
if observer.status[DEVICE_STATUS.ONLINE]:
prd_total += 1
if observer.status[DEVICE_STATUS.STATUS]:
prd_ok_count += 1
tooltip += "\nПРД: %d/%d исправно" % [prd_ok_count, prd_total]
# УФ система
tooltip += "\nУФ: " + _get_uf_status_text()
return tooltip
# Добавляем информацию о статусе УФ, если есть онлайн устройства
if overall_prd_state != PRD_STATE.NONE:
tooltip += "\n\n"
tooltip += "Статус УФ (УАРЭП-ЭМС): "
tooltip += "Исправен" if status_uf else "Неисправен"
# Добавляем детальную информацию о ПРД устройствах
tooltip += "\n\nДетальный статус ПРД:"
func _get_prd_summary() -> String:
var online_count := 0
var operational_count := 0
for device_name in device_observers:
var observer = device_observers[device_name]
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 online_count == 0:
return "Нет связи"
else:
return "%d/%d исправно" % [operational_count, online_count]
tooltip += "\nПРД онлайн: %d/%d" % [online_count, device_observers.size()]
tooltip += "\nПРД исправны: %d/%d" % [operational_count, online_count]
return tooltip
func _get_uf_status_text() -> String:
match status_uf:
DEVICE_STATE.NONE:
return "Нет данных"
DEVICE_STATE.GOOD:
return "Исправен"
DEVICE_STATE.ERR:
return "Неисправен"
_:
return "Неизвестно"
func _has_prd_errors() -> bool:
for observer in device_observers.values():
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():
if observer.status[DEVICE_STATUS.ONLINE] and observer.status[DEVICE_STATUS.STATUS]:
return true
return false
# Публичные методы для получения информации