#pragma once
/*
	1������
	����X����������Y����������Z��������
*/

#include "CAxis.h"
#include "CAxis.h"
#include "CIO.h"
#include <string>
#include <vector>
#include <map>
#include "dt.h"
#include "CBondMatrix.h"
#include "CResources.h"
#include "CCoord.h"
#include "CError.h"
#include "FHConvert.h"
#include "CLog.h"
#include "SystemResources.h"
#include "CHardwareList.h"

using namespace std;
using namespace ns_db;


#pragma region �ᶨ��
//����ͷ
#define	 CUltraHead_X				"UltraHead_X"
#define	 CUltraHead_Y				"UltraHead_Y"
#define	 CUltraHead_Z				"UltraHead_Z"
#define	 CUltraHead_R				"UltraHead_R"
#define	 CUltraHead_Force			"UltraHead_Force"

#define	 BDX "BDX"
#define	 BDY "BDY"
#define	 BDZ "BDZ"
#define	 BDR "BDR"
#define	 BDForceZ "BDForceZ"
#define  WaferHeadX "WaferHeadX"
#define  WaferHeadY "WaferHeadY"
#define  WaferHeadZ "WaferHeadZ"
#define  WaferHeadForceZ "WaferHeadForceZ"
#define  WaffleHeadX "WaffleHeadX"
#define  WaffleHeadY "WaffleHeadY"
#define  WaffleHeadZ "WaffleHeadZ"
///�����///�����
#define  NuzzleAxisY "NuzzleAxisY"
 //��ת̨//��ת̨
#define  WaferCalibTableX "WaferCalibTableX"
#define  WaffleCalibTableX "WaffleCalibTableX"

//WaferTalbe//WaferTalbe
#define  WaferTable_X "WaferTable_X"
#define  WaferTable_Y "WaferTable_Y"
#define  WaferTable_Z "WaferTable_Z"
#define  WaferTable_R "WaferTable_R"
//BondTable//BondTable
#define  BondTableZ "BondTableZ"
//����//����
#define  EjectorX "EjectorX"
#define  EjectorY "EjectorY"
#define  EjectorZ "EjectorZ"
#define  EjectorPinZ "EjectorPinZ"

#pragma endregion

enum USE_TYPE {
	NOUSE = 0,
	DIAGNOSIS = 1,
	USE = 2
};
//typedef struct _AXIS_STRUCT
//{
//	string AxisName;			//������
//	USE_TYPE Use;					//0�����ã�1������
//	CAxis::AXIS_TYPE AxisType;			//Io����
//	UINT HomeTime;				//����ȴ�ʱ��(��)
//	UINT FastTime;				//���ٵȴ�ʱ��(��)
//	UINT MediumTime;			//���ٵȴ�ʱ��(��)
//	UINT SlowTime;				//���ٵȴ�ʱ��(��)
//	_AXIS_STRUCT(string name, USE_TYPE use, CAxis::AXIS_TYPE type, UINT homeTime, UINT slowTime, UINT mediumTime, UINT fastTime)
//	{
//		AxisName = name;
//		Use = use;
//		AxisType = type;
//		HomeTime = homeTime;
//		FastTime = fastTime;
//		MediumTime = mediumTime;
//		SlowTime = slowTime;
//	}
//}AXIS_STRUCT;

//const static map<AXIS_LIST, AXIS_STRUCT> g_mapAxisList = {
//	{BDX,AXIS_STRUCT("BondHead_X",USE_TYPE::USE,CAxis::AXIS_TYPE::X,100000,80000,50000,30000)},
//	{BDY ,AXIS_STRUCT("BondHead_Y",USE_TYPE::USE,CAxis::AXIS_TYPE::Y,100000,80000,50000,30000)},
//	{BDZ,AXIS_STRUCT("BondHead_Z",USE_TYPE::USE,CAxis::AXIS_TYPE::Z,100000,80000,50000,30000)},
//	{BDR,AXIS_STRUCT("BondHead_R",USE_TYPE::NOUSE,CAxis::AXIS_TYPE::R,100000,80000,50000,30000)},
//	{BDForceZ,AXIS_STRUCT("BondHead_ForceZ",USE_TYPE::NOUSE,CAxis::AXIS_TYPE::FORCE,10000,8000,5000,3000)},
//	{WaferHeadX,AXIS_STRUCT("WaferHead_X",USE_TYPE::NOUSE,CAxis::AXIS_TYPE::X,10000,8000,5000,3000)},
//	{WaferHeadY ,AXIS_STRUCT("WaferHead_Y",USE_TYPE::NOUSE,CAxis::AXIS_TYPE::Y,10000,8000,5000,3000)},
//	{WaferHeadZ,AXIS_STRUCT("WaferHead_Z",USE_TYPE::NOUSE,CAxis::AXIS_TYPE::Z,10000,8000,5000,3000)},
//	{WaferHeadForceZ,AXIS_STRUCT("WaferHead_ForceZ",USE_TYPE::NOUSE,CAxis::AXIS_TYPE::Z,10000,8000,5000,3000)},
//	{WaffleHeadX,AXIS_STRUCT("WaffleHead_X",USE_TYPE::NOUSE,CAxis::AXIS_TYPE::X,10000,8000,5000,3000)},
//	{WaffleHeadY ,AXIS_STRUCT("WaffleHead_Y",USE_TYPE::NOUSE,CAxis::AXIS_TYPE::Y,10000,8000,5000,3000)},
//	{WaffleHeadZ,AXIS_STRUCT("WaffleHead_Z",USE_TYPE::NOUSE,CAxis::AXIS_TYPE::Z,10000,8000,5000,3000)},
//	//�����
//	{NuzzleAxisY,AXIS_STRUCT("NuzzleAxis_Y",USE_TYPE::NOUSE,CAxis::AXIS_TYPE::Y,10000,8000,5000,3000)},
//	//��ת̨
//	{WaferCalibTableX,AXIS_STRUCT("WaferCalibTable_X",USE_TYPE::NOUSE,CAxis::AXIS_TYPE::X,10000,8000,5000,3000)},
//	{WaffleCalibTableX,AXIS_STRUCT("WaffleCalibTable_X",USE_TYPE::NOUSE,CAxis::AXIS_TYPE::X,10000,8000,5000,3000)},
//	
//	//WaferTalbe
//	{WaferTable_X,AXIS_STRUCT("WaferTable_X",USE_TYPE::NOUSE,CAxis::AXIS_TYPE::X,10000,8000,5000,3000)},
//	{WaferTable_Y,AXIS_STRUCT("WaferTable_Y",USE_TYPE::NOUSE,CAxis::AXIS_TYPE::Y,10000,8000,5000,3000)},
//	{WaferTable_Z,AXIS_STRUCT("WaferTable_Z",USE_TYPE::NOUSE,CAxis::AXIS_TYPE::Z,10000,8000,5000,3000)},
//	{WaferTable_R,AXIS_STRUCT("WaferTable_R",USE_TYPE::NOUSE,CAxis::AXIS_TYPE::R,10000,8000,5000,3000)},
//	//BondTable
//	{BondTableZ,AXIS_STRUCT("BondTable_Z",USE_TYPE::NOUSE,CAxis::AXIS_TYPE::R,10000,8000,5000,3000)},
//	//����
//	{EjectorX,AXIS_STRUCT("Ejector_X",USE_TYPE::NOUSE,CAxis::AXIS_TYPE::R,10000,8000,5000,3000)},
//	{EjectorY,AXIS_STRUCT("Ejector_Y",USE_TYPE::NOUSE,CAxis::AXIS_TYPE::R,10000,8000,5000,3000)},
//	{EjectorZ,AXIS_STRUCT("Ejector_Z",USE_TYPE::NOUSE,CAxis::AXIS_TYPE::R,10000,8000,5000,3000)},
//	{EjectorPinZ,AXIS_STRUCT("EjectorPin_Z",USE_TYPE::NOUSE,CAxis::AXIS_TYPE::R,10000,8000,5000,3000)},
//
//};

enum IO_LIST {
	BDVacDi,
	BDFlowDi,
	WaferHeadVacDi,
	WaferHeadFlowDi,
	WaferHeadFlowDo,
	WaffleHeadVacDi,
	WaffleHeadFlowDi,
	//BondTable
	PcbArriveDi,
	PcbLeaveDi,
	BondTableDo,
	//�����
	NozzleCylNDi,
	NozzleCylPDi,
	NozzleExistDi1,
	NozzleExistDi2,
	NozzleExistDi3,
	NozzleExistDi4,
	NozzleExistDi5,
	NozzleExistDi6,
	NozzleExistDi7,
	NozzleExistDi8,
	NozzleExistDi9,
	NozzleExistDi10,
	NozzleExistDi11,
	NozzleExistDi12,

	BDVacDo,
	BDFlowDo,
	WaferHeadVacDo,
	WaffleHeadVacDo,
	WaffleHeadFlowDo,
	//��ת̨
	WaferCalibVacDo,
	WaffleCalibVacDo,
	BDTableVacGpo,
	NozzleCylDo,

	WaferTable_Ring,

	EjectorVacDo,
	//����
	UltraHeadDo,


};

//typedef struct _IO_STRUCT
//{
//	string IoName;							//Io����
//	USE_TYPE Use;					//0�����ã�1������
//	IO_TYPE IoType;							//Io����
//	DIGIT_IO_LEVEL FirstStatus;				//����Io�ij�ʼ״̬
//	_IO_STRUCT(string name, USE_TYPE use, IO_TYPE type, DIGIT_IO_LEVEL status)
//	{
//		IoName = name;
//		Use = use;
//		IoType = type;
//		FirstStatus = status;
//	}
//	_IO_STRUCT(string name, USE_TYPE use, IO_TYPE type)
//	{
//		IoName = name;
//		Use = use;
//		IoType = type;
//		FirstStatus = DIGIT_IO_LEVEL::NUL;
//	}
//}IO_STRUCT;
//
//const static map<IO_LIST, IO_STRUCT> g_mapIoList = {
//	{BDVacDi,IO_STRUCT("BDVacDi",USE_TYPE::NOUSE,IO_TYPE::DI,DIGIT_IO_LEVEL::LOW)},
//	{BDFlowDi,IO_STRUCT("BDFlowDi",USE_TYPE::NOUSE,IO_TYPE::DI,DIGIT_IO_LEVEL::LOW)},
//	{BDVacDo,IO_STRUCT("BDVacDo",USE_TYPE::NOUSE,IO_TYPE::DO,DIGIT_IO_LEVEL::LOW)},
//	{BDFlowDo,IO_STRUCT("BDFlowDo",USE_TYPE::NOUSE,IO_TYPE::DO,DIGIT_IO_LEVEL::LOW)},
//	{UltraHeadDo,IO_STRUCT("UltraHeadDo",USE_TYPE::NOUSE,IO_TYPE::DO,DIGIT_IO_LEVEL::LOW)},
//
//	{WaferHeadVacDi,IO_STRUCT("WaferHeadVacDi",USE_TYPE::NOUSE,IO_TYPE::DI,DIGIT_IO_LEVEL::LOW)},
//	{WaferHeadFlowDi,IO_STRUCT("WaferHeadFlowDi",USE_TYPE::NOUSE,IO_TYPE::DI,DIGIT_IO_LEVEL::LOW)},
//	{WaferHeadFlowDo,IO_STRUCT("WaferHeadFlowDo",USE_TYPE::NOUSE,IO_TYPE::DI,DIGIT_IO_LEVEL::LOW)},
//	{WaffleHeadVacDi,IO_STRUCT("WaffleHeadVacDi",USE_TYPE::NOUSE,IO_TYPE::DI,DIGIT_IO_LEVEL::LOW)},
//	{WaffleHeadFlowDi,IO_STRUCT("WaffleHeadFlowDi",USE_TYPE::NOUSE,IO_TYPE::DI,DIGIT_IO_LEVEL::LOW)},
//	//BondTable
//	{PcbArriveDi,IO_STRUCT("PcbArriveDi",USE_TYPE::NOUSE,IO_TYPE::DI,DIGIT_IO_LEVEL::LOW)},
//	{PcbLeaveDi,IO_STRUCT("PcbLeaveDi",USE_TYPE::NOUSE,IO_TYPE::DI,DIGIT_IO_LEVEL::LOW)},
//	{BondTableDo,IO_STRUCT("BondTableDo",USE_TYPE::NOUSE,IO_TYPE::DI,DIGIT_IO_LEVEL::LOW)},
//	//�����
//	{NozzleCylNDi,IO_STRUCT("NozzleCylNDi",USE_TYPE::NOUSE,IO_TYPE::DI,DIGIT_IO_LEVEL::LOW)},
//	{NozzleCylPDi,IO_STRUCT("NozzleCylPDi",USE_TYPE::NOUSE,IO_TYPE::DI,DIGIT_IO_LEVEL::LOW)},
//	
//	{WaferHeadVacDo,IO_STRUCT("WaferHeadVacDo",USE_TYPE::NOUSE,IO_TYPE::DO,DIGIT_IO_LEVEL::LOW)},
//	{WaffleHeadVacDo,IO_STRUCT("WaffleHeadVacDo",USE_TYPE::NOUSE,IO_TYPE::DO,DIGIT_IO_LEVEL::LOW)},
//	{WaffleHeadFlowDo,IO_STRUCT("WaffleHeadFlowDo",USE_TYPE::NOUSE,IO_TYPE::DO,DIGIT_IO_LEVEL::LOW)},
//	//��ת̨
//	{WaferCalibVacDo,IO_STRUCT("WaferCalibVacDo",USE_TYPE::NOUSE,IO_TYPE::DO,DIGIT_IO_LEVEL::LOW)},
//	{WaffleCalibVacDo,IO_STRUCT("WaffleCalibVacDo",USE_TYPE::NOUSE,IO_TYPE::DO,DIGIT_IO_LEVEL::LOW)},
//	{BDTableVacGpo,IO_STRUCT("BDTableVacGpo",USE_TYPE::NOUSE,IO_TYPE::DO,DIGIT_IO_LEVEL::LOW)},
//	{NozzleCylDo,IO_STRUCT("NozzleCylDo",USE_TYPE::NOUSE,IO_TYPE::DO,DIGIT_IO_LEVEL::LOW)},
//
//	{WaferTable_Ring,IO_STRUCT("WaferTable_Ring",USE_TYPE::NOUSE,IO_TYPE::DI,DIGIT_IO_LEVEL::LOW)},
//
//	{EjectorVacDo,IO_STRUCT("EjectorVacDo",USE_TYPE::NOUSE,IO_TYPE::DO,DIGIT_IO_LEVEL::LOW)},
//
//	
//};

class __declspec(dllexport) CModule
{
public:
	CModule(MODULE_LIST eModuleType);
	LONG Init();

	bool IsInitSuccess() {return m_bIsInitSuccess;}
	LONG GetModuleType() const { return m_nModuleType; }
	string GetModuleName() const { return m_strModuleName; }

	virtual LONG AllocateIo(vector<CIO*> vecIo) { return OK; };
	virtual LONG AllocateAxis(vector<CAxis*> vecAxis) { return OK; };

	virtual LONG GetParam() = 0;												//��ȡ���ò���
	virtual LONG SetParam() = 0;												//��������
	virtual LONG ToHome() = 0;													//����
	virtual LONG Sync() = 0;													//�ȴ���λ
	virtual LONG ToSafePosition() = 0;											//ģ��ȥ��ȫλ��
	virtual LONG InitResource() = 0;											//�����ᡢIO���궨����Դ
	virtual void SetDataChangFunction() = 0;									//�����յ����ݸ���֪ͨ��������,�󶨻ص�����
	virtual void DataChangNotice(string strDbName, string strTableName) = 0;	//�ص�������������

	LONG SaveDataToDB();

protected:
	vector<MODULE_CONFIG_STRUCT>* GetConfigVector() { return &m_vecConfig; }

protected:
	CManageDB* m_pCManageDB = nullptr;
	CModuleConfig* m_pModuleConfigDB = nullptr;
	CHardware* m_pCHardware = nullptr;
	vector<MODULE_CONFIG_STRUCT> m_vecConfig;

	bool m_bIsInitSuccess = false;
	INT m_nModuleType = 0;
	string m_strModuleName = "";
	//ģ���Ƿ�����
	bool m_bEnable = false;
};