#pragma once #include #include "CommonFun.h" #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 Dios_V3 1 #if Dios_V3 #include "LogicClient.h" #endif // Dios_V3 #define V2COM_HeartBeat_Enable 0 #ifdef DIOSDEVSYNDYN_EXPORTS #define _DIOSDEVDYNBOX_API __declspec(dllexport) #else #define _DIOSDEVDYNBOX_API __declspec(dllimport) #endif //code begin :wxx add by 20231027 typedef void* (_stdcall * GenComm_InitInstance)(string); typedef void (_stdcall * GenComm_ExitInstance)(void*); typedef bool (_stdcall * GenComm_AddDevClient)(void*, string); typedef bool (_stdcall * GenComm_DelDevClient)(void*, string); typedef string (_stdcall * GenComm_DevActInt)(void*, string, int, int, ...); typedef string (_stdcall * GenComm_DevActDouble)(void*, string, int, int, ...); //code end 20221021 namespace DIOS::Dev::Detail::SYNBOX { typedef struct Sync_Element_s { string strIO; string strSyncName; string pFun; int EnableState; int DisableState; }Sync_Element_t; //----------------------------------------------------------------------------- // V2COMBoxDevice //----------------------------------------------------------------------------- namespace nDev = DIOS::Dev; namespace nsDetail = DIOS::Dev::Detail; class _DIOSDEVDYNBOX_API SyncBoxDevice :public IODeviceWithSCF , public SYNBOXMould { using super = IODeviceWithSCF ; using superSYN = SYNBOXMould; public: SyncBoxDevice(std::shared_ptr center, nsSCF::SCF SCF, string configfile); ~SyncBoxDevice(); virtual std::string GetGUID() const override; bool ReConnect(); //true -> 开始重连处理;false -> 完成重连操作 RET_STATUS DebugSignal(bool flag); RET_STATUS SendSignal(string signal); //串口处理 RET_STATUS HWSend(char* strCommand, int nTimeOut = 200); void FireErrorMessage(const bool Act, const int Code, const char* ResInfo = ""); int DealtheSignal(const char* channel, int state); void DealtheHB(const char* channel, int state); int GetConnectFlag(); //CAN口处理 void DealReceiveData(char* data_can, int length_can_data); //机架、遮光器处理 RET_STATUS SetCollimatorDev(OemCollimator* dev); RET_STATUS SetMechDev(OemMechanical* dev); //立柱板节点 RET_STATUS SetConfigInfo(int nPanelType, int nRobotArmAngle); RET_STATUS SetPhotographyMode(int nExpoMode, int nAECfield = 0,int nAECdensity = 0); RET_STATUS SetExposureProcess(int nState); RET_STATUS SetSendMessageEnable(int enableFlag); //C臂控制板节点 RET_STATUS SetPressureLimit(int nforePressureLimit, int nAllPressureLimit); RET_STATUS SetAutoTracking(int nAutoTracking); RET_STATUS SetGrid(unsigned int GridType); RET_STATUS SetPressureManualRelease(); RET_STATUS SetRecvMessageEnable(bool enableFlag); RET_STATUS QueryError(); RET_STATUS SetFilter(int filter); RET_STATUS QueryInfo();//CAN指令 //振动栅节点 RET_STATUS SetVibrateGridExpoTimes(int nTimes); RET_STATUS StartVibrateGrid(); RET_STATUS StopVibrateGrid(); int GridMSMargin(); //返回震动栅MS的余量 ResDataObject ResDYNConfig; ResDataObject m_SYNConfig; //driver's config file. static std::unique_ptr m_pCollDev; static std::unique_ptr m_pMechDev; static bool m_bHeartBeatFlag; //是否启用心跳检测 static bool m_bCANHBFlag; //是否启用CAN数据轮询 atomic m_iHeartBeats; //心跳统计 atomic m_iConnectFlag; //连接标记:0 断连, 1 串口开启成功,尝试发送心跳, 2 尝试发送心跳失败,3 重连成功 int m_iGridMSRadMargin{ 50 }; //震动栅ms手动曝光误差(500-2000ms) int m_iGridMSAECMargin{ 50 }; //震动栅ms自动曝光误差(500-2000ms) int m_iFilterMO{ 1 }; //滤过MO int m_iFilterRH{ 2 }; //滤过RH int m_iConfSID{ 0 }; //配置的SID HANDLE m_hArrayEvent[2]; HANDLE m_hExitEvent{ NULL }; HANDLE m_hLoopBeginEvent{ NULL }; HANDLE m_hLoopEndEvent{ NULL }; protected: //SYN方法 void SetCANState(bool state); virtual RET_STATUS SetWS(std::string value) override; virtual RET_STATUS SetExpMode(std::string value) override; RET_STATUS Reset(); virtual RET_STATUS SimulateFootSwitchSignal(int signal) override; virtual RET_STATUS SetValue_PPS(FLOAT fluframerate) override; //发生器方法 virtual RET_STATUS SetGeneratortoSyncStatus(int state) override; virtual RET_STATUS SetExpEnable() override; virtual RET_STATUS SetExpDisable() override; virtual RET_STATUS SetGenAECSignal(int signal) override; //探测器方法 virtual RET_STATUS PrepareAcquisition() override; virtual RET_STATUS StartWindowRequest() override; virtual RET_STATUS SetExposureTimes(int nNum) override; virtual RET_STATUS StopWindowRequest() override; virtual RET_STATUS SetFrameRate(FLOAT frameRate) override; void Register(); void OnCallBack(); private: //串口处理 RET_STATUS SendBySCF(const char* chChannelID, bool bStatus); int NotifySignal(const char* name, int state); void ClearSignal(); int SetMultipleSignal(const char* name, int state); int SetSignal(const char* name, int state); int SetPWM(float fpps); void SendHeartBeat(); void FireNotify(std::string key, std::string context); //轮询 bool StartHardwareThread(); static DWORD HardwareStatusThread(LPVOID pParam); HANDLE m_pHardwareThread; std::unique_ptr m_MSGUnit; int m_nExpTimes{ -1 }; std::string m_strSYNMode{ "SYN0" }; bool m_bClear{ false }; //add by wxx:解决OT1信号在 配置 及 工作流中重复发送的问题 atomic m_bGenAECStatus{ 0 }; //AEC状态 0 -> off; 1-> rad; 2 -> preView atomic m_iGridStatus{ -1 }; //震动栅状态 0 -> off; 1-> on; 2 -> in movement atomic m_bVibrateGridReady{ 0 }; //震动栅准备完毕:0 -> init; 2 -> FPD ready && Grid ready bool m_bAECSecExpFlag{ false }; bool m_bSetBaudOK; //not use now bool m_bCanLogEnableFlag{ false }; //add by wxx:是否启用CAN口日志打印 int m_bOppressiveMode{ 1 }; //压迫模式:1.普通模式;2.预压迫;3.全压迫 int m_bGridMode{ 1 }; //振栅模式:1.正常模式;2.放大模式 bool m_bDebugSignal{ false }; //手动设置信号模式:0.不启用;1.启用 //设备间通信 LogicClient* m_pGenClient; //订阅调用端 }; } //----------------------------------------------------------------------------- // DynBoxDriver //----------------------------------------------------------------------------- namespace DIOS::Dev::Detail::SYNBOX { class _DIOSDEVDYNBOX_API DynBoxDriver : public IODriverWithSCF { using super = IODriverWithSCF ; public: DynBoxDriver (); virtual ~DynBoxDriver (); public: virtual void Prepare () override; virtual bool DATA_ACTION Connect () override; virtual void Disconnect() override; virtual bool isConnected() const override; virtual void Dequeue (const char * Packet, DWORD Length) override; virtual void FireNotify (int code, std::string key, std::string content) override; virtual auto CreateDevice (int index)->std::unique_ptr override; virtual bool GetDeviceConfig(std::string& Cfg) override; virtual bool SetDeviceConfig(std::string Cfg) override; virtual std::string DriverProbe () override; virtual std::string GetResource () override; virtual std::string DeviceProbe () override; static PACKET_RET callbackPackageProcess(const char* RecData, DWORD nLength, DWORD& PacketLength); bool ReConnection(nsSCF::SCF & DevSCF); private: void CanShakeHand(); //void SetCANState(bool state); bool m_bConnected; // 在 DEMO 模式下, 调用过 Connect 吗? cahnge by wxx:改为连接标志 //static SyncBoxDevice* pSDCDevice; SyncBoxDevice* pSDCDevice{ nullptr }; OemCollimator* m_pDriCollDev;// = nullptr; OemMechanical* m_pDriMechDev;// = nullptr; //std::unique_ptr pSDCDevice; ResDataObject m_DeviceConfig; string g_strAppPath; ResDataObject m_ConfigAll; //存储当前的配置,用于修改配置时写回文件 ResDataObject m_Configurations; //存储当前配置中“CONFIGURATION”节点的内容 std::unique_ptr m_pAttribute; std::unique_ptr m_pDescription; bool SaveConfigFile(bool bSendNotify); bool GetDeviceConfigValue(ResDataObject config, const char* pInnerKey, int nPathID, string& strValue); bool SetDeviceConfigValue(ResDataObject& config, const char* pInnerKey, int nPathID, const char* szValue); }; }