#pragma once
#include <vector>
#define HIKVISION_CAMERA_EXPORTS
#include "CCameraManage.h"
#include "CModule.h"
#include "CCalib.h"
#include "CBondHead.h"
#include "CXYCalib.h"
#include "CHIKVisionCamera.h"
#include "CWafflePackHead.h"
#include "CWaferTable.h"
#include "JMotion.h"
#include "CTransferTable.h"
#include "CBondTable.h"
#include "CNozzleTable.h"
#include "CForceControl.h"
#include "VerticalMeasure.h"
#include "HorizMeasure.h"
#include "CAxis.h"
#include "CWafflePackHead.h"
#include "CWaferHead.h"
#include "CUltraHead.h"
#include "CEutecticHead.h"

#ifdef C_MACHINE_EXPORTS
#define C_MACHINE_DLL_API __declspec(dllexport)
#else
#define C_MACHINE_DLL_API //__declspec(dllimport)
#endif

/*	
	��ʼ�����̣�
	1�������˿ؿ���󣬴��������ᡢIO
	2��������Դ���࣬������Դ�����е�������Դ
	3������ģ����󣬴����������ᡢIO�������õ�ģ����
	4�����������������ر궨��ʹ�ö��󣨸�����������������������ֱ��������ˮƽ��������
	ע������ˮƽ����Ҳ��Ҫʹ�úʹ�ֱ������ʹ���˲�ߣ���Ҫʹ�����ر궨�����������ر궨������Machine�д������ٽ�����ָ�������ģ��
	ע����������ģ���в������ٴ�ʹ�ã���Ϊ���ڻ�̨��������ģ��
	5����ʼ��ģ�飺
	��1����ʼ����Դ��������ģ����Ҫ�Ĺ��ܶ��󣬰����岹���󡢱궨������Ҫ�ᡢ���,�޷��ڹ��캯����������PR���ԣ���Ҫ�ᡢ��������������ݵ�
	��2�������ݿ⿽��һ�����ݱ��浽�����У�������ģ����������������ݼ���
	Machine����Ϊ�ǻ�̨���࣬���ڻ�̨������ģ����ᡢIO������Ҳ��Machine���д����Ϳ��ơ����Ƿ�Ӧ�ü̳�Module��
*/

class C_MACHINE_DLL_API Machine
{
public:
	enum HeadType
	{
		UltralHead,		//����ͷ
		EutecticHead,	//����ͷ
	};
	static Machine* GetInstance();
	static void releaseInstance();
	JMotion* GetMotion() {return m_pMotion;}

	LONG ToHome();

	vector<CAxis*> GetMachineAllAxis() {return m_vetAxis;};
	CBondHead* GetBondHead() {return m_pBondHead;}
	//CUltraHead* GetUltraHead() { return m_pBondHead; };
	CBondTable* GetBondTable() { return m_pBondTable; }
	//CEutecticHead* GetEutecticHead() { return m_pEutecticHead; }
	
	CTransferTable* GetWaferCalibTable() { return m_pWaferTransferTable; }
	CTransferTable* GetWaffleCalibTable() { return m_pWaffleTransferTable; }
	CNozzleTable* GetNozzleTable() { return m_pNozzleTable; }
	//CForceControl* GetBHForce() { return m_pBondHeadForce; }
	//CForceControl* GetWaferForce() { return m_pWaferHeadForce; }
	CVerticalMeasure* GetVerticalMeasure() { return m_pVerMeasure; }
	CHorizMeasure* GetHorizMeasure() { return m_pHorizMeasure; }
	CWafflePackHead* GetWafflePackHead() { return m_pWaffleHead; }
	CWaferHead* GetWaferHead() { return m_pWaferHead; };
	CWaferTable* GetWaferTable() { return m_pWaferTable; }
	CResources* GetResources() { return m_pResource; };
	//AxesMapPage* GetMotionAxesMapPage(){
	//	return m_pMotion->getMapPage();
	//}
	JMotion* GetJMotion() {
		return m_pMotion;
	}

	CXYCalib* GetBondHeadHighCameraCalib() {
		switch (Machine::m_eHeadType)
		{
			case Machine::HeadType::UltralHead:
				return nullptr;
			case Machine::HeadType::EutecticHead:
				return m_pBondHead->GetHighCameraCalib();
			default:
				return nullptr;
				break;
		}
	}
	CXYCalib* GetBondHeadLowCameraCalib() { return m_pBondHead->GetLowCameraCalib(); }
	CXYCalib* GetLookUpCameraCalib() { return m_pBondHead->GetLookUpCameraCalib(); }
	CXYCalib* GetWaferCameraCalib() { return m_pWaferTable->GetWaferXYCalib(); }
	CXYCalib* GetWafflePackCameraCalib() { return m_pWaffleHead->GetCameraCalib(); }
	CCTDCalib* GetWafflePackCTDCalib() { return m_pWaffleHead->GetCTDCalib(); }
	CRCalib* GetBondHeadRCalib() { return m_pBondHead->GetHeadRCalib(); }

	bool GetInitSuccess() { return m_bIsInitSuccess; }
	HeadType GetHeadType() { return m_eHeadType; }
	void SetHeadType(HeadType type) { m_eHeadType = type; }
	LONG MoveToSafePosition() { return OK; };
	LONG load();
	LONG save();

private:
	Machine();
	~Machine();

	LONG CreateModules();
	void CreateMeasures();
	LONG InitModules();
	void AllocModule();//����ģ�鶼������ɺ���ã���ģ��ָ����������ģ��
	void ReleaseAxisAndIo();
	LONG CreatAllAxis();
	LONG CreatAllIo();
	LONG CreatAllCoord();
	bool GetAxisByMotion(string name, CAxis * *pAxis);
	bool GetIoByMotion(IO_LIST name, CIO * *pIo);
	bool GetCoordByMotion(COORD_LIST type, CCoord * *pCoord);

	
private:
	static Machine* m_instance;
	vector<CAxis*> m_vetAxis;

	vector<CIO*> m_vetIO;
	vector<CCoord*> m_vetCoord;
	vector<CModule*> m_vetModules;

	CBondHead* m_pBondHead = nullptr;
	//CEutecticHead* m_pEutecticHead = nullptr;
	//CUltraHead* m_pUltraHead = nullptr;
	CWafflePackHead* m_pWaffleHead = nullptr;
	CWaferTable* m_pWaferTable = nullptr;
	CWaferHead* m_pWaferHead = nullptr;
	CEjector* m_pEjector = nullptr;
	CTransferTable* m_pWaferTransferTable = nullptr;
	CTransferTable* m_pWaffleTransferTable = nullptr;
	CBondTable* m_pBondTable = nullptr;
	CNozzleTable* m_pNozzleTable = nullptr;

	CForceControl* m_pBondHeadForce = nullptr;
	CForceControl* m_pWaferHeadForce = nullptr;
	//�����ڲ���
	CVerticalMeasure* m_pVerMeasure = nullptr;
	CHorizMeasure* m_pHorizMeasure = nullptr;
	//�˿ؽӿ�
	JMotion* m_pMotion = nullptr;
	//��������ӿ�
	CCameraManage* m_pCameraManage = nullptr;
	CResources* m_pResource = nullptr;
	CManageDB* pCManageDB = nullptr;

	bool m_bIsInitSuccess = false;
	bool    m_bMotionEnable = true;               //�˿ؿ���ֹ/����
	HeadType m_eHeadType = HeadType::UltralHead;
	CHardware* m_pCHardware = nullptr;

	
};