#ifndef FESCONTROLDIALOG_H
#define FESCONTROLDIALOG_H
#include "dataformate.h"
#include <QDialog>
#include <QSerialPort>
#include <QListWidgetItem>
class BLEItem;
namespace Ui {
class FesControlDialog;
}

class FesControlDialog : public QDialog
{
    Q_OBJECT

public:
    static FesControlDialog *getInstance();
    ~FesControlDialog();

    //预设电流控制开关
    void setPreCurrentState(int device,int channel,bool state);

    //预设电流控制大小
    void setPreCurrent(int device,int channel,uint8_t current);

    //预设置频率大小
    void setPreFrequency(int device,int channel,int16_t current);
    //预设值脉宽大小
    void setPrePulseWidth(int device,int channel,int16_t current);

    //设置参数(FES踏车)
    void setFesParam(int device,int channel,ST_FESSetParam st_fesParam);
    //实时参数
    void setRealTimeParam(int device,ST_FESRealTimeParam);

    //通道电刺激控制
    void switchDeviceChannel(int device,int channel,bool on);

    //单独电刺激
    void setOnlyFesParam(int device,int channel,ST_OnlyFESParam);

    //保存Fes页面设置的参数,便于发送
    //void saveOnlyFesParam(ST_OnlyFESParam);

     //保存Fes页面设置的参数
    //void saveBicycleFesParam(ST_FESSetParam);

    bool getDeviceStateByNo(uint8_t deviceNo);

    //获取电量
    //int getBatteryValue(uint8_t deviceNo);

    //获取设备是否选择了肌肉
    bool getMuscleDeviceStateByNo(uint8_t deviceNo);
    //设置设备的肌肉连接
    void setMuscleDeviceStateByNo(uint8_t deviceNo,bool flag);

    //启动电刺激
    bool openFESDevice();

    //查询状态
    void queryDeviceState(uint8_t deviceNo);

    /******
     * 说明:关闭电刺激模块
     *@deviceNo 要关闭的设备号1~8
     *@type 00-关闭某个设备  01-关闭所有设备
     * ********/
    void turnoffDevice(uint8_t deviceNo = 1,uint8_t type = 1);

private slots:
    void on_openSerial_Btn_clicked();

    void on_scanDevice_Btn_clicked();

    void receiveDataInterface();

    void displayError(QSerialPort::SerialPortError error);

    void slotConnectDevice(bool connect,uint8_t device);

    //查看界面列表
    void on_listWidgetClicked(QListWidgetItem *item);

    void on_queryDevice_Btn_clicked();

    void on_flushSerial_Btn_clicked();

    void slotConnectFes();

    //设备状态发生变化
    void deviceStateChanged(uint8_t deviceNo,bool state);
    void on_close_Btn_clicked();

signals:
    void signalDeviceStateChanged(QList<uint8_t>);
    void signalGetBattery(int deviceNo,int batteryValue);
protected:
    virtual void showEvent(QShowEvent *event);

    void paintEvent(QPaintEvent *event);

    virtual void changeEvent(QEvent* event);
private:
    FesControlDialog(QWidget *parent = nullptr);
    char getSum(QByteArray srcArray, int startIndex, int endIndex);
    QByteArray createFrame(QByteArray dataBuffer);
    bool initSerialPort();
    //串口操作
    void openSerialPort();
    bool openSeriaport(ST_SerialPortConfig);
    /***电刺激操作****/
    //搜索设备
    void searchDevice();
    //链接设备
    bool connectDevice(QByteArray mac,uint8_t deviceNum);
    void analysisData(QByteArray array);
    void updateDeviceList();
    //数据转换
    QByteArray str2QByteArray(QString str);

    void sendData(QByteArray array);
private:
    Ui::FesControlDialog *ui;
    static FesControlDialog* instance;
    QSerialPort *m_serialPort;
    QByteArray receiveArray;
    QList<QByteArray> deviceList;
    QList<QByteArray> addedDeviceList;
    uint8_t deviceConCount;
    QByteArray currentMacDevice;
    QMap<QByteArray,int> connectDevieMap;   //数据库保存的设备列表
    QMap<uint8_t,BLEItem *> deviceObjectMap;
    //配置界面
    uint8_t deviceDtateArray[4];        //设备状态
    //已经选择肌肉的设备
    uint8_t checkedMuscle_DeviceArray[4];
    //通道改变时,单独FES待发送的数据,便于滑块发送频率和脉宽

    ST_OnlyFESParam m_st_OnlyFESParam;
    //通道改变时,FES待发送的数据
    ST_FESSetParam m_st_fesParam;
    //从哪个页面发送来的参数
    E_FES_PAGE E_fromFesType;
    //uint8_t m_batteryValue[4]; //电池电量


    //自动控制 设备号,设备Mac,连接状态
    QMap<int,QByteArray> AutoFESDeviceMap;
    QMap<int,bool> AutoFESDeviceControlStateMap;

    QTimer *connectTimer;
};

#endif // FESCONTROLDIALOG_H