82 lines
3.1 KiB
GDScript
82 lines
3.1 KiB
GDScript
class_name spt25_unit extends Node
|
||
|
||
const ONLINE_TIMEOUT: int = 5000 ## Время ожидания данных
|
||
const REQUEST_PERIOD: int = 3000 ## Переиод запроса, мс
|
||
|
||
class SPT25 extends unit.Unit:
|
||
|
||
enum CmdCode {
|
||
START = 1, ## СВУ к МПСУ: Пуск преобразователя
|
||
STOP = 2, ## СВУ к МПСУ: Стоп преобразователя
|
||
INFO = 4, ## СВУ к МПСУ: Получить информацию о состоянии преобразователя. МПСУ к СВУ: Информация о состоянии преобразователя
|
||
}
|
||
|
||
func _to_string() -> String: return String('СПТ-25 %s %s' % [self.name, ['отключен', 'на связи'][int(online)]])
|
||
|
||
##Вычисление контрольной суммы
|
||
func sciCalcFCS(src: PackedByteArray) -> int:
|
||
var P_DIV = 0
|
||
var ln = src[0]
|
||
var FCS = ~((src[2]<<8) + src[1])
|
||
for i in range(3, ln):
|
||
var C = src[i]
|
||
for j in 8:
|
||
if C & 1:
|
||
if FCS & 1:
|
||
FCS = ((FCS >> 1) | 0x8000)^P_DIV
|
||
else:
|
||
FCS = ((FCS >> 1) | 0x8000)
|
||
else:
|
||
if FCS & 1:
|
||
FCS = (FCS >> 1) ^ P_DIV
|
||
else:
|
||
FCS = FCS >> 1
|
||
C >>= 1
|
||
for j in 16:
|
||
if FCS & 1:
|
||
FCS = (FCS >> 1) ^ P_DIV
|
||
else:
|
||
FCS = FCS >> 1
|
||
return ~FCS
|
||
|
||
func _init(nm) -> void:
|
||
self.name = nm
|
||
tx_data.resize(8)
|
||
tx_data[0] = 0x7e # Флаги синхронизации пакета
|
||
tx_data[1] = 0 # Адрес абонента, которому предназначен пакет
|
||
tx_data[2] = CmdCode.INFO # Тип пакета, КОД КОМАНДЫ - Получить информацию о состоянии преобразователя
|
||
tx_data[3] = 0 # Данные
|
||
tx_data[4] = 0 # Данные
|
||
tx_data[5] = 0 # Данные
|
||
tx_data[6] = 0 # Контрольная сумма
|
||
tx_data[7] = 0x7e # Флаги синхронизации пакета
|
||
|
||
|
||
func parse(rx_data: PackedByteArray, tick: int):
|
||
rx_tick = tick
|
||
if rx_data.size() <= 6:
|
||
emit_signal('parse_failed', self)
|
||
return
|
||
if rx_data[0] != 0x7e:
|
||
emit_signal('parse_failed', self)
|
||
return
|
||
if not (rx_data[2] in [CmdCode.START, CmdCode.STOP, CmdCode.INFO]):
|
||
emit_signal('parse_failed', self)
|
||
return
|
||
if not online:
|
||
online = true
|
||
emit_signal('line_changed', self)
|
||
emit_signal('data_received', rx_data)
|
||
|
||
|
||
func process(tick: int):
|
||
var rc: = Error.ERR_BUSY
|
||
if (tick - tx_tick) > REQUEST_PERIOD:
|
||
tx_tick = tick
|
||
rc = Error.OK
|
||
if online:
|
||
if (tick - rx_tick) > ONLINE_TIMEOUT:
|
||
online = false
|
||
emit_signal('line_changed', self)
|
||
return rc
|