91 lines
4.8 KiB
GDScript
91 lines
4.8 KiB
GDScript
extends Node
|
||
|
||
## Реализация "Протокол информационного сопряжения
|
||
## СПО АСУ изделия «МП‑550» с СПО 5П-28"
|
||
|
||
|
||
const ONLINE_TIMEOUT = 5000 ## Время ожидания пакета от 5П-28, мс
|
||
const BUFFER_SIZE = 2048 ## Размер приёмного буфера для датаграмм
|
||
|
||
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) ## Сигнал при не выполнении команды
|
||
signal parse_error(unit: TCP5P28, msg: String) ## Сигнал ошибки разбора сообщения
|
||
signal get_threats(unit: TCP5P28) ## Сигнал запрос целей
|
||
|
||
var online: = false ## Состояние связи с источником сообщений
|
||
var name: String ## Имя экземпляра
|
||
var rx_tick: = 0 ## Тик время последнего приёма, мс
|
||
var tx_data: = PackedByteArray() ## Пакет для отправки
|
||
var tx_stack: Array ## Массив пакетов для отправки
|
||
|
||
func _to_string() -> String: return String('капсрпб: "%s" %s ' % [self.name, ['отключен', 'на связи'][int(online)]])
|
||
func _init(nm): self.name = nm
|
||
|
||
func parse(data: PackedByteArray, now_tick: int):
|
||
rx_tick = now_tick
|
||
if not online:
|
||
online = true
|
||
emit_signal('line_changed', self)
|
||
var pack_type = data.decode_u8(2)
|
||
if pack_type == PACK_TYPE_CMD:
|
||
var cmd_type = data.decode_u8(8)
|
||
if cmd_type == CMD_TYPE_TH:
|
||
emit_signal('get_threats')
|
||
|
||
func process(now_tick: int):
|
||
if online and ((now_tick - rx_tick) > ONLINE_TIMEOUT):
|
||
online = false
|
||
emit_signal('line_changed', self)
|
||
if len(tx_stack):
|
||
tx_data = tx_stack[0]
|
||
tx_stack.remove_at(0)
|
||
return Error.OK
|
||
else:
|
||
return Error.ERR_UNAVAILABLE
|
||
|
||
func pack_threats(threats):
|
||
var data = PackedByteArray()
|
||
var data_len = 4 + len(threats) * 80 # длинна блока данных в байтах
|
||
var tick = Time.get_ticks_msec()
|
||
data.resize(4)
|
||
data.encode_u16(0, 0) # Код ошибки
|
||
data.encode_u16(2, len(threats)) # Количество целей
|
||
for th in threats.values():
|
||
print_debug(th)
|
||
data.append_array(get_threats_data(th, int(tick)))
|
||
|
||
func get_threats_data(th, tick):
|
||
var th_data = PackedByteArray()
|
||
th_data.resize(80) # Количество байт в массиве
|
||
th_data.encode_u64(0, tick)
|
||
print_debug(th.fflags)
|
||
var flags: int = 0 # с 0 по 7 бит рекомендованная помеха
|
||
flags |= 0 << 8 # Флаг рекомендуемой помехи
|
||
flags |= int(th.fflags['aoa']) << 9 # Флаг доставерности пеленга
|
||
flags |= int(th.fflags['alt']) << 10 # Флаг доставерности высоты
|
||
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(0) << 30 # Флаг признак назначения помехи на цель
|
||
flags |= int(0) << 31 # Флаг признак назначения опасной цель
|
||
th_data.encode_u32(8, flags) # Флаги
|
||
return th_data
|
||
|
||
func create_header(data_len):
|
||
var head_len: int = 8 # длинна заголовка в байтах
|
||
pass
|
||
|
||
|
||
|