Merge remote-tracking branch 'MaD_CaT/master' into master_merge_madcat

# Conflicts:
#	scripts/repnetwork.gd
#	scripts/tcp5p28.gd
This commit is contained in:
sasha80
2024-04-22 10:50:59 +03:00
2 changed files with 73 additions and 23 deletions

View File

@@ -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))

View File

@@ -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