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(): ## Выставление состояния помехи в ФС