//Step�������ݲ����ࡣ�����࣬���ڱ����Stepִ�к������
#pragma once
#pragma warning(disable:4251)

#include <string>
#include <map>
#include <iostream>
#include <mutex>
#include <iostream>
#include <ctime>
#include <random>
#include "windows.h"

#include "CManageDB.h"

using namespace ns_db;
using namespace std;

typedef enum
{
	WAFER_PICK_CURRENT_INDEX = 1,					//��Բ̨��ȡ���̵߳�ǰ�̾���id
	WAFFLE_PICK_CURRENT_INDEX,						//��Բ̨��ȡ���̵߳�ǰ�̾���id
	BOND_CURRENT_INDEX,								//�̾��̵߳�ǰ�̾���id

	WAFER_TRANSFER_TABLE_EXIST_DIE,					//��Բ̨����ת̨�Ƿ���ھ�Ƭ
	WAFFLE_TRANSFER_TABLE_EXIST_DIE,				//����в���ת̨�Ƿ���ھ�Ƭ

	WAFER_TABLE_ALLOW_SEARCH_DIE,					//��Բ̨�����Ѿ�
	WAFER_TABLE_SEARCH_DIE_DONE,					//��Բ̨�Ѿ����
	RIGHT_PICK_HEAD_IN_SAFE_POSITION,				//��Բ̨��ȡ��ͷ���ڰ�ȫλ��
	LEFT_PICK_HEAD_IN_SAFE_POSITION,				//����в�ȡ��ͷ���ڰ�ȫλ��
	BOND_HEAD_BY_RIGHT_SAFE,						//�̾�ͷ������ұ߰�ȫλ��
	BOND_HEAD_BY_LEFT_SAFE,							//�̾�ͷ�������߰�ȫλ��

	ENABLE_LOOKUP_GRAB,								//�Ƿ�ʹ���������ղ���

	WAFER_NEED_BOND_DIE_NUM,						//����в�ȡ��ͷ��̾�Ƭ����
	WAFFLE_NEED_BOND_DIE_NUM,						//��Բ̨ȡ��ͷ����̾�Ƭ����
	BOND_THREAD_NEED_BOND_DIE_NUM,					//�̾�ͷ��̾�Ƭ����

	WAFER_PICKED_DIE_NUM,							//��Բ̨��ȡ������
	WAFFLE_PICKED_DIE_NUM,							//�������ȡ������
	BONDED_DIE_NUM,									//�Ѿ��̾�����

	AUTO_BOND_PCB_TOTAL,							//��ǰ�Զ��̾�PCB����

	//WAFER_PCB_PICKED_DIE_NUM,							//��Բ̨��ǰPCB��ȡ������
	//WAFFLE_PCB_PICKED_DIE_NUM,							//����е�ǰPCB��ȡ������
	//PCB_BONDED_DIE_NUM,									//��ǰPCB�Ѿ��̾�����

	MAX_PARAM_NAME
}PARAM_NAME_ID;

const map<PARAM_NAME_ID, string> m_mapParamNameIdToString = {
	{ WAFER_PICK_CURRENT_INDEX, "WAFER_PICK_CURRENT_INDEX" },
	{ WAFFLE_PICK_CURRENT_INDEX, "WAFFLE_PICK_CURRENT_INDEX" },
	{ BOND_CURRENT_INDEX, "BOND_CURRENT_INDEX" },
	{ WAFER_TRANSFER_TABLE_EXIST_DIE, "WAFER_TRANSFER_TABLE_EXIST_DIE" },
	{ WAFFLE_TRANSFER_TABLE_EXIST_DIE, "WAFFLE_TRANSFER_TABLE_EXIST_DIE" },
	//{ BOND_THREAD_CURRENT_PT_ATTRIBUTE, "BOND_THREAD_CURRENT_PT_ATTRIBUTE" },
	{ WAFER_TABLE_ALLOW_SEARCH_DIE, "WAFER_TABLE_ALLOW_SEARCH_DIE" },
	{ WAFER_TABLE_SEARCH_DIE_DONE, "WAFER_TABLE_SEARCH_DIE_DONE" },
	{ RIGHT_PICK_HEAD_IN_SAFE_POSITION, "RIGHT_PICK_HEAD_IN_SAFE_POSITION" },
	{ LEFT_PICK_HEAD_IN_SAFE_POSITION, "LEFT_PICK_HEAD_IN_SAFE_POSITION" },
	{ BOND_HEAD_BY_RIGHT_SAFE, "BOND_HEAD_BY_RIGHT_SAFE" },
	{ BOND_HEAD_BY_LEFT_SAFE, "BOND_HEAD_BY_LEFT_SAFE" },
	{ ENABLE_LOOKUP_GRAB, "ENABLE_LOOKUP_GRAB" },
	{ WAFER_NEED_BOND_DIE_NUM, "WAFER_NEED_BOND_DIE_NUM" },
	{ WAFFLE_NEED_BOND_DIE_NUM, "WAFFLE_NEED_BOND_DIE_NUM" },
	{ BOND_THREAD_NEED_BOND_DIE_NUM, "BOND_THREAD_NEED_BOND_DIE_NUM" },

	{WAFER_PICKED_DIE_NUM,"WAFER_PICKED_DIE_NUM"},
	{WAFFLE_PICKED_DIE_NUM,"WAFFLE_PICKED_DIE_NUM"},
	{BONDED_DIE_NUM,"BONDED_DIE_NUM"},

	{ AUTO_BOND_PCB_TOTAL, "AUTO_BOND_PCB_TOTAL" }
};


#define SET_STEP_STATUS CStaticStepData::GetInstance()->SetStatus 
#define WAIT_STEP_STATUS CStaticStepData::GetInstance()->WaitStatus 

class  __declspec(dllexport) CStaticStepData
{
#define STEP_PUBLIC_TABLE_NAME "StepPublicData"
private:
	//��ʼ���ɹ���־
	bool m_bIsInitSuccess;
	vector<STEP_PUBLIC_DATA>  m_mapStepPublicData;

	static CStaticStepData* m_pInstance;
	static std::mutex m_SaveDataMutex;
	CProduct* m_pCProduct;
	CStaticStepData();

public:
	static CStaticStepData* GetInstance();

	//����Step��������
	long SetStepPublicData(PARAM_NAME_ID id, string value);
	//��ȡStep��������
	long GetStepPublicData(PARAM_NAME_ID id, string& value);
	//����Step��������
	long SetStepPublicData(PARAM_NAME_ID id, bool value);
	//��ȡStep��������
	long GetStepPublicData(PARAM_NAME_ID id, bool& value);
	//����Step��������
	long SetStepPublicData(PARAM_NAME_ID id, int value);
	//��ȡStep��������
	long GetStepPublicData(PARAM_NAME_ID id, int& value);
	//����Step��������
	long SetStepPublicData(PARAM_NAME_ID id, unsigned int value);
	//��ȡStep��������
	long GetStepPublicData(PARAM_NAME_ID id, unsigned int& value);
	//����Step��������
	long SetStepPublicData(PARAM_NAME_ID id, long value);
	//��ȡStep��������
	long GetStepPublicData(PARAM_NAME_ID id, long& value);
	//����Step��������
	long SetStepPublicData(PARAM_NAME_ID id, double value);
	//��ȡStep��������
	long GetStepPublicData(PARAM_NAME_ID id, double& value);

	//����Step�������ݵ����ݿ�
	long StepPublicDataMapToDataBase();
	//�����ݿ��м���Step��������
	long StepPublicDataDataBaseToMap();

	bool IsInitSuccess(); //�Ƿ��ʼ���ɹ�

	//����Stepִ�й�����״̬
	LONG SetStatus(PARAM_NAME_ID id, bool bStatus);
	//�ȴ�״̬
	LONG WaitStatus(PARAM_NAME_ID id, bool bStatus);
};