#pragma once
#include <vector>
#include <string>

#ifdef INTERFACE_DLL
#define INTERFACE_API __declspec(dllexport)
#else
#define INTERFACE_API
#endif

using namespace std;

// 图像数据类型，指向内存中的图像二进制数据
typedef unsigned char* ImageDataPtr;

enum ImageFormat
{
    GRAY8 = 0, // 灰度图，色值0~255                                           Format_Grayscale8
    RGB888,    // 每个像素 24 位，顺序是 0xRRGGBB，没有 Alpha 通道            Format_RGB888
    ARGB8888,  // 带有 Alpha 通道的 32 位像素格式，顺序是 0xAARRGGBB          
    RGB32,     // 每个像素 32 位，其中包含了 RGB 颜色信息，顺序通常是 0xAARRGGBB（最高字节为 Alpha 通道，但被忽略，因为 Alpha 通道总是视为 0xFF）
    YUV422,    // YUV4:2:2
};

/**
 * @brief 存储图像信息的结构
 */
typedef struct
{
    int width;          // 图像宽度
    int height;         // 图像高度
    int channel;        // 图像通道数
    ImageFormat format; // 图像格式
    ImageDataPtr data;  // 图像数据
}ImageInfo;


typedef struct
{
    int Lot;                //批次号
    int PtIndex;            //固晶点编号
    int Attribute;          //0表示正常数据；1表示接手动允许数据；2表示跳过数据。其它无意义
    int X_Offset;           //X方向偏差
    int X_RefMin;           //X方向参考范围小值
    int X_RefMax;           //X方向参考范围大值
    int Y_Offset;           //Y方向偏差
    int Y_RefMin;           //Y方向参考范围小值
    int Y_RefMax;           //Y方向参考范围大值
    int Theta_Offset;       //Theta方向偏差
    int Theta_RefMin;       //Theta方向参考范围小值
    int Theta_RefMax;       //Theta方向参考范围大值
    long Time;              //加工时间
} CPK_LIST_STRUCT; 

typedef struct _CONFIG_BASE_STRUCT
{
    int iGroupId;
    string strName;
    string strDescribe;
    int iUserGradee;
    int iChangeFlag;
    string strValue;
    string strType;
    string strDefult;
    string strLowerLimit;
    string strUpperLimit;
    string strUnit;
}CONFIG_BASE_STRUCT;

class INTERFACE_API CInterface
{
public:
    /// <summary>
    /// 设置红光
    /// </summary>
    /// <param name="iCameraId">相机Id</param>
    /// <param name="LightValue">灯光值</param>
    /// <returns>成功返回0，否则返回错误码</returns>
    long SetRedLight(int iCameraId,int LightValue);

    /// <summary>
    /// 设置绿光
    /// </summary>
    /// <param name="LightValue">灯光值</param>
    /// <returns>成功返回0，否则返回错误码</returns>
    /// 
    long SetGreenLight(int iCameraId, int LightValue);
    /// <summary>
    /// 设置蓝光
    /// </summary>
    /// <param name="iCameraId">相机Id</param>
    /// <param name="LightValue">灯光值</param>
    /// <returns>成功返回0，否则返回错误码</returns>
    long SetBlueLight(int iCameraId, int LightValue);

    /// <summary>
    /// 设置点光
    /// </summary>
    /// <param name="iCameraId">相机Id</param>
    /// <param name="LightValue">灯光值</param>
    /// <returns>成功返回0，否则返回错误码</returns>    
    long SetPointLight(int iCameraId, int LightValue);

    /// <summary>
    /// 获取灯光值
    /// </summary>
    /// <param name="iCameraId">相机Id</param>
    /// <param name="redLightValue">红光。值为-1时，表示没有该灯</param>
    /// <param name="greenLightValue">绿光。值为-1时，表示没有该灯</param>
    /// <param name="blueLightValue">蓝光。值为-1时，表示没有该灯</param>
    /// <param name="pointLightValue">点光。值为-1时，表示没有该灯</param>
    /// <returns>成功返回0，否则返回错误码</returns>
    long GetLight(int iCameraId, int &redLightValue, int &greenLightValue, int &blueLightValue,int &pointLightValue);
    
    /// <summary>
    /// 获取相机图像。调用后会阻塞，直到有新的相机图像时才返回
    /// </summary>
    /// <param name="iCameraId">相机Id</param>
    /// <param name="image"></param>
    /// <returns>成功返回0，否则返回错误码</returns>
    long GrabImage(int iCameraId, ImageInfo& image);

    /// <summary>
    /// 获取CPK数据信息
    /// </summary>
    /// <param name="CpkList">CPK数据</param>
    /// <returns>成功返回0，否则返回错误码</returns>
    long GetCpkList(std::vector<CPK_LIST_STRUCT> &CpkList);


    /// <summary>
    /// 读取表中指定GroupId的配置信息
    /// </summary>
    /// <param name="iGroupId">组Id</param>
    /// <param name="strTableName">表名</param>
    /// <param name="vecConfig">返回的配置信息</param>
    /// <returns>成功返回0，否则返回错误码</returns>
    long LoadConfigDB(string strTableName, vector<int> iGroupId, vector<CONFIG_BASE_STRUCT>& vecConfig);

    /// <summary>
    /// 保存配置信息
    /// </summary>
    /// <param name="strTableName">表名</param>
    /// <param name="vecConfig">要保存的配置信息</param>
    /// <returns>成功返回0，否则返回错误码</returns>
    long SaveConfigDB(string strTableName, vector<CONFIG_BASE_STRUCT> vecConfig);
};

