diff --git a/scripts/repnetwork.gd b/scripts/repnetwork.gd index b8777f3..c6bad64 100644 --- a/scripts/repnetwork.gd +++ b/scripts/repnetwork.gd @@ -11,9 +11,6 @@ class Socket extends PacketPeerUDP: class SocketTCP extends TCPServer: - func send_to(): - pass - const RX_TIMEOUT: int = 1000 # Время сброса счётчика принятия части пакета var peerstream: = PacketPeerStream.new() var unit_key: Array # Клюс юнита @@ -26,9 +23,13 @@ class SocketTCP extends TCPServer: var rx_data: PackedByteArray # Принятые данные var data_len: int # Размер ожидаемых данных + func send_to(data): + var peer = peerstream.get_stream_peer() + peer.put_data(data) + var poll_sockets: Array[Socket] -var tcp_sockets: Array[SocketTCP] +var tcp_sockets: Array var units: Dictionary var units_tcp: Dictionary var sock_unicast: Socket @@ -64,9 +65,6 @@ func _ready() -> void: poll_sockets.append(create_socket('уарэп-яу07-частный')) poll_sockets.append(create_socket('уарэп-яу07-общий')) poll_sockets.append(create_socket('уарэп-капсрпб-пол')) - - tcp_sockets.append(create_tcpsocket('уарэп-5п28')) - sock_unicast = poll_sockets[0] sock_capsrpb = poll_sockets[2] @@ -88,7 +86,9 @@ func _ready() -> void: if logger_page: 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)) - + + tcp_sockets.append([create_tcpsocket('уарэп-5п28'), units_tcp[repsettings.get_unit_key('уарэп-5п28')]]) + for key in units: log.info('%s %s:%d' % [units[key].name, key[0], key[1]]) for key in units_tcp: log.info('%s %s:%d' % [units_tcp[key].name, key[0], key[1]]) @@ -155,9 +155,11 @@ func _process(_delta: float) -> void: match unit.process(tick): Error.OK: sock_unicast.send_to(addr, unit.tx_data) Error.FAILED: emit_signal('socket_error', 'ошибка: %s %s:%d' % [unit, addr[0], addr[1]]) - for addr in units_tcp: - var unit = units_tcp[addr] + for sock_unit in tcp_sockets: + var sock = sock_unit[0] + var unit = sock_unit[1] match unit.process(tick): - Error.OK: unit.send_to(addr, unit.tx_data) + Error.OK: sock.send_to(unit.tx_data) + Error.FAILED: emit_signal('socket_error', 'ошибка: %s' %unit) + poll_receive_tcp(sock, tick) poll_sockets.any(func(sock): poll_receive(sock, tick)) - tcp_sockets.any(func(sock): poll_receive_tcp(sock, tick)) diff --git a/scripts/tcp5p28.gd b/scripts/tcp5p28.gd index 689a5ef..3d889bb 100644 --- a/scripts/tcp5p28.gd +++ b/scripts/tcp5p28.gd @@ -7,13 +7,32 @@ extends Node const ONLINE_TIMEOUT = 5000 ## Время ожидания пакета от 5П-28, мс const BUFFER_SIZE = 2048 ## Размер приёмного буфера для датаграмм +## Тип модуляции для запаковки в пакет для 5П-28 +const MOD_TYPES: Array = ['', + 'am', + 'ook', + 'ask', + 'fm', + 'qpsk', + 'oqpsk', + 'pi4qpsk', + 'qam16', + 'qam32', + 'qam64', + 'qam128', + 'qam256', + 'qam512', + 'cpfsk', + 'psk', + 'ofdm',] + class TCP5P28: const PACK_TYPE_CMD: int = 1 const PACK_TYPE_RES: int = 2 const CMD_TYPE_STATE: int = 1 const CMD_TYPE_TH: int = 2 const CMD_TYPE_IN: int = 3 - + signal line_changed(unit: TCP5P28) ## Сигнал состояние связи изменилось signal data_received(unit: TCP5P28) ## Сигнал данные приняты signal command_fail(unit: TCP5P28) ## Сигнал при не выполнении команды @@ -50,7 +69,7 @@ class TCP5P28: return Error.OK else: return Error.ERR_UNAVAILABLE - + func pack_threats(threats): var data = PackedByteArray() var data_len = 4 + len(threats) * 80 # длинна блока данных в байтах @@ -60,7 +79,19 @@ class TCP5P28: data.encode_u16(2, len(threats)) # Количество целей for th in threats.values(): data.append_array(get_threats_data(th, int(tick))) + var data_to_send: PackedByteArray = create_header(data_len) + data_to_send.append_array(data) + tx_stack.append(data_to_send) + func create_header(data_len): + var head_data = PackedByteArray() + head_data.resize(8) # Размер заголовка + head_data.encode_u16(0, 0) # Код ошибки + head_data.encode_u8(2, 2) # Тип пакета, ответ на запрос + head_data.encode_u8(3, 5) # Версия протокола, всегда 5 + head_data.encode_u32(4, data_len) # Длинна пакета данных + return head_data + func get_threats_data(th, tick): var th_data = PackedByteArray() th_data.resize(80) # Количество байт в массиве @@ -72,17 +103,34 @@ class TCP5P28: flags |= int(th.fflags['power']) << 11 # Флаг доставерности мощности flags |= int(th.fflags['baud']) << 12 # Флаг доставерности ск. мод. flags |= int(th.fflags['slon']) << 13 # Флаг доставерности долготы ст. позиции - flags |= int(th.fflags['slat']) << 14 # Флаг доставерности широты ст. позиции - flags |= int(th.fflags['lat']) << 15 # Флаг доставерности долготы - flags |= int(th.fflags['lot']) << 16 # Флаг доставерности широты + flags |= int(th.fflags['slat']) << 14 # Флаг доставерности широты ст. позиции + flags |= int(th.fflags['lon']) << 15 # Флаг доставерности долготы + flags |= int(th.fflags['lat']) << 16 # Флаг доставерности широты flags |= int(0) << 30 # Флаг признак назначения помехи на цель flags |= int(0) << 31 # Флаг признак назначения опасной цель th_data.encode_u32(8, flags) # Флаги + th_data.encode_u16(12, th.id) # Идентификатор объекта + th_data.encode_u16(14, int(round(th.aoa/0.1))) # Пеленг объекта + th_data.encode_u16(16, int(th.alt)) # Высота объекта + th_data.encode_u16(18, int(th.freq)) # Частота объекта + th_data.encode_u16(20, int(th.width)) # Ширина частотной полосы объекта + th_data.encode_u8(22, int(th.power)) # Мощность излучения объекта + var mod = MOD_TYPES.find(th.tmod) + if mod == -1: mod = 0 + th_data.encode_u8(23, int(mod)) # Тип модуляции + th_data.encode_u32(24, int(th.baud)) # Скорость модуляции, бод + to_cp866(th.proto, th_data) + var c1 = pow(2, 30) / 180.0 + th_data.encode_s32(64, int(th.slon * c1)) + th_data.encode_s32(68, int(th.slat * c1)) + th_data.encode_s32(72, int(th.lon * c1)) + th_data.encode_s32(76, int(th.lat * c1)) return th_data + + func to_cp866(proto: String, th_data): + var cp866_proto: PackedByteArray = proto.to_ascii_buffer() + cp866_proto.resize(36) + for i in len(cp866_proto): + th_data[28 + i] = cp866_proto[i] - func create_header(data_len): - var head_len: int = 8 # длинна заголовка в байтах - pass - - - +