diff --git a/.idea/misc.xml b/.idea/misc.xml index 060d2c5..db8786c 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,7 @@ + + \ No newline at end of file diff --git a/main.gd b/main.gd index de3ed89..f5a3be3 100644 --- a/main.gd +++ b/main.gd @@ -1,12 +1,27 @@ extends Control +const BUFFER_SIZE = 32 var dictionary_yau07: Dictionary +var udp_broadcast: UDPBroadcast +var dictionary_sockets_bit: Dictionary ## Байт 8 для отправки о состоянии ячеек + 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, мета ПРД + + var power_ukp: Array = get_tree().get_nodes_in_group('power_ukp') + for socket_power in power_ukp: + socket_power.connect('text_submitted', _on_ukp_submitted.bind(socket_power.get_meta('device'))) + + var temperature_ukp: Array = get_tree().get_nodes_in_group('temperature_ukp') + for socket_temp in temperature_ukp: + socket_temp.connect('text_submitted', _on_ukp_submitted.bind(socket_temp.get_meta('device'))) + func _exit_tree(): for device in dictionary_yau07: @@ -16,9 +31,129 @@ func _exit_tree(): func on_modify_device(toggled: bool, name_device: String) -> void: if toggled: - var udp_broadcast := UDPBroadcast.new(name_device) + udp_broadcast = UDPBroadcast.new(name_device) udp_broadcast.add_timer_to_scene(self) udp_broadcast.start_broadcast() dictionary_yau07[name_device] = udp_broadcast else: dictionary_yau07[name_device].close_udp_unit() + + +func _process(_delta: float) -> void: + for device in dictionary_yau07: + if dictionary_yau07[device]: + dictionary_yau07[device].poll_receive() + + +static func _set_bit(bits: int, index: int, val: bool) -> int: + return bits | (1 << index) if val else bits & ~(1 << index) + + +## Функция для установки статусов ячеек на связи (УГ, ЭМС-Г, УКП) +func _on_modify_sockets(toggled: bool, bit: int, device: String)->void: + if dictionary_yau07.has(device): + var udp_unit = dictionary_yau07[device] + udp_unit.sockets_status_bit = _set_bit(udp_unit.sockets_status_bit, bit, toggled) + + +## Функция для установки значений в ячейках УКП +func _on_ukp_submitted(_new_text: String, device: String) -> void: + var prep_temperature_ukp1_array: Array = _on_text_temperature_changed(device, 1) + var prep_temperature_ukp2_array: Array = _on_text_temperature_changed(device, 2) + + var prep_power_ukp1_array: Array = _on_text_power_changed(device, 1) + var prep_power_ukp2_array: Array = _on_text_power_changed(device, 2) + + var combine_data_ukp1: Array + combine_data_ukp1 = _combine_arrays(combine_data_ukp1, prep_temperature_ukp1_array, prep_power_ukp1_array) + var combine_data_ukp2: Array + combine_data_ukp2 = _combine_arrays(combine_data_ukp2, prep_temperature_ukp2_array, prep_power_ukp2_array) + _form_buffers(device,combine_data_ukp1, 1, dictionary_yau07) + _form_buffers(device,combine_data_ukp2, 2, dictionary_yau07) + + +func _on_text_temperature_changed(device: String, number_device: int) -> Array: + const CONST_MIN_TEMP: int = -25 + const MAXIMUM_CODE_ADC: int = 3796 + const MINIMUM_CODE_AD: int = 2660 + const TEMP: float = 115.0 / (MAXIMUM_CODE_ADC - MINIMUM_CODE_AD) + + var current_change: Array + for prd in get_tree().get_nodes_in_group('prd'): + if device == prd.get_meta('yau07'): + for temperature_node in prd.get_tree().get_nodes_in_group('temperature_ukp'): + if prd.is_ancestor_of(temperature_node): + current_change.append(temperature_node) + break + + var temp_arr: Array = [0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff] + if number_device == 1: + for i in 6: + if not current_change[i].text == null: + var value = _safe_convert_to_int(current_change[i].text) + var normal_temp: int = MAXIMUM_CODE_ADC - (value - CONST_MIN_TEMP - 3) / TEMP + temp_arr[i] = normal_temp + elif number_device == 2: + for i in 6: + if not current_change[i+6].text == null: + var value = _safe_convert_to_int(current_change[i+6].text) + var normal_temp: int = MAXIMUM_CODE_ADC - (value - CONST_MIN_TEMP - 3) / TEMP + temp_arr[i] = normal_temp + return temp_arr + + +func _on_text_power_changed(device: String, number_device: int) -> Array: + var current_change: Array + for prd in get_tree().get_nodes_in_group('prd'): + if device == prd.get_meta('yau07'): + for power_node in prd.get_tree().get_nodes_in_group('power_ukp'): + if prd.is_ancestor_of(power_node): + current_change.append(power_node) + break + + var power_arr: Array = [0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff] + + if number_device == 1: + for i in 6: + if not current_change[i].text == null: + var value = _safe_convert_to_int(current_change[i].text) + power_arr[i] = value + elif number_device == 2: + for i in 6: + if not current_change[i+6].text == null: + var value = _safe_convert_to_int(current_change[i+6].text) + power_arr[i] = value + + return power_arr + #_update_buffers(power_arr_1, device) + + +static func _safe_convert_to_int(text: String) -> int: + text = text.strip_edges() + if text.is_valid_int(): + return int(text) + elif text.begins_with("0x") and text.substr(2).is_valid_hex_number(): + return text.hex_to_int() + else: + return 0 + + +static func _combine_arrays(ukp_data: Array, power_arr: Array, temp_arr: Array)-> Array: + for i in temp_arr.size(): + ukp_data.append(temp_arr[i]) + for i in power_arr.size(): + ukp_data.append(power_arr[i]) + return ukp_data + + +static func _form_buffers(device: String, ukp_data: Array, number_device: int, dic_yau07: Dictionary): + var buffer: PackedByteArray = PackedByteArray() + buffer.resize(BUFFER_SIZE) + for i in ukp_data.size(): + buffer.encode_u16(2 * i, ukp_data[i]) + if dic_yau07.has(device): + var udp_unit = dic_yau07[device] + if number_device == 1: + udp_unit.ukp0_data = buffer + elif number_device == 2: + udp_unit.ukp1_data = buffer diff --git a/main.tscn b/main.tscn index 3d385aa..11a0ccd 100644 --- a/main.tscn +++ b/main.tscn @@ -1,7 +1,15 @@ -[gd_scene load_steps=2 format=3 uid="uid://bxorauom63ib6"] +[gd_scene load_steps=5 format=3 uid="uid://bxorauom63ib6"] [ext_resource type="Script" uid="uid://d1qwoxkckvdbc" path="res://main.gd" id="1_ig7tw"] +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_0xm2m"] +bg_color = Color(0.1167, 0.351514, 0.35159, 1) + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ig7tw"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_h2yge"] +bg_color = Color(0.69546, 0.406261, 0.37248, 1) + [node name="Control" type="Control"] layout_mode = 3 anchors_preset = 15 @@ -13,7 +21,7 @@ script = ExtResource("1_ig7tw") [node name="Panel" type="Panel" parent="."] layout_mode = 0 -offset_right = 907.0 +offset_right = 1208.0 offset_bottom = 607.0 [node name="Yau-07-addr" type="GridContainer" parent="."] @@ -82,3 +90,860 @@ metadata/device = "ПРД-В4" layout_mode = 2 text = "ПРД-К4" metadata/device = "ПРД-К4" + +[node name="TabContainer" type="TabContainer" parent="."] +layout_mode = 0 +offset_left = 187.0 +offset_top = 19.0 +offset_right = 1147.0 +offset_bottom = 338.0 +current_tab = 0 +use_hidden_tabs_for_min_size = true +tab_focus_mode = 0 + +[node name="ПРД-Н1" type="Panel" parent="TabContainer" groups=["prd"]] +layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_0xm2m") +metadata/_tab_index = 0 +metadata/yau07 = "ПРД-Н1" + +[node name="sockets" type="GridContainer" parent="TabContainer/ПРД-Н1"] +layout_mode = 2 +offset_right = 140.0 +offset_bottom = 171.0 + +[node name="EMS_G" type="CheckBox" parent="TabContainer/ПРД-Н1/sockets" groups=["socket"]] +layout_mode = 2 +text = "ЭМС-Г" +metadata/bit = 0 +metadata/device = "ПРД-Н1" + +[node name="UG" type="CheckBox" parent="TabContainer/ПРД-Н1/sockets" groups=["socket"]] +layout_mode = 2 +text = "УГ" +metadata/bit = 1 +metadata/device = "ПРД-Н1" + +[node name="UKP_1" type="CheckBox" parent="TabContainer/ПРД-Н1/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 1" +metadata/bit = 2 +metadata/device = "ПРД-Н1" + +[node name="UKP_2" type="CheckBox" parent="TabContainer/ПРД-Н1/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 2" +metadata/bit = 3 +metadata/device = "ПРД-Н1" + +[node name="Load_EMS" type="CheckBox" parent="TabContainer/ПРД-Н1/sockets" groups=["socket"]] +layout_mode = 2 +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"] +layout_mode = 0 +offset_left = 205.0 +offset_top = 103.0 +offset_right = 939.0 +offset_bottom = 191.0 +columns = 7 + +[node name="Label" type="Label" parent="TabContainer/ПРД-Н1/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/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/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/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/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/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/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/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/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/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/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/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/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/ukp_2" groups=["power_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +placeholder_text = "0" +metadata/device = "ПРД-Н1" + +[node name="ПРД-В1" type="Panel" parent="TabContainer" groups=["prd"]] +visible = false +layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_h2yge") +metadata/_tab_index = 1 +metadata/yau07 = "ПРД-В1" + +[node name="sockets" type="GridContainer" parent="TabContainer/ПРД-В1"] +layout_mode = 2 + +[node name="EMS_G" type="CheckBox" parent="TabContainer/ПРД-В1/sockets" groups=["socket"]] +layout_mode = 2 +text = "ЭМС-Г" +metadata/bit = 0 +metadata/device = "ПРД-В1" + +[node name="UG" type="CheckBox" parent="TabContainer/ПРД-В1/sockets" groups=["socket"]] +layout_mode = 2 +text = "УГ" +metadata/bit = 1 +metadata/device = "ПРД-В1" + +[node name="UKP_1" type="CheckBox" parent="TabContainer/ПРД-В1/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 1" +metadata/bit = 2 +metadata/device = "ПРД-В1" + +[node name="UKP_2" type="CheckBox" parent="TabContainer/ПРД-В1/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 2" +metadata/bit = 3 +metadata/device = "ПРД-В1" + +[node name="Load_EMS" type="CheckBox" parent="TabContainer/ПРД-В1/sockets" groups=["socket"]] +layout_mode = 2 +text = "Загрузка ЭМС" +metadata/bit = 4 +metadata/device = "ПРД-В1" + +[node name="ukp_1" type="GridContainer" parent="TabContainer/ПРД-В1"] +layout_mode = 0 +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 +metadata/place = 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 +metadata/place = 1 +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 +metadata/place = 2 +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 +metadata/place = 3 +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 +metadata/place = 4 +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 +metadata/place = 5 +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 +metadata/place = 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 +metadata/place = 1 +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 +metadata/place = 2 +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 +metadata/place = 3 +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 +metadata/place = 4 +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 +metadata/place = 5 +metadata/device = "ПРД-В1" + +[node name="ukp_2" type="GridContainer" parent="TabContainer/ПРД-В1"] +layout_mode = 0 +offset_left = 205.0 +offset_top = 103.0 +offset_right = 939.0 +offset_bottom = 191.0 +columns = 7 + +[node name="Label" type="Label" parent="TabContainer/ПРД-В1/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/ukp_2" groups=["temperature_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +metadata/place = 8 +metadata/device = "ПРД-В1" + +[node name="TextEdit2" type="LineEdit" parent="TabContainer/ПРД-В1/ukp_2" groups=["temperature_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +metadata/place = 9 +metadata/device = "ПРД-В1" + +[node name="TextEdit3" type="LineEdit" parent="TabContainer/ПРД-В1/ukp_2" groups=["temperature_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +metadata/place = 10 +metadata/device = "ПРД-В1" + +[node name="TextEdit4" type="LineEdit" parent="TabContainer/ПРД-В1/ukp_2" groups=["temperature_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +metadata/place = 11 +metadata/device = "ПРД-В1" + +[node name="TextEdit5" type="LineEdit" parent="TabContainer/ПРД-В1/ukp_2" groups=["temperature_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +metadata/place = 12 +metadata/device = "ПРД-В1" + +[node name="TextEdit6" type="LineEdit" parent="TabContainer/ПРД-В1/ukp_2" groups=["temperature_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +metadata/place = 13 +metadata/device = "ПРД-В1" + +[node name="Label2" type="Label" parent="TabContainer/ПРД-В1/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/ukp_2" groups=["power_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +metadata/place = 8 +metadata/device = "ПРД-В1" + +[node name="TextEdit8" type="LineEdit" parent="TabContainer/ПРД-В1/ukp_2" groups=["power_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +metadata/place = 9 +metadata/device = "ПРД-В1" + +[node name="TextEdit9" type="LineEdit" parent="TabContainer/ПРД-В1/ukp_2" groups=["power_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +metadata/place = 10 +metadata/device = "ПРД-В1" + +[node name="TextEdit10" type="LineEdit" parent="TabContainer/ПРД-В1/ukp_2" groups=["power_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +metadata/place = 11 +metadata/device = "ПРД-В1" + +[node name="TextEdit11" type="LineEdit" parent="TabContainer/ПРД-В1/ukp_2" groups=["power_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +metadata/place = 12 +metadata/device = "ПРД-В1" + +[node name="TextEdit12" type="LineEdit" parent="TabContainer/ПРД-В1/ukp_2" groups=["power_ukp"]] +custom_minimum_size = Vector2(100, 35) +layout_mode = 2 +metadata/place = 13 +metadata/device = "ПРД-В1" + +[node name="ПРД-К1" type="Panel" parent="TabContainer" groups=["prd"]] +visible = false +layout_mode = 2 +metadata/_tab_index = 2 +metadata/yau07 = "ПРД-К1" + +[node name="sockets" type="GridContainer" parent="TabContainer/ПРД-К1"] +layout_mode = 2 + +[node name="EMS_G" type="CheckBox" parent="TabContainer/ПРД-К1/sockets" groups=["socket"]] +layout_mode = 2 +text = "ЭМС-Г" +metadata/bit = 0 +metadata/device = "ПРД-К1" + +[node name="UG" type="CheckBox" parent="TabContainer/ПРД-К1/sockets" groups=["socket"]] +layout_mode = 2 +text = "УГ" +metadata/bit = 1 +metadata/device = "ПРД-К1" + +[node name="UKP_1" type="CheckBox" parent="TabContainer/ПРД-К1/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 1" +metadata/bit = 2 +metadata/device = "ПРД-К1" + +[node name="UKP_2" type="CheckBox" parent="TabContainer/ПРД-К1/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 2" +metadata/bit = 3 +metadata/device = "ПРД-К1" + +[node name="Load_EMS" type="CheckBox" parent="TabContainer/ПРД-К1/sockets" groups=["socket"]] +layout_mode = 2 +text = "Загрузка ЭМС" +metadata/bit = 4 +metadata/device = "ПРД-К1" + +[node name="ПРД-Н2" type="Panel" parent="TabContainer" groups=["prd"]] +visible = false +layout_mode = 2 +metadata/_tab_index = 3 +metadata/yau07 = "ПРД-Н2" + +[node name="sockets" type="GridContainer" parent="TabContainer/ПРД-Н2"] +layout_mode = 2 + +[node name="EMS_G" type="CheckBox" parent="TabContainer/ПРД-Н2/sockets" groups=["socket"]] +layout_mode = 2 +text = "ЭМС-Г" +metadata/bit = 0 +metadata/device = "ПРД-Н2" + +[node name="UG" type="CheckBox" parent="TabContainer/ПРД-Н2/sockets" groups=["socket"]] +layout_mode = 2 +text = "УГ" +metadata/bit = 1 +metadata/device = "ПРД-Н2" + +[node name="UKP_1" type="CheckBox" parent="TabContainer/ПРД-Н2/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 1" +metadata/bit = 2 +metadata/device = "ПРД-Н2" + +[node name="UKP_2" type="CheckBox" parent="TabContainer/ПРД-Н2/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 2" +metadata/bit = 3 +metadata/device = "ПРД-Н2" + +[node name="Load_EMS" type="CheckBox" parent="TabContainer/ПРД-Н2/sockets" groups=["socket"]] +layout_mode = 2 +text = "Загрузка ЭМС" +metadata/bit = 4 +metadata/device = "ПРД-Н2" + +[node name="ПРД-В2" type="Panel" parent="TabContainer" groups=["prd"]] +visible = false +layout_mode = 2 +metadata/_tab_index = 4 +metadata/yau07 = "ПРД-В2" + +[node name="sockets" type="GridContainer" parent="TabContainer/ПРД-В2"] +layout_mode = 2 + +[node name="EMS_G" type="CheckBox" parent="TabContainer/ПРД-В2/sockets" groups=["socket"]] +layout_mode = 2 +text = "ЭМС-Г" +metadata/bit = 0 +metadata/device = "ПРД-В2" + +[node name="UG" type="CheckBox" parent="TabContainer/ПРД-В2/sockets" groups=["socket"]] +layout_mode = 2 +text = "УГ" +metadata/bit = 1 +metadata/device = "ПРД-В2" + +[node name="UKP_1" type="CheckBox" parent="TabContainer/ПРД-В2/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 1" +metadata/bit = 2 +metadata/device = "ПРД-В2" + +[node name="UKP_2" type="CheckBox" parent="TabContainer/ПРД-В2/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 2" +metadata/bit = 3 +metadata/device = "ПРД-В2" + +[node name="Load_EMS" type="CheckBox" parent="TabContainer/ПРД-В2/sockets" groups=["socket"]] +layout_mode = 2 +text = "Загрузка ЭМС" +metadata/bit = 4 +metadata/device = "ПРД-В2" + +[node name="ПРД-К2" type="Panel" parent="TabContainer" groups=["prd"]] +visible = false +layout_mode = 2 +metadata/_tab_index = 5 +metadata/yau07 = "ПРД-К2" + +[node name="sockets" type="GridContainer" parent="TabContainer/ПРД-К2"] +layout_mode = 2 + +[node name="EMS_G" type="CheckBox" parent="TabContainer/ПРД-К2/sockets" groups=["socket"]] +layout_mode = 2 +text = "ЭМС-Г" +metadata/bit = 0 +metadata/device = "ПРД-К2" + +[node name="UG" type="CheckBox" parent="TabContainer/ПРД-К2/sockets" groups=["socket"]] +layout_mode = 2 +text = "УГ" +metadata/bit = 1 +metadata/device = "ПРД-К2" + +[node name="UKP_1" type="CheckBox" parent="TabContainer/ПРД-К2/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 1" +metadata/bit = 2 +metadata/device = "ПРД-К2" + +[node name="UKP_2" type="CheckBox" parent="TabContainer/ПРД-К2/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 2" +metadata/bit = 3 +metadata/device = "ПРД-К2" + +[node name="Load_EMS" type="CheckBox" parent="TabContainer/ПРД-К2/sockets" groups=["socket"]] +layout_mode = 2 +text = "Загрузка ЭМС" +metadata/bit = 4 +metadata/device = "ПРД-К2" + +[node name="ПРД-Н3" type="Panel" parent="TabContainer" groups=["prd"]] +visible = false +layout_mode = 2 +metadata/_tab_index = 6 +metadata/yau07 = "ПРД-Н3" + +[node name="sockets" type="GridContainer" parent="TabContainer/ПРД-Н3"] +layout_mode = 2 + +[node name="EMS_G" type="CheckBox" parent="TabContainer/ПРД-Н3/sockets" groups=["socket"]] +layout_mode = 2 +text = "ЭМС-Г" +metadata/bit = 0 +metadata/device = "ПРД-Н3" + +[node name="UG" type="CheckBox" parent="TabContainer/ПРД-Н3/sockets" groups=["socket"]] +layout_mode = 2 +text = "УГ" +metadata/bit = 1 +metadata/device = "ПРД-Н3" + +[node name="UKP_1" type="CheckBox" parent="TabContainer/ПРД-Н3/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 1" +metadata/bit = 2 +metadata/device = "ПРД-Н3" + +[node name="UKP_2" type="CheckBox" parent="TabContainer/ПРД-Н3/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 2" +metadata/bit = 3 +metadata/device = "ПРД-Н3" + +[node name="Load_EMS" type="CheckBox" parent="TabContainer/ПРД-Н3/sockets" groups=["socket"]] +layout_mode = 2 +text = "Загрузка ЭМС" +metadata/bit = 4 +metadata/device = "ПРД-Н3" + +[node name="ПРД-В3" type="Panel" parent="TabContainer" groups=["prd"]] +visible = false +layout_mode = 2 +metadata/_tab_index = 7 +metadata/yau07 = "ПРД-В3" + +[node name="sockets" type="GridContainer" parent="TabContainer/ПРД-В3"] +layout_mode = 2 + +[node name="EMS_G" type="CheckBox" parent="TabContainer/ПРД-В3/sockets" groups=["socket"]] +layout_mode = 2 +text = "ЭМС-Г" +metadata/bit = 0 +metadata/device = "ПРД-В3" + +[node name="UG" type="CheckBox" parent="TabContainer/ПРД-В3/sockets" groups=["socket"]] +layout_mode = 2 +text = "УГ" +metadata/bit = 1 +metadata/device = "ПРД-В3" + +[node name="UKP_1" type="CheckBox" parent="TabContainer/ПРД-В3/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 1" +metadata/bit = 2 +metadata/device = "ПРД-В3" + +[node name="UKP_2" type="CheckBox" parent="TabContainer/ПРД-В3/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 2" +metadata/bit = 3 +metadata/device = "ПРД-В3" + +[node name="Load_EMS" type="CheckBox" parent="TabContainer/ПРД-В3/sockets" groups=["socket"]] +layout_mode = 2 +text = "Загрузка ЭМС" +metadata/bit = 4 +metadata/device = "ПРД-В3" + +[node name="ПРД-К3" type="Panel" parent="TabContainer" groups=["prd"]] +visible = false +layout_mode = 2 +metadata/_tab_index = 8 +metadata/yau07 = "ПРД-К3" + +[node name="sockets" type="GridContainer" parent="TabContainer/ПРД-К3"] +layout_mode = 2 + +[node name="EMS_G" type="CheckBox" parent="TabContainer/ПРД-К3/sockets" groups=["socket"]] +layout_mode = 2 +text = "ЭМС-Г" +metadata/bit = 0 +metadata/device = "ПРД-К3" + +[node name="UG" type="CheckBox" parent="TabContainer/ПРД-К3/sockets" groups=["socket"]] +layout_mode = 2 +text = "УГ" +metadata/bit = 1 +metadata/device = "ПРД-К3" + +[node name="UKP_1" type="CheckBox" parent="TabContainer/ПРД-К3/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 1" +metadata/bit = 2 +metadata/device = "ПРД-К3" + +[node name="UKP_2" type="CheckBox" parent="TabContainer/ПРД-К3/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 2" +metadata/bit = 3 +metadata/device = "ПРД-К3" + +[node name="Load_EMS" type="CheckBox" parent="TabContainer/ПРД-К3/sockets" groups=["socket"]] +layout_mode = 2 +text = "Загрузка ЭМС" +metadata/bit = 4 +metadata/device = "ПРД-К3" + +[node name="ПРД-Н4" type="Panel" parent="TabContainer" groups=["prd"]] +visible = false +layout_mode = 2 +metadata/_tab_index = 9 +metadata/yau07 = "ПРД-Н4" + +[node name="sockets" type="GridContainer" parent="TabContainer/ПРД-Н4"] +layout_mode = 2 + +[node name="EMS_G" type="CheckBox" parent="TabContainer/ПРД-Н4/sockets" groups=["socket"]] +layout_mode = 2 +text = "ЭМС-Г" +metadata/bit = 0 +metadata/device = "ПРД-Н4" + +[node name="UG" type="CheckBox" parent="TabContainer/ПРД-Н4/sockets" groups=["socket"]] +layout_mode = 2 +text = "УГ" +metadata/bit = 1 +metadata/device = "ПРД-Н4" + +[node name="UKP_1" type="CheckBox" parent="TabContainer/ПРД-Н4/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 1" +metadata/bit = 2 +metadata/device = "ПРД-Н4" + +[node name="UKP_2" type="CheckBox" parent="TabContainer/ПРД-Н4/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 2" +metadata/bit = 3 +metadata/device = "ПРД-Н4" + +[node name="Load_EMS" type="CheckBox" parent="TabContainer/ПРД-Н4/sockets" groups=["socket"]] +layout_mode = 2 +text = "Загрузка ЭМС" +metadata/bit = 4 +metadata/device = "ПРД-Н4" + +[node name="ПРД-В4" type="Panel" parent="TabContainer" groups=["prd"]] +visible = false +layout_mode = 2 +metadata/_tab_index = 10 +metadata/yau07 = "ПРД-В4" + +[node name="sockets" type="GridContainer" parent="TabContainer/ПРД-В4"] +layout_mode = 2 + +[node name="EMS_G" type="CheckBox" parent="TabContainer/ПРД-В4/sockets" groups=["socket"]] +layout_mode = 2 +text = "ЭМС-Г" +metadata/bit = 0 +metadata/device = "ПРД-В4" + +[node name="UG" type="CheckBox" parent="TabContainer/ПРД-В4/sockets" groups=["socket"]] +layout_mode = 2 +text = "УГ" +metadata/bit = 1 +metadata/device = "ПРД-В4" + +[node name="UKP_1" type="CheckBox" parent="TabContainer/ПРД-В4/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 1" +metadata/bit = 2 +metadata/device = "ПРД-В4" + +[node name="UKP_2" type="CheckBox" parent="TabContainer/ПРД-В4/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 2" +metadata/bit = 3 +metadata/device = "ПРД-В4" + +[node name="Load_EMS" type="CheckBox" parent="TabContainer/ПРД-В4/sockets" groups=["socket"]] +layout_mode = 2 +text = "Загрузка ЭМС" +metadata/bit = 4 +metadata/device = "ПРД-В4" + +[node name="ПРД-К4" type="Panel" parent="TabContainer" groups=["prd"]] +visible = false +layout_mode = 2 +metadata/_tab_index = 11 +metadata/yau07 = "ПРД-К4" + +[node name="sockets" type="GridContainer" parent="TabContainer/ПРД-К4"] +layout_mode = 2 + +[node name="EMS_G" type="CheckBox" parent="TabContainer/ПРД-К4/sockets" groups=["socket"]] +layout_mode = 2 +text = "ЭМС-Г" +metadata/bit = 0 +metadata/device = "ПРД-К4" + +[node name="UG" type="CheckBox" parent="TabContainer/ПРД-К4/sockets" groups=["socket"]] +layout_mode = 2 +text = "УГ" +metadata/bit = 1 +metadata/device = "ПРД-К4" + +[node name="UKP_1" type="CheckBox" parent="TabContainer/ПРД-К4/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 1" +metadata/bit = 2 +metadata/device = "ПРД-К4" + +[node name="UKP_2" type="CheckBox" parent="TabContainer/ПРД-К4/sockets" groups=["socket"]] +layout_mode = 2 +text = "УКП 2" +metadata/bit = 3 +metadata/device = "ПРД-К4" + +[node name="Load_EMS" type="CheckBox" parent="TabContainer/ПРД-К4/sockets" groups=["socket"]] +layout_mode = 2 +text = "Загрузка ЭМС" +metadata/bit = 4 +metadata/device = "ПРД-К4" diff --git a/project.godot b/project.godot index 771c659..46b42ff 100644 --- a/project.godot +++ b/project.godot @@ -17,7 +17,7 @@ config/icon="res://icon.svg" [display] -window/size/viewport_width=900 +window/size/viewport_width=1200 window/size/viewport_height=600 [rendering] diff --git a/udp_broadcast.gd b/udp_broadcast.gd index 82b34c4..1fe5de8 100644 --- a/udp_broadcast.gd +++ b/udp_broadcast.gd @@ -19,6 +19,16 @@ const broadcast_addr: Array = [50000, "10.1.1.255"] var _socket: SocketUDP var self_name: String var _timer: Timer +var sockets_status_bit: int = 0 +var ukp0_data: PackedByteArray: + set(v): + ukp0_data = v + print('Произошло Обновление данных ukp0_data') + +var ukp1_data: PackedByteArray: + set(v): + ukp1_data = v + print('Произошло Обновление данных ukp1_data') func _init(name: String): @@ -27,6 +37,10 @@ func _init(name: String): _timer = Timer.new() _timer.wait_time = 1.0 / 3.0 _timer.timeout.connect(_on_timer_timeout) + ukp0_data.resize(32) + ukp0_data.fill(0) + ukp1_data.resize(32) + ukp1_data.fill(0) if addres_list.has(name): var port: int = addres_list[name][0] @@ -37,7 +51,6 @@ func _init(name: String): func bind_unit_addres(port_for_bind: int, addr_for_bind: String) -> void: - print('Привязка адреса: %s' % addr_for_bind) var bind_result = _socket.bind(port_for_bind, addr_for_bind) if bind_result != OK: push_error("Не удалось привязаться к %s: %s" % [addr_for_bind, error_string(bind_result)]) @@ -51,9 +64,10 @@ func stop_broadcast() -> void: _timer.stop() -func send_broadcast(message: String) -> bool: +func send_broadcast() -> bool: _socket.set_broadcast_enabled(true) - var data: PackedByteArray = message.to_utf8_buffer() + var data: PackedByteArray = _form_status_packet() + # добавление 11 байтов вперед вохоже _socket.send_to(broadcast_addr[1], broadcast_addr[0], data) return true @@ -67,10 +81,60 @@ func add_timer_to_scene(parent: Node) -> void: parent.add_child(_timer) +func poll_receive() -> void: + while _socket.get_available_packet_count() > 0: + var broadcast_packet = _socket.get_packet() + var addr_receive = _socket.get_packet_ip() + #var port_receive = _socket.get_packet_port() + #var parsed_data = _parse_packet(broadcast_packet) + _handle_received_data(broadcast_packet, addr_receive) + + +func _handle_received_data(data: PackedByteArray, addr: String) -> void: + print("данные от %s: %s" % [addr, data]) + # Здесь можно эмитировать сигналы или обрабатывать данные + + func _on_timer_timeout() -> void: - send_broadcast("hello") + send_broadcast() +func _form_status_packet() -> PackedByteArray: + var buf = PackedByteArray() + buf.resize(126) # Увеличиваем размер до 126 байт + + # Заголовок (0-5 байты) + buf.encode_u16(0, 0) # 00 00 + buf.encode_u16(2, 0x0cff) # ff 0c + buf.encode_u16(4, 0) # 00 00 + + # Идентификатор пакета + buf[6] = 103 # 67 + + # Статус устройств + buf[7] = 0 + buf[8] = sockets_status_bit + + # Данные EMS-G (байты 9-34) + var ems_g_data = [0x9e00, 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0x0000, + 0xffff, 0xffff, 0x0000, 0xffff, 0xffff, 0xffff] + for i in range(13): + buf.encode_u16(9 + i * 2, ems_g_data[i]) + + # Данные UG (байты 35-38) + buf.encode_u16(35, 0x0000) # 00 00 + buf.encode_u16(37, 0x059e) # 9e 05 + + # Данные UKP0 (байты 39-70) + for i in ukp0_data.size(): + buf[39 + i] = ukp0_data[i] + # Данные UKP1 (байты 71-102) + for i in ukp1_data.size(): + buf[71 + i] = ukp1_data[i] + return buf + + +#### class SocketUDP extends PacketPeerUDP: func send_to(addr: String, port: int, data: PackedByteArray): set_dest_address(addr, port)