#pragma once
#include "dt.h"
#include <iostream>
#include "CMath.h"
#include "JAxis.h"
#include "CForceControl.h"
#include "CMachineCalibration.h"

/*
 * ��ֱ�����࣬���ڽ��д�ֱ�����У׼����������
 * ͨ���ڲ�ͬ�Ƕ��²����߶ȣ��������ֱ������� X ��� Y �����б�Ƕȡ�
 */
class __declspec(dllexport) CVerticalMeasure
{
public:
    /**
     * @brief ���캯������ʼ����ֱ��������
     *
     * @param headId ͷ����Ψһ��ʶ�����������ֲ�ͬ�IJ�����Ԫ��
     * @param forceController ָ�������ƶ����ָ�룬���ڿ��ƺ�ִ������ز�����
     * @param rotationAxis ָ����ת������ָ�룬���ڿ�����ת����˶���
     */
    CVerticalMeasure(int headId, CForceControl* forceController, CAxis* rotationAxis);

    /**
     * @brief �����������ͷŴ�ֱ��������ռ�õ���Դ��
     */
    ~CVerticalMeasure();

    /**
     * @brief ��ʼ��ֱ����У׼������
     *
     * �ú����������ת����ת��ָ���Ƕȣ��ƶ�����Ӧ�IJ���λ�ý��и߶Ȳ�����
     * ���ݲ����õ�����������㴹ֱ������� X ��� Y �����б�Ƕȡ�
     *
     * @return LONG У׼�����Ľ�����ɹ����� OK��ʧ�ܷ�����Ӧ�Ĵ����롣
     */
    LONG StartCalib();

    /**
     * @brief �ӻ���У׼���ݿ��л�ȡ��ֱ��������IJ�����
     */
    void GetParam();

    /**
     * @brief ����ֱ�����õ��IJ������浽����У׼���ݿ��С�
     *
     * Ŀǰ�ú���Ϊ�գ��ɸ����������ʵ�֡�
     */
    void SaveParam();

    void Stop() { m_bStop = true; }

    void GetAngleResult(double& ZAxisAngleX, double& ZAxisAngleY)
    {
        ZAxisAngleX = m_calibrationParams.dZAxisAngleX;
        ZAxisAngleY = m_calibrationParams.dZAxisAngleY;
    }

private:
    /**
     * @brief �����������ƶ�������λ�ò����и߶Ȳ�����
     *
     * @param testPosition ����λ�õĶ�ά���ꡣ
     * @param searchHeight �����߶ȣ����ڸ߶Ȳ��ԵIJο�ֵ��
     * @param measuredHeight �����ʵ�ʲ����߶�ֵ��
     * @return LONG ����������ɹ����� OK��ʧ�ܷ�����Ӧ�Ĵ����롣
     */
    LONG MoveToTestPositionAndMeasureHeight(const XY_DOUBLE_STRUCT& testPosition, double searchHeight, double& measuredHeight);

    /**
     * @brief ��������������ת����ת��ָ���Ƕȡ�
     *
     * @param targetAngle Ҫ��ת����Ŀ��Ƕȡ�
     * @return LONG ����������ɹ����� OK��ʧ�ܷ�����Ӧ�Ĵ����롣
     */
    LONG RotateAxisToAngle(double targetAngle);

    int m_headId;  // ͷ����Ψһ��ʶ��
    CForceControl* m_forceController = nullptr;  // �����ƶ���ָ��
    CAxis* m_rotationAxis = nullptr;  // ��ת�����ָ��
    CMachineCalibration* m_machineCalibrationDB = nullptr;  // ����У׼���ݿ����ָ��
    VERTICAL_MEASURE m_calibrationParams;  // ��ֱ�����IJ����ṹ��
    bool m_bStop = false;
};