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 # Обработка битов ДКМ в зависимости от текущей литеры