#pragma once
#include "dt.h"
#include <iostream>
#include "CMath.h"
#include "JAxis.h"
#include "CForceControl.h"
#include "CMachineCalibration.h"
/*
1��ˮƽ��У׼����������㣬����ȷ��һ��ƽ�棬��ƽ�淨���������ݷ���������Ƕ�
ע�⣺��ˮƽ��У׼����԰�ͷ����ϵΪ��׼����ϵ��
�磺X����Ϊ�������������������̣���Ϊ�����򸺷���������
*/

class __declspec(dllexport) CHorizMeasure
{
public:
    /**
     * @brief ���캯�������ڴ��� CHorizMeasure ����
     *
     * @param id �����Ψһ��ʶ�����������ֲ�ͬ��У׼����
     * @param forceControl ָ�� CForceControl �����ָ�룬���ڿ��ƺͻ�ȡ����ص�����
     */
    CHorizMeasure(int id, CForceControl* forceControl);

    /**
     * @brief ������������������ CHorizMeasure �����ͷ������Դ
     */
    ~CHorizMeasure();

    // /**
    //  * @brief �߶Ȳ��Ժ�����������ǰλ�õĸ߶�
    //  * 
    //  * @param hight ���ڴ洢�����õ��ĸ߶�ֵ
    //  * @return LONG ����������ɹ����� OK��ʧ�ܷ�����Ӧ�Ĵ�����
    //  */
    // LONG HightTest(double& hight);

    /**
     * @brief ��ʼˮƽ��У׼����
     *
     * �ú���������豸�ƶ�������Ԥ��IJ���λ�ã����и߶Ȳ��ԣ�
     * �����������Ե������͸߶�ȷ��һ��ƽ�棬�����ƽ��ķ�������
     * ���������ƽ������ڰ�ͷ����ϵ�� X ��� Y �᷽�����б�Ƕ�
     *
     * @return LONG У׼�����Ľ�����ɹ����� OK��ʧ�ܷ�����Ӧ�Ĵ�����
     */
    LONG StartCalib();

    /**
     * @brief �����ݿ��л�ȡˮƽ��У׼����IJ���
     *
     * ��Щ�����������Ե�����ꡢ�����߶ȵȣ���洢�� m_stParam ��Ա������
     */
    void GetParam();

    /**
     * @brief ��У׼����������õ����ݿ���
     *
     * Ŀǰ������Ϊ�գ�������ʵ�ֽ�У׼�õ��� X ��� Y ����б�ǶȵȲ������浽���ݿ���߼�
     */
    void SetParam();

    /**
     * @brief ��ȡˮƽ��У׼�� X �᷽�����б�ǶȽ��
     *
     * @return double X �᷽�����б�Ƕȣ��԰�ͷ����ϵΪ��׼
     */
    double GetAngleXResult() { return m_stParam.dAngleX; }

    /**
     * @brief ��ȡˮƽ��У׼�� Y �᷽�����б�ǶȽ��
     *
     * @return double Y �᷽�����б�Ƕȣ��԰�ͷ����ϵΪ��׼
     */
    double GetAngleYResult() { return m_stParam.dAngleY; }

    void Stop() { m_bStop = true; }

    void GetAngleResult(double& angleX, double& angleY) 
    {
        angleX = m_stParam.dAngleX;
        angleY = m_stParam.dAngleY;
    }

private:
    CForceControl* m_pForceControl = nullptr;  // ָ�������ƶ����ָ�룬���ڿ��ƺͻ�ȡ����ص�����
    CMachineCalibration* m_pMcCalibDB = nullptr;  // ָ�����У׼���ݿ�����ָ�룬���ڲ����Ķ�ȡ�ʹ洢
    HORIZ_MEASURE m_stParam;  // �洢ˮƽ��У׼����IJ�����У׼���
    int m_nTableID = 0;  // �����Ψһ��ʶ��
    bool m_bStop = false;

    // ���³�Ա�����Ѻϲ��� m_stParam �У����ٵ���ʹ��
    // double m_dTestPosX1 = 0;
    // double m_dTestPosY1 = 0;
    // double m_dTestPosX2 = 0;
    // double m_dTestPosY2 = 0;
    // double m_dTestPosX3 = 0;
    // double m_dTestPosY3 = 0;
    // double m_dSearchPosZ = 0;

    // double m_dAngleX = 0;  // У׼��Ľ����X �������б�Ƕ�
    // double m_dAngleY = 0;  // У׼��Ľ����Y �������б�Ƕ�
private:
    /**
     * @brief ���������������ƶ���ָ��λ�ò����и߶Ȳ���
     *
     * @param pos Ҫ�ƶ����IJ���λ�õĶ�ά����
     * @param searchPosZ �����߶ȣ����ڸ߶Ȳ��ԵIJ���
     * @param outZ ���ڴ洢�����õ���ʵ�ʸ߶�ֵ
     * @return LONG ����������ɹ����� OK��ʧ�ܷ�����Ӧ�Ĵ�����
     */
    LONG MoveAndTest(const XY_DOUBLE_STRUCT& pos, double searchPosZ, double& outZ);
};