Промежуточная фиксация изменений

This commit is contained in:
TotMaxim
2025-11-22 01:30:51 +03:00
parent a8b085a514
commit 7954048f11
2 changed files with 136 additions and 71 deletions

View File

@@ -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

View File

@@ -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": "", "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 ""
2: return "15°"
3: return "25°"
4: return "35°"
5: return "45°"
6: return "ДКМ"
_: return "неизвестный угол"
return RAY_CONFIG.get(ray_num, {}).get("name", "неизвестный угол")
# Геттер для результатов контроля