46 lines
1.8 KiB
GDScript
46 lines
1.8 KiB
GDScript
class_name STC extends Node
|
||
|
||
## Реализация "Протокол информационного сопряжения.
|
||
## СПО АСУ изделия «МП‑550» с СПО «Управления КАПС РПБ».
|
||
|
||
|
||
const ONLINE_TIMEOUT = 3000 ## Время ожидания пакета от КАПС РПБ, мс.
|
||
const BUFFER_SIZE = 2048 ## Размер приёмного буфера для датаграмм.
|
||
|
||
|
||
class CapsRpb extends unit.Unit:
|
||
|
||
static var json_conv: = JSON.new() ## Аппарат для разбора сообщений.
|
||
var json_dic: Dictionary
|
||
var tick: = 0 ## Тик время последнего обновления, мс.
|
||
var tx_stack: Array ## Массив пакетов для отправки.
|
||
var source_addr: Array ## Адрес отправителя данных
|
||
|
||
func _to_string() -> String: return String('CapsRpb(\"%s\")' % self.name)
|
||
func _init(unit_name): self.name = unit_name
|
||
|
||
func parse(data: PackedByteArray, now_tick: int):
|
||
tick = now_tick
|
||
if not online:
|
||
online = true
|
||
emit_signal('line_changed', self)
|
||
var utf8_data: = data.get_string_from_utf8()
|
||
if Error.OK == json_conv.parse(utf8_data):
|
||
json_dic.merge(json_conv.get_data(), true)
|
||
emit_signal('data_received', self)
|
||
else:
|
||
var msg = json_conv.get_error_message()
|
||
emit_signal('parse_error', self, msg)
|
||
|
||
func process(now_tick: int):
|
||
if online and ((now_tick - tick) > ONLINE_TIMEOUT):
|
||
online = false
|
||
emit_signal('line_changed', self)
|
||
if len(tx_stack):
|
||
tx_data = tx_stack[0]
|
||
tx_len = len(tx_data)
|
||
tx_stack.remove_at(0)
|
||
return Error.OK
|
||
else:
|
||
return Error.ERR_BUSY
|