#pragma once
#include "CModule.h"
#include "CNozzleTable.h"
#include "CBondMatrix.h"
#include "CForceControl.h"
#include "CRCalib.h"
#include "CLookUpCalib.h"
#include "CTransferTable.h"
#include "CXYCalib.h"
#include "TipMatrix.h"
class __declspec(dllexport) CBondHead :
    public CModule
{
public:
	CBondHead(MODULE_LIST eModuleType);
    ~CBondHead();

	virtual LONG AllocateAxis(vector<CAxis*> vecAxis);
	virtual LONG AllocateIo(vector<CIO*> vecIo);


	void SetXAxis(CAxis* axis) { m_pXAxis = axis; }
	CAxis* GetXAxis() { return m_pXAxis; }
	void SetYAxis(CAxis* axis) { m_pYAxis = axis; }
	CAxis* GetYAxis() { return m_pYAxis; }
	void SetZAxis(CAxis* axis) { m_pZAxis = axis; }
	CAxis* GetZAxis() { return m_pZAxis; }
	//void SetForceZAxis(CAxis* axis) { m_pForcerZ = axis; }
	//CAxis* GetForceZAxis() { return m_pForcerZ; }
	void SetRAxis(CAxis* axis) { m_pRAxis = axis; }
	CAxis* GetRAxis() { return m_pRAxis; }
	void SetCoord(CCoord* pCrd) { m_pCoord_XY = pCrd; }
	CCoord* GetCoord() { return m_pCoord_XY; }
	void SetVacDO(CIO* out) { m_pBDVacGpo = out; }
	void SetFlowDo(CIO* out) { m_pBDFlowGpo = out; }
	void SetVacDi(CIO* input) { m_pBDVacGpi = input; }
	void SetFlowDi(CIO* input) { m_pBDFlowGpi = input; }
	void SetNozzleTable(CNozzleTable* nozzleTable) { m_pNozzleTable = nozzleTable; }
	void SetLookUpCamera(CCameraBase* camera) { m_pLookUpCamera = camera; }
	void SetWaferTransferTable(CTransferTable* tt) { m_pWaferTransferTable = tt; }
	void SetWaffleTransferTable(CTransferTable* tt) { m_pWaffleTransferTable = tt; }

	//void SetForceControl(CForceControl* force) { m_pForceControl = force; }
	CForceControl* GetForceControl() { return m_pForceControl; }
	CXYCalib* GetLookUpCameraCalib() { return m_pLookUpXYCalib; }
	CRCalib* GetHeadRCalib() { return m_pRCalib; }
	bool GetIsLocationAll() { return m_bIsLocationAll; }

	virtual void SetHighCamera(CCameraBase* camera) {}
	virtual void SetLowCamera(CCameraBase* camera) { m_pLowCamera = camera; }
	virtual CXYCalib* GetLowCameraCalib() { return m_pLowXYCalib; }
	virtual CXYCalib* GetHighCameraCalib() { return nullptr; }
	virtual CCTDCalib* GetLowCTDCalib() { return m_pLowCTDCalib; }


	virtual LONG ToHome();
    virtual LONG ToSafePosition();
	LONG XYMove(double x, double y, bool bSync = true);
	LONG XYMoveTo(double x,double y, bool bSync = true);
	LONG XYZMoveTo(double x, double y,double z);
	LONG XYZRMoveTo(double x, double y, double z,double r);

	virtual void SetPickHTestIndex(int index) = 0;
	virtual void SetBondHTestIndex(int index) = 0;
	virtual LONG PickHightTest();//����֮ǰ��SetIndex
	virtual LONG AllBondHighTest() = 0;
	virtual LONG BondHighTest();

	virtual LONG VacuumOn(long lDelay);		//��տ�,�����ʱ��ms
	virtual LONG VacuumOff(long lDelay);		//��չ�,������ʱ��ms
	virtual LONG StrongOn();		//ǿ����
	virtual LONG StrongOff();		//ǿ����

	virtual LONG UltraOn(int iUltraValue) { return OK; };			//������
	virtual LONG UltraOff() { return OK; };	//������

	virtual LONG ChangeNozzle(int nozzleIndex);
	virtual LONG UnLoadNozzle();
	virtual LONG LoadNozzle(int nozzleIndex);
	virtual LONG CheckDieExistStatus(bool& bExist);

	virtual LONG MoveLowCameraToNozzle();
	virtual LONG MoveNozzleToLowCamera();

	//����ȡ��
	virtual LONG MoveToPickGrabPos(bool waitDone = true);
	virtual LONG PickGrab(int index, X_Y_ANGLE_STRUCT& result);//��ת̨���գ��������ս�������ս��������ʰȡƫ�ƣ����洢
	//virtual LONG MoveToPickPos();//�ƶ���ʰȡλ��δ����	

	virtual LONG PickDie(int index);//���գ�ȡ���������е���������λ����Ҫ�����Զ�����
	
	virtual LONG PickDieDown(int index, X_Y_ANGLE_STRUCT result);//�������ս������ʰȡ����ƫ��
	virtual LONG PickUpToGrabPos();
	virtual LONG PickDieUp(bool waitDone = true);//���е���ȫλ��

	//��������
	virtual LONG XYZToLookUpGrabPos();
	virtual LONG LookUpGrab(int index,X_Y_ANGLE_STRUCT& result);//�ƶ�����������λ�����ս���ŵ��ṹ����

	//����̾�
	virtual LONG PlaceDie(int index, X_Y_ANGLE_STRUCT lookUpOffsetPixel) = 0;
	virtual LONG MoveToBondGrabPos(int index) = 0;
	virtual LONG BondGrab(int index, X_Y_ANGLE_STRUCT& result) = 0; //���ص����ս��Ϊ������λ
	virtual LONG ToBondPos_AddOffset(int index, X_Y_ANGLE_STRUCT bondOffset, X_Y_ANGLE_STRUCT lookUpOffset, bool waitDone = true) = 0;//���������
	virtual LONG BondDieDown(int index) = 0;//���������
	virtual LONG BondDieUp(bool waitDone = true) = 0 ;
	virtual LONG FindForce(double force);		//Ѱѹ��Ѱ�������ᷴ��λ��
	virtual LONG UpdateForce(double dForce);		//�л����Ĵ�С
	virtual LONG GetCurForceCurrentPercent(short& current);
	virtual LONG GetCurForce(double& force);
	virtual LONG Sync();

	//virtual LONG PickHightTest();
	//virtual LONG BondHighTest();

	//�궨
	virtual LONG HighCameraCTDCalib() { return OK; }
	virtual LONG LowCameraPosCalib();
	virtual LONG LowCTDNozzlePosCalib();
	virtual LONG CalLowCTDResult();
	virtual LONG NozzleRotCenterCalib();

	virtual LONG LowCameraXYCalib();
	virtual LONG LookUpCameraXYCalib();

	//���������
	virtual LONG CreatePickTemp(int dieIndex);
	virtual LONG CreateLookUpTemp(int dieIndex);
	virtual LONG CreateBondTemp(int dieIndex);


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

	//�����궨ģ��
	virtual LONG CreateLowCameraCalibTemp();
	virtual LONG CreateLookUpCameraCalibTemp();
	virtual LONG CreateRCalibTemp();

	virtual LONG CreateCTDLookUpCameraTemp();
	virtual LONG CreateCTDHeadCameraTemp();

	virtual LONG CreateCTDTipTemp();

	//�������λ���л�
	virtual LONG LowCameraToHead();
	virtual LONG HeadToLowCamera();
	virtual LONG HighCameraToHead();
	virtual LONG HeadToHighCamera();

	//���������
	//virtual LONG CreatePickTemp();
	
	//virtual LONG CreateLookUpTemp();

	//virtual LONG CreateBondTemp();

protected:
	BOND_PARAM m_stBondParam;
	CBondMatrix* m_pBondMatrix = nullptr;
	CForceControl* m_pForceControl = nullptr;
	CTransferTable* m_pWaferTransferTable = nullptr;
	CTransferTable* m_pWaffleTransferTable = nullptr;
	CNozzleTable* m_pNozzleTable = nullptr;

	CCameraBase* m_pLowCamera = nullptr;

	CAxis* m_pXAxis = nullptr;
	CAxis* m_pYAxis = nullptr;
	CAxis* m_pZAxis = nullptr;
	CAxis* m_pRAxis = nullptr;
	//CAxis* m_pForcerZ = nullptr;
	CIO* m_pForcerDo = nullptr;
	CIO* m_pForcerAO = nullptr;
	CIO* m_pBDVacGpo = nullptr;
	CIO* m_pBDFlowGpo = nullptr;
	CIO* m_pBDVacGpi = nullptr;
	CIO* m_pBDFlowGpi = nullptr;
	CIO* m_pForceScale = nullptr;
	CCoord* m_pCoord_XY = nullptr;

	CCameraBase* m_pLookUpCamera = nullptr;
	CXYCalib* m_pLookUpXYCalib = nullptr;//�������XY�궨
	CXYCalib* m_pLowXYCalib = nullptr;
	CRCalib* m_pRCalib = nullptr;
	CCTDCalib* m_pLowCTDCalib = nullptr;
	CPRStrategy* m_pPR = nullptr;
	TipMatrix* m_pTipMatrix = nullptr;

	//λ�ò���
	double m_dSafePosX = 0;//��ȫλ��
	double m_dSafePosY = 0;
	double m_dSafePosZ = 0;
	double m_dInitPosR = 0;

	double m_dPickGrabPosX = 0;  //ȡ��λ��
	double m_dPickGrabPosY = 0;
	double m_dPickGrabPosZ = 0; //ʰȡ����λ

	double m_dLookUpGrabPosX = 0;
	double m_dLookUpGrabPosY = 0;
	double m_dLookUpPosZ = 0;

	double m_dPreChangeNozzleDisY = 0;//Ԥ��������ƫ��λ��
	double m_dNozzlePosZ = 0;		  //������Z

	//ͳ�Ʋ���
	int m_nTipUsedNum = 0;
	int m_nTipUsedMaxNum = 0;

	int m_nCurNozzleIndex = 0; //��ǰ������������ϵı��
	//int nCurrBondHeadIdByTable;		//��ǰʹ�õ�����������̨�ϱ��
	//XY_DOUBLE_STRUCT stCalibTableBondPosition;		//У׼̨�̾�λ��

	//double m_dPressDistance = 0; //ѹ�Ͼ���,�޸�Ϊ����λ��
	double m_dPickVel = 0; //����
	double m_dSearchForce = 0;
	double m_dHoldForce = 0;  //������
	double m_dPickSearchPosZ = 0;//ʰȡ�߶Ȳ�������λ��
	double m_dBondSearchPosZ = 0;//�̾��߶Ȳ�������λ��
	//double m_dNozzlePosY = 0;//������Y
	double m_dNozzleTableOriginPosX = 0;
	double m_dNozzleTableOriginPosY = 0;

	int m_nPickHTestDieIndex = 1;
	int m_nBondHTestDieIndex = 1;

	bool m_bIsLocationAll = false; //���ڹ̾�ʱ������ѡȫ�����ղ�������ÿ��PCBֻ��һ��

	double m_dGivenForceZPos = 0;		//ʰȡ����оƬʱ������ķ���λ��

	double m_dBondGrabPosZ = 0;			//bondGrabPosZ
};