#pragma once

#include "JAxis.h"
#include "CAxis.h"
#include "dt.h"
#include <vector>
#include "CMachineCalibration.h"
#include "CManageDB.h"
#include "CMath.h"
#include "CIO.h"

/*
 * �����࣬�����궨�Ͳ�߹���
 * �궨��ͨ��һϵ�в����õ����͵���֮������Ա���ʽ
 * ע�⣺ѹ�Ͼ�����Ҫ�Ͳ��ʱ������ͬ������������
 */

#define BufferNo 6

using namespace ns_db;

// ʹ�� __declspec(dllexport) ��������Ϊ�����࣬�����ڶ�̬���ӿ⵼��
class __declspec(dllexport) CForceControl {
public:
    /**
     * @brief ���캯��
     * @param HeadID ͷ���� ID�����ڱ�ʶ��ͬ�������豸
     * @param xAxis X �����ָ�룬���ڿ��� X ������˶�
     * @param yAxis Y �����ָ�룬���ڿ��� Y ������˶�
     * @param zAxis Z �����ָ�룬���ڿ��� Z ������˶�
     * @param forceAxis �������ָ�룬���ڿ���������صIJ���
     */
    CForceControl(int HeadID, /*std::string headName,*/ CAxis* xAxis, CAxis* yAxis, CAxis* zAxis, CIO* forceAxis, CIO* forceScale = nullptr);

    /**
     * @brief ��������
     * �����ͷ����ж�̬�������Դ
     */
    ~CForceControl();

    /**
     * @brief ���ز��Ժ���
     * @param current ����ĵ���ֵ
     * @param force �������ֵ��ͨ�����ô���
     * @return ���������LONG ���ͣ�ͨ�� 0 ��ʾ�ɹ����� 0 ��ʾʧ��
     * �ú������ݸ����ĵ���ֵ�����ض�Ӧ����ֵ
     */
    LONG ForceTest(double current, double& force);

    /**
     * @brief �߶Ȳ��Ժ���
     * @param force ����ʱ�������ֵ
     * @param searchPos ��������ʼλ��
     * @param hight ����ĸ߶�ֵ��ͨ�����ô���
     * @return ���������LONG ���ͣ�ͨ�� 0 ��ʾ�ɹ����� 0 ��ʾʧ��
     * �ú���ֻ���� Z ����и߶Ȳ��ԣ������� XY �ᣬʹ��ǰӦ�ȿ��� XY �ᵽλ
     */
    LONG HightTest(/*double force, */double givenForceZ, double searchPos, double& hight);



    //Ѱ��
    LONG FindForce(double searchForce, double actForce,double givenForceZ);

    /**
     * @brief ����߶Ȳ��Ժ���
     * @param force ����ʱ�������ֵ
     * @param hight ����Ķ���߶�ֵ��ͨ�����ô���
     * @return ���������LONG ���ͣ�ͨ�� 0 ��ʾ�ɹ����� 0 ��ʾʧ��
     */
    LONG EjectorHightTest(double givenForceZ, double searchPos, double& hight);

    /**
     * @brief ������ֵ�ĺ���
     * @param force Ҫ���µ���ֵ
     * @return ���������LONG ���ͣ�ͨ�� 0 ��ʾ�ɹ����� 0 ��ʾʧ��
     * �ú������ڸ�������ϵͳ�е���ֵ
     */
    LONG UpdateForce(double force, double givenForceZ);

    /**
     * @brief �ƶ�������λ�õĺ���
     * @param pos Ŀ��λ�ã�XY_DOUBLE_STRUCT �ṹ����� X �� Y ����
     * @return ���������LONG ���ͣ�ͨ�� 0 ��ʾ�ɹ����� 0 ��ʾʧ��
     * �ú���������豸�ƶ���ָ���IJ���λ�ã����ȴ���λ
     */
    LONG ToTestPos(XY_DOUBLE_STRUCT pos);


    LONG MoveToTestPos();


    //�������ر궨
    LONG CurrentForceCalib();


    //�������ر궨
    LONG SpringForceCalib();

    /**
     * @brief ���б궨����ĺ���
     * �ú������ݱ궨�����л�ȡ�����ݣ��������͵���֮������Ա���ʽ
     */
    void Calibration();

    /**
     * @brief ��ȡ���ز����ĺ���
     * �ú������ڴ����ݿ�������洢λ�û�ȡ������صIJ���
     */
    LONG GetParam();

    /**
     * @brief ��ֵת��Ϊ����ֵ�ĺ���
     * @param force �������ֵ
     * @return ת����ĵ���ֵ
     * �ú������ݱ궨�õ������Ա���ʽ������ֵת��Ϊ��Ӧ�ĵ���ֵ
     */
    double ChangeForceToCurrent(double force, double givenForceZ);

    /**
     * @brief ����ֵת��Ϊ��ֵ�ĺ���
     * @param current ����ĵ���ֵ
     * @return ת�������ֵ
     * �ú������ݱ궨�õ������Ա���ʽ��������ֵת��Ϊ��Ӧ����ֵ
     */
    double ChangeCurrentToForce(double current, double givenForceZ);


    //����������ת�����ص������ᷴ��λ��
    double ChangeForceToForcerZPos();

    void Stop() { m_bStop = true; }

    std::string GetLineExpression();

    //void SetAI(CIO* AI) {
    //    m_pForceScale = AI;
    //}

private:
    CAxis* m_pAxisX = nullptr;  // X �����ָ�룬���ڿ��� X ������˶�
    CAxis* m_pAxisY = nullptr;  // Y �����ָ�룬���ڿ��� Y ������˶�
    CAxis* m_pAxisZ = nullptr;  // Z �����ָ�룬���ڿ��� Z ������˶�
    
//CAxis* m_pAxisForce = nullptr;  // �������ָ�룬���ڿ���������صIJ���
    CIO* m_pForcerAO = nullptr;
    CIO* m_pForceScale = nullptr;
    CMachineCalibration* m_pMcCalibDB = nullptr;  // �����궨���ݿ����ָ�룬���ڴ洢�ͻ�ȡ�궨����

    FORCE_CONTROL m_stParam;  // ���ز����ṹ�壬�洢����ϵͳ����ز���

    // ������ݣ���ͬ�IJ�ߣ�ֻ������λ�ú��������벻ͬ�����Ĵ�Сͨ������
    int m_nHeadId = 0;  // ͷ���� ID�����ڱ�ʶ��ͬ�������豸
    std::string m_sHeadName = "";
    int m_nForcerBufferNO = 0;
    int m_nSpringForcerBufferNO = 0;
    string m_sParamName = "";



    bool m_bStop = false;
};