diff --git a/config/setting_prd_control.json b/config/setting_prd_control.json index 31abe742..68b2d301 100644 --- a/config/setting_prd_control.json +++ b/config/setting_prd_control.json @@ -30,7 +30,6 @@ "3": {"freq": 1157.0, "width": 100.0} }, "start_litera": 2, - "progress_max": 20 }, "PRD_V": { "constants": { @@ -62,7 +61,6 @@ "5": {"freq": 1575.0, "width": 110.0} }, "start_litera": 4, - "progress_max": 20 }, "PRD_K": { "constants": { @@ -97,7 +95,6 @@ "7": {"freq": 4750.0, "width": 110.0} }, "start_litera": 1, - "progress_max": 30 } }, "base_configs": { @@ -122,28 +119,32 @@ "block_ip": "base", "block_kasseta": "base", "control_results": { + "block_kasseta":false, "block_ip": false, "temperature": true, "dkm_2": false, "dkm_3": false, "dou_2": false, "dou_3": false, - "fs_2": 0, - "fs_3": 0 + "fs_2": false, + "fs_3": false, + "is_over_control": false, } }, "PRD_V": { "block_ip": "base", "block_kasseta": "base", "control_results": { + "block_kasseta":false, "block_ip": false, "temperature": true, "dkm_4": false, "dkm_5": false, "dou_4": false, "dou_5": false, - "fs_4": 0, - "fs_5": 0 + "fs_4": false, + "fs_5": false, + "is_over_control": false, } }, "PRD_K": { @@ -159,6 +160,7 @@ }, "block_kasseta": "base", "control_results": { + "block_kasseta":false, "block_ip": false, "temperature": true, "dkm_1": false, @@ -166,9 +168,10 @@ "dkm_7": false, "dou_6": false, "dou_7": false, - "fs_1": 0, - "fs_6": 0, - "fs_7": 0 + "fs_1": false, + "fs_6": false, + "fs_7": false, + "is_over_control": false, } } }, diff --git a/scenes/pribor-prd-v/pribor-prd-v.gd b/scenes/pribor-prd-v/pribor-prd-v.gd index 0b320310..500fb19e 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.gd +++ b/scenes/pribor-prd-v/pribor-prd-v.gd @@ -63,11 +63,10 @@ func _enter_tree() -> void: func _exit_tree() -> void: if Engine.is_editor_hint(): return - #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]]) static func temperature_fill(temperature_arr_node: Array, temperature_dic: Dictionary)->void: - for i_node_temperature in temperature_arr_node: + for i_node_temperature in temperature_arr_node: var temperature_meta: String = i_node_temperature.get_meta('um') if not temperature_dic.has(temperature_meta): return i_node_temperature.value1 = temperature_dic[temperature_meta] if temperature_dic[temperature_meta] < 361 else -40 @@ -139,7 +138,6 @@ 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 @@ -150,7 +148,6 @@ 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 diff --git a/scenes/tabs-switch/lbl_ready.gd b/scenes/tabs-switch/lbl_ready.gd index b0893677..62c1e0df 100644 --- a/scenes/tabs-switch/lbl_ready.gd +++ b/scenes/tabs-switch/lbl_ready.gd @@ -1,48 +1,208 @@ extends Label -# Используем более понятные имена переменных -const STATUS_GOOD := {"text": "Исправно", "color": Color.GREEN, "font_color": Color.BLACK} -const STATUS_BAD := {"text": "Отказ", "color": Color.RED, "font_color": Color.WHITE} -var _is_uf_status_initialized: bool = false -var is_prd_operational: bool = true -var is_uf_operational: bool = true +enum PRD_STATE { + NONE, # Нет связи + GOOD, # Исправно + ERR # Отказ +} + +enum DEVICE_STATUS { + ONLINE, # Связь есть + STATUS, # Статус исправности + CONTROL # Контроль завершен +} + +const STATUS_CONFIG := { + PRD_STATE.NONE: {"text": "Нет связи", "color": Color.WHITE, "font_color": Color.BLACK}, + PRD_STATE.GOOD: {"text": "Исправно", "color": Color.GREEN, "font_color": Color.BLACK}, + PRD_STATE.ERR: {"text": "Отказ", "color": Color.RED, "font_color": Color.WHITE} +} + +class DeviceObserver: + var device_name: String + var status: Array = [false, false, false] # [online, operational, control_complete] + var last_results: Dictionary = {} + + func update_online_state(online: bool) -> bool: + if status[DEVICE_STATUS.ONLINE] != online: + status[DEVICE_STATUS.ONLINE] = online + return true + return false + + func update_control_results(results: Dictionary) -> bool: + var changed := false + last_results = results.duplicate() + + if results.get('is_over_control', false): + # Контроль завершен - проверяем все результаты + var all_ok := true + for key in results: + if key != 'is_over_control' and not results[key]: + all_ok = false + break + + if status[DEVICE_STATUS.STATUS] != all_ok or status[DEVICE_STATUS.CONTROL] != true: + status[DEVICE_STATUS.STATUS] = all_ok + status[DEVICE_STATUS.CONTROL] = true + changed = true + else: + # Контроль в процессе - проверяем базовые параметры + var basic_ok: bool = results.get('block_kasseta', false) and \ + results.get('block_ip', false) and \ + results.get('temperature', true) + + if status[DEVICE_STATUS.STATUS] != basic_ok or status[DEVICE_STATUS.CONTROL] != false: + status[DEVICE_STATUS.STATUS] = basic_ok + status[DEVICE_STATUS.CONTROL] = false + changed = true + return changed + +var device_observers: Dictionary = {} +var overall_prd_state: PRD_STATE = PRD_STATE.NONE func _ready() -> void: tooltip_text = 'Нет связи с приборами комплекса' - for prd_module in prd.prd_dict.values(): - prd_module.connect('update_serviceability', Callable(self, 'on_serviceability_changed').bind(prd_module)) - var unit_uf: = network.get_unit_instance('уарэп-эмс') - unit_uf.connect('data_received', Callable(self, 'on_uf_status_receive')) add_theme_color_override("font_color", Color.BLACK) - - -func on_serviceability_changed(unit_prd_module: Object) -> void: - var check_service: bool = true + + # Инициализация наблюдателей + _initialize_observers() + + # Подписка на сигналы ПРД модулей for prd_module in prd.prd_dict.values(): - if prd_module.unit_yau07.online: - if not unit_prd_module.serviceability: - check_service = false - if check_service != is_prd_operational: - is_prd_operational = check_service - _update_serviceability_display() + # Подключаемся к контролю ПРД + if prd_module.unit_control: + prd_module.unit_control.connect('control_results_updated', Callable(self, '_on_prd_control_results').bind(prd_module)) + # Подключаемся к онлайн-статусу ЯУ-07 + if prd_module.unit_yau07: + prd_module.unit_yau07.connect('line_changed', Callable(self, '_on_prd_online_changed').bind(prd_module)) + + # Подписка на УФ + var unit_uf = network.get_unit_instance('уарэп-эмс') + if unit_uf: + unit_uf.data_received.connect(Callable(self, '_on_uf_status_receive')) + + # Инициализация начального состояния + _recalculate_overall_state() -func _update_serviceability_display() -> void: - var status := STATUS_GOOD if (is_uf_operational and is_prd_operational) else STATUS_BAD - text = status.text - modulate = status.color - tooltip_text = 'Результаты обобщенного признака работоспособности изделия' - add_theme_color_override("font_color", status.font_color) +func _initialize_observers() -> void: + var device_names := [ + 'уарэп-яу07-1н', 'уарэп-яу07-1в', 'уарэп-яу07-1к', + 'уарэп-яу07-2н', 'уарэп-яу07-2в', 'уарэп-яу07-2к', + 'уарэп-яу07-3н', 'уарэп-яу07-3в', 'уарэп-яу07-3к', + 'уарэп-яу07-4н', 'уарэп-яу07-4в', 'уарэп-яу07-4к' + ] + + for device_name in device_names: + device_observers[device_name] = DeviceObserver.new() + device_observers[device_name].device_name = device_name -func on_uf_status_receive(unit_uf: Object) -> void: - var KEMS_B = ((unit_uf.status[0] >> 0) & 1) and ((unit_uf.status[0] >> 3) & 1) - var EMS_B_1 = ((unit_uf.status[0] >> 1) & 1) and ((unit_uf.status[0] >> 4) & 1) - var EMS_B_2 = ((unit_uf.status[0] >> 2) & 1) and ((unit_uf.status[0] >> 5) & 1) - var IP27B = ((unit_uf.status[2] >> 6) & 1) - var check_service: bool = KEMS_B and EMS_B_1 and EMS_B_2 and IP27B - if not _is_uf_status_initialized or check_service != is_uf_operational: - is_uf_operational = check_service - _update_serviceability_display() - signaller.emit_signal('update_uf_serviceability', check_service) - _is_uf_status_initialized = true +func _on_prd_online_changed(line_status: Object, prd_module: Object) -> void: + var online: bool = line_status.online + var observer: DeviceObserver = device_observers.get(prd_module.prd_name) + if observer and observer.update_online_state(online): + _recalculate_overall_state() + + +func _on_prd_control_results(results: Dictionary, prd_module: Object) -> void: + var observer: DeviceObserver = device_observers.get(prd_module.prd_name) + if observer and observer.update_control_results(results): + _recalculate_overall_state() + + +func _on_uf_status_receive(_unit_uf: Object) -> void: + # Логика для УФ (раскомментируй если нужно) + # var KEMS_B = ((unit_uf.status[0] >> 0) & 1) and ((unit_uf.status[0] >> 3) & 1) + # var EMS_B_1 = ((unit_uf.status[0] >> 1) & 1) and ((unit_uf.status[0] >> 4) & 1) + # var EMS_B_2 = ((unit_uf.status[0] >> 2) & 1) and ((unit_uf.status[0] >> 5) & 1) + # var IP27B = ((unit_uf.status[2] >> 6) & 1) + # var uf_operational = KEMS_B and EMS_B_1 and EMS_B_2 and IP27B + # signaller.emit_signal('update_uf_serviceability', uf_operational) + pass + + +func _recalculate_overall_state() -> void: + var new_state := PRD_STATE.NONE + var has_online_devices := false + var all_operational := true + + for observer in device_observers.values(): + if observer.status[DEVICE_STATUS.ONLINE]: + has_online_devices = true + + if observer.status[DEVICE_STATUS.CONTROL]: + # Если контроль завершен - строгая проверка + if not observer.status[DEVICE_STATUS.STATUS]: + all_operational = false + break + else: + # Если контроль в процессе - мягкая проверка + if not observer.status[DEVICE_STATUS.STATUS]: + all_operational = false + # Не прерываем, чтобы проверить все устройства + + if has_online_devices: + new_state = PRD_STATE.GOOD if all_operational else PRD_STATE.ERR + else: + new_state = PRD_STATE.NONE + + if overall_prd_state != new_state: + overall_prd_state = new_state + _update_display() + + +func _update_display() -> void: + var config: Dictionary = STATUS_CONFIG[overall_prd_state].duplicate() + + text = config.text + modulate = config.color + add_theme_color_override("font_color", config.font_color) + tooltip_text = _get_tooltip_text() + + +func _get_tooltip_text() -> String: + match overall_prd_state: + PRD_STATE.NONE: + return "Нет связи с приборами комплекса" + PRD_STATE.GOOD: + return "Все приборы комплекса исправны" + PRD_STATE.ERR: + return "Обнаружены неисправности в комплексе" + _: + return "Неизвестное состояние" + + +# Публичные методы для получения информации +func get_device_status(device_name: String) -> Dictionary: + var observer: DeviceObserver = device_observers.get(device_name) + if observer: + return { + "online": observer.status[DEVICE_STATUS.ONLINE], + "operational": observer.status[DEVICE_STATUS.STATUS], + "control_complete": observer.status[DEVICE_STATUS.CONTROL], + "last_results": observer.last_results.duplicate() + } + return {} + + +func get_overall_status() -> Dictionary: + var online_count := 0 + var operational_count := 0 + var control_complete_count := 0 + + for observer in device_observers.values(): + if observer.status[DEVICE_STATUS.ONLINE]: + online_count += 1 + if observer.status[DEVICE_STATUS.STATUS]: + operational_count += 1 + if observer.status[DEVICE_STATUS.CONTROL]: + control_complete_count += 1 + + return { + "overall_state": overall_prd_state, + "online_devices": online_count, + "operational_devices": operational_count, + "total_devices": device_observers.size(), + "control_complete_devices": control_complete_count + } diff --git a/scenes/контроль/контроль.tscn b/scenes/контроль/контроль.tscn index cb8dc49b..7d5de3b3 100644 --- a/scenes/контроль/контроль.tscn +++ b/scenes/контроль/контроль.tscn @@ -67,6 +67,8 @@ func on_serv_changed(u, pribor_node, _pribor_meta): pribor_node.state = int(u.se func on_mode_changed(): clean_pribor_items() reset_pribor_buttons() + $chk_show_functional.visible = false + $chk_show_functional.button_pressed = false func reset_pribor_buttons(): @@ -99,7 +101,7 @@ func _ready(): for item in unit_names: if prd.prd_dict.has(item): var prd_module = prd.prd_dict[item] - prd_module.connect('update_serviceability', Callable(self, 'on_serviceability_changed').bind(prd_module, pribor_node)) + prd_module.connect('update_serviceability', Callable(self, 'on_serviceability_changed').bind(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')) @@ -139,7 +141,7 @@ func clean_pribor_items(): func on_pribor_press(pribor_path, header_text, pribor_node): if cur_pribor_node: cur_pribor_node.show_functional = false - $lbl_header/chk_show_functional.button_pressed = false + $chk_show_functional.button_pressed = false cur_pribor_node = pribor_node clean_pribor_items() var pribor_obj = load(pribor_path) @@ -151,6 +153,7 @@ func on_pribor_press(pribor_path, header_text, pribor_node): push_error('экземпляр не создан: \\\"%s\\\" (%s)' % [pribor_path, header_text]) return $lbl_header.text = header_text + $chk_show_functional.visible = true var meta_list = pribor_node.get_meta_list() if meta_list.find('unit_name') > -1: var unit_name = pribor_node.get_meta('unit_name') @@ -160,37 +163,9 @@ func on_pribor_press(pribor_path, header_text, pribor_node): update_pribor_items_visibility() -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 = STATE_DEVICE.NONE - return - print([prd_pribor.get_meta('unit_name'), prd_module.unit_control.current_status]) - if prd_module.unit_control.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_serviceability_changed(state: int, prd_pribor_node: Node)-> void: + prd_pribor_node.state = state func on_update_uf_serviceability(uf_serviceaability: bool, uf_pribor: Node)-> void: @@ -205,7 +180,7 @@ func _on_chk_show_functional_toggled(toggled_on: bool) -> void: func _on_control_prd_pressed() -> void: check_ready_control = {} for pribor in get_tree().get_nodes_in_group('pribor_buttons'): - pribor.state = STATE_DEVICE.NONE + pribor.state = 0 # NONE signaller.emit_signal('start_contol_device') @@ -240,10 +215,18 @@ func _is_all_control_complete() -> bool: return true -# TODO: Решить что делать с подключением -func _on_gui_input(_event: InputEvent) -> void: - pass - #print_debug('Увидел подключение, но не нашел куда сигнал подключается') +func _on_gui_input(event: InputEvent) -> void: + if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT: + if cur_pribor_node: + cur_pribor_node.show_functional = false + var pribor_buttons := get_tree().get_nodes_in_group('pribor_buttons') + for node in pribor_buttons: + node.button_pressed = false + clean_pribor_items() + cur_pribor_node = null + $chk_show_functional.button_pressed = false + $chk_show_functional.visible = false + $lbl_header.text = \"\" func on_control_button_pressed(state: bool) -> void: @@ -509,6 +492,7 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_prd_n_1"] +visible = false light_mask = 3 position = Vector2(35, -10) scale = Vector2(0.625, 0.625) @@ -551,6 +535,14 @@ offset_bottom = 830.0 scale = Vector2(0.97094, 0.97094) texture = ExtResource("9_qe1go") +[node name="connect_pribor2" type="AnimatedSprite2D" parent="pribor_prd_n_1"] +light_mask = 3 +position = Vector2(35, -10) +scale = Vector2(0.625, 0.625) +sprite_frames = SubResource("SpriteFrames_foasq") +frame_progress = 0.72355 +script = ExtResource("11_u7tym") + [node name="pribor_uf" type="TextureButton" parent="." groups=["pribor_buttons"]] editor_description = "Кнопка для выбора прибора." layout_mode = 0 @@ -1044,6 +1036,7 @@ patch_margin_right = 16 patch_margin_bottom = 16 [node name="connect_pribor" type="AnimatedSprite2D" parent="pribor_prd_n_2"] +visible = false light_mask = 3 position = Vector2(37, -10) scale = Vector2(0.625, 0.625) @@ -1934,12 +1927,13 @@ text = "Контроль исправности прибора" horizontal_alignment = 1 vertical_alignment = 1 -[node name="chk_show_functional" type="CheckButton" parent="lbl_header"] +[node name="chk_show_functional" type="CheckButton" parent="."] +visible = false layout_mode = 0 -offset_left = 940.0 -offset_top = -1.0 -offset_right = 1319.0 -offset_bottom = 33.0 +offset_left = 1028.0 +offset_top = 26.0 +offset_right = 1407.0 +offset_bottom = 60.0 theme_override_font_sizes/font_size = 22 text = "Показть функциональную схему Э2" flat = true @@ -2037,5 +2031,5 @@ texture = ExtResource("22_1s34a") [connection signal="toggled" from="pribor_prd_v_4" to="pribor_prd_v_4" method="_on_toggled"] [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="toggled" from="chk_show_functional" to="." method="_on_chk_show_functional_toggled"] [connection signal="pressed" from="control_prd_button" to="." method="_on_control_prd_pressed"] diff --git a/scripts/prd.gd b/scripts/prd.gd index 836a322c..2612f33e 100644 --- a/scripts/prd.gd +++ b/scripts/prd.gd @@ -151,17 +151,26 @@ class Fs: class PRD: + enum STATE_DEVICE { + NONE, + GOOD, + ERROR + } var prd_name: String ## Имя прибора - var unit_yau07 ## Юнит эмс + var unit_yau07: Object ## Юнит эмс var unit_control: Object ## Класс проверки прибора ПРД var fs_dic: Dictionary ## Массив блоков ФС var yemsg_board: yemsboards.EmsBoard ## Плата ЭМС-Г var state = PrdState.WORK var cmd_array: Array ## Очередь команд var ug_online: bool = false ## Состояние ячейки УГ - var serviceability: bool = false var set_ug_state: bool = true ## Необходимо ли записать в УГ настройки - signal update_serviceability() + signal update_serviceability(state: int) ## Сообщает изменение текущего состояния юнита ПРД + var serviceability: int: + set(v): + if v != serviceability: + serviceability = v + emit_signal('update_serviceability', v) func _init(u_name, u_yau07): prd_name = u_name @@ -201,11 +210,11 @@ class PRD: func on_line_changed(unit_ems): - emit_signal('update_serviceability') if not unit_ems.online: yemsg_board.ems_load = yemsg_board.LoadState.NOT_DEFINED yemsg_board.set_wait() set_ug_state = true + serviceability = STATE_DEVICE.NONE func on_data_received(_u): set_prd_status() @@ -222,33 +231,79 @@ class PRD: execute_cmd() return execute_cmd() - - func set_prd_status(): + + ## Мониторинг состояния юнита прд + func set_prd_status() -> void: + # Обновление статуса платы ЯУ-07 yemsg_board.set_status(unit_yau07.status) + + # Проверка онлайн-статусов основных модулей ug_online = (unit_yau07.status[0] >> 1) & 1 - if not ug_online: - set_ug_state = true var ukp_1_online = (unit_yau07.status[0] >> 2) & 1 var ukp_2_online = (unit_yau07.status[0] >> 3) & 1 - var ems_g_online = (unit_yau07.status[0] & 1) & 1 + var ems_g_online = (unit_yau07.status[0] & 1) & 1 + + # Установка флага состояния УГ + if not ug_online: + set_ug_state = true + + # Проверка источников питания + var ip_online: bool = _check_dry_contact(unit_yau07.status, prd_name) + var check_temperature_um: bool = unit_control.flags.temperature_ok + var check_dic: Dictionary = { + 'ukp_1_online': ukp_1_online, + 'ukp_2_online': ukp_2_online, + 'ems_g_online': ems_g_online, + 'ip_online': ip_online, + 'ug_online': ug_online, + 'temperature_um': check_temperature_um + } + # Определение состояния обслуживания + if unit_control: + if unit_control.flags.control_is_over: + serviceability = _set_serviceability_from_control_results(unit_control) + else: + serviceability = _set_serviceability_from_online_status(check_dic) + + ## Проверка онлайн-статуса сухих контактов + static func _check_dry_contact(unit_yau07_status: PackedByteArray, self_name: String) -> bool: var bit_ip_config: Array = [0, 1, 2, 3, 4, 5, 6, 7] - var ip_online: bool = true - var is_k_type: bool = prd_name in ['уарэп-яу07-1к', 'уарэп-яу07-2к', 'уарэп-яу07-3к', 'уарэп-яу07-4к'] + var is_k_type: bool = self_name in ['уарэп-яу07-1к', 'уарэп-яу07-2к', 'уарэп-яу07-3к', 'уарэп-яу07-4к'] for bit in bit_ip_config: - var status: bool = unit_yau07.status[27] >> bit & 1 - # Игнорируем биты 5 и 6 для всех приборов, кроме типа "к" - if not is_k_type and (bit == 5 or bit == 6): + if not is_k_type and bit in [5, 6]: # Игнорируем биты 5 и 6 для всех приборов, кроме типа "к" continue + var status: bool = unit_yau07_status[27] >> bit & 1 if status: - ip_online = false + return false + return true + + ## Установка состояния обслуживания на основе результатов контроля + static func _set_serviceability_from_control_results(unit_ctrl: Object) -> int: + var control_results = unit_ctrl.get_control_results() + var result_dic = control_results.result_dic + const CRITICAL_DEVICES: Array = [ + '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 + return STATE_DEVICE.GOOD if all_ok else STATE_DEVICE.ERROR + + ## Установка состояния обслуживания на основе онлайн-статусов + static func _set_serviceability_from_online_status(check_dic: Dictionary) -> int: + var all_online: bool = true + for status in check_dic: + if not check_dic[status]: + all_online = false break - - var check_serviceability = ug_online and ukp_1_online and ukp_2_online and ems_g_online and ip_online - if serviceability != check_serviceability: - serviceability = check_serviceability - emit_signal('update_serviceability') - - + return STATE_DEVICE.NONE if all_online else STATE_DEVICE.ERROR + + func execute_cmd(): if not len(cmd_array): return if unit_yau07.cmd_state != unit_yau07.CmdState.DONE: return @@ -290,8 +345,6 @@ 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: @@ -303,7 +356,6 @@ 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 aa541ef5..2439cca3 100644 --- a/scripts/pribor-prd.gd +++ b/scripts/pribor-prd.gd @@ -105,14 +105,14 @@ var _fs_rules: Array ## Основные переменные класса var config_manager: PRDConfigManager var unit_prd: Object +var control_results: Dictionary +var power_result: Dictionary var constants: Dictionary var pribor_config: Dictionary var fs_parameters: Dictionary var block_ip_config: Dictionary var block_kasseta_y5_config: Dictionary var temperature_um: Dictionary -var control_results: Dictionary -var power_result: Dictionary var ecms: Dictionary var power_for_litera: Dictionary var self_name: String @@ -152,9 +152,10 @@ var current_fs_progress: float = 0.0 var current_status: String = 'Ожидание запуска контроля' ## Сигналы класса -signal control_is_over(device_name: String) # Когда контроль завершен -signal status_updated(status_text: String) # Сигнал для обновления статуса -signal update_progress(progress_value: float) # Обновление статуса выполнения контроля +signal control_is_over(device_name: String) # Когда контроль завершен +signal status_updated(status_text: String) # Сигнал для обновления статуса +signal control_results_updated(control_results: Dictionary) # Обновление результатов контроля +signal update_progress(progress_value: float) # Обновление статуса выполнения контроля signal update_max_value_progress(max_progress_value: int) # Установка максимального значения для прогресс бара ## Свойство прогресса с автоматическим emit сигнала @@ -282,23 +283,19 @@ func _process(_delta: float) -> void: ## Обработка данных от ЯУ-07 func on_data_received(unit_pribor: Object) -> void: - if not flags.in_control: - return - var status: PackedByteArray = unit_pribor.status - block_kasseta_y5_config = check_block_kasseta_y5(status, block_kasseta_y5_config, flags.no_trust_yau07) - if flags.no_trust_yau07: - return - - socket_status_ems_g(status) - block_ip_config = check_block_ip(status, block_ip_config) temperature_um = check_temperature_um(status) flags.temperature_ok = check_overheating(temperature_um) - if machine_timer.is_stopped(): - return - + block_ip_config = check_block_ip(status, block_ip_config) + block_kasseta_y5_config = check_block_kasseta_y5(status, block_kasseta_y5_config, flags.no_trust_yau07) + _set_control_result('block_kasseta', on_y5_control_result(block_kasseta_y5_config)) + _set_control_result('temperature', flags.temperature_ok) + _set_control_result('block_ip', on_dry_control_result(block_ip_config)) + if not flags.in_control: return + if machine_timer.is_stopped(): return + if flags.no_trust_yau07: return + socket_status_ems_g(status) _process_dkm_status(status) - # Формирование мощностей в литерах if current_litera != 0: var tek_litera: Dictionary = power_for_litera[current_litera] @@ -361,10 +358,10 @@ func socket_status_ems_g(packet_form_yau_07: PackedByteArray) -> void: func state_control_machine() -> void: match state: 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() # Проверка Кассеты У5 STATE_MACHINE.CHEK_BLOCK_IP: _handle_check_block_ip_state() # Проверка ИП + STATE_MACHINE.FS_TURN_ON: _handle_fs_turn_on_state() + STATE_MACHINE.FS_WORK: _handle_fs_work_state() STATE_MACHINE.READ_ISA: _handle_read_isa_state() STATE_MACHINE.UG_SET_RAY_CTRL: _handle_ray_operation(6) STATE_MACHINE.UG_SET_RAY: _handle_ray_operation() # Режим чтения @@ -386,20 +383,19 @@ func _handle_init_state() -> void: if current_litera in [1, 2, 3, 4, 5, 6, 7]: _set_status('Инициализация ФС-%s' % current_litera) if _get_current_ecm(): return - state = STATE_MACHINE.FS_TURN_ON + state = STATE_MACHINE.CHEK_KASSETA_Y5 else: if _get_current_ecm(): return # Завершение контроля если литеры закончились flags.control_is_over = true - control_results = on_control_result(block_ip_config, control_results) power_result = prep_power(power_for_litera, self_name) machine_timer.stop() + _set_control_result('is_over_control', flags.control_is_over) 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', self_name) @@ -429,11 +425,9 @@ static func take_ecm_id(ecm_dic: Dictionary, device_name: String, current_lit: i func _handle_fs_work_state() -> void: _set_status('Проверка связи сервиса КАПС РПБ') if not flags.ecm_is_comming: return - #print([self_name, current_ecm_key , ecms[current_ecm_key]]) - # Если ЭМС доступна и ФС в порядке - запускаем таймер ЭМС if current_ecm_key != 0 and flags.fs_status_ok: _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 \ @@ -443,9 +437,12 @@ func _handle_fs_work_state() -> void: (current_litera == 1 and control_results.fs_1): if not block_kasseta_y5_config['yau07']: _set_status('Ожидание данных от ЯУ-07...') - return # НЕ переходим дальше пока нет данных + return # НЕ переходим дальше пока нет данных от сервиса МП550 - state = STATE_MACHINE.CHEK_KASSETA_Y5 + if flags.only_fs: + state = STATE_MACHINE.IN_EMS_STOP + else: + state = STATE_MACHINE.UG_SET_RAY_5 if current_litera == 1 else STATE_MACHINE.UG_SET_RAY_CTRL ## Обработка состояния CHECK_KASSETA - проверка кассеты Y5 @@ -463,9 +460,9 @@ func _handle_check_kasseta_state() -> void: _set_status('Перегрев УМ') state = STATE_MACHINE.IN_EMS_STOP else: - #flag_only_fs = true - _set_status('Касета У5: ERROR') - state = STATE_MACHINE.IN_EMS_STOP + flags.flag_only_fs = true + _set_status('Касета У5: ERROR, Проверка ФС.') + state = STATE_MACHINE.FS_TURN_ON ## Обработка состояния CHECK_BLOCK_IP - проверка кассеты Y5 @@ -475,13 +472,8 @@ func _handle_check_block_ip_state() -> void: for ip in block_ip_config: if not block_ip_config[ip][1]: block_ip = false - if block_ip: - if current_litera == 1: - state = STATE_MACHINE.UG_SET_RAY_5 - else: - state = STATE_MACHINE.UG_SET_RAY_CTRL - elif flags.only_fs: - state = STATE_MACHINE.IN_EMS_STOP + + state = STATE_MACHINE.FS_TURN_ON if block_ip else STATE_MACHINE.IN_EMS_STOP ## Обработка состояния READ_ISA - чтение из УГ @@ -982,13 +974,21 @@ func get_control_results() -> Dictionary: #region STATIC_UTILITY_METHODS ## Итоговое заключение по результатам контроля всех ИП -static func on_control_result(ip_config: Dictionary, ctrl_results: Dictionary) -> Dictionary: +static func on_dry_control_result(ip_config: Dictionary) -> bool: var all_blocks_ip_ok = true for block in ip_config: if not ip_config[block][1]: all_blocks_ip_ok = false - ctrl_results['block_ip'] = all_blocks_ip_ok - return ctrl_results + return all_blocks_ip_ok + + +## Итоговое заключение по результатам контроля кассеты у5 +static func on_y5_control_result(block_kasseta: Dictionary) -> bool: + var all_blocks_y5_ok = true + for block in block_kasseta: + if not block_kasseta[block]: + all_blocks_y5_ok = false + return all_blocks_y5_ok ## Установка угла и аттенюации для УМ @@ -1072,13 +1072,18 @@ static func check_temperature_um(status_prd: PackedByteArray) -> Dictionary: temperature_ukp_1 = status_prd.decode_u16(Constants.TEMPERATURE_UKP_1 + 2 * i_temp) tmp_1 = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * TEMP + 3) return_dic_temp[arr_um[i_temp]] = tmp_1 - + else: + for i_temp in 8: + return_dic_temp[arr_um[i_temp]] = -999 # Заполняем нулями если УКП нет на связи + if ukp2_online: for i_temp in 8: var temperature_ukp_2: int = status_prd.decode_u16(Constants.TEMPERATURE_UKP_2 + 2 * i_temp) var tmp_2: int = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_2) * TEMP + 3) return_dic_temp[arr_um[i_temp+8]] = tmp_2 - + else: + for i_temp in 8: + return_dic_temp[arr_um[i_temp+8]] = -999 # Заполняем -999 если УКП нет на связи return return_dic_temp @@ -1372,3 +1377,16 @@ func get_current_states() -> Dictionary: } } #endregion + +#region setters +func _set_control_result(key: String, status: bool)-> void: + var old_value = control_results.get(key) + if key == 'is_over_control' or old_value != status: + control_results[key] = status + emit_signal('control_results_updated', control_results) + print_debug('control_results_updated: ',[key, status]) + + +func _get_control_result(key: String) -> bool: + return control_results[key] +#endregion diff --git a/table/table.gd b/table/table.gd index 914622a7..2ce94dc9 100644 --- a/table/table.gd +++ b/table/table.gd @@ -309,7 +309,7 @@ func cleanup_invalid_selectors(): keys_to_remove.append(key) for key in keys_to_remove: nodes.erase(key) - print("Удален невалидный селектор: ", key) + print_debug("Удален невалидный селектор: ", key) ## func clear_rows_selected():