diff --git a/PRD.gd b/PRD.gd deleted file mode 100644 index 96eda2a..0000000 --- a/PRD.gd +++ /dev/null @@ -1,315 +0,0 @@ -extends Node2D - -var unit = Yau07.YaU07.new('ЯУ07') -var soc_unicast: Socket -var soc_brodcast: Socket -var address: String = Constants.ADDRESSES[0][1] -var port: int = Constants.ADDRESSES[0][2] -var flag_mode = Constants.ADDRESSES[0][3] -var send_array: Array = [] -var broadcast_packet: PackedByteArray -var node_select1: Node -var node_select2: Node -var timeout: float = Yau07.ONLINE_TIMEOUT -var last_update_time: float = 0.0 -var flag_yau_control: bool -var CONTROL_TABLE: Array -var state = Constants.STATE.WAIT -var flag_read_isa: bool = false - - -## Класс для отправки данных в сокет -class Socket extends PacketPeerUDP: - func send_to(addr: String, port: int, data: PackedByteArray): - self.set_dest_address(addr, port) - self.put_packet(data) - - -func poll_receive(sock: Socket) -> bool: ## Приёмник - if timeout - last_update_time > 0: - while sock.get_available_packet_count() > 0: - broadcast_packet = sock.get_packet() - var addr_receive = sock.get_packet_ip() - var port_receive = sock.get_packet_port() - - if (address == addr_receive) and (port == port_receive): - $control_dev/control_tbl.get_node2(0, 0).text = 'ЯУ-07Б НА СВЯЗИ' - $control_dev/control_tbl.get_node2(0, 0).modulate = Color.GREEN - last_update_time = 0.0 - unit.parse(broadcast_packet) - else: - if sock.get_available_packet_count(): - last_update_time = 0.0 - else: - $control_dev/control_tbl.get_node2(0, 0).text = 'НЕТ СВЯЗИ С ЯУ-07Б' - $control_dev/control_tbl.get_node2(0, 0).modulate = Color.RED - return false - - -func _ready() -> void: - # Таблица УКП_1 - node_select1 = $scroll1/table1 - draw_tabl(node_select1, Constants.ROWS_REGS_DATA, Constants.ROWS_REGS_DATA.size()) - node_select1.set_columns_min_size([120, 120]) - node_select1.set_node_text(0, 0, 'Мощность') - node_select1.set_node_text(1, 0, 'Температура') - - # Таблица УКП_2 - node_select2 = $scroll2/table2 - draw_tabl(node_select2, Constants.ROWS_UKP2_DATA, Constants.ROWS_UKP2_DATA.size()) - node_select2.set_columns_min_size([120, 120]) - node_select2.set_node_text(0, 0, 'Мощность') - node_select2.set_node_text(1, 0, 'Температура') - - # Выбор прибора для подключения - var node_select_device = $select_dev/select_dev - draw_tabl(node_select_device, Constants.SELECT_DEVICE, Constants.SELECT_DEVICE.size()) - var get_select_device = node_select_device.get_node2(1, 0) - - # Заполнение адресов - for i_addr in Constants.ADDRESSES.size(): - get_select_device.add_item(Constants.ADDRESSES[i_addr][0]) - get_select_device.set_item_metadata(i_addr, Constants.ADDRESSES[i_addr].slice(1,4)) - get_select_device.connect('item_selected', Callable(self, 'on_btn_select')) - node_select_device.get_node2(0,0).text = 'ПРИБОР' - node_select_device.set_columns_min_size([100, 100]) - - # Контроль - var node_control_device = $control_dev/control_tbl - for i in Constants.CONTROL_DEVICE.size(): - CONTROL_TABLE.append([Constants.TableNode]) - draw_tabl(node_control_device, CONTROL_TABLE, CONTROL_TABLE.size()) - for i in Constants.CONTROL_DEVICE.size(): - node_control_device.get_node2(0, i).text = Constants.CONTROL_DEVICE[i] - node_control_device.set_columns_min_size([300]) - - # Привязка для принятия широковещательного канала - soc_brodcast = Socket.new() - var rc = soc_brodcast.bind(Constants.BROADCAST_PORT, '*') - if rc != OK: - print('Ошибка: Неудачная привязка широковещательного адреса') - - soc_unicast = Socket.new() - rc = soc_unicast.bind(Constants.UNICAST_PORT, Constants.UNICAST_ADDRESS) - if rc != OK: - print('Ошибка: неудачная привязка адреса: ', address) - - $Zapret.connect('toggled', Callable(self, '_on_zapret').bind($Zapret)) - $Zapret2.connect('toggled', Callable(self, '_on_zapret').bind($Zapret2)) - unit.connect('line_changed', Callable(self, 'on_line_changed')) - unit.connect('command_fail', Callable(self, 'on_command_fail')) - unit.connect('command_done', Callable(self, 'on_command_done')) - unit.connect('data_received', Callable(self, 'data_received')) - -## Рисует таблицу -func draw_tabl(tbl, row: Array, count_row: int): - for i_row in count_row: - tbl.add_row(row[i_row]) - - -func _process(delta: float) -> void: - last_update_time += delta - poll_receive(soc_brodcast) - state_machine() - match unit.process(delta): - Error.OK: soc_unicast.send_to(address, port, unit.tx_data.slice(0, unit.tx_len)) - Error.FAILED: print('Ошибка отправки данных') - - -func state_machine(): - var fl_done = (unit.cmd_state == unit.CmdState.DONE) - ## Режим ожидания - if state == Constants.STATE.WAIT and fl_done: - - if flag_read_isa: - flag_read_isa = false - state = Constants.STATE.READ_ISA - elif send_array.size(): - state = Constants.STATE.WRITE_ISA - - ## Режим чтения из ИСА - elif state == Constants.STATE.READ_ISA and fl_done: - unit.send_isa(unit.CmdCode.READ_ISA, [0x122, 0x128]) - $ISA.text = 'ISA: ' + str(unit.isa_ports) - state = Constants.STATE.WAIT - ## Режим записи в ИСА - elif state == Constants.STATE.WRITE_ISA and fl_done: - var ports_dict = send_array.pop_front() - var key = ports_dict.keys() - unit.send_isa(unit.CmdCode.WRITE_ISA, [key[0], ports_dict[key[0]]]) - state = Constants.STATE.WAIT - - -func data_received(_unit): - var data_from_yau_07 = unit.status - var status_board = data_from_yau_07.decode_u8(Constants.DataIndices.STATUS_BOARD) - var in_blank: int = data_from_yau_07.decode_u16(Constants.DataIndices.IN_BLANK_PRD) - var in_imp: int = data_from_yau_07.decode_u16(Constants.DataIndices.IN_IMPULS_PRD) - var out_blank: int = data_from_yau_07.decode_u16(Constants.DataIndices.OUT_BLANK_PRD) - var out_imp: int = data_from_yau_07.decode_u16(Constants.DataIndices.OUT_IMPULS_PRD) - 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) # ДКМ от УГ - - ## УГ - #node_select1.set_node_text(2, 0, '%d' % dry_contact) - var node_control_device = $control_dev/control_tbl - for i in 4: - var node_board = node_control_device.get_node2(0, i+2) - var j = int(status_board & (1 << i) == 0 and flag_yau_control) - node_board.text = Constants.CONTROL_BOARD[i][j] - node_board.modulate = [Color.GREEN, Color.RED][j] - - for i in 8: - var node_power_supply = node_control_device.get_node2(0, i+6) - var j = int(not(dry_contact & (1 << i) == 0 and flag_yau_control)) - node_power_supply.text = Constants.CONTROL_POWER_SUPPLY[i][j] - node_power_supply.modulate = [Color.GREEN, Color.RED][j] - - ## EMS G - var CONTROL_FRAME = [$control_dev/SZI_x, $control_dev/SZI_x2, $control_dev/SZI_x3, $control_dev/SZI_x4, $control_dev/SZI_x5] - for i in 5: - var node_ems_g = node_control_device.get_node2(0, i + 14) - var j: int = 0 - var frame = Constants.Frame.WORK - - var in_bit_blank_UF = 1 if Constants.MODE.PRD_H == flag_mode else 3 if Constants.MODE.PRD_K == flag_mode else 6 - var in_bit_blank_FS = 9 if Constants.MODE.PRD_H == flag_mode else 11 if Constants.MODE.PRD_K == flag_mode else 13 - - var in_bit_impuls_UF = 1 if Constants.MODE.PRD_H == flag_mode else 3 if Constants.MODE.PRD_K == flag_mode else 6 - var in_bit_impuls_FS = 9 if Constants.MODE.PRD_H == flag_mode else 11 if Constants.MODE.PRD_K == flag_mode else 13 - ### - var out_bit_blank_UF = 1 if Constants.MODE.PRD_H == flag_mode else 1 if Constants.MODE.PRD_K == flag_mode else 0 - var out_bit_blank_MODUL = 4 if Constants.MODE.PRD_H == flag_mode else 4 if Constants.MODE.PRD_K == flag_mode else 4 - var out_bit_blank_FGOZ = 9 if Constants.MODE.PRD_H == flag_mode else 8 if Constants.MODE.PRD_K == flag_mode else 8 - - var out_bit_impuls_UF = 1 if Constants.MODE.PRD_H == flag_mode else 1 if Constants.MODE.PRD_K == flag_mode else 0 - var out_bit_impuls_MODUL = 4 if Constants.MODE.PRD_H == flag_mode else 4 if Constants.MODE.PRD_K == flag_mode else 4 - var out_bit_impuls_FGOZ = 9 if Constants.MODE.PRD_H == flag_mode else 8 if Constants.MODE.PRD_K == flag_mode else 8 - - if (in_blank & (1 << in_bit_blank_UF) != 0) and flag_yau_control: - j = 1 if i == 0 else 0 - frame = Constants.Frame.CONSTANT if i == 0 else Constants.Frame.WORK - elif (in_imp & (1 << in_bit_impuls_UF) != 0) and flag_yau_control: - j = 1 if i == 0 else 0 - frame = Constants.Frame.VARIABLE if i == 0 else Constants.Frame.WORK - if (in_blank & (1 << in_bit_blank_FS) != 0) and flag_yau_control: - j = 1 if i == 1 else 0 - frame = Constants.Frame.CONSTANT if i == 1 else Constants.Frame.WORK - elif (in_imp & (1 << in_bit_impuls_FS) != 0) and flag_yau_control: - j = 1 if i == 1 else 0 - frame = Constants.Frame.VARIABLE if i == 1 else Constants.Frame.WORK - if (out_blank & (1 << out_bit_blank_UF) != 0) and flag_yau_control: - j = 1 if i == 2 else 0 - frame = Constants.Frame.CONSTANT if i == 2 else Constants.Frame.WORK - elif (out_imp & (1 << out_bit_impuls_UF) != 0) and flag_yau_control: - j = 1 if i == 2 else 0 - frame = Constants.Frame.VARIABLE if i == 2 else Constants.Frame.WORK - if (out_blank & (1 << out_bit_blank_MODUL) != 0) and flag_yau_control: - j = 1 if i == 3 else 0 - frame = Constants.Frame.CONSTANT if i == 3 else Constants.Frame.WORK - elif (out_imp & (1 << out_bit_impuls_MODUL) != 0) and flag_yau_control: - j = 1 if i == 3 else 0 - frame = Constants.Frame.VARIABLE if i == 3 else Constants.Frame.WORK - if (out_blank & (1 << out_bit_blank_FGOZ) != 0) and flag_yau_control: - j = 1 if i == 4 else 0 - frame = Constants.Frame.CONSTANT if i == 4 else Constants.Frame.WORK - elif (out_imp & (1 << out_bit_impuls_FGOZ) != 0) and flag_yau_control: - j = 1 if i == 4 else 0 - frame = Constants.Frame.VARIABLE if i == 4 else Constants.Frame.WORK - - node_ems_g.text = Constants.EMS_G[i][j] - node_ems_g.modulate = [Color.RED, Color.GREEN][j] - set_frame(frame, CONTROL_FRAME[i]) - - #node_select1.set_node_text(3, 0, '%d' % DKM) - - ## УКП - 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 in range(8): ## Мощность от УКП_2 - var power_ukp_2 = data_from_yau_07.decode_u16(Constants.DataIndices.POWER_UKP_2 + 2 * i) - node_select2.set_node_text(0, i+1, '%d' % power_ukp_2) - - for row in range(8): ## Температура от УКП_2 - if len(data_from_yau_07) > 79 + 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(val: int, node: Node): node.set_frame(val) - - -#func dec2bin(decimal_value, number_bit): - #var binary_string = '' - #var count = number_bit - #while(count >= 0): - #var temp: int = decimal_value >> count - #binary_string += '%d' % (temp & 1) - #count -= 1 - #return binary_string - - -func on_line_changed(_unit) -> void: - if unit.online: - flag_yau_control = true - else: - for i in 15: - var node_board = $control_dev/control_tbl.get_node2(0, i+1) - node_board.modulate = Color.RED - flag_yau_control = false - - -## Ессли отсутствует подключение к ячейке ЯУ-07 -func on_command_fail(_unit) -> void: - print_debug('Command send fail') - - -## Индикация чтения портов -func on_command_done(_unit) -> void: - pass - - -func _on_control_button(toggled_on: bool) -> void: - $control_dev.visible = toggled_on - $Controlpanel.visible = toggled_on - - -func on_btn_select(intem_from_sector): - var node_select_device = $select_dev/select_dev - var get_select_device = node_select_device.get_node2(1, 0) - var meta = get_select_device.get_item_metadata(intem_from_sector) - address = meta[0] - port = meta[1] - flag_mode = meta[2] - - -func fill_item(node, i_column: int, i_row: int, arr: Dictionary, select: int = 0): - var optionbutton = node.get_node2(i_column, i_row) as OptionButton - for key in arr.keys(): - var item_text = key + " - " + str(arr[key]) - optionbutton.add_item(item_text) - if select < arr.size(): - optionbutton.select(select) - - -func _on_zapret(toggled_on: bool, meta) -> void: - var address_port_wr = 0x122 - var ports_wr: Dictionary = {address_port_wr : meta.get_meta('litera')} ## СИ2, СИ4, СИ6 = 0x30, СИ3, СИ5, СИ7 = 0x31, СИ1 = 0x2F - send_array.append(ports_wr) - - ports_wr = {} - address_port_wr = 0x128 - ports_wr[address_port_wr] = 0x4000 if toggled_on else 0x0 - send_array.append(ports_wr) - - -func _on_read_isa_pressed() -> void: - flag_read_isa = true diff --git a/PRD_MP550.tscn b/PRD_MP550.tscn index 0c4d02e..937c427 100644 --- a/PRD_MP550.tscn +++ b/PRD_MP550.tscn @@ -1,6 +1,6 @@ -[gd_scene load_steps=26 format=3 uid="uid://cvor2jm4xk3ha"] +[gd_scene load_steps=39 format=3 uid="uid://cvor2jm4xk3ha"] -[ext_resource type="Script" path="res://PRD.gd" id="1_v273n"] +[ext_resource type="Script" path="res://scripts/PRD.gd" id="1_v273n"] [ext_resource type="Script" path="res://table/table.gd" id="2_vmbyo"] [ext_resource type="Material" uid="uid://s6xe8igevnv2" path="res://Shaders/shader_edu.tres" id="3_3syd3"] [ext_resource type="Shader" path="res://Shaders/ray.gdshader" id="4_uy5o2"] @@ -62,12 +62,40 @@ corner_radius_bottom_left = 3 corner_detail = 3 anti_aliasing = false +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_h8aei"] + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_d322q"] + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_8j02b"] + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_ls6vm"] + [sub_resource type="Theme" id="Theme_k5ur4"] Button/styles/disabled = SubResource("StyleBoxFlat_ewq4n") Button/styles/focus = SubResource("StyleBoxFlat_wlyk3") Button/styles/hover = SubResource("StyleBoxFlat_2vbj6") Button/styles/normal = SubResource("StyleBoxFlat_dm3xa") Button/styles/pressed = SubResource("StyleBoxFlat_h7n4k") +TabContainer/styles/panel = SubResource("StyleBoxTexture_h8aei") +TabContainer/styles/tab_focus = SubResource("StyleBoxTexture_d322q") +TabContainer/styles/tab_selected = SubResource("StyleBoxTexture_8j02b") +TabContainer/styles/tabbar_background = SubResource("StyleBoxTexture_ls6vm") + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_rh6pm"] + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_x11tp"] + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_mn8w2"] + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_21lc8"] + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_k08q3"] + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_dklg6"] + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_17le6"] + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_tn8m6"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ovl8a"] bg_color = Color(0.388235, 0.227451, 0.290196, 1) @@ -94,6 +122,20 @@ animations = [{ "speed": 5.0 }] +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_7u7p7"] + +[sub_resource type="Gradient" id="Gradient_jlp41"] +colors = PackedColorArray(0, 0.647059, 0, 1, 0, 0.266667, 0, 1) + +[sub_resource type="GradientTexture2D" id="GradientTexture2D_u3yy8"] +gradient = SubResource("Gradient_jlp41") +fill = 1 +fill_from = Vector2(0.5, 0.5) +fill_to = Vector2(1.145, 0) + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_otisn"] +texture = SubResource("GradientTexture2D_u3yy8") + [sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_723du"] size = Vector2(1600, 1200) @@ -114,41 +156,34 @@ shader_parameter/turn = 0.785 [sub_resource type="GradientTexture2D" id="GradientTexture2D_0pk2o"] gradient = SubResource("Gradient_ki0n7") -[sub_resource type="Gradient" id="Gradient_jlp41"] -colors = PackedColorArray(0, 0.647059, 0, 1, 0, 0.266667, 0, 1) - -[sub_resource type="GradientTexture2D" id="GradientTexture2D_u3yy8"] -gradient = SubResource("Gradient_jlp41") -fill = 1 -fill_from = Vector2(0.5, 0.5) -fill_to = Vector2(1.145, 0) - -[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_otisn"] -texture = SubResource("GradientTexture2D_u3yy8") - [node name="Node2D" type="Node2D"] script = ExtResource("1_v273n") [node name="Background" type="ColorRect" parent="."] -offset_right = 2226.0 -offset_bottom = 1153.0 +offset_right = 1941.0 +offset_bottom = 988.0 color = Color(0.356863, 0.278431, 0.356863, 1) metadata/_edit_lock_ = true [node name="Litera_2_4_6" type="ColorRect" parent="Background"] +visible = false +layout_mode = 0 offset_top = 54.0 -offset_right = 2182.0 +offset_right = 1941.0 offset_bottom = 344.0 color = Color(0.586231, 0.481877, 0.585869, 1) [node name="Litera_3_5_7" type="ColorRect" parent="Background"] +visible = false +layout_mode = 0 offset_top = 352.0 -offset_right = 2182.0 -offset_bottom = 642.0 +offset_right = 1941.0 +offset_bottom = 656.0 color = Color(0.669446, 0.567301, 0.66881, 1) [node name="Litera_1" type="ColorRect" parent="Background"] visible = false +layout_mode = 0 offset_top = 647.0 offset_right = 2182.0 offset_bottom = 793.0 @@ -166,11 +201,48 @@ layout_mode = 2 script = ExtResource("2_vmbyo") metadata/_edit_lock_ = true -[node name="control_button" type="Button" parent="."] -offset_left = 24.0 -offset_top = 53.0 -offset_right = 118.0 -offset_bottom = 81.0 +[node name="ISA" type="Label" parent="."] +offset_left = 1244.0 +offset_top = 11.0 +offset_right = 1495.0 +offset_bottom = 34.0 + +[node name="read_isa" type="Button" parent="."] +offset_left = 1104.0 +offset_top = 7.0 +offset_right = 1229.0 +offset_bottom = 38.0 +text = "Прочитать ISA" + +[node name="TabContainer" type="TabContainer" parent="."] +offset_top = 39.0 +offset_right = 1941.0 +offset_bottom = 917.0 +theme = SubResource("Theme_k5ur4") +theme_override_colors/font_unselected_color = Color(0, 0, 0, 0.0392157) +theme_override_colors/font_selected_color = Color(0, 0, 0, 0) +theme_override_styles/tab_focus = SubResource("StyleBoxTexture_rh6pm") +theme_override_styles/tab_disabled = SubResource("StyleBoxTexture_x11tp") +theme_override_styles/tabbar_background = SubResource("StyleBoxTexture_mn8w2") +theme_override_styles/panel = SubResource("StyleBoxTexture_21lc8") +theme_override_styles/tab_selected = SubResource("StyleBoxTexture_k08q3") +theme_override_styles/tab_hovered = SubResource("StyleBoxTexture_dklg6") +theme_override_styles/tab_unselected = SubResource("StyleBoxTexture_17le6") +tab_alignment = 2 +current_tab = 1 +tab_focus_mode = 0 + +[node name="ControlPanel" type="Panel" parent="TabContainer"] +visible = false +layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxTexture_tn8m6") +metadata/_tab_index = 0 + +[node name="control_button" type="Button" parent="TabContainer/ControlPanel"] +offset_left = 8.0 +offset_top = 40.0 +offset_right = 102.0 +offset_bottom = 68.0 focus_mode = 0 mouse_default_cursor_shape = 2 theme = SubResource("Theme_k5ur4") @@ -180,142 +252,90 @@ toggle_mode = true button_pressed = true text = "КОНТРОЛЬ" -[node name="Controlpanel" type="ColorRect" parent="."] -offset_left = 118.0 -offset_top = 53.0 -offset_right = 465.0 -offset_bottom = 609.0 +[node name="Controlpanel" type="ColorRect" parent="TabContainer/ControlPanel"] +offset_left = 102.0 +offset_top = 40.0 +offset_right = 449.0 +offset_bottom = 596.0 color = Color(0.390334, 0.227948, 0.288326, 1) -[node name="control_dev" type="ScrollContainer" parent="."] -offset_left = 142.0 -offset_top = 63.0 -offset_right = 477.0 -offset_bottom = 647.0 -metadata/_edit_lock_ = true +[node name="control_dev" type="ScrollContainer" parent="TabContainer/ControlPanel"] +offset_left = 126.0 +offset_top = 50.0 +offset_right = 461.0 +offset_bottom = 634.0 -[node name="control_tbl" type="GridContainer" parent="control_dev"] +[node name="control_tbl" type="GridContainer" parent="TabContainer/ControlPanel/control_dev"] layout_mode = 2 script = ExtResource("2_vmbyo") metadata/_edit_lock_ = true -[node name="SZI_x" type="AnimatedSprite2D" parent="control_dev"] +[node name="SZI_x" type="AnimatedSprite2D" parent="TabContainer/ControlPanel/control_dev"] position = Vector2(284, 404) sprite_frames = SubResource("SpriteFrames_vex4t") metadata/_edit_lock_ = true -[node name="SZI_x2" type="AnimatedSprite2D" parent="control_dev"] +[node name="SZI_x2" type="AnimatedSprite2D" parent="TabContainer/ControlPanel/control_dev"] position = Vector2(284, 432) sprite_frames = SubResource("SpriteFrames_vex4t") metadata/_edit_lock_ = true -[node name="SZI_x3" type="AnimatedSprite2D" parent="control_dev"] +[node name="SZI_x3" type="AnimatedSprite2D" parent="TabContainer/ControlPanel/control_dev"] position = Vector2(284, 460) sprite_frames = SubResource("SpriteFrames_vex4t") metadata/_edit_lock_ = true -[node name="SZI_x4" type="AnimatedSprite2D" parent="control_dev"] +[node name="SZI_x4" type="AnimatedSprite2D" parent="TabContainer/ControlPanel/control_dev"] position = Vector2(284, 488) sprite_frames = SubResource("SpriteFrames_vex4t") metadata/_edit_lock_ = true -[node name="SZI_x5" type="AnimatedSprite2D" parent="control_dev"] +[node name="SZI_x5" type="AnimatedSprite2D" parent="TabContainer/ControlPanel/control_dev"] position = Vector2(284, 517) sprite_frames = SubResource("SpriteFrames_vex4t") metadata/_edit_lock_ = true -[node name="scroll1" type="ScrollContainer" parent="."] +[node name="PRD" type="Panel" parent="TabContainer"] +layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxTexture_7u7p7") +metadata/_tab_index = 1 + +[node name="scroll1" type="ScrollContainer" parent="TabContainer/PRD"] offset_left = 985.0 -offset_top = 63.0 +offset_top = 3.0 offset_right = 1348.0 -offset_bottom = 344.0 +offset_bottom = 284.0 metadata/_edit_lock_ = true -[node name="table1" type="GridContainer" parent="scroll1"] +[node name="table1" type="GridContainer" parent="TabContainer/PRD/scroll1"] layout_mode = 2 script = ExtResource("2_vmbyo") metadata/_edit_lock_ = true -[node name="scroll2" type="ScrollContainer" parent="."] +[node name="scroll2" type="ScrollContainer" parent="TabContainer/PRD"] offset_left = 985.0 -offset_top = 367.0 +offset_top = 307.0 offset_right = 1348.0 -offset_bottom = 655.0 +offset_bottom = 595.0 metadata/_edit_lock_ = true -[node name="table2" type="GridContainer" parent="scroll2"] +[node name="table2" type="GridContainer" parent="TabContainer/PRD/scroll2"] layout_mode = 2 script = ExtResource("2_vmbyo") metadata/_edit_lock_ = true -[node name="PSK" type="Sprite2D" parent="."] -material = ExtResource("3_3syd3") -position = Vector2(1388.25, 65) -scale = Vector2(0.247968, 0.234167) -texture = SubResource("PlaceholderTexture2D_723du") -offset = Vector2(800, 600) -script = SubResource("GDScript_0sobq") - -[node name="PSK grad" type="TextureRect" parent="PSK"] -modulate = Color(0, 0, 0, 1) -self_modulate = Color(0, 0, 0, 1) -show_behind_parent = true -material = SubResource("ShaderMaterial_o7txs") -offset_left = 554.954 -offset_top = -30.0 -offset_right = 1290.95 -offset_bottom = 1134.0 -texture = ExtResource("5_i3nvb") -expand_mode = 1 -metadata/_edit_lock_ = true - -[node name="ray" type="Sprite2D" parent="PSK"] -material = SubResource("ShaderMaterial_dgiai") -position = Vector2(549.221, 560.705) -scale = Vector2(21.8765, 21.6782) -texture = SubResource("GradientTexture2D_0pk2o") -metadata/_edit_lock_ = true - -[node name="PSK2" type="Sprite2D" parent="."] -material = ExtResource("3_3syd3") -position = Vector2(1388, 362) -scale = Vector2(0.247968, 0.234167) -texture = SubResource("PlaceholderTexture2D_723du") -offset = Vector2(800, 600) -script = SubResource("GDScript_0sobq") - -[node name="PSK grad" type="TextureRect" parent="PSK2"] -modulate = Color(0, 0, 0, 1) -self_modulate = Color(0, 0, 0, 1) -show_behind_parent = true -material = SubResource("ShaderMaterial_o7txs") -offset_left = 554.954 -offset_top = -30.0 -offset_right = 1290.95 -offset_bottom = 1134.0 -texture = ExtResource("5_i3nvb") -expand_mode = 1 -metadata/_edit_lock_ = true - -[node name="ray" type="Sprite2D" parent="PSK2"] -material = SubResource("ShaderMaterial_dgiai") -position = Vector2(549.221, 560.705) -scale = Vector2(21.8765, 21.6782) -texture = SubResource("GradientTexture2D_0pk2o") -metadata/_edit_lock_ = true - -[node name="LABEL" type="Label" parent="."] +[node name="LABEL" type="Label" parent="TabContainer/PRD"] offset_left = 594.0 -offset_top = 53.0 +offset_top = -7.0 offset_right = 876.0 -offset_bottom = 76.0 +offset_bottom = 16.0 text = "ЛИТЕРА 2! ПРД-Н!" -[node name="Zapret" type="Button" parent="."] +[node name="Zapret" type="Button" parent="TabContainer/PRD"] offset_left = 594.0 -offset_top = 81.0 +offset_top = 21.0 offset_right = 712.0 -offset_bottom = 115.0 +offset_bottom = 55.0 focus_mode = 0 mouse_default_cursor_shape = 2 theme_override_styles/pressed = SubResource("StyleBoxTexture_otisn") @@ -323,18 +343,18 @@ toggle_mode = true text = " Запрет СИ2" metadata/litera = 48 -[node name="LABEL2" type="Label" parent="."] +[node name="LABEL2" type="Label" parent="TabContainer/PRD"] offset_left = 594.0 -offset_top = 365.0 +offset_top = 305.0 offset_right = 876.0 -offset_bottom = 388.0 +offset_bottom = 328.0 text = "ЛИТЕРА 3! ПРД-Н!" -[node name="Zapret2" type="Button" parent="."] +[node name="Zapret2" type="Button" parent="TabContainer/PRD"] offset_left = 594.0 -offset_top = 393.0 +offset_top = 333.0 offset_right = 712.0 -offset_bottom = 427.0 +offset_bottom = 367.0 focus_mode = 0 mouse_default_cursor_shape = 2 theme_override_styles/pressed = SubResource("StyleBoxTexture_otisn") @@ -342,70 +362,113 @@ toggle_mode = true text = " Запрет СИ3" metadata/litera = 49 -[node name="Label_luch" type="Label" parent="."] +[node name="Label_luch" type="Label" parent="TabContainer/PRD"] offset_left = 594.0 -offset_top = 136.0 +offset_top = 76.0 offset_right = 876.0 -offset_bottom = 159.0 +offset_bottom = 99.0 text = "Номер и направление луча" -[node name="LUCH" type="OptionButton" parent="."] +[node name="LUCH" type="OptionButton" parent="TabContainer/PRD"] offset_left = 594.0 -offset_top = 168.0 +offset_top = 108.0 offset_right = 712.0 -offset_bottom = 199.0 +offset_bottom = 139.0 item_count = 2 popup/item_0/text = "Что-то" popup/item_1/text = "Что-то" popup/item_1/id = 1 -[node name="ISA" type="Label" parent="."] -offset_left = 1492.0 -offset_top = 11.0 -offset_right = 1743.0 -offset_bottom = 34.0 - -[node name="read_isa" type="Button" parent="."] -offset_left = 1360.0 -offset_top = 7.0 -offset_right = 1483.0 -offset_bottom = 38.0 -text = "Прочитать ISA" - -[node name="Modul" type="Label" parent="."] +[node name="Modul" type="Label" parent="TabContainer/PRD"] offset_left = 594.0 -offset_top = 438.0 +offset_top = 378.0 offset_right = 738.0 -offset_bottom = 461.0 +offset_bottom = 401.0 text = "Модуляция" -[node name="DKM2" type="Label" parent="."] +[node name="DKM2" type="Label" parent="TabContainer/PRD"] offset_left = 594.0 -offset_top = 219.0 +offset_top = 159.0 offset_right = 736.0 -offset_bottom = 242.0 +offset_bottom = 182.0 text = "ДКМ ДОУ 2" -[node name="DKM3" type="Label" parent="."] +[node name="DKM3" type="Label" parent="TabContainer/PRD"] offset_left = 594.0 -offset_top = 467.0 +offset_top = 407.0 offset_right = 736.0 -offset_bottom = 490.0 +offset_bottom = 430.0 text = "ДКМ ДОУ 3" -[node name="FGOZ2" type="Label" parent="."] +[node name="FGOZ2" type="Label" parent="TabContainer/PRD"] offset_left = 594.0 -offset_top = 242.0 +offset_top = 182.0 offset_right = 767.0 -offset_bottom = 265.0 +offset_bottom = 205.0 text = "ФГОЗ 2" -[node name="FGOZ3" type="Label" parent="."] +[node name="FGOZ3" type="Label" parent="TabContainer/PRD"] offset_left = 594.0 -offset_top = 490.0 +offset_top = 430.0 offset_right = 767.0 -offset_bottom = 513.0 +offset_bottom = 453.0 text = "ФГОЗ 3" -[connection signal="toggled" from="control_button" to="." method="_on_control_button"] +[node name="PSK" type="Sprite2D" parent="TabContainer/PRD"] +material = ExtResource("3_3syd3") +position = Vector2(1388.25, 5) +scale = Vector2(0.247968, 0.234167) +texture = SubResource("PlaceholderTexture2D_723du") +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 +material = SubResource("ShaderMaterial_o7txs") +offset_left = 554.954 +offset_top = -30.0 +offset_right = 1290.95 +offset_bottom = 1134.0 +texture = ExtResource("5_i3nvb") +expand_mode = 1 +metadata/_edit_lock_ = true + +[node name="ray" type="Sprite2D" parent="TabContainer/PRD/PSK"] +material = SubResource("ShaderMaterial_dgiai") +position = Vector2(549.221, 560.705) +scale = Vector2(21.8765, 21.6782) +texture = SubResource("GradientTexture2D_0pk2o") +metadata/_edit_lock_ = true + +[node name="PSK2" type="Sprite2D" parent="TabContainer/PRD"] +material = ExtResource("3_3syd3") +position = Vector2(1388, 302) +scale = Vector2(0.247968, 0.234167) +texture = SubResource("PlaceholderTexture2D_723du") +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) +show_behind_parent = true +material = SubResource("ShaderMaterial_o7txs") +offset_left = 554.954 +offset_top = -30.0 +offset_right = 1290.95 +offset_bottom = 1134.0 +texture = ExtResource("5_i3nvb") +expand_mode = 1 +metadata/_edit_lock_ = true + +[node name="ray" type="Sprite2D" parent="TabContainer/PRD/PSK2"] +material = SubResource("ShaderMaterial_dgiai") +position = Vector2(549.221, 560.705) +scale = Vector2(21.8765, 21.6782) +texture = SubResource("GradientTexture2D_0pk2o") +metadata/_edit_lock_ = true + [connection signal="pressed" from="read_isa" to="." method="_on_read_isa_pressed"] +[connection signal="toggled" from="TabContainer/ControlPanel/control_button" to="." method="_on_control_button"] diff --git a/project.godot b/project.godot index c0f9209..adc20c0 100644 --- a/project.godot +++ b/project.godot @@ -17,13 +17,14 @@ config/icon="res://icon.svg" [autoload] -Constants="*res://constants.gd" -Yau07="*res://yau07.gd" +Constants="*res://scripts/constants.gd" +Yau07="*res://scripts/yau07.gd" +Network="*res://scripts/network.gd" [display] -window/size/viewport_width=1800 -window/size/viewport_height=800 +window/size/viewport_width=1900 +window/size/viewport_height=940 [rendering] diff --git a/scripts/PRD.gd b/scripts/PRD.gd new file mode 100644 index 0000000..5fcdaf6 --- /dev/null +++ b/scripts/PRD.gd @@ -0,0 +1,251 @@ +extends Node2D + +#var unit = Yau07.YaU07.new('ЯУ07') +var flag_mode = Constants.ADDRESSES[0][3] +var broadcast_packet: PackedByteArray +var node_select1: Node +var node_select2: Node +var flag_yau_control: bool +var CONTROL_TABLE: Array + + + +func _ready() -> void: + # Таблица УКП_1 + node_select1 = $TabContainer/PRD/scroll1/table1 + draw_tabl(node_select1, Constants.ROWS_REGS_DATA, Constants.ROWS_REGS_DATA.size()) + node_select1.set_columns_min_size([120, 120]) + node_select1.set_node_text(0, 0, 'Мощность') + node_select1.set_node_text(1, 0, 'Температура') + + # Таблица УКП_2 + node_select2 = $TabContainer/PRD/scroll2/table2 + draw_tabl(node_select2, Constants.ROWS_UKP2_DATA, Constants.ROWS_UKP2_DATA.size()) + node_select2.set_columns_min_size([120, 120]) + node_select2.set_node_text(0, 0, 'Мощность') + node_select2.set_node_text(1, 0, 'Температура') + + # Выбор прибора для подключения + var node_select_device = $select_dev/select_dev + draw_tabl(node_select_device, Constants.SELECT_DEVICE, Constants.SELECT_DEVICE.size()) + var get_select_device = node_select_device.get_node2(1, 0) + + # Заполнение адресов + for i_addr in Constants.ADDRESSES.size(): + get_select_device.add_item(Constants.ADDRESSES[i_addr][0]) + get_select_device.set_item_metadata(i_addr, Constants.ADDRESSES[i_addr].slice(1,4)) + get_select_device.connect('item_selected', Callable(self, 'on_btn_select')) + node_select_device.get_node2(0,0).text = 'ПРИБОР' + node_select_device.set_columns_min_size([100, 100]) + + # Контроль + var node_control_device = $TabContainer/ControlPanel/control_dev/control_tbl + for i in Constants.CONTROL_DEVICE.size(): + CONTROL_TABLE.append([Constants.TableNode]) + draw_tabl(node_control_device, CONTROL_TABLE, CONTROL_TABLE.size()) + for i in Constants.CONTROL_DEVICE.size(): + node_control_device.get_node2(0, i).text = Constants.CONTROL_DEVICE[i] + node_control_device.set_columns_min_size([300]) + + + + $TabContainer/PRD/Zapret.connect('toggled', Callable(self, '_on_zapret').bind($TabContainer/PRD/Zapret)) + $TabContainer/PRD/Zapret2.connect('toggled', Callable(self, '_on_zapret').bind($TabContainer/PRD/Zapret2)) + 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')) + + +## From Network status about yau-07 +func _on_yau_status(yau_status): + if yau_status: + $TabContainer/ControlPanel/control_dev/control_tbl.get_node2(0, 0).text = 'ЯУ-07Б НА СВЯЗИ' + $TabContainer/ControlPanel/control_dev/control_tbl.get_node2(0, 0).modulate = Color.GREEN + flag_yau_control = true + else: + $TabContainer/ControlPanel/control_dev/control_tbl.get_node2(0, 0).text = 'НЕТ СВЯЗИ С ЯУ-07Б' + $TabContainer/ControlPanel/control_dev/control_tbl.get_node2(0, 0).modulate = Color.RED + for dev in (Constants.CONTROL_DEVICE.size() - 1): + var node_board = $TabContainer/ControlPanel/control_dev/control_tbl.get_node2(0, dev+1) + node_board.modulate = Color.RED + flag_yau_control = false + + +func _on_read_isa(unit_isa_ports): + $ISA.text = 'ISA: ' + str(unit_isa_ports) + + +## Рисует таблицу +func draw_tabl(tbl, row: Array, count_row: int): + for i_row in count_row: + tbl.add_row(row[i_row]) + + +func _process(delta: float) -> void: + pass + + +func _on_data_received(data_from_yau_07): + if flag_yau_control: + var status_board = data_from_yau_07.decode_u8(Constants.DataIndices.STATUS_BOARD) + var in_blank: int = data_from_yau_07.decode_u16(Constants.DataIndices.IN_BLANK_PRD) + var in_imp: int = data_from_yau_07.decode_u16(Constants.DataIndices.IN_IMPULS_PRD) + var out_blank: int = data_from_yau_07.decode_u16(Constants.DataIndices.OUT_BLANK_PRD) + var out_imp: int = data_from_yau_07.decode_u16(Constants.DataIndices.OUT_IMPULS_PRD) + 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) # ДКМ от УГ + + ## УГ + #node_select1.set_node_text(2, 0, '%d' % dry_contact) + var node_control_device = $TabContainer/ControlPanel/control_dev/control_tbl + for i in 4: + var node_board = node_control_device.get_node2(0, i+2) + var j = int(status_board & (1 << i) == 0 and flag_yau_control) + node_board.text = Constants.CONTROL_BOARD[i][j] + node_board.modulate = [Color.GREEN, Color.RED][j] + + for i in 8: + var node_power_supply = node_control_device.get_node2(0, i+6) + var j = int(not(dry_contact & (1 << i) == 0 and flag_yau_control)) + node_power_supply.text = Constants.CONTROL_POWER_SUPPLY[i][j] + node_power_supply.modulate = [Color.GREEN, Color.RED][j] + + ## EMS G + var CONTROL_FRAME = [$TabContainer/ControlPanel/control_dev/SZI_x, $TabContainer/ControlPanel/control_dev/SZI_x2, $TabContainer/ControlPanel/control_dev/SZI_x3, $TabContainer/ControlPanel/control_dev/SZI_x4, $TabContainer/ControlPanel/control_dev/SZI_x5] + for i in 5: + var node_ems_g = node_control_device.get_node2(0, i + 14) + var j: int = 0 + var frame = Constants.Frame.WORK + + var in_bit_blank_UF = 1 if Constants.MODE.PRD_H == flag_mode else 3 if Constants.MODE.PRD_K == flag_mode else 6 + var in_bit_blank_FS = 9 if Constants.MODE.PRD_H == flag_mode else 11 if Constants.MODE.PRD_K == flag_mode else 13 + + var in_bit_impuls_UF = 1 if Constants.MODE.PRD_H == flag_mode else 3 if Constants.MODE.PRD_K == flag_mode else 6 + var in_bit_impuls_FS = 9 if Constants.MODE.PRD_H == flag_mode else 11 if Constants.MODE.PRD_K == flag_mode else 13 + ### + var out_bit_blank_UF = 1 if Constants.MODE.PRD_H == flag_mode else 1 if Constants.MODE.PRD_K == flag_mode else 0 + var out_bit_blank_MODUL = 4 if Constants.MODE.PRD_H == flag_mode else 4 if Constants.MODE.PRD_K == flag_mode else 4 + var out_bit_blank_FGOZ = 9 if Constants.MODE.PRD_H == flag_mode else 8 if Constants.MODE.PRD_K == flag_mode else 8 + + var out_bit_impuls_UF = 1 if Constants.MODE.PRD_H == flag_mode else 1 if Constants.MODE.PRD_K == flag_mode else 0 + var out_bit_impuls_MODUL = 4 if Constants.MODE.PRD_H == flag_mode else 4 if Constants.MODE.PRD_K == flag_mode else 4 + var out_bit_impuls_FGOZ = 9 if Constants.MODE.PRD_H == flag_mode else 8 if Constants.MODE.PRD_K == flag_mode else 8 + + + if (in_blank & (1 << in_bit_blank_UF) != 0) and flag_yau_control: + j = 1 if i == 0 else 0 + frame = Constants.Frame.CONSTANT if i == 0 else Constants.Frame.WORK + set_frame(CONTROL_FRAME[i], frame) + elif (in_imp & (1 << in_bit_impuls_UF) != 0) and flag_yau_control: + j = 1 if i == 0 else 0 + frame = Constants.Frame.VARIABLE if i == 0 else Constants.Frame.WORK + set_frame(CONTROL_FRAME[i], frame) + elif (in_blank & (1 << in_bit_blank_FS) != 0) and flag_yau_control: + j = 1 if i == 1 else 0 + frame = Constants.Frame.CONSTANT if i == 1 else Constants.Frame.WORK + set_frame(CONTROL_FRAME[i], frame) + elif (in_imp & (1 << in_bit_impuls_FS) != 0) and flag_yau_control: + j = 1 if i == 1 else 0 + frame = Constants.Frame.VARIABLE if i == 1 else Constants.Frame.WORK + elif (out_blank & (1 << out_bit_blank_UF) != 0) and flag_yau_control: + j = 1 if i == 2 else 0 + frame = Constants.Frame.CONSTANT if i == 2 else Constants.Frame.WORK + set_frame(CONTROL_FRAME[i], frame) + elif (out_imp & (1 << out_bit_impuls_UF) != 0) and flag_yau_control: + j = 1 if i == 2 else 0 + frame = Constants.Frame.VARIABLE if i == 2 else Constants.Frame.WORK + set_frame(CONTROL_FRAME[i], frame) + elif (out_blank & (1 << out_bit_blank_MODUL) != 0) and flag_yau_control: + j = 1 if i == 3 else 0 + frame = Constants.Frame.CONSTANT if i == 3 else Constants.Frame.WORK + set_frame(CONTROL_FRAME[i], frame) + elif (out_imp & (1 << out_bit_impuls_MODUL) != 0) and flag_yau_control: + j = 1 if i == 3 else 0 + frame = Constants.Frame.VARIABLE if i == 3 else Constants.Frame.WORK + set_frame(CONTROL_FRAME[i], frame) + elif (out_blank & (1 << out_bit_blank_FGOZ) != 0) and flag_yau_control: + j = 1 if i == 4 else 0 + frame = Constants.Frame.CONSTANT if i == 4 else Constants.Frame.WORK + set_frame(CONTROL_FRAME[i], frame) + elif (out_imp & (1 << out_bit_impuls_FGOZ) != 0) and flag_yau_control: + j = 1 if i == 4 else 0 + frame = Constants.Frame.VARIABLE if i == 4 else Constants.Frame.WORK + set_frame(CONTROL_FRAME[i], frame) + + node_ems_g.text = Constants.EMS_G[i][j] + node_ems_g.modulate = [Color.RED, Color.GREEN][j] + #set_frame(CONTROL_FRAME[i], frame) + + #node_select1.set_node_text(3, 0, '%d' % DKM) + + ## УКП + 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 in range(8): ## Мощность от УКП_2 + var power_ukp_2 = data_from_yau_07.decode_u16(Constants.DataIndices.POWER_UKP_2 + 2 * i) + node_select2.set_node_text(0, i+1, '%d' % power_ukp_2) + + for row in range(8): ## Температура от УКП_2 + if len(data_from_yau_07) > 79 + 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) + + +#func dec2bin(decimal_value, number_bit): + #var binary_string = '' + #var count = number_bit + #while(count >= 0): + #var temp: int = decimal_value >> count + #binary_string += '%d' % (temp & 1) + #count -= 1 + #return binary_string + + +func _on_control_button(toggled_on: bool) -> void: + $TabContainer/ControlPanel/control_dev.visible = toggled_on + $TabContainer/ControlPanel/Controlpanel.visible = toggled_on + + +func on_btn_select(intem_from_sector): + var node_select_device = $select_dev/select_dev + var get_select_device = node_select_device.get_node2(1, 0) + var meta = get_select_device.get_item_metadata(intem_from_sector) + Network.address = meta[0] + Network.port = meta[1] + flag_mode = meta[2] + + +func fill_item(node, i_column: int, i_row: int, arr: Dictionary, select: int = 0): + var optionbutton = node.get_node2(i_column, i_row) as OptionButton + for key in arr.keys(): + var item_text = key + " - " + str(arr[key]) + optionbutton.add_item(item_text) + if select < arr.size(): + optionbutton.select(select) + + +func _on_zapret(toggled_on: bool, meta) -> void: + var send_array: Array = [] + var address_port_wr = 0x122 + var ports_wr: Dictionary = {address_port_wr : meta.get_meta('litera')} ## СИ2, СИ4, СИ6 = 0x30, СИ3, СИ5, СИ7 = 0x31, СИ1 = 0x2F + Network.send_array.append(ports_wr) + + ports_wr = {} + address_port_wr = 0x128 + ports_wr[address_port_wr] = 0x4000 if toggled_on else 0x0 + Network.send_array.append(ports_wr) + + +func _on_read_isa_pressed() -> void: + Network.flag_read_isa = true diff --git a/constants.gd b/scripts/constants.gd similarity index 86% rename from constants.gd rename to scripts/constants.gd index f864e8a..f9aced0 100644 --- a/constants.gd +++ b/scripts/constants.gd @@ -11,7 +11,7 @@ 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") const SELECT_DEVICE: Array = [[TableNode, TableList]] -const CONTROL_DEVICE: Array = ['ЯЧЕЙКА ЯУ-07Б', 'ФС', 'ЯЧЕЙКА ЭМС-Г', 'ЯЧЕЙКА УГ', 'ЯЧЕЙКА УКП №1', 'ЯЧЕЙКА УКП №2', 'ИП МАА №1', 'ИП МАА №2', 'ИП9-50 №1', 'ИП9-50 №2', 'ИП12-50 №1', '-', '-','ИП5-25', 'Вход Х3:2(СЗИ2)', 'Вход Х3:19(СИ2)', 'Выход Х3:11(СИ2)', 'Выход Х3:14(СИ2)', 'Выход x3:10(ФГОЗ)'] +const CONTROL_DEVICE: Array = ['ЯЧЕЙКА ЯУ-07Б', 'ФС', 'ЯЧЕЙКА ЭМС-Г', 'ЯЧЕЙКА УГ', 'ЯЧЕЙКА УКП №1', 'ЯЧЕЙКА УКП №2', 'ИП МАА №1', 'ИП МАА №2', 'ИП9-50 №1', 'ИП9-50 №2', 'ИП12-50 №1', '-', '-','ИП5-25', 'Х3:2(СЗИ2 от УФ)', 'Х3:19(СИ2 от ФС)', 'Х3:11(СИ2 в УФ)', 'Х3:14(Модуляция)', 'Х3:27(ФГОЗ)'] const ROWS_REGS_DATA: Array = [ [TableNode, TableNode], [TableNode, TableNode], @@ -60,11 +60,11 @@ var CONTROL_POWER_SUPPLY: Array = [ ['ИП12-50 №2', 'ОШИБКА. КОНТРОЛЬ ИП12-50 №2'], ['ИП5-25', 'ОШИБКА. КОНТРОЛЬ ИП5-25']] const EMS_G = [ - ['Нет Входа Х3:2(СИ2 от УФ)', 'Вход Х3:2(СИ2 от УФ)'], - ['Нет Входа Х3:19(СИ2 от ФС)', 'Вход Х3:19(СИ2 от ФС)'], - ['Нет Выхода Х3:2(СИ2 в УФ)', 'Выход Х3:2(СИ2 в УФ)'], - ['Нет Выхода Х3:5(Модуляция)', 'Выход Х3:5(Модуляция)'], - ['Нет Выхода Х3:10(ФГОЗ)', 'Выход Х3:10(ФГОЗ)']] + ['Нет Х3:2(СЗИ2 от УФ)', 'Есть Х3:2(СЗИ2 от УФ)'], + ['Нет Х3:19(СИ2 от ФС)', 'Есть Х3:19(СИ2 от ФС)'], + ['Нет Х3:11(СИ2 в УФ)', 'Есть Х3:11(СИ2 в УФ)'], + ['Нет Х3:14(Модуляция)', 'Есть Х3:14(Модуляция)'], + ['Нет Х3:27(ФГОЗ)', 'Есть Х3:27(ФГОЗ)']] enum MODE { PRD_K, PRD_B, diff --git a/scripts/network.gd b/scripts/network.gd new file mode 100644 index 0000000..58cd0a6 --- /dev/null +++ b/scripts/network.gd @@ -0,0 +1,107 @@ +extends Node + +var unit = Yau07.YaU07.new('ЯУ07') +var soc_unicast: Socket +var soc_brodcast: Socket +var address: String = Constants.ADDRESSES[0][1] +var port: int = Constants.ADDRESSES[0][2] +var timeout: float = Yau07.ONLINE_TIMEOUT +var last_update_time: float = 0.0 +var broadcast_packet: PackedByteArray +var state = Constants.STATE.WAIT +var send_array: Array = [] +var flag_read_isa: bool = false + + +signal _yau_status_line(_status) ## Вызывается когда меняется состояние связи с ячейкой +signal _yau_receive(_data_from_yau) ## +signal _yau_read_isa(_unit_isa_ports) + +## Класс для отправки данных в сокет +class Socket extends PacketPeerUDP: + func send_to(addr: String, port: int, data: PackedByteArray): + self.set_dest_address(addr, port) + self.put_packet(data) + + +func poll_receive(sock: Socket) -> bool: ## Приёмник + if timeout - last_update_time > 0: + while sock.get_available_packet_count() > 0: + broadcast_packet = sock.get_packet() + var addr_receive = sock.get_packet_ip() + var port_receive = sock.get_packet_port() + + if (address == addr_receive) and (port == port_receive): + last_update_time = 0.0 + unit.parse(broadcast_packet) + var data_from_yau_07 = unit.status + emit_signal('_yau_receive', data_from_yau_07) + else: + if sock.get_available_packet_count(): + last_update_time = 0.0 + return false + + +func _ready() -> void: + # Привязка для принятия широковещательного канала + soc_brodcast = Socket.new() + var rc = soc_brodcast.bind(Constants.BROADCAST_PORT, '*') + if rc != OK: + print('Ошибка: Неудачная привязка широковещательного адреса') + + soc_unicast = Socket.new() + rc = soc_unicast.bind(Constants.UNICAST_PORT, Constants.UNICAST_ADDRESS) + if rc != OK: + print('Ошибка: неудачная привязка адреса: ', address) + + unit.connect('line_changed', Callable(self, 'on_line_changed')) + unit.connect('command_fail', Callable(self, 'on_command_fail')) + unit.connect('command_done', Callable(self, 'on_command_done')) + + +func _process(delta: float) -> void: + last_update_time += delta + poll_receive(soc_brodcast) + state_machine() + match unit.process(delta): + Error.OK: soc_unicast.send_to(address, port, unit.tx_data.slice(0, unit.tx_len)) + Error.FAILED: print('Ошибка отправки данных') + + +func state_machine(): + var fl_done = (unit.cmd_state == unit.CmdState.DONE) + ## Режим ожидания + if state == Constants.STATE.WAIT and fl_done: + + if flag_read_isa: + flag_read_isa = false + state = Constants.STATE.READ_ISA + elif send_array.size(): + state = Constants.STATE.WRITE_ISA + + ## Режим чтения из ИСА + elif state == Constants.STATE.READ_ISA and fl_done: + unit.send_isa(unit.CmdCode.READ_ISA, [0x122, 0x128]) + state = Constants.STATE.WAIT + var unit_isa_ports = unit.isa_ports + emit_signal('_yau_read_isa', unit_isa_ports) + ## Режим записи в ИСА + elif state == Constants.STATE.WRITE_ISA and fl_done: + var ports_dict = send_array.pop_front() + var key = ports_dict.keys() + unit.send_isa(unit.CmdCode.WRITE_ISA, [key[0], ports_dict[key[0]]]) + state = Constants.STATE.WAIT + + +func on_line_changed(_unit) -> void: + emit_signal('_yau_status_line', unit.online) + + +## Ессли отсутствует подключение к ячейке ЯУ-07 +func on_command_fail(_unit) -> void: + print_debug('Command send fail') + + +## Индикация чтения портов +func on_command_done(_unit) -> void: + pass diff --git a/yau07.gd b/scripts/yau07.gd similarity index 100% rename from yau07.gd rename to scripts/yau07.gd diff --git a/tools.gd b/tools.gd deleted file mode 100644 index 2df164b..0000000 --- a/tools.gd +++ /dev/null @@ -1,91 +0,0 @@ -extends Node - -## Простые часто используемые функции - - -## Возвращает true, если val число, false - если иначе -func type_is_num(val) -> bool: return (typeof(val) == TYPE_INT) or (typeof(val) == typeof(0.0)) - - -## Возвращае значение в радианах для угла в градусах [param val]. -func radians(val: float): return (val * PI) / 180.0 - - -## Возвращает значение из байтового массива в 16 битное слово -func ibytes_to_word(buf: PackedByteArray, i: int) -> int: return buf[i] + (buf[i + 1] * 256) - - -## Возвращает расстояние от центра координат до точки -func hypot(x: float, y: float) -> float: return sqrt(x * x + y * y) - - -## Проверяет пересечение диапазона x1, x2 с диапазоном y1, y2 """ -func is_overlap(x1, x2, y1, y2): return max(x1, y1) <= min(x2, y2) - - -## Производит преобразование из декартовой в полярную систему координат -func pos_calc(freq: float, aoa: float, pos0: Vector2, r0: float, r1: float, f0: float, f1: float): - var df = f1 - f0 - var r = ((freq - f0) / df) * r1 + r0 - var aoa_rad = Tools.radians(aoa) - PI / 2.0 - var x = cos(aoa_rad) * r + pos0.x - var y = sin(aoa_rad) * r + pos0.y - return Vector2(x, y) - - -## Отсекает значение до заданного диапазона -func clip_value(val, val_min, val_max): - if val < val_min: val = val_min - if val > val_max: val = val_max - return val - - -## Возвращает массив с именами членов класса [param obj] -func get_members_names(obj: Object) -> Array: - var pl = obj.get_property_list() - var names: = Array() - for item in pl: names.append(item.name) - return names - - -## Проверяет, что заданный массив [param val] похож на ip-адрес -func is_array_ipaddr(val: Array): - return (val.size() == 2) \ - and (val[0] is String) \ - and (val[1] is int) \ - and (0 < val[1]) \ - and (val[1] < 65536) - - -## Преобразует декартовые координаты в полярные. [param pos0] -## - координаты центра, [param pos] - координаты точки -func map_dec_to_rad(pos0: Vector2, pos: Vector2) -> Vector2: - var x1: float = pos.x - pos0.x - var y1: float = pos.y - pos0.y - var ang: float = (atan2(y1, x1) * 180.0) / PI - return Vector2(ang + 360.0 * float(ang < 0.0), hypot(x1, y1)) - - -## Переводит значение val из диапазона a0...a1 в диапазон b0...b1 -func map_range(val: float, a0: float, a1: float, b0: float, b1: float) -> float: - return (((val - a0) * (b1 - b0)) / (a1 - a0)) + b0 - - -## Возвращает true, если точка внутри заданного полигона -func is_point_in_polygon(pos: Vector2, p: PackedVector2Array) -> bool: - var sz: = p.size() - assert(sz) - var j: int = sz - 1 - var odd_nodes: int = 0 - for i in sz: - if ((p[i].y < pos.y and p[j].y >= pos.y or p[j].y < pos.y and p[i].y >= pos.y) and (p[i].x <= pos.x or p[j].x <= pos.x)): - odd_nodes ^= int((p[i].x + (pos.y - p[i].y) / (p[j].y - p[i].y) * (p[j].x - p[i].x) < pos.x)) - j = i - return odd_nodes > 0 - - -## Записывает слово [param val] в элемент байтовго массива [param buf] -## расположенный по индексу [param index]. Младшее слово -func set_wordi(buf: PackedByteArray, index: int, val: int) -> void: - buf[index] = val & 0xff - buf[index + 1] = (val >> 8) & 0xff