From 8763741c07c773d86c40d76565211f5389afa86f Mon Sep 17 00:00:00 2001 From: sasha80 Date: Wed, 30 Oct 2024 14:37:55 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0.=20=D0=9E=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D0=BE=D1=81=D1=82=D0=BE=D1=8F?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=A1=D0=9F=D0=A2-25=20=D0=B2=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B6=D0=B8=D0=BC=D0=B5=20=D0=9A=D0=BE=D0=BD=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scenes/pribor-uyep/block-output.tscn | 2 +- scenes/pribor-uyep/spt25-view.gd | 22 ++++++++++++++++++---- scripts/network.gd | 20 ++++++++++++-------- scripts/spt25.gd | 25 ++++++++++++++++++------- scripts/unit.gd | 2 +- 5 files changed, 50 insertions(+), 21 deletions(-) diff --git a/scenes/pribor-uyep/block-output.tscn b/scenes/pribor-uyep/block-output.tscn index 27574141..04f97e50 100644 --- a/scenes/pribor-uyep/block-output.tscn +++ b/scenes/pribor-uyep/block-output.tscn @@ -43,7 +43,7 @@ signal pressed(control: PanelContainer) @export var state2: int: set(v): - state1 = tools.clip_value(v, 0, textures.size() - 1) + state2 = tools.clip_value(v, 0, textures.size() - 1) $margin/vbox/table/state2.texture = textures[v] diff --git a/scenes/pribor-uyep/spt25-view.gd b/scenes/pribor-uyep/spt25-view.gd index 1eb2b76f..f596df70 100644 --- a/scenes/pribor-uyep/spt25-view.gd +++ b/scenes/pribor-uyep/spt25-view.gd @@ -16,7 +16,21 @@ func _enter_tree() -> void: if Engine.is_editor_hint(): return var unit_key = repsettings.get_unit_key(unit_name) var unit = repnetwork.units[unit_key] - unit.connect('data_received', on_data_received.bind(unit)) + unit.connect('data_received', on_data_received) + unit.connect('line_changed', on_line_changed) + + +func on_line_changed(unit): + if not unit.online: + $block_output.state0 = STATE_VAL.NONE + $block_output.state1 = STATE_VAL.NONE + $block_output.state2 = STATE_VAL.NONE + $block_input1.state0 = STATE_VAL.NONE + $block_input2.state0 = STATE_VAL.NONE + $block_input1.state1 = STATE_VAL.NONE + $block_input2.state1 = STATE_VAL.NONE + $block_input1.state2 = STATE_VAL.NONE + $block_input2.state2 = STATE_VAL.NONE func _exit_tree() -> void: @@ -26,9 +40,9 @@ func _exit_tree() -> void: unit.disconnect('data_received', on_data_received) -func on_data_received(data, unit): - # Неисправность, напряжение на выходе меньше номинального - $block_output.state0 = STATE_VAL.GOOD if (data[4] & (1 << 0)) == 0 else STATE_VAL.ERROR +func on_data_received(data): + # Неисправность, напряжение меньше номинального, напряжение выше номинального + $block_output.state0 = STATE_VAL.GOOD if ((data[4] & (1 << 0)) == 0) and ((data[4] & (1 << 7)) == 0) and ((data[5] & (1 << 2)) == 0) else STATE_VAL.ERROR # Перегрузка и короткое замыкание по выходу $block_output.state1 = STATE_VAL.GOOD if ((data[5] & (1 << 0)) == 0) and ((data[5] & (1 << 1)) == 0) else STATE_VAL.ERROR # Критическая температура diff --git a/scripts/network.gd b/scripts/network.gd index f7b9559b..22eff7d4 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -5,6 +5,7 @@ const PROTOCOL_TYPES: = {'yau07tx': yau07.YaU07, 'json-capsrpb': capsrpb.CapsRpb const TCP_PROTO: = {'5p28': tcp5p28.TCP5P28} const SERIAL_PROTO: = {'uart': spt25.SPT25 } +var tick: int = 0 class Serial extends SerialPort: func send_to(data: PackedByteArray): return write_raw(data) @@ -58,6 +59,9 @@ var sock_capsrpb: Socket var logger_page: Node +func on_serial_data(data, unit): unit.parse(data, tick) + + func create_socket(nm) -> Socket: var addr = repsettings.UnitProfiles[nm][1] var port = repsettings.UnitProfiles[nm][2][0] @@ -134,7 +138,7 @@ func _ready() -> void: units_serial[unit_key] = unit units[unit_key] = unit serials[unit_key] = serial - var rc = serial.try_open(unit.parse) + var rc = serial.try_open(on_serial_data.bind(unit)) if rc != Error.OK: log.message(log.ERROR, 'Невозможно открыть %s для \"%s\"' % [serial, unit_name]) else: @@ -147,7 +151,7 @@ func _ready() -> void: for key in dst_ports: unit_keys[dst_ports[key]] = key -func poll_receive(sock: Socket, tick: int) -> bool: +func poll_receive(sock: Socket) -> bool: while sock.get_available_packet_count() > 0: var data: = sock.get_packet() var addr: = sock.get_packet_ip() @@ -161,7 +165,7 @@ func poll_receive(sock: Socket, tick: int) -> bool: return false -func poll_receive_tcp(sock: SocketTCP, tick: int) -> bool: +func poll_receive_tcp(sock: SocketTCP) -> bool: if sock.is_connection_available(): # check if someone's trying to connect var client = sock.take_connection() # accept connection sock.peerstream.set_stream_peer(client) # bind peerstream to new client @@ -169,12 +173,12 @@ func poll_receive_tcp(sock: SocketTCP, tick: int) -> bool: if peer: var peer_len_data = peer.get_available_bytes() if peer_len_data > 0: - get_client_data(sock, peer_len_data, peer, tick) + get_client_data(sock, peer_len_data, peer) if sock.unit_key in units_tcp and sock.rx_all: units_tcp[sock.unit_key].parse(sock.rx_data, tick) return false -func get_client_data(sock: SocketTCP, peer_len_data, peer, tick): +func get_client_data(sock: SocketTCP, peer_len_data, peer): if tick - sock.rx_tick > sock.RX_TIMEOUT: sock.rx_all = true sock.rx_tick = tick @@ -207,7 +211,7 @@ func get_tcp_data(sock: SocketTCP, peer, len_rx): func _process(_delta: float) -> void: - var tick = Time.get_ticks_msec() + tick = Time.get_ticks_msec() for addr in units_udp: var unit = units[addr] match unit.process(tick): @@ -225,5 +229,5 @@ func _process(_delta: float) -> void: match unit.process(tick): Error.OK: sock.send_to(unit.tx_data) Error.FAILED: emit_signal('socket_error', 'ошибка: %s' % unit) - poll_receive_tcp(sock, tick) - poll_sockets.any(func(sock): poll_receive(sock, tick)) + poll_receive_tcp(sock) + poll_sockets.any(func(sock): poll_receive(sock)) diff --git a/scripts/spt25.gd b/scripts/spt25.gd index 49baec16..9b73db41 100644 --- a/scripts/spt25.gd +++ b/scripts/spt25.gd @@ -1,11 +1,14 @@ class_name spt25_unit extends Node +const ONLINE_TIMEOUT: int = 5000 ## Время ожидания данных +const REQUEST_PERIOD: int = 3000 ## Переиод запроса, мс class SPT25 extends unit.Unit: var tx_tick: int = 0 - var req_period = 3000.0 ## Переиод запроса, мс - func _to_string() -> String: return String('СПТ-25: %s %s' % [self.name, ['отключен', 'на связи'][int(online)]]) + var rx_tick: int = 0 + var req_period = REQUEST_PERIOD + func _to_string() -> String: return String('СПТ-25 %s %s' % [self.name, ['отключен', 'на связи'][int(online)]]) func _init(nm) -> void: self.name = nm @@ -19,14 +22,22 @@ class SPT25 extends unit.Unit: tx_data[6] = 0 # Контрольная сумма tx_data[7] = 0x7e # Флаги синхронизации пакета - func parse(rx_data: PackedByteArray): - if not self.online: - self.online = true + + func parse(rx_data: PackedByteArray, tick: int): + rx_tick = tick + if not online: + online = true emit_signal('line_changed', self) emit_signal('data_received', rx_data) + func process(tick: int): + var rc: = Error.ERR_BUSY if (tick - tx_tick) > req_period: tx_tick = tick - return Error.OK - return Error.ERR_BUSY + rc = Error.OK + if online: + if (tick - rx_tick) > ONLINE_TIMEOUT: + online = false + emit_signal('line_changed', self) + return rc diff --git a/scripts/unit.gd b/scripts/unit.gd index 921748eb..03fadf2a 100644 --- a/scripts/unit.gd +++ b/scripts/unit.gd @@ -6,7 +6,7 @@ class Unit: signal command_done(unit) ## Вызывается после выполнения команды. signal command_fail(unit) ## Вызывается если возникла ошибка при выполнении команды и команда не выполнена. signal parse_failed(unit) ## Вызывается при обнаружении ошибки во входных данных - signal data_received(unit) ## Вызывается по приёму данных + signal data_received(data: PackedByteArray) ## Вызывается по приёму данных var tx_data: = PackedByteArray() ## Буфер отправленный. var tx_len = 0 ## Длина последнего отправленного пакета.