Доработка. Переподключение к UART-порту

This commit is contained in:
sasha80
2025-10-15 16:43:09 +03:00
parent 6eaa6fe092
commit 9b0ca3a729

View File

@@ -21,13 +21,14 @@ class SocketSerial extends SerialPort:
'E': SerialPort.PARITY_EVEN,
'O': SerialPort.PARITY_ODD }
static var tick: int
var unit_instance: unit.Unit
func on_serial_data(data: PackedByteArray, unit_instance: unit.Unit):
func on_serial_data(data: PackedByteArray):
unit_instance.parse(data, tick)
func on_settings_changed(unit_instance: unit.Unit):
func on_settings_changed():
try_close()
var rc = try_open(on_serial_data.bind(unit_instance))
var rc = try_open()
if rc != Error.OK:
log.message(log.ERROR, 'невозможно открыть %s для \"%s\"' % [self, unit_instance.name])
else:
@@ -51,14 +52,14 @@ class SocketSerial extends SerialPort:
func send_to(data: PackedByteArray):
if not is_open():
ProjectSettings.emit_signal('settings_changed')
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(): # TODO: Не совсем адекватное, но работает
ProjectSettings.emit_signal('settings_changed')
if sz != tx_tula.size():
try_open()
func _to_string() -> String: return 'последовательный порт \"%s\" @ %d (%s)' % [self.port, self.baudrate, 'открыт' if is_open() else 'закрыт']
@@ -79,12 +80,12 @@ class SocketSerial extends SerialPort:
fcs = (fcs >> 1) ^ P_DIV if fcs & 1 else fcs >> 1
return (~fcs) & 0xffff
func try_open(parsing_proc: Callable) -> Error:
func try_open() -> Error:
if is_open():
return Error.OK
var rc: = open(port)
if rc == Error.OK:
data_received.connect(parsing_proc)
data_received.connect(on_serial_data)
start_monitoring(timeout)
return rc
@@ -191,8 +192,8 @@ func create_socket_tcp(unit_name: StringName) -> SocketTCP:
## [param unit_name] - Уникальное имя устройства[br]
func create_serial(unit_name: StringName) -> SocketSerial:
var st = settings.UnitProfiles[unit_name][1]
func create_serial(unit_instance: unit.Unit) -> SocketSerial:
var st = settings.UnitProfiles[unit_instance.name][1]
var serial: = SocketSerial.new()
serial.port = st[0]
serial.baudrate = st[2]
@@ -200,6 +201,7 @@ func create_serial(unit_name: StringName) -> SocketSerial:
serial.timeout = 20000
serial.bytesize = st[4]
serial.stopbits = st[5]
serial.unit_instance = unit_instance
return serial
@@ -283,9 +285,9 @@ func _ready() -> void:
if proto in SERIAL_PROTO:
var unit_instance = SERIAL_PROTO[proto].new(unit_name)
var serial: = create_serial(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.bind(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