123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- #pragma once
- #include <atomic>
- #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 <IODeviceDetail>, public SYNBOXMould
- {
- using super = IODeviceWithSCF <IODeviceDetail>;
- using superSYN = SYNBOXMould;
- public:
- SyncBoxDevice(std::shared_ptr <IOEventCenter> 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<OemCollimator> m_pCollDev;
- static std::unique_ptr<OemMechanical> m_pMechDev;
- static bool m_bHeartBeatFlag; //是否启用心跳检测
- static bool m_bCANHBFlag; //是否启用CAN数据轮询
- atomic<int> m_iHeartBeats; //心跳统计
- atomic<int> 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<nsDetail::MSGUnit> m_MSGUnit;
- int m_nExpTimes{ -1 };
- std::string m_strSYNMode{ "SYN0" };
- bool m_bClear{ false };
- //add by wxx:解决OT1信号在 配置 及 工作流中重复发送的问题
- atomic<int> m_bGenAECStatus{ 0 }; //AEC状态 0 -> off; 1-> rad; 2 -> preView
- atomic<int> m_iGridStatus{ -1 }; //震动栅状态 0 -> off; 1-> on; 2 -> in movement
- atomic<int> 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 <DriverMould>
- {
- using super = IODriverWithSCF <DriverMould>;
- 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 <IODevice> 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 <DynBoxDevice> pSDCDevice;
- ResDataObject m_DeviceConfig;
- string g_strAppPath;
- ResDataObject m_ConfigAll; //存储当前的配置,用于修改配置时写回文件
- ResDataObject m_Configurations; //存储当前配置中“CONFIGURATION”节点的内容
- std::unique_ptr <ResDataObject> m_pAttribute;
- std::unique_ptr <ResDataObject> 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);
- };
- }
|