Работа в процессе. Отображение на связи в журнале, приём сообщений json и яу-07
This commit is contained in:
@@ -1,36 +1,69 @@
|
||||
extends Node
|
||||
|
||||
|
||||
var sock_unicast: PacketPeerUDP
|
||||
var sock_broadcast: PacketPeerUDP
|
||||
var units_yau07: Dictionary
|
||||
class Socket extends PacketPeerUDP:
|
||||
func send_to(addr, data):
|
||||
self.set_dest_address(addr[0], addr[1])
|
||||
self.put_packet(data)
|
||||
|
||||
|
||||
const PROTO_TYPE: = {'yau07tx': yau07.YaU07, 'jsontx': capsrpb.CapsRpb}
|
||||
var poll_sockets: Array[Socket]
|
||||
var units: Dictionary
|
||||
var sock_unicast: Socket
|
||||
var logger_page: Node
|
||||
|
||||
|
||||
func create_socket(nm) -> Socket:
|
||||
var addr = REPSettings.addr[nm][1]
|
||||
var port = REPSettings.addr[nm][2]
|
||||
var broad = REPSettings.addr[nm][3]
|
||||
var bind = REPSettings.addr[nm][4]
|
||||
var sock: = Socket.new()
|
||||
sock.set_broadcast_enabled(broad)
|
||||
var rc = Error.OK if not bind else sock.bind(port, addr)
|
||||
var errlevel = Log.INFO if rc == Error.OK else Log.ERROR
|
||||
Log.message(errlevel, '%s: сокет:%s:%d привязанный:%s %s' % [nm, addr, port, ['нет', 'да'][int(bind)], error_string(rc)])
|
||||
return sock
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
var addr = REPSettings.addr['уарэп-яу07-частный'][1]
|
||||
var port = REPSettings.addr['уарэп-яу07-частный'][2]
|
||||
sock_unicast = PacketPeerUDP.new()
|
||||
sock_unicast.bind(port, addr)
|
||||
Log.info('Сетевой модуль готов')
|
||||
poll_sockets.append(create_socket('уарэп-яу07-частный'))
|
||||
poll_sockets.append(create_socket('уарэп-яу07-общий'))
|
||||
poll_sockets.append(create_socket('уарэп-капсрпб-пол'))
|
||||
|
||||
sock_unicast = poll_sockets[0]
|
||||
|
||||
for key in REPSettings.addr:
|
||||
var prof = REPSettings.addr[key]
|
||||
if prof[0] == 'yau07':
|
||||
addr = REPSettings.addr[key][1]
|
||||
port = REPSettings.addr[key][2]
|
||||
var unit = yau07.YaU07.new([addr, port])
|
||||
var addr_port: String = '%s:%d' % [addr, port]
|
||||
units_yau07[addr_port] = unit
|
||||
Log.info('ЯУ-07: %s' % unit)
|
||||
var setting = REPSettings.addr[key]
|
||||
var proto = setting[0]
|
||||
if proto in PROTO_TYPE:
|
||||
var unit = PROTO_TYPE[proto].new(key)
|
||||
var addr = Array([setting[1], setting[2]])
|
||||
units[addr] = unit
|
||||
unit.connect('line_changed', Callable(logger_page, 'on_line_changed').bind(addr))
|
||||
unit.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(addr))
|
||||
|
||||
for addr in units:
|
||||
var unit = units[addr]
|
||||
Log.info('%s %s:%d' % [unit.name, addr[0], addr[1]])
|
||||
|
||||
|
||||
func poll_receive(sock: Socket):
|
||||
while sock.get_available_packet_count() > 0:
|
||||
var data: = sock.get_packet()
|
||||
var addr: = sock.get_packet_ip()
|
||||
var port: = sock.get_packet_port()
|
||||
var addr_port: = [addr, port]
|
||||
if addr_port in units: units[addr_port].parse(data)
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
for unit in units_yau07.values() as Array[yau07.YaU07]:
|
||||
unit.process(delta, sock_unicast)
|
||||
|
||||
while sock_unicast.get_available_packet_count() > 0:
|
||||
var data = sock_unicast.get_packet()
|
||||
var addr = sock_unicast.get_packet_ip()
|
||||
var port = sock_unicast.get_packet_port()
|
||||
var addr_port: String = '%s:%d' % [addr, port]
|
||||
if addr_port in units_yau07:
|
||||
var unit: yau07.YaU07 = units_yau07[addr_port]
|
||||
unit.parse(data)
|
||||
for addr in units:
|
||||
var unit = units[addr]
|
||||
match unit.process(delta):
|
||||
Error.OK: sock_unicast.send_to(addr, unit.data_tx)
|
||||
Error.FAILED: emit_signal('socket_error', 'ошибка: %s %s:%d' % [unit, addr[0], addr[1]])
|
||||
for sock in poll_sockets:
|
||||
poll_receive(sock)
|
||||
|
||||
Reference in New Issue
Block a user