117 lines
4.3 KiB
GDScript
117 lines
4.3 KiB
GDScript
extends Node
|
||
|
||
|
||
const PROTOCOL_TYPES: = {'yau07tx': yau07.YaU07, 'jsontx': capsrpb.CapsRpb}
|
||
|
||
|
||
class Socket extends PacketPeerUDP:
|
||
func send_to(addr, data):
|
||
self.set_dest_address(addr[0], addr[1])
|
||
self.put_packet(data)
|
||
|
||
|
||
var poll_sockets: Array[Socket]
|
||
var units: Dictionary
|
||
var sock_unicast: Socket
|
||
var sock_capsrpb: 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]
|
||
sock_capsrpb = poll_sockets[2]
|
||
|
||
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]])
|
||
|
||
var timer_interfer: = Timer.new()
|
||
add_child(timer_interfer)
|
||
timer_interfer.connect('timeout', Callable(self, 'on_timer_interfer'))
|
||
timer_interfer.start(0.3)
|
||
|
||
|
||
func on_timer_interfer():
|
||
var interfer = {}
|
||
var random = RandomNumberGenerator.new()
|
||
random.randomize()
|
||
interfer['ts'] = 6
|
||
interfer['ss'] = 0
|
||
interfer['ispp'] = random.randi_range(1, 10)
|
||
interfer['krp'] = 'pdm2'
|
||
interfer['powp'] = random.randi_range(0, 10)
|
||
interfer['kni'] = random.randi_range(0, 360)
|
||
interfer['params'] = {'freq':random.randi_range(400, 6000), 'width': 20}
|
||
interfer['get'] = []
|
||
var json = JSON.new().stringify(interfer)
|
||
var pac = json.to_utf8_buffer()
|
||
sock_capsrpb.set_dest_address(REPSettings.UnitProfiles['уарэп-капсрпб-отп'][1], REPSettings.UnitProfiles['уарэп-капсрпб-отп'][2])
|
||
sock_capsrpb.put_packet(pac)
|
||
|
||
var msg_type8 = {}
|
||
var time = Time.get_datetime_dict_from_system()
|
||
msg_type8['ts'] = 8
|
||
msg_type8['ss'] = 0
|
||
msg_type8['roll'] = 0
|
||
msg_type8['trim'] = 0
|
||
msg_type8['year'] = time['year']
|
||
msg_type8['month'] = time['month']
|
||
msg_type8['day'] = time['day']
|
||
msg_type8['hour'] = time['hour']
|
||
msg_type8['minute'] = time['minute']
|
||
msg_type8['second'] = time['second']
|
||
msg_type8['long'] = 38.4324
|
||
msg_type8['lat'] = 43.5353
|
||
msg_type8['course'] = 264
|
||
msg_type8['speed'] = 10
|
||
json = JSON.new().stringify(msg_type8)
|
||
pac = json.to_utf8_buffer()
|
||
sock_capsrpb.set_dest_address(REPSettings.UnitProfiles['уарэп-капсрпб-отп'][1], REPSettings.UnitProfiles['уарэп-капсрпб-отп'][2])
|
||
sock_capsrpb.put_packet(pac)
|
||
|
||
|
||
func poll_receive(sock: Socket, tick: int) -> 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, tick)
|
||
return false
|
||
|
||
|
||
func _process(_delta: float) -> void:
|
||
var tick = Time.get_ticks_msec()
|
||
for addr in units:
|
||
var unit = units[addr]
|
||
match unit.process(tick):
|
||
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, tick))
|