From 7e1258db85af39660303e8c0b28fc1c35664b984 Mon Sep 17 00:00:00 2001 From: sasha80 Date: Mon, 3 Nov 2025 23:11:19 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5.=20=D0=A1=D0=BB=D0=B8=D1=88=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=20=D0=BC=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=81=D0=BE?= =?UTF-8?q?=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=BE=D0=B1=20?= =?UTF-8?q?=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B5=20=D0=BF=D0=BE=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=D0=B4=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D0=BF=D0=BE=D1=80=D1=82=D0=B0,=20=D0=B5?= =?UTF-8?q?=D1=81=D0=BB=D0=B8=20=D0=BE=D0=BD=20=D0=BD=D0=B5=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/network.gd | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/scripts/network.gd b/scripts/network.gd index a380db4..dd0d31b 100644 --- a/scripts/network.gd +++ b/scripts/network.gd @@ -22,18 +22,20 @@ class SocketSerial extends SerialPort: 'O': SerialPort.PARITY_ODD } static var tick: int var unit_instance: unit.Unit + var failed: = {} + + func _init(): + connect('got_error', on_serial_got_error) + + func on_serial_got_error(where: String, what: String): + if where not in failed: + push_error([where, what, unit_instance]) + failed[where] = what func on_serial_data(data: PackedByteArray): + failed.clear() unit_instance.parse(data, tick) - func on_settings_changed(): - try_close() - var rc = try_open() - if rc != Error.OK: - log.message(log.ERROR, 'невозможно открыть %s для \"%s\"' % [self, unit_instance.name]) - else: - log.message(log.INFO, '%s для \"%s\"' % [self, unit_instance.name]) - func format_buffer(data: PackedByteArray): var buffer: PackedByteArray buffer.resize(64) @@ -52,14 +54,14 @@ class SocketSerial extends SerialPort: func send_to(_data: PackedByteArray): if not is_open(): - try_open() + call_deferred('try_open') return # var buffer = format_buffer(data) # Не проверено, но должно работать # Эта последовательность для запроса состояния, получена от разработчиков СПТ-25 const tx_tula: = [0x7e, 0x01, 0x04, 0xbb, 0x50, 0x7e] var sz = write_raw(tx_tula) if sz != tx_tula.size(): - try_open() + call_deferred('try_close') func _to_string() -> String: return 'последовательный порт \"%s\" @ %d (%s)' % [self.port, self.baudrate, 'открыт' if is_open() else 'закрыт'] @@ -144,6 +146,15 @@ var send_sockets: Dictionary[StringName, SocketUDP] ## Таблица <имя var addr_port_to_unit_name: Dictionary[StringName, StringName] ## Преобразование адрес:порт в имя устройства +func on_settings_changed(serial: SocketSerial): + serial.try_close() + var rc = serial.try_open() + if rc != Error.OK: + log.message(log.ERROR, 'невозможно открыть %s для \"%s\"' % [serial.port, serial.unit_instance.name]) + else: + log.message(log.INFO, 'открыт %s для \"%s\"' % [serial.port, serial.unit_instance.name]) + + ## [param unit_name] - Уникальное имя устройства[br] func create_socket_udp(unit_name: StringName) -> SocketUDP: var st = settings.UnitProfiles[unit_name][1] @@ -202,13 +213,10 @@ func create_serial(unit_instance: unit.Unit) -> SocketSerial: serial.bytesize = st[4] serial.stopbits = st[5] serial.unit_instance = unit_instance + ProjectSettings.connect('settings_changed', func(): on_settings_changed(serial)) return serial -func on_serial_got_error(where: String, what: String, serial: SocketSerial, unit_instance: unit.Unit): - push_error([where, what, serial]) - - ## [param unit_name] - Уникальное имя устройства[br] func create_modbus(unit_name: StringName) -> sch_3.Sch3: var unit_modbus: = sch_3.Sch3.new(unit_name) @@ -286,8 +294,6 @@ func _ready() -> void: if proto in SERIAL_PROTO: var unit_instance = SERIAL_PROTO[proto].new(unit_name) var serial: = create_serial(unit_instance) - serial.connect('got_error', on_serial_got_error.bind(serial, unit_instance)) - ProjectSettings.connect('settings_changed', serial.on_settings_changed) units_serial[unit_name] = unit_instance units[unit_name] = unit_instance serials[unit_name] = serial