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