diff --git a/project.godot b/project.godot index 39bda02..573868b 100644 --- a/project.godot +++ b/project.godot @@ -28,7 +28,7 @@ interfer/center_offset=Vector2(200, 225) interfer/default_color0=Color(0.38, 0.47, 0.51, 1) interfer/default_color1=Color(0.39, 0.44, 0.5, 1) interfer/select_color=Color(1, 1, 1, 1) -interfer/interfer_color=Color(0.58, 0.47, 0.51, 1) +interfer/interfer_color=Color(0.92379, 0.0965192, 0.249261, 1) interfer/resend_timeout=1000.0 config/external_cu=false config/unit_rr_request_period=20.0 @@ -36,7 +36,7 @@ config/kems_files_path="user://kems/" config/emsg_files_path="user://emsg/" config/settings_path="user://settings.json" config/unit_bpo_request_period=20.0 -interfer/emit_color=Color(0.58, 0.471, 0.51, 0.2) +interfer/emit_color=Color(0.92549, 0.0980392, 0.25098, 0.509804) interfer/closed_sectors=Color(0, 0, 0, 1) [autoload] diff --git a/scenes/frame-ecm-list/scroll-ecm-list.gd b/scenes/frame-ecm-list/scroll-ecm-list.gd index e0f4234..23f9d4c 100644 --- a/scenes/frame-ecm-list/scroll-ecm-list.gd +++ b/scenes/frame-ecm-list/scroll-ecm-list.gd @@ -7,8 +7,8 @@ const TableHeader = preload('res://table/header.tscn') ## Ячейка за const TABLE_HEADER = [ TableHeader, TableHeader, TableHeader , TableHeader ] ## Описание ряда заголовка. const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit , CellLineEdit ] ## Описание ряда. -const TABLE_HEADERS_TEXT = ['Номер', 'Название', 'Пеленг', 'Состояние' ] ## Заголовки таблицы. -const TABLE_COLUMN_SIZE = [ 75, 100, 90, 170 ] ## Ширины колонок. +const TABLE_HEADERS_TEXT = ['№', 'Название', 'Пеленг', 'Состояние' ] ## Заголовки таблицы. +const TABLE_COLUMN_SIZE = [ 65, 100, 90, 170 ] ## Ширины колонок. ## Состояние выполнения сеанса помехи const INTERFER_STATE = { diff --git a/scenes/frame-threats/emit-led.tscn b/scenes/frame-threats/emit-led.tscn new file mode 100644 index 0000000..da69917 --- /dev/null +++ b/scenes/frame-threats/emit-led.tscn @@ -0,0 +1,23 @@ +[gd_scene load_steps=2 format=3 uid="uid://d012h4hxf2anf"] + +[ext_resource type="Texture2D" uid="uid://b3woliae871je" path="res://data/отметка-неопред.png" id="1_0a4l0"] + +[node name="emit-led" type="Control"] +layout_mode = 3 +anchors_preset = 0 +offset_right = 40.0 +offset_bottom = 40.0 + +[node name="texture-led" type="TextureButton" parent="."] +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 26.0 +offset_top = 11.0 +offset_right = 3.0 +offset_bottom = -12.0 +grow_horizontal = 2 +grow_vertical = 2 +texture_normal = ExtResource("1_0a4l0") diff --git a/scenes/frame-threats/frame-threats.tscn b/scenes/frame-threats/frame-threats.tscn index e357f45..f3cba68 100644 --- a/scenes/frame-threats/frame-threats.tscn +++ b/scenes/frame-threats/frame-threats.tscn @@ -35,5 +35,5 @@ script = ExtResource("2_empn3") [node name="table" type="GridContainer" parent="scroll"] layout_mode = 2 -columns = 4 +columns = 5 script = ExtResource("3_4bupu") diff --git a/scenes/frame-threats/scroll-threats.gd b/scenes/frame-threats/scroll-threats.gd index 377be5b..d20ef2d 100644 --- a/scenes/frame-threats/scroll-threats.gd +++ b/scenes/frame-threats/scroll-threats.gd @@ -5,14 +5,16 @@ class_name scroll_threats extends ScrollContainer const CellLineEdit = preload('res://table/ячейка-2.tscn') ## Ячейка таблицы. const TableHeader = preload('res://table/header.tscn') ## Ячейка заголовок таблицы. +const EmitLed = preload('res://scenes/frame-threats/emit-led.tscn') ## Ячейка заголовок таблицы. +const TABLE_HEADER = [ TableHeader, TableHeader, TableHeader, TableHeader , TableHeader ] ## Описание ряда заголовка. +const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit, EmitLed ] ## Описание ряда. +const TABLE_COLUMN_PARAM = ['id', 'aoa', 'freq', 'proto', 'emit' ] ## Параметры цели отображаемые в таблице. +const TABLE_HEADERS_TEXT = ['№', 'Пеленг', 'Частота, МГц', 'Протокол', 'Помеха' ] ## Заголовки таблицы. +const TABLE_COLUMN_SIZE = [ 65, 70, 110, 140, 65] ## Ширины колонок. -const TABLE_HEADER = [ TableHeader, TableHeader, TableHeader, TableHeader ] ## Описание ряда заголовка. -const TABLE_ROW = [ CellLineEdit, CellLineEdit, CellLineEdit, CellLineEdit ] ## Описание ряда. -const TABLE_COLUMN_PARAM = ['id', 'aoa', 'freq', 'proto' ] ## Параметры цели отображаемые в таблице. -const TABLE_HEADERS_TEXT = ['Номер', 'Пеленг', 'Частота, МГц', 'Протокол' ] ## Заголовки таблицы. -const TABLE_COLUMN_SIZE = [ 65, 145, 145, 90 ] ## Ширины колонок. - +const TABLE_TEXT_ROWS = 4 +const EMIT_STATE_COL = 4 ## Снимает выделение цели. func on_rto_threat_unsel(_th_id): $table.clear_rows_selected() @@ -63,6 +65,17 @@ func on_threat_update(th, table_index: Dictionary): var row = map_th_to_row(th) var i_row = table_index[th.id] $table.set_row_text(i_row, row) + var emit_node = $table.get_node2(EMIT_STATE_COL, i_row) + var emit_txr = emit_node.get_node('texture-led') + if th.emit_state == 0: + emit_txr.visible = false + elif th.emit_state == 1: + emit_txr.visible = true + emit_txr.self_modulate = Color.ORANGE + elif th.emit_state == 2: + emit_txr.visible = true + emit_txr.self_modulate = Color.RED + ## Обрабатывает сигнал [b]threat_lost[/b]. @@ -78,7 +91,7 @@ func on_threat_new(th, table_index): $table.add_row(TABLE_ROW) var row = map_th_to_row(th) $table.set_row_text(i_row, row) - $table.set_row_editable(i_row, false) + disable_edit($table, TABLE_TEXT_ROWS, i_row) $table.set_node_user_data(0, i_row, th) table_index[th.id] = i_row @@ -86,10 +99,11 @@ func on_threat_new(th, table_index): ## Преобразует цель в строку таблицы. func map_th_to_row(th) -> Array: var row: = Array() - row.resize(TABLE_COLUMN_PARAM.size()) + row.resize(TABLE_TEXT_ROWS) var i_col: int = 0 for param_name in TABLE_COLUMN_PARAM: var val = th.get(param_name) + if val == null: continue row[i_col] = '%0.1f' % val if val is float else '%s' % val if not th.fflags[param_name]: row[i_col] = '' @@ -104,3 +118,13 @@ func on_rto_threat_sel(th_id, tbl): if node.text.to_int() == th_id: row_pressed(i) break + + +## Отключает возможность редактирования LineEdit в таблице.[br] +## [param tbl] - таблица,[br] +## [param num_col] - номер колонки,[br] +## [param i_row] - номер столбца.[br] +func disable_edit(tbl, num_col: int, i_row: int): + for col in num_col: + var node: LineEdit = tbl.get_node2(col, i_row) + node.editable = false diff --git a/scenes/pribor-prd-k/pribor-prd-k.gd b/scenes/pribor-prd-k/pribor-prd-k.gd index 1a3a975..2bd6f78 100644 --- a/scenes/pribor-prd-k/pribor-prd-k.gd +++ b/scenes/pribor-prd-k/pribor-prd-k.gd @@ -1,81 +1,10 @@ @tool extends 'res://scenes/контроль/прибор.gd' -const constants_k: Dictionary = { - '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': 40, - 'POWER_THRESHOLD': 40, - 'RAY_DOU_NUM': 0x3, - 'ATT_UM_1': 0x0, - 'ATT_UM_6': 0x3, - 'ATT_UM_7': 0x2, - 'POWER_UM': 100, - 'TIMER_DELAY': 10.0, - 'STATE_MASHINE_TIMER': 0.3, -} -# Конфигурация параметров для каждого прибора -const PRIBOR_CONFIG := { - '1к': {'angle': 0.0, 'sectors': [0, 20, 24]}, - '2к': {'angle': 90.0, 'sectors': [3, 23, 27]}, - '3к': {'angle': 180.0, 'sectors': [2, 22, 26]}, - '4к': {'angle': 270.0, 'sectors': [1, 21, 25]}, -} -# Конфигурация частот и ширин для каждого ФС -const FS_PARAMS := { - 1: {'freq': 450.0, 'width': 80.0}, - 6: {'freq': 2450.0, 'width': 110.0}, - 7: {'freq': 4750.0, 'width': 110.0} -} enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 } -var block_ip_config_k := { - 'maa2000_1': [0, false], - 'maa2000_2': [1, false], - 'ip9_50_1': [2, false], - 'ip9_50_2': [3, false], - 'ip12_50_1': [4, false], - 'ip9_50_3': [5, false], - 'ip12_50_2': [6, false], - 'ip5_25': [7, false], -} -var block_kasseta_y5_prd_config_k: = { - 'yau07': false, - 'ems': false, - 'ug': false, - 'ukp1': false, - 'ukp2': false, -} # Основные переменные -var start_litera: int = 1 -var ug_work_1: int = 3 ## Аттенюация усилителей мощности -var ug_work_2: int = 2 ## Аттенюация усилителей мощности -var ug_work_3: int = 0 ## Аттенюация усилителей мощности -var mashine_timer: Timer = Timer.new() -#var prd_k_module: Object var unit_prd_k: Object -#var control_prd_k: Object -# Результаты контроля -#var control_results_k: Dictionary = { - #'block_ip': false, # Проверка касет П1 и ИП МА2000 - #'temperature': true, - #'dkm_1': false, - #'dkm_6': false, - #'dkm_7': false, - #'dou_6': false, - #'dou_7': false, - #'fs_1': 2, - #'fs_6': 2, - #'fs_7': 2, -#} - var ctrl_pos = 30 @@ -85,53 +14,18 @@ func _ready() -> void: var unit_name = get_meta('unit_name')[0] var prd_k_module = prd.prd_dict[unit_name] unit_prd_k = prd_k_module.unit_control - - unit_prd_k.connect('control_is_over', Callable(self, 'on_control_result')) + var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') + for temp in power_amplifier: + temp.value1 = -70 + unit_prd_k.connect('control_is_over', Callable(self, 'on_press_device')) + on_press_device() func start_control() -> void: - #initialize_connections() - setup_timer() set_default_state() find_labels(self) -#func on_state_mashine() -> void: - #control_prd_k.state_control_machine() - - -#func initialize_connections() -> void: - #var unit_name = get_meta('unit_name')[0] - #prd_k_module = prd.prd_dict[unit_name] - #unit_prd_k = prd_k_module.unit_yau07 -# - #unit_prd_k.connect('line_changed', Callable(self, 'on_line_changed')) - #var power_amplifiers: Array = get_tree().get_nodes_in_group('power_amplifier') - #var init_data: Dictionary = { - #'control_label': $control_result, - #'power_amplifiers': power_amplifiers, - #'unit_prd': unit_prd_k, - #'module_prd' : prd_k_module, - #'constants': constants_k, - #'prd_config': PRIBOR_CONFIG, - #'fs_params': FS_PARAMS, - #'block_ip_prd_config': block_ip_config_k, - #'block_kasseta_y5_prd_config': block_kasseta_y5_prd_config_k, - #'control_results': control_results_k, - #'current_litera': start_litera, - #} - #control_prd_k = test_control_k.TestPRD.new(init_data) - #add_child(control_prd_k) - #control_prd_k.connect('control_is_over', Callable(self, 'on_control_result')) - - -func setup_timer() -> void: - add_child(mashine_timer) - mashine_timer.connect('timeout', Callable(self, 'on_state_mashine')) - mashine_timer.wait_time = constants_k.STATE_MASHINE_TIMER - mashine_timer.start() - - func set_default_state() -> void: for group in get_tree().get_nodes_in_group('default_reset'): group.state = STATE_VAL.NONE @@ -143,13 +37,8 @@ func set_default_state() -> void: func _enter_tree() -> void: if Engine.is_editor_hint(): return - $control_result.text = 'Выполняется ...' + $control_result.text = 'Ожидается запуск контроля ...' # TODO: Необходимо сделать пулл сообщений $control_result.add_theme_color_override('font_color', Color.ALICE_BLUE) - signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false)) - signaller.connect('режим_журнал', Callable(self, 'on_mode_changed').bind(false)) - signaller.connect('режим_эмс', Callable(self, 'on_mode_changed').bind(false)) - signaller.connect('режим_настройки', Callable(self, 'on_mode_changed').bind(false)) - signaller.connect('режим_контроль', Callable(self, 'on_mode_changed').bind(true)) func _exit_tree() -> void: @@ -158,31 +47,11 @@ func _exit_tree() -> void: #prd_k_module.cmd_array.append([unit_prd_k.CmdCode.WRITE_ISA, [constants_k.ADDR_UG_LITERA_1, ug_work_1, constants_k.ADDR_UG_LITERA_2, ug_work_2, constants_k.ADDR_UG_LITERA_3, ug_work_3]]) -func on_line_changed(unit_pribor: Object) -> void: - if not unit_pribor.online: - set_default_state() - - -func on_mode_changed(in_tree: bool) -> void: - if not in_tree: - print_debug('Выход из сцены') - #mashine_timer.stop() - #prd_k_module.cmd_array.append([unit_prd_k.CmdCode.WRITE_ISA, [constants_k.ADDR_UG_LITERA_1, ug_work_1, constants_k.ADDR_UG_LITERA_2, ug_work_2, constants_k.ADDR_UG_LITERA_3, ug_work_3]]) - #signaller.emit_signal('interfer_off_all') - else: - print_debug('Вход в сцену') - #set_default_state() - #control_prd_k.state = control_prd_k.STATE_MASHINE.INIT - #mashine_timer.start() - - -func power_fill(pow_dic: Dictionary, fs_result: Dictionary) -> void: - #if not control_prd_k.block_kasseta_y5_config.yau07 or not control_prd_k.block_kasseta_y5_config.ukp1 or not control_prd_k.block_kasseta_y5_config.ukp2: - #return - var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') +static func power_fill(pow_dic: Dictionary, fs_result: Dictionary, power_amplifier: Array, POWER_THRESHOLD: int) -> void: for i_powapm in power_amplifier: var powamp_meta: String = i_powapm.get_meta('um') var status = STATE_VAL.GOOD if pow_dic else STATE_VAL.NONE + if not pow_dic.has(powamp_meta): return if pow_dic: if not pow_dic.has(powamp_meta): break @@ -194,15 +63,45 @@ func power_fill(pow_dic: Dictionary, fs_result: Dictionary) -> void: if powamp_meta in ['um_8', 'um_9', 'um_10', 'um_11', 'um_12', 'um_13'] and not fs_result.fs_7: return i_powapm.value0 = pow_dic[powamp_meta] for i_p in pow_dic[powamp_meta]: - if i_p < constants_k.POWER_THRESHOLD: + if i_p < POWER_THRESHOLD: status = STATE_VAL.ERROR i_powapm.state = status -func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void: - mashine_timer.stop() - block_kasseta_y5_prd_config_k = unit_prd_k.block_kasseta_y5_config +func on_press_device() -> void: var nodes_y5: Array = get_tree().get_nodes_in_group('y-5') + var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply') + var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group') + var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') + var module_fs_1: Node = $kasseta_fs_kd/ref_A2 + var module_fs_6: Node = $kasseta_fs_kd/ref_A4 + var dou_6: Node = $dou6_A7 + var module_fs_7: Node = $kasseta_fs_kd/ref_A7 + var dou_7: Node = $dou7_A8 + var for_control_result: Dictionary = { + 'result_dic': unit_prd_k.control_results, + 'power_dic': unit_prd_k.power_result, + 'block_kasseta_y5_config': unit_prd_k.block_kasseta_y5_config, + 'block_ip_config': unit_prd_k.block_ip_config, + 'nodes_y5': nodes_y5, + 'node_ip_power_arr': node_ip_power_arr, + 'fs_nodes': fs_nodes, + 'power_amplifier': power_amplifier, + 'POWER_THRESHOLD': unit_prd_k.constants.POWER_THRESHOLD, + 'name_prd': unit_prd_k.self_name, + 'module_fs_1': module_fs_1, + 'module_fs_6': module_fs_6, + 'dou_6': dou_6, + 'module_fs_7': module_fs_7, + 'dou_7': dou_7, + } + on_control_result(for_control_result) + + +func on_control_result(for_result_dic: Dictionary) -> void: + ## If control is end + var block_kasseta_y5_prd_config_k: Dictionary = for_result_dic.block_kasseta_y5_config + var nodes_y5: Array = for_result_dic.nodes_y5 for node_y5 in nodes_y5: var meta_y5 = node_y5.get_meta('y5') if block_kasseta_y5_prd_config_k.has(meta_y5): @@ -211,15 +110,15 @@ func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void: break node_y5.state = STATE_VAL.GOOD if block_kasseta_y5_prd_config_k[meta_y5] else STATE_VAL.ERROR - block_ip_config_k = unit_prd_k.block_ip_config + var block_ip_config_k: Dictionary = unit_prd_k.block_ip_config var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply') for power_supply in node_ip_power_arr: var meta_ip = power_supply.get_meta('ip') if block_ip_config_k.has(meta_ip) and block_kasseta_y5_prd_config_k.ug: power_supply.state = STATE_VAL.GOOD if block_ip_config_k[meta_ip][1] else STATE_VAL.ERROR - var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group') - for f in fs_nodes: + var result_dic: Dictionary = for_result_dic.result_dic + for f in for_result_dic.fs_nodes: var fs_meta: String = f.get_meta('fs') if result_dic.has(fs_meta): var new_state = result_dic[fs_meta] @@ -227,29 +126,27 @@ func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void: result_dic[fs_meta] = new_state if result_dic.fs_1 == 1: - $kasseta_fs_kd/ref_A2.state = STATE_VAL.GOOD if result_dic.dkm_1 else STATE_VAL.ERROR + for_result_dic.module_fs_1.state = STATE_VAL.GOOD if result_dic.dkm_1 else STATE_VAL.ERROR else: - result_dic.fs_1 = false + result_dic.fs_1 = 0 if result_dic.fs_6 == 1: - $kasseta_fs_kd/ref_A4.state = STATE_VAL.GOOD if result_dic.dkm_6 else STATE_VAL.ERROR - $dou6_A7.state = STATE_VAL.GOOD if result_dic.dou_6 else STATE_VAL.ERROR + for_result_dic.module_fs_6.state = STATE_VAL.GOOD if result_dic.dkm_6 else STATE_VAL.ERROR + for_result_dic.dou_6.state = STATE_VAL.GOOD if result_dic.dou_6 else STATE_VAL.ERROR else: - result_dic.fs_6 = false + result_dic.fs_6 = 0 if result_dic.fs_7 == 1: - $kasseta_fs_kd/ref_A7.state = STATE_VAL.GOOD if result_dic.dkm_7 else STATE_VAL.ERROR - $dou7_A8.state = STATE_VAL.GOOD if result_dic.dou_7 else STATE_VAL.ERROR + for_result_dic.module_fs_7.state = STATE_VAL.GOOD if result_dic.dkm_7 else STATE_VAL.ERROR + for_result_dic.dou_7.state = STATE_VAL.GOOD if result_dic.dou_7 else STATE_VAL.ERROR else: - result_dic.fs_7 = false + result_dic.fs_7 = 0 + + power_fill(for_result_dic.power_dic, for_result_dic.result_dic, for_result_dic.power_amplifier, for_result_dic.POWER_THRESHOLD) - power_fill(power_dic, result_dic) - - var result = true + var result: bool = true for device in result_dic.values(): if not device: result = false - - var name_prd = unit_prd_k.self_name - log.message(Logger.INFO, 'Прибор ПРД-%s %s' % [name_prd, ['неисправен', 'исправен'][int(result)]]) + log.message(Logger.INFO, 'Прибор ПРД-%s %s' % [for_result_dic.name_prd, ['неисправен', 'исправен'][int(result)]]) func find_labels(node1: Node): diff --git a/scenes/pribor-prd-n/pribor-prd-n.gd b/scenes/pribor-prd-n/pribor-prd-n.gd index ed21bc0..842b539 100644 --- a/scenes/pribor-prd-n/pribor-prd-n.gd +++ b/scenes/pribor-prd-n/pribor-prd-n.gd @@ -1,126 +1,31 @@ @tool extends 'res://scenes/контроль/прибор.gd' -const constants_n = { - 'POWER_UKP_1': 31, - 'POWER_UKP_2': 63, - 'DKM_BIT_2': 1, - 'DKM_BIT_3': 2, - '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, - 'RAY_DOU_NUM': 0x3, - 'ATT_UM_2': 0x2, - 'ATT_UM_3': 0x3, - 'POWER_UM': 100, - 'TIMER_DELAY': 10.0, - 'STATE_MASHINE_TIMER': 0.3, -} -# Конфигурация параметров для каждого прибора -const PRIBOR_CONFIG_N := { - '1н': {'angle': 0.0, 'sectors': [4, 8]}, - '2н': {'angle': 90.0, 'sectors': [7, 11]}, - '3н': {'angle': 180.0, 'sectors': [6, 10]}, - '4н': {'angle': 270.0, 'sectors': [5, 9]}, -} -# Конфигурация частот и ширин для каждого ФС -const FS_PARAMS_N := { - 2: {'freq': 932.0, 'width': 100.0}, - 3: {'freq': 1157.0, 'width': 100.0} -} enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 } -var block_ip_config_n:= { - 'maa2000_1': [0, false], - 'maa2000_2': [1, false], - 'ip9_50_1': [2, false], - 'ip9_50_2': [3, false], - 'ip12_50_1': [4, false], - 'ip5_25': [7, false], -} -var block_kasseta_y5_prd_config_n: = { - 'yau07': false, - 'ems': false, - 'ug': false, - 'ukp1': false, - 'ukp2': false, -} # Основные переменные -var start_litera: int = 2 -var ug_work_1: int = 2 ## Аттенюация усилителей мощности -var ug_work_2: int = 3 ## Аттенюация усилителей мощности -# Флаги и таймеры -var mashine_timer: Timer = Timer.new() -var prd_n_module: Object var unit_prd_n: Object -var control_prd_n: Object -# Результаты контроля -var control_results_n: Dictionary = { - 'block_ip': false, # Проверка касет П1 и ИП МА2000 - 'temperature': true, # Проверка температур УМ - 'dkm_2': false, - 'dkm_3': false, - 'dou_2': false, - 'dou_3': false, - 'fs_2': 2, - 'fs_3': 2, -} -var test_control_n = preload('res://scripts/pribor-prd.gd') var ctrl_pos = 0 -################################ -func on_state_mashine() -> void: - control_prd_n.state_control_machine() func _ready() -> void: if Engine.is_editor_hint(): return - print_debug('В сцене ПРД-Н!') + var unit_name = get_meta('unit_name')[0] + var prd_n_module = prd.prd_dict[unit_name] + unit_prd_n = prd_n_module.unit_control + var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') + for temp in power_amplifier: + temp.value1 = -70 + unit_prd_n.connect('control_is_over', Callable(self, 'on_press_device')) + on_press_device() func start_control() -> void: - initialize_connections() - setup_timer() set_default_state() find_labels(self) -func initialize_connections() -> void: - var unit_name = get_meta('unit_name')[0] - prd_n_module = prd.prd_dict[unit_name] - unit_prd_n = prd_n_module.unit_yau07 - - unit_prd_n.connect('line_changed', Callable(self, 'on_line_changed')) - var power_amplifiers: Array = get_tree().get_nodes_in_group('power_amplifier') - var init_data: Dictionary = { - 'control_label': $control_result, - 'power_amplifiers': power_amplifiers, - 'unit_prd': unit_prd_n, - 'module_prd' : prd_n_module, - 'constants': constants_n, - 'prd_config': PRIBOR_CONFIG_N, - 'fs_params': FS_PARAMS_N, - 'block_ip_prd_config': block_ip_config_n, - 'block_kasseta_y5_prd_config': block_kasseta_y5_prd_config_n, - 'control_results': control_results_n, - 'current_litera': start_litera, - } - control_prd_n = test_control_n.TestPRD.new(init_data) - add_child(control_prd_n) - control_prd_n.connect('control_is_over', Callable(self, 'on_control_result')) - - -func setup_timer() -> void: - pass - #add_child(mashine_timer) - #mashine_timer.connect('timeout', Callable(self, 'on_state_mashine')) - #mashine_timer.wait_time = constants_n.STATE_MASHINE_TIMER - #mashine_timer.start() - - func set_default_state() -> void: for group in get_tree().get_nodes_in_group('default_reset'): group.state = STATE_VAL.NONE @@ -132,13 +37,8 @@ func set_default_state() -> void: func _enter_tree() -> void: if Engine.is_editor_hint(): return - $control_result.text = 'Выполняется ...' + $control_result.text = 'Ожидается запуск контроля ...' # TODO: Необходимо сделать пулл сообщений $control_result.add_theme_color_override('font_color', Color.ALICE_BLUE) - signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false)) - signaller.connect('режим_журнал', Callable(self, 'on_mode_changed').bind(false)) - signaller.connect('режим_эмс', Callable(self, 'on_mode_changed').bind(false)) - signaller.connect('режим_настройки', Callable(self, 'on_mode_changed').bind(false)) - signaller.connect('режим_контроль', Callable(self, 'on_mode_changed').bind(true)) func _exit_tree() -> void: @@ -147,30 +47,11 @@ func _exit_tree() -> void: #prd_n_module.cmd_array.append([unit_prd_n.CmdCode.WRITE_ISA, [constants_n.ADDR_UG_LITERA_1, ug_work_1, constants_n.ADDR_UG_LITERA_2, ug_work_2]]) -func on_line_changed(unit_pribor: Object) -> void: - if not unit_pribor.online: - set_default_state() - - -func on_mode_changed(in_tree: bool) -> void: - print_debug('Выход из сцены') - #if not in_tree: - #mashine_timer.stop() - #signaller.emit_signal('interfer_off_all') - #prd_n_module.cmd_array.append([unit_prd_n.CmdCode.WRITE_ISA, [constants_n.ADDR_UG_LITERA_1, ug_work_1, constants_n.ADDR_UG_LITERA_2, ug_work_2]]) - #else: - #set_default_state() - #control_prd_n.state = control_prd_n.STATE_MASHINE.INIT - #mashine_timer.start() - - -func power_fill(pow_dic: Dictionary, fs_result: Dictionary) -> void: - #if not control_prd_n.block_kasseta_y5_config.yau07 or not control_prd_n.block_kasseta_y5_config.ukp1 or not control_prd_n.block_kasseta_y5_config.ukp2: - #return - var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') +static func power_fill(pow_dic: Dictionary, fs_result: Dictionary, power_amplifier: Array, POWER_THRESHOLD: int) -> void: for i_powapm in power_amplifier: var powamp_meta: String = i_powapm.get_meta('um') var status = STATE_VAL.GOOD if pow_dic else STATE_VAL.NONE + if not pow_dic.has(powamp_meta): return if pow_dic[powamp_meta].size() < 6: status = STATE_VAL.ERROR else: @@ -178,15 +59,43 @@ func power_fill(pow_dic: Dictionary, fs_result: Dictionary) -> void: if powamp_meta in ['um_7', 'um_8', 'um_9', 'um_10', 'um_11', 'um_12'] and not fs_result.fs_3: return i_powapm.value0 = pow_dic[powamp_meta] for i_p in pow_dic[powamp_meta]: - if i_p < constants_n.POWER_THRESHOLD: + if i_p < POWER_THRESHOLD: status = STATE_VAL.ERROR i_powapm.state = status -func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void: - mashine_timer.stop() - block_kasseta_y5_prd_config_n = control_prd_n.block_kasseta_y5_config +func on_press_device() -> void: var nodes_y5: Array = get_tree().get_nodes_in_group('y-5') + var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply') + var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group') + var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') + var module_fs_2: Node = $kasseta_FS_ND/ref_A4 + var dou_2: Node = $dou2_A5 + var module_fs_3: Node = $kasseta_FS_ND/ref_A3 + var dou_3: Node = $dou3_A6 + var for_control_result: Dictionary = { + 'result_dic': unit_prd_n.control_results, + 'power_dic': unit_prd_n.power_result, + 'block_kasseta_y5_config': unit_prd_n.block_kasseta_y5_config, + 'block_ip_config': unit_prd_n.block_ip_config, + 'nodes_y5': nodes_y5, + 'node_ip_power_arr': node_ip_power_arr, + 'fs_nodes': fs_nodes, + 'power_amplifier': power_amplifier, + 'POWER_THRESHOLD': unit_prd_n.constants.POWER_THRESHOLD, + 'name_prd': unit_prd_n.self_name, + 'module_fs_2': module_fs_2, + 'dou_2': dou_2, + 'module_fs_3': module_fs_3, + 'dou_3': dou_3, + } + on_control_result(for_control_result) + + +func on_control_result(for_result_dic: Dictionary) -> void: + ## If control is end + var block_kasseta_y5_prd_config_n: Dictionary = for_result_dic.block_kasseta_y5_config + var nodes_y5: Array = for_result_dic.nodes_y5 for node_y5 in nodes_y5: var meta_y5 = node_y5.get_meta('y5') if block_kasseta_y5_prd_config_n.has(meta_y5): @@ -195,15 +104,15 @@ func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void: break node_y5.state = STATE_VAL.GOOD if block_kasseta_y5_prd_config_n[meta_y5] else STATE_VAL.ERROR - block_ip_config_n = control_prd_n.block_ip_config + var block_ip_config_n: Dictionary = unit_prd_n.block_ip_config var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply') for power_supply in node_ip_power_arr: var meta_ip = power_supply.get_meta('ip') if block_ip_config_n.has(meta_ip) and block_kasseta_y5_prd_config_n.ug: power_supply.state = STATE_VAL.GOOD if block_ip_config_n[meta_ip][1] else STATE_VAL.ERROR - var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group') - for f in fs_nodes: + var result_dic: Dictionary = for_result_dic.result_dic + for f in for_result_dic.fs_nodes: var fs_meta: String = f.get_meta('fs') if result_dic.has(fs_meta): var new_state = result_dic[fs_meta] @@ -211,30 +120,24 @@ func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void: result_dic[fs_meta] = new_state if result_dic.fs_2 == 1: - $kasseta_FS_ND/ref_A4.state = STATE_VAL.GOOD if result_dic.dkm_2 else STATE_VAL.ERROR - $dou2_A5.state = STATE_VAL.GOOD if result_dic.dou_2 else STATE_VAL.ERROR + for_result_dic.module_fs_2.state = STATE_VAL.GOOD if result_dic.dkm_2 else STATE_VAL.ERROR + for_result_dic.dou_2.state = STATE_VAL.GOOD if result_dic.dou_2 else STATE_VAL.ERROR else: result_dic.fs_2 = 0 if result_dic.fs_3 == 1: - $kasseta_FS_ND/ref_A3.state = STATE_VAL.GOOD if result_dic.dkm_3 else STATE_VAL.ERROR - $dou3_A6.state = STATE_VAL.GOOD if result_dic.dou_3 else STATE_VAL.ERROR + for_result_dic.module_fs_3.state = STATE_VAL.GOOD if result_dic.dkm_3 else STATE_VAL.ERROR + for_result_dic.dou_3.state = STATE_VAL.GOOD if result_dic.dou_3 else STATE_VAL.ERROR else: result_dic.fs_3 = 0 + + power_fill(for_result_dic.power_dic, for_result_dic.result_dic, for_result_dic.power_amplifier, for_result_dic.POWER_THRESHOLD) - power_fill(power_dic, result_dic) - - var result = true + var result: bool = true for device in result_dic.values(): if not device: result = false - var name_prd = control_prd_n.self_name - if result: - $control_result.text = 'Прибор ПРД-%s исправен' % name_prd - $control_result.add_theme_color_override('font_color', Color.GREEN) - else: - $control_result.text = 'Прибор ПРД-%s неисправен' % name_prd - $control_result.add_theme_color_override('font_color', Color.RED) + log.message(Logger.INFO, 'Прибор ПРД-%s %s' % [for_result_dic.name_prd, ['неисправен', 'исправен'][int(result)]]) func find_labels(node1: Node): diff --git a/scenes/pribor-prd-v/pribor-prd-v.gd b/scenes/pribor-prd-v/pribor-prd-v.gd index 1b99101..76c3950 100644 --- a/scenes/pribor-prd-v/pribor-prd-v.gd +++ b/scenes/pribor-prd-v/pribor-prd-v.gd @@ -1,126 +1,31 @@ @tool extends 'res://scenes/контроль/прибор.gd' -const constants_v = { - 'POWER_UKP_1': 31, - 'POWER_UKP_2': 63, - 'DKM_BIT_4': 3, - 'DKM_BIT_5': 4, - '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, - 'RAY_DOU_NUM': 0x3, - 'ATT_UM_4': 0x2, - 'ATT_UM_5': 0x3, - 'POWER_UM': 100, - 'TIMER_DELAY': 10.0, - 'STATE_MASHINE_TIMER': 0.3, -} -# Конфигурация параметров для каждого прибора -const PRIBOR_CONFIG_V := { - '1в': {'angle': 0.0, 'sectors': [12, 16]}, - '2в': {'angle': 90.0, 'sectors': [15, 19]}, - '3в': {'angle': 180.0, 'sectors': [14, 18]}, - '4в': {'angle': 270.0, 'sectors': [13, 17]}, -} -# Конфигурация частот и ширин для каждого ФС -const FS_PARAMS_V := { - 4: {'freq': 1227.0, 'width': 100.0}, - 5: {'freq': 1575.0, 'width': 110.0}, -} enum STATE_VAL { NONE = 0, GOOD = 1, ERROR = 2 } -var block_ip_config_v := { - 'maa2000_1': [0, false], - 'maa2000_2': [1, false], - 'ip9_50_1': [2, false], - 'ip9_50_2': [3, false], - 'ip12_50_1': [4, false], - 'ip5_25': [7, false], -} -var block_kasseta_y5_prd_config_v: = { - 'yau07': false, - 'ems': false, - 'ug': false, - 'ukp1': false, - 'ukp2': false, -} # Основные переменные -var start_litera: int = 4 -var ug_work_1: int = 2 ## Аттенюация усилителей мощности -var ug_work_2: int = 3 ## Аттенюация усилителей мощности -# Флаги и таймеры -var mashine_timer: Timer = Timer.new() -var prd_v_module: Object var unit_prd_v: Object -var control_prd_v: Object -# Результаты контроля -var control_results_v: Dictionary = { - 'block_ip': false, # Проверка касет П1 и ИП МА2000 - 'temperature': true, # Проверка температур УМ - 'dkm_4': false, - 'dkm_5': false, - 'dou_4': false, - 'dou_5': false, - 'fs_4': 2, - 'fs_5': 2, -} -var test_control_v = preload('res://scripts/pribor-prd.gd') var ctrl_pos = 70 -func on_state_mashine() -> void: - control_prd_v.state_control_machine() - - func _ready() -> void: if Engine.is_editor_hint(): return - print_debug('В сцене ПРД-В!') + var unit_name = get_meta('unit_name')[0] + var prd_v_module = prd.prd_dict[unit_name] + unit_prd_v = prd_v_module.unit_control + var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') + for temp in power_amplifier: + temp.value1 = -70 + unit_prd_v.connect('control_is_over', Callable(self, 'on_press_device')) + on_press_device() func start_control() -> void: - initialize_connections() - setup_timer() set_default_state() find_labels(self) -func initialize_connections() -> void: - var unit_name = get_meta('unit_name')[0] - prd_v_module = prd.prd_dict[unit_name] - unit_prd_v = prd_v_module.unit_yau07 - - unit_prd_v.connect('line_changed', Callable(self, 'on_line_changed')) - var power_amplifiers: Array = get_tree().get_nodes_in_group('power_amplifier') - var init_data: Dictionary = { - 'control_label': $control_result, - 'power_amplifiers': power_amplifiers, - 'unit_prd': unit_prd_v, - 'module_prd' : prd_v_module, - 'constants': constants_v, - 'prd_config': PRIBOR_CONFIG_V, - 'fs_params': FS_PARAMS_V, - 'block_ip_prd_config': block_ip_config_v, - 'block_kasseta_y5_prd_config': block_kasseta_y5_prd_config_v, - 'control_results': control_results_v, - 'current_litera': start_litera, - } - control_prd_v = test_control_v.TestPRD.new(init_data) - add_child(control_prd_v) - control_prd_v.connect('control_is_over', Callable(self, 'on_control_result')) - - -func setup_timer() -> void: - add_child(mashine_timer) - mashine_timer.connect('timeout', Callable(self, 'on_state_mashine')) - mashine_timer.wait_time = constants_v.STATE_MASHINE_TIMER - mashine_timer.start() - - func set_default_state() -> void: for group in get_tree().get_nodes_in_group('default_reset'): group.state = STATE_VAL.NONE @@ -132,14 +37,8 @@ func set_default_state() -> void: func _enter_tree() -> void: if Engine.is_editor_hint(): return - $control_result.text = 'Выполняется ...' + $control_result.text = 'Ожидается запуск контроля ...' # TODO: Необходимо сделать пулл сообщений $control_result.add_theme_color_override('font_color', Color.ALICE_BLUE) - signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false)) - signaller.connect('режим_журнал', Callable(self, 'on_mode_changed').bind(false)) - signaller.connect('режим_эмс', Callable(self, 'on_mode_changed').bind(false)) - signaller.connect('режим_настройки', Callable(self, 'on_mode_changed').bind(false)) - signaller.connect('режим_контроль', Callable(self, 'on_mode_changed').bind(true)) - func _exit_tree() -> void: @@ -148,28 +47,11 @@ func _exit_tree() -> void: #prd_v_module.cmd_array.append([unit_prd_v.CmdCode.WRITE_ISA, [constants_v.ADDR_UG_LITERA_1, ug_work_1, constants_v.ADDR_UG_LITERA_2, ug_work_2]]) -func on_line_changed(unit_pribor: Object) -> void: - if not unit_pribor.online: - set_default_state() - - -func on_mode_changed(in_tree: bool) -> void: - print_debug('Выход из сцены') - #if not in_tree: - #mashine_timer.stop() - #prd_v_module.cmd_array.append([unit_prd_v.CmdCode.WRITE_ISA, [constants_v.ADDR_UG_LITERA_1, ug_work_1, constants_v.ADDR_UG_LITERA_2, ug_work_2]]) - #signaller.emit_signal('interfer_off_all') - #else: - #set_default_state() - #control_prd_v.state = control_prd_v.STATE_MASHINE.INIT - #mashine_timer.start() - - -func power_fill(pow_dic: Dictionary, fs_result: Dictionary) -> void: - var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') +static func power_fill(pow_dic: Dictionary, fs_result: Dictionary, power_amplifier: Array, POWER_THRESHOLD: int) -> void: for i_powapm in power_amplifier: var powamp_meta: String = i_powapm.get_meta('um') var status = STATE_VAL.GOOD if pow_dic else STATE_VAL.NONE + if not pow_dic.has(powamp_meta): return if pow_dic[powamp_meta].size() < 6: status = STATE_VAL.ERROR else: @@ -177,15 +59,43 @@ func power_fill(pow_dic: Dictionary, fs_result: Dictionary) -> void: if powamp_meta in ['um_7', 'um_8', 'um_9', 'um_10', 'um_11', 'um_12'] and not fs_result.fs_5: return i_powapm.value0 = pow_dic[powamp_meta] for i_p in pow_dic[powamp_meta]: - if i_p < constants_v.POWER_THRESHOLD: + if i_p < POWER_THRESHOLD: status = STATE_VAL.ERROR i_powapm.state = status -func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void: - mashine_timer.stop() - block_kasseta_y5_prd_config_v = control_prd_v.block_kasseta_y5_config +func on_press_device() -> void: var nodes_y5: Array = get_tree().get_nodes_in_group('y-5') + var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply') + var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group') + var power_amplifier: Array = get_tree().get_nodes_in_group('power_amplifier') + var module_fs_4: Node = $kasseta_FS_VD/ref_A6 + var dou_4: Node = $dou4_A5 + var module_fs_5: Node = $kasseta_FS_VD/ref_A2 + var dou_5: Node = $dou5_A6 + var for_control_result: Dictionary = { + 'result_dic': unit_prd_v.control_results, + 'power_dic': unit_prd_v.power_result, + 'block_kasseta_y5_config': unit_prd_v.block_kasseta_y5_config, + 'block_ip_config': unit_prd_v.block_ip_config, + 'nodes_y5': nodes_y5, + 'node_ip_power_arr': node_ip_power_arr, + 'fs_nodes': fs_nodes, + 'power_amplifier': power_amplifier, + 'POWER_THRESHOLD': unit_prd_v.constants.POWER_THRESHOLD, + 'name_prd': unit_prd_v.self_name, + 'module_fs_4': module_fs_4, + 'dou_4': dou_4, + 'module_fs_5': module_fs_5, + 'dou_5': dou_5, + } + on_control_result(for_control_result) + + +static func on_control_result(for_result_dic: Dictionary) -> void: + ## If control is end + var block_kasseta_y5_prd_config_v: Dictionary = for_result_dic.block_kasseta_y5_config + var nodes_y5: Array = for_result_dic.nodes_y5 for node_y5 in nodes_y5: var meta_y5 = node_y5.get_meta('y5') if block_kasseta_y5_prd_config_v.has(meta_y5): @@ -194,15 +104,14 @@ func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void: break node_y5.state = STATE_VAL.GOOD if block_kasseta_y5_prd_config_v[meta_y5] else STATE_VAL.ERROR - block_ip_config_v = control_prd_v.block_ip_config - var node_ip_power_arr: Array = get_tree().get_nodes_in_group('power_supply') - for power_supply in node_ip_power_arr: + var block_ip_config_v: Dictionary = for_result_dic.block_ip_config + for power_supply in for_result_dic.node_ip_power_arr: var meta_ip = power_supply.get_meta('ip') if block_ip_config_v.has(meta_ip) and block_kasseta_y5_prd_config_v.ug: power_supply.state = STATE_VAL.GOOD if block_ip_config_v[meta_ip][1] else STATE_VAL.ERROR - var fs_nodes: Array = get_tree().get_nodes_in_group('fs_group') - for f in fs_nodes: + var result_dic: Dictionary = for_result_dic.result_dic + for f in for_result_dic.fs_nodes: var fs_meta: String = f.get_meta('fs') if result_dic.has(fs_meta): var new_state = result_dic[fs_meta] @@ -210,29 +119,24 @@ func on_control_result(result_dic: Dictionary, power_dic: Dictionary) -> void: result_dic[fs_meta] = new_state if result_dic.fs_5 == 1: - $kasseta_FS_VD/ref_A2.state = STATE_VAL.GOOD if result_dic.dkm_5 else STATE_VAL.ERROR - $dou5_A6.state = STATE_VAL.GOOD if result_dic.dou_5 else STATE_VAL.ERROR + for_result_dic.module_fs_5.state = STATE_VAL.GOOD if result_dic.dkm_5 else STATE_VAL.ERROR + for_result_dic.dou_5.state = STATE_VAL.GOOD if result_dic.dou_5 else STATE_VAL.ERROR else: result_dic.fs_5 = 0 if result_dic.fs_4 == 1: - $kasseta_FS_VD/ref_A6.state = STATE_VAL.GOOD if result_dic.dkm_4 else STATE_VAL.ERROR - $dou4_A5.state = STATE_VAL.GOOD if result_dic.dou_4 else STATE_VAL.ERROR + for_result_dic.module_fs_4.state = STATE_VAL.GOOD if result_dic.dkm_4 else STATE_VAL.ERROR + for_result_dic.dou_4.state = STATE_VAL.GOOD if result_dic.dou_4 else STATE_VAL.ERROR else: result_dic.fs_4 = 0 - power_fill(power_dic, result_dic) + + power_fill(for_result_dic.power_dic, for_result_dic.result_dic, for_result_dic.power_amplifier, for_result_dic.POWER_THRESHOLD) - var result = true + var result: bool = true for device in result_dic.values(): if not device: result = false - var name_prd = control_prd_v.self_name - if result: - $control_result.text = 'Прибор ПРД-%s исправен' % name_prd - $control_result.add_theme_color_override('font_color', Color.GREEN) - else: - $control_result.text = 'Прибор ПРД-%s неисправен' % name_prd - $control_result.add_theme_color_override('font_color', Color.RED) + log.message(Logger.INFO, 'Прибор ПРД-%s %s' % [for_result_dic.name_prd, ['неисправен', 'исправен'][int(result)]]) func find_labels(node1: Node): diff --git a/scenes/tabs-switch/tab-switch.tscn b/scenes/tabs-switch/tab-switch.tscn index 87d344d..2faa2cc 100644 --- a/scenes/tabs-switch/tab-switch.tscn +++ b/scenes/tabs-switch/tab-switch.tscn @@ -106,7 +106,6 @@ theme_override_styles/normal = SubResource("StyleBoxFlat_o1r22") text = "Внешнее управление" horizontal_alignment = 1 vertical_alignment = 1 -metadata/_edit_lock_ = true [node name="тренаж_режим" type="Button" parent="."] layout_mode = 0 @@ -125,7 +124,6 @@ theme_override_styles/normal = SubResource("StyleBoxFlat_imu1q") toggle_mode = true text = "Тренаж" script = ExtResource("9_41d34") -metadata/_edit_lock_ = true [node name="buttontest" type="Button" parent="."] visible = false diff --git a/scenes/работа/работа.gd b/scenes/работа/работа.gd index 423b2e1..efec4e6 100644 --- a/scenes/работа/работа.gd +++ b/scenes/работа/работа.gd @@ -98,7 +98,7 @@ func on_settings_changed(): color_closed = ProjectSettings.get_setting('application/interfer/closed_sectors', Color(0.0, 0.0, 0.0, 1.0)) color_emit_sel = color_select color_closed_emit = color_closed - + color_select *= Color(1.0, 1.0, 1.0, 0.0) color_ecm *= Color(1.0, 1.0, 1.0, 0.0) color_emit_sel *= Color(1.0, 1.0, 1.0, 0.2) @@ -167,6 +167,7 @@ func _ready(): signaller.connect('threat_selected', Callable(self, 'on_threat_selected').bind(nodes)) signaller.connect('interfer_selected', Callable(self, 'on_interfer_selected').bind(nodes)) signaller.connect('interfer_new', Callable(self, 'on_interfer_new')) + signaller.connect('on_prog_ecm_off', Callable(self, 'on_interfer_new')) signaller.connect('interfer_off_all', Callable(self, 'on_interfer_off_all')) signaller.connect('interfer_prinuditelno', Callable(self, 'on_interfer_prinuditelno').bind(nodes)) signaller.connect('fs_selected', Callable(self, 'on_fs_selected')) @@ -521,6 +522,14 @@ func update_fs_colors(): else: fs_colors[key] = color_select $canvas.set_band_colors(fs_colors) + if fs_emit.size(): + if $btn_activate.pressed: + $btn_activate.self_modulate = Color.RED + else: + $btn_activate.self_modulate = Color.WHITE + else: + $btn_activate.self_modulate = Color.WHITE + func unsel_fs_all(need_btns_off: bool): @@ -581,6 +590,8 @@ 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 'отключено') signaller.emit_signal('emit_changed', toggled_on) + if not toggled_on: + $btn_activate.self_modulate = Color.WHITE func on_update_coordinates_label(coordinates_label) -> void: diff --git a/scenes/работа/работа.tscn b/scenes/работа/работа.tscn index ba07943..8313ec3 100644 --- a/scenes/работа/работа.tscn +++ b/scenes/работа/работа.tscn @@ -383,8 +383,8 @@ texture_normal = ExtResource("14_ggrwd") [connection signal="toggled" from="btn_activate" to="." method="on_btn_activate_toggled"] [connection signal="toggled" from="btn_center" to="." method="on_btn_center_toggled"] [connection signal="button_down" from="zoom_plus" to="tilemap" method="_on_zoom_plus_button_down"] -[connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_button_up"] [connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_plus_button_up"] +[connection signal="button_up" from="zoom_plus" to="tilemap" method="_on_zoom_button_up"] [connection signal="button_down" from="zoom_minus" to="tilemap" method="_on_zoom_minus_button_down"] [connection signal="button_up" from="zoom_minus" to="tilemap" method="_on_zoom_button_up"] [connection signal="pressed" from="btn_all_work" to="." method="_on_btn_all_work_pressed"] diff --git a/scripts/interfer.gd b/scripts/interfer.gd index 01c7f52..cacda5d 100644 --- a/scripts/interfer.gd +++ b/scripts/interfer.gd @@ -257,22 +257,34 @@ func on_timer_check_state(unit_instance, ecms, resend_timeout) -> void: func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> void: gos_nmfs.clear() for thr in threats.values(): - if not gos_flag: # Составляется список запретных секторов работы - if (thr.proto in gos_protocols) and thr.fflags.proto: - var fs_arr: Array = [] - prd.find_fs_index(thr.aoa, thr.freq, fs_arr) - if fs_arr.size(): - for item in fs_arr: - var nmfs = prd.FS_PRD[item][1] - gos_nmfs.append(nmfs) + var fs_arr: Array = [] + var th_aoa = fposmod(thr.aoa - course, 360) + prd.find_fs_index(th_aoa, thr.freq, fs_arr) + if fs_arr.size(): + for item in fs_arr: + var nmfs = prd.FS_PRD[item][1] + thr.nmfs = nmfs + if (thr.proto in gos_protocols) and thr.fflags.proto and (not gos_flag): + gos_nmfs.append(nmfs) + + thr.emit_state = 0 + for ecm in ecms.values(): + if thr.nmfs == ecm.nmfs: + set_th_emit(thr, ecm) + var ecm_active = true + if not gos_flag: + if ecm.nmfs in gos_nmfs: + interfer_off(ecm, unit_instance) + ecm_active = false + if ecm_active and (prd.fs_caps_id[ecm.nmfs] in fs_closed): + interfer_off(ecm, unit_instance) + var th_id = thr.id for ecm_i in thrs.keys(): if thrs[ecm_i] == th_id: var ecm = ecms[ecm_i] ecm.params['freq'] = thr.freq - ecm.kni = thr.aoa - course - if ecm.kni < 0: - ecm.kni += 360 + ecm.kni = fposmod(thr.aoa - course, 360) call_ecm_proc(ecm) if ecm.nmfs in gos_nmfs: interfer_off(ecm, unit_instance) @@ -283,23 +295,11 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary, unit_instance) -> v signaller.emit_signal('fs_update_color', ecms) prd.update_fs_state(ecms, trenazh_mode) - - for ecm in ecms.values(): - var ecm_active = true - if not gos_flag: - if ecm.nmfs in gos_nmfs: - interfer_off(ecm, unit_instance) - ecm_active = false - if ecm_active and (prd.fs_caps_id[ecm.nmfs] in fs_closed): - interfer_off(ecm, unit_instance) - - if not auto_enabled: - return - if auto_enabled: for thr in threats.values(): var fs_arr: Array = [] - prd.find_fs_index(thr.aoa, thr.freq, fs_arr) + var th_aoa = fposmod(thr.aoa - course, 360) + prd.find_fs_index(th_aoa, thr.freq, fs_arr) if fs_arr.size(): var need_continue = false for item in fs_arr: @@ -576,58 +576,8 @@ func on_threats_update(threat, ecms, unit_caps): if ecm.kni < 0: ecm.kni += 360 set_nmfs(ecm) - if threat.tmod != 'fm': - if ecm != null: - send_ecm(ecm, unit_caps) - return - var th_fm_dict: Dictionary - var fs_index_arr: Array - prd.find_fs_index(threat.aoa, threat.freq, fs_index_arr) - if fs_index_arr.size() == 0: - if ecm != null: - send_ecm(ecm, unit_caps) - return - var fs_index = fs_index_arr[0] - var nmfs = prd.FS_PRD[fs_index][1] - if ecm == null: - for ecm_i in ecms.values(): - if nmfs != ecm_i.nmfs: continue - if ecm_i.svk != 1: continue - ecm = ecm_i - if ecm == null: return - - for th_index in thrs_dict: - if thrs_dict[th_index].tmod != 'fm': continue - fs_index_arr = [] - prd.find_fs_index(thrs_dict[th_index].aoa, thrs_dict[th_index].freq, fs_index_arr) - if fs_index_arr.size() == 0: continue - if fs_index_arr[0] != fs_index: continue - th_fm_dict[th_index] = thrs_dict[th_index] - if len(th_fm_dict) > 1: - pass - send_ecm(ecm, unit_caps) - - -func get_freq_range(freq_range_dict: Dictionary, th_dict: Dictionary): - for key_i in th_dict: - var min_range: int = 6000 - var key_min = null - for key_j in th_dict: - if key_i == key_j: continue - var width = (th_dict[key_i].width / 2) + (th_dict[key_j].width / 2) - var freq_range = abs(th_dict[key_i].freq - th_dict[key_j].freq) + width - if freq_range < min_range: - key_min = key_j - min_range = freq_range - var max_width = 0 - for key in PDCHM_PARAMS['files'].keys(): - if max_width < key: max_width = key - if min_range > max_width: - th_dict.erase(key_i) - continue - else: - if key_min == null: continue - freq_range_dict[key_i] = [th_dict[key_i], th_dict[key_min], min_range] + if ecm != null: + send_ecm(ecm, unit_caps) func find_threat(freq: int, aoa: float): @@ -677,6 +627,7 @@ func get_krp(threat: threats.Threat): func on_interfer_off(ecm: Interfer, ecms): var sz = ecms.size() + signaller.emit_signal('on_prog_ecm_off', ecm) ecms.erase(ecm.ispp) thrs.erase(ecm.ispp) interfer.cu.erase(ecm.ispp) @@ -712,3 +663,16 @@ func call_ecm_proc(ecm): func on_update_fs_closed(fs_dict): fs_closed = fs_dict + + +func set_th_emit(th: threats.Threat, ecm: Interfer): + var freq_min = ecm.params['freq'] - ecm.params.get('width', settings.WIDTH_MAX)/2 + var freq_max = ecm.params['freq'] + ecm.params.get('width', settings.WIDTH_MAX)/2 + if (th.freq >= freq_min) and (th.freq <= freq_max): + if ecm.svk == 1: + th.emit_state = 2 + elif th.emit_state == 2: + return + else: + th.emit_state = 1 + diff --git a/scripts/prd.gd b/scripts/prd.gd index 7eddaac..5e4f796 100644 --- a/scripts/prd.gd +++ b/scripts/prd.gd @@ -163,10 +163,9 @@ class PRD: var set_ug_state: bool = true ## Необходимо ли записать в УГ настройки signal update_serviceability() - func _init(u_name, u_yau07, u_control: Object): + func _init(u_name, u_yau07): prd_name = u_name unit_yau07 = u_yau07 - unit_control = u_control init_ems_g() @@ -284,11 +283,12 @@ func _ready() -> void: check_dir() for prd_name in PRD_NAMES: var unit_prd = network.get_unit_instance(prd_name) - var control_pribor_prd = preload('res://scripts/pribor-prd.gd') - var unit_control = control_pribor_prd.TestPRD.new({'unit_prd': unit_prd}) - add_child(unit_control) - var new_prd = PRD.new(prd_name, unit_prd, unit_control) + var new_prd = PRD.new(prd_name, unit_prd) prd_dict[prd_name] = new_prd + var control_pribor_prd = preload('res://scripts/pribor-prd.gd') + var unit_control = control_pribor_prd.TestPRD.new({'unit_prd': unit_prd}, new_prd.cmd_array) + add_child(unit_control) + new_prd.unit_control = unit_control for key in FS_PRD.keys(): var fs = Fs.new(key, FS_PRD[key][0]) fs_dict[key] = fs diff --git a/scripts/pribor-prd.gd b/scripts/pribor-prd.gd index 74e97e4..d5d7957 100644 --- a/scripts/pribor-prd.gd +++ b/scripts/pribor-prd.gd @@ -125,7 +125,7 @@ class TestPRD extends Node: 'fs_2': 2, 'fs_3': 2, } -#### + #### var block_ip_config_v := { 'maa2000_1': [0, false], 'maa2000_2': [1, false], @@ -141,7 +141,46 @@ class TestPRD extends Node: 'ukp1': false, 'ukp2': false, } - + var control_results_v: Dictionary = { + 'block_ip': false, # Проверка касет П1 и ИП МА2000 + 'temperature': true, # Проверка температур УМ + 'dkm_4': false, + 'dkm_5': false, + 'dou_4': false, + 'dou_5': false, + 'fs_4': 2, + 'fs_5': 2, + } + #### + var block_kasseta_y5_prd_config_k: = { + 'yau07': false, + 'ems': false, + 'ug': false, + 'ukp1': false, + 'ukp2': false, + } + var control_results_k: Dictionary = { + 'block_ip': false, # Проверка касет П1 и ИП МА2000 + 'temperature': true, + 'dkm_1': false, + 'dkm_6': false, + 'dkm_7': false, + 'dou_6': false, + 'dou_7': false, + 'fs_1': 2, + 'fs_6': 2, + 'fs_7': 2, + } + var block_ip_config_k := { + 'maa2000_1': [0, false], + 'maa2000_2': [1, false], + 'ip9_50_1': [2, false], + 'ip9_50_2': [3, false], + 'ip12_50_1': [4, false], + 'ip9_50_3': [5, false], + 'ip12_50_2': [6, false], + 'ip5_25': [7, false], + } #### const RAY_m5:= 'RAY_m5' @@ -201,7 +240,7 @@ class TestPRD extends Node: 'TEMPERATURE_UKP_2': 79, } - var power_result: Dictionary = { + var power_for_litera: Dictionary = { 1: {RAY_m5: [], RAY_5: [], RAY_15: [], RAY_25: [], RAY_35: [], RAY_45: [],}, 2: {RAY_m5: [], RAY_5: [], RAY_15: [], RAY_25: [], RAY_35: [], RAY_45: [],}, 3: {RAY_m5: [], RAY_5: [], RAY_15: [], RAY_25: [], RAY_35: [], RAY_45: [],}, @@ -224,16 +263,17 @@ class TestPRD extends Node: var flag_si_fs_input: bool = false var flag_si_fs_output: bool = false var unit_prd: Object - var module_prd: Object var power_amplify: Array + var power_result: Dictionary #var control_label: Label var control_timer: Timer = Timer.new() var ems_6666_timer: Timer = Timer.new() var machine_timer: Timer = Timer.new() - signal control_is_over(control_results: Dictionary, power_result: Dictionary) + signal control_is_over() signal update_progress(progress_value: float) signal update_max_value_progress(max_progress_value: int) var cc: int = 0 + var cmd_array: Array var progress_value: float: set(v): @@ -245,13 +285,14 @@ class TestPRD extends Node: var ecms: Dictionary ## Словарь помеховых воздействий ## Инициализация аргуметнов - func _init(init_data: Dictionary) -> void: + func _init(init_data: Dictionary, cmd_array_from_prd: Array) -> void: unit_prd = init_data['unit_prd'] + cmd_array = cmd_array_from_prd func _ready() -> void: - initialize_connections() _determine_self_name() + initialize_connections() setup_timer() @@ -261,7 +302,7 @@ class TestPRD extends Node: ## Пакеты от ЯУ-07 func on_data_received(unit_pribor: Object) -> void: - if not is_inside_tree(): + if machine_timer.is_stopped(): return var status: PackedByteArray = unit_pribor.status @@ -271,11 +312,11 @@ class TestPRD extends Node: socket_status_ems_g(status) _process_dkm_status(status) if current_litera != 0: - var tek_litera: Dictionary = power_result[current_litera] + var tek_litera: Dictionary = power_for_litera[current_litera] var interes = _get_ray_key(state) if interes != '': tek_litera[_get_ray_key(state)] = power_um_ukp(status, current_litera, tek_litera[_get_ray_key(state)]) - power_result[current_litera] = tek_litera + power_for_litera[current_litera] = tek_litera func socket_status_ems_g(packet_form_yau_07: PackedByteArray) -> void: @@ -329,7 +370,7 @@ class TestPRD extends Node: state = STATE_MACHINE.READ_ISA STATE_MACHINE.READ_ISA: if (unit_prd.cmd_state == unit_prd.CmdState.DONE) or (unit_prd.cmd_state == unit_prd.CmdState.FAIL): - _handle_read_isa(module_prd, unit_prd, [constants.ADDR_UG_LITERA_1, constants.ADDR_UG_LITERA_2, constants.ADDR_UG_LITERA_3]) + _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: @@ -349,7 +390,7 @@ class TestPRD extends Node: 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_result, self_name, current_litera, constants) + 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 @@ -400,8 +441,8 @@ class TestPRD extends Node: state = STATE_MACHINE.FS_TURN_ON else: control_results = on_control_result(block_ip_config, control_results) - var send_power_pack = prep_power(power_result, self_name) - emit_signal('control_is_over', control_results, send_power_pack) + power_result = prep_power(power_for_litera, self_name) + emit_signal('control_is_over') machine_timer.stop() @@ -443,15 +484,12 @@ class TestPRD extends Node: 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 - - ##var log_text = dic_att.ATT_UM_3 if current_litera == 1 else dic_att.ATT_UM_1 if current_litera in [2, 4, 6] else dic_att.ATT_UM_2 - ## 'Выполняется настройка угла (%s) и атт (0x0%s)' % [dic_att.RAY_DOU_NUM, log_text] - flag_write_isa = on_ug_setting(module_prd, unit_prd, dic_att) + flag_write_isa = on_ug_setting(unit_prd, dic_att, cmd_array) ## Таймер отправки команды в ЭМС-Г для модуляции func _on_ems_6666_timer() -> void: - module_prd.cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [constants.BASE_ADDR_EMS_G, 6666]]) + cmd_array.append([unit_prd.CmdCode.WRITE_ISA, [constants.BASE_ADDR_EMS_G, 6666]]) ## Таймер вызова машины состояний @@ -499,6 +537,11 @@ class TestPRD extends Node: signaller.conn(signaller.start_contol_device, Callable(self, '_on_start_contol_device')) interfer.connect('interfer_resized', Callable(self, 'on_interfer_resized')) unit_prd.connect('data_received', Callable(self, 'on_data_received')) + signaller.connect('режим_работа', Callable(self, 'on_mode_changed').bind(false)) + signaller.connect('режим_журнал', Callable(self, 'on_mode_changed').bind(false)) + signaller.connect('режим_эмс', Callable(self, 'on_mode_changed').bind(false)) + signaller.connect('режим_настройки', Callable(self, 'on_mode_changed').bind(false)) + signaller.connect('режим_контроль', Callable(self, 'on_mode_changed').bind(true)) func on_interfer_resized(ecms_dic: Dictionary) -> void: @@ -533,9 +576,9 @@ class TestPRD extends Node: constants = DEVICE_CONSTANT.PRD_V.CONSTANTS pribor_config = DEVICE_CONSTANT.PRD_V.PRIBOR_CONFIG fs_parameters = DEVICE_CONSTANT.PRD_V.FS_PARAMS - block_ip_config = block_ip_config_n + block_ip_config = block_ip_config_v block_kasseta_y5_config = block_kasseta_y5_prd_config_v - control_results = control_results_n + control_results = control_results_v current_litera = DEVICE_CONSTANT.PRD_V.START_LITERA if self_name == '1к' or self_name == '2к' or self_name == '3к' or self_name == '4к': progress_value = 0 @@ -543,9 +586,9 @@ class TestPRD extends Node: constants = DEVICE_CONSTANT.PRD_K.CONSTANTS pribor_config = DEVICE_CONSTANT.PRD_K.PRIBOR_CONFIG fs_parameters = DEVICE_CONSTANT.PRD_K.FS_PARAMS - block_ip_config = block_ip_config_n + block_ip_config = block_ip_config_k block_kasseta_y5_config = block_kasseta_y5_prd_config_n - control_results = control_results_n + control_results = control_results_k current_litera = DEVICE_CONSTANT.PRD_K.START_LITERA @@ -562,7 +605,17 @@ class TestPRD extends Node: add_child(machine_timer) machine_timer.connect('timeout', Callable(self, 'on_state_mashine')) - + + func on_mode_changed(in_tree: bool) -> void: + if not in_tree: + progress_value = 0 + machine_timer.stop() + state = STATE_MACHINE.INIT + _handle_fs_turn_off_state() + #prd_v_module.cmd_array.append([unit_prd_v.CmdCode.WRITE_ISA, [constants_v.ADDR_UG_LITERA_1, ug_work_1, constants_v.ADDR_UG_LITERA_2, ug_work_2]]) + else: + pass + func _process_dkm_status(status: PackedByteArray) -> void: if not control_results.has(_get_current_fs_key()): @@ -635,10 +688,10 @@ class TestPRD extends Node: ## Установка угла и аттенюации для УМ - static func on_ug_setting(prd_module: Object, prd_unit: Object, settings_ug: Dictionary) -> bool: + static func on_ug_setting(prd_unit: Object, settings_ug: Dictionary, prd_cmd_array: Array) -> bool: var result_1 = ((settings_ug.ATT_UM_1 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07) var result_2 = ((settings_ug.ATT_UM_2 & 0x07) << 3) | (settings_ug.RAY_DOU_NUM & 0x07) - prd_module.cmd_array.append([prd_unit.CmdCode.WRITE_ISA, [ settings_ug.ADDR_UG_LITERA_1, result_1, + prd_cmd_array.append([prd_unit.CmdCode.WRITE_ISA, [ settings_ug.ADDR_UG_LITERA_1, result_1, settings_ug.ADDR_UG_LITERA_2, result_2, settings_ug.ADDR_UG_LITERA_3, settings_ug.ATT_UM_3, ] @@ -646,8 +699,8 @@ class TestPRD extends Node: return true - static func _handle_read_isa(prd_module: Object, prd_unit: Object, read_isa_ports: Array) -> void: - prd_module.cmd_array.append([prd_unit.CmdCode.READ_ISA, read_isa_ports]) + static func _handle_read_isa(prd_unit: Object, read_isa_ports: Array, prd_cmd_array) -> void: + prd_cmd_array.append([prd_unit.CmdCode.READ_ISA, read_isa_ports]) ## Управаление модулем фс (включить/отключить излучение) @@ -716,14 +769,14 @@ class TestPRD extends Node: for i_temp in 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].value1 = tmp_1 + #power_amplifier[i_temp].value1 = tmp_1 if tmp_1>70: all_temp_is_ok = false if power_amplifier.size() > 12: # Темпуратура от УМ литеры 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].value1 = tmp_1 + #power_amplifier[6].value1 = tmp_1 if tmp_1>70: all_temp_is_ok = false @@ -732,11 +785,11 @@ class TestPRD extends Node: 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) if power_amplifier.size() > 12: - power_amplifier[i_temp+7].value1 = tmp_2 + #power_amplifier[i_temp+7].value1 = tmp_2 if tmp_2>70: all_temp_is_ok = false else: - power_amplifier[i_temp+6].value1 = tmp_2 + #power_amplifier[i_temp+6].value1 = tmp_2 if tmp_2>70: all_temp_is_ok = false return all_temp_is_ok diff --git a/scripts/signaller.gd b/scripts/signaller.gd index c036181..82d2afe 100644 --- a/scripts/signaller.gd +++ b/scripts/signaller.gd @@ -218,3 +218,8 @@ signal clear_klaster () ## Вызывается при нажатии на кнопку "Запуск контроля".[br] signal start_contol_device() + + +## Вызывается при программном отключении помехи.[br] +## [param ecm] - выключаемая помеха ([b]true[/b] +signal on_prog_ecm_off(ecm: interfer.Interfer) diff --git a/scripts/threats.gd b/scripts/threats.gd index 28f6dea..5f39f51 100644 --- a/scripts/threats.gd +++ b/scripts/threats.gd @@ -28,6 +28,8 @@ class Threat: var width: float ## Ширина занимаемого диапазона частот, МГц. var selected: bool ## Флаг, что цель выбрана. var auto_selected: bool = false ## Флаг автомата для целей + var emit_state: int = 0 ## 0 - подавление не назначено, 1 - назначено, 2 - выполняется + var nmfs:int ## Индекс модуля ФС, в зону действия которого попала цель func _init(): clear_fflags() func _to_string() -> String: return 'номер: %d пеленг: %0.1f частота: %0.1f МГц' % [id, aoa, freq] diff --git a/table/table.gd b/table/table.gd index f1706f3..0392d5a 100644 --- a/table/table.gd +++ b/table/table.gd @@ -448,6 +448,7 @@ func remove_row(i_row: int): if nodes.has(sel_key): var selector = nodes[sel_key] + if selector == null: return var prnt = selector.get_parent() prnt.remove_child(selector) selector.queue_free() @@ -484,8 +485,11 @@ func next_index(indexes: Array) -> void: func swap_nodes(nodes_copy, node_key_format, i0, i1) -> void: var key0 = node_key_format % [i0.y, i0.x] var key1 = node_key_format % [i1.y, i1.x] - nodes_copy[key1] = nodes[key0] - nodes_copy[key1].name = key1 + if is_instance_valid(nodes[key0]): + nodes_copy[key1] = nodes[key0] + nodes_copy[key1].name = key1 + else: + print_debug("Ошибка: нод ", key0, " был освобожден") ## Переназначает ключи в соответствии с размерами таблицы.