#ifndef SERIALPORT_H
#define SERIALPORT_H

#include <QObject>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <qtimer.h>

#include "defines.h"
#include "protocol.h"

class SerialPort : public QObject
{
    Q_OBJECT
public:
    enum E_CMD_TYPE
    {
        e_zero,
        e_forward,
        e_back
    };

    static SerialPort *instance();
    ~SerialPort();

    void sendData(const QByteArray &data){slotSendData(data);}
    void sendCmd(const E_CMD_TYPE e);
    static void parserTest();
    bool openSp();
    bool isOpen(){return _sp->isOpen();}
    bool closeSp();
signals:
    void sigSendCommonData(const CommonData &);
    void sigSendCommonDataToRealDataForm(const CommonData &);
    void sigSendPhaseInfo(const QByteArray &);
    void sigAxisModify(const float temp);
    void sigUpdateStatusbarMsg(const QString &);
    void sigSaveExperimentalDataMsgBox();
    void sigStartExperiment();
    void sigDeviceDisconnected();
public slots:
    void slotDeliverData(const QByteArray &);
    void slotSendData(const QByteArray &);
    void slotCloseSp();
private slots:
    void slotReadData();
    void slotPortCheck();
private:
    void updateStatus(const CommonData &cd);
    void updateAxis();
    void commonDataParser(const int dataLength, const u16 addr, const CommonData &cd);
    void toHex(char *in_char, int char_length, char *out_char);
    void displayPortInfo();
private:
    SerialPort(QObject *parent = nullptr);
    QSerialPort *_sp;
    QByteArray _lastWriteBa;
    
    // port check
    QTimer* _portCheckTimer = nullptr;
};

#endif // SERIALPORT_H