// 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 IMDDPC_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 // IMDDPC_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的 // 符号视为是被导出的。 #pragma once #ifndef IMDDPC_EXPORTS #ifdef _WIN64 #ifdef _DEBUG #pragma comment(lib, "SDCDoseDPCX64D.lib") #else #pragma comment(lib, "SDCDoseDPCX64.lib") #endif #else #ifdef _DEBUG #pragma comment(lib, "SDCDoseDPCD.lib") #else #pragma comment(lib, "SDCDoseDPC.lib") #endif #endif #endif #define PARAM_IN_TYPE #ifdef IMDDPC_EXPORTS #define GENDPC_API __declspec(dllexport) #else #define GENDPC_API __declspec(dllimport) #endif #include "LogicDriver.h" #include "SerialSCF.h" //#include "DoseOemDevice.h" #include "GenIMD_Dose.h" #include "common_api.h" //#include "SyncGenOEM.h" #include "GenIMD_Logical.h" #include "MACHINE_Logical.h" #include "diosthread.h" //#include "afxmt.h" //extern "C" GENDPC_API DPC* GetDPC(); //extern "C" GENDPC_API void ReleaseDPC(DPC *p); extern "C" GENDPC_API DriverDPC* GetDriverDPC(); extern "C" GENDPC_API void ReleaseDriverDPC(DriverDPC *p); // 此类是从 SDCDoseDPC.dll 导出的 class GENDPC_API GenImd_DPC : public LogicDriver { std::string *m_pWorkpath; public: GenImd_DPC(void); virtual ~GenImd_DPC(void); //virtual bool DpcEntry(ResDataObject &Configuration); //virtual ResDataObject GetConnectionType(); //virtual bool Connect(ResDataObject &Connection); //virtual bool Probe(ResDataObject &HardwareInfo); //virtual bool SetWorkPath(const char *pWorkPath); ////virtual LogicDevice* LoadLogicDevices(); //virtual PVOID LoadLogicDevices(); //virtual void UnloadLogicDevices(/*LogicDevice*/PVOID p); //virtual bool DisConnect(); //virtual bool OnNotify(HANDLE ExitNotify); /////////////////////////////////////////////////////// virtual bool DriverEntry(ResDataObject &Configuration); virtual bool Driver_Probe(ResDataObject &HardwareInfo); virtual bool SYSTEM_CALL SetDriverWorkPath(const char * PARAM_IN pWorkPath); virtual PVOID SYSTEM_CALL LoadDriver();//无根节点 virtual void SYSTEM_CALL UnloadDriver(); //virtual bool OnNotify(HANDLE ExitNotify); virtual DWORD SYSTEM_CALL OnNotify(HANDLE evtList[], DWORD count); virtual bool Connect(); virtual void DisConnect(); //给硬件驱动设置Unique工作路径 //如果是同一设备同一连接情况下,硬件多次接入,系统会保证工作路径是一样的. //连接后,单一硬件相关的数据要保存在此. virtual bool SYSTEM_CALL SetDeviceWorkPath(const char * PARAM_IN pWorkPath); RET_STATUS GetDeviceResource(ResDataObject *pDeviceResource); //逻辑设备树的加载和卸载 virtual PVOID SYSTEM_CALL LoadLogicDevices(); virtual void SYSTEM_CALL UnloadLogicDevices(); virtual bool SYSTEM_CALL OnHeartBeat(); virtual bool Device_Probe(ResDataObject &HardwareInfo); ///////////////////////////////// int SendCommand(char* strCommand, int nTimeOut = TIMEOUTVALUE); //对指令名称进行打包封装 int SendCommandWithoutAck(char* strCommand, int nTimeOut = TIMEOUTVALUE); //Device Function bool ProcessCommand(char* strCommand, int nType = 0); bool WaitforAK(DWORD nWaitingTime = 500); struct tagCommandStruct { string strCommand; //0, common commmand, not wait for ack command, //1 commmand, wait for vck command., //2 APR command, //3, FO command int nCommmandType; }; CRITICAL_SECTION g_cs; HANDLE m_hGenACKEvent; HANDLE m_hGenCPEvent; HANDLE m_hGenRX0Event; HANDLE m_hGenSAEvent; HANDLE m_hGenRX1Event; HANDLE m_hGenXR1Event; string m_strCurrentCommand; bool m_bReceiveRX1; bool m_bReceiveRX0; bool m_bReceiveXR1; bool m_bWaitforXR1; bool m_bWaitforRX1; bool m_bWaitforRX0; bool m_bSendXR1Failed; bool m_bInExposurePeriod; bool m_bIsNAK; bool m_bWaitAK; bool m_bStatusFlag; bool m_bResetting; bool m_bAPRProcessing; int m_nCurrentRsubmit; int m_nAKRsubmit; int m_nTotalRsubmit; int m_nTimeoutCounter; vector m_strCommondvector; tagCommandStruct m_IMDCommand; float m_fProjectionMaxAngle; void SendNotifytoSubsystem(ResDataObject &resParam); private: static PACKET_RET callbackPackageProcess(const char * RecData, DWORD nLength, DWORD& PacketLength); size_t OnCallback(const char * strPackage, size_t nLength); string LoadErrorContext(const char* strCode); ResDataObject m_DeviceConfig; //设备属性 HMODULE m_SCFDllFileHandle; HMODULE m_LoggerDllFileHandle; GenIMD_Dose *m_pDoseOEM; //Dose OEM GenIMD_Logical *m_pSyncGenOEM; //SynGen CMACHINE_Logical *m_pMachineOEM; SCF* m_pSCFServer; typedef SCF* (*GetSCF)(); GetSCF getSCF; typedef void(*ReleaseSCF)(SCF *p); ReleaseSCF releaseSCF; SCFPacket *m_pSendPacket; SCFPacket *m_pReceivePacket; DWORD m_wReceiveTime; };