Files
uarep-ctl/scripts/repnetwork.gd

68 lines
2.5 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

extends Node
class Socket extends PacketPeerUDP:
func send_to(addr, data):
self.set_dest_address(addr[0], addr[1])
self.put_packet(data)
const PROTOCOL_TYPES: = {'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.UnitProfiles[nm][1]
var port = REPSettings.UnitProfiles[nm][2]
var broad = REPSettings.UnitProfiles[nm][3]
var bind = REPSettings.UnitProfiles[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:
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 unit_name in REPSettings.UnitProfiles:
var setting = REPSettings.UnitProfiles[unit_name]
var proto = setting[0]
if proto in PROTOCOL_TYPES:
var unit = PROTOCOL_TYPES[proto].new(unit_name)
var unit_key = REPSettings.get_unit_key(unit_name)
units[unit_key] = unit
unit.connect('line_changed', Callable(logger_page, 'on_line_changed').bind(unit_key))
unit.connect('command_fail', Callable(logger_page, 'on_command_fail').bind(unit_key))
for key in units: Log.info('%s %s:%d' % [units[key].name, key[0], key[1]])
func poll_receive(sock: Socket) -> bool:
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)
return false
func _process(delta: float) -> void:
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]])
poll_sockets.any(func(sock): poll_receive(sock))