#pragma once // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 LOGICDEVICE_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 // LOGICDEVICE_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的 // 符号视为是被导出的。 #ifndef LOGICDEVICE_EXPORTS #ifdef _WIN64 #ifdef _DEBUG #pragma comment(lib, "LogicDeviceX64D.lib") #else #pragma comment(lib, "LogicDeviceX64.lib") #endif #else #ifdef _DEBUG #pragma comment(lib, "LogicDeviceD.lib") #else #pragma comment(lib, "LogicDevice.lib") #endif #endif #endif #ifdef LOGICDEVICE_EXPORTS #define LOGICDEVICE_API __declspec(dllexport) #else #define LOGICDEVICE_API __declspec(dllimport) #endif #include #include "Definitions.h" #include "ResDataObject.h" #include "logger.h" #include "DPC.h" #include "DiosLock.h" //#ifndef GUID //typedef struct _GUID { // unsigned int Data1; // unsigned int Data2; // unsigned int Data3; // char Data4[8]; //} GUID; //#endif class LogicDevice; class LOGICDEVICE_API LogicDeviceSysIF { protected: LogicDevice *m_pLogicDev; public: LogicDeviceSysIF(void); virtual ~LogicDeviceSysIF(void); //init void SetLogicDevice(LogicDevice *p); LogicDevice* GetLogicDevice(); //Command In and Out //notify from lower layer virtual RET_STATUS HW_ACTION CmdFromLogicDev(ResDataObject PARAM_IN *pCmd); //notify to lower layer virtual RET_STATUS SYSTEM_CALL CmdToLogicDev(ResDataObject PARAM_IN *pCmd); }; class LOGICDEVICE_API LogicDevice : public DiosLock { //friend class LogicDeviceSysIF; LogicDeviceSysIF *m_pSysLogic; protected: Logger *m_pLogger; char *m_pDevInstance; ResDataObject *m_pResErrorList; HANDLE m_EvtNotify;//此事件的目的是当本地有事件发生,而这事件需要要往上传递,需要驱动线程主动下来GET. DriverDPC *m_pDrvDPC;//设备对象的HOST public: LogicDevice(void); virtual ~LogicDevice(void); //1. init part void SYSTEM_CALL SetSysLogicDevice(LogicDeviceSysIF PARAM_IN *pLogic); void SYSTEM_CALL SetLogHandle(Logger PARAM_IN *pLogger); //2. common part Logger *GetLogHandle(); void SetDrvDPC(DriverDPC *pDPC); DriverDPC *GetDrvDPC(); HANDLE GetEvtHandle(); void NotifyDrvThread(); virtual RET_STATUS SYSTEM_CALL EvtProcedure();//m_EvtNotify事件发生后,由上层驱动线程进行调入. //use windows Thread Priorities //THREAD_PRIORITY_NONE (use common thread) //THREAD_PRIORITY_IDLE (use independent thread with priority) //THREAD_PRIORITY_LOWEST (...) //THREAD_PRIORITY_BELOW_NORMAL(...) //THREAD_PRIORITY_NORMAL(...) //THREAD_PRIORITY_ABOVE_NORMAL(...) //THREAD_PRIORITY_HIGHEST (...) //THREAD_PRIORITY_TIME_CRITICAL(...) virtual int SYSTEM_CALL GetDevice_Thread_Priority();//return THREAD_PRIORITY_NONE //get device type,returns device type GUID virtual bool SYSTEM_CALL GetDeviceType(GUID &DevType) = 0; virtual void SYSTEM_CALL CompleteInit(); virtual void SYSTEM_CALL CompleteUnInit(); //get device resource virtual RET_STATUS SYSTEM_CALL GetDeviceResource(ResDataObject PARAM_OUT *pDeviceResource); //3. command //normal sync routine,Request to device and response from device virtual RET_STATUS SYSTEM_CALL Request(ResDataObject PARAM_IN *pRequest, ResDataObject PARAM_OUT *pResponse) = 0; //upper layer ------------------------------> lower layer //app -> service -> framework -> logicdevice -> hw //notify to lower layer virtual RET_STATUS SYSTEM_CALL CmdToLogicDev(ResDataObject PARAM_IN *pCmd) = 0; //notify from lower layer RET_STATUS HW_ACTION CmdFromLogicDev(ResDataObject PARAM_IN *pCmd); virtual RET_STATUS HW_ACTION AddErrorMessage(const char* DevInstance, const char* Code, int &Level, const char* ResInfo, const char* Description, int nMessageType = 0); virtual RET_STATUS HW_ACTION AddErrorMessage(const char* Code, int &Level, const char* ResInfo, int nMessageType = 0); virtual RET_STATUS HW_ACTION DelErrorMessage(const char* DevInstance, const char* Code, int &Level, const char* ResInfo, const char* Description, int nMessageType = 0); virtual RET_STATUS HW_ACTION DelErrorMessage(const char* Code, int &Level, const char* ResInfo, int nMessageType = 0); };