Промежуточная фиксация изменений
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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", "неизвестный угол")
|
||||
|
||||
|
||||
# Геттер для результатов контроля
|
||||
|
||||
Reference in New Issue
Block a user