#pragma once
#include "CModule.h"
#include "CCameraBase.h"
#include "CNozzleTable.h"
#include "CWafflePackMatrix.h"
#include "CXYCalib.h"
#include "CRCalib.h"
#include "CLookUpCalib.h"
#include "CPRStrategy.h"
#include "TipMatrix.h"
//#include "CBondMatrix.h"


class __declspec(dllexport) CWafflePackHead :
    public CModule
{
public:
    CWafflePackHead(MODULE_LIST ModuleType);
	~CWafflePackHead();

	void SetCamera(CCameraBase* camera) { m_pCamera = camera; }
	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;
	virtual void DataChangNotice(string strDbName, string strTableName) override;	//�ص�������������

	void SetXAxis(CAxis* axis) { m_pXAxis = axis; }
	void SetYAxis(CAxis* axis) { m_pYAxis = axis; }
	void SetZAxis(CAxis* axis) { m_pZAxis = axis; }
	void SetNozzleTable(CNozzleTable* nozzleTable) { m_pNozzleTable = nozzleTable; }

	void SetCoord(CCoord* pCrd) { m_pCoord_XY = pCrd; }

	CXYCalib* GetCameraCalib() { return m_pXYCalib; }
	CCTDCalib* GetCTDCalib() { return m_pCTDCalib; }

	void SetVacDO(CIO* out) { m_pVacGpo = out; }
	//void SetFlowDo(CDigitOutput* out) { m_pFlowGpo = out; }
	void SetVacDi(CIO* input) { m_pVacGpi = input; }
	void SetFlowDi(CIO* input) { m_pFlowGpi = input; }

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


	//�Զ���
	LONG CheckDieExistStatus(bool& bExist);
	LONG VacuumOn();						//��տ�
	LONG VacuumOff();						//��չ�	

	LONG WaitZTrigXYToGrabPos();
	//�����index���ڰ󶨾����е�оƬ���
	LONG PickDie(int dieIndex, bool waitDone =true );
	//����Ԥȡ��λ�����ж���ת̨�Ƿ�λ
	LONG MoveToPrePlacePos(bool waitDone);
	LONG SlowDownPlaceDie(int DieIndex, bool waitDone);//�������,��

	//��������ڱ�̾���ԭ���λ�ã����Ǿ�����������λ��
	LONG GetCurPickPos(int dieIndex, XY_DOUBLE_STRUCT& point);
	LONG MoveToGrabPos(XY_DOUBLE_STRUCT relDiePos, bool waitDone);
	LONG PickGrab(int index, XY_DOUBLE_STRUCT posOffset);
	LONG MoveToPrePickPos(XY_DOUBLE_STRUCT relDiePos, bool waitDone);
	LONG ZSlowDownPick(int index, bool waitDone);
	LONG ZUpToInitPos(bool waitDone);//ȡ�Ź���
	LONG WaitZTrigXYToPlacePos();
	LONG ZSlowDownPlace(int index, bool waitDone);//ֻ���ᶯ

private:
	CAxis* m_pXAxis = nullptr;
	CAxis* m_pYAxis = nullptr;
	CAxis* m_pZAxis = nullptr;
	CCameraBase* m_pCamera = nullptr;

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

	CCoord* m_pCoord_XY = nullptr;

	PICK_PARAM m_stPickParam;
	CPRStrategy* m_pPR = nullptr;
	CNozzleTable* m_pNozzleTable = nullptr;
	CWafflePackMatrix* m_pPointMatrix = nullptr;
	CBondMatrix* m_pBondMatrix = nullptr;
	//�궨����
	CXYCalib* m_pXYCalib = nullptr;
	CCTDCalib* m_pCTDCalib = nullptr;

	TipMatrix* m_pTipMatrix = nullptr;

	//λ�ò���
	double m_dSafePosX = 0;//��ȫλ��
	double m_dSafePosY = 0;
	double m_dSafePosZ = 0;
	double m_dInitPosR = 0;
	double m_dPickOriginPosX = 0;  //����о���ȡ��λ�ã����λ��
	double m_dPickOriginPosY = 0;
	double m_dPlacePosX = 0;//����оƬ��λ��
	double m_dPlacePosY = 0;//����
	double m_dYTrigZToBond = 0;
	double m_dYTrigZToPick = 0;
	double m_dZTrigYToPick = 0;
	double m_dZTrigYToBond = 0;

	double m_dPreChangeNozzleDisY = 0;//Ԥ��������ƫ��λ��
	double m_dNozzlePosZ = 0;		  //������Z
	double m_dNozzlePosY = 0;//������Y
	int m_nCurNozzleIndex = 0; //��ǰ������������ϵı��

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

	double m_dPickSlowVel = 0;//����½ʰȡ�ٶ�
	double m_dPlaceSlowVel = 0;//����½�ž��ٶ�


	//������ȫ������ϵת��
	double m_dNozzleTableOriginPosX = 0;
	double m_dNozzleTableOriginPosY = 0;
};