diff --git a/scenes/count-danger/count_danger_pad.tscn b/scenes/count-danger/count_danger_pad.tscn index 03b5559..8f4dd4e 100644 --- a/scenes/count-danger/count_danger_pad.tscn +++ b/scenes/count-danger/count_danger_pad.tscn @@ -13,7 +13,7 @@ horizontal_alignment = 1 vertical_alignment = 1 [node name="count_danger" type="Label" parent="."] -modulate = Color(0.8, 0.533333, 0.27451, 1) +modulate = Color(0.890196, 0.486275, 0.196078, 1) layout_mode = 0 offset_right = 92.0 offset_bottom = 63.0 diff --git a/scenes/pribor-prd-k/pribor-prd-k.gd b/scenes/pribor-prd-k/pribor-prd-k.gd index ddaf634..f67bde3 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.gd +++ b/scenes/pribor-prd-k/pribor-prd-k.gd @@ -1,23 +1,394 @@ @tool extends "res://scenes/контроль/прибор.gd" -enum STATE_VAL { - NONE = 0, - GOOD = 1, - ERROR = 2 } +const Constants = { + "IN_BLANK_PRD": 1, + "OUT_BLANK_PRD": 13, + "CI_1_OT_FS": 8, + "CI_6_OT_FS": 13, + "CI_7_OT_FS": 14, + "CI_1_B_UF": 3, + "CI_6_B_UF": 4, + "CI_7_B_UF": 5, + "CONST_MIN_TEMP": -25, + "MAXIMUM_CODE_ADC": 3796, + "MINIMUM_CODE_AD": 2660, + "TEMPERATURE_UKP_1": 47, + "TEMPERATURE_UKP_2": 79, + "POWER_UKP_1": 31, + "POWER_UKP_2": 63, + "DKM_BIT_1": 0, + "DKM_BIT_6": 5, + "DKM_BIT_7": 6, + "BASE_ADDR_EMS_G": 0x120, + "ADDR_UG_LITERA_1": 0x106, + "ADDR_UG_LITERA_2": 0x108, + "ADDR_UG_LITERA_3": 0x10A, + "TEMP_THRESHOLD": 70, + "POWER_THRESHOLD": 40, + "TIMER_DELAY": 1.5, + "dou_ray_nuber": 0x3, + "attenutor_um_1": 0x7, + "attenutor_um_2": 0x7, + "attenutor_um_3": 0x7, +} +enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 } +# Основные переменные +var count_packet_1:int = 0 +var count_packet_2:int = 0 +var power_array_1: Array = [] +var power_array_2: Array = [] +var currecnt_unit: String +var ug_work_1: int +var ug_work_2: int +var ug_work_3: int +# Флаги и таймеры +var control_timer: Timer = Timer.new() +var flag_timer_started: bool = false +# Результаты контроля +var _control_results: Dictionary = { + "block_ip": false, # Проверка касет П1 и ИП МА2000 + "temperature": true, # Проверка температур УМ + "dkm_1": false, # Проверка ДКМ + "dkm_2": false, # Проверка ДКМ + "power_ukp": false, # Мощность от УКП + "fs_1": false, # Проверка ФС + "fs_2": false, + "fs_3": false, +} -func set_default_state(): - $utm80_A9.state = STATE_VAL.NONE - $um1535_A10.state = STATE_VAL.NONE - $um1535_A11.state = STATE_VAL.NONE - $um1535_A12.state = STATE_VAL.NONE - $um1535_A13.state = STATE_VAL.NONE - $um1535_A14.state = STATE_VAL.NONE - $um1535_A15.state = STATE_VAL.NONE - $um1535_A16.state = STATE_VAL.NONE - $um1535_A17.state = STATE_VAL.NONE - $um1535_A18.state = STATE_VAL.NONE - $um1535_A19.state = STATE_VAL.NONE - $um1535_A20.state = STATE_VAL.NONE - $um1535_A21.state = STATE_VAL.NONE +func _ready() -> void: + initialize_connections() + setup_timer() + set_default_state() + + +func initialize_connections() -> void: + signaller.conn(signaller.fs_update_state, Callable(self, 'on_fs_update_state')) + var unit_key = settings.get_unit_key(get_meta('unit_name')[0]) + var unit_prd = network.units[unit_key] + currecnt_unit = unit_prd.name + unit_prd.connect('data_received', Callable(self, 'on_data_received')) + unit_prd.connect('line_changed', Callable(self, 'on_line_changed')) + + +func setup_timer() -> void: + add_child(control_timer) + control_timer.connect('timeout', Callable(self, 'on_stop_control')) + control_timer.one_shot = true + control_timer.wait_time = 10.0 + control_timer.start() + + +func set_default_state() -> void: + for group in get_tree().get_nodes_in_group('default_reset'): + group.state = STATE_VAL.NONE + + for group in get_tree().get_nodes_in_group('power_amplifier'): + group.state = STATE_VAL.NONE + + +func _enter_tree() -> void: + $control_result.text = '' + signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false)) + _on_control_fs(true) + + +func _exit_tree() -> void: + var unit_key = settings.get_unit_key(get_meta('unit_name')[0]) + var unit_prd = network.units[unit_key] + var prd_module = prd.prd_dict[unit_prd.name] + + prd_module.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [Constants.ADDR_UG_LITERA_1, ug_work_1, Constants.ADDR_UG_LITERA_2, ug_work_2]]) + + +func on_line_changed(unit_prd: Object) -> void: + if not unit_prd.online: + set_default_state() + + +func on_data_received(unit_prd: Object) -> void: + if not is_inside_tree(): + return + + var status = unit_prd.status + check_block_ip(status) + check_temperature_um(status) + # Обработка данных ЭМС + _process_ems_data(status) + + if flag_timer_started: + check_dkm(status, Constants.DKM_BIT_1) + check_dkm(status, Constants.DKM_BIT_6) + check_dkm(status, Constants.DKM_BIT_7) + # Обработка мощности от УКП + _process_ukp_power(status) + + +# Обрабатывает данные ЭМС и обновляет UI панели +func _process_ems_data(status: PackedByteArray) -> void: + ## Контроль ЭМС + var in_blank: int = status.decode_u16(Constants.IN_BLANK_PRD) + var out_blank: int = status.decode_u16(Constants.OUT_BLANK_PRD) + + # Обновление фреймов для входных сигналов + $Monitoring_panel/in_fs_1.frame = (in_blank >> Constants.CI_6_OT_FS) & 1 + $Monitoring_panel/in_fs_2.frame = (in_blank >> Constants.CI_7_OT_FS) & 1 + $Monitoring_panel/in_fs_3.frame = (in_blank >> Constants.CI_1_OT_FS) & 1 + + # Обновление фреймов для выходных сигналов ЭМС + $Monitoring_panel/out_ems_1.frame = (out_blank >> Constants.CI_6_B_UF) & 1 + $Monitoring_panel/out_ems_2.frame = (out_blank >> Constants.CI_7_B_UF) & 1 + $Monitoring_panel/out_ems_3.frame = (out_blank >> Constants.CI_1_B_UF) & 1 + + +## Проверка касет П1 и ИП МА2000 +func check_block_ip(status_prd: PackedByteArray) -> void : + var ug_online: bool = (status_prd[0] >> 1) & 1 + if ug_online: + const BYTE_DRY_CONTACT: int = 27 + const BIT_MAA2000_1: int = 0 + const BIT_MAA2000_2: int = 1 + const BIT_IP9_50_1: int = 2 + const BIT_IP9_50_2: int = 3 + const BIT_IP12_50_1: int = 4 + const BIT_IP9_50_3: int = 5 + const BIT_IP12_50_2: int = 6 + + var maa2000_1 = status_prd[BYTE_DRY_CONTACT] >> BIT_MAA2000_1 & 1 + var maa2000_2 = status_prd[BYTE_DRY_CONTACT] >> BIT_MAA2000_2 & 1 + var ip9_50_1 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP9_50_1 & 1 + var ip9_50_2 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP9_50_2 & 1 + var ip12_50_1 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP12_50_1 & 1 + var ip9_50_3 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP9_50_3 & 1 + var ip12_50_2 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP12_50_2 & 1 + + $maa2000_A23.state = STATE_VAL.ERROR if maa2000_1 else STATE_VAL.GOOD + $maa2000_A22.state = STATE_VAL.ERROR if maa2000_2 else STATE_VAL.GOOD + $kasseta_p_1/ref_A26.state = STATE_VAL.ERROR if ip9_50_1 else STATE_VAL.GOOD + $kasseta_p_1/ref_A23.state = STATE_VAL.ERROR if ip9_50_2 else STATE_VAL.GOOD + $kasseta_p_1/ref_A24.state = STATE_VAL.ERROR if ip12_50_1 else STATE_VAL.GOOD + $kasseta_p_2/ref_A26.state = STATE_VAL.ERROR if ip9_50_3 else STATE_VAL.GOOD + $kasseta_p_2/ref_A23.state = STATE_VAL.ERROR if ip12_50_2 else STATE_VAL.GOOD + else: + $maa2000_A23.state = STATE_VAL.NONE + $maa2000_A22.state = STATE_VAL.NONE + $kasseta_p_1/ref_A26.state = STATE_VAL.NONE + $kasseta_p_1/ref_A23.state = STATE_VAL.NONE + $kasseta_p_1/ref_A24.state = STATE_VAL.NONE + $kasseta_p_2/ref_A26.state = STATE_VAL.NONE + $kasseta_p_2/ref_A23.state = STATE_VAL.NONE + + _control_results["block_ip"] = ( + $maa2000_A23.state == STATE_VAL.GOOD and + $maa2000_A22.state == STATE_VAL.GOOD and + $kasseta_p_1/ref_A26.state == STATE_VAL.GOOD and + $kasseta_p_1/ref_A23.state == STATE_VAL.GOOD and + $kasseta_p_1/ref_A24.state == STATE_VAL.GOOD and + $kasseta_p_2/ref_A26.state == STATE_VAL.GOOD and + $kasseta_p_2/ref_A23.state == STATE_VAL.GOOD + ) + + +## Проверка температур УМ от УКП +func check_temperature_um(status_prd: PackedByteArray) -> void: + var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') + const TEMP: float = 115.0 / (Constants.MAXIMUM_CODE_ADC - Constants.MINIMUM_CODE_AD) + var ukp1_online: int = (status_prd[0] >> 2) & 1 + if ukp1_online: + var tmp_1: int + var temperature_ukp_1: int + for i_temp in range(6): + temperature_ukp_1 = status_prd.decode_u16(Constants.TEMPERATURE_UKP_1 + 2 * i_temp) + tmp_1 = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * TEMP + 3) + power_amplifier[i_temp].value0 = tmp_1 + # Темпуратура от УМ литеры 1 + temperature_ukp_1 = status_prd.decode_u16(Constants.TEMPERATURE_UKP_1 + 2 * 7) + tmp_1 = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * TEMP + 3) + power_amplifier[6].value0 = tmp_1 + + var ukp2_online = (status_prd[0] >> 3) & 1 + if ukp2_online: + for i_temp in range(6): + var temperature_ukp_2: int = status_prd.decode_u16(Constants.TEMPERATURE_UKP_2 + 2 * i_temp) + var tmp_2: int = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_2) * TEMP + 3) + power_amplifier[i_temp+7].value0 = tmp_2 + + +## Проверка ДКМ +func check_dkm(status_prd: PackedByteArray, bit_dkm: int) -> void: + const DKM: int = 28 + + var status_dkm = status_prd[DKM] >> bit_dkm & 1 + if bit_dkm == 5: + $dou6_A7.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR + $kasseta_fs_kd/ref_A2.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR + _control_results["dkm_1"] = status_dkm + elif bit_dkm == 6: + $dou7_A8.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR + $kasseta_fs_kd/ref_A4.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR + _control_results["dkm_2"] = status_dkm + elif bit_dkm == 0: + $kasseta_fs_kd/ref_A7.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR + _control_results["dkm_3"] = status_dkm + + +func _process_ukp_power(status: PackedByteArray) -> void: + ## Мощность УМ от УКП 1 + var arr_power_ukp_1: Array = [] + + if (status[0] >> 2) & 1: + var power_ukp_1: int + for i_power in range(6): + power_ukp_1 = status.decode_u16(Constants.POWER_UKP_1 + 2 * i_power) + arr_power_ukp_1.append(power_ukp_1) + # Мощность от УМ (УКП) литеры 3 + power_ukp_1 = status.decode_u16(Constants.POWER_UKP_1 + 2 * 7) + arr_power_ukp_1.append(power_ukp_1) + + if count_packet_1 == 0: + power_array_1 = arr_power_ukp_1 + else: + for i in arr_power_ukp_1.size(): + if arr_power_ukp_1[i] > power_array_1[i]: + power_array_1[i] = arr_power_ukp_1[i] + + var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') + for i in 7: + power_amplifier[i].value1 = '%d' % power_array_1[i] + power_amplifier[i].state = STATE_VAL.GOOD if power_array_1[i] > 40 else STATE_VAL.ERROR + count_packet_1 += 1 + + ## Мощность УМ от УКП 2 + var arr_power_ukp_2: Array = [] + if (status[0] >> 2) & 1: + for i_power in range(6): + var power_ukp_2 = status.decode_u16(Constants.POWER_UKP_2 + 2 * i_power) + arr_power_ukp_2.append(power_ukp_2) + + if count_packet_2 == 0: + power_array_2 = arr_power_ukp_2 + else: + for i in arr_power_ukp_2.size(): + if arr_power_ukp_2[i] > power_array_2[i]: + power_array_2[i] = arr_power_ukp_2[i] + + for i in 6: + power_amplifier[i+7].value1 = '%d' % power_array_2[i] + power_amplifier[i+7].state = STATE_VAL.GOOD if power_array_2[i] > 40 else STATE_VAL.ERROR + + count_packet_2 += 1 + + _control_results["power_ukp"] = true + for amp in power_amplifier: + if amp.state != STATE_VAL.GOOD: + _control_results["power_ukp"] = false + break + + +func _on_control_fs(mode: bool) -> void: + var interfer_name: String + var fs_arr: Array + if mode: + interfer_name = 'k1' + fs_arr = [[90.0, 2450.0, 1500.0, 23]] + else: + interfer_name = 'off' + fs_arr = [[90.0, 2450.0, 1500.0, 23]] + signaller.emit_signal('interfer_init', interfer_name, fs_arr, 50.0) + + +func on_stop_control() -> void: + print_debug('Отсановка контроля ПРД') + _on_control_fs(false) + on_control_result() + + +func on_fs_update_state(packet_type_7: Dictionary) -> void: + var parts = currecnt_unit.split('-') + var last_part = parts[-1] # Прибор + + # Словарь для маппинга: ключ - номер FS, значение - целевая нода и условие прибора + var fs_mapping = { + 0: { "node": $kasseta_fs_kd/ref_A3, "condition": last_part == '1к' }, + 1: { "node": $kasseta_fs_kd/ref_A3, "condition": last_part == '4к' }, + 2: { "node": $kasseta_fs_kd/ref_A3, "condition": last_part == '3к' }, + 3: { "node": $kasseta_fs_kd/ref_A3, "condition": last_part == '2к' }, + 20: { "node": $kasseta_fs_kd/ref_A6, "condition": last_part == '1к' }, + 21: { "node": $kasseta_fs_kd/ref_A6, "condition": last_part == '4к' }, + 22: { "node": $kasseta_fs_kd/ref_A6, "condition": last_part == '3к' }, + 23: { "node": $kasseta_fs_kd/ref_A6, "condition": last_part == '2к' }, + 24: { "node": $kasseta_fs_kd/ref_A5, "condition": last_part == '1к' }, + 25: { "node": $kasseta_fs_kd/ref_A5, "condition": last_part == '4к' }, + 26: { "node": $kasseta_fs_kd/ref_A5, "condition": last_part == '3к' }, + 27: { "node": $kasseta_fs_kd/ref_A5, "condition": last_part == '2к' }, + } + for fs in packet_type_7: + if fs in fs_mapping and fs_mapping[fs]["condition"]: + var data = packet_type_7[fs] + var state = STATE_VAL.GOOD if data.isg == 1 else STATE_VAL.ERROR if data.isg == 0 else STATE_VAL.NONE + fs_mapping[fs]["node"].state = state + if fs < 4: + _control_results["fs_1"] = (data.isg == 1) + elif fs <24: + _control_results["fs_2"] = (data.isg == 1) + else: + _control_results["fs_3"] = (data.isg == 1) + if _control_results['fs_1'] and _control_results["fs_2"] and _control_results["fs_3"] and not flag_timer_started: + on_ug_setting() + control_timer.wait_time = Constants.TIMER_DELAY + control_timer.start() + flag_timer_started = true + + +func on_ug_setting() -> void: + var unit_key = settings.get_unit_key(get_meta('unit_name')[0]) + var unit_prd = network.units[unit_key] + + if unit_prd.isa_ports.has(Constants.ADDR_UG_LITERA_1): + ug_work_1 = unit_prd.isa_ports[Constants.ADDR_UG_LITERA_1] + if unit_prd.isa_ports.has(Constants.ADDR_UG_LITERA_2): + ug_work_2 = unit_prd.isa_ports[Constants.ADDR_UG_LITERA_2] + if unit_prd.isa_ports.has(Constants.ADDR_UG_LITERA_3): + ug_work_3 = unit_prd.isa_ports[Constants.ADDR_UG_LITERA_3] + + var result_1 = ((Constants.attenutor_um_1 & 0x07) << 3) | (Constants.dou_ray_nuber & 0x07) + var result_2 = ((Constants.attenutor_um_2 & 0x07) << 3) | (Constants.dou_ray_nuber & 0x07) + var prd_module = prd.prd_dict[unit_prd.name] + prd_module.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [Constants.ADDR_UG_LITERA_1, result_1, + Constants.ADDR_UG_LITERA_2, result_2, + Constants.ADDR_UG_LITERA_3, Constants.attenutor_um_3, + Constants.BASE_ADDR_EMS_G, 6666]]) + + prd_module.cmd_array.append([unit_prd.CmdCode.READ_ISA, [Constants.ADDR_UG_LITERA_1, Constants.ADDR_UG_LITERA_2, Constants.ADDR_UG_LITERA_3]]) + +func on_mode_changed(in_tree: bool) -> void: + if not in_tree: + queue_free() + + +func on_control_result() -> void: + var result: bool = true + + for key in _control_results: + if not _control_results[key]: + if key == 'fs_1': + $kasseta_fs_kd/ref_A3.state = STATE_VAL.ERROR + if key == 'fs_2': + $kasseta_fs_kd/ref_A6.state = STATE_VAL.ERROR + if key == 'fs_3': + $kasseta_fs_kd/ref_A5.state = STATE_VAL.ERROR + result = false + print_debug('%s false' % key) + + var parts = currecnt_unit.split('-') + var last_part = parts[-1] # Прибор + if result: + $control_result.text = 'Прибор ПРД-%s исправен' % last_part + $control_result.add_theme_color_override("font_color", Color.AQUAMARINE) + else: + $control_result.text = 'Прибор ПРД-%s неисправен' % last_part + $control_result.add_theme_color_override("font_color", Color.CRIMSON) + await get_tree().create_timer(Constants.TIMER_DELAY).timeout + flag_timer_started = false diff --git a/scenes/pribor-prd-k/pribor-prd-k.gd.uid b/scenes/pribor-prd-k/pribor-prd-k.gd.uid index 6d9d32f..3493cb8 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.gd.uid +++ b/scenes/pribor-prd-k/pribor-prd-k.gd.uid @@ -1 +1 @@ -uid://dlcma54gh7fsk +uid://cwvikiygf8b1m diff --git a/scenes/pribor-prd-k/pribor-prd-k.tscn b/scenes/pribor-prd-k/pribor-prd-k.tscn index 004208e..53d3fdf 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.tscn +++ b/scenes/pribor-prd-k/pribor-prd-k.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=16 format=3 uid="uid://m5s87q7m66lj"] [ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="1_8dmgr"] -[ext_resource type="Script" uid="uid://cwvikiygf8b1m" path="res://scenes/pribor-prd-k/pribor_prd_k.gd" id="1_tpdyp"] +[ext_resource type="Script" uid="uid://cwvikiygf8b1m" path="res://scenes/pribor-prd-k/pribor-prd-k.gd" id="1_tpdyp"] [ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="2_14h25"] [ext_resource type="PackedScene" uid="uid://cm5jd4gjrrpba" path="res://scenes/контроль/кассета-у-5-к.tscn" id="2_tb85r"] [ext_resource type="Script" uid="uid://dow4nqi6hbak8" path="res://scenes/контроль/кассета-у-5.gd" id="3_wip3a"] @@ -356,6 +356,7 @@ offset_right = 649.0 offset_bottom = 1003.0 theme_override_colors/font_color = Color(0.862745, 0.0784314, 0.235294, 1) theme_override_font_sizes/font_size = 28 +text = "Прибор ПРД- неисправен" horizontal_alignment = 1 metadata/_edit_lock_ = true diff --git a/scenes/pribor-prd-k/pribor_prd_k.gd b/scenes/pribor-prd-k/pribor_prd_k.gd deleted file mode 100644 index f67bde3..0000000 --- a/scenes/pribor-prd-k/pribor_prd_k.gd +++ /dev/null @@ -1,394 +0,0 @@ -@tool -extends "res://scenes/контроль/прибор.gd" - -const Constants = { - "IN_BLANK_PRD": 1, - "OUT_BLANK_PRD": 13, - "CI_1_OT_FS": 8, - "CI_6_OT_FS": 13, - "CI_7_OT_FS": 14, - "CI_1_B_UF": 3, - "CI_6_B_UF": 4, - "CI_7_B_UF": 5, - "CONST_MIN_TEMP": -25, - "MAXIMUM_CODE_ADC": 3796, - "MINIMUM_CODE_AD": 2660, - "TEMPERATURE_UKP_1": 47, - "TEMPERATURE_UKP_2": 79, - "POWER_UKP_1": 31, - "POWER_UKP_2": 63, - "DKM_BIT_1": 0, - "DKM_BIT_6": 5, - "DKM_BIT_7": 6, - "BASE_ADDR_EMS_G": 0x120, - "ADDR_UG_LITERA_1": 0x106, - "ADDR_UG_LITERA_2": 0x108, - "ADDR_UG_LITERA_3": 0x10A, - "TEMP_THRESHOLD": 70, - "POWER_THRESHOLD": 40, - "TIMER_DELAY": 1.5, - "dou_ray_nuber": 0x3, - "attenutor_um_1": 0x7, - "attenutor_um_2": 0x7, - "attenutor_um_3": 0x7, -} -enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 } -# Основные переменные -var count_packet_1:int = 0 -var count_packet_2:int = 0 -var power_array_1: Array = [] -var power_array_2: Array = [] -var currecnt_unit: String -var ug_work_1: int -var ug_work_2: int -var ug_work_3: int -# Флаги и таймеры -var control_timer: Timer = Timer.new() -var flag_timer_started: bool = false -# Результаты контроля -var _control_results: Dictionary = { - "block_ip": false, # Проверка касет П1 и ИП МА2000 - "temperature": true, # Проверка температур УМ - "dkm_1": false, # Проверка ДКМ - "dkm_2": false, # Проверка ДКМ - "power_ukp": false, # Мощность от УКП - "fs_1": false, # Проверка ФС - "fs_2": false, - "fs_3": false, -} - - -func _ready() -> void: - initialize_connections() - setup_timer() - set_default_state() - - -func initialize_connections() -> void: - signaller.conn(signaller.fs_update_state, Callable(self, 'on_fs_update_state')) - var unit_key = settings.get_unit_key(get_meta('unit_name')[0]) - var unit_prd = network.units[unit_key] - currecnt_unit = unit_prd.name - unit_prd.connect('data_received', Callable(self, 'on_data_received')) - unit_prd.connect('line_changed', Callable(self, 'on_line_changed')) - - -func setup_timer() -> void: - add_child(control_timer) - control_timer.connect('timeout', Callable(self, 'on_stop_control')) - control_timer.one_shot = true - control_timer.wait_time = 10.0 - control_timer.start() - - -func set_default_state() -> void: - for group in get_tree().get_nodes_in_group('default_reset'): - group.state = STATE_VAL.NONE - - for group in get_tree().get_nodes_in_group('power_amplifier'): - group.state = STATE_VAL.NONE - - -func _enter_tree() -> void: - $control_result.text = '' - signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false)) - _on_control_fs(true) - - -func _exit_tree() -> void: - var unit_key = settings.get_unit_key(get_meta('unit_name')[0]) - var unit_prd = network.units[unit_key] - var prd_module = prd.prd_dict[unit_prd.name] - - prd_module.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [Constants.ADDR_UG_LITERA_1, ug_work_1, Constants.ADDR_UG_LITERA_2, ug_work_2]]) - - -func on_line_changed(unit_prd: Object) -> void: - if not unit_prd.online: - set_default_state() - - -func on_data_received(unit_prd: Object) -> void: - if not is_inside_tree(): - return - - var status = unit_prd.status - check_block_ip(status) - check_temperature_um(status) - # Обработка данных ЭМС - _process_ems_data(status) - - if flag_timer_started: - check_dkm(status, Constants.DKM_BIT_1) - check_dkm(status, Constants.DKM_BIT_6) - check_dkm(status, Constants.DKM_BIT_7) - # Обработка мощности от УКП - _process_ukp_power(status) - - -# Обрабатывает данные ЭМС и обновляет UI панели -func _process_ems_data(status: PackedByteArray) -> void: - ## Контроль ЭМС - var in_blank: int = status.decode_u16(Constants.IN_BLANK_PRD) - var out_blank: int = status.decode_u16(Constants.OUT_BLANK_PRD) - - # Обновление фреймов для входных сигналов - $Monitoring_panel/in_fs_1.frame = (in_blank >> Constants.CI_6_OT_FS) & 1 - $Monitoring_panel/in_fs_2.frame = (in_blank >> Constants.CI_7_OT_FS) & 1 - $Monitoring_panel/in_fs_3.frame = (in_blank >> Constants.CI_1_OT_FS) & 1 - - # Обновление фреймов для выходных сигналов ЭМС - $Monitoring_panel/out_ems_1.frame = (out_blank >> Constants.CI_6_B_UF) & 1 - $Monitoring_panel/out_ems_2.frame = (out_blank >> Constants.CI_7_B_UF) & 1 - $Monitoring_panel/out_ems_3.frame = (out_blank >> Constants.CI_1_B_UF) & 1 - - -## Проверка касет П1 и ИП МА2000 -func check_block_ip(status_prd: PackedByteArray) -> void : - var ug_online: bool = (status_prd[0] >> 1) & 1 - if ug_online: - const BYTE_DRY_CONTACT: int = 27 - const BIT_MAA2000_1: int = 0 - const BIT_MAA2000_2: int = 1 - const BIT_IP9_50_1: int = 2 - const BIT_IP9_50_2: int = 3 - const BIT_IP12_50_1: int = 4 - const BIT_IP9_50_3: int = 5 - const BIT_IP12_50_2: int = 6 - - var maa2000_1 = status_prd[BYTE_DRY_CONTACT] >> BIT_MAA2000_1 & 1 - var maa2000_2 = status_prd[BYTE_DRY_CONTACT] >> BIT_MAA2000_2 & 1 - var ip9_50_1 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP9_50_1 & 1 - var ip9_50_2 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP9_50_2 & 1 - var ip12_50_1 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP12_50_1 & 1 - var ip9_50_3 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP9_50_3 & 1 - var ip12_50_2 = status_prd[BYTE_DRY_CONTACT] >> BIT_IP12_50_2 & 1 - - $maa2000_A23.state = STATE_VAL.ERROR if maa2000_1 else STATE_VAL.GOOD - $maa2000_A22.state = STATE_VAL.ERROR if maa2000_2 else STATE_VAL.GOOD - $kasseta_p_1/ref_A26.state = STATE_VAL.ERROR if ip9_50_1 else STATE_VAL.GOOD - $kasseta_p_1/ref_A23.state = STATE_VAL.ERROR if ip9_50_2 else STATE_VAL.GOOD - $kasseta_p_1/ref_A24.state = STATE_VAL.ERROR if ip12_50_1 else STATE_VAL.GOOD - $kasseta_p_2/ref_A26.state = STATE_VAL.ERROR if ip9_50_3 else STATE_VAL.GOOD - $kasseta_p_2/ref_A23.state = STATE_VAL.ERROR if ip12_50_2 else STATE_VAL.GOOD - else: - $maa2000_A23.state = STATE_VAL.NONE - $maa2000_A22.state = STATE_VAL.NONE - $kasseta_p_1/ref_A26.state = STATE_VAL.NONE - $kasseta_p_1/ref_A23.state = STATE_VAL.NONE - $kasseta_p_1/ref_A24.state = STATE_VAL.NONE - $kasseta_p_2/ref_A26.state = STATE_VAL.NONE - $kasseta_p_2/ref_A23.state = STATE_VAL.NONE - - _control_results["block_ip"] = ( - $maa2000_A23.state == STATE_VAL.GOOD and - $maa2000_A22.state == STATE_VAL.GOOD and - $kasseta_p_1/ref_A26.state == STATE_VAL.GOOD and - $kasseta_p_1/ref_A23.state == STATE_VAL.GOOD and - $kasseta_p_1/ref_A24.state == STATE_VAL.GOOD and - $kasseta_p_2/ref_A26.state == STATE_VAL.GOOD and - $kasseta_p_2/ref_A23.state == STATE_VAL.GOOD - ) - - -## Проверка температур УМ от УКП -func check_temperature_um(status_prd: PackedByteArray) -> void: - var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') - const TEMP: float = 115.0 / (Constants.MAXIMUM_CODE_ADC - Constants.MINIMUM_CODE_AD) - var ukp1_online: int = (status_prd[0] >> 2) & 1 - if ukp1_online: - var tmp_1: int - var temperature_ukp_1: int - for i_temp in range(6): - temperature_ukp_1 = status_prd.decode_u16(Constants.TEMPERATURE_UKP_1 + 2 * i_temp) - tmp_1 = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * TEMP + 3) - power_amplifier[i_temp].value0 = tmp_1 - # Темпуратура от УМ литеры 1 - temperature_ukp_1 = status_prd.decode_u16(Constants.TEMPERATURE_UKP_1 + 2 * 7) - tmp_1 = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * TEMP + 3) - power_amplifier[6].value0 = tmp_1 - - var ukp2_online = (status_prd[0] >> 3) & 1 - if ukp2_online: - for i_temp in range(6): - var temperature_ukp_2: int = status_prd.decode_u16(Constants.TEMPERATURE_UKP_2 + 2 * i_temp) - var tmp_2: int = round(Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_2) * TEMP + 3) - power_amplifier[i_temp+7].value0 = tmp_2 - - -## Проверка ДКМ -func check_dkm(status_prd: PackedByteArray, bit_dkm: int) -> void: - const DKM: int = 28 - - var status_dkm = status_prd[DKM] >> bit_dkm & 1 - if bit_dkm == 5: - $dou6_A7.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR - $kasseta_fs_kd/ref_A2.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR - _control_results["dkm_1"] = status_dkm - elif bit_dkm == 6: - $dou7_A8.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR - $kasseta_fs_kd/ref_A4.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR - _control_results["dkm_2"] = status_dkm - elif bit_dkm == 0: - $kasseta_fs_kd/ref_A7.state = STATE_VAL.GOOD if status_dkm else STATE_VAL.ERROR - _control_results["dkm_3"] = status_dkm - - -func _process_ukp_power(status: PackedByteArray) -> void: - ## Мощность УМ от УКП 1 - var arr_power_ukp_1: Array = [] - - if (status[0] >> 2) & 1: - var power_ukp_1: int - for i_power in range(6): - power_ukp_1 = status.decode_u16(Constants.POWER_UKP_1 + 2 * i_power) - arr_power_ukp_1.append(power_ukp_1) - # Мощность от УМ (УКП) литеры 3 - power_ukp_1 = status.decode_u16(Constants.POWER_UKP_1 + 2 * 7) - arr_power_ukp_1.append(power_ukp_1) - - if count_packet_1 == 0: - power_array_1 = arr_power_ukp_1 - else: - for i in arr_power_ukp_1.size(): - if arr_power_ukp_1[i] > power_array_1[i]: - power_array_1[i] = arr_power_ukp_1[i] - - var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') - for i in 7: - power_amplifier[i].value1 = '%d' % power_array_1[i] - power_amplifier[i].state = STATE_VAL.GOOD if power_array_1[i] > 40 else STATE_VAL.ERROR - count_packet_1 += 1 - - ## Мощность УМ от УКП 2 - var arr_power_ukp_2: Array = [] - if (status[0] >> 2) & 1: - for i_power in range(6): - var power_ukp_2 = status.decode_u16(Constants.POWER_UKP_2 + 2 * i_power) - arr_power_ukp_2.append(power_ukp_2) - - if count_packet_2 == 0: - power_array_2 = arr_power_ukp_2 - else: - for i in arr_power_ukp_2.size(): - if arr_power_ukp_2[i] > power_array_2[i]: - power_array_2[i] = arr_power_ukp_2[i] - - for i in 6: - power_amplifier[i+7].value1 = '%d' % power_array_2[i] - power_amplifier[i+7].state = STATE_VAL.GOOD if power_array_2[i] > 40 else STATE_VAL.ERROR - - count_packet_2 += 1 - - _control_results["power_ukp"] = true - for amp in power_amplifier: - if amp.state != STATE_VAL.GOOD: - _control_results["power_ukp"] = false - break - - -func _on_control_fs(mode: bool) -> void: - var interfer_name: String - var fs_arr: Array - if mode: - interfer_name = 'k1' - fs_arr = [[90.0, 2450.0, 1500.0, 23]] - else: - interfer_name = 'off' - fs_arr = [[90.0, 2450.0, 1500.0, 23]] - signaller.emit_signal('interfer_init', interfer_name, fs_arr, 50.0) - - -func on_stop_control() -> void: - print_debug('Отсановка контроля ПРД') - _on_control_fs(false) - on_control_result() - - -func on_fs_update_state(packet_type_7: Dictionary) -> void: - var parts = currecnt_unit.split('-') - var last_part = parts[-1] # Прибор - - # Словарь для маппинга: ключ - номер FS, значение - целевая нода и условие прибора - var fs_mapping = { - 0: { "node": $kasseta_fs_kd/ref_A3, "condition": last_part == '1к' }, - 1: { "node": $kasseta_fs_kd/ref_A3, "condition": last_part == '4к' }, - 2: { "node": $kasseta_fs_kd/ref_A3, "condition": last_part == '3к' }, - 3: { "node": $kasseta_fs_kd/ref_A3, "condition": last_part == '2к' }, - 20: { "node": $kasseta_fs_kd/ref_A6, "condition": last_part == '1к' }, - 21: { "node": $kasseta_fs_kd/ref_A6, "condition": last_part == '4к' }, - 22: { "node": $kasseta_fs_kd/ref_A6, "condition": last_part == '3к' }, - 23: { "node": $kasseta_fs_kd/ref_A6, "condition": last_part == '2к' }, - 24: { "node": $kasseta_fs_kd/ref_A5, "condition": last_part == '1к' }, - 25: { "node": $kasseta_fs_kd/ref_A5, "condition": last_part == '4к' }, - 26: { "node": $kasseta_fs_kd/ref_A5, "condition": last_part == '3к' }, - 27: { "node": $kasseta_fs_kd/ref_A5, "condition": last_part == '2к' }, - } - for fs in packet_type_7: - if fs in fs_mapping and fs_mapping[fs]["condition"]: - var data = packet_type_7[fs] - var state = STATE_VAL.GOOD if data.isg == 1 else STATE_VAL.ERROR if data.isg == 0 else STATE_VAL.NONE - fs_mapping[fs]["node"].state = state - if fs < 4: - _control_results["fs_1"] = (data.isg == 1) - elif fs <24: - _control_results["fs_2"] = (data.isg == 1) - else: - _control_results["fs_3"] = (data.isg == 1) - if _control_results['fs_1'] and _control_results["fs_2"] and _control_results["fs_3"] and not flag_timer_started: - on_ug_setting() - control_timer.wait_time = Constants.TIMER_DELAY - control_timer.start() - flag_timer_started = true - - -func on_ug_setting() -> void: - var unit_key = settings.get_unit_key(get_meta('unit_name')[0]) - var unit_prd = network.units[unit_key] - - if unit_prd.isa_ports.has(Constants.ADDR_UG_LITERA_1): - ug_work_1 = unit_prd.isa_ports[Constants.ADDR_UG_LITERA_1] - if unit_prd.isa_ports.has(Constants.ADDR_UG_LITERA_2): - ug_work_2 = unit_prd.isa_ports[Constants.ADDR_UG_LITERA_2] - if unit_prd.isa_ports.has(Constants.ADDR_UG_LITERA_3): - ug_work_3 = unit_prd.isa_ports[Constants.ADDR_UG_LITERA_3] - - var result_1 = ((Constants.attenutor_um_1 & 0x07) << 3) | (Constants.dou_ray_nuber & 0x07) - var result_2 = ((Constants.attenutor_um_2 & 0x07) << 3) | (Constants.dou_ray_nuber & 0x07) - var prd_module = prd.prd_dict[unit_prd.name] - prd_module.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [Constants.ADDR_UG_LITERA_1, result_1, - Constants.ADDR_UG_LITERA_2, result_2, - Constants.ADDR_UG_LITERA_3, Constants.attenutor_um_3, - Constants.BASE_ADDR_EMS_G, 6666]]) - - prd_module.cmd_array.append([unit_prd.CmdCode.READ_ISA, [Constants.ADDR_UG_LITERA_1, Constants.ADDR_UG_LITERA_2, Constants.ADDR_UG_LITERA_3]]) - -func on_mode_changed(in_tree: bool) -> void: - if not in_tree: - queue_free() - - -func on_control_result() -> void: - var result: bool = true - - for key in _control_results: - if not _control_results[key]: - if key == 'fs_1': - $kasseta_fs_kd/ref_A3.state = STATE_VAL.ERROR - if key == 'fs_2': - $kasseta_fs_kd/ref_A6.state = STATE_VAL.ERROR - if key == 'fs_3': - $kasseta_fs_kd/ref_A5.state = STATE_VAL.ERROR - result = false - print_debug('%s false' % key) - - var parts = currecnt_unit.split('-') - var last_part = parts[-1] # Прибор - if result: - $control_result.text = 'Прибор ПРД-%s исправен' % last_part - $control_result.add_theme_color_override("font_color", Color.AQUAMARINE) - else: - $control_result.text = 'Прибор ПРД-%s неисправен' % last_part - $control_result.add_theme_color_override("font_color", Color.CRIMSON) - await get_tree().create_timer(Constants.TIMER_DELAY).timeout - flag_timer_started = false diff --git a/scenes/pribor-prd-k/pribor_prd_k.gd.uid b/scenes/pribor-prd-k/pribor_prd_k.gd.uid deleted file mode 100644 index 3493cb8..0000000 --- a/scenes/pribor-prd-k/pribor_prd_k.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cwvikiygf8b1m diff --git a/scenes/pribor-prd-n/pribor_prd_n.gd b/scenes/pribor-prd-n/pribor-prd-n.gd similarity index 100% rename from scenes/pribor-prd-n/pribor_prd_n.gd rename to scenes/pribor-prd-n/pribor-prd-n.gd diff --git a/scenes/pribor-prd-n/pribor_prd_n.gd.uid b/scenes/pribor-prd-n/pribor-prd-n.gd.uid similarity index 100% rename from scenes/pribor-prd-n/pribor_prd_n.gd.uid rename to scenes/pribor-prd-n/pribor-prd-n.gd.uid diff --git a/scenes/pribor-prd-n/pribor-prd-n.tscn b/scenes/pribor-prd-n/pribor-prd-n.tscn index 6db0e85..53c3473 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.tscn +++ b/scenes/pribor-prd-n/pribor-prd-n.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=14 format=3 uid="uid://dnuexoef2nnv5"] -[ext_resource type="Script" uid="uid://cto2r4ipew65m" path="res://scenes/pribor-prd-n/pribor_prd_n.gd" id="1_bnnv3"] +[ext_resource type="Script" uid="uid://cto2r4ipew65m" path="res://scenes/pribor-prd-n/pribor-prd-n.gd" id="1_bnnv3"] [ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="2_is25t"] [ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="3_meukj"] [ext_resource type="PackedScene" uid="uid://bk1655p4e8y4u" path="res://scenes/контроль/кассета-у-5-нв.tscn" id="4_xkifg"] diff --git a/scenes/pribor-prd-v/pribor_prd_v.gd b/scenes/pribor-prd-v/pribor-prd-v.gd similarity index 90% rename from scenes/pribor-prd-v/pribor_prd_v.gd rename to scenes/pribor-prd-v/pribor-prd-v.gd index d6caf86..09ba887 100644 --- a/scenes/pribor-prd-v/pribor_prd_v.gd +++ b/scenes/pribor-prd-v/pribor-prd-v.gd @@ -16,7 +16,8 @@ const Constants = { "ADDR_UG_LITERA_2": 0x108, "TEMP_THRESHOLD": 70, "POWER_THRESHOLD": 40, - "TIMER_DELAY": 1.0 + "TIMER_DELAY": 1.4, + "POWER_UM": 70, } enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 } # Основные переменные @@ -68,7 +69,7 @@ func setup_timer() -> void: func _enter_tree() -> void: $control_result.text = '' signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false)) - signaller.emit_signal('interfer_off_all') + signaller.emit_signal('interfer_off_all') await get_tree().create_timer(2.0).timeout _on_control_fs(true) @@ -170,7 +171,7 @@ func check_temperature_um(status_prd: PackedByteArray) -> void: var temperature_ukp_1: int = status_prd.decode_u16(TEMPERATURE_UKP_1 + 2 * i_temp) var tmp_1: int = round(TEMP_CONSTANTS['min_temp'] + (TEMP_CONSTANTS['max_code'] - temperature_ukp_1) * TEMP_CONSTANTS['temp_factor'] + TEMP_CONSTANTS['offset']) power_amplifier[i_temp].value0 = tmp_1 - if tmp_1 > 70: + if tmp_1 > Constants.TEMP_THRESHOLD: _control_results["temperature"] = false var ukp2_online = (status_prd[0] >> 3) & 1 @@ -179,7 +180,7 @@ func check_temperature_um(status_prd: PackedByteArray) -> void: var temperature_ukp_2: int = status_prd.decode_u16(TEMPERATURE_UKP_2 + 2 * i_temp) var tmp_2: int = round(TEMP_CONSTANTS['min_temp'] + (TEMP_CONSTANTS['max_code'] - temperature_ukp_2) * TEMP_CONSTANTS['temp_factor'] + TEMP_CONSTANTS['offset']) power_amplifier[i_temp+6].value0 = tmp_2 - if tmp_2 > 70: + if tmp_2 > Constants.TEMP_THRESHOLD: _control_results["temperature"] = false @@ -231,7 +232,7 @@ func _process_ukp_power(status: PackedByteArray) -> void: var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') for i in 6: power_amplifier[i].value1 = '%d' % power_array_1[i] - power_amplifier[i].state = STATE_VAL.GOOD if power_array_1[i] > 40 else STATE_VAL.ERROR + power_amplifier[i].state = STATE_VAL.GOOD if power_array_1[i] > Constants.POWER_THRESHOLD else STATE_VAL.ERROR count_packet_1 += 1 ## Мощность УМ от УКП 2 @@ -251,7 +252,7 @@ func _process_ukp_power(status: PackedByteArray) -> void: for i in 6: power_amplifier[i+6].value1 = '%d' % power_array_2[i] - power_amplifier[i+6].state = STATE_VAL.GOOD if power_array_2[i] > 40 else STATE_VAL.ERROR + power_amplifier[i+6].state = STATE_VAL.GOOD if power_array_2[i] > Constants.POWER_THRESHOLD else STATE_VAL.ERROR count_packet_2 += 1 @@ -263,19 +264,36 @@ func _process_ukp_power(status: PackedByteArray) -> void: func _on_control_fs(mode: bool) -> void: - var interfer_name: String - var fs_arr: Array - if mode: - interfer_name = 'k1' - fs_arr = [[90.0, 2450.0, 1500.0, 23]] - else: - interfer_name = 'off' - fs_arr = [[90.0, 2450.0, 1500.0, 23]] - signaller.emit_signal('interfer_init', interfer_name, fs_arr, 10.0) + var parts = currecnt_unit.split('-') + var last_part = parts[-1] + var angle: float = 0.0 # -> ПРД-В1; 90.0 -> ПРД-В2; 180.0 -> ПРД-В3; 270.0 -> ПРД-В4 + var sector_1: float = 12 # -> ПРД-В1; 15 -> ПРД-В2; 14 -> ПРД-В3; 13 -> ПРД-В4; + var sector_2: float = 16 # -> ПРД-В1; 19 -> ПРД-В2; 18 -> ПРД-В3; 17 -> ПРД-В4; + if last_part == '2в': + angle = 90.0 + sector_1 = 15 + sector_2 = 19 + elif last_part == '3в': + angle = 180.0 + sector_1 = 14 + sector_2 = 18 + elif last_part == '4в': + angle = 270.0 + sector_1 = 13 + sector_2 = 17 + + var interfer_name: String = 'k1' if mode else 'off' + var freq_1: float = 1227.0 # ФС_1 + var freq_2: float = 1575.0 # ФС_2 + var hz_1: float = 340.0 # ФС_1 + var hz_2: float = 510.0 # ФС_2 + + var fs_arr: Array = [[angle, freq_1, hz_1, sector_1], [angle, freq_2, hz_2, sector_2]] + signaller.emit_signal('interfer_init', interfer_name, fs_arr, Constants.POWER_UM) func on_stop_control() -> void: - print_debug('Отсановка контроля ПРД') + print_debug('Остановка контроля ПРД') _on_control_fs(false) on_control_result() diff --git a/scenes/pribor-prd-v/pribor_prd_v.gd.uid b/scenes/pribor-prd-v/pribor-prd-v.gd.uid similarity index 100% rename from scenes/pribor-prd-v/pribor_prd_v.gd.uid rename to scenes/pribor-prd-v/pribor-prd-v.gd.uid diff --git a/scenes/pribor-prd-v/pribor-prd-v.tscn b/scenes/pribor-prd-v/pribor-prd-v.tscn index 7b44559..02fd115 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.tscn +++ b/scenes/pribor-prd-v/pribor-prd-v.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=15 format=3 uid="uid://cvskpe1ti3p45"] -[ext_resource type="Script" uid="uid://cvuosuvjaci1h" path="res://scenes/pribor-prd-v/pribor_prd_v.gd" id="1_c20s6"] +[ext_resource type="Script" uid="uid://cvuosuvjaci1h" path="res://scenes/pribor-prd-v/pribor-prd-v.gd" id="1_c20s6"] [ext_resource type="PackedScene" uid="uid://d3iqb5e4g81m5" path="res://scenes/контроль/элемент-г.tscn" id="2_xpo4b"] [ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="3_wyy1b"] [ext_resource type="PackedScene" uid="uid://bk1655p4e8y4u" path="res://scenes/контроль/кассета-у-5-нв.tscn" id="4_gl2bl"] @@ -409,6 +409,5 @@ offset_right = 649.0 offset_bottom = 1003.0 theme_override_colors/font_color = Color(0.862745, 0.0784314, 0.235294, 1) theme_override_font_sizes/font_size = 28 -text = "Прибор ПРД- неисправен" horizontal_alignment = 1 metadata/_edit_lock_ = true diff --git a/scenes/pribor-uf/pribor_uf.gd b/scenes/pribor-uf/pribor-uf.gd similarity index 100% rename from scenes/pribor-uf/pribor_uf.gd rename to scenes/pribor-uf/pribor-uf.gd diff --git a/scenes/pribor-uf/pribor_uf.gd.uid b/scenes/pribor-uf/pribor-uf.gd.uid similarity index 100% rename from scenes/pribor-uf/pribor_uf.gd.uid rename to scenes/pribor-uf/pribor-uf.gd.uid diff --git a/scenes/pribor-uf/pribor-uf.tscn b/scenes/pribor-uf/pribor-uf.tscn index e897449..6d9ea19 100644 --- a/scenes/pribor-uf/pribor-uf.tscn +++ b/scenes/pribor-uf/pribor-uf.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=4 format=3 uid="uid://dwxn2puh462nl"] -[ext_resource type="Script" uid="uid://pvhb2f04v00w" path="res://scenes/pribor-uf/pribor_uf.gd" id="1_7gtpa"] +[ext_resource type="Script" uid="uid://pvhb2f04v00w" path="res://scenes/pribor-uf/pribor-uf.gd" id="1_7gtpa"] [ext_resource type="Texture2D" uid="uid://c4mdrmk7h638f" path="res://data/nine-patch-round.png" id="2_ho0da"] [ext_resource type="PackedScene" uid="uid://p2suppildvq0" path="res://scenes/контроль/элемент-в.tscn" id="3_dp78y"] diff --git a/scenes/pribor-uyep/sch3-view.gd b/scenes/pribor-uyep/sch3-view.gd index f0ee87f..2851607 100644 --- a/scenes/pribor-uyep/sch3-view.gd +++ b/scenes/pribor-uyep/sch3-view.gd @@ -36,7 +36,7 @@ func on_line_changed_sch3(unit_sch3): regs_input.clear() switches_sync = false $margin/vbox/grid1/lbl_freq.text = '<нет данных>' - $margin/vbox/grid1/lbl_freq.self_modulate = Color.CADET_BLUE + $margin/vbox/grid1/lbl_freq.self_modulate = Color(settings.C_BLUE) $margin/vbox/grid1/state_freq.texture = textures[STATE_VAL.NONE] $margin/vbox/grid/state.texture = textures[STATE_VAL.NONE] diff --git a/scenes/tabs-switch/tab-switch.tscn b/scenes/tabs-switch/tab-switch.tscn index b534326..44dafe7 100644 --- a/scenes/tabs-switch/tab-switch.tscn +++ b/scenes/tabs-switch/tab-switch.tscn @@ -28,22 +28,23 @@ theme_override_styles/panel = SubResource("StyleBoxEmpty_tidwt") [node name="tab_switch" type="TabContainer" parent="."] layout_mode = 0 +offset_top = 23.0 offset_right = 1600.0 -offset_bottom = 1200.0 +offset_bottom = 1223.0 tooltip_text = "Переключает режимы работы программы" theme_override_styles/tab_focus = SubResource("StyleBoxEmpty_41d34") theme_override_styles/tab_disabled = SubResource("StyleBoxEmpty_cw2ss") theme_override_styles/tabbar_background = SubResource("StyleBoxEmpty_nmdfd") theme_override_styles/panel = SubResource("StyleBoxEmpty_vap7n") -current_tab = 0 +current_tab = 1 script = ExtResource("1_fg0vd") [node name="Работа" parent="tab_switch" instance=ExtResource("2_u7p16")] +visible = false layout_mode = 2 metadata/_tab_index = 0 [node name="Контроль" parent="tab_switch" instance=ExtResource("3_txp0s")] -visible = false layout_mode = 2 metadata/_tab_index = 1 diff --git a/scenes/tilemap/ship.png b/scenes/tilemap/ship.png new file mode 100644 index 0000000..25e3830 Binary files /dev/null and b/scenes/tilemap/ship.png differ diff --git a/scenes/tilemap/ship.png.import b/scenes/tilemap/ship.png.import new file mode 100644 index 0000000..e7819c4 --- /dev/null +++ b/scenes/tilemap/ship.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bry3qqgbuvpdt" +path="res://.godot/imported/ship.png-1e5b46229cc4c1adf618fcb5da01fb4c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/tilemap/ship.png" +dest_files=["res://.godot/imported/ship.png-1e5b46229cc4c1adf618fcb5da01fb4c.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/scenes/tilemap/ship1.png b/scenes/tilemap/ship1.png new file mode 100644 index 0000000..e2057b1 Binary files /dev/null and b/scenes/tilemap/ship1.png differ diff --git a/scenes/tilemap/ship1.png.import b/scenes/tilemap/ship1.png.import new file mode 100644 index 0000000..850c04e --- /dev/null +++ b/scenes/tilemap/ship1.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dct2op842kyxo" +path="res://.godot/imported/ship1.png-fb0d0fe319583fdccb34710f90651bfb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/tilemap/ship1.png" +dest_files=["res://.godot/imported/ship1.png-fb0d0fe319583fdccb34710f90651bfb.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/scenes/tilemap/ship2.png b/scenes/tilemap/ship2.png new file mode 100644 index 0000000..74acd04 Binary files /dev/null and b/scenes/tilemap/ship2.png differ diff --git a/scenes/tilemap/ship2.png.import b/scenes/tilemap/ship2.png.import new file mode 100644 index 0000000..cb7b68f --- /dev/null +++ b/scenes/tilemap/ship2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b3i0dm4vk3fvu" +path="res://.godot/imported/ship2.png-dfba13504c314fdc4446dacd0ce91bc5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/tilemap/ship2.png" +dest_files=["res://.godot/imported/ship2.png-dfba13504c314fdc4446dacd0ce91bc5.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/scenes/tilemap/ship_mark.tscn b/scenes/tilemap/ship_mark.tscn new file mode 100644 index 0000000..580f3a0 --- /dev/null +++ b/scenes/tilemap/ship_mark.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://c2523fcn14gn4"] + +[ext_resource type="Texture2D" uid="uid://b3i0dm4vk3fvu" path="res://scenes/tilemap/ship2.png" id="1_o15fj"] + +[node name="Ship_mark" type="Sprite2D"] +position = Vector2(2.38419e-07, -1.19209e-07) +scale = Vector2(0.496428, 0.496429) +texture = ExtResource("1_o15fj") diff --git a/scenes/tilemap/threat.png b/scenes/tilemap/threat.png new file mode 100644 index 0000000..bfa952e Binary files /dev/null and b/scenes/tilemap/threat.png differ diff --git a/scenes/tilemap/threat.png.import b/scenes/tilemap/threat.png.import new file mode 100644 index 0000000..9d8f51c --- /dev/null +++ b/scenes/tilemap/threat.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://mobingoxskg1" +path="res://.godot/imported/threat.png-602b9c318dc5f1342d23490e047ca526.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/tilemap/threat.png" +dest_files=["res://.godot/imported/threat.png-602b9c318dc5f1342d23490e047ca526.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/scenes/tilemap/threat.tscn b/scenes/tilemap/threat.tscn new file mode 100644 index 0000000..e430ebc --- /dev/null +++ b/scenes/tilemap/threat.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=2 format=3 uid="uid://cv342kc1jj5hb"] + +[ext_resource type="Texture2D" uid="uid://mobingoxskg1" path="res://scenes/tilemap/threat.png" id="1_pvxsy"] + +[node name="Threat" type="Node2D"] + +[node name="Threat" type="Sprite2D" parent="."] +scale = Vector2(0.171358, 0.171358) +texture = ExtResource("1_pvxsy") diff --git a/scenes/tilemap/tilemap.gd b/scenes/tilemap/tilemap.gd index 4e4ec18..3814051 100644 --- a/scenes/tilemap/tilemap.gd +++ b/scenes/tilemap/tilemap.gd @@ -22,10 +22,17 @@ class_name MercatorTileMap @export_range(0, 20, 1) var min_zoom_level: int = 0 @export_range(0, 20, 1) var max_zoom_level_server: int = 20 @export_color_no_alpha() var back_color: = Color.BLACK +@onready var scale_label: String +@onready var coordinates_label: String +@onready var threat_mark: PackedScene = load("res://scenes/tilemap/threat.tscn") +@onready var ship_mark: PackedScene = load("res://scenes/tilemap/ship_mark.tscn") +var ship_id := 9999 +var ship_instance: Node2D = null const default_size: = 400.0 var is_centered: = false var is_out_border1: = true var is_out_border2: = true +var threat_markers := {} @export var animation_time: float = 0.1: set(val): @@ -94,6 +101,7 @@ signal map_server_online() ## Вызывается при отсутствии ответа от сервера карт signal map_server_offline() + const image_load_proc_names = { 'png': 'load_png_from_buffer', 'jpg': 'load_jpg_from_buffer', @@ -131,6 +139,9 @@ func _ready() -> void: var unit_nav = network.units[key] unit_nav.connect('data_received', on_data_received) ProjectSettings.connect('settings_changed', _settings_changed) + threats.connect('threat_new', Callable(self, '_on_threat_new')) + threats.connect('threat_lost', Callable(self, '_on_threat_lost')) + threats.connect('threat_update', Callable(self, '_on_threat_update')) func _settings_changed(): @@ -150,7 +161,7 @@ func _on_resize() -> void: $canvas/spr_mask.scale = $canvas.size / default_size -## Создаёт новую отметку из координат экрана +## Создаёт новую отметку из координат экранаa func add_mark_from_screen_pos(id: int, scr_xy: Vector2, mark: Node) -> bool: if _marks.has(id): return false @@ -238,6 +249,7 @@ func _input(e) -> void: func multiply_zoom(multiplier: float, pivot: Vector2) -> void: var p1: = screen_to_world(_xyz, pivot) _xyz.z = clampf(_xyz.z * multiplier, min_zoom_level, max_zoom_level) + update_scale_label() var p2: = screen_to_world(_xyz, pivot) _xyz.x -= p2.x - p1.x _xyz.y -= p2.y - p1.y @@ -279,6 +291,7 @@ func _draw() -> void: var scr_pos = world_to_screen(dot.position) scr_pos.x = posmod(scr_pos.x, dx) dot.mark.position = scr_pos + dot.mark.visible = is_mark_visible(dot) dot.mark.visible = c.distance_to(scr_pos) < (r - dot.gap_size) visible_marks_count += int(dot.mark.visible) # Рисование границ @@ -349,6 +362,8 @@ func _process(delta) -> void: push_error('запрос \"%s\" не отправлен' % tile.url) if _queue.is_empty(): emit_signal('load_completed') + + update_scale_label() func _response(result, code, _headers: Array, body: PackedByteArray, req, tile: Tile) -> void: @@ -552,8 +567,9 @@ func get_tile(x: int, y: int, z: int) -> Tile: var req = get_node_or_null(NodePath(str(idx))) if req: tile = req.get_meta('tile') - tile.t = now - return tile + if tile != null: + tile.t = now + return tile tile = _cache.get(idx) if tile: @@ -670,8 +686,49 @@ func set_coordinates(lon: float, lat: float) -> void: anim.track_insert_key(0, animation_time, new_pos.x) anim.track_insert_key(1, animation_time, new_pos.y) $player.play('goto') + update_coordinates_label(lon, lat) + if not _marks.has(ship_id): + ship_instance = ship_mark.instantiate() + add_mark_from_lon_lat(ship_id, lon, lat, ship_instance, 0.0) + else: + _marks[ship_id].position = lonlat_to_world(lon, lat) func blend_mask(val: bool) -> void: $canvas/spr_mask.visible = val queue_redraw() + + +func update_coordinates_label(lon: float, lat: float) -> void: + coordinates_label = "Координаты:\nNS:%f\nEW: %f" % [lat, lon] + signaller.emit_signal('update_coordinates_map', coordinates_label) + + +func update_scale_label() -> void: + scale_label = "Масштаб: " + str(round(_xyz.z)) + signaller.emit_signal('update_scale_map', scale_label) + + +func _on_threat_new(th) -> void: + var bip_instance = threat_mark.instantiate() + if bip_instance: + bip_instance.name = str(th.id) + bip_instance.position = lonlat_to_world(th.lon, th.lat) + add_mark_from_lon_lat(th.id, th.lon, th.lat, bip_instance, 32) + + +func _on_threat_update(th) -> void: + var target = get_parent().get_node(str(th.id)) + if not target: + return + var new_position = lonlat_to_world(th.lon, th.lat) + if _marks.has(th.id): + _marks[th.id].position = new_position + if new_position != target.position: + target.position = new_position + + +func _on_threat_lost(th) -> void: + var target = get_parent().get_node(str(th.id)) + if target: + target.queue_free() diff --git a/scenes/tilemap/tilemap.tscn b/scenes/tilemap/tilemap.tscn index 40e8eb5..aee2951 100644 --- a/scenes/tilemap/tilemap.tscn +++ b/scenes/tilemap/tilemap.tscn @@ -28,8 +28,6 @@ size = Vector2(400, 400) [node name="tilemap" type="CanvasGroup" groups=["gui_items"]] script = ExtResource("1_l64tp") -border_scene = "uid://bumg0moa26skt" -zoom_step = 0.1 [node name="canvas" type="TextureRect" parent="." groups=["gui_items"]] clip_contents = true diff --git a/scenes/настройки/настройки.gd b/scenes/настройки/настройки.gd index 6f262cd..4e07d7e 100644 --- a/scenes/настройки/настройки.gd +++ b/scenes/настройки/настройки.gd @@ -165,11 +165,12 @@ func setting_tab(): var tootip_text = tbl_row[3] name_to_line_index[param_name] = i $scroll_set/table.add_row([node_label, node_value]) - var label_instance = $scroll_set/table.get_node2(0, i) + var label_instance = $scroll_set/table.get_node2(0, i) label_instance.text = param_name label_instance.tooltip_text = tootip_text $scroll_set/table.set_node_editable(0, i, false) var node_values = $scroll_set/table.get_node2(1, i).get_children() + var edit_node = $scroll_set/table.get_node2(1, i) if node_values.size(): var child = node_values[0] if child is CheckButton: @@ -181,15 +182,15 @@ func setting_tab(): var val = settings_data[param_name] if typeof(val) == TYPE_STRING: $scroll_set/table.get_node2(1, i).text = settings_data[param_name] - + if edit_node: + if edit_node is LineEdit: + $scroll_set/table.set_node_control(1, i, true) $scroll_set/table.set_node_editable(1, COMMIT, false) $scroll_set/table.set_columns_min_size([600, 950]) $scroll_set/table.set_columns_alignments(ALIGNMENT) $scroll_set/table.connect('row_pressed', Callable(self, 'on_row_pressed')) - var commit_instance = $scroll_set/table.get_node2(1, COMMIT) commit_instance.text = '%s' % commit.VCS_HEAD - for i in SETTING_TABLE.size(): var param_name = SETTING_TABLE[i][0] if not settings.UnitProfiles.has(param_name): diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index 684b407..724eef0 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -31,6 +31,7 @@ var strob_dir_begin: float ## Направление антенны var strob_width_begin: float ## Ширина строба по углу в момент начала перетаскивания. var view_mode: MapViewMode ## Режим отображения карты + signal drag_begin ## Вызывается в момент начала перетаскивания. signal drag_continue ## Вызывается во время продолжения перетаскивания. signal drag_end ## Вызывается в момент завершения перетаскивания. @@ -140,6 +141,8 @@ func _ready(): signaller.connect('interfer_prinuditelno', Callable(self, 'on_chk_interfer_prinuditelno')) signaller.connect('fs_update_state', Callable(self, 'on_fs_update_state')) signaller.connect('map_user_panning', Callable(self, 'on_user_panning')) + signaller.connect('update_coordinates_map', Callable(self, 'on_update_coordinates_label')) + signaller.connect('update_scale_map', Callable(self, 'on_update_scale_label')) on_btn_center_toggled(true) on_btn_activate_toggled(false) @@ -305,6 +308,7 @@ func on_button_pressed(btn_this, btn_others) -> void: var interfer_name: String = btn_this.get_meta('rfi_name') for key in fs_selected.keys(): fs_arr.append(prd.get_fs_param(key)) + print(fs_arr) signaller.emit_signal('interfer_init', interfer_name, fs_arr, interfer.POW_DEFAULT) @@ -509,4 +513,12 @@ func on_btn_center_toggled(toggled_on: bool) -> void: func on_btn_activate_toggled(toggled_on: bool) -> void: - $btn_activate.tooltip_text = 'Включает падавление (%s)' % ('включено' if toggled_on else 'отключено') + $btn_activate.tooltip_text = 'Включает подавление (%s)' % ('включено' if toggled_on else 'отключено') + + +func on_update_coordinates_label(coordinates_label) -> void: + $coordinates_map.text = str(coordinates_label) + + +func on_update_scale_label(scale_label) -> void: + $scale_map.text = str(scale_label) diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index 442c2dc..1336c77 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -284,6 +284,22 @@ button_pressed = true texture_normal = ExtResource("12_5ffal") texture_pressed = ExtResource("13_ggrwd") +[node name="coordinates_map" type="Label" parent="."] +layout_mode = 0 +offset_left = 1000.0 +offset_top = 128.0 +offset_right = 1112.0 +offset_bottom = 147.0 +text = "Координаты:" + +[node name="scale_map" type="Label" parent="."] +layout_mode = 0 +offset_left = 1000.0 +offset_top = 192.0 +offset_right = 1110.0 +offset_bottom = 213.0 +text = "Масштаб:" + [connection signal="drag_begin" from="." to="." method="_on_drag_begin"] [connection signal="drag_continue" from="." to="." method="_on_drag_continue"] [connection signal="toggled" from="btn_view" to="." method="on_button_view_toggled"] diff --git a/scripts/prd.gd b/scripts/prd.gd index 39c15bf..406fc7e 100644 --- a/scripts/prd.gd +++ b/scripts/prd.gd @@ -55,34 +55,34 @@ const PRD_NAMES: Array = [ ## Соответствие модулей ФС их нахождению в приборе ПРД и номеру от КАПС РПБ const FS_PRD: Dictionary = { - 0: ['уарэп-яу07-1к', 17], - 1: ['уарэп-яу07-4к', 65], - 2: ['уарэп-яу07-3к', 49], - 3: ['уарэп-яу07-2к', 33], - 4: ['уарэп-яу07-1н', 18], - 5: ['уарэп-яу07-4н', 66], - 6: ['уарэп-яу07-3н', 50], - 7: ['уарэп-яу07-2н', 34], - 8: ['уарэп-яу07-1н', 19], - 9: ['уарэп-яу07-4н', 66], - 10: ['уарэп-яу07-3н', 51], - 11: ['уарэп-яу07-2н', 35], - 12: ['уарэп-яу07-1в', 20], - 13: ['уарэп-яу07-4в', 68], - 14: ['уарэп-яу07-3в', 52], - 15: ['уарэп-яу07-2в', 36], - 16: ['уарэп-яу07-1в', 21], - 17: ['уарэп-яу07-4в', 69], - 18: ['уарэп-яу07-3в', 53], - 19: ['уарэп-яу07-2в', 37], - 20: ['уарэп-яу07-1к', 22], - 21: ['уарэп-яу07-4к', 70], - 22: ['уарэп-яу07-3к', 54], - 23: ['уарэп-яу07-2к', 38], - 24: ['уарэп-яу07-1к', 23], - 25: ['уарэп-яу07-4к', 71], - 26: ['уарэп-яу07-3к', 55], - 27: ['уарэп-яу07-2к', 39], } + 0: ['уарэп-яу07-1к', 11], + 1: ['уарэп-яу07-4к', 41], + 2: ['уарэп-яу07-3к', 31], + 3: ['уарэп-яу07-2к', 21], + 4: ['уарэп-яу07-1н', 12], + 5: ['уарэп-яу07-4н', 42], + 6: ['уарэп-яу07-3н', 32], + 7: ['уарэп-яу07-2н', 22], + 8: ['уарэп-яу07-1н', 13], + 9: ['уарэп-яу07-4н', 43], + 10: ['уарэп-яу07-3н', 33], + 11: ['уарэп-яу07-2н', 23], + 12: ['уарэп-яу07-1в', 14], + 13: ['уарэп-яу07-4в', 44], + 14: ['уарэп-яу07-3в', 34], + 15: ['уарэп-яу07-2в', 24], + 16: ['уарэп-яу07-1в', 15], + 17: ['уарэп-яу07-4в', 45], + 18: ['уарэп-яу07-3в', 35], + 19: ['уарэп-яу07-2в', 25], + 20: ['уарэп-яу07-1к', 16], + 21: ['уарэп-яу07-4к', 46], + 22: ['уарэп-яу07-3к', 36], + 23: ['уарэп-яу07-2к', 26], + 24: ['уарэп-яу07-1к', 17], + 25: ['уарэп-яу07-4к', 47], + 26: ['уарэп-яу07-3к', 37], + 27: ['уарэп-яу07-2к', 27], } var fs_dict: Dictionary ## Словарь с модулями ФС var prd_dict: Dictionary ## Словарь с приборами ПРД diff --git a/scripts/signaller.gd b/scripts/signaller.gd index 37754ac..d96201f 100644 --- a/scripts/signaller.gd +++ b/scripts/signaller.gd @@ -179,3 +179,13 @@ signal ems2_hide_pressed(state) ## Вызывается при нажатии на кнопку экранной клавиатуры ## [param state] - состояние скрытия кнопки ЭМС2 signal emit_changed(state) + + +## Вызывается при изменении детализации карты.[br] +## [param new_scale] - обновленное значение масштаба ([b]true[/b] +signal update_scale_map(new_scale) + + +## Вызывается при изменении текущих координат.[br] +## [param new_coordinates] - обновленное значение координат ([b]true[/b] +signal update_coordinates_map(new_coordinates) diff --git a/table/table.gd b/table/table.gd index d096da1..4d6e220 100644 --- a/table/table.gd +++ b/table/table.gd @@ -599,6 +599,17 @@ func set_node_frame(i_col: int, i_row: int, node_name: String, val: int) -> void func set_node_editable(i_col: int, i_row: int, val: bool) -> void: var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) nodes[key].editable = val + + +## Устанавливает контекстное меню для ячейки таблицы. Ячейка должна иметь свойство [param context_menu].[br] +## [param i_col] - Индекс колонки.[br] +## [param i_row] - Индекс ряда.[br] +## [param val] - Включить или отключить контекстное меню. +func set_node_control(i_col: int, i_row: int, val: bool) -> void: + var key: = get_node_key(NODE_KEY_FORMAT, i_col, i_row) + nodes[key].shortcut_keys_enabled = val + nodes[key].selecting_enabled = val + nodes[key].deselect_on_focus_loss_enabled = val ## Разрешает редактирование ряда. Ячейки ряда должны иметь свойство [param editable].[br]