#pragma once
#include "CModule.h"
#include "CRCalib.h"
#include "CNozzleTable.h"
#include "CEjector.h"
#include "CTransferTable.h"
#include "CForceControl.h"
#include "CMatrixCommon.h"

/*
1��Waferȡ��ͷû��������ж���
2�������Ӿ���ֻ���ض�λ��ȡ���ͷž�
*/
class __declspec(dllexport) CWaferHead :
    public CModule
{
public:

    CWaferHead(MODULE_LIST eModuleType);
    ~CWaferHead();

	virtual void SetDataChangFunction() override;
	virtual LONG SetParam() override;//��������
	virtual LONG GetParam() override;//��������
	virtual LONG ToHome() override;
	virtual LONG Sync() override;
	virtual LONG ToSafePosition() override;
	virtual LONG InitResource() override;											//�����ᡢIO���궨����Դ
	virtual void DataChangNotice(string strDbName, string strTableName) override;	//�ص�������������

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

	ULONG GetCurrentBondIndex() {return m_iCurrentBondIndex;}
	void SetCurrentBondIndex(ULONG index) { m_iCurrentBondIndex = index; }

	void SetZEPZCoord(CCoord* crd) { m_pZEPZCoord = crd; }
	void SetXYCoord(CCoord* crd) { m_pXYCrd = crd; }

	void SetNozzleTable(CNozzleTable* nozzleTable) { m_pNozzleTable = nozzleTable; }
	void SetEjector(CEjector* ej) { m_pEjector = ej; }
	void SetTransferTable(CTransferTable* tt) { m_pTransferTable = tt; }
	void SetForceControl(CForceControl* force) { m_pForceControl = force; }

	//�ֶ���
	//��������
	LONG ChangeNozzle(int nozzleIndex);
	LONG UnLoadNozzle();
	LONG LoadNozzle(int nozzleIndex);

	//�Զ���
	LONG CheckDieExistStatus(bool& bExist);
	LONG VacuumOn(LONG lDelay);						//��տ�
	LONG VacuumOff(LONG lDelay);					//��չ�
	LONG UpdateForce(double dForce);				//�л����Ĵ�С
	LONG FindForce(double dForce);

	//LONG UpdatePickParam(int dieIndex);
	//LONG WaitZTrigYToPick(int index);
	//�ֶ����̵���
	LONG PickDie(int dieIndex, bool bSync); 
	LONG XYZToPrePickPos(int dieIndex, bool bSync);
	LONG ZSlowToPickPos(int dieIndex, bool bSync);

	LONG PlaceDie(int dieIndex, bool bSync);
	LONG XYZToPrePlacePos(int dieIndex, bool bSync);  //�Զ����̵���
	LONG ZSlowToPlacePos(int dieIndex, bool bSync);

	//�Զ����̵���
	LONG PickDie(bool bSync) { return PickDie(m_iCurrentBondIndex, bSync); };
	LONG XYZToPrePickPos(bool bSync) { return XYZToPrePickPos(m_iCurrentBondIndex, bSync); };
	LONG ZSlowToPickPos(bool bSync) { return ZSlowToPickPos(m_iCurrentBondIndex, bSync); };

	LONG PlaceDie(bool bSync) { return PlaceDie(m_iCurrentBondIndex, bSync); };
	LONG XYZToPrePlacePos(bool bSync) { return XYZToPrePlacePos(m_iCurrentBondIndex, bSync); };
	LONG ZSlowToPlacePos(bool bSync) { return ZSlowToPlacePos(m_iCurrentBondIndex, bSync); };

	//LONG ZEPZSyncUp(bool waitDone);//Z�Ͷ���Zͬ���岹����,���ȴ���ɴ�����
	LONG ZUpToInitPos(bool waitDone);


	/*LONG WaitYDone();
	LONG WaitZDone();*/

	//LONG WaitZTrigYToPlace(int index);
	//LONG SlowDownPlaceDie(bool waitDone);	//�Զ����̵���

private:
	//��ǰ�̾���Id
	UINT m_iCurrentBondIndex = NONE_POINT_INDEX;
	//��Ƭ��ǰλ��״̬
	PICK_STATUS m_ePickDieStatus = PICK_STATUS::NO_PICK;

	//CAxis* m_pXAxis = nullptr;
	CAxis* m_pYAxis = nullptr;
	CAxis* m_pZAxis = nullptr;
	CIO* m_pForcerDO = nullptr;
	CIO* m_pForcerAO = nullptr;
	//CAxis* m_pForceAxis = nullptr;
	CCoord* m_pZEPZCoord = nullptr;
	CCoord* m_pXYCrd = nullptr;

	CIO* m_pVacGpo = nullptr;
	CIO* m_pFlowGpo = nullptr;
	CIO* m_pVacGpi = nullptr;
	CIO* m_pFlowGpi = nullptr;

	CPRStrategy* m_pPR = nullptr;
	CNozzleTable* m_pNozzleTable = nullptr;
	CEjector* m_pEjector = nullptr;
	CTransferTable* m_pTransferTable = nullptr;
	CForceControl* m_pForceControl = nullptr;

	CBondMatrix* m_pBondMatrix = nullptr;
	//PICK_PARAM m_stPickParam;

	//λ�ò���
	double m_dSafePosX = 0;//��ȫλ��
	double m_dSafePosY = 0;
	double m_dSafePosZ = 0;
	double m_dInitPosR = 0;
	double m_dPickPosX = 0;  //ȡ��λ��
	double m_dPickPosY = 0;
	double m_dPlacePosX = 0;//����оƬ��λ��
	double m_dPlacePosY = 0;//
	double m_dEjHightPos = 0;
	double m_dEjContactPos = 0;//����Ӵ�λ
	double m_dYTrigZToBond = 0;
	double m_dYTrigZToPick = 0;
	double m_dZTrigYToPick = 0;
	double m_dZTrigYToBond = 0;

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

	//ͳ�Ʋ���
	int m_nTipUsedNum = 0;
	int m_nTipUsedMaxNum = 0;
	int m_nCurNozzleIndex; //��ǰ������������ϵı��

	//�ٶȡ���ʱ������
	double m_dPickSlowVel = 0;//����½ʰȡ�ٶ�
	double m_dPlaceSlowVel = 0;//����½�ž��ٶ�
	double m_dSearchForce = 0;
	double m_dHoldForce = 0;//������
	int m_nEjUpDelay = 0;//�����λ��ʱ ms

	double m_dGivenForceZPos = 0;

	double m_dNozzleTableOriginPosX = 0;
	double m_dNozzleTableOriginPosY = 0;
};