#pragma once
#include "dt.h"
#include "IIO.h"
#include "CHardware.h"
#include <string>
#include <memory>

#ifdef C_IO_EXPORTS
#define C_IO_DLL_API __declspec(dllexport)
#else
#define C_IO_DLL_API //__declspec(dllimport)
#endif

class C_IO_DLL_API CIO
{
public:
	typedef struct
	{
		CIO* pClass;
		HANDLE hEvent;
		ns_db::DIGIT_IO_LEVEL level;
		ULONG lDleay;
		bool bRestore;
	} THREAD_CONFIG_STRUCT; 
private:
	ns_db::IO_CONFIG_STRUCT m_stIoConfig;
	bool m_bEnable = false;
	bool m_bIsInitSuccess = false;

	HANDLE m_hEvent = NULL;
	CDigitInput* m_pDi = nullptr;
	CDigitOutput* m_pDo = nullptr;
	CDigitInputS* m_pDis = nullptr;
	CDigitOutputS* m_pDos = nullptr;
	CAnalogOutput* m_pAo = nullptr;
	CAnalogInput* m_pAi = nullptr;

public:
	CIO();
	LONG Init(ns_db::IO_CONFIG_STRUCT stIoConfig, void* pIO);
	string GetUtility();
	string GetName();
	string GetModuleType();

	LONG GetIo(ns_db::DIGIT_IO_LEVEL& nOutput);
	LONG GetIo(short & nOutput);
	LONG SetIo(ns_db::DIGIT_IO_LEVEL nOutput);
	LONG SetIo(short nOutput);


	//����IOΪ�ߵ�ƽ�����lDelay>0ʱ������ʱlDelay������Զ��ָ�Ϊ����ǰ״̬��
	//bRestoreʱ�䵽���Ƿ�ָ������lDelay<=0,bRestore������
	LONG SetIo2LevelHigh(LONG lDelay,bool bRestore = false);
	//����IOΪ�ߵ�ƽ�����lDelay>0ʱ������ʱlDelay������Զ��ָ�Ϊ����ǰ״̬��
	//bRestoreʱ�䵽���Ƿ�ָ������lDelay<=0,bRestore������
	LONG SetIo2LevelLow(LONG lDelay, bool bRestore = false);
	//�ȴ�����Io�߳����
	LONG WaitSetIoThreadDone();
	static VOID CALLBACK threadSetIo(PTP_CALLBACK_INSTANCE Instance, PVOID Parameter, PTP_WORK Work);
};