From 423411cf941e79364704d559a0b196e5edc5935e Mon Sep 17 00:00:00 2001
From: TotMaxim
Date: Sat, 22 Nov 2025 21:41:11 +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=BC=D0=B0=D1=88=D0=B8=D0=BD=D1=8B=20=D1=81?=
=?UTF-8?q?=D0=BE=D1=81=D0=BE=D1=82=D0=BE=D1=8F=D0=BD=D0=B8=D0=B9=20=D0=B8?=
=?UTF-8?q?=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82=D0=B0=D1=82=D0=BE?=
=?UTF-8?q?=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE=D0=BB=D1=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
scenes/pribor-prd-k/pribor-prd-k.gd | 71 ++++--
scenes/pribor-prd-n/pribor-prd-n.gd | 47 +++-
scenes/pribor-prd-v/pribor-prd-v.gd | 43 +++-
scenes/контроль/контроль.tscn | 81 ++++--
scripts/prd.gd | 4 +
scripts/pribor-prd.gd | 366 +++++++++++++++++++++-------
6 files changed, 458 insertions(+), 154 deletions(-)
diff --git a/scenes/pribor-prd-k/pribor-prd-k.gd b/scenes/pribor-prd-k/pribor-prd-k.gd
index 6cc10961..ebf7d5ae 100644
--- a/scenes/pribor-prd-k/pribor-prd-k.gd
+++ b/scenes/pribor-prd-k/pribor-prd-k.gd
@@ -18,11 +18,12 @@ func _ready() -> void:
for temp in power_amplifier:
temp.value1 = -70
# Подписываемся на сигналы
+ signaller.conn(signaller.start_contol_device, Callable(self, '_on_start_control'))
unit_prd_k.connect('control_is_over', Callable(self, 'on_press_device'))
unit_prd_k.connect('status_updated', Callable(self, '_on_status_updated'))
# Устанавливаем начальный статус
_update_status_text(unit_prd_k.get_current_status())
- on_press_device()
+ on_press_device(unit_prd_k.self_name)
func _process(_delta: float) -> void:
@@ -39,18 +40,17 @@ func _process(_delta: float) -> void:
func set_frame(node_frame: Node, val: int): node_frame.set_frame(val)
-func start_control() -> void:
- set_default_state(get_tree().get_nodes_in_group('default_reset'), get_tree().get_nodes_in_group('power_amplifier'))
+func _on_start_control() -> void:
+ set_default_state(get_tree().get_nodes_in_group('default_reset'))
+ set_default_state(get_tree().get_nodes_in_group('power_amplifier'))
find_labels(self)
+ on_press_device(unit_prd_k.self_name)
-static func set_default_state(default_reset_array_node: Array, power_amplifier_arr_node: Array) -> void:
+static func set_default_state(default_reset_array_node: Array) -> void:
for group in default_reset_array_node:
group.state = STATE_VAL.NONE
- for group in power_amplifier_arr_node:
- group.state = STATE_VAL.NONE
-
func _enter_tree() -> void:
if Engine.is_editor_hint():
@@ -76,27 +76,41 @@ static func power_fill(pow_dic: Dictionary, fs_result: Dictionary, power_amplifi
for i_node_temperature in power_amplifier_arr_node:
var powamp_meta: String = i_node_temperature.get_meta('um')
var status = STATE_VAL.GOOD if pow_dic else STATE_VAL.NONE
- if not pow_dic.has(powamp_meta): return
+ if not pow_dic.has(powamp_meta): continue
# Проверки fs_result
- if powamp_meta == 'um_8' and not fs_result.fs_1: return
- if powamp_meta in ['um_1', 'um_2', 'um_3', 'um_4', 'um_5', 'um_6'] and not fs_result.fs_6: return
- if powamp_meta in ['um_9', 'um_10', 'um_11', 'um_12', 'um_13', 'um_14'] and not fs_result.fs_7: return
-
+ if powamp_meta == 'um_8' and not fs_result.fs_1: continue
+ if powamp_meta in ['um_1', 'um_2', 'um_3', 'um_4', 'um_5', 'um_6'] and not fs_result.fs_6: continue
+ if powamp_meta in ['um_9', 'um_10', 'um_11', 'um_12', 'um_13', 'um_14'] and not fs_result.fs_7: continue
if powamp_meta == 'um_8':
- i_node_temperature.value0 = [pow_dic[powamp_meta][5]]
- status = STATE_VAL.ERROR if pow_dic[powamp_meta][5] < POWER_THRESHOLD else STATE_VAL.GOOD
+ var power_value = pow_dic[powamp_meta][5]
+ i_node_temperature.value0 = [power_value]
+ # Проверка для um_8: если значение < 1 → STATE_VAL.NONE
+ if power_value < 1:
+ status = STATE_VAL.NONE
+ else:
+ status = STATE_VAL.ERROR if power_value < POWER_THRESHOLD else STATE_VAL.GOOD
else:
- i_node_temperature.value0 = pow_dic[powamp_meta]
- # Проверки 3 значения = исправен
- var count_above_threshold = 0
- for i_p in pow_dic[powamp_meta]:
- if i_p >= POWER_THRESHOLD:
- count_above_threshold += 1
- status = STATE_VAL.GOOD if count_above_threshold >= 3 else STATE_VAL.ERROR
+ var power_array: Array = pow_dic[powamp_meta]
+ i_node_temperature.value0 = power_array
+ # Проверка: если ВСЕ значения в массиве < 1 → STATE_VAL.NONE
+ var all_below_one: bool = true
+ for i_p in power_array:
+ if i_p >= 1:
+ all_below_one = false
+ break
+
+ if all_below_one:
+ status = STATE_VAL.NONE
+ else:
+ var count_above_threshold = 0
+ for i_p in power_array:
+ if i_p >= POWER_THRESHOLD:
+ count_above_threshold += 1
+ status = STATE_VAL.GOOD if count_above_threshold >= 3 else STATE_VAL.ERROR
i_node_temperature.state = status
-func on_press_device() -> void:
+func on_press_device(_name_davice: String) -> void:
var nodes_y5: Array = get_tree().get_nodes_in_group('y-5')
var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply')
var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group')
@@ -126,7 +140,7 @@ func on_press_device() -> void:
static func on_control_result(for_result_dic: Dictionary) -> void:
temperature_fill(for_result_dic.power_amplifier, for_result_dic.temperature_um)
-
+ var all_y5_good: bool = true
var block_kasseta_y5_prd_config_k: Dictionary = for_result_dic.block_kasseta_y5_config
var nodes_y5: Array = for_result_dic.nodes_y5
for node_y5 in nodes_y5:
@@ -136,7 +150,9 @@ static func on_control_result(for_result_dic: Dictionary) -> void:
node_y5.state = STATE_VAL.ERROR if meta_y5 == 'yau07' else STATE_VAL.NONE
else:
node_y5.state = STATE_VAL.GOOD if block_kasseta_y5_prd_config_k[meta_y5] else STATE_VAL.ERROR
-
+ # Проверяем состояние после установки
+ if node_y5.state == STATE_VAL.ERROR:
+ all_y5_good = false
var block_ip_config_k: Dictionary = for_result_dic.block_ip_config
for power_supply in for_result_dic.node_ip_power_arr:
var meta_ip = power_supply.get_meta('ip')
@@ -144,9 +160,13 @@ static func on_control_result(for_result_dic: Dictionary) -> void:
power_supply.state = STATE_VAL.GOOD if block_ip_config_k[meta_ip][1] else STATE_VAL.ERROR
else:
power_supply.state = STATE_VAL.NONE
+ # Проверяем состояние после установки
+ if power_supply.state == STATE_VAL.ERROR:
+ all_y5_good = false
if not for_result_dic.control_is_over:
- set_default_state(for_result_dic.default_reset_array_node, for_result_dic.power_amplifier)
+ set_default_state(for_result_dic.default_reset_array_node)
+ set_default_state(for_result_dic.power_amplifier)
return
var result_dic: Dictionary = for_result_dic.result_dic
for f in for_result_dic.fs_nodes:
@@ -154,6 +174,7 @@ static func on_control_result(for_result_dic: Dictionary) -> void:
if result_dic.has(fs_meta):
f.state = result_dic[fs_meta]
+ if not all_y5_good: return
if result_dic.fs_1 == 1 and block_kasseta_y5_prd_config_k['yau07']:
for_result_dic.module_fs_1.state = STATE_VAL.GOOD if result_dic.dkm_1 else STATE_VAL.ERROR
diff --git a/scenes/pribor-prd-n/pribor-prd-n.gd b/scenes/pribor-prd-n/pribor-prd-n.gd
index 1f546d49..0cbe3f15 100644
--- a/scenes/pribor-prd-n/pribor-prd-n.gd
+++ b/scenes/pribor-prd-n/pribor-prd-n.gd
@@ -18,12 +18,12 @@ func _ready() -> void:
for temp in power_amplifier:
temp.value1 = -70
# Подписываемся на сигналы
+ signaller.conn(signaller.start_contol_device, Callable(self, '_on_start_control'))
unit_prd_n.connect('control_is_over', Callable(self, 'on_press_device'))
unit_prd_n.connect('status_updated', Callable(self, '_on_status_updated'))
# Устанавливаем начальный статус
_update_status_text(unit_prd_n.get_current_status())
- start_control()
- on_press_device()
+ on_press_device(unit_prd_n.self_name)
func _process(_delta: float) -> void:
@@ -38,18 +38,19 @@ func _process(_delta: float) -> void:
func set_frame(node_frame: Node, val: int): node_frame.set_frame(val)
-func start_control() -> void:
- set_default_state(get_tree().get_nodes_in_group('default_reset'), get_tree().get_nodes_in_group('power_amplifier'))
+func _on_start_control() -> void:
+ set_default_state(get_tree().get_nodes_in_group('default_reset'))
+ set_default_state(get_tree().get_nodes_in_group('power_amplifier'))
+ for um in get_tree().get_nodes_in_group('power_amplifier'):
+ um.value0 = [0, 0, 0, 0, 0, 0]
find_labels(self)
+ on_press_device(unit_prd_n.self_name)
-static func set_default_state(default_reset_array_node: Array, power_amplifier_arr_node: Array) -> void:
+static func set_default_state(default_reset_array_node: Array) -> void:
for group in default_reset_array_node:
group.state = STATE_VAL.NONE
- for group in power_amplifier_arr_node:
- group.state = STATE_VAL.NONE
-
func _enter_tree() -> void:
if Engine.is_editor_hint():
@@ -79,6 +80,18 @@ static func power_fill(pow_dic: Dictionary, fs_result: Dictionary, power_amplifi
if powamp_meta in ['um_1', 'um_2', 'um_3', 'um_4', 'um_5', 'um_6'] and not fs_result.fs_2: return
if powamp_meta in ['um_9', 'um_10', 'um_11', 'um_12', 'um_13', 'um_14'] and not fs_result.fs_3: return
i_node_powapm.value0 = pow_dic[powamp_meta]
+ # Проверка: если ВСЕ значения в массиве < 1 → STATE_VAL.NONE
+ var power_array: Array = pow_dic[powamp_meta]
+ var all_below_one: bool = true
+ for i_p in power_array:
+ if i_p >= 1:
+ all_below_one = false
+ break
+
+ if all_below_one:
+ i_node_powapm.state = STATE_VAL.NONE
+ continue
+
var count_above_threshold = 0
for i_p in pow_dic[powamp_meta]:
if i_p >= POWER_THRESHOLD:
@@ -88,7 +101,7 @@ static func power_fill(pow_dic: Dictionary, fs_result: Dictionary, power_amplifi
i_node_powapm.state = status
-func on_press_device() -> void:
+func on_press_device(_device_name: String) -> void:
var nodes_y5: Array = get_tree().get_nodes_in_group('y-5')
var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply')
var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group')
@@ -116,7 +129,7 @@ func on_press_device() -> void:
static func on_control_result(for_result_dic: Dictionary) -> void:
temperature_fill(for_result_dic.power_amplifier, for_result_dic.temperature_um)
-
+ var all_y5_good: bool = true
var block_kasseta_y5_prd_config_n: Dictionary = for_result_dic.block_kasseta_y5_config
var nodes_y5: Array = for_result_dic.nodes_y5
for node_y5 in nodes_y5:
@@ -126,7 +139,10 @@ static func on_control_result(for_result_dic: Dictionary) -> void:
node_y5.state = STATE_VAL.ERROR if meta_y5 == 'yau07' else STATE_VAL.NONE
else:
node_y5.state = STATE_VAL.GOOD if block_kasseta_y5_prd_config_n[meta_y5] else STATE_VAL.ERROR
-
+ # Проверяем состояние после установки
+ if node_y5.state == STATE_VAL.ERROR:
+ all_y5_good = false
+
var block_ip_config_n: Dictionary = for_result_dic.block_ip_config
for power_supply in for_result_dic.node_ip_power_arr:
var meta_ip = power_supply.get_meta('ip')
@@ -134,9 +150,13 @@ static func on_control_result(for_result_dic: Dictionary) -> void:
power_supply.state = STATE_VAL.GOOD if block_ip_config_n[meta_ip][1] else STATE_VAL.ERROR
else:
power_supply.state = STATE_VAL.NONE
-
+ # Проверяем состояние после установки
+ if power_supply.state == STATE_VAL.ERROR:
+ all_y5_good = false
+
if not for_result_dic.control_is_over:
- set_default_state(for_result_dic.default_reset_array_node, for_result_dic.power_amplifier)
+ set_default_state(for_result_dic.default_reset_array_node)
+ set_default_state(for_result_dic.power_amplifier)
return
var result_dic: Dictionary = for_result_dic.result_dic
for f in for_result_dic.fs_nodes:
@@ -144,6 +164,7 @@ static func on_control_result(for_result_dic: Dictionary) -> void:
if result_dic.has(fs_meta):
f.state = result_dic[fs_meta]
+ if not all_y5_good: return
if result_dic.fs_2 == 1 and block_kasseta_y5_prd_config_n['yau07']:
for_result_dic.module_fs_2.state = STATE_VAL.GOOD if result_dic.dkm_2 else STATE_VAL.ERROR
for_result_dic.dou_2.state = STATE_VAL.GOOD if result_dic.dou_2 else STATE_VAL.ERROR
diff --git a/scenes/pribor-prd-v/pribor-prd-v.gd b/scenes/pribor-prd-v/pribor-prd-v.gd
index 7e965f06..fcbadbfc 100644
--- a/scenes/pribor-prd-v/pribor-prd-v.gd
+++ b/scenes/pribor-prd-v/pribor-prd-v.gd
@@ -18,11 +18,12 @@ func _ready() -> void:
for temp in power_amplifier:
temp.value1 = -70
# Подписываемся на сигналы
+ signaller.conn(signaller.start_contol_device, Callable(self, '_on_start_control'))
unit_prd_v.connect('control_is_over', Callable(self, 'on_press_device'))
unit_prd_v.connect('status_updated', Callable(self, '_on_status_updated'))
# Устанавливаем начальный статус
_update_status_text(unit_prd_v.get_current_status())
- on_press_device()
+ on_press_device(unit_prd_v.self_name)
func _process(_delta: float) -> void:
@@ -37,18 +38,19 @@ func _process(_delta: float) -> void:
func set_frame(node_frame: Node, val: int): node_frame.set_frame(val)
-func start_control() -> void:
- set_default_state(get_tree().get_nodes_in_group('default_reset'), get_tree().get_nodes_in_group('power_amplifier'))
+func _on_start_control() -> void:
+ set_default_state(get_tree().get_nodes_in_group('default_reset'))
+ set_default_state(get_tree().get_nodes_in_group('power_amplifier'))
+ for um in get_tree().get_nodes_in_group('power_amplifier'):
+ um.value0 = [0, 0, 0, 0, 0, 0]
find_labels(self)
+ on_press_device(unit_prd_v.self_name)
-static func set_default_state(default_reset_array_node: Array, power_amplifier_arr_node: Array) -> void:
+static func set_default_state(default_reset_array_node: Array) -> void:
for group in default_reset_array_node:
group.state = STATE_VAL.NONE
- for group in power_amplifier_arr_node:
- group.state = STATE_VAL.NONE
-
func _enter_tree() -> void:
if Engine.is_editor_hint():
@@ -78,6 +80,17 @@ static func power_fill(pow_dic: Dictionary, fs_result: Dictionary, power_amplifi
if powamp_meta in ['um_1', 'um_2', 'um_3', 'um_4', 'um_5', 'um_6'] and not fs_result.fs_4: return
if powamp_meta in ['um_9', 'um_10', 'um_11', 'um_12', 'um_13', 'um_14'] and not fs_result.fs_5: return
i_node_powapm.value0 = pow_dic[powamp_meta]
+ # Проверка: если ВСЕ значения в массиве < 1 → STATE_VAL.NONE
+ var power_array: Array = pow_dic[powamp_meta]
+ var all_below_one: bool = true
+ for i_p in power_array:
+ if i_p >= 1:
+ all_below_one = false
+ break
+
+ if all_below_one:
+ i_node_powapm.state = STATE_VAL.NONE
+ continue
var count_above_threshold = 0
for i_p in pow_dic[powamp_meta]:
if i_p >= POWER_THRESHOLD:
@@ -87,7 +100,7 @@ static func power_fill(pow_dic: Dictionary, fs_result: Dictionary, power_amplifi
i_node_powapm.state = status
-func on_press_device() -> void:
+func on_press_device(_device_name: String) -> void:
var nodes_y5: Array = get_tree().get_nodes_in_group('y-5')
var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply')
var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group')
@@ -115,7 +128,7 @@ func on_press_device() -> void:
static func on_control_result(for_result_dic: Dictionary) -> void:
temperature_fill(for_result_dic.power_amplifier, for_result_dic.temperature_um)
-
+ var all_y5_good: bool = true
var block_kasseta_y5_prd_config_v: Dictionary = for_result_dic.block_kasseta_y5_config
var nodes_y5: Array = for_result_dic.nodes_y5
for node_y5 in nodes_y5:
@@ -125,7 +138,10 @@ static func on_control_result(for_result_dic: Dictionary) -> void:
node_y5.state = STATE_VAL.ERROR if meta_y5 == 'yau07' else STATE_VAL.NONE
else:
node_y5.state = STATE_VAL.GOOD if block_kasseta_y5_prd_config_v[meta_y5] else STATE_VAL.ERROR
-
+ # Проверяем состояние после установки
+ if node_y5.state == STATE_VAL.ERROR:
+ all_y5_good = false
+
var block_ip_config_v: Dictionary = for_result_dic.block_ip_config
for power_supply in for_result_dic.node_ip_power_arr:
var meta_ip = power_supply.get_meta('ip')
@@ -133,9 +149,13 @@ static func on_control_result(for_result_dic: Dictionary) -> void:
power_supply.state = STATE_VAL.GOOD if block_ip_config_v[meta_ip][1] else STATE_VAL.ERROR
else:
power_supply.state = STATE_VAL.NONE
+ # Проверяем состояние после установки
+ if power_supply.state == STATE_VAL.ERROR:
+ all_y5_good = false
if not for_result_dic.control_is_over:
- set_default_state(for_result_dic.default_reset_array_node, for_result_dic.power_amplifier)
+ set_default_state(for_result_dic.default_reset_array_node)
+ set_default_state(for_result_dic.power_amplifier)
return
var result_dic: Dictionary = for_result_dic.result_dic
for f in for_result_dic.fs_nodes:
@@ -143,6 +163,7 @@ static func on_control_result(for_result_dic: Dictionary) -> void:
if result_dic.has(fs_meta):
f.state = result_dic[fs_meta]
+ if not all_y5_good: return
if result_dic.fs_5 == 1 and block_kasseta_y5_prd_config_v['yau07']:
for_result_dic.module_fs_5.state = STATE_VAL.GOOD if result_dic.dkm_5 else STATE_VAL.ERROR
for_result_dic.dou_5.state = STATE_VAL.GOOD if result_dic.dou_5 else STATE_VAL.ERROR
diff --git a/scenes/контроль/контроль.tscn b/scenes/контроль/контроль.tscn
index cade3e36..84244bfc 100644
--- a/scenes/контроль/контроль.tscn
+++ b/scenes/контроль/контроль.tscn
@@ -57,11 +57,12 @@ const PRIBORS_RES = \\
var cur_pribor_node = null
+var check_ready_control: Dictionary = {}
+var device_wait_control_result:Array = ['1н', '2н', '3н', '4н', '1в', '2в', '3в', '4в', '1к', '2к', '3к', '4к',]
func on_line_changed(u, conn_node, _pribor_meta): conn_node.set_val(u.online)
func on_serv_changed(u, pribor_node, _pribor_meta): pribor_node.state = int(u.serviceability)
-var count_device_control_is_ready: int = 0
func on_mode_changed():
@@ -102,7 +103,7 @@ func _ready():
prd_module.connect('update_serviceability', Callable(self, 'on_serviceability_changed').bind(prd_module, pribor_node))
prd_module.unit_control.connect('update_progress', Callable(self, 'on_update_progress').bind(pribor_node))
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').bind(prd_module.unit_control))
+ 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))
# Пиктограммы приборов, которые отображают состояние подключения только
@@ -158,11 +159,37 @@ func on_pribor_press(pribor_path, header_text, pribor_node):
add_child(pribor)
+enum STATE_DEVICE {
+ NONE,
+ GOOD,
+ ERROR
+ }
+
func on_serviceability_changed(prd_module: Object, prd_pribor:Node)-> void:
if not prd_module.unit_yau07.online:
- prd_pribor.state = 0
+ prd_pribor.state = STATE_DEVICE.NONE
return
- prd_pribor.state = 1 if prd_module.serviceability else 2
+ print([prd_pribor.get_meta('unit_name'), prd_module.unit_control.current_status])
+ if prd_module.unit_control.flag_control_is_over:
+ var control_results = prd_module.unit_control.get_control_results()
+ var result_dic = control_results.result_dic
+ # Проверяем только основные устройства
+ var critical_devices = ['fs_1', 'fs_2', 'fs_3', 'fs_4', 'fs_5', 'fs_6', 'fs_7',
+ 'dkm_1', 'dkm_2', 'dkm_3', 'dkm_4', 'dkm_5', 'dkm_6', 'dkm_7',
+ 'block_ip', 'dou_2', 'dou_3', 'dou_4', 'dou_5', 'dou_6', 'dou_7']
+ # Проверяем результаты контроля напрямую
+ var all_ok: bool = true
+ for device_key in critical_devices:
+ if result_dic.has(device_key) and result_dic[device_key] is bool:
+ if not result_dic[device_key]:
+ all_ok = false
+ break
+
+ prd_pribor.state = STATE_DEVICE.GOOD if all_ok else STATE_DEVICE.ERROR
+ elif not prd_module.serviceability:
+ prd_pribor.state = STATE_DEVICE.ERROR
+ else:
+ prd_pribor.state = STATE_DEVICE.NONE
func on_update_uf_serviceability(uf_serviceaability: bool, uf_pribor: Node)-> void:
@@ -175,7 +202,9 @@ func _on_chk_show_functional_toggled(toggled_on: bool) -> void:
func _on_control_prd_pressed() -> void:
- count_device_control_is_ready = 0
+ check_ready_control = {}
+ for pribor in get_tree().get_nodes_in_group('pribor_buttons'):
+ pribor.state = STATE_DEVICE.NONE
signaller.emit_signal('start_contol_device')
@@ -188,18 +217,32 @@ func on_update_max_value_progress(max_value_progress: int, pribor_node: Node) ->
pribor_node.progress_max_value = max_value_progress
-func on_control_is_over(pribor_node: Node) -> void:
- if pribor_node.self_name in ['1н', '2н', '3н', '4н', '1в', '2в', '3в', '4в', '1к', '2к', '3к', '4к',]:
- count_device_control_is_ready += 1
- if count_device_control_is_ready == 12:
- var time_dict = Time.get_datetime_dict_from_system()
- $control_prd.text = 'Контроль выполнен %02d:%02d/%02d.%02d' % [
- time_dict.hour,
- time_dict.minute,
- time_dict.day,
- time_dict.month]
- $control_prd.disabled = false
- $control_prd.tooltip_text = 'Нажать для повторного контроля '
+func on_control_is_over(pribor_name: String) -> void:
+ if pribor_name in device_wait_control_result:
+ check_ready_control[pribor_name] = true
+ if not _is_all_control_complete(): return
+ # После завершения контроля всех приборов
+ var time_dict = Time.get_datetime_dict_from_system()
+ $control_prd_button.text = 'Контроль выполнен %02d:%02d/%02d.%02d' % [
+ time_dict.hour,
+ time_dict.minute,
+ time_dict.day,
+ time_dict.month]
+ $control_prd_button.disabled = false
+ $control_prd_button.tooltip_text = 'Нажать для повторного контроля '
+
+
+func _is_all_control_complete() -> bool:
+ for device in device_wait_control_result:
+ if not check_ready_control.get(device, false):
+ return false
+ return true
+
+
+# TODO: Решить что делать с подключением
+func _on_gui_input(_event: InputEvent) -> void:
+ pass
+ #print_debug('Увидел подключение, но не нашел куда сигнал подключается')
"
[sub_resource type="SpriteFrames" id="SpriteFrames_foasq"]
@@ -1941,7 +1984,7 @@ points = PackedVector2Array(-8, 0, 608, 0)
width = 2.0
default_color = Color(1, 1, 1, 0.352941)
-[node name="control_prd" type="Button" parent="."]
+[node name="control_prd_button" type="Button" parent="."]
layout_mode = 0
offset_left = 1043.0
offset_top = 64.0
@@ -1981,4 +2024,4 @@ texture = ExtResource("22_1s34a")
[connection signal="toggled" from="pribor_prd_n_4" to="pribor_prd_n_4" method="_on_toggled"]
[connection signal="toggled" from="pribor_prd_k_4" to="pribor_prd_k_4" method="_on_toggled"]
[connection signal="toggled" from="lbl_header/chk_show_functional" to="." method="_on_chk_show_functional_toggled"]
-[connection signal="pressed" from="control_prd" to="." method="_on_control_prd_pressed"]
+[connection signal="pressed" from="control_prd_button" to="." method="_on_control_prd_pressed"]
diff --git a/scripts/prd.gd b/scripts/prd.gd
index c1b56b06..3f8256ae 100644
--- a/scripts/prd.gd
+++ b/scripts/prd.gd
@@ -277,6 +277,9 @@ class PRD:
func set_um(data_arr):
cmd_array.append([unit_yau07.CmdCode.WRITE_ISA, data_arr])
+
+ func _on_control_completed(_unit_control_name: String)->void:
+ emit_signal('update_serviceability')
func _ready() -> void:
@@ -288,6 +291,7 @@ func _ready() -> void:
var unit_control = TestPRD.new({'unit_prd': unit_prd}, new_prd.cmd_array)
add_child(unit_control)
new_prd.unit_control = unit_control
+ unit_control.control_is_over.connect(new_prd._on_control_completed) # Прямая подписка на метод new_prd
for key in FS_PRD.keys():
var fs = Fs.new(key, FS_PRD[key][0])
fs_dict[key] = fs
diff --git a/scripts/pribor-prd.gd b/scripts/pribor-prd.gd
index 9f444475..9b22c767 100644
--- a/scripts/pribor-prd.gd
+++ b/scripts/pribor-prd.gd
@@ -16,25 +16,26 @@ const PROGRESS_COMPLETE: float = 100.0
## Константы для работы с лучами управления
const RAY_MASK = 0x07
const SPECIAL_LITERAS = [3, 5, 7]
-const RAY_m5: String = "RAY_m5"
-const RAY_5: String = "RAY_5"
-const RAY_15: String = "RAY_15"
-const RAY_25: String = "RAY_25"
-const RAY_35: String = "RAY_35"
-const RAY_45: String = "RAY_45"
+const RAY_m5: String = 'RAY_m5'
+const RAY_5: String = 'RAY_5'
+const RAY_15: String = 'RAY_15'
+const RAY_25: String = 'RAY_25'
+const RAY_35: String = 'RAY_35'
+const RAY_45: String = 'RAY_45'
## Конфигурация лучей: состояния, названия, задержки и требования
const RAY_CONFIG = {
- 0: { "state": "UG_SET_RAY_0", "name": "-5°", "delay": 0.5, "requires_si_fs": true },
- 1: { "state": "UG_SET_RAY_1", "name": "5°", "delay": 0.0, "requires_si_fs": false },
- 2: { "state": "UG_SET_RAY_2", "name": "15°", "delay": 0.0, "requires_si_fs": false },
- 3: { "state": "UG_SET_RAY_3", "name": "25°", "delay": 0.0, "requires_si_fs": false },
- 4: { "state": "UG_SET_RAY_4", "name": "35°", "delay": 0.0, "requires_si_fs": false },
- 5: { "state": "UG_SET_RAY_5", "name": "45°", "delay": 0.0, "requires_si_fs": false },
- 6: { "state": "UG_SET_RAY_0", "name": "сброс", "delay": 0.0, "requires_si_fs": false } # Особый случай
+ 0: { 'state': 'UG_SET_RAY_0', 'name': '-5°', 'requires_si_fs': true },
+ 1: { 'state': 'UG_SET_RAY_1', 'name': '5°', 'requires_si_fs': false },
+ 2: { 'state': 'UG_SET_RAY_2', 'name': '15°', 'requires_si_fs': false },
+ 3: { 'state': 'UG_SET_RAY_3', 'name': '25°', 'requires_si_fs': false },
+ 4: { 'state': 'UG_SET_RAY_4', 'name': '35°', 'requires_si_fs': false },
+ 5: { 'state': 'UG_SET_RAY_5', 'name': '45°', 'requires_si_fs': false },
+ 6: { 'state': 'UG_SET_RAY_0', 'name': 'Контроль', 'requires_si_fs': false } # ДКМ
}
const RAY_TYPES := [RAY_m5, RAY_5, RAY_15, RAY_25, RAY_35, RAY_45]
+const DATA_EXIT_CONTOL_ISA: int = 0
## Перечисление состояний машины контроля ПРД
enum STATE_MACHINE {
@@ -44,6 +45,7 @@ enum STATE_MACHINE {
WRITE_ISA,
READ_ISA,
CHEK_KASSETA_Y5,
+ CHEK_BLOCK_IP,
UG_SET_RAY,
UG_SET_RAY_0,
UG_SET_RAY_1,
@@ -83,6 +85,7 @@ var _data_indices: Dictionary
var _fs_keys: Dictionary
var _temperature_constants: Dictionary
var _ems_input_bits_config: Dictionary
+var _default_states: Dictionary = {} ## Сохраняет состояния по умолчанию для сброса
var _fs_rules: Array
## Основные переменные класса
@@ -111,6 +114,7 @@ var flag_in_control: bool = false
var flag_control_is_over: bool = false
var flag_no_trust_yau07: bool = false
var flag_only_fs: bool = false
+var flag_temperature_ok: bool = true
## Таймеры контроля
var control_timer: Timer = Timer.new()
@@ -125,13 +129,13 @@ var cmd_array: Array
var total_fs_to_check: int = 0
var completed_fs_count: int = 0
var current_fs_progress: float = 0.0
-var current_status: String = "Ожидание запуска контроля"
+var current_status: String = 'Ожидание запуска контроля'
## Сигналы класса
-signal control_is_over() # Когда контроль завершен
+signal control_is_over(device_name: String) # Когда контроль завершен
signal status_updated(status_text: String) # Сигнал для обновления статуса
-signal update_progress(progress_value: float)
-signal update_max_value_progress(max_progress_value: int)
+signal update_progress(progress_value: float) # Обновление статуса выполнения контроля
+signal update_max_value_progress(max_progress_value: int) # Установка максимального значения для прогресс бара
## Свойство прогресса с автоматическим emit сигнала
var progress_value: float:
@@ -148,15 +152,63 @@ func _init(init_data: Dictionary, cmd_array_from_prd: Array) -> void:
unit_prd = init_data['unit_prd']
cmd_array = cmd_array_from_prd
config_manager = PRDConfigManager.new()
- _initialize_config_from_manager()
- _initialize_ray_mapping()
- _initialize_power_structure()
+ _initialize_config_from_manager() # Инициализация конфигурации из менеджера
+ _initialize_ray_mapping() # Инициализация маппинга состояний лучей
+ _initialize_power_structure() # Инициализация структуры данных для хранения мощностей
+
+
+## Инициализация состояний по умолчанию
+func _initialize_default_states() -> void:
+ _default_states = {
+ # Флаги состояния системы
+ 'flag_write_isa': flag_write_isa,
+ 'flag_fs_status_ok': flag_fs_status_ok,
+ 'flag_si_fs_input': flag_si_fs_input,
+ 'flag_si_fs_output': flag_si_fs_output,
+ 'flag_control_is_over': flag_control_is_over,
+ 'flag_no_trust_yau07': flag_no_trust_yau07,
+ 'flag_only_fs': flag_only_fs,
+
+ # Состояние машины и литеры
+ 'state': state,
+ 'current_litera': current_litera,
+
+ # Переменные прогресса
+ 'progress_value': progress_value,
+ 'current_status': current_status,
+ 'total_fs_to_check': total_fs_to_check,
+ 'completed_fs_count': completed_fs_count,
+ 'current_fs_progress': current_fs_progress,
+
+ # Счетчики
+ 'cc': cc,
+
+ # Сокеты ЭМС-Г
+ 'ems_g_sock_dic': ems_g_sock_dic.duplicate(true),
+
+ # Структуры данных (глубокое копирование)
+ 'power_for_litera': _deep_copy_power_structure(),
+ 'control_results': control_results.duplicate(true),
+ 'power_result': power_result.duplicate(true),
+ 'temperature_um': temperature_um.duplicate(true),
+ 'ecms': ecms.duplicate(true),
+
+ # Конфигурации блоков
+ 'block_ip_config': block_ip_config.duplicate(true),
+ 'block_kasseta_y5_config': block_kasseta_y5_config.duplicate(true),
+
+ # Конфигурация устройства
+ 'self_name': self_name,
+ 'constants': constants.duplicate(true),
+ 'pribor_config': pribor_config.duplicate(true),
+ 'fs_parameters': fs_parameters.duplicate(true)
+ }
## Инициализация конфигурации из менеджера
func _initialize_config_from_manager() -> void:
if not config_manager.is_loaded():
- push_error("ConfigManager не загружен!")
+ push_error('ConfigManager не загружен!')
return
_device_constants = config_manager.get_device_constants()
@@ -180,21 +232,22 @@ func _initialize_power_structure() -> void:
## Инициализация при готовности узла
func _ready() -> void:
- _determine_self_name()
- initialize_connections()
- setup_timer()
- _initialize_ray_state_enums()
+ _determine_self_name() # Определение имени и конфигурации устройства
+ _initialize_default_states() # Инициализация состояний по умолчанию
+ initialize_connections() # Инициализация соединений и сигналов
+ setup_timer() # Настройка таймеров контроля
+ _initialize_ray_state_enums() # Инициализация перечислений значений для состояний лучей
## Инициализация маппинга состояний лучей
func _initialize_ray_mapping() -> void:
_ray_state_mapping = {
- STATE_MACHINE.UG_SET_RAY_0: "RAY_m5",
- STATE_MACHINE.UG_SET_RAY_1: "RAY_5",
- STATE_MACHINE.UG_SET_RAY_2: "RAY_15",
- STATE_MACHINE.UG_SET_RAY_3: "RAY_25",
- STATE_MACHINE.UG_SET_RAY_4: "RAY_35",
- STATE_MACHINE.UG_SET_RAY_5: "RAY_45",
+ STATE_MACHINE.UG_SET_RAY_0: 'RAY_m5',
+ STATE_MACHINE.UG_SET_RAY_1: 'RAY_5',
+ STATE_MACHINE.UG_SET_RAY_2: 'RAY_15',
+ STATE_MACHINE.UG_SET_RAY_3: 'RAY_25',
+ STATE_MACHINE.UG_SET_RAY_4: 'RAY_35',
+ STATE_MACHINE.UG_SET_RAY_5: 'RAY_45',
}
@@ -211,6 +264,7 @@ func _initialize_ray_state_enums() -> void:
func _process(_delta: float) -> void:
pass
+var count_packets_power: int = 0
## Обработка данных от ЯУ-07
func on_data_received(unit_pribor: Object) -> void:
@@ -226,7 +280,8 @@ func on_data_received(unit_pribor: Object) -> void:
socket_status_ems_g(status)
block_ip_config = check_block_ip(status, block_ip_config)
temperature_um = check_temperature_um(status)
-
+ flag_temperature_ok = check_overheating(temperature_um)
+
if machine_timer.is_stopped():
return
@@ -239,11 +294,12 @@ func on_data_received(unit_pribor: Object) -> void:
if interes != '':
tek_litera[_get_ray_key(state)] = power_um_ukp(status, current_litera, tek_litera[_get_ray_key(state)])
power_for_litera[current_litera] = tek_litera
+ count_packets_power += 1
## Получение ключа луча по состоянию машины
func _get_ray_key(machine_state: int) -> String:
- return _ray_state_mapping.get(machine_state, "")
+ return _ray_state_mapping.get(machine_state, '')
#endregion
@@ -293,10 +349,11 @@ func state_control_machine() -> void:
STATE_MACHINE.INIT: _handle_init_state()
STATE_MACHINE.FS_TURN_ON: _handle_fs_turn_on_state()
STATE_MACHINE.FS_WORK: _handle_fs_work_state()
- STATE_MACHINE.CHEK_KASSETA_Y5: _handle_check_kasseta_state()
+ STATE_MACHINE.CHEK_KASSETA_Y5: _handle_check_kasseta_state() # Проверка Кассеты У5
+ STATE_MACHINE.CHEK_BLOCK_IP: _handle_check_block_ip_state() # Проверка ИП
STATE_MACHINE.WRITE_ISA: _handle_write_isa_state()
STATE_MACHINE.READ_ISA: _handle_read_isa_state()
- STATE_MACHINE.UG_SET_RAY: _handle_ray_operation() # Режим чтения
+ STATE_MACHINE.UG_SET_RAY: _handle_ray_operation() # Режим чтения
STATE_MACHINE.UG_SET_RAY_0: _handle_ray_operation(0)
STATE_MACHINE.UG_SET_RAY_1: _handle_ray_operation(1)
STATE_MACHINE.UG_SET_RAY_2: _handle_ray_operation(2)
@@ -313,7 +370,7 @@ func state_control_machine() -> void:
## Обработка состояния INIT - инициализация ФС
func _handle_init_state() -> void:
if current_litera in [1, 2, 3, 4, 5, 6, 7]:
- _set_status("Инициализация ФС-%s" % current_litera)
+ _set_status('Инициализация ФС-%s' % current_litera)
var flag_ecm: bool = false
# Проверка доступности ЭМС для текущей литеры
@@ -338,13 +395,13 @@ func _handle_init_state() -> void:
if not device:
result = false
- _set_status("Прибор ПРД-%s: %s" % [self_name, ['неисправен', 'исправен'][int(result)]])
- emit_signal('control_is_over')
+ _set_status('Прибор ПРД-%s: %s' % [self_name, ['неисправен', 'исправен'][int(result)]])
+ emit_signal('control_is_over', self_name)
## Обработка состояния FS_TURN_ON - включение ФС
func _handle_fs_turn_on_state() -> void:
- _set_status("Включение ФС-%s" % current_litera)
+ _set_status('Включение ФС-%s' % current_litera)
manage_fs(true, self_name, pribor_config, fs_parameters, current_litera, constants.POWER_UM)
control_timer.wait_time = constants.TIMER_DELAY
control_timer.start()
@@ -354,20 +411,17 @@ func _handle_fs_turn_on_state() -> void:
## Обработка состояния FS_WORK - проверка работы ФС
func _handle_fs_work_state() -> void:
var flag_ecm: bool = false
-
- # Проверка соответствия ЭМС
+ _set_status('Проверка связи сервиса КАПС РПБ')
for key in ecms:
var params = ecms[key].params.freq
if fs_parameters[current_litera].freq == params:
var kni = ecms[key].kni
if pribor_config[self_name].angle == kni:
flag_ecm = true
-
+
# Если ЭМС доступна и ФС в порядке - запускаем таймер ЭМС
if flag_ecm and flag_fs_status_ok:
- ems_6666_timer.start()
- _set_status("Проверка ФС-%s" % current_litera)
-
+ _set_status('Проверка ФС-%s' % current_litera)
# Проверка завершения работы ФС
if (current_litera == 2 and control_results.fs_2) or \
(current_litera == 3 and control_results.fs_3) or \
@@ -381,12 +435,34 @@ func _handle_fs_work_state() -> void:
## Обработка состояния CHECK_KASSETA - проверка кассеты Y5
func _handle_check_kasseta_state() -> void:
- if block_kasseta_y5_config['yau07']:
- state = STATE_MACHINE.WRITE_ISA
+ _set_status('Проверка кассеты У5')
+ var block_kasseta_y5 = true
+ for case in block_kasseta_y5_config:
+ if not block_kasseta_y5_config[case]:
+ block_kasseta_y5 = false
+ if block_kasseta_y5:
+ if flag_temperature_ok:
+ ems_6666_timer.start()
+ state = STATE_MACHINE.CHEK_BLOCK_IP
+ else:
+ _set_status('Перегрев УМ')
+ state = STATE_MACHINE.IN_EMS_STOP
elif flag_only_fs:
state = STATE_MACHINE.IN_EMS_STOP
+## Обработка состояния CHECK_BLOCK_IP - проверка кассеты Y5
+func _handle_check_block_ip_state() -> void:
+ _set_status('Проверка источников питания')
+ var block_ip = true
+ for ip in block_ip_config:
+ if not block_ip_config[ip][1]:
+ block_ip = false
+ if block_ip:
+ state = STATE_MACHINE.WRITE_ISA
+ elif flag_only_fs:
+ state = STATE_MACHINE.IN_EMS_STOP
+
## Обработка состояния WRITE_ISA - запись в УГ
func _handle_write_isa_state() -> void:
if not flag_write_isa:
@@ -410,8 +486,7 @@ func _handle_ems_stop_state() -> void:
## Обработка состояния FS_TURN_OFF - выключение ФС
func _handle_fs_turn_off_state() -> void:
- ems_6666_timer.stop()
- _set_status("Отключение ФС-%s" % current_litera)
+ _set_status('Отключение ФС-%s' % current_litera)
flag_fs_status_ok = false
manage_fs(false, self_name, pribor_config, fs_parameters, current_litera, constants.POWER_UM)
state = STATE_MACHINE.STOP_CONTROL
@@ -419,7 +494,7 @@ func _handle_fs_turn_off_state() -> void:
## Обработка состояния STOP_CONTROL - завершение контроля
func _handle_stop_control_state() -> void:
- _set_status("Завершение контроля ФС-%s" % current_litera)
+ _set_status('Завершение контроля ФС-%s' % current_litera)
completed_fs_count += 1
_advance_to_next_fs()
state = STATE_MACHINE.INIT
@@ -470,17 +545,15 @@ func _handle_ray_read_mode() -> void:
func _handle_ray_write_mode(ray_num: int) -> void:
if not _can_write_ray(ray_num):
return
-
- var ray_config = RAY_CONFIG[ray_num]
-
+
# Особые условия для луча 0
if ray_num == 0:
control_timer.stop()
-
- # Задержка если требуется
- if ray_config.delay > 0:
- await get_tree().create_timer(ray_config.delay).timeout
-
+
+ # Ожидание пяти пакетов от ЯУ-07
+ if count_packets_power < 5:
+ return
+
# Установка луча
_handle_ug_set_state(ray_num)
flag_write_isa = true
@@ -531,7 +604,7 @@ func _get_ug_address() -> int:
#region UG_OPERATIONS
## Подготовка к настройке и записи в УГ
func _handle_ug_set_state(RAY_DOU_NUM: int) -> void:
- _set_status("Настройка угла %s" % _get_ray_name(RAY_DOU_NUM))
+ _set_status('Настройка угла %s' % _get_ray_name(RAY_DOU_NUM))
var dic_att := {
'RAY_DOU_NUM': RAY_DOU_NUM,
'ADDR_UG_LITERA_1': constants.ADDR_UG_LITERA_1,
@@ -554,11 +627,12 @@ func _handle_ug_set_state(RAY_DOU_NUM: int) -> void:
dic_att['ATT_UM_2'] = constants.ATT_UM_3
flag_write_isa = on_ug_setting(unit_prd, dic_att, cmd_array)
+ count_packets_power = 0
## Получение имени луча по номеру
func _get_ray_name(ray_num: int) -> String:
- return RAY_CONFIG.get(ray_num, {}).get("name", "неизвестный угол")
+ return RAY_CONFIG.get(ray_num, {}).get('name', 'неизвестный угол')
#endregion
@@ -635,7 +709,7 @@ func setup_timer() -> void:
add_child(control_timer)
control_timer.timeout.connect(on_stop_control)
control_timer.one_shot = true
- control_timer.wait_time = constants.get("TIMER_DELAY", 10.0)
+ control_timer.wait_time = constants.get('TIMER_DELAY', 10.0)
# Таймер ЭМС-Г
add_child(ems_6666_timer)
@@ -675,7 +749,7 @@ func _determine_self_name() -> void:
flag_no_trust_yau07 = false
flag_only_fs = false
cc = 0
- state = STATE_MACHINE.get("INIT", 0)
+ state = STATE_MACHINE.get('INIT', 0)
var current_unit = unit_prd.name
var parts = current_unit.split('-')
self_name = parts[-1]
@@ -688,20 +762,20 @@ func _determine_self_name() -> void:
var device_config = _device_constants.get(device_type, {})
var device_data_config = _device_configs.get(device_type, {})
- constants = device_config.get("constants", {})
- pribor_config = device_config.get("pribor_config", {})
+ constants = device_config.get('constants', {})
+ pribor_config = device_config.get('pribor_config', {})
# Конвертация fs_params ключей в int
- var raw_fs_params = device_config.get("fs_params", {})
+ var raw_fs_params = device_config.get('fs_params', {})
fs_parameters = {}
for key in raw_fs_params:
fs_parameters[int(key)] = raw_fs_params[key]
# Загрузка конфигураций блоков
- block_ip_config = _load_block_config(device_data_config.get("block_ip", {}), "block_ip")
- block_kasseta_y5_config = _load_block_config(device_data_config.get("block_kasseta", {}), "block_kasseta")
- control_results = device_data_config.get("control_results", {})
- current_litera = device_config.get("start_litera", 0)
+ block_ip_config = _load_block_config(device_data_config.get('block_ip', {}), 'block_ip')
+ block_kasseta_y5_config = _load_block_config(device_data_config.get('block_kasseta', {}), 'block_kasseta')
+ control_results = device_data_config.get('control_results', {})
+ current_litera = device_config.get('start_litera', 0)
# Определение общего количества ФС для контроля
match self_name:
@@ -720,7 +794,7 @@ func _determine_self_name() -> void:
## Загрузка конфигурации блока
func _load_block_config(config, config_type: String) -> Dictionary:
- if config is String and config == "base":
+ if config is String and config == 'base':
return _base_configs.get(config_type, {}).duplicate(true)
elif config is Dictionary:
return config.duplicate(true)
@@ -774,8 +848,8 @@ func on_interfer_resized(ecms_dic: Dictionary) -> void:
## Обработка запуска контроля устройства
func _on_start_contol_device()-> void:
- _set_status("Подготовка к контролю")
- _determine_self_name()
+ _set_status('Подготовка к контролю')
+ restore_default_states()
machine_timer.wait_time = constants.STATE_MASHINE_TIMER
machine_timer.start()
@@ -783,8 +857,12 @@ func _on_start_contol_device()-> void:
## Обработка изменения режима работы
func on_mode_changed(in_tree: bool) -> void:
flag_in_control = in_tree
- if not in_tree:
- _set_status("Ожидание запуска контроля")
+ if not in_tree: ## При нажатии выхода из режима контроль
+ _set_status('Ожидание запуска контроля')
+ cmd_array.append([unit_prd.CmdCode.WRITE_ISA,[
+ constants.ADDR_UG_LITERA_1, DATA_EXIT_CONTOL_ISA,
+ constants.ADDR_UG_LITERA_2, DATA_EXIT_CONTOL_ISA,
+ constants.ADDR_UG_LITERA_3, DATA_EXIT_CONTOL_ISA]])
flag_control_is_over = false
flag_no_trust_yau07 = false
flag_only_fs = false
@@ -792,8 +870,9 @@ func on_mode_changed(in_tree: bool) -> void:
machine_timer.stop()
state = STATE_MACHINE.INIT
_handle_fs_turn_off_state()
- else:
- _set_status("Ожидание запуска контроля")
+ restore_default_states()
+ else: ## При нажатии на режим контроль
+ _set_status('Ожидание запуска контроля')
#endregion
@@ -976,6 +1055,24 @@ static func check_temperature_um(status_prd: PackedByteArray) -> Dictionary:
return return_dic_temp
+static func check_overheating(temperature_data: Dictionary) -> bool:
+ const MAX_TEMP: int = 55
+ const MIN_VALID_TEMP: int = -1500
+ const MAX_VALID_TEMP: int = 150
+
+ for key in temperature_data:
+ var temp = temperature_data[key]
+
+ # Пропускаем невалидные значения
+ if temp < MIN_VALID_TEMP or temp > MAX_VALID_TEMP:
+ continue
+
+ # Проверяем превышение температуры
+ if temp > MAX_TEMP:
+ return false
+ return true
+
+
## Проверка ДКМ
static func check_dkm(status_prd: PackedByteArray, bit_dkm: int) -> bool:
var dkm: int = 28
@@ -1089,7 +1186,7 @@ static func update_max_power_values(power_data: Array, max_power_values: Array)
## Подготовка принятых данных по контролю для передачи в сцену
static func prep_power(power_dic: Dictionary, prd_name: String)-> Dictionary:
- const RAY_KEYS := ["RAY_m5", "RAY_5", "RAY_15", "RAY_25", "RAY_35", "RAY_45"]
+ const RAY_KEYS := ['RAY_m5', 'RAY_5', 'RAY_15', 'RAY_25', 'RAY_35', 'RAY_45']
var prep_pow_dic: Dictionary = {}
var arr_litera: Array[int]
@@ -1143,7 +1240,6 @@ static func prep_power(power_dic: Dictionary, prd_name: String)-> Dictionary:
## Проверка результатов ДОУ
static func check_dou_result(control_dic: Dictionary, power_dic: Dictionary, pribor: String, litera: int, cnst: Dictionary) -> Dictionary:
- var all_dou_ok = true
var dou: String = 'dou_2' if litera == 2 else 'dou_3'
if pribor == '1к' or pribor == '2к' or pribor == '3к' or pribor == '4к':
dou = 'dou_6' if litera == 6 else 'dou_7'
@@ -1151,7 +1247,8 @@ static func check_dou_result(control_dic: Dictionary, power_dic: Dictionary, pri
dou = 'dou_4' if litera == 4 else 'dou_5'
var ray_dic: Dictionary = power_dic[litera]
- if ray_dic[RAY_m5].size() == 0 or \
+ # Проверка наличия данных
+ if ray_dic[RAY_m5].size() == 0 or \
ray_dic[RAY_5 ].size() == 0 or \
ray_dic[RAY_15].size() == 0 or \
ray_dic[RAY_25].size() == 0 or \
@@ -1159,12 +1256,109 @@ static func check_dou_result(control_dic: Dictionary, power_dic: Dictionary, pri
ray_dic[RAY_45].size() == 0:
control_dic[dou] = false
return control_dic
-
- for i_pow_arr in ray_dic.values():
- for i_pow in i_pow_arr.size():
- if i_pow_arr[i_pow] < cnst.POWER_THRESHOLD:
- all_dou_ok = false
-
- control_dic[dou] = all_dou_ok
+
+ # Подсчет значений ниже порога по позициям
+ var low_power_by_position: Array = [0, 0, 0, 0, 0, 0] # Счетчики для 6 позиций
+ for ray_key in [RAY_m5, RAY_5, RAY_15, RAY_25, RAY_35, RAY_45]:
+ var power_array: Array = ray_dic[ray_key]
+ for i in range(power_array.size()):
+ if power_array[i] < cnst.POWER_THRESHOLD:
+ low_power_by_position[i] += 1
+
+ # Проверяем, нет ли позиции где много низких значений
+ var limit_power_um: int = 2
+ var good_positions: int = 0
+ for count in low_power_by_position:
+ if count <= limit_power_um:
+ good_positions += 1
+ control_dic[dou] = good_positions >= 4
return control_dic
#endregion
+
+#region DEFAULT_STATES
+## Глубокое копирование структуры мощностей
+func _deep_copy_power_structure() -> Dictionary:
+ var copy = {}
+ for litera in power_for_litera:
+ copy[litera] = {}
+ for ray_type in power_for_litera[litera]:
+ copy[litera][ray_type] = power_for_litera[litera][ray_type].duplicate()
+ return copy
+
+## Восстановление состояний по умолчанию
+func restore_default_states() -> void:
+ if _default_states.is_empty():
+ _initialize_default_states()
+
+ # Восстановление простых переменных
+ flag_write_isa = _default_states['flag_write_isa']
+ flag_fs_status_ok = _default_states['flag_fs_status_ok']
+ flag_si_fs_input = _default_states['flag_si_fs_input']
+ flag_si_fs_output = _default_states['flag_si_fs_output']
+ flag_control_is_over = _default_states['flag_control_is_over']
+ flag_no_trust_yau07 = _default_states['flag_no_trust_yau07']
+ flag_only_fs = _default_states['flag_only_fs']
+
+ state = _default_states['state']
+ current_litera = _default_states['current_litera']
+
+ progress_value = _default_states['progress_value']
+ current_status = _default_states['current_status']
+ total_fs_to_check = _default_states['total_fs_to_check']
+ completed_fs_count = _default_states['completed_fs_count']
+ current_fs_progress = _default_states['current_fs_progress']
+
+ cc = _default_states['cc']
+
+ # Восстановление словарей (глубокое копирование)
+ ems_g_sock_dic = _default_states['ems_g_sock_dic'].duplicate(true)
+ power_for_litera = _default_states['power_for_litera'].duplicate(true)
+ control_results = _default_states['control_results'].duplicate(true)
+ power_result = _default_states['power_result'].duplicate(true)
+ temperature_um = _default_states['temperature_um'].duplicate(true)
+ ecms = _default_states['ecms'].duplicate(true)
+ block_ip_config = _default_states['block_ip_config'].duplicate(true)
+ block_kasseta_y5_config = _default_states['block_kasseta_y5_config'].duplicate(true)
+
+ # Остановка таймеров
+ control_timer.stop()
+ ems_6666_timer.stop()
+ machine_timer.stop()
+
+ _set_status('Состояния сброшены к значениям по умолчанию')
+
+## Получение текущих состояний для отладки
+func get_current_states() -> Dictionary:
+ return {
+ 'flags': {
+ 'write_isa': flag_write_isa,
+ 'fs_status_ok': flag_fs_status_ok,
+ 'si_fs_input': flag_si_fs_input,
+ 'si_fs_output': flag_si_fs_output,
+ 'in_control': flag_in_control,
+ 'control_is_over': flag_control_is_over,
+ 'no_trust_yau07': flag_no_trust_yau07,
+ 'only_fs': flag_only_fs
+ },
+ 'state_machine': {
+ 'state': state,
+ 'current_litera': current_litera
+ },
+ 'progress': {
+ 'value': progress_value,
+ 'status': current_status,
+ 'total_fs': total_fs_to_check,
+ 'completed_fs': completed_fs_count,
+ 'current_fs_progress': current_fs_progress
+ },
+ 'counters': {
+ 'cc': cc,
+ 'cmd_array_size': cmd_array.size()
+ },
+ 'results': {
+ 'power_for_litera': power_for_litera,
+ 'power_results': power_result,
+ 'control_results': control_results,
+ }
+ }
+#endregion