#ifndef MKS42C_H
#define MKS42C_H

#include <Arduino.h>

class MKS42C {
public:
    /**
     * @brief Конструктор
     * @param serial Ссылка на HardwareSerial (например, Serial2)
     * @param address Адрес мотора (по умолчанию 0xE0)
     */
    MKS42C(HardwareSerial& serial, uint8_t address = 0xE0);

    // --- Управление питанием ---
    void setEnable(bool state); // Включить/выключить удержание вала

    // --- Движение ---
    /**
     * @brief Непрерывное вращение (Команда 0xF6)
     * @param dir Направление: 0 - CW (по часовой), 1 - CCW (против)
     * @param speed Скорость (0-127)
     */
    void run(uint8_t dir, uint8_t speed);


    /**
     * @brief Непрерывное вращение
     * @param speed Скорость от -127 до 127 (минус меняет направление)
     */
    void run(int16_t speed);

    /**
     * @brief Поворот на заданный угол (Команда 0xFD)
     * @param degrees Угол в градусах (положительный - CW, отрицательный - CCW)
     * @param speed Скорость (0-127)
     */
    void rotateDegrees(float degrees, uint8_t speed);

    /**
     * @brief Мгновенная остановка (Команда 0xF7)
     */
    void stop();

    // --- Чтение данных (Команда 0x30) ---
    /**
     * @brief Чтение текущего угла в пределах одного круга
     * @return Угол от 0.0 до 359.99 или -1.0 при ошибке
     */
    float readPosition();

    /**
     * @brief Чтение абсолютной позиции (с учетом оборотов)
     * @return Общее количество импульсов (1 оборот = 65536 единиц энкодера)
     */
    long readAbsolutePosition();

    /**
     * @brief Проверка, движется ли мотор в данный момент
     * @return true если занят, false если остановился
     */
    bool isBusy();

private:
    HardwareSerial* _serial;
    uint8_t _addr;
    long _lastAbsPos = 0;
    unsigned long _lastMoveTime = 0;
    bool _isMoving;

    // Вспомогательные функции
    uint8_t calculateCRC(uint8_t* data, uint8_t len);
    void sendRaw(uint8_t* data, uint8_t len);
    void clearBuffer();
};

#endif