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", "неизвестный угол")
# Геттер для результатов контроля