#pragma once
#include "cdrivercard.h"
#include "CMSerialPort.h"
#include "export_laser_path_driver_diodes.h"
//夹爪管理类
class LASER_PATH_DRIVER_DIODES_EXPORT CDHGripperRS485 :public CDriverCard
{
public:
    enum msg_id {
        MOVEPOS=MAX_DRIVER_MSG_ID,
        kSetSpeed,
        kFreshPos,
        kReset,
    };

	CDHGripperRS485(const QString& name,int32_t id);
    ~CDHGripperRS485(void);

	int ReadConfig(QDomElement &root);
	QDomElement WriteConfig(QDomDocument &doc, QDomElement &root);

    void do_msg(int iID, QVariantList& vlInput, V_MsgOutput* pvlOutput) override;

public:
    virtual int32_t init_driver() override;
    virtual int32_t exit_driver() override;

	/**
    * @fn  Init
    * @brief 设置初始化
    * @param int value:0x01 执行单方向初始化，来寻找最大位置或最小位置 0xa5 无论夹爪处于任何位置和状态，发送 0xA5 后，夹爪进行一次闭合到张开的动作
    * @return bool false:失败 true:成功
    */
	bool Init(int value);

	/**
    * @fn  SetForceValue
    * @brief 设置夹爪力度
    * @param int value:20-100百分比
    * @return bool false:失败 true:成功
    */
	bool SetForceValue(int value);

	/**
    * @fn  SetPosValue
    * @brief 设置夹爪位置
    * @param int value:0-1000千分比
    * @return bool false:失败 true:成功
    */
	bool SetPosValue(int value);

    bool GetPosValue(int &value);

	/**
    * @fn  SetSpeedValue
    * @brief 设置夹爪速度
    * @param int value:1-100百分比
    * @return bool false:失败 true:成功
    */
	bool SetSpeedValue(int value);

	/**
    * @fn  SetWriteProtecd
    * @brief 设置写保护
    * @param int value:0:默认 1:将所有参数写入flash
    * @return bool false:失败 true:成功
    */
	bool SetWriteProtecd(int value);

	/**
    * @fn  SetInitDirect
    * @brief 设置初始化方向
    * @param int value:0:打开 1:关闭
    * @return bool false:失败 true:成功
    */
	bool SetInitDirect(int value);

	/**
    * @fn  GetInit
    * @brief 取得初始化状态
    * @param 无
    * @return int -1:失败 0:未初始化 1:初始化成功 2:初始化中
    */
	int GetInitState();

	/**
    * @fn  GetGripperState
    * @brief 取得夹持状态反馈
    * @param 无
    * @return int -1:失败 
	*              0:夹爪处于正在运动状态
	*              1:夹爪停止运动，且夹爪未检测到夹到物体
	*		       2:夹爪停止运动，且夹爪检测到夹到物体
	*		       3:夹爪检测到夹住物体后，发现物体掉落
    */
	int GetGripperState();
	
	/**
    * @fn  GetPosState
    * @brief 取得当前夹爪实时位置
    * @param 无
    * @return int -1:失败  other:当前位置
    */
	int GetPosState();

	/**
    * @fn  GetForceState
    * @brief 取得当前夹爪力值
    * @param 无
    * @return int -1:失败  other:当前力值
    */
	int GetForceState();

	/**
    * @fn  GetSpeedState
    * @brief 取得当前夹爪速度
    * @param 无
    * @return int -1:失败  other:当前速度
    */
	int GetSpeedState();

private:
	unsigned char CheckSum(unsigned char* pStr, int nLen, bool bLow);
	unsigned short CRC16(byte* pDataIn, int iLenIn);
	bool SendCommData(int addr, int value);
	int  ReceiveCommData(int addr);

private:
	CMSerialPort* m_pSerialPort;
};

