extends Panel const yau_devices: Array[Dictionary] = [ {'name': 'ПРД-Н1', 'addr': '10.1.1.11', 'port': 50011}, {'name': 'ПРД-Н2', 'addr': '10.1.1.21', 'port': 50021}, {'name': 'ПРД-Н3', 'addr': '10.1.1.31', 'port': 50031}, {'name': 'ПРД-Н4', 'addr': '10.1.1.41', 'port': 50041}, {'name': 'ПРД-В1', 'addr': '10.1.1.12', 'port': 50012}, {'name': 'ПРД-В2', 'addr': '10.1.1.22', 'port': 50022}, {'name': 'ПРД-В3', 'addr': '10.1.1.32', 'port': 50032}, {'name': 'ПРД-В4', 'addr': '10.1.1.42', 'port': 50042}, {'name': 'ПРД-К1', 'addr': '10.1.1.13', 'port': 50013}, {'name': 'ПРД-К2', 'addr': '10.1.1.23', 'port': 50023}, {'name': 'ПРД-К3', 'addr': '10.1.1.33', 'port': 50033}, {'name': 'ПРД-К4', 'addr': '10.1.1.43', 'port': 50043} ] func _ready() -> void: for device in yau_devices: $select_device.add_item(device['name']) ## Включаем обработку событий мыши $select_device.mouse_filter = Control.MOUSE_FILTER_PASS $select_device.gui_input.connect(_on_select_device_gui_input) Network.connect('yau_receive', Callable(self, '_on_parse_packet_yau_07')) Network.connect('yau_status_line', Callable(self, '_on_yau_status')) func _on_select_device_item_selected(index: int) -> void: if index == 0: # Обработка выбора "NONE" $addr.text = "Устройство не выбрано (NONE)" Network.send_array = [] Network.ip_address_yau = '' Network.ip_port_yau = 0 elif index > 0 and index - 1 < yau_devices.size(): var device: Dictionary = yau_devices[index - 1] var changed_addr_yau: String = device['addr'] var changed_port_yau: int = device['port'] $addr.text = "Адрес: %s" % changed_addr_yau Network.send_array = [] Network.ip_address_yau = changed_addr_yau Network.ip_port_yau = changed_port_yau else: print("Неверный индекс: ", index) func _on_select_device_gui_input(event: InputEvent) -> void: if event is InputEventMouseButton: var mouse_event: InputEventMouseButton = event if mouse_event.pressed: if mouse_event.button_index == MOUSE_BUTTON_WHEEL_UP: # Прокрутка вверх var current_index = $select_device.selected if current_index > 0: $select_device.select(current_index - 1) $select_device.item_selected.emit(current_index - 1) elif mouse_event.button_index == MOUSE_BUTTON_WHEEL_DOWN: # Прокрутка вниз var current_index = $select_device.selected if current_index < $select_device.item_count - 1: $select_device.select(current_index + 1) $select_device.item_selected.emit(current_index + 1) func _on_parse_packet_yau_07(packet_form_yau_07: PackedByteArray) -> void: #print_debug('in _on_parse_packet_yau_07') socket_status_ems_g(packet_form_yau_07) parser_power_um(packet_form_yau_07) parser_temperature_um(packet_form_yau_07) dkm(packet_form_yau_07) var receive_yau_counter: Array = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] func _on_yau_status(addr: String): var count_packets_await: int = 20 var status_yau_list = $status_yau_list.get_children() var status_label = $status_yau if addr.is_empty(): # Сброс состояния, если адрес пуст (нет связи) for label in status_yau_list: label.text = '' status_label.modulate = Color.CRIMSON status_label.text = 'ЯУ-07Б: нет связи' return status_label.text = '' # Убираем статус, если есть сигнал от ЯУ-07Б # Обновляем счетчики for i in Constants.ADDRESSES.size(): var address_match = (Constants.ADDRESSES[i][1] == addr) receive_yau_counter[i] = 0 if address_match else (receive_yau_counter[i] + 1) & 0xFFF # Обновляем статусы элементов for i in status_yau_list.size(): var label = status_yau_list[i] var address_info = Constants.ADDRESSES[i] label.text = address_info[0] label.modulate = Color.AQUAMARINE if receive_yau_counter[i] < count_packets_await else Color.DARK_GRAY # Если счетчик >= count_packets_await, помечаем серым, иначе — аквамарином ## Отображение статуса входа/выхода от ЭМС-Г func socket_status_ems_g(packet_form_yau_07: PackedByteArray) -> void: var count_sockets: int = 16 var in_blank: int = packet_form_yau_07.decode_u16(Constants.DataIndices.IN_BLANK_PRD) var in_impulse: int = packet_form_yau_07.decode_u16(Constants.DataIndices.IN_IMPULS_PRD) var out_blank: int = packet_form_yau_07.decode_u16(Constants.DataIndices.OUT_BLANK_PRD) var out_impulse: int = packet_form_yau_07.decode_u16(Constants.DataIndices.OUT_IMPULS_PRD) process_sockets_input(in_blank, in_impulse, count_sockets) process_sockets_output(out_blank, out_impulse, count_sockets) func process_sockets_input(in_blank: int, in_impulse: int, count: int): var group_socket_status: Array = get_tree().get_nodes_in_group("input_socket_status") for i in count: var frame_type = Constants.Frame.WORK if (in_blank & (1 << i)) != 0: frame_type = Constants.Frame.CONSTANT elif (in_impulse & (1 << i)) != 0: frame_type = Constants.Frame.VARIABLE set_frame(group_socket_status[i], frame_type) func process_sockets_output(out_blank: int, out_impulse: int, count: int): for i in count: var group_socket_status: Array = get_tree().get_nodes_in_group("output_socket_status") var frame_type = Constants.Frame.WORK if (out_blank & (1 << i)) != 0: frame_type = Constants.Frame.CONSTANT elif (out_impulse & (1 << i)) != 0: frame_type = Constants.Frame.VARIABLE set_frame(group_socket_status[i], frame_type) func set_frame(node: Node, val: int): node.set_frame(val) ## Значения температуры и мощнсти от УКП func parser_power_um(data_from_yau_07: PackedByteArray) -> void: var array_power_1 = get_tree().get_nodes_in_group("power") for i_pow in range(6): ## Мощность от УКП_1 var power_ukp_1 = data_from_yau_07.decode_u16(Constants.DataIndices.POWER_UKP_1 + 2 * i_pow) array_power_1[i_pow].text = '%d' % power_ukp_1 var array_power_2 = get_tree().get_nodes_in_group("power") for i_pow in range(6): ## Мощность от УКП_2 if len(data_from_yau_07) > Constants.DataIndices.POWER_UKP_2 + 2 * i_pow: var power_ukp_2 = data_from_yau_07.decode_u16(Constants.DataIndices.POWER_UKP_2 + 2 * i_pow) array_power_2[i_pow+6].text = '%d' % power_ukp_2 #if len(data_from_yau_07) > Constants.DataIndices.TEMPERATURE_UKP_1 + 2 * 7: #var power_ukp_3 = data_from_yau_07.decode_u16(Constants.DataIndices.POWER_UKP_1 + 2 * 7) #var temperature_ukp_3 = data_from_yau_07.decode_u16(Constants.DataIndices.TEMPERATURE_UKP_1 + 2 * 7) #var TMP = Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_3) * Constants.TEMP + 3 #node_select3.set_node_text(0, 1, '%d' % power_ukp_3) #node_select3.set_node_text(1,1, '%d °С' % TMP) func parser_temperature_um(data_from_yau_07: PackedByteArray) -> void: var array_temperature = get_tree().get_nodes_in_group("temperature") for i_tmp in range(6): ## Температура от УКП_1 var temperature_ukp_1 = data_from_yau_07.decode_u16(Constants.DataIndices.TEMPERATURE_UKP_1 + 2 * i_tmp) var TMP = Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * Constants.TEMP + 3 array_temperature[i_tmp].text = '%d °С' % TMP for i_tmp in range(6): ## Температура от УКП_2 if len(data_from_yau_07) > Constants.DataIndices.TEMPERATURE_UKP_2 + 2 * i_tmp: var temperature_ukp_2 = data_from_yau_07.decode_u16(Constants.DataIndices.TEMPERATURE_UKP_2 + 2 * i_tmp) var TMP = Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_2) * Constants.TEMP + 3 array_temperature[i_tmp+6].text = '%d °С' % TMP func dkm(data_from_yau_07: PackedByteArray)-> void: var local_dkm = data_from_yau_07.decode_u8(Constants.DataIndices.DKM) $DKM_grid/DKM.text = 'DKM: ' + str(local_dkm)