From a7c816e6cab025a1ec8fe5784a7f5c4c5dd33661 Mon Sep 17 00:00:00 2001 From: TotMaxim Date: Sun, 7 Dec 2025 18:49:03 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B8=D0=BD=D1=82=D0=B5=D0=B3=D1=80=D0=B0=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=BB=D1=8F=20=D0=A3=D0=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-uf/uf-ctl.gd | 96 ++++++++++++++++++++++++++++++++++ scenes/pribor-uf/uf-ctl.gd.uid | 1 + scenes/контроль/контроль.tscn | 9 +++- scripts/prd.gd | 1 - 4 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 scenes/pribor-uf/uf-ctl.gd create mode 100644 scenes/pribor-uf/uf-ctl.gd.uid diff --git a/scenes/pribor-uf/uf-ctl.gd b/scenes/pribor-uf/uf-ctl.gd new file mode 100644 index 00000000..6fda79a2 --- /dev/null +++ b/scenes/pribor-uf/uf-ctl.gd @@ -0,0 +1,96 @@ +class_name UFControl + +signal update_uf_serviceability(status: bool) + +#region Константы и переменные +enum StatusIndex { + SOCKETS = 0, + IP_220_27B = 2 +} + +var unit_uf: Object +var uf_status: Dictionary + +var _self_name: String +var _serviceability: bool = false +var serviceability: bool: + get: + return _serviceability + set(value): + if value != _serviceability: + _serviceability = value + emit_signal('update_uf_serviceability', value) +#endregion + +#region Инициализация +func _init(name: String) -> void: + _self_name = name + 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: bool = true + + # Проверяем онлайн-статус + if uf_status.get('УФ-онлайн', false) == false: + new_serviceability = false + else: + # Проверяем все статусы КЭМС/ЭМС + for key in ['КЭМС-Б1', 'ЭМС-Б1', 'ЭМС-Б2', 'ИП220-27Б']: + if uf_status.get(key, true) == false: + new_serviceability = false + 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 diff --git a/scenes/pribor-uf/uf-ctl.gd.uid b/scenes/pribor-uf/uf-ctl.gd.uid new file mode 100644 index 00000000..20c27c67 --- /dev/null +++ b/scenes/pribor-uf/uf-ctl.gd.uid @@ -0,0 +1 @@ +uid://b6avo0uvwrxnj diff --git a/scenes/контроль/контроль.tscn b/scenes/контроль/контроль.tscn index 30ddb56f..28e7d577 100644 --- a/scenes/контроль/контроль.tscn +++ b/scenes/контроль/контроль.tscn @@ -54,6 +54,7 @@ const PRIBORS_RES = \\ 'pribor_uf': ['res://scenes/pribor-uf/pribor-uf.tscn', 'Контроль исправности прибора УФ'], 'pribor_uyep': ['res://scenes/pribor-uyep/pribor-uyep.tscn', 'Контроль исправности устройства У-ЭП'], } +var uf_control: UFControl var ctl_btn_state := false var cur_pribor_node = null var check_ready_control: Dictionary = {} @@ -106,7 +107,8 @@ func _ready(): prd_module.unit_control.connect('update_max_value_progress', Callable(self, 'on_update_max_value_progress').bind(pribor_node)) prd_module.unit_control.connect('control_is_over', Callable(self, 'on_control_is_over')) if item == 'уарэп-эмс': - signaller.connect('update_uf_serviceability', Callable(self, 'on_update_uf_serviceability').bind(pribor_node)) + uf_control = UFControl.new('уарэп-эмс') + uf_control.connect('update_uf_serviceability', Callable(self, 'on_update_uf_serviceability').bind(pribor_node)) # Пиктограммы приборов, которые отображают состояние подключения только for pribor_node in get_tree().get_nodes_in_group('pribor_pics'): @@ -114,7 +116,9 @@ func _ready(): var unit_instance: = network.get_unit_instance(unit_name) var conn_node: = pribor_node.get_node('connect_pribor') unit_instance.connect('line_changed', on_line_changed.bind(conn_node, unit_name)) - + + + signaller.conn(signaller.режим_работа, on_mode_changed) signaller.conn(signaller.режим_журнал, on_mode_changed) signaller.conn(signaller.режим_настройки, on_mode_changed) @@ -170,6 +174,7 @@ func on_serviceability_changed(state: int, prd_pribor_node: Node)-> void: func on_update_uf_serviceability(uf_serviceaability: bool, uf_pribor: Node)-> void: + print('uf_serviceaability: ', uf_serviceaability) uf_pribor.state = 1 if uf_serviceaability else 2 diff --git a/scripts/prd.gd b/scripts/prd.gd index b908451f..1e9efd5f 100644 --- a/scripts/prd.gd +++ b/scripts/prd.gd @@ -420,7 +420,6 @@ func find_fs_index(aoa: float, freq: int, fs_index_arr: Array): ## Обновление состояния модулей формирователя сигналов func update_fs_state(ecms, trenaz_mode: bool): - var time_now = Time.get_ticks_msec() for fs in fs_dict.values(): ## Запрет модуляции для всех ФС fs.set_modulation(false) for ecm in ecms.values(): ## Выставление состояния помехи в ФС