Files
uarep-ctl/scripts/spt25.gd
sasha80 0fb6610b68 Merge remote-tracking branch 'origin/master-prd'
# Conflicts:
#	scenes/контроль/контроль.tscn
2025-09-02 14:32:37 +03:00

79 lines
2.9 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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(5)
tx_data[0] = 0 # Адрес абонента, которому предназначен пакет
tx_data[1] = CmdCode.INFO # Тип пакета, КОД КОМАНДЫ - Получить информацию о состоянии преобразователя
tx_data[2] = 0 # Данные
tx_data[3] = 0 # Данные
tx_data[4] = 0 # Данные
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