#ifndef _DEVICEPLAYERV1_HPP_
#define _DEVICEPLAYERV1_HPP_

#include "Crc.h"
#include "UtilBase.hpp"

namespace gsd{
    /**
     * @brief DevicePlayerV1
     * 
     */    
    class DevicePlayerV1: public ContorlSerialBase
    {
    private:
        unsigned short voltage;
        short current;
        short pressure;
        uint8_t power_out_state;

        enum RECV_STEP{
            STEP_HEAD = 0,
            STEP_LEN = 1,
            STEP_SEQ = 2,
            STEP_SAddr = 3,
            STEP_DAddr = 4,
            STEP_MSGId = 5,
            STEP_DATA = 6
        };

        typedef struct {
            uint8_t dataCount;
            uint8_t dataLength;
            uint8_t dataCheckSum;
            uint8_t data[15];
            enum RECV_STEP step = STEP_HEAD;
        }ExpelComm;

        ExpelComm _comm;

    public:
        DevicePlayerV1(): ContorlSerialBase()
        {
            this->DeviceInfo = "民航小板协议";
            this->tool = DeviceTools::serial;
            this->baudRate = 115200;
        }
        ~DevicePlayerV1(){}


        unsigned short getVoltage();
        short getCurent();
        short getPressure();
        uint8_t getPowerOutState();

        /**
         * @description: 判定msg是否为status
         * @param {int} &msg_id
         * @return {*}
         */    
        bool getStatusMsg(int &msg_id);
        
        /**
         * @description: 消费数据
         * @param {uint8_t} *data
         * @param {int} len
         * @param {int} &msg_id
         * @return {*}
         */        
        bool Consumer(uint8_t *data, int len, int &msg_id);

        /**
         * @description: 反序列化
         * @param {uint8_t} *data
         * @param {int} len
         * @param {int} &msg_id
         * @return {*}
         */        
        virtual bool deserialization(const uint8_t *data, int len, int &msg_id);

        /**
         * @description: 序列化
         * @param {ControlerMsg} gasControl
         * @param {char*} data
         * @return {*}
         */        
        void serialization(const ControlerMsg gasControl, char* data);

        // 常规操作
        int8_t Open(std::string _deviceId, uint8_t* data, int& length);
        int8_t Close(std::string _deviceId, uint8_t* data, int&length);
        int8_t Fire(std::string _deviceId, uint8_t* data, int& length);
        int8_t Status(std::string _deviceId, uint8_t* data, int& length);

        /**
         * @description: 构建设备信息
         * @param {SendDevice&} sendDevice
         * @return {*}
         */        
        virtual void BuildDeviceInfo(SendDevice& sendDevice);
    };
};


#endif