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