Рефактор. Общий список прибор теперь использует имя прибора для индекса

This commit is contained in:
sasha80
2025-08-01 13:02:13 +03:00
parent 37e552d207
commit 56df30a3ba
22 changed files with 122 additions and 122 deletions

View File

@@ -45,7 +45,7 @@ class Socket extends PacketPeerUDP:
class SocketTCP extends TCPServer:
const RX_TIMEOUT: int = 1000 ## Время сброса счётчика принятия части пакета.
var peerstream: = PacketPeerStream.new()
var unit_key: Array ## Ключ юнита.
var unit_key: StringName ## Ключ юнита.
var head_len: int = 8 ## Длина заголовка команды.
var len_place: int = 4 ## Номер начального байта с длинной блока данных.
var type_len: int = 4 ## Количество байт в размере длинны.
@@ -62,20 +62,22 @@ class SocketTCP extends TCPServer:
var poll_sockets: Array[Socket]
var tcp_sockets: Array
var units: Dictionary
var units_udp: Dictionary
var units_udprx: Dictionary
var units_tcp: Dictionary
var units_serial: Dictionary
var units_modbus: Dictionary
var units: Dictionary[StringName, unit.Unit]
var units_udp: Dictionary[StringName, unit.Unit]
var units_udprx: Dictionary[StringName, unit.Unit]
var units_tcp: Dictionary[StringName, unit.Unit]
var units_serial: Dictionary[StringName, unit.Unit]
var units_modbus: Dictionary[StringName, unit.Unit]
var serials: Dictionary # Последовательные порты
var mbcs: Dictionary # Клиенты modbus.
var dst_ports: Dictionary
var dst_ports: Dictionary[StringName, int]
var dst_addrs: Dictionary[StringName, StringName]
var unit_keys: Dictionary
var sock_unicast: Socket
var sock_capsrpb: Socket
var logger_page: Node
var send_sockets: Dictionary # Таблица <имяустройста>: <сокет> для отправки сообщений
var addr_port_to_unit_name: Dictionary[StringName, StringName]
func on_serial_data(data, unit): unit.parse(data, tick)
@@ -94,16 +96,16 @@ func create_socket(nm) -> Socket:
return sock
func create_tcpsocket(nm) -> SocketTCP:
var addr = settings.UnitProfiles[nm][1]
var port = settings.UnitProfiles[nm][2][0]
func create_tcpsocket(unit_name: StringName) -> SocketTCP:
var addr = settings.UnitProfiles[unit_name][1]
var port = settings.UnitProfiles[unit_name][2][0]
var sock = SocketTCP.new()
sock.unit_key = settings.get_unit_key(nm)
sock.unit_key = unit_name
var rc: = sock.listen(port, addr)
if rc == Error.OK:
log.message(log.INFO, '\"%s\" слушает на %s:%d' % [nm, addr, port])
log.message(log.INFO, '\"%s\" слушает на %s:%d' % [unit_name, addr, port])
else:
log.message(log.ERROR, '\"%s\" %s:%d \"%s\"' % [nm, addr, port, error_string(rc)])
log.message(log.ERROR, '\"%s\" %s:%d \"%s\"' % [unit_name, addr, port, error_string(rc)])
return sock
@@ -156,38 +158,36 @@ func _ready() -> void:
if proto in UDPRX_PROTO:
var new_unit = UDPRX_PROTO[proto].new(unit_name)
var unit_key = settings.get_unit_key(unit_name)
units[unit_key] = new_unit
units_udprx[unit_key] = new_unit
dst_ports[unit_key] = st[2][0]
units[unit_name] = new_unit
units_udprx[unit_name] = new_unit
dst_ports[unit_name] = st[2][0]
if proto in UDP_PROTO:
var new_unit = UDP_PROTO[proto].new(unit_name)
var unit_key = settings.get_unit_key(unit_name)
units[unit_key] = new_unit
units_udp[unit_key] = new_unit
dst_ports[unit_key] = st[2][1] if len(st[2]) > 1 else st[2][0]
units[unit_name] = new_unit
units_udp[unit_name] = new_unit
dst_ports[unit_name] = st[2][1] if len(st[2]) > 1 else st[2][0]
dst_addrs[unit_name] = st[1]
if proto in TCP_PROTO:
var unit_tcp = TCP_PROTO[proto].new(unit_name)
var unit_key = settings.get_unit_key(unit_name)
units_tcp[unit_key] = unit_tcp
units[unit_key] = unit_tcp
units[unit_name] = unit_tcp
units_tcp[unit_name] = unit_tcp
if proto in MODBUS_PROTO:
var unit_modbus = MODBUS_PROTO[proto].new(unit_name)
var unit_key = settings.get_unit_key(unit_name)
units_modbus[unit_key] = unit_modbus
units[unit_key] = unit_modbus
unit_modbus.port = settings.UnitProfiles[unit_name][1] # TODO: убрать это отсюда (обращение к глобальным данным из экземпляра)
unit_modbus.params = settings.UnitProfiles[unit_name][2] # TODO: убрать это отсюда (обращение к глобальным данным из экземпляра)
units[unit_name] = unit_modbus
units_modbus[unit_name] = unit_modbus
bind_modbuses.append([unit_modbus, unit_name])
if proto in SERIAL_PROTO:
var unit_serial = SERIAL_PROTO[proto].new(unit_name)
var unit_key = settings.get_unit_key(unit_name)
var serial = create_serial(unit_name)
units_serial[unit_key] = unit_serial
units[unit_key] = unit_serial
serials[unit_key] = serial
units_serial[unit_name] = unit_serial
units[unit_name] = unit_serial
serials[unit_name] = serial
ProjectSettings.connect('settings_changed', Callable(self, '_on_settings_changed_serial').bind(bind_serials))
@@ -200,6 +200,12 @@ func _ready() -> void:
u.connect('line_changed', Callable(logger_page, 'on_line_changed').bind(key))
u.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(key))
for key in settings.UnitProfiles:
var item = settings.UnitProfiles[key]
var addr_port: = StringName('%s:%d' % [item[1], item[2][0]])
addr_port_to_unit_name[addr_port] = StringName(key)
pass
func _on_settings_changed_modbus(bind_modbuses: Array):
var external_ctl = ProjectSettings.get_setting('application/config/Внешнее управление', false)
@@ -228,9 +234,10 @@ func poll_receive_udp(sock: Socket) -> bool:
var data: = sock.get_packet()
var addr: = sock.get_packet_ip()
var port: = sock.get_packet_port()
var addr_port: = [addr, port]
if units.has(addr_port):
units[addr_port].parse(data, tick)
var addr_port: = StringName('%s:%d' % [addr, port])
if addr_port_to_unit_name.has(addr_port):
var unit_name: = addr_port_to_unit_name[addr_port]
units[unit_name].parse(data, tick)
continue
if unit_keys.has(port):
var key1 = unit_keys[port]
@@ -238,7 +245,7 @@ func poll_receive_udp(sock: Socket) -> bool:
units[key1].parse(data, tick)
continue
port = sock.get_local_port()
var key = ['*', port]
var key = StringName('%s:%d' % ['*', port])
if units.has(key):
var unit_udprx = units[key]
unit_udprx.source_addr = [addr, port]
@@ -301,9 +308,10 @@ func _process(_delta: float) -> void:
var unit_udp = units_udp[key]
if Error.OK == unit_udp.process(tick):
var sock = send_sockets[unit_udp.name]
var dst_port = dst_ports[key]
var tx_data = unit_udp.tx_data.slice(0, unit_udp.tx_len)
sock.send_to([key[0], dst_port], tx_data)
var dst_port = dst_ports[key]
var dst_addr = dst_addrs[key]
sock.send_to([dst_addr, dst_port], tx_data)
for key in units_udprx:
var unit_udprx = units_udprx[key]
unit_udprx.process(tick)
@@ -322,3 +330,8 @@ func _process(_delta: float) -> void:
sock.send_to(unit_tcp.tx_data)
poll_receive_tcp(sock)
poll_sockets.any(poll_receive_udp)
func get_unit_instance(unit_name: StringName) -> unit.Unit:
tools.allways(unit_name in units, 'нет такого устройства: \"%s\"' % unit_name)
return units[unit_name]