#pragma once
#include "MvCamera.h"
#include "CCameraBase.h"

#ifdef HIKVISION_CAMERA_EXPORTS
#define HIKVISION_CAMERA_DLL_API __declspec(dllexport)
#else
#define HIKVISION_CAMERA_DLL_API //__declspec(dllimport)
#endif

class HIKVISION_CAMERA_DLL_API CHIKVisionCamera :
    public CCameraBase
{
public:
    CHIKVisionCamera(int id,string sDescribe, bool bEnable);
    ~CHIKVisionCamera();

    virtual long Open() override;
    virtual void Close() override;
    virtual long VideoStart() override;
    virtual long VideoStop()  override;
    virtual long GrabImage(ImageInfo& image) override;
    virtual long SetExposure(double exposure) override;
    virtual double GetExposure() override;
    virtual long SetGain(double gain) override;
    virtual double GetGain() override;

private:
    static CHAR strErrorText[256];
    static CHAR* GetErrText(INT nErrorNum);
    static bool m_bFindDevList;
    static MV_CC_DEVICE_INFO_LIST* m_stDevList;

    bool   m_bOpenDevice;                       // ch:�Ƿ���豸 | en:Whether to open device
    VOID*   m_hGrabThread = NULL;                      // ch:ȡ���߳̾�� | en:Grab thread handle
    bool    m_bThreadState;
    MV_CC_DEVICE_INFO* m_pDeviceInfo;

    CMvCamera m_stMvCamera;
    UCHAR* GetDeviceUserDefinedName(MV_CC_DEVICE_INFO* pDeviceInfo);
    
private:
    CRITICAL_SECTION        m_hSaveImageMux;    
    UINT					m_nSaveImageBufSize;
    bool                    m_bGrabImageDone;
    UCHAR* m_pSaveImageBuf = nullptr;                         //ͼ�񻺴�
    bool    m_bStartVedioBing = false;                     // ch:�Ƿ�ʼץͼ | en:Whether to start grabbing
public:
    LONG SaveImageBuf(unsigned char* pData, MV_FRAME_OUT_INFO_EX* stImageInfo);
    long ImageToViewThreadProcess();

};