From 5b1984a307af5f213211409d4e802edfe2eff84f Mon Sep 17 00:00:00 2001
From: TotMaxim
Date: Sun, 23 Nov 2025 19:03:34 +0300
Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?=
=?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA?=
=?UTF-8?q?=D0=B8=20=D0=B2=20serviceability?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
scripts/prd.gd | 14 ++++++++++-
scripts/pribor-prd.gd | 57 ++++++++++++++++++++-----------------------
2 files changed, 39 insertions(+), 32 deletions(-)
diff --git a/scripts/prd.gd b/scripts/prd.gd
index 3f8256ae..336ec252 100644
--- a/scripts/prd.gd
+++ b/scripts/prd.gd
@@ -231,7 +231,19 @@ class PRD:
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 check_serviceability = ug_online and ukp_1_online and ukp_2_online and ems_g_online
+ 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к']
+ 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):
+ continue
+ if status:
+ ip_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')
diff --git a/scripts/pribor-prd.gd b/scripts/pribor-prd.gd
index 963af989..5c2eb539 100644
--- a/scripts/pribor-prd.gd
+++ b/scripts/pribor-prd.gd
@@ -25,13 +25,13 @@ const RAY_45: String = 'RAY_45'
## Конфигурация лучей: состояния, названия, задержки и требования
const RAY_CONFIG = {
- 0: { 'state': 'UG_SET_RAY_0', 'name': '-5°', 'requires_si_fs': true },
- 1: { 'state': 'UG_SET_RAY_1', 'name': '5°', 'requires_si_fs': false },
- 2: { 'state': 'UG_SET_RAY_2', 'name': '15°', 'requires_si_fs': false },
- 3: { 'state': 'UG_SET_RAY_3', 'name': '25°', 'requires_si_fs': false },
- 4: { 'state': 'UG_SET_RAY_4', 'name': '35°', 'requires_si_fs': false },
- 5: { 'state': 'UG_SET_RAY_5', 'name': '45°', 'requires_si_fs': false },
- 6: { 'state': 'UG_SET_RAY_0', 'name': 'Контроль', 'requires_si_fs': false } # ДКМ
+ 0: { 'state': 'UG_SET_RAY_0', 'name': '-5°'},
+ 1: { 'state': 'UG_SET_RAY_1', 'name': '5°'},
+ 2: { 'state': 'UG_SET_RAY_2', 'name': '15°'},
+ 3: { 'state': 'UG_SET_RAY_3', 'name': '25°'},
+ 4: { 'state': 'UG_SET_RAY_4', 'name': '35°'},
+ 5: { 'state': 'UG_SET_RAY_5', 'name': '45°'},
+ 6: { 'state': 'UG_SET_RAY_0', 'name': 'Контроль'} # ДКМ
}
const RAY_TYPES := [RAY_m5, RAY_5, RAY_15, RAY_25, RAY_35, RAY_45]
@@ -462,7 +462,10 @@ func _handle_check_block_ip_state() -> void:
if not block_ip_config[ip][1]:
block_ip = false
if block_ip:
- state = STATE_MACHINE.UG_SET_RAY_CTRL
+ if current_litera == 1:
+ state = STATE_MACHINE.UG_SET_RAY_5
+ else:
+ state = STATE_MACHINE.UG_SET_RAY_CTRL
elif flag_only_fs:
state = STATE_MACHINE.IN_EMS_STOP
@@ -510,10 +513,7 @@ func _advance_to_next_fs() -> void:
5: current_litera = 0
6: current_litera = 7
7: current_litera = 0
-
- # Сброс прогресса при переходе к следующей ФС
- if current_litera != 0:
- current_fs_progress = 0.0
+
#endregion
@@ -540,17 +540,14 @@ func _handle_ray_read_mode() -> void:
## Обработка записи состояния луча
func _handle_ray_write_mode(ray_num: int) -> void:
- if not _can_write_ray(ray_num):
+ if not _can_write_ray():
return
# Особые условия для луча 0
if ray_num == 0:
control_timer.stop()
-
# Ожидание пяти пакетов от ЯУ-07
- if count_packets_power < 5:
- return
-
+ if count_packets_power < 5: return
# Установка луча
_handle_ug_set_state(ray_num)
flag_write_isa = true
@@ -570,8 +567,6 @@ func _process_ray_value(ray_value: int) -> void:
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
## Проверка возможности обработки состояния луча
@@ -580,16 +575,15 @@ func _can_process_ray_state(addr: int) -> bool:
## Проверка возможности записи луча
-func _can_write_ray(ray_num: int) -> bool:
+func _can_write_ray() -> 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
+
+ if not flag_si_fs_input:
+ _set_status('Ожидание сигнала излучения от ФС-%s' % current_litera )
+ return false
+ else:
+ return true
## Получение адреса UG для текущей литеры
@@ -601,13 +595,14 @@ func _get_ug_address() -> int:
#region UG_OPERATIONS
## Подготовка к настройке и записи в УГ
func _handle_ug_set_state(RAY_DOU_NUM: int) -> void:
+ var def_att: int = 0x00
_set_status('Настройка угла %s' % _get_ray_name(RAY_DOU_NUM))
var dic_att := {
'RAY_DOU_NUM': RAY_DOU_NUM,
'ADDR_UG_LITERA_1': constants.ADDR_UG_LITERA_1,
'ADDR_UG_LITERA_2': constants.ADDR_UG_LITERA_2,
'ADDR_UG_LITERA_3': constants.ADDR_UG_LITERA_3,
- 'ATT_UM_3': 0x00,
+ 'ATT_UM_3': def_att,
'BASE_EMS_G': constants.BASE_ADDR_EMS_G
}
@@ -622,7 +617,6 @@ func _handle_ug_set_state(RAY_DOU_NUM: int) -> void:
elif self_name == '1н' or self_name == '2н' or self_name == '3н' or self_name == '4н':
dic_att['ATT_UM_1'] = constants.ATT_UM_2
dic_att['ATT_UM_2'] = constants.ATT_UM_3
-
flag_write_isa = on_ug_setting(unit_prd, dic_att, cmd_array)
count_packets_power = 0
@@ -736,7 +730,7 @@ func on_stop_control() -> void:
flag_no_trust_yau07 = true
elif state == STATE_MACHINE.CHEK_KASSETA_Y5:
flag_only_fs = true
- state = STATE_MACHINE.FS_TURN_OFF
+ state = STATE_MACHINE.IN_EMS_STOP
#endregion
@@ -879,6 +873,7 @@ func on_line_changed_yau07(_status: Object)->void:
flag_control_is_over = false
flag_no_trust_yau07 = false
flag_only_fs = false
+ restore_default_states()
#endregion
@@ -899,7 +894,7 @@ func _process_dkm_status(status: PackedByteArray) -> void:
if not unit_prd.isa_ports.has(addr) or not (unit_prd.cmd_state == unit_prd.CmdState.DONE):
return
- if not unit_prd.isa_ports[addr] & 0x07 == 6:
+ if not unit_prd.isa_ports[addr] & 0x07 == 6:
return
# Обработка битов ДКМ в зависимости от текущей литеры