diff --git a/scenes/pribor-prd-k/pribor-prd-k.gd b/scenes/pribor-prd-k/pribor-prd-k.gd index 735f362..4990050 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.gd +++ b/scenes/pribor-prd-k/pribor-prd-k.gd @@ -17,8 +17,11 @@ func _ready() -> void: var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') for temp in power_amplifier: temp.value1 = -70 + # Подписываемся на сигналы unit_prd_k.connect('control_is_over', Callable(self, 'on_press_device')) - #unit_prd_k.power_amplify = power_amplifier + unit_prd_k.connect('status_updated', Callable(self, '_on_status_updated')) + # Устанавливаем начальный статус + _update_status_text(unit_prd_k.get_current_status()) on_press_device() @@ -52,8 +55,8 @@ static func set_default_state(default_reset_array_node: Array, power_amplifier_a func _enter_tree() -> void: if Engine.is_editor_hint(): return - $control_result.text = 'Ожидается запуск контроля ...' # TODO: Необходимо сделать пулл сообщений - $control_result.add_theme_color_override('font_color', Color.ALICE_BLUE) + if unit_prd_k: + _update_status_text(unit_prd_k.get_current_status()) func _exit_tree() -> void: @@ -104,13 +107,8 @@ func on_press_device() -> void: var dou_6: Node = $dou6_A7 var module_fs_7: Node = $kasseta_fs_kd/ref_A7 var dou_7: Node = $dou7_A8 + var control_data: Dictionary = unit_prd_k.get_control_results() var for_control_result: Dictionary = { - 'control_is_over': unit_prd_k.flag_control_is_over, - 'result_dic': unit_prd_k.control_results, - 'power_dic': unit_prd_k.power_result, - 'block_kasseta_y5_config': unit_prd_k.block_kasseta_y5_config, - 'block_ip_config': unit_prd_k.block_ip_config, - 'temperature_um' : unit_prd_k.temperature_um, 'nodes_y5': nodes_y5, 'node_ip_power_arr': node_ip_power_arr, 'fs_nodes': fs_nodes, @@ -124,6 +122,7 @@ func on_press_device() -> void: 'module_fs_7': module_fs_7, 'dou_7': dou_7, } + for_control_result.merge(control_data, true) on_control_result(for_control_result) @@ -169,12 +168,6 @@ static func on_control_result(for_result_dic: Dictionary) -> void: if block_kasseta_y5_prd_config_k['yau07']: power_fill(for_result_dic.power_dic, for_result_dic.result_dic, for_result_dic.power_amplifier, for_result_dic.POWER_THRESHOLD) - var result: bool = true - for device in result_dic.values(): - if not device: - result = false - log.message(Logger.INFO, 'Прибор ПРД-%s %s' % [for_result_dic.name_prd, ['неисправен', 'исправен'][int(result)]]) - func find_labels(node1: Node): if node1 is Label: @@ -190,3 +183,20 @@ func find_labels(node1: Node): node1.set_meta("tooltip_set", true) for child in node1.get_children(): find_labels(child) + + +func _on_status_updated(status_text: String) -> void: + _update_status_text(status_text) + + +func _update_status_text(text: String) -> void: + $control_result.text = text + # Можно добавить смену цвета в зависимости от статуса + if "Ошибка" in text or "неисправен" in text: + $control_result.add_theme_color_override('font_color', Color.RED) + log.message(Logger.INFO, 'Прибор ПРД-%s неисправен' % [unit_prd_k.self_name]) + elif "Ограничена" in text or "Предупреждение" in text: + $control_result.add_theme_color_override('font_color', Color.YELLOW) + elif "исправен" in text or "завершён" in text: + $control_result.add_theme_color_override('font_color', Color.GREEN) + log.message(Logger.INFO, 'Прибор ПРД-%s исправен' % [unit_prd_k.self_name]) diff --git a/scenes/pribor-prd-n/pribor-prd-n.gd b/scenes/pribor-prd-n/pribor-prd-n.gd index f220e97..efefe61 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.gd +++ b/scenes/pribor-prd-n/pribor-prd-n.gd @@ -17,7 +17,11 @@ func _ready() -> void: var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') for temp in power_amplifier: temp.value1 = -70 + # Подписываемся на сигналы 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() @@ -50,8 +54,8 @@ static func set_default_state(default_reset_array_node: Array, power_amplifier_a func _enter_tree() -> void: if Engine.is_editor_hint(): return - $control_result.text = 'Ожидается запуск контроля ...' # TODO: Необходимо сделать пулл сообщений - $control_result.add_theme_color_override('font_color', Color.ALICE_BLUE) + if unit_prd_n: + _update_status_text(unit_prd_n.get_current_status()) func _exit_tree() -> void: @@ -94,13 +98,8 @@ func on_press_device() -> void: var dou_2: Node = $dou2_A5 var module_fs_3: Node = $kasseta_FS_ND/ref_A3 var dou_3: Node = $dou3_A6 + var control_data: Dictionary = unit_prd_n.get_control_results() var for_control_result: Dictionary = { - 'control_is_over': unit_prd_n.flag_control_is_over, - 'result_dic': unit_prd_n.control_results, - 'power_dic': unit_prd_n.power_result, - 'block_kasseta_y5_config': unit_prd_n.block_kasseta_y5_config, - 'block_ip_config': unit_prd_n.block_ip_config, - 'temperature_um' : unit_prd_n.temperature_um, 'nodes_y5': nodes_y5, 'node_ip_power_arr': node_ip_power_arr, 'fs_nodes': fs_nodes, @@ -113,6 +112,7 @@ func on_press_device() -> void: 'module_fs_3': module_fs_3, 'dou_3': dou_3, } + for_control_result.merge(control_data, true) on_control_result(for_control_result) @@ -154,12 +154,6 @@ static func on_control_result(for_result_dic: Dictionary) -> void: if block_kasseta_y5_prd_config_n['yau07']: power_fill(for_result_dic.power_dic, for_result_dic.result_dic, for_result_dic.power_amplifier, for_result_dic.POWER_THRESHOLD) - var result: bool = true - for device in result_dic.values(): - if not device: - result = false - - log.message(Logger.INFO, 'Прибор ПРД-%s %s' % [for_result_dic.name_prd, ['неисправен', 'исправен'][int(result)]]) func find_labels(node1: Node): @@ -176,3 +170,20 @@ func find_labels(node1: Node): node1.set_meta("tooltip_set", true) for child in node1.get_children(): find_labels(child) + + +func _on_status_updated(status_text: String) -> void: + _update_status_text(status_text) + + +func _update_status_text(text: String) -> void: + $control_result.text = text + # Можно добавить смену цвета в зависимости от статуса + if "Ошибка" in text or "неисправен" in text: + $control_result.add_theme_color_override('font_color', Color.RED) + log.message(Logger.INFO, 'Прибор ПРД-%s неисправен' % [unit_prd_n.self_name]) + elif "Ограничена" in text or "Предупреждение" in text: + $control_result.add_theme_color_override('font_color', Color.YELLOW) + elif "исправен" in text or "завершён" in text: + $control_result.add_theme_color_override('font_color', Color.GREEN) + log.message(Logger.INFO, 'Прибор ПРД-%s исправен' % [unit_prd_n.self_name]) diff --git a/scenes/pribor-prd-v/pribor-prd-v.gd b/scenes/pribor-prd-v/pribor-prd-v.gd index a206b65..432ad64 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.gd +++ b/scenes/pribor-prd-v/pribor-prd-v.gd @@ -17,7 +17,11 @@ func _ready() -> void: var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') for temp in power_amplifier: temp.value1 = -70 + # Подписываемся на сигналы 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() @@ -49,8 +53,8 @@ static func set_default_state(default_reset_array_node: Array, power_amplifier_a func _enter_tree() -> void: if Engine.is_editor_hint(): return - $control_result.text = 'Ожидается запуск контроля ...' # TODO: Необходимо сделать пулл сообщений - $control_result.add_theme_color_override('font_color', Color.ALICE_BLUE) + if unit_prd_v: + _update_status_text(unit_prd_v.get_current_status()) func _exit_tree() -> void: @@ -93,25 +97,19 @@ func on_press_device() -> void: var dou_4: Node = $dou4_A5 var module_fs_5: Node = $kasseta_FS_VD/ref_A2 var dou_5: Node = $dou5_A6 + var control_data = unit_prd_v.get_control_results() var for_control_result: Dictionary = { - 'control_is_over': unit_prd_v.flag_control_is_over, - 'result_dic': unit_prd_v.control_results, - 'power_dic': unit_prd_v.power_result, - 'block_kasseta_y5_config': unit_prd_v.block_kasseta_y5_config, - 'block_ip_config': unit_prd_v.block_ip_config, - 'temperature_um' : unit_prd_v.temperature_um, 'nodes_y5': nodes_y5, 'node_ip_power_arr': node_ip_power_arr, 'fs_nodes': fs_nodes, 'power_amplifier': power_amplifier, 'default_reset_array_node': default_reset_array_node, - 'POWER_THRESHOLD': unit_prd_v.constants.POWER_THRESHOLD, - 'name_prd': unit_prd_v.self_name, 'module_fs_4': module_fs_4, 'dou_4': dou_4, 'module_fs_5': module_fs_5, 'dou_5': dou_5, } + for_control_result.merge(control_data, true) on_control_result(for_control_result) @@ -154,13 +152,6 @@ static func on_control_result(for_result_dic: Dictionary) -> void: if block_kasseta_y5_prd_config_v['yau07']: power_fill(for_result_dic.power_dic, for_result_dic.result_dic, for_result_dic.power_amplifier, for_result_dic.POWER_THRESHOLD) - var result: bool = true - for device in result_dic.values(): - if not device: - result = false - - log.message(Logger.INFO, 'Прибор ПРД-%s %s' % [for_result_dic.name_prd, ['неисправен', 'исправен'][int(result)]]) - func find_labels(node1: Node): if node1 is Label: @@ -176,3 +167,20 @@ func find_labels(node1: Node): node1.set_meta("tooltip_set", true) for child in node1.get_children(): find_labels(child) + + +func _on_status_updated(status_text: String) -> void: + _update_status_text(status_text) + + +func _update_status_text(text: String) -> void: + $control_result.text = text + # Можно добавить смену цвета в зависимости от статуса + if "Ошибка" in text or "неисправен" in text: + $control_result.add_theme_color_override('font_color', Color.RED) + log.message(Logger.INFO, 'Прибор ПРД-%s неисправен' % [unit_prd_v.self_name]) + elif "Ограничена" in text or "Предупреждение" in text: + $control_result.add_theme_color_override('font_color', Color.YELLOW) + elif "исправен" in text or "завершён" in text: + $control_result.add_theme_color_override('font_color', Color.GREEN) + log.message(Logger.INFO, 'Прибор ПРД-%s исправен' % [unit_prd_v.self_name]) diff --git a/scripts/pribor-prd.gd b/scripts/pribor-prd.gd index 9a9d376..f82e7d9 100644 --- a/scripts/pribor-prd.gd +++ b/scripts/pribor-prd.gd @@ -3,7 +3,18 @@ extends Node # Константы const CONFIG_PATH = "user://config/setting_prd_control.json" const DEFAULT_CONFIG_PATH = "res://config/setting_prd_control.json" +# Добавляем константы для прогресса +const PROGRESS_INIT: float = 5.0 +const PROGRESS_FS_TURN_ON: float = 10.0 +const PROGRESS_FS_WORK: float = 20.0 +const PROGRESS_CHECK_KASSETA: float = 25.0 +const PROGRESS_WRITE_ISA: float = 30.0 +const PROGRESS_READ_ISA: float = 35.0 +const PROGRESS_UG_SET_RAY: float = 40.0 +const PROGRESS_RAY_STATES: float = 50.0 +const PROGRESS_COMPLETE: float = 100.0 +# Для маппинга (Возможно уберу в будущем, но это не точно) const RAY_m5: String = "RAY_m5" const RAY_5: String = "RAY_5" const RAY_15: String = "RAY_15" @@ -80,8 +91,17 @@ var machine_timer: Timer = Timer.new() var cc: int = 0 var cmd_array: Array -signal control_is_over() -signal update_progress(progress_value: float) +# Добавляем переменные для отслеживания прогресса +var total_fs_to_check: int = 0 +var completed_fs_count: int = 0 +var current_fs_progress: float = 0.0 +# Переменная для текущего статуса +var current_status: String = "Ожидание запуска контроля" + +# Сигналы Класса +signal control_is_over() # Когда контроль все! +signal status_updated(status_text: String) # Сигнал для обновления статуса +signal update_progress(progress_value: float) signal update_max_value_progress(max_progress_value: int) var progress_value: float: @@ -362,6 +382,7 @@ func state_control_machine() -> void: ## 'Выполняется инициализация ФС-%s' % current_litera func _handle_init_state() -> void: if current_litera in [1, 2, 3, 4, 5, 6, 7]: + _set_status("Инициализация ФС-%s" % current_litera) var flag_ecm: bool = false for key in ecms: var params = ecms[key].params.freq @@ -375,12 +396,18 @@ func _handle_init_state() -> void: flag_control_is_over = true control_results = on_control_result(block_ip_config, control_results) power_result = prep_power(power_for_litera, self_name) - emit_signal('control_is_over') machine_timer.stop() + var result: bool = true + for device in control_results.values(): + if not device: + result = false + _set_status("Прибор ПРД-%s: %s" % [self_name, ['неисправен', 'исправен'][int(result)]]) + emit_signal('control_is_over') ##'Выполняется включение ФС-%s' % current_litera func _handle_fs_turn_on_state() -> void: + _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() @@ -388,6 +415,7 @@ func _handle_fs_turn_on_state() -> void: ##'Выполняется проверка ФС-%s' % current_litera func _handle_fs_work_state() -> void: + _set_status("Проверка ФС-%s" % current_litera) if (current_litera == 2 and control_results.fs_2) or \ (current_litera == 3 and control_results.fs_3) or \ (current_litera == 4 and control_results.fs_4) or \ @@ -400,6 +428,7 @@ func _handle_fs_work_state() -> void: ## Подготовка к настройки и записи в УГ func _handle_ug_set_state(RAY_DOU_NUM: int) -> void: + _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, @@ -421,25 +450,76 @@ func _handle_ug_set_state(RAY_DOU_NUM: int) -> void: flag_write_isa = on_ug_setting(unit_prd, dic_att, cmd_array) + + ## Функция для продвижения статуса прогресс бара func progressbar_status() -> void: + if current_litera == 0: + progress_value = PROGRESS_COMPLETE + await get_tree().create_timer(0.5).timeout + progress_value = 0 + return + + # Базовый прогресс в зависимости от состояния + var base_progress: float = 0.0 + match state: STATE_MACHINE.INIT: - cc += 10 if current_litera in [3, 5, 6, 7] else 0 - if control_timer.get_time_left() > 0: - progress_value = cc + control_timer.get_wait_time() - control_timer.get_time_left() - if current_litera == 0: - progress_value = 0 + base_progress = PROGRESS_INIT + STATE_MACHINE.FS_TURN_ON: + base_progress = PROGRESS_FS_TURN_ON + STATE_MACHINE.FS_WORK: + base_progress = PROGRESS_FS_WORK + STATE_MACHINE.CHEK_KASSETA_Y5: + base_progress = PROGRESS_CHECK_KASSETA + STATE_MACHINE.WRITE_ISA: + base_progress = PROGRESS_WRITE_ISA + STATE_MACHINE.READ_ISA: + base_progress = PROGRESS_READ_ISA + STATE_MACHINE.UG_SET_RAY: + base_progress = PROGRESS_UG_SET_RAY + STATE_MACHINE.UG_SET_RAY_0, STATE_MACHINE.UG_SET_RAY_1: + base_progress = PROGRESS_RAY_STATES + STATE_MACHINE.UG_SET_RAY_2: + base_progress = PROGRESS_RAY_STATES + 10.0 + STATE_MACHINE.UG_SET_RAY_3: + base_progress = PROGRESS_RAY_STATES + 20.0 + STATE_MACHINE.UG_SET_RAY_4: + base_progress = PROGRESS_RAY_STATES + 30.0 + STATE_MACHINE.UG_SET_RAY_5: + base_progress = PROGRESS_RAY_STATES + 40.0 + STATE_MACHINE.IN_EMS_STOP, STATE_MACHINE.FS_TURN_OFF, STATE_MACHINE.STOP_CONTROL: + base_progress = PROGRESS_COMPLETE + + # Плавное заполнение во время ожидания таймера + if control_timer.time_left > 0 and state != STATE_MACHINE.STOP_CONTROL: + var timer_progress = (control_timer.wait_time - control_timer.time_left) / control_timer.wait_time + base_progress = lerp(base_progress - 5.0, base_progress, timer_progress) + + # Распределяем прогресс по ФС + if total_fs_to_check > 0: + var progress_per_fs = PROGRESS_COMPLETE / total_fs_to_check + current_fs_progress = base_progress + progress_value = (completed_fs_count * progress_per_fs) + (current_fs_progress * progress_per_fs / PROGRESS_COMPLETE) + else: + progress_value = base_progress + + progress_value = clamp(progress_value, 0.0, PROGRESS_COMPLETE) ##'Выполняется отключение ФС-%s' % current_litera func _handle_fs_turn_off_state() -> void: + _set_status("Отключение ФС-%s" % current_litera) flag_fs_status_ok = false manage_fs(false, self_name, pribor_config, fs_parameters, current_litera, constants.POWER_UM) ##'Выполняется завершение проверки ФС-%s' % current_litera func _handle_stop_control_state() -> void: + _set_status("Завершение контроля ФС-%s" % current_litera) + # Увеличиваем счетчик завершенных ФС + completed_fs_count += 1 + _advance_to_next_fs() state = STATE_MACHINE.INIT @@ -454,6 +534,9 @@ func _advance_to_next_fs() -> void: 5: current_litera = 0 6: current_litera = 7 7: current_litera = 0 + # Сбрасываем прогресс текущей ФС при переходе к следующей + if current_litera != 0: + current_fs_progress = 0.0 ###################################### @@ -475,6 +558,7 @@ func on_interfer_resized(ecms_dic: Dictionary) -> void: func _on_start_contol_device()-> void: + _set_status("Подготовка к контролю") _determine_self_name() machine_timer.wait_time = constants.STATE_MASHINE_TIMER machine_timer.start() @@ -510,8 +594,19 @@ func _determine_self_name() -> void: control_results = device_data_config.get("control_results", {}) current_litera = device_config.get("start_litera", 0) + # Определяем общее количество ФС для контроля + match self_name: + '1к', '2к', '3к', '4к': + total_fs_to_check = 3 # Литеры 1, 6, 7 + '1н', '2н', '3н', '4н': + total_fs_to_check = 2 # Литеры 2, 3 + '1в', '2в', '3в', '4в': + total_fs_to_check = 2 # Литеры 4, 5 + progress_value = 0 - call_deferred('emit_signal', 'update_max_value_progress', device_config.get("progress_max", 20)) + completed_fs_count = 0 + current_fs_progress = 0.0 + call_deferred('emit_signal', 'update_max_value_progress', 100) func _load_block_config(config, config_type: String) -> Dictionary: @@ -564,12 +659,15 @@ func on_stop_control() -> void: func on_mode_changed(in_tree: bool) -> void: flag_in_control = in_tree if not in_tree: ## TODO: Дополнительная проверка если контроль идет, если нет, то смысла вызывать нет + _set_status("Ожидание запуска контроля") flag_control_is_over = false progress_value = 0 machine_timer.stop() state = STATE_MACHINE.INIT _handle_fs_turn_off_state() #prd_v_module.cmd_array.append([unit_prd_v.CmdCode.WRITE_ISA, [constants_v.ADDR_UG_LITERA_1, ug_work_1, constants_v.ADDR_UG_LITERA_2, ug_work_2]]) + else: + _set_status("Ожидание запуска контроля") func _process_dkm_status(status: PackedByteArray) -> void: @@ -916,3 +1014,41 @@ static func check_dou_result(control_dic: Dictionary, power_dic: Dictionary, pri control_dic[dou] = all_dou_ok return control_dic + + +# Сеттер для статуса +func _set_status(new_status: String) -> void: + if current_status != new_status: + current_status = new_status + call_deferred('emit_signal', 'status_updated', new_status) + + +# Геттер для текущего статуса (чтобы можно было забрать в любой момент) +func get_current_status() -> String: + return current_status + + +func _get_ray_name(ray_num: int) -> String: + match ray_num: + 0: return "-5°" + 1: return "5°" + 2: return "15°" + 3: return "25°" + 4: return "35°" + 5: return "45°" + 6: return "ДКМ" + _: return "неизвестный угол" + + +# Геттер для результатов контроля +func get_control_results() -> Dictionary: + return { + 'control_is_over': flag_control_is_over, + 'result_dic': control_results, + 'power_dic': power_result, + 'block_kasseta_y5_config': block_kasseta_y5_config, + 'block_ip_config': block_ip_config, + 'temperature_um': temperature_um, + 'POWER_THRESHOLD': constants.POWER_THRESHOLD, + 'name_prd': self_name + }