From 7feca8a40c49aad39b01f0adf7c6b4644b4e3973 Mon Sep 17 00:00:00 2001 From: Maxim Date: Fri, 31 Jan 2025 10:14:34 +0300 Subject: [PATCH] add buttn fgos and modul um --- PRD_MP550.tscn | 62 ++++++++------ Shaders/ray.gdshader | 6 +- Web.png | Bin 23732 -> 21325 bytes Web.png.import | 2 +- ray_2.gdshader | 6 +- scripts/PRD.gd | 172 ++++++++++++++++++++------------------- scripts/constants.gd | 13 ++- scripts/control_panel.gd | 73 +++++++++++++++++ scripts/ems_g.gd | 18 ++-- 9 files changed, 224 insertions(+), 128 deletions(-) create mode 100644 scripts/control_panel.gd diff --git a/PRD_MP550.tscn b/PRD_MP550.tscn index 4d259da..08aae4d 100644 --- a/PRD_MP550.tscn +++ b/PRD_MP550.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=50 format=3 uid="uid://cvor2jm4xk3ha"] +[gd_scene load_steps=51 format=3 uid="uid://cvor2jm4xk3ha"] [ext_resource type="Script" path="res://scripts/PRD.gd" id="1_v273n"] [ext_resource type="Texture2D" uid="uid://cdxdluvyb5uei" path="res://table/on.png" id="2_dv7xx"] @@ -6,9 +6,10 @@ [ext_resource type="Material" uid="uid://s6xe8igevnv2" path="res://Shaders/shader_edu.tres" id="3_3syd3"] [ext_resource type="Texture2D" uid="uid://cfktmk2rowmul" path="res://table/off.png" id="3_qvuyu"] [ext_resource type="Shader" path="res://Shaders/ray.gdshader" id="4_uy5o2"] -[ext_resource type="Texture2D" uid="uid://62v0xejejuwj" path="res://Web.png" id="5_i3nvb"] +[ext_resource type="Texture2D" uid="uid://co8dxcd8eckjs" path="res://Web.png" id="5_i3nvb"] [ext_resource type="Shader" path="res://ray_2.gdshader" id="8_12mng"] [ext_resource type="Texture2D" uid="uid://cgtg4gbqnuxrc" path="res://nine-patch-round.png" id="9_0r2qk"] +[ext_resource type="Script" path="res://scripts/control_panel.gd" id="9_akagi"] [ext_resource type="Script" path="res://scripts/ems_g.gd" id="9_g1wia"] [ext_resource type="Shader" path="res://load.gdshader" id="10_lf1xh"] [ext_resource type="PackedScene" uid="uid://bdb0bhfu7366l" path="res://kasseta-fs-kd.tscn" id="10_tdh2s"] @@ -106,7 +107,7 @@ script/source = "extends Sprite2D [sub_resource type="ShaderMaterial" id="ShaderMaterial_dgiai"] shader = ExtResource("4_uy5o2") -shader_parameter/color_signal = Color(0.690196, 0.776471, 0, 1) +shader_parameter/color_signal = Color(0.588235, 0.466667, 0, 1) shader_parameter/turn = 0.735 [sub_resource type="Gradient" id="Gradient_ki0n7"] @@ -118,7 +119,7 @@ metadata/_snap_enabled = true [sub_resource type="ShaderMaterial" id="ShaderMaterial_2pxu2"] shader = ExtResource("8_12mng") -shader_parameter/color_signal = Color(1.29351e-07, 0.19544, 0.0177065, 0.574) +shader_parameter/color_signal = Color(0.588242, 0.466356, 0, 1) shader_parameter/turn = 0.735 [sub_resource type="Gradient" id="Gradient_jlp41"] @@ -306,9 +307,7 @@ offset = Vector2(800, 600) script = SubResource("GDScript_0sobq") [node name="PSK grad" type="TextureRect" parent="TabContainer/PRD/PSK"] -modulate = Color(0, 0, 0, 1) -self_modulate = Color(0, 0, 0, 1) -show_behind_parent = true +modulate = Color(1, 1, 0.941176, 1) material = SubResource("ShaderMaterial_o7txs") offset_left = 554.954 offset_top = -30.0 @@ -334,8 +333,7 @@ offset = Vector2(800, 600) script = SubResource("GDScript_0sobq") [node name="PSK grad" type="TextureRect" parent="TabContainer/PRD/PSK2"] -modulate = Color(0, 0, 0, 1) -self_modulate = Color(0, 0, 0, 1) +modulate = Color(1, 1, 0.941176, 1) show_behind_parent = true material = SubResource("ShaderMaterial_o7txs") offset_left = 554.954 @@ -371,11 +369,16 @@ mouse_default_cursor_shape = 2 theme_override_styles/pressed = SubResource("StyleBoxTexture_otisn") toggle_mode = true text = " Запрет СИ2" -metadata/litera = 48 +metadata/dev_num = 48 -[node name="Modul" type="Label" parent="TabContainer/PRD/Grid"] +[node name="Modul_um_1" type="Button" parent="TabContainer/PRD/Grid"] layout_mode = 2 -text = "Модуляция" +focus_mode = 0 +mouse_default_cursor_shape = 2 +theme_override_styles/pressed = SubResource("StyleBoxTexture_otisn") +toggle_mode = true +text = " Модуляция УМ 2" +metadata/dev_num = 51 [node name="Label_ray" type="Label" parent="TabContainer/PRD/Grid"] layout_mode = 2 @@ -403,11 +406,25 @@ mouse_default_cursor_shape = 2 theme_override_styles/pressed = SubResource("StyleBoxTexture_otisn") toggle_mode = true text = " Запрет СИ3" -metadata/litera = 49 +metadata/dev_num = 49 -[node name="FGOZ3" type="Label" parent="TabContainer/PRD/Grid"] +[node name="fgos_2" type="Button" parent="TabContainer/PRD/Grid"] layout_mode = 2 +focus_mode = 0 +mouse_default_cursor_shape = 2 +theme_override_styles/pressed = SubResource("StyleBoxTexture_otisn") +toggle_mode = true text = "ФГОЗ 3" +metadata/dev_num = 56 + +[node name="Modul_um_2" type="Button" parent="TabContainer/PRD/Grid"] +layout_mode = 2 +focus_mode = 0 +mouse_default_cursor_shape = 2 +theme_override_styles/pressed = SubResource("StyleBoxTexture_otisn") +toggle_mode = true +text = " Модуляция УМ 3" +metadata/dev_num = 52 [node name="DKM3" type="Label" parent="TabContainer/PRD/Grid"] layout_mode = 2 @@ -416,19 +433,11 @@ text = "ДКМ ДОУ 3" [node name="Ray_set2" type="OptionButton" parent="TabContainer/PRD/Grid"] layout_mode = 2 -[node name="data_from_dev" type="Label" parent="TabContainer/PRD"] -layout_mode = 0 -offset_left = 48.0 -offset_top = 658.0 -offset_right = 1464.0 -offset_bottom = 810.0 -text = "From dev: " -autowrap_mode = 2 - [node name="ControlPanel" type="Panel" parent="TabContainer"] visible = false layout_mode = 2 theme_override_styles/panel = SubResource("StyleBoxTexture_tn8m6") +script = ExtResource("9_akagi") metadata/_tab_index = 1 metadata/_edit_lock_ = true @@ -991,6 +1000,13 @@ text = "Темп" [connection signal="pressed" from="Background/side_panel/select_ems_g" to="." method="_on_emsg_select"] [connection signal="pressed" from="Background/side_panel/select_fs" to="." method="_on_mfs_select"] [connection signal="pressed" from="read_isa" to="." method="_on_read_isa_pressed"] +[connection signal="toggled" from="TabContainer/PRD/Grid/Zapret" to="." method="_on_zapret1"] +[connection signal="toggled" from="TabContainer/PRD/Grid/Modul_um_1" to="." method="_on_modul_um_1"] +[connection signal="item_selected" from="TabContainer/PRD/Grid/Ray_set" to="." method="_on_btn_ray"] +[connection signal="toggled" from="TabContainer/PRD/Grid/Zapret2" to="." method="_on_zapret2"] +[connection signal="toggled" from="TabContainer/PRD/Grid/fgos_2" to="." method="_on_fgos_2"] +[connection signal="toggled" from="TabContainer/PRD/Grid/Modul_um_2" to="." method="_on_modul_um_2"] +[connection signal="item_selected" from="TabContainer/PRD/Grid/Ray_set2" to="." method="_on_btn_ray2"] [connection signal="pressed" from="TabContainer/Modul_fs/set_space/set_ferq" to="TabContainer/Modul_fs" method="_on_set_ferq"] [connection signal="pressed" from="TabContainer/Modul_fs/set_space/set_att2" to="TabContainer/Modul_fs" method="_on_set_att"] [connection signal="pressed" from="TabContainer/Modul_fs/manage_panel/con" to="TabContainer/Modul_fs" method="_on_start"] diff --git a/Shaders/ray.gdshader b/Shaders/ray.gdshader index c8ea8e0..15b4318 100644 --- a/Shaders/ray.gdshader +++ b/Shaders/ray.gdshader @@ -3,11 +3,11 @@ shader_type canvas_item; uniform vec4 color_signal: source_color; uniform float turn = 0.785; -const float outer_radius = 0.309; -const float inner_radius = 0.72; +const float outer_radius = 0.109; +const float inner_radius = 0.82; const float zoom = 100.0; const float speed = 2.1; -const float size = 6.0; +const float size = 9.0; const float blur = 0.000001; const float fill_ratio = 0.03; diff --git a/Web.png b/Web.png index 96398f0f31576210bfed231af19b63d5f55fe0ca..76c19445d71bb6737309086ad26908091a67802a 100644 GIT binary patch literal 21325 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 MPoKpV?yThh2R9SzWB>pF literal 23732 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 void: draw_control_panel_prd(Constants.ADDRESSES[0][3]) - $TabContainer/PRD/Grid/Zapret.connect('toggled', Callable(self, '_on_zapret').bind($TabContainer/PRD/Grid/Zapret)) - $TabContainer/PRD/Grid/Zapret2.connect('toggled', Callable(self, '_on_zapret').bind($TabContainer/PRD/Grid/Zapret2)) - $TabContainer/PRD/Grid/Ray_set.connect('item_selected', Callable(self, '_on_btn_ray')) - $TabContainer/PRD/Grid/Ray_set2.connect('item_selected', Callable(self, '_on_btn_ray2')) Network.connect('yau_status_line', Callable(self, '_on_yau_status')) Network.connect('yau_receive', Callable(self, '_on_data_received')) Network.connect('yau_read_isa', Callable(self, '_on_read_isa')) @@ -70,15 +66,7 @@ func draw_control_panel_prd(mode) -> void: ## From Network status about yau-07 func _on_yau_status(yau_status: bool) -> void: - if yau_status: - $TabContainer/ControlPanel/soc_y5/ref_A30/light_ind.button_pressed = true - $TabContainer/ControlPanel/soc_y5/ref_A30/light_ind.disabled = false - flag_yau_control = true - else: - $TabContainer/ControlPanel/soc_y5/ref_A30/light_ind.button_pressed = false - $TabContainer/ControlPanel/soc_y5/ref_A30/light_ind.disabled = true - - flag_yau_control = false + flag_yau_control = yau_status func _on_read_isa(unit_isa_ports: Dictionary) -> void: @@ -120,68 +108,36 @@ func _process(_delta: float) -> void: func _on_data_received(data_from_yau_07): - $TabContainer/PRD/data_from_dev.text = 'From dev: %s' % data_from_yau_07 - if flag_yau_control: - var status_board = data_from_yau_07.decode_u8(Constants.DataIndices.STATUS_BOARD) - var dry_contact: int = data_from_yau_07.decode_u16(Constants.DataIndices.DRY_CONTACT) # Контроль сухих контактов (УГ) - var _DKM: int = data_from_yau_07.decode_u16(Constants.DataIndices.DKM) # ДКМ от УГ + if not flag_yau_control: + return + + + ## УГ + var _DKM: int = data_from_yau_07.decode_u16(Constants.DataIndices.DKM) # ДКМ от УГ + #node_select1.set_node_text(2, 0, '%d' % dry_contact) + #node_select1.set_node_text(3, 0, '%d' % DKM) - ## УГ - #node_select1.set_node_text(2, 0, '%d' % dry_contact) - #node_select1.set_node_text(3, 0, '%d' % DKM) - - ## SOCKETS BOARDS - for i in 4: - var sockets_ind = [$TabContainer/ControlPanel/soc_y5/ref_A26/light_ind, - $TabContainer/ControlPanel/soc_y5/ref_A27/light_ind, - $TabContainer/ControlPanel/soc_y5/ref_A28/light_ind, - $TabContainer/ControlPanel/soc_y5/ref_A29/light_ind] - var j = int(status_board & (1 << i) == 0 and flag_yau_control) - if j == 0: - sockets_ind[i].button_pressed = true - sockets_ind[i].disabled = false - else: - sockets_ind[i].button_pressed = false - sockets_ind[i].disabled = true - - ## Блок ИП - for i in 8: - var node_power_ind = [$TabContainer/ControlPanel/soc_P1/ref_A23/light_ind, - $TabContainer/ControlPanel/soc_P1/ref_A24/light_ind, - $TabContainer/ControlPanel/soc_P1/ref_A25/light_ind, - $TabContainer/ControlPanel/soc_P1/ref_A26/light_ind, - $TabContainer/ControlPanel/soc_P1/ref_A27/light_ind, - $TabContainer/ControlPanel/soc_P1/ref_A28/light_ind, - $TabContainer/ControlPanel/soc_P1/ref_A29/light_ind, - $TabContainer/ControlPanel/soc_y5/ref_A24/light_ind] - var j = int(not(dry_contact & (1 << i) == 0 and flag_yau_control)) - if j == 0: - node_power_ind[i].button_pressed = true - node_power_ind[i].disabled = false - else: - node_power_ind[i].button_pressed = false - node_power_ind[i].disabled = true - - ## УКП - for i in range(8): ## Мощность от УКП_1 - var power_ukp_1 = data_from_yau_07.decode_u16(Constants.DataIndices.POWER_UKP_1 + 2 * i) - node_select1.set_node_text(0, i+1, '%d' % power_ukp_1) - - for i in range(8): ## Температура от УКП_1 - var temperature_ukp_1 = data_from_yau_07.decode_u16(Constants.DataIndices.TEMPERATURE_UKP_1 + 2 * i) - var TMP = Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * Constants.TEMP - node_select1.set_node_text(1, i+1, '%d' % TMP) - - for i_pow in range(8): ## Мощность от УКП_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) - node_select2.set_node_text(0, i_pow+1, '%d' % power_ukp_2) - - for row in range(8): ## Температура от УКП_2 - if len(data_from_yau_07) > Constants.DataIndices.TEMPERATURE_UKP_2 + 2 * row: - var temperature_ukp_2 = data_from_yau_07.decode_u16(Constants.DataIndices.TEMPERATURE_UKP_2 + 2 * row) - var TMP = Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_2) * Constants.TEMP - node_select2.set_node_text(1, row+1, '%d' % TMP) + + ## УКП + for i in range(8): ## Мощность от УКП_1 + var power_ukp_1 = data_from_yau_07.decode_u16(Constants.DataIndices.POWER_UKP_1 + 2 * i) + node_select1.set_node_text(0, i+1, '%d' % power_ukp_1) + + for i in range(8): ## Температура от УКП_1 + var temperature_ukp_1 = data_from_yau_07.decode_u16(Constants.DataIndices.TEMPERATURE_UKP_1 + 2 * i) + var TMP = Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_1) * Constants.TEMP + node_select1.set_node_text(1, i+1, '%d' % TMP) + + for i_pow in range(8): ## Мощность от УКП_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) + node_select2.set_node_text(0, i_pow+1, '%d' % power_ukp_2) + + for row in range(8): ## Температура от УКП_2 + if len(data_from_yau_07) > Constants.DataIndices.TEMPERATURE_UKP_2 + 2 * row: + var temperature_ukp_2 = data_from_yau_07.decode_u16(Constants.DataIndices.TEMPERATURE_UKP_2 + 2 * row) + var TMP = Constants.CONST_MIN_TEMP + (Constants.MAXIMUM_CODE_ADC - temperature_ukp_2) * Constants.TEMP + node_select2.set_node_text(1, row+1, '%d' % TMP) func set_frame(node: Node, val: int): node.set_frame(val) @@ -231,21 +187,67 @@ func fill_item(node: Node, i_column: int, i_row: int, arr: Dictionary, select: i optionbutton.select(select) -func _on_zapret(toggled_on: bool, meta) -> void: - Network.write_port_isa(Constants.EMS_G_BASE_ADDR+2, meta.get_meta('litera')) +func _on_zapret1(toggled_on: bool) -> void: + var meta = $TabContainer/PRD/Grid/Zapret.get_meta('dev_num') + Network.write_port_isa(Constants.BASE_PORTS.EMS_G+2, meta) var zapret_mode = 0x4000 if toggled_on else 0x0 - Network.write_port_isa(Constants.EMS_G_BASE_ADDR+8, zapret_mode) + Network.write_port_isa(Constants.BASE_PORTS.EMS_G+8, zapret_mode) + + +func _on_zapret2(toggled_on: bool) -> void: + var meta = $TabContainer/PRD/Grid/Zapret2.get_meta('dev_num') + Network.write_port_isa(Constants.BASE_PORTS.EMS_G+2, meta) + var zapret_mode = 0x4000 if toggled_on else 0x0 + Network.write_port_isa(Constants.BASE_PORTS.EMS_G+8, zapret_mode) + + +func _on_modul_um_1(toggled_on: bool): + var meta = $TabContainer/PRD/Grid/Modul_um_1.get_meta('dev_num') + Network.write_port_isa(Constants.BASE_PORTS.EMS_G+2, meta) + var modul_um = 0x2000 if toggled_on else 0x0 + Network.write_port_isa(Constants.BASE_PORTS.EMS_G+8, modul_um) + + +func _on_modul_um_2(toggled_on: bool): + var meta = $TabContainer/PRD/Grid/Modul_um_2.get_meta('dev_num') + Network.write_port_isa(Constants.BASE_PORTS.EMS_G+2, meta) + var modul_um = 0x2000 if toggled_on else 0x0 + Network.write_port_isa(Constants.BASE_PORTS.EMS_G+8, modul_um) + + +func _on_fgos_2(toggled_on: bool): + var meta = $TabContainer/PRD/Grid/fgos_2.get_meta('dev_num') + Network.write_port_isa(Constants.BASE_PORTS.EMS_G+2, meta) + var modul_um = 0x2000 if toggled_on else 0x0 + Network.write_port_isa(Constants.BASE_PORTS.EMS_G+8, modul_um) + + +#func _on_fgos_2(toggled_on: bool): + #var meta = $TabContainer/PRD/Grid/Modul_um_2.get_meta('dev_num') + #Network.write_port_isa(Constants.BASE_PORTS.EMS_G+2, meta) + #var modul_um = 0x2000 if toggled_on else 0x0 + #Network.write_port_isa(Constants.BASE_PORTS.EMS_G+8, modul_um) + +## Регулировка положением луча 1 +func _on_btn_ray(item_from_ray: int) -> void: + Network.write_port_isa(Constants.BASE_PORTS.UG+6, item_from_ray) + Network.read_port_isa([Constants.BASE_PORTS.UG+6]) + + +## Регулировка положением луча 2 +func _on_btn_ray2(item_from_ray: int) -> void: + Network.write_port_isa(Constants.BASE_PORTS.UG+8, item_from_ray) + Network.read_port_isa([Constants.BASE_PORTS.UG+8]) func _on_read_isa_pressed() -> void: - Network.read_port_isa([0x122, 0x124, 0x128]) + Network.read_port_isa([Constants.BASE_PORTS.EMS_G+2, Constants.BASE_PORTS.EMS_G+4, Constants.BASE_PORTS.EMS_G+8]) -## Регулировка положением луча -func _on_btn_ray(item_from_ray: int) -> void: - Network.write_port_isa(0x106, item_from_ray) - Network.read_port_isa([0x106]) -func _on_btn_ray2(item_from_ray: int) -> void: - Network.write_port_isa(0x108, item_from_ray) - Network.read_port_isa([0x108]) +## Устанавливает биты в соответствии с маской +## [param v] - Прежние значения бит +## [param a] - Новые значения бит +## [param m] - Маска изменяемых бит +func set_bits(v, a, m): + return (~m) & v | a & m diff --git a/scripts/constants.gd b/scripts/constants.gd index 7008e0f..41cbff5 100644 --- a/scripts/constants.gd +++ b/scripts/constants.gd @@ -6,8 +6,7 @@ const DEFAULT_ADDRESS: String = '10.1.1.11' const DEFAULT_PORT: String = '50011' const CONST_MIN_TEMP: int = -25 const MAXIMUM_CODE_ADC: int = 3796 -const MINIMUM_CODE_AD: int = 2660 -const EMS_G_BASE_ADDR: int = 0x120 +const MINIMUM_CODE_AD: int = 2660 const TEMP: float = 115.0 / (MAXIMUM_CODE_ADC - MINIMUM_CODE_AD) const TableNode = preload("res://table/node.tscn") const TableList = preload("res://table/node_list.tscn") @@ -38,7 +37,7 @@ const ADDRESSES: Array = [ ['ПРД-Н1', '10.1.1.11', 50011, MODE.PRD_H, '10.1.2.18', '10.1.2.19', ''], ['ПРД-Н2', '10.1.1.21', 50021, MODE.PRD_H, '10.1.2.34', '10.1.2.35', ''], ['ПРД-Н3', '10.1.1.31', 50031, MODE.PRD_H, '10.1.2.50', '10.1.2.51', ''], - ['ПРД-Н4', '10.1.1.41', 50041, MODE.PRD_H, '10.1.2.66', '10.1.2.67', ''], + ['ПРД-Н4', '10.1.1.41', 50041, MODE.PRD_H, '10.1.2.67', '10.1.2.67', ''], ['ПРД-В1', '10.1.1.12', 50012, MODE.PRD_B, '10.1.2.20', '10.1.2.21', ''], ['ПРД-В2', '10.1.1.22', 50022, MODE.PRD_B, '10.1.2.36', '10.1.2.37', ''], ['ПРД-В3', '10.1.1.32', 50032, MODE.PRD_B, '10.1.2.52', '10.1.2.53', ''], @@ -199,6 +198,13 @@ var NODE_MAP = { 'TabContainer/ControlPanel/soc_P1/ref_A29': 21, 'TabContainer/ControlPanel/soc_P1/ref_A30': 22, } +enum BASE_PORTS { + UG = 0x100, + EMS_G = 0x120, + UKP_1 = 0x130, + UKP_2 = 0x140, + } + enum MODE { PRD_K, PRD_B, @@ -234,7 +240,6 @@ enum STATE { var EMS_G_PORT_DATA_HOLDER: Array = [] - # Таблица CRC-32 для модуля ФС const CRC32_TABLE: Array = [ 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, diff --git a/scripts/control_panel.gd b/scripts/control_panel.gd new file mode 100644 index 0000000..2f15fea --- /dev/null +++ b/scripts/control_panel.gd @@ -0,0 +1,73 @@ +extends Panel + +var unit_yau07 = Yau07.YaU07.new('ЯУ07') + + +func _ready() -> void: + Network.connect('yau_receive', Callable(self, '_on_data_received')) + Network.connect('yau_status_line', Callable(self, '_on_yau_status')) + + +func lose_connect_yau(): + for i in 4: + var sockets_ind = [$soc_y5/ref_A26/light_ind, + $soc_y5/ref_A27/light_ind, + $soc_y5/ref_A28/light_ind, + $soc_y5/ref_A29/light_ind] + sockets_ind[i].button_pressed = false + sockets_ind[i].disabled = true + + for i in 8: + var node_power_ind = [$soc_P1/ref_A23/light_ind, + $soc_P1/ref_A24/light_ind, + $soc_P1/ref_A25/light_ind, + $soc_P1/ref_A26/light_ind, + $soc_P1/ref_A27/light_ind, + $soc_P1/ref_A28/light_ind, + $soc_P1/ref_A29/light_ind, + $soc_y5/ref_A24/light_ind] + node_power_ind[i].button_pressed = false + node_power_ind[i].disabled = true + + +func _on_data_received(data_from_yau_07): + var status_board = data_from_yau_07.decode_u8(Constants.DataIndices.STATUS_BOARD) + var dry_contact: int = data_from_yau_07.decode_u16(Constants.DataIndices.DRY_CONTACT) # Контроль сухих контактов (УГ) + + ## SOCKETS BOARDS + for i in 4: + var sockets_ind = [$soc_y5/ref_A26/light_ind, + $soc_y5/ref_A27/light_ind, + $soc_y5/ref_A28/light_ind, + $soc_y5/ref_A29/light_ind] + var j = int(status_board & (1 << i) == 0) + if j == 0: + sockets_ind[i].button_pressed = true + sockets_ind[i].disabled = false + else: + sockets_ind[i].button_pressed = false + sockets_ind[i].disabled = true + + ## Блок ИП + for i in 8: + var node_power_ind = [$soc_P1/ref_A23/light_ind, + $soc_P1/ref_A24/light_ind, + $soc_P1/ref_A25/light_ind, + $soc_P1/ref_A26/light_ind, + $soc_P1/ref_A27/light_ind, + $soc_P1/ref_A28/light_ind, + $soc_P1/ref_A29/light_ind, + $soc_y5/ref_A24/light_ind] + var j = int(not(dry_contact & (1 << i) == 0)) + if j == 0: + node_power_ind[i].button_pressed = true + node_power_ind[i].disabled = false + else: + node_power_ind[i].button_pressed = false + node_power_ind[i].disabled = true + + +## From Network status about yau-07 +func _on_yau_status(yau_status:bool) -> void: + $soc_y5/ref_A30/light_ind.button_pressed = yau_status + $soc_y5/ref_A30/light_ind.disabled = not yau_status diff --git a/scripts/ems_g.gd b/scripts/ems_g.gd index ce8a574..e4bdd0b 100644 --- a/scripts/ems_g.gd +++ b/scripts/ems_g.gd @@ -8,12 +8,12 @@ func _on_read_ems_g(): $load_boadr.visible = true Constants.EMS_G_PORT_DATA_HOLDER.clear() for i_input in 16: - Network.write_port_isa(Constants.EMS_G_BASE_ADDR+2, 1+i_input) - Network.read_port_isa([Constants.EMS_G_BASE_ADDR+0xA]) + Network.write_port_isa(Constants.BASE_PORTS.EMS_G+2, 1+i_input) + Network.read_port_isa([Constants.BASE_PORTS.EMS_G+0xA]) for i_output in range(46, 62): - Network.write_port_isa(Constants.EMS_G_BASE_ADDR+2, 1+i_output) - Network.read_port_isa([Constants.EMS_G_BASE_ADDR+4, Constants.EMS_G_BASE_ADDR+8]) + Network.write_port_isa(Constants.BASE_PORTS.EMS_G+2, 1+i_output) + Network.read_port_isa([Constants.BASE_PORTS.EMS_G+4, Constants.BASE_PORTS.EMS_G+8]) func _on_sync(): @@ -98,7 +98,7 @@ func _on_data_received(data_from_yau_07): var parent_node2 = get_parent().get_parent() process_sockets_vert(in_blank, in_imp, 16, 1, parent_node2) - #process_sockets_horizon(out_blank, out_imp, 16, 2, parent_node2) + process_sockets_horizon(out_blank, out_imp, 16, 2, parent_node2) func process_sockets_horizon(blank: int, imp: int, count: int, col: int, parent_node2: Node): @@ -207,11 +207,11 @@ func on_mouse_entered(meta_area): func on_mode_link(mode, list): ## Формирование команды для выбора устройства var meta = list.get_meta('device') - var address_port_wr = Constants.EMS_G_BASE_ADDR+2 + var address_port_wr = Constants.BASE_PORTS.EMS_G+2 Network.write_port_isa(address_port_wr, meta) # Отправка команды ## Формирование команды для отправкы команды на устройство - address_port_wr = Constants.EMS_G_BASE_ADDR+8 + address_port_wr = Constants.BASE_PORTS.EMS_G+8 var set_mode = 0x0000 if mode == 0 else 0x2000 if mode == 1 else 0x4000 if mode == 2 else 0x8000 Network.write_port_isa(address_port_wr, set_mode) @@ -219,11 +219,11 @@ func on_mode_link(mode, list): func _on_btn_connect(toggled_on: bool, chk_btn: Node): ## Формирование команды для выбора устройства var meta = chk_btn.get_meta('device') - Network.write_port_isa(Constants.EMS_G_BASE_ADDR+2, meta[1]) # Отправка команды + Network.write_port_isa(Constants.BASE_PORTS.EMS_G+2, meta[1]) # Отправка команды ## Формирование команды для отправкы команды на устройство if toggled_on: button_link_meta[meta[1]] += 1 << meta[0]-1 else: button_link_meta[meta[1]] -= 1 << meta[0]-1 - Network.write_port_isa(Constants.EMS_G_BASE_ADDR+4, button_link_meta[meta[1]]) + Network.write_port_isa(Constants.BASE_PORTS.EMS_G+4, button_link_meta[meta[1]])