From 66241101923258e20bbb9e0a9672025959c9b724 Mon Sep 17 00:00:00 2001 From: TotMaxim Date: Thu, 20 Nov 2025 21:37:17 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=A3=D0=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/default_data.json | 136 +++++++++++ main.gd | 187 +++++++++++++++- main.tscn | 470 +++++++++++++++++++++++++++++---------- udp_broadcast.gd | 47 +++- 4 files changed, 721 insertions(+), 119 deletions(-) create mode 100644 config/default_data.json diff --git a/config/default_data.json b/config/default_data.json new file mode 100644 index 0000000..49e3337 --- /dev/null +++ b/config/default_data.json @@ -0,0 +1,136 @@ +{ + "default_data": { + "ПРД-Н1": { + "temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31], + "power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111], + "sockets": [false, false, false, false, false], + "dkm": [false, false, false, false, false, false, false], + "dou2": [false, false, false, false, false, false, false], + "dou3": [false, false, false, false, false, false, false], + "att2": [false, false, false, false, false, false, false, false], + "att3": [false, false, false, false, false, false, false, false], + "ip": [false, false, false, false, false, false, false, false] + }, + "ПРД-В1": { + "temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31], + "power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111], + "sockets": [false, false, false, false, false], + "dkm": [false, false, false, true, false, false, false], + "dou2": [false, false, false, false, false, false, false], + "dou3": [false, false, false, false, false, false, false], + "att2": [false, false, false, false, false, false, false, false], + "att3": [false, false, false, false, false, false, false, false], + "ip": [false, false, false, false, false, false, false, true] + }, + "ПРД-К1": { + "temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32], + "power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112], + "sockets": [false, false, false, false, false], + "dkm": [false, false, false, false, false, false, false], + "dou2": [false, false, false, false, false, false, false], + "dou3": [false, false, false, false, false, false, false], + "att2": [false, false, false, false, false, false, false, false], + "att3": [false, false, false, false, false, false, false, false], + "ip": [false, false, false, false, false, false, false, false] + }, + "ПРД-Н2": { + "temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31], + "power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111], + "sockets": [false, false, false, false, false], + "dkm": [false, false, false, false, false, false, false], + "dou2": [false, false, false, false, false, false, false], + "dou3": [false, false, false, false, false, false, false], + "att2": [false, false, false, false, false, false, false, false], + "att3": [false, false, false, false, false, false, false, false], + "ip": [false, false, false, false, false, false, false, false] + }, + "ПРД-В2": { + "temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31], + "power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111], + "sockets": [false, false, false, false, false], + "dkm": [false, false, false, false, false, false, false], + "dou2": [false, false, false, false, false, false, false], + "dou3": [false, false, false, false, false, false, false], + "att2": [false, false, false, false, false, false, false, false], + "att3": [false, false, false, false, false, false, false, false], + "ip": [false, false, false, false, false, false, false, false] + }, + "ПРД-К2": { + "temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32], + "power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112], + "sockets": [false, false, false, false, false], + "dkm": [false, false, false, false, false, false, false], + "dou2": [false, false, false, false, false, false, false], + "dou3": [false, false, false, false, false, false, false], + "att2": [false, false, false, false, false, false, false, false], + "att3": [false, false, false, false, false, false, false, false], + "ip": [false, false, false, false, false, false, false, false] + }, + "ПРД-Н3": { + "temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31], + "power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111], + "sockets": [false, false, false, false, false], + "dkm": [false, false, false, false, false, false, false], + "dou2": [false, false, false, false, false, false, false], + "dou3": [false, false, false, false, false, false, false], + "att2": [false, false, false, false, false, false, false, false], + "att3": [false, false, false, false, false, false, false, false], + "ip": [false, false, false, false, false, false, false, false] + }, + "ПРД-В3": { + "temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31], + "power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111], + "sockets": [false, false, false, false, false], + "dkm": [false, false, false, false, false, false, false], + "dou2": [false, false, false, false, false, false, false], + "dou3": [false, false, false, false, false, false, false], + "att2": [false, false, false, false, false, false, false, false], + "att3": [false, false, false, false, false, false, false, false], + "ip": [false, false, false, false, false, false, false, false] + }, + "ПРД-К3": { + "temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32], + "power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112], + "sockets": [false, false, false, false, false], + "dkm": [false, false, false, false, false, false, false], + "dou2": [false, false, false, false, false, false, false], + "dou3": [false, false, false, false, false, false, false], + "att2": [false, false, false, false, false, false, false, false], + "att3": [false, false, false, false, false, false, false, false], + "ip": [false, false, false, false, false, false, false, false] + }, + "ПРД-Н4": { + "temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31], + "power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111], + "sockets": [false, false, false, false, false], + "dkm": [false, false, false, false, false, false, false], + "dou2": [false, false, false, false, false, false, false], + "dou3": [false, false, false, false, false, false, false], + "att2": [false, false, false, false, false, false, false, false], + "att3": [false, false, false, false, false, false, false, false], + "ip": [false, false, false, false, false, false, false, false] + }, + "ПРД-В4": { + "temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31], + "power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111], + "sockets": [false, false, false, false, false], + "dkm": [false, false, false, false, false, false, false], + "dou2": [false, false, false, false, false, false, false], + "dou3": [false, false, false, false, false, false, false], + "att2": [false, false, false, false, false, false, false, false], + "att3": [false, false, false, false, false, false, false, false], + "ip": [false, false, false, false, false, false, false, false] + }, + "ПРД-К4": { + "temperature_ukp": [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32], + "power_ukp": [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112], + "sockets": [false, false, false, false, false], + "dkm": [false, false, false, false, false, false, false], + "dou2": [false, false, false, false, false, false, false], + "dou3": [false, false, false, false, false, false, false], + "att2": [false, false, false, false, false, false, false, false], + "att3": [false, false, false, false, false, false, false, false], + "ip": [false, false, false, false, false, false, false, false] + } + } +} diff --git a/main.gd b/main.gd index 7062361..1592b71 100644 --- a/main.gd +++ b/main.gd @@ -1,15 +1,101 @@ extends Control +const CONFIG_PATH = "res://config/default_data.json" const BUFFER_SIZE = 32 -var dictionary_yau07: Dictionary var udp_broadcast: UDPBroadcast +var default_data: Dictionary = {} +var dictionary_yau07: Dictionary var dictionary_sockets_bit: Dictionary ## Байт 8 для отправки о состоянии ячеек +func _load_default_data(): + var file = FileAccess.open(CONFIG_PATH, FileAccess.READ) + if file: + var json = JSON.new() + var error = json.parse(file.get_as_text()) + if error == OK: + default_data = json.data["default_data"] + else: + push_error("JSON Parse Error: ", json.get_error_message()) + file.close() + else: + push_error("Failed to load config file: ", CONFIG_PATH) + + +func _apply_default_data(): + var prd_nodes = get_tree().get_nodes_in_group('prd') + + for prd in prd_nodes: + var device_name = prd.get_meta('yau07') + if default_data.has(device_name): + var device_data = default_data[device_name] + _fill_ukp_fields(prd, device_data) + + +# Заполняем поля температур +func _fill_ukp_fields(prd_node: Control, device_data: Dictionary): + var device_name = prd_node.get_meta('yau07') + + # Заполняем поля температур + var temp_fields = _get_ukp_nodes_for_device(device_name, [prd_node], "temperature_ukp") + if device_data.has("temperature_ukp"): + for i in range(min(temp_fields.size(), device_data["temperature_ukp"].size())): + temp_fields[i].text = str(device_data["temperature_ukp"][i]) + + # Заполняем поля мощности + var power_fields = _get_ukp_nodes_for_device(device_name, [prd_node], "power_ukp") + if device_data.has("power_ukp"): + for i in range(min(power_fields.size(), device_data["power_ukp"].size())): + power_fields[i].text = str(device_data["power_ukp"][i]) + + # Устанавливаем состояния сокетов + if device_data.has("sockets"): + var socket_fields = _get_ukp_nodes_for_device(device_name, [prd_node], "socket") + for i in range(min(socket_fields.size(), device_data["sockets"].size())): + socket_fields[i].set_pressed_no_signal(device_data["sockets"][i]) + + # Устанавливаем состояния ДКМ + if device_data.has("dkm"): + var dkm_fields = _get_ukp_nodes_for_device(device_name, [prd_node], "dkm") + for i in range(min(dkm_fields.size(), device_data["dkm"].size())): + dkm_fields[i].set_pressed_no_signal(device_data["dkm"][i]) + + # Устанавливаем состояния ДОУ2 + if device_data.has("dou2"): + var dou2_fields = _get_ukp_nodes_for_device(device_name, [prd_node], "dou2") + for i in range(min(dou2_fields.size(), device_data["dou2"].size())): + dou2_fields[i].set_pressed_no_signal(device_data["dou2"][i]) + + # Устанавливаем состояния ДОУ3 + if device_data.has("dou3"): + var dou3_fields = _get_ukp_nodes_for_device(device_name, [prd_node], "dou3") + for i in range(min(dou3_fields.size(), device_data["dou3"].size())): + dou3_fields[i].set_pressed_no_signal(device_data["dou3"][i]) + + # Устанавливаем состояния аттенюаторов 2 + if device_data.has("att2"): + var att2_fields = _get_ukp_nodes_for_device(device_name, [prd_node], "att2") + for i in range(min(att2_fields.size(), device_data["att2"].size())): + att2_fields[i].set_pressed_no_signal(device_data["att2"][i]) + + # Устанавливаем состояния аттенюаторов 3 + if device_data.has("att3"): + var att3_fields = _get_ukp_nodes_for_device(device_name, [prd_node], "att3") + for i in range(min(att3_fields.size(), device_data["att3"].size())): + att3_fields[i].set_pressed_no_signal(device_data["att3"][i]) + + # Устанавливаем состояния источников питания (с инверсией) + if device_data.has("ip"): + var ip_fields = _get_ukp_nodes_for_device(device_name, [prd_node], "ip") + for i in range(min(ip_fields.size(), device_data["ip"].size())): + # Для IP используется инверсия: true в JSON = нажато = бит 0 + ip_fields[i].set_pressed_no_signal(device_data["ip"][i]) + func _ready() -> void: var device_yau07: Array = get_tree().get_nodes_in_group('device-addr') for device in device_yau07: device.connect('toggled', on_modify_device.bind(device.get_meta('device'))) + var sockets: Array = get_tree().get_nodes_in_group('socket') for soc in sockets: soc.connect('toggled', _on_modify_sockets.bind(soc.get_meta('bit'), soc.get_meta('device'))) ## Мета bit от 0 до 3, мета ПРД @@ -26,6 +112,21 @@ func _ready() -> void: for dkm in dkm_arr_node: dkm.connect('toggled', _on_modify_dkm.bind(dkm.get_meta('bit'), dkm.get_meta('device'))) + var dou2_arr_node: Array = get_tree().get_nodes_in_group('dou2') + for dou2 in dou2_arr_node: + dou2.connect('toggled', _on_modify_dou2.bind(dou2.get_meta('bit'), dou2.get_meta('device'))) + + var dou3_arr_node: Array = get_tree().get_nodes_in_group('dou3') + for dou3 in dou3_arr_node: + dou3.connect('toggled', _on_modify_dou3.bind(dou3.get_meta('bit'), dou3.get_meta('device'))) + + var ip_arr_node: Array = get_tree().get_nodes_in_group('ip') + for ip in ip_arr_node: + ip.connect('toggled', _on_modify_ip.bind(ip.get_meta('bit'), ip.get_meta('device'))) + _update_tab_container() + _load_default_data() + _apply_default_data() + func _exit_tree(): for device in dictionary_yau07: @@ -45,6 +146,35 @@ func on_modify_device(toggled: bool, name_device: String) -> void: dictionary_yau07[name_device].close_udp_unit() dictionary_yau07.erase(name_device) print("Устройство %s деактивировано" % name_device) + _update_tab_container() + + +func _update_tab_container(): + var tab_container = $TabContainer + var device_nodes = get_tree().get_nodes_in_group('device-addr') + var has_visible_tabs = false + # Проходим по всем вкладкам и обновляем их состояние + for i in range(tab_container.get_tab_count()): + var tab_control = tab_container.get_tab_control(i) + var device_name = tab_control.get_meta('yau07', '') + + # Ищем соответствующую кнопку устройства + var device_button = null + for device in device_nodes: + if device.get_meta('device') == device_name: + device_button = device + break + + # Если нашли кнопку, устанавливаем состояние вкладки + if device_button: + var is_enabled = device_button.button_pressed + tab_container.set_tab_disabled(i, !is_enabled) + + if is_enabled: + has_visible_tabs = true + + # Если все вкладки заблокированы, скрываем TabContainer + tab_container.visible = has_visible_tabs ## Функция для установки статусов ячеек на связи (УГ, ЭМС-Г, УКП) @@ -67,6 +197,61 @@ func _on_modify_dkm(toggled: bool, bit: int, device: String)->void: print("Статус DKM устройства %s обновлен: 0x%04X" % [device, new_status]) +## Функция для установки статусов ДОУ2 в ПРД +func _on_modify_dou2(toggled: bool, bit: int, device: String)->void: + if not toggled: + var dou2_arr_node = get_tree().get_nodes_in_group('dou2') + for dou2 in dou2_arr_node: + if dou2.has_meta('bit') and dou2.get_meta('bit') == bit: + dou2.set_pressed(true) + if toggled: + var dou2_arr_node = get_tree().get_nodes_in_group('dou2') + for dou2 in dou2_arr_node: + if dou2.has_meta('bit') and dou2.get_meta('bit') != bit and dou2.button_pressed: + dou2.set_pressed_no_signal(false) + + # Всегда устанавливаем статус, если кнопка нажата + if toggled and dictionary_yau07.has(device): + var udp_unit = dictionary_yau07[device] + udp_unit.set_dou2_status(bit) + + +## Функция для установки статусов ДОУ3 в ПРД +func _on_modify_dou3(toggled: bool, bit: int, device: String)->void: + if not toggled: + var dou3_arr_node = get_tree().get_nodes_in_group('dou3') + for dou3 in dou3_arr_node: + if dou3.has_meta('bit') and dou3.get_meta('bit') == bit: + dou3.set_pressed(true) + + if toggled: + var dou3_arr_node = get_tree().get_nodes_in_group('dou3') + for dou3 in dou3_arr_node: + if dou3.has_meta('bit') and dou3.get_meta('bit') != bit and dou3.button_pressed: + dou3.set_pressed_no_signal(false) + + # Всегда устанавливаем статус, если кнопка нажата + if toggled and dictionary_yau07.has(device): + var udp_unit = dictionary_yau07[device] + udp_unit.set_dou3_status(bit) + + +func _on_modify_ip(toggled: bool, bit: int, device: String): + if dictionary_yau07.has(device): + var udp_unit = dictionary_yau07[device] + var current_status = udp_unit.get_ip_status() + # Инверсия: нажата = 0, отжата = 1 + var bit_value = 0 if toggled else 1 + var new_status + if bit_value == 0: + new_status = current_status & ~(1 << bit) # Устанавливаем бит в 0 + else: + new_status = current_status | (1 << bit) # Устанавливаем бит в 1 + + udp_unit.set_ip_status(new_status) + print("Статус ИП устройства %s обновлен: 0x%04X" % [device, new_status]) + + ## Функция для установки значений в ячейках УКП func _on_ukp_submitted(_new_text: String, device: String) -> void: if not dictionary_yau07.has(device): diff --git a/main.tscn b/main.tscn index a80a9f4..63d3f88 100644 --- a/main.tscn +++ b/main.tscn @@ -145,194 +145,436 @@ text = "Загрузка ЭМС" metadata/bit = 4 metadata/device = "ПРД-Н1" -[node name="ukp_1" type="GridContainer" parent="TabContainer/ПРД-Н1"] -layout_mode = 2 -offset_left = 205.0 -offset_top = 7.0 -offset_right = 939.0 -offset_bottom = 95.0 -columns = 7 - -[node name="Label" type="Label" parent="TabContainer/ПРД-Н1/ukp_1"] -custom_minimum_size = Vector2(0, 30) -layout_mode = 2 -theme_override_styles/normal = SubResource("StyleBoxFlat_ig7tw") -text = "Температуры" -horizontal_alignment = 1 - -[node name="TextEdit" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["temperature_ukp"]] -custom_minimum_size = Vector2(100, 35) -layout_mode = 2 -placeholder_text = "0" -metadata/device = "ПРД-Н1" - -[node name="TextEdit2" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["temperature_ukp"]] -custom_minimum_size = Vector2(100, 35) -layout_mode = 2 -placeholder_text = "0" -metadata/device = "ПРД-Н1" - -[node name="TextEdit3" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["temperature_ukp"]] -custom_minimum_size = Vector2(100, 35) -layout_mode = 2 -placeholder_text = "0" -metadata/device = "ПРД-Н1" - -[node name="TextEdit4" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["temperature_ukp"]] -custom_minimum_size = Vector2(100, 35) -layout_mode = 2 -placeholder_text = "0" -metadata/device = "ПРД-Н1" - -[node name="TextEdit5" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["temperature_ukp"]] -custom_minimum_size = Vector2(100, 35) -layout_mode = 2 -placeholder_text = "0" -metadata/device = "ПРД-Н1" - -[node name="TextEdit6" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["temperature_ukp"]] -custom_minimum_size = Vector2(100, 35) -layout_mode = 2 -placeholder_text = "0" -metadata/device = "ПРД-Н1" - -[node name="Label2" type="Label" parent="TabContainer/ПРД-Н1/ukp_1"] -custom_minimum_size = Vector2(0, 30) -layout_mode = 2 -theme_override_styles/normal = SubResource("StyleBoxFlat_ig7tw") -text = "Мощность" -horizontal_alignment = 1 - -[node name="TextEdit7" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["power_ukp"]] -custom_minimum_size = Vector2(100, 35) -layout_mode = 2 -placeholder_text = "0" -metadata/device = "ПРД-Н1" - -[node name="TextEdit8" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["power_ukp"]] -custom_minimum_size = Vector2(100, 35) -layout_mode = 2 -placeholder_text = "0" -metadata/device = "ПРД-Н1" - -[node name="TextEdit9" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["power_ukp"]] -custom_minimum_size = Vector2(100, 35) -layout_mode = 2 -placeholder_text = "0" -metadata/device = "ПРД-Н1" - -[node name="TextEdit10" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["power_ukp"]] -custom_minimum_size = Vector2(100, 35) -layout_mode = 2 -placeholder_text = "0" -metadata/device = "ПРД-Н1" - -[node name="TextEdit11" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["power_ukp"]] -custom_minimum_size = Vector2(100, 35) -layout_mode = 2 -placeholder_text = "0" -metadata/device = "ПРД-Н1" - -[node name="TextEdit12" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_1" groups=["power_ukp"]] -custom_minimum_size = Vector2(100, 35) -layout_mode = 2 -placeholder_text = "0" -metadata/device = "ПРД-Н1" - -[node name="ukp_2" type="GridContainer" parent="TabContainer/ПРД-Н1"] +[node name="TabBar" type="TabContainer" parent="TabContainer/ПРД-Н1"] layout_mode = 0 -offset_left = 205.0 -offset_top = 103.0 -offset_right = 939.0 -offset_bottom = 191.0 -columns = 7 +offset_left = 199.0 +offset_top = 9.0 +offset_right = 957.0 +offset_bottom = 334.0 +current_tab = 2 +tabs_position = 1 +tab_focus_mode = 0 -[node name="Label" type="Label" parent="TabContainer/ПРД-Н1/ukp_2"] +[node name="ukp_1" type="GridContainer" parent="TabContainer/ПРД-Н1/TabBar"] +visible = false +layout_mode = 2 +columns = 7 +metadata/_tab_index = 0 + +[node name="Label" type="Label" parent="TabContainer/ПРД-Н1/TabBar/ukp_1"] custom_minimum_size = Vector2(0, 30) layout_mode = 2 theme_override_styles/normal = SubResource("StyleBoxFlat_ig7tw") text = "Температуры" horizontal_alignment = 1 -[node name="TextEdit" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["temperature_ukp"]] +[node name="TextEdit" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["temperature_ukp"]] custom_minimum_size = Vector2(100, 35) layout_mode = 2 placeholder_text = "0" metadata/device = "ПРД-Н1" -[node name="TextEdit2" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["temperature_ukp"]] +[node name="TextEdit2" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["temperature_ukp"]] custom_minimum_size = Vector2(100, 35) layout_mode = 2 placeholder_text = "0" metadata/device = "ПРД-Н1" -[node name="TextEdit3" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["temperature_ukp"]] +[node name="TextEdit3" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["temperature_ukp"]] custom_minimum_size = Vector2(100, 35) layout_mode = 2 placeholder_text = "0" metadata/device = "ПРД-Н1" -[node name="TextEdit4" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["temperature_ukp"]] +[node name="TextEdit4" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["temperature_ukp"]] custom_minimum_size = Vector2(100, 35) layout_mode = 2 placeholder_text = "0" metadata/device = "ПРД-Н1" -[node name="TextEdit5" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["temperature_ukp"]] +[node name="TextEdit5" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["temperature_ukp"]] custom_minimum_size = Vector2(100, 35) layout_mode = 2 placeholder_text = "0" metadata/device = "ПРД-Н1" -[node name="TextEdit6" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["temperature_ukp"]] +[node name="TextEdit6" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["temperature_ukp"]] custom_minimum_size = Vector2(100, 35) layout_mode = 2 placeholder_text = "0" metadata/device = "ПРД-Н1" -[node name="Label2" type="Label" parent="TabContainer/ПРД-Н1/ukp_2"] +[node name="Label2" type="Label" parent="TabContainer/ПРД-Н1/TabBar/ukp_1"] custom_minimum_size = Vector2(0, 30) layout_mode = 2 theme_override_styles/normal = SubResource("StyleBoxFlat_ig7tw") text = "Мощность" horizontal_alignment = 1 -[node name="TextEdit7" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["power_ukp"]] +[node name="TextEdit7" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["power_ukp"]] custom_minimum_size = Vector2(100, 35) layout_mode = 2 placeholder_text = "0" metadata/device = "ПРД-Н1" -[node name="TextEdit8" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["power_ukp"]] +[node name="TextEdit8" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["power_ukp"]] custom_minimum_size = Vector2(100, 35) layout_mode = 2 placeholder_text = "0" metadata/device = "ПРД-Н1" -[node name="TextEdit9" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["power_ukp"]] +[node name="TextEdit9" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["power_ukp"]] custom_minimum_size = Vector2(100, 35) layout_mode = 2 placeholder_text = "0" metadata/device = "ПРД-Н1" -[node name="TextEdit10" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["power_ukp"]] +[node name="TextEdit10" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["power_ukp"]] custom_minimum_size = Vector2(100, 35) layout_mode = 2 placeholder_text = "0" metadata/device = "ПРД-Н1" -[node name="TextEdit11" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["power_ukp"]] +[node name="TextEdit11" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["power_ukp"]] custom_minimum_size = Vector2(100, 35) layout_mode = 2 placeholder_text = "0" metadata/device = "ПРД-Н1" -[node name="TextEdit12" type="LineEdit" parent="TabContainer/ПРД-Н1/ukp_2" groups=["power_ukp"]] +[node name="TextEdit12" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_1" groups=["power_ukp"]] custom_minimum_size = Vector2(100, 35) layout_mode = 2 placeholder_text = "0" metadata/device = "ПРД-Н1" +[node name="ukp_2" type="GridContainer" parent="TabContainer/ПРД-Н1/TabBar"] +visible = false +layout_mode = 2 +columns = 7 +metadata/_tab_index = 1 + +[node name="Label" type="Label" parent="TabContainer/ПРД-Н1/TabBar/ukp_2"] +custom_minimum_size = Vector2(0, 30) +layout_mode = 2 +theme_override_styles/normal = SubResource("StyleBoxFlat_ig7tw") +text = "Температуры" +horizontal_alignment = 1 + +[node name="TextEdit" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["temperature_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +placeholder_text = "0" +metadata/device = "ПРД-Н1" + +[node name="TextEdit2" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["temperature_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +placeholder_text = "0" +metadata/device = "ПРД-Н1" + +[node name="TextEdit3" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["temperature_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +placeholder_text = "0" +metadata/device = "ПРД-Н1" + +[node name="TextEdit4" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["temperature_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +placeholder_text = "0" +metadata/device = "ПРД-Н1" + +[node name="TextEdit5" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["temperature_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +placeholder_text = "0" +metadata/device = "ПРД-Н1" + +[node name="TextEdit6" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["temperature_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +placeholder_text = "0" +metadata/device = "ПРД-Н1" + +[node name="Label2" type="Label" parent="TabContainer/ПРД-Н1/TabBar/ukp_2"] +custom_minimum_size = Vector2(0, 30) +layout_mode = 2 +theme_override_styles/normal = SubResource("StyleBoxFlat_ig7tw") +text = "Мощность" +horizontal_alignment = 1 + +[node name="TextEdit7" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["power_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +placeholder_text = "0" +metadata/device = "ПРД-Н1" + +[node name="TextEdit8" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["power_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +placeholder_text = "0" +metadata/device = "ПРД-Н1" + +[node name="TextEdit9" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["power_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +placeholder_text = "0" +metadata/device = "ПРД-Н1" + +[node name="TextEdit10" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["power_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +placeholder_text = "0" +metadata/device = "ПРД-Н1" + +[node name="TextEdit11" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["power_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +placeholder_text = "0" +metadata/device = "ПРД-Н1" + +[node name="TextEdit12" type="LineEdit" parent="TabContainer/ПРД-Н1/TabBar/ukp_2" groups=["power_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +placeholder_text = "0" +metadata/device = "ПРД-Н1" + +[node name="ug" type="GridContainer" parent="TabContainer/ПРД-Н1/TabBar"] +layout_mode = 2 +columns = 5 +metadata/_tab_index = 2 + +[node name="GridContainer4" type="GridContainer" parent="TabContainer/ПРД-Н1/TabBar/ug"] +layout_mode = 2 + +[node name="CheckBox" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer4" groups=["dou2"]] +layout_mode = 2 +text = "ЛУЧ -5°" +metadata/bit = 0 +metadata/device = "ПРД-Н1" + +[node name="CheckBox2" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer4" groups=["dou2"]] +layout_mode = 2 +text = "ЛУЧ 5°" +metadata/bit = 1 +metadata/device = "ПРД-Н1" + +[node name="CheckBox3" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer4" groups=["dou2"]] +layout_mode = 2 +text = "ЛУЧ 15°" +metadata/bit = 2 +metadata/device = "ПРД-Н1" + +[node name="CheckBox4" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer4" groups=["dou2"]] +layout_mode = 2 +text = "ЛУЧ 25°" +metadata/bit = 3 +metadata/device = "ПРД-Н1" + +[node name="CheckBox5" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer4" groups=["dou2"]] +layout_mode = 2 +text = "ЛУЧ 35°" +metadata/bit = 4 +metadata/device = "ПРД-Н1" + +[node name="CheckBox6" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer4" groups=["dou2"]] +layout_mode = 2 +text = "ЛУЧ 45°" +metadata/bit = 5 +metadata/device = "ПРД-Н1" + +[node name="CheckBox7" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer4" groups=["dou2"]] +layout_mode = 2 +text = "ЛУЧ КОНТРОЛЬ" +metadata/bit = 6 +metadata/device = "ПРД-Н1" + +[node name="GridContainer" type="GridContainer" parent="TabContainer/ПРД-Н1/TabBar/ug"] +layout_mode = 2 + +[node name="CheckBox" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer" groups=["dou3"]] +layout_mode = 2 +text = "ЛУЧ -5°" +metadata/bit = 0 +metadata/device = "ПРД-Н1" + +[node name="CheckBox2" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer" groups=["dou3"]] +layout_mode = 2 +text = "ЛУЧ 5°" +metadata/bit = 1 +metadata/device = "ПРД-Н1" + +[node name="CheckBox3" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer" groups=["dou3"]] +layout_mode = 2 +text = "ЛУЧ 15°" +metadata/bit = 2 +metadata/device = "ПРД-Н1" + +[node name="CheckBox4" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer" groups=["dou3"]] +layout_mode = 2 +text = "ЛУЧ 25°" +metadata/bit = 3 +metadata/device = "ПРД-Н1" + +[node name="CheckBox5" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer" groups=["dou3"]] +layout_mode = 2 +text = "ЛУЧ 35°" +metadata/bit = 4 +metadata/device = "ПРД-Н1" + +[node name="CheckBox6" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer" groups=["dou3"]] +layout_mode = 2 +text = "ЛУЧ 45°" +metadata/bit = 5 +metadata/device = "ПРД-Н1" + +[node name="CheckBox7" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer" groups=["dou3"]] +layout_mode = 2 +text = "ЛУЧ КОНТРОЛЬ" +metadata/bit = 6 +metadata/device = "ПРД-Н1" + +[node name="GridContainer2" type="GridContainer" parent="TabContainer/ПРД-Н1/TabBar/ug"] +layout_mode = 2 + +[node name="CheckBox" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer2" groups=["att2"]] +layout_mode = 2 +text = "АТТ 0 dB" +metadata/att = 0 +metadata/device = "ПРД-Н1" + +[node name="CheckBox2" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer2" groups=["att2"]] +layout_mode = 2 +text = "АТТ 0.5 dB" +metadata/bit = 1 +metadata/device = "ПРД-Н1" + +[node name="CheckBox3" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer2" groups=["att2"]] +layout_mode = 2 +text = "АТТ 2 dB" +metadata/bit = 2 +metadata/device = "ПРД-Н1" + +[node name="CheckBox4" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer2" groups=["att2"]] +layout_mode = 2 +text = "АТТ 2.5 dB" +metadata/bit = 3 +metadata/device = "ПРД-Н1" + +[node name="CheckBox5" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer2" groups=["att2"]] +layout_mode = 2 +text = "АТТ 8 dB" +metadata/bit = 4 +metadata/device = "ПРД-Н1" + +[node name="CheckBox6" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer2" groups=["att2"]] +layout_mode = 2 +text = "АТТ 8.5 dB" +metadata/bit = 5 +metadata/device = "ПРД-Н1" + +[node name="CheckBox7" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer2" groups=["att2"]] +layout_mode = 2 +text = "АТТ 10 dB" +metadata/bit = 6 +metadata/device = "ПРД-Н1" + +[node name="CheckBox8" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer2" groups=["att2"]] +layout_mode = 2 +text = "АТТ 10.5 dB" +metadata/bit = 7 +metadata/device = "ПРД-Н1" + +[node name="GridContainer5" type="GridContainer" parent="TabContainer/ПРД-Н1/TabBar/ug"] +layout_mode = 2 + +[node name="CheckBox" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer5" groups=["att3"]] +layout_mode = 2 +text = "АТТ 0 dB" +metadata/bit = 0 +metadata/device = "ПРД-Н1" + +[node name="CheckBox2" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer5" groups=["att3"]] +layout_mode = 2 +text = "АТТ 0.5 dB" +metadata/bit = 1 +metadata/device = "ПРД-Н1" + +[node name="CheckBox3" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer5" groups=["att3"]] +layout_mode = 2 +text = "АТТ 2 dB" +metadata/bit = 2 +metadata/device = "ПРД-Н1" + +[node name="CheckBox4" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer5" groups=["att3"]] +layout_mode = 2 +text = "АТТ 2.5 dB" +metadata/bit = 3 +metadata/device = "ПРД-Н1" + +[node name="CheckBox5" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer5" groups=["att3"]] +layout_mode = 2 +text = "АТТ 8 dB" +metadata/bit = 4 +metadata/device = "ПРД-Н1" + +[node name="CheckBox6" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer5" groups=["att3"]] +layout_mode = 2 +text = "АТТ 8.5 dB" +metadata/bit = 5 +metadata/device = "ПРД-Н1" + +[node name="CheckBox7" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer5" groups=["att3"]] +layout_mode = 2 +text = "АТТ 10 dB" +metadata/bit = 6 +metadata/device = "ПРД-Н1" + +[node name="CheckBox8" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer5" groups=["att3"]] +layout_mode = 2 +text = "АТТ 10.5 dB" +metadata/bit = 7 +metadata/device = "ПРД-Н1" + +[node name="GridContainer3" type="GridContainer" parent="TabContainer/ПРД-Н1/TabBar/ug"] +layout_mode = 2 + +[node name="CheckBox" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer3" groups=["ip"]] +layout_mode = 2 +text = "МАА №1" +metadata/bit = 0 +metadata/device = "ПРД-Н1" + +[node name="CheckBox2" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer3" groups=["ip"]] +layout_mode = 2 +text = "МАА №2" +metadata/bit = 1 +metadata/device = "ПРД-Н1" + +[node name="CheckBox3" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer3" groups=["ip"]] +layout_mode = 2 +text = "ИП9-50 №1" +metadata/bit = 2 +metadata/device = "ПРД-Н1" + +[node name="CheckBox4" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer3" groups=["ip"]] +layout_mode = 2 +text = "ИП9-50 №2" +metadata/bit = 3 +metadata/device = "ПРД-Н1" + +[node name="CheckBox5" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer3" groups=["ip"]] +layout_mode = 2 +text = "ИП12-50 №1" +metadata/bit = 4 +metadata/device = "ПРД-Н1" + +[node name="CheckBox6" type="CheckBox" parent="TabContainer/ПРД-Н1/TabBar/ug/GridContainer3" groups=["ip"]] +layout_mode = 2 +text = "ИП5-25" +metadata/bit = 7 +metadata/device = "ПРД-Н1" + [node name="dkm" type="GridContainer" parent="TabContainer/ПРД-Н1"] layout_mode = 0 offset_left = 10.0 diff --git a/udp_broadcast.gd b/udp_broadcast.gd index 44ebb1e..24d9043 100644 --- a/udp_broadcast.gd +++ b/udp_broadcast.gd @@ -43,6 +43,9 @@ var _timer: Timer var _poll_timer: Timer var _sockets_status_bit: int = 0 var _dkm_status_bit: int = 0 +var _dry_contact_status_bit: int = 0xFF +var _dou_and_att_2_status_bit: Dictionary = {0x106: 0} +var _dou_and_att_3_status_bit: Dictionary = {0x108: 0} var _isa_ports: Dictionary = {} var _cmd_number_count: int = 0 var _written_isa_ports: Array = [] @@ -64,6 +67,8 @@ var ukp1_data: PackedByteArray: print('Данные UKP1 обновлены') + + func _init(name: String): """Инициализация UDP broadcast клиента""" _self_name = name @@ -188,6 +193,38 @@ func get_dkm_status() -> int: return _dkm_status_bit +func set_dou2_status(status: int) -> void: + """Установка статуса DOU""" + var masked_status = status & 0b111 # Маска для первых 3 битов + _dou_and_att_2_status_bit[0x106] = masked_status + + +func get_dou2_status() -> int: + """Получение статуса DOU""" + return _dou_and_att_2_status_bit[0x106] & 0b111 + + +func set_dou3_status(status: int) -> void: + """Установка статуса DOU""" + var masked_status = status & 0b111 # Маска для первых 3 битов + _dou_and_att_3_status_bit[0x108] = masked_status + + +func get_dou3_status() -> int: + """Получение статуса DOU""" + return _dou_and_att_3_status_bit[0x108] & 0b111 + + +func set_ip_status(status: int)->void: + """Установка статуса ИП""" + _dry_contact_status_bit = status + + +func get_ip_status()->int: + """Получение статуса ИП""" + return _dry_contact_status_bit + + func set_isa_port(port_addr: int, value: int) -> bool: """Установка значения ISA порта""" if port_addr < 0 or port_addr > 0xFFFF: @@ -276,7 +313,7 @@ func _form_status_device_packet() -> PackedByteArray: _encode_packet_header(buffer) _encode_device_data(buffer) - print('_written_isa_ports.size(): ', _written_isa_ports.size()) + # Добавляем поле команды после статуса if _written_isa_ports.size() > 0: var cmd_offset = header_size + STATUS_PACKET_SIZE @@ -343,9 +380,11 @@ func _encode_ems_g_data(buffer: PackedByteArray) -> void: func _encode_ug_data(buffer: PackedByteArray) -> void: """Кодирование данных UG""" - buffer.encode_u16(UG_DATA_OFFSET, _dkm_status_bit) # Статус DKM - buffer.encode_u16(UG_DATA_OFFSET + 2, 0x059e) # DRY CONTACT - + # D15...D8 = ДКМ (старший байт) + buffer.encode_u8(UG_DATA_OFFSET + 1, _dkm_status_bit & 0xFF) + # D7...D0 = Сухие контакты (младший байт) + buffer.encode_u8(UG_DATA_OFFSET, _dry_contact_status_bit & 0xFF) + func _encode_ukp_data(buffer: PackedByteArray) -> void: """Кодирование данных UKP"""