#pragma once
#include "CCalib.h"
#include "dt.h"
#include "TypeDef.h"
/*
    XY�궨��������궨��
    �����궨�����ͱ궨���
*/

//using namespace JVision;
using namespace std;

struct CALIB_XY_PARAM {
    double dCenterPosX = 0;               //�ŵ��м���X����
    double dCenterPosY = 0;               //�ŵ��м���Y����
    double dGrabPosZ = 0;                 //�궨ʱZ��λ��
    double dCalibStepX = 0;               //����궨����X
    double dCalibStepY = 0;               //����궨����Y
    int nTempId = 0;                      //����id
    string sResultMatrix = "";            //�궨�������
};

class __declspec(dllexport) CXYCalib :
    public CCalib
{

    // ����XY�궨�����ͣ���Ϊ���������ϣ�EyeOnHand�������������⣨EyeOutHand����������
    enum XYCalibType { EyeOnHand, EyeOutHand };

public:
    /**
     * @brief ���캯�������ڴ���CXYCalib����
     *
     * @param id �궨��Ψһ��ʶ��
     * @param name �궨������
     */
    CXYCalib(int id, string name);

    /**
     * @brief ������������������CXYCalib����
     */
    ~CXYCalib() {}

    /**
     * @brief ��ʼ����XY�궨����
     *
     * @return int �궨�����Ľ����ͨ��0��ʾ�ɹ�����0��ʾʧ��
     */
    virtual int StartCalib() override;

    /**
     * @brief ���ñ궨����IJ���
     */
    virtual void SetParam() override;

    /**
     * @brief �����ݿ��������ȡ�궨����IJ���
     */
    virtual LONG GetParam() override;

    /**
     * @brief ����PR��Pattern Recognition����ID
     *
     * @param id PR��Ψһ��ʶ��
     */
    void SetPRID(int id) { 
        m_stCalibParam_XY.nTempId = id;
        SetParam();
    }

    /**
     * @brief ����������ת��Ϊ��������
     *
     * @param pixel �������������
     * @param pos �������������
     * @return LONG ת�������Ľ����ͨ��OK��ʾ�ɹ���FAIL��ʾʧ��
     */
    LONG PixelToPos(XY_DOUBLE_STRUCT pixel, XY_DOUBLE_STRUCT& pos);

    /**
     * @brief ����������ת��Ϊ��������
     *
     * @param pos �������������
     * @param pixel �������������
     * @return LONG ת�������Ľ����ͨ��OK��ʾ�ɹ���FAIL��ʾʧ��
     */
    LONG PosToPixel(XY_DOUBLE_STRUCT pos, XY_DOUBLE_STRUCT& pixel);

    //��ȡ�궨����
    //CALIB_XY GetCalibParam() { return m_stCalibXYParam; }

    //��ȡ���պ�ľŵ���������
    vector<JVision::Point2D> GetNinePixel() { return m_pixels; }

    //��ȡ�ŵ���������
    vector<JVision::Point2D> GetNinePosition() { return m_positions; }

    LONG MoveToCalibPos();
private:
    /**
     * @brief ����Ÿ��궨λ�õ�����
     */
    void calNinePoints();

    // ����һ��������ִ�ж�ά����任
    //XY_DOUBLE_STRUCT affineTransform(XY_DOUBLE_STRUCT p) {
    //    CManageDB::GetInstance()->GetCMachineCalibration()->GetCalibXYParam(m_nID, m_sName, m_stCalibXYParam);
    //    XY_DOUBLE_STRUCT transformedPoint;
    //    transformedPoint.x = m_stCalibXYParam.m_dA * p.x + m_stCalibXYParam.m_dB * p.y + m_stCalibXYParam.m_dTx;
    //    transformedPoint.y = m_stCalibXYParam.m_dC * p.x + m_stCalibXYParam.m_dD * p.y + m_stCalibXYParam.m_dTy;
    //    return transformedPoint;
    //}

private:
    // ����궨λ�õ�����Ϊ9��
    const static int PosNum = 9;
    vector<MODULE_CONFIG_STRUCT> m_vecConfigStruct;
    // �洢XY�궨�IJ���
    //CALIB_XY m_stCalibXYParam;
    CALIB_XY_PARAM  m_stCalibParam_XY;
    // �洢9���궨λ�õ���������
    vector<JVision::Point2D> m_positions;

    //�洢�Ÿ����λ�ã�������
    vector<JVision::Point2D> m_relativePositions;

    // �洢9���궨λ�ö�Ӧ����������
    vector<JVision::Point2D> m_pixels;

    // �洢9���궨λ�ö�Ӧ�������������
    vector<JVision::Point2D> m_relativePixels;
};