From 6e5f0bed349c28d320c9fa18b1364e0b8cd9b89a Mon Sep 17 00:00:00 2001 From: Maxim Date: Fri, 7 Feb 2025 00:10:18 +0300 Subject: [PATCH] modul fs 2 --- PRD_MP550.tscn | 19 +++-- Web.png | Bin 21325 -> 18795 bytes scripts/FS.gd | 3 +- scripts/PRD.gd | 21 ++++-- scripts/modul_fs.gd | 3 +- scripts/network.gd | 174 ++++++++++++++++++++++++++++++++++---------- 6 files changed, 169 insertions(+), 51 deletions(-) diff --git a/PRD_MP550.tscn b/PRD_MP550.tscn index a6d11e2..1bcb40f 100644 --- a/PRD_MP550.tscn +++ b/PRD_MP550.tscn @@ -252,9 +252,10 @@ color = Color(0.669446, 0.567301, 0.66881, 1) [node name="ISA" type="Label" parent="."] offset_left = 225.0 offset_top = 11.0 -offset_right = 1853.0 +offset_right = 409.0 offset_bottom = 48.0 autowrap_mode = 3 +metadata/_edit_lock_ = true [node name="read_isa" type="Button" parent="."] offset_left = 85.0 @@ -262,6 +263,7 @@ offset_top = 7.0 offset_right = 210.0 offset_bottom = 38.0 text = "Прочитать ISA" +metadata/_edit_lock_ = true [node name="TabContainer" type="TabContainer" parent="."] offset_left = 216.0 @@ -281,6 +283,7 @@ theme_override_styles/tab_unselected = SubResource("StyleBoxTexture_17le6") tab_alignment = 2 current_tab = 0 tab_focus_mode = 0 +metadata/_edit_lock_ = true [node name="PRD" type="Panel" parent="TabContainer"] layout_mode = 2 @@ -329,13 +332,14 @@ script = ExtResource("2_vmbyo") metadata/_edit_lock_ = true [node name="PSK" type="Sprite2D" parent="TabContainer/PRD/body_grid/litera_2_4_6"] -modulate = Color(1, 1, 0.941176, 0.588235) +modulate = Color(1, 1, 0.941176, 0.733333) material = ExtResource("3_3syd3") -position = Vector2(914, 5) -scale = Vector2(0.247968, 0.234167) +position = Vector2(955, 5) +scale = Vector2(0.23, 0.217) texture = SubResource("PlaceholderTexture2D_723du") offset = Vector2(800, 600) script = SubResource("GDScript_0sobq") +metadata/_edit_lock_ = true [node name="PSK grad" type="TextureRect" parent="TabContainer/PRD/body_grid/litera_2_4_6/PSK"] modulate = Color(1, 1, 0.941176, 0.784314) @@ -387,13 +391,14 @@ script = ExtResource("2_vmbyo") metadata/_edit_lock_ = true [node name="PSK2" type="Sprite2D" parent="TabContainer/PRD/body_grid/litera_3_5_7"] -modulate = Color(1, 1, 0.941176, 0.588235) +modulate = Color(1, 1, 0.941176, 0.733333) material = ExtResource("3_3syd3") -position = Vector2(914, -6) -scale = Vector2(0.247968, 0.234167) +position = Vector2(955, -6) +scale = Vector2(0.23, 0.217) texture = SubResource("PlaceholderTexture2D_723du") offset = Vector2(800, 600) script = SubResource("GDScript_0sobq") +metadata/_edit_lock_ = true [node name="PSK grad" type="TextureRect" parent="TabContainer/PRD/body_grid/litera_3_5_7/PSK2"] modulate = Color(1, 1, 0.941176, 0.784314) diff --git a/Web.png b/Web.png index 76c19445d71bb6737309086ad26908091a67802a..cceda451947018b87ddb36f69485c1915570ce7b 100644 GIT binary patch literal 18795 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 literal 21325 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 MPoKpV?yThh2R9SzWB>pF diff --git a/scripts/FS.gd b/scripts/FS.gd index bb8f0b0..c16846f 100644 --- a/scripts/FS.gd +++ b/scripts/FS.gd @@ -108,7 +108,8 @@ class FGOS: var crc = crc32(packet) packet.resize(packet.size() + 4) packet.encode_u32(packet.size() - 4, crc) - Network.command_stack.append(packet) + #Network.command_stack.append(packet) + Network.command_stack_2.append(packet) func _parse(rx_data: PackedByteArray): diff --git a/scripts/PRD.gd b/scripts/PRD.gd index a8afb7e..c27debc 100644 --- a/scripts/PRD.gd +++ b/scripts/PRD.gd @@ -137,6 +137,8 @@ func _ready() -> void: 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')) + Network.connect('port_fs_opened_1', _on_port_changed_fs_1.bind(Color.GREEN)) + Network.connect('port_fs_opened_2', _on_port_changed_fs_2.bind(Color.GREEN)) Network.connect('data_from_fs_1', _on_data_fs_1) Network.connect('data_from_fs_2', _on_data_fs_2) @@ -418,7 +420,8 @@ func on_btn_select(intem_from_sector: int) -> void: Network.on_command_change_device(meta) flag_mode = meta[2] draw_control_panel_prd(flag_mode) - _on_start_fs_1() + #_on_start_fs_1() + _on_start_fs_2() func _on_zapret1(toggled_on: bool) -> void: @@ -519,7 +522,12 @@ func _on_read_isa_pressed() -> void: func set_bits(v, a, m): return (~m) & v | a & m + ## 1 ФС +func _on_port_changed_fs_1(port_name: String, _color: Color) -> void: + $TabContainer/PRD/body_grid/litera_2_4_6/fs_control.set_node_text(1, 1, port_name) + + func _on_start_fs_1(): Network.start_work_fs() @@ -538,18 +546,21 @@ func _on_set_att_1(att: String): ## 2 ФС +func _on_port_changed_fs_2(port_name: String, _color: Color) -> void: + $TabContainer/PRD/body_grid/litera_3_5_7/fs_control.set_node_text(1, 1, port_name) + func _on_start_fs_2(): - Network.start_work_fs() + Network.start_work_fs_2() func _on_get_status_2(toggled_btn): var inverted_state = not toggled_btn - Network.get_fs_gen_status(inverted_state) + Network.get_fs_gen_status_2(inverted_state) func _on_set_ferq_2(freq: String): - Network.set_fs_ferq_carrier(int(freq) * 1_000_000) + Network.set_fs_ferq_carrier_2(int(freq) * 1_000_000) func _on_set_att_2(att: String): - Network.set_fs_attenuation(float(att)) + Network.set_fs_attenuation_2(float(att)) diff --git a/scripts/modul_fs.gd b/scripts/modul_fs.gd index afa66c2..61677ed 100644 --- a/scripts/modul_fs.gd +++ b/scripts/modul_fs.gd @@ -13,8 +13,9 @@ func _process(_delta: float) -> void: func _enter_tree() -> void: + pass # Подключаем сигналы к методам - Network.connect('data_send', _on_data_send) + #Network.connect('data_send', _on_data_send) #Network.connect('data_from_fs_1', _on_data_received) #Network.connect('port_opened', _on_port_changed.bind(Color.GREEN)) #Network.connect('port_closed', _on_port_changed.bind(Color.GRAY)) diff --git a/scripts/network.gd b/scripts/network.gd index f435940..912ae9d 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -2,7 +2,8 @@ extends Node # ЯУ-07 Блок var unit = Yau07.YaU07.new('ЯУ-07Б') -var unit_fs_1 = Fs.FGOS.new() +#var unit_fs_1 = Fs.FGOS.new() +var unit_fs_2 = Fs.FGOS.new() var soc_unicast: Socket var soc_brodcast: Socket var ip_address_yau: String = Constants.ADDRESSES[0][1] @@ -15,21 +16,30 @@ var state = Constants.STATE.WAIT var send_array: Array = [] # ФС Блок -var ip_fs_1: String = Constants.ADDRESSES[0][4] -var command_stack: Array -var state_fs = Constants.STATE.IDLE var client_fs_1: StreamPeer +var ip_fs_1: String = Constants.ADDRESSES[0][4] var peerstream_fs_1: PacketPeer +var state_fs = Constants.STATE.IDLE +var command_stack: Array + +## 2 ФС +var client_fs_2: StreamPeer +var ip_fs_2: String = Constants.ADDRESSES[0][5] +var peerstream_fs_2: PacketPeer +var state_fs_2 = Constants.STATE.IDLE +var command_stack_2: Array signal yau_status_line(_status) ## Вызывается когда меняется состояние связи с ячейкой signal yau_receive(_data_from_yau) signal yau_read_isa(_unit_isa_ports) -signal data_send() +#signal data_send() +#signal data_send_2() signal data_from_fs_1(data:PackedByteArray) signal data_from_fs_2(data:PackedByteArray) -signal port_opened(port_name: String) +signal port_fs_opened_1(port_name: String) +signal port_fs_opened_2(port_name: String) signal port_closed(port_name: String) signal port_error(error_str: String) @@ -60,24 +70,24 @@ func poll_receive_yau07(sock: Socket) -> bool: ## Приёмник return false -func poll_receive_fs(client: StreamPeerTCP): +func poll_receive_fs(client: StreamPeerTCP, peerstream: PacketPeer, ip_fs: String): client.poll() - var peer = peerstream_fs_1.get_stream_peer() + var peer = peerstream.get_stream_peer() # Проверяем, существует ли соединение if not peer: - emit_signal("port_error", ip_fs_1) + emit_signal("port_error", ip_fs) return # Проверяем состояние подключения if client.get_status() != StreamPeerTCP.STATUS_CONNECTED: - emit_signal("port_closed", ip_fs_1) + emit_signal("port_closed", ip_fs) return if peer.get_available_bytes() > 0: var rx_data: PackedByteArray rx_data.append_array(peer.get_data(peer.get_available_bytes())[1]) - #emit_signal("data_from_fs_1", rx_data) - emit_signal("data_from_fs_2", rx_data) - emit_signal("port_opened", ip_fs_1) + emit_signal("data_from_fs_1", rx_data) + #emit_signal("data_from_fs_2", rx_data) + emit_signal("port_fs_opened_1", ip_fs) if state_fs == Constants.STATE.SEND: state_fs = Constants.STATE.DONE @@ -96,7 +106,8 @@ func _ready() -> void: unit.connect('line_changed', Callable(self, 'on_line_changed')) unit.connect('command_fail', Callable(self, 'on_command_fail')) - connect_fs() + #connect_fs_1() + connect_fs_2() read_port_isa([0x106, 0x108]) @@ -106,13 +117,16 @@ func _process(delta: float) -> void: last_update_time_fs += delta if client_fs_1: - poll_receive_fs(client_fs_1) + poll_receive_fs(client_fs_1, peerstream_fs_1, ip_fs_1) + if client_fs_2: + poll_receive_fs_2(client_fs_2, peerstream_fs_2, ip_fs_2) poll_receive_yau07(soc_brodcast) poll_receive_yau07(soc_unicast) state_machine_yau07() - state_machine_fs() + #state_machine_fs() + state_machine_fs_2() match unit.process(delta): Error.OK: soc_unicast.send_to(ip_address_yau, ip_port_yau, unit.tx_data.slice(0, unit.tx_len)) @@ -169,9 +183,10 @@ func on_command_change_device(meta_device): ip_address_yau = meta_device[0] ip_port_yau = meta_device[1] ip_fs_1 = meta_device[3] - #ip_fs_2 = meta_device[4] + ip_fs_2 = meta_device[4] #ip_fs_3 = meta_device[5] - connect_fs() + #connect_fs_1() + connect_fs_2() func state_machine_fs(): @@ -180,12 +195,12 @@ func state_machine_fs(): if (state_fs == Constants.STATE.IDLE) or (state_fs == Constants.STATE.DONE): if command_stack: var pack: Array = command_stack.pop_front() - send_data(pack) + send_fs_data_1(pack) state_fs = Constants.STATE.SEND # Подключится к модулю ФС -func connect_fs(): +func connect_fs_1(): if client_fs_1: disconnect_fs(client_fs_1) @@ -199,7 +214,7 @@ func connect_fs(): # Отправить команду для ФС -func send_data(data_to_sand: PackedByteArray): +func send_fs_data_1(data_to_sand: PackedByteArray): if client_fs_1.get_status() == 2: var peer = peerstream_fs_1.get_stream_peer() if peer: @@ -213,25 +228,110 @@ func disconnect_fs(client_for_leave): state_fs = Constants.STATE.IDLE command_stack = [] - -func start_work_fs(): - unit_fs_1.start_session() - unit_fs_1.base_get_current_temp() +# +#func start_work_fs(): + #unit_fs_1.start_session() + #unit_fs_1.base_get_current_temp() +# +# +#func get_fs_gen_status(state_gen): + #unit_fs_1.set_gen_state(state_gen) + #unit_fs_1.get_gen_state() + #unit_fs_1.base_get_current_temp() +# +# +#func set_fs_ferq_carrier(freq: int): + #unit_fs_1.set_carrier(freq) + #unit_fs_1.base_get_current_temp() + #unit_fs_1.get_carrier() +# +# +#func set_fs_attenuation(attenuation: float): + #unit_fs_1.set_att_batch(attenuation) + #unit_fs_1.get_att_batch() + #unit_fs_1.base_get_current_temp() -func get_fs_gen_status(state_gen): - unit_fs_1.set_gen_state(state_gen) - unit_fs_1.get_gen_state() - unit_fs_1.base_get_current_temp() +## 2 ФС коннект +func connect_fs_2(): + if client_fs_2: + disconnect_fs_2(client_fs_2) + + client_fs_2 = StreamPeerTCP.new() + peerstream_fs_2 = PacketPeerStream.new() + var rc = client_fs_2.connect_to_host(ip_fs_2, Constants.PORT_FS) + if rc!= Error.OK: + print_debug('Port error %s' % ip_fs_2) + #emit_signal("port_error", ip_fs_2) + else: + peerstream_fs_2.set_stream_peer(client_fs_2) -func set_fs_ferq_carrier(freq: int): - unit_fs_1.set_carrier(freq) - unit_fs_1.base_get_current_temp() - unit_fs_1.get_carrier() +# Разорвать соединение с ФС +func disconnect_fs_2(client_for_leave): + client_for_leave.disconnect_from_host() + state_fs_2 = Constants.STATE.IDLE + command_stack_2 = [] + + +# Отправить команду для ФС +func send_fs_data_2(data_to_sand: PackedByteArray): + if client_fs_2.get_status() == 2: + var peer = peerstream_fs_2.get_stream_peer() + if peer: + peer.put_data(data_to_sand) + emit_signal("data_send_2") -func set_fs_attenuation(attenuation: float): - unit_fs_1.set_att_batch(attenuation) - unit_fs_1.get_att_batch() - unit_fs_1.base_get_current_temp() +func state_machine_fs_2(): + if client_fs_2: + ## State fs_2 machine + if (state_fs_2 == Constants.STATE.IDLE) or (state_fs_2 == Constants.STATE.DONE): + if command_stack_2: + var pack: Array = command_stack_2.pop_front() + send_fs_data_2(pack) + state_fs_2 = Constants.STATE.SEND + + +func poll_receive_fs_2(client: StreamPeerTCP, peerstream: PacketPeer, ip_fs: String): + client.poll() + var peer = peerstream.get_stream_peer() + # Проверяем, существует ли соединение + if not peer: + emit_signal("port_error", ip_fs) + return + # Проверяем состояние подключения + if client.get_status() != StreamPeerTCP.STATUS_CONNECTED: + emit_signal("port_closed", ip_fs) + return + + if peer.get_available_bytes() > 0: + var rx_data: PackedByteArray + rx_data.append_array(peer.get_data(peer.get_available_bytes())[1]) + emit_signal("data_from_fs_2", rx_data) + emit_signal("port_fs_opened_2", ip_fs) + if state_fs_2 == Constants.STATE.SEND: + state_fs_2 = Constants.STATE.DONE + + +func start_work_fs_2(): + unit_fs_2.start_session() + unit_fs_2.base_get_current_temp() + + +func get_fs_gen_status_2(state_gen): + unit_fs_2.set_gen_state(state_gen) + unit_fs_2.get_gen_state() + unit_fs_2.base_get_current_temp() + + +func set_fs_ferq_carrier_2(freq: int): + unit_fs_2.set_carrier(freq) + unit_fs_2.base_get_current_temp() + unit_fs_2.get_carrier() + + +func set_fs_attenuation_2(attenuation: float): + unit_fs_2.set_att_batch(attenuation) + unit_fs_2.get_att_batch() + unit_fs_2.base_get_current_temp()