#pragma once #include #include "IODeviceWithSCF.tlh" #include "IODeviceWithSCF.tli" #include "DIOS.Dev.SYNBOX.Mould.hpp" #include "DIOS.Dev.MSGMould.hpp" #include "OEM.Collimator.h" #include "OEM.Mechanical.h" #define V2COM_HeartBeat_Enable 0 namespace DIOS::Dev::Detail::SYNBOX { typedef struct Sync_Element_s { string strIO; string strSyncName; string pFun; int EnableState; int DisableState; }Sync_Element_t; typedef struct DYNHeader_s { map m_MapChannelState; mapm_SyncList; }DYNHeader_t; //----------------------------------------------------------------------------- // V2COMBoxDevice //----------------------------------------------------------------------------- namespace nDev = DIOS::Dev; namespace nsDetail = DIOS::Dev::Detail; class V2COMBoxDevice : public SYNBOXMould { using superGen = SYNBOXMould; public: V2COMBoxDevice(std::shared_ptr center, nsSCF::SCF SCF, string configfile); ~V2COMBoxDevice(); //add by wxx : 新增重连提醒 void ReConnect(string &errorList); //true -> 开始重连处理;false -> 完成重连操作 void FireErrorMessage(const bool Act, const int Code, const char* ResInfo = ""); ResDataObject ResDYNConfig; ResDataObject m_SYNConfig; //driver's config file. protected: virtual nDev::RET_STATUS SetWS(std::string value) override; virtual nDev::RET_STATUS SetExpMode(std::string value) override; virtual nDev::RET_STATUS SetGeneratortoSyncStatus(int state) override; virtual nDev::RET_STATUS SetExpEnable() override; virtual nDev::RET_STATUS SetExpDisable() override; virtual nDev::RET_STATUS PrepareAcquisition() override; virtual nDev::RET_STATUS StartWindowRequest() override; virtual nDev::RET_STATUS SetExposureTimes(int nNum) override; virtual nDev::RET_STATUS StopWindowRequest() override; virtual nDev::RET_STATUS SetFrameRate(FLOAT frameRate) override; virtual nDev::RET_STATUS SetGenAECSignal(int signal) override; private: bool StartHardwareThread(); static DWORD HardwareStatusThread(LPVOID pParam); void SendHeartBeat(); HANDLE m_pHardwareThread; std::unique_ptr m_MSGUnit; atomic m_iHeartBeats; //心跳统计 atomic m_bConnectFlag; //连接标记 void QueryInfo(); private: //int ChartoInt(char uc); //int CalChecksum(const char* cCmd, int nCmdSize); //bool FormatCmd(char* cCmd, int& nSize); //bool CmdtoString(const char* cCmd, int nCmdSize, string& strCmd); nDev::RET_STATUS SendBySCF(const char* chChannelID, bool bStatus); //nDev::RET_STATUS SendSPSBySCF(const char* chChannelID, int nCycle, int nPulse, int nWaitTime); //nDev::RET_STATUS SendSPEBySCF(const char* chChannelID, UCHAR cMode, UCHAR cEnable, int nWaitTime); //nDev::RET_STATUS SendSMSBySCF(const char* cExpMode, const char* cExpCount, int nWaitTime); int DealReceiveData(string sCmdID, const char* pData, int Datalen); int NotifySignal(const char* name, int state); void ClearSignal(); int SetSignal(const char* name, int state); //int SetPWMState(bool state); int SetPWM(float fpps); //int SetAreaType(); int m_nCurrentExpTimes{ 0 }; DYNHeader_t m_DYNMap; bool m_bINEEnable{ false }; int m_nExpTimes{ -1 }; std::string m_strSYNMode{"SYN0"}; bool m_nInExpState{ false }; DWORD m_wStartEXPTime; bool m_bClear{ false }; nsSCF::SCF m_SCF; std::shared_ptr EventCenter; int m_nGenSynStateSignal{ 0 }; //add by wxx:解决OT1信号在 配置 及 工作流中重复发送的问题 bool m_bGenAECModeFlag{ false }; public: void Register(Dispatch* Dispatch); void OnCallBack(); int DealtheSignal(const char* channel, int state); void DealtheHB(const char* channel, int state); nDev::RET_STATUS HWSend(char* strCommand, int nTimeOut=200); virtual nDev::RET_STATUS SetFilter(int filter); virtual nDev::RET_STATUS SetCollimatorDev(OemCollimator* dev); virtual nDev::RET_STATUS SetMechDev(OemMechanical* dev); nDev::RET_STATUS SetGrid(unsigned int GridType); std::unique_ptr m_pCollDev; std::unique_ptr m_pMechDev; void DealReceiveData(char* data_can, int length_can_data); private: void FireNotify(std::string key, std::string context); bool m_bSetBaudOK;//not use now }; }