94 lines
3.7 KiB
GDScript
94 lines
3.7 KiB
GDScript
class_name UFControl extends Node
|
|
|
|
signal update_uf_serviceability(status: int)
|
|
|
|
#region Константы и переменные
|
|
enum StatusIndex {SOCKETS = 0, IP_220_27B = 2}
|
|
enum STATE_VAL {NONE = 0, GOOD = 1, ERROR = 2}
|
|
var unit_uf: Object
|
|
var uf_status: Dictionary = {'УФ-онлайн': false, 'КЭМС-Б1': false, 'ЭМС-Б1': false, 'ЭМС-Б2': false, 'ИП220-27Б': false}
|
|
|
|
var _self_name: String
|
|
var _serviceability: int = STATE_VAL.NONE
|
|
var serviceability: int:
|
|
get:
|
|
return _serviceability
|
|
set(value):
|
|
if value != _serviceability:
|
|
_serviceability = value
|
|
signaller.emit_signal('update_uf_serviceability', value)
|
|
#endregion
|
|
|
|
#region Инициализация
|
|
func _init(name_uf: String) -> void:
|
|
_self_name = name_uf
|
|
unit_uf = network.get_unit_instance(_self_name)
|
|
unit_uf.connect('line_changed', on_line_changed)
|
|
unit_uf.connect('data_received', on_data_received)
|
|
#endregion
|
|
|
|
#region Обработчики сигналов
|
|
func on_line_changed(status: Object) -> void:
|
|
'''Обработка изменения состояния линии связи'''
|
|
uf_status['УФ-онлайн'] = status.online
|
|
update_serviceability()
|
|
|
|
func on_data_received(yau: Object) -> void:
|
|
'''Обработка полученных данных от УФ'''
|
|
var new_ems_status = control_ems(yau.status)
|
|
var status_changed = false
|
|
|
|
# Обновляем только ключи КЭМС/ЭМС, сохраняя 'УФ-онлайн'
|
|
for key in ['КЭМС-Б1', 'ЭМС-Б1', 'ЭМС-Б2', 'ИП220-27Б']:
|
|
var old_value = uf_status.get(key, false)
|
|
var new_value = new_ems_status.get(key, false)
|
|
|
|
if old_value != new_value:
|
|
uf_status[key] = new_value
|
|
status_changed = true
|
|
|
|
if status_changed:
|
|
update_serviceability()
|
|
#endregion
|
|
|
|
#region Статус и сервисабельность
|
|
func get_current_status() -> Dictionary:
|
|
'''Получение текущего статуса (только для чтения)'''
|
|
return uf_status.duplicate(true)
|
|
|
|
func is_operational() -> bool:
|
|
'''Проверка, все ли системы работают нормально'''
|
|
return serviceability and uf_status.get('УФ-онлайн', false)
|
|
|
|
|
|
func update_serviceability() -> void:
|
|
'''Обновление общего статуса сервисабельности'''
|
|
var new_serviceability: int = STATE_VAL.GOOD
|
|
|
|
# Проверяем онлайн-статус
|
|
if uf_status.get('УФ-онлайн', false) == false:
|
|
new_serviceability = STATE_VAL.NONE
|
|
else:
|
|
# Проверяем все статусы КЭМС/ЭМС
|
|
for key in ['КЭМС-Б1', 'ЭМС-Б1', 'ЭМС-Б2', 'ИП220-27Б']:
|
|
if uf_status.get(key, true) == false:
|
|
new_serviceability = STATE_VAL.ERROR
|
|
break
|
|
# Новое значение через setter
|
|
self.serviceability = new_serviceability
|
|
#endregion
|
|
|
|
#region Вспомогательные методы
|
|
static func control_ems(status: Array) -> Dictionary:
|
|
'''Анализ статусов КЭМС/ЭМС'''
|
|
var status_dic: Dictionary = {}
|
|
if status.is_empty() or status.size() < 3:
|
|
return status_dic
|
|
|
|
status_dic['КЭМС-Б1'] = bool((status[StatusIndex.SOCKETS] >> 0) & 1) and bool((status[StatusIndex.SOCKETS] >> 3) & 1)
|
|
status_dic['ЭМС-Б1'] = bool((status[StatusIndex.SOCKETS] >> 1) & 1) and bool((status[StatusIndex.SOCKETS] >> 4) & 1)
|
|
status_dic['ЭМС-Б2'] = bool((status[StatusIndex.SOCKETS] >> 2) & 1) and bool((status[StatusIndex.SOCKETS] >> 5) & 1)
|
|
status_dic['ИП220-27Б'] = bool((status[StatusIndex.IP_220_27B] >> 6) & 1)
|
|
return status_dic
|
|
#endregion
|