From 7954048f113497d8764e6fd7f13ed2863cc7ff92 Mon Sep 17 00:00:00 2001 From: TotMaxim Date: Sat, 22 Nov 2025 01:30:51 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=BC=D0=B5=D0=B6=D1=83?= =?UTF-8?q?=D1=82=D0=BE=D1=87=D0=BD=D0=B0=D1=8F=20=D1=84=D0=B8=D0=BA=D1=81?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/контроль/блок-в.tscn | 2 +- scripts/pribor-prd.gd | 205 ++++++++++++++++++++++++------------ 2 files changed, 136 insertions(+), 71 deletions(-) diff --git a/scenes/контроль/блок-в.tscn b/scenes/контроль/блок-в.tscn index 69bb8d25..87f8b08e 100644 --- a/scenes/контроль/блок-в.tscn +++ b/scenes/контроль/блок-в.tscn @@ -476,7 +476,7 @@ size_flags_horizontal = 3 size_flags_vertical = 3 tooltip_text = " Текущее: 0.00 -Диапазон: -40.00…60.00" +Диапазон: -40.00…55.00" mouse_filter = 0 min_value = -40.0 max_value = 55.0 diff --git a/scripts/pribor-prd.gd b/scripts/pribor-prd.gd index 5349de52..ab0e4dd0 100644 --- a/scripts/pribor-prd.gd +++ b/scripts/pribor-prd.gd @@ -15,12 +15,25 @@ const PROGRESS_RAY_STATES: float = 50.0 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_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 } # Особый случай +} const RAY_TYPES := [RAY_m5, RAY_5, RAY_15, RAY_25, RAY_35, RAY_45] enum STATE_MACHINE { @@ -64,6 +77,7 @@ var ems_input_bits_config: Dictionary var fs_rules: Array var _ray_state_mapping: Dictionary +var _ray_state_enums: Dictionary = {} # Переменные класса var constants: Dictionary var pribor_config: Dictionary @@ -134,6 +148,7 @@ func _ready() -> void: _determine_self_name() initialize_connections() setup_timer() + _initialize_ray_state_enums() func _get_ray_key(machine_state: int) -> String: @@ -288,7 +303,7 @@ func on_fs_update_state(packet_type_7: Dictionary, fs_mapping: Dictionary) -> vo flag_fs_status_ok = control_results[fs_key] == 1 -## +# Обновленная машина состояний func state_control_machine() -> void: match state: STATE_MACHINE.INIT: @@ -321,66 +336,42 @@ func state_control_machine() -> void: _handle_read_isa(unit_prd, [constants.ADDR_UG_LITERA_1, constants.ADDR_UG_LITERA_2, constants.ADDR_UG_LITERA_3], cmd_array) flag_write_isa = false state = STATE_MACHINE.UG_SET_RAY + + # Упрощенные состояния лучей STATE_MACHINE.UG_SET_RAY: - var addr: int = constants.ADDR_UG_LITERA_1 - if current_litera == 3 or current_litera == 5 or current_litera == 7: - addr = constants.ADDR_UG_LITERA_2 - if unit_prd.isa_ports.has(addr) and (unit_prd.cmd_state == unit_prd.CmdState.DONE): - if unit_prd.isa_ports[addr] & 0x07 == 0: - state = STATE_MACHINE.UG_SET_RAY_1 - elif unit_prd.isa_ports[addr] & 0x07 == 1: - state = STATE_MACHINE.UG_SET_RAY_2 - elif unit_prd.isa_ports[addr] & 0x07 == 2: - state = STATE_MACHINE.UG_SET_RAY_3 - elif unit_prd.isa_ports[addr] & 0x07 == 3: - state = STATE_MACHINE.UG_SET_RAY_4 - elif unit_prd.isa_ports[addr] & 0x07 == 4: - state = STATE_MACHINE.UG_SET_RAY_5 - elif unit_prd.isa_ports[addr] & 0x07 == 5: - if not current_litera == 1: - control_results = check_dou_result(control_results, power_for_litera, self_name, current_litera, constants) - state = STATE_MACHINE.IN_EMS_STOP - elif unit_prd.isa_ports[addr] & 0x07 == 6: - state = STATE_MACHINE.UG_SET_RAY_0 - if current_litera == 1: - state = STATE_MACHINE.UG_SET_RAY_5 - + _handle_ray_operation() # Режим чтения + STATE_MACHINE.UG_SET_RAY_0: - if flag_si_fs_input and not flag_write_isa: - control_timer.stop() - _handle_ug_set_state(0x0) - await get_tree().create_timer(0.5).timeout - state = STATE_MACHINE.READ_ISA + _handle_ray_operation(0) + STATE_MACHINE.UG_SET_RAY_1: - if not flag_write_isa: - _handle_ug_set_state(0x1) - state = STATE_MACHINE.READ_ISA + _handle_ray_operation(1) + STATE_MACHINE.UG_SET_RAY_2: - if not flag_write_isa: - _handle_ug_set_state(0x2) - state = STATE_MACHINE.READ_ISA + _handle_ray_operation(2) + STATE_MACHINE.UG_SET_RAY_3: - if not flag_write_isa: - _handle_ug_set_state(0x3) - state = STATE_MACHINE.READ_ISA + _handle_ray_operation(3) + STATE_MACHINE.UG_SET_RAY_4: - if not flag_write_isa: - _handle_ug_set_state(0x4) - state = STATE_MACHINE.READ_ISA + _handle_ray_operation(4) + STATE_MACHINE.UG_SET_RAY_5: - if not flag_write_isa: - _handle_ug_set_state(0x5) - state = STATE_MACHINE.READ_ISA + _handle_ray_operation(5) + STATE_MACHINE.IN_EMS_STOP: ems_6666_timer.stop() state = STATE_MACHINE.FS_TURN_OFF + STATE_MACHINE.FS_TURN_OFF: ems_6666_timer.stop() _handle_fs_turn_off_state() state = STATE_MACHINE.STOP_CONTROL + STATE_MACHINE.STOP_CONTROL: _handle_stop_control_state() - ## В машине состояний вызов изменения состояния прогресс бара контроля + + # Обновление прогресс-бара if block_kasseta_y5_config['yau07'] or flag_no_trust_yau07: progressbar_status() @@ -456,9 +447,8 @@ 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 @@ -466,7 +456,6 @@ func progressbar_status() -> void: progress_value = 0 return - # Базовый прогресс в зависимости от состояния var base_progress: float = 0.0 match state: @@ -484,16 +473,10 @@ func progressbar_status() -> void: 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: + STATE_MACHINE.UG_SET_RAY_0, STATE_MACHINE.UG_SET_RAY_1, STATE_MACHINE.UG_SET_RAY_2, \ + STATE_MACHINE.UG_SET_RAY_3, STATE_MACHINE.UG_SET_RAY_4, STATE_MACHINE.UG_SET_RAY_5: + # Для всех состояний лучей используем одинаковый прогресс 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 @@ -502,11 +485,21 @@ func progressbar_status() -> void: 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) + # Учитываем прогресс по лучам внутри UG_SET_RAY состояния + if state == STATE_MACHINE.UG_SET_RAY: + var addr: int = _get_ug_address() + if _can_process_ray_state(addr): + var ray_value = unit_prd.isa_ports[addr] & RAY_MASK + # Используем маппинг из RAY_CONFIG для более точного прогресса + var max_ray_value = 5.0 # максимальное значение луча для прогресса + var ray_progress = float(ray_value) / max_ray_value * 40.0 + base_progress += ray_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) + var progress_per_fs = (PROGRESS_COMPLETE - PROGRESS_INIT) / total_fs_to_check + var fs_base_progress = completed_fs_count * progress_per_fs + progress_value = fs_base_progress + (base_progress * progress_per_fs / PROGRESS_COMPLETE) else: progress_value = base_progress @@ -562,6 +555,13 @@ func initialize_connections() -> void: signaller.connect('режим_контроль', Callable(self, 'on_mode_changed').bind(true)) +# Инициализация маппинга имен состояний в enum значения +func _initialize_ray_state_enums() -> void: + for ray_value in RAY_CONFIG: + var state_name = RAY_CONFIG[ray_value].state + _ray_state_enums[state_name] = STATE_MACHINE.get(state_name) + + func on_interfer_resized(ecms_dic: Dictionary) -> void: ecms = ecms_dic @@ -635,6 +635,11 @@ func _get_device_type() -> String: return '' +# Получение адреса UG для текущей литеры +func _get_ug_address() -> int: + return constants.ADDR_UG_LITERA_2 if current_litera in SPECIAL_LITERAS else constants.ADDR_UG_LITERA_1 + + ## Настройка таймеров func setup_timer() -> void: add_child(control_timer) @@ -671,6 +676,75 @@ func on_stop_control() -> void: state = STATE_MACHINE.FS_TURN_OFF +# Обработка значения луча из UG_SET_RAY состояния +func _process_ray_value(ray_value: int) -> void: + match ray_value: + 0, 1, 2, 3, 4: + var next_ray = ray_value + 1 + if next_ray in RAY_CONFIG: # ← Добавить проверку + state = _ray_state_enums[RAY_CONFIG[next_ray].state] + 5: + if not current_litera == 1: + control_results = check_dou_result(control_results, power_for_litera, self_name, current_litera, constants) + state = STATE_MACHINE.IN_EMS_STOP + 6: + state = STATE_MACHINE.UG_SET_RAY_0 + if current_litera == 1: + state = STATE_MACHINE.UG_SET_RAY_5 + + +# Универсальный обработчик для всех операций с лучами +func _handle_ray_operation(ray_num: int = -1) -> void: + if ray_num == -1: + # Режим чтения - определение текущего луча + _handle_ray_read_mode() + else: + # Режим записи - установка конкретного луча + _handle_ray_write_mode(ray_num) + + +# Обработка чтения состояния луча +func _handle_ray_read_mode() -> void: + var addr: int = _get_ug_address() + if not _can_process_ray_state(addr): + return + var ray_value = unit_prd.isa_ports[addr] & RAY_MASK + _process_ray_value(ray_value) + + +# Проверка возможности обработки состояния луча +func _can_process_ray_state(addr: int) -> bool: + return unit_prd.isa_ports.has(addr) and (unit_prd.cmd_state == unit_prd.CmdState.DONE) + + +# Обработка записи состояния луча +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 + # Установка луча + _handle_ug_set_state(ray_num) + flag_write_isa = true + state = STATE_MACHINE.READ_ISA + + +# Проверка возможности записи луча +func _can_write_ray(ray_num: int) -> bool: + if flag_write_isa: + return false + var ray_config = RAY_CONFIG[ray_num] + # Для луча 0 требуется flag_si_fs_input, для остальных - нет + if ray_num == 0: + return ray_config.requires_si_fs and flag_si_fs_input + return true + + ## Срабатывает при выходе или входе в режим контроль func on_mode_changed(in_tree: bool) -> void: flag_in_control = in_tree @@ -694,7 +768,6 @@ func _process_dkm_status(status: PackedByteArray) -> void: var dkm_bit = _get_dkm_bit_for_current_fs(current_litera, constants) if dkm_bit == 0: control_results['dkm_1'] = check_dkm(status, dkm_bit) - var addr: int = constants.ADDR_UG_LITERA_1 if current_litera == 3 or current_litera == 5 or current_litera == 7: addr = constants.ADDR_UG_LITERA_2 @@ -1047,15 +1120,7 @@ func get_current_status() -> String: 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 "неизвестный угол" + return RAY_CONFIG.get(ray_num, {}).get("name", "неизвестный угол") # Геттер для результатов контроля