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
