DIOS.Dev.SyncBox.V2COM.h 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. #pragma once
  2. #include <atomic>
  3. #include "CommonFun.h"
  4. #include "IODeviceWithSCF.tlh"
  5. #include "IODeviceWithSCF.tli"
  6. #include "DIOS.Dev.SYNBOX.Mould.hpp"
  7. #include "DIOS.Dev.MSGMould.hpp"
  8. #include "OEM.Collimator.h"
  9. #include "OEM.Mechanical.h"
  10. #define Dios_V3 1
  11. #if Dios_V3
  12. #include "LogicClient.h"
  13. #endif // Dios_V3
  14. #define V2COM_HeartBeat_Enable 0
  15. #ifdef DIOSDEVSYNDYN_EXPORTS
  16. #define _DIOSDEVDYNBOX_API __declspec(dllexport)
  17. #else
  18. #define _DIOSDEVDYNBOX_API __declspec(dllimport)
  19. #endif
  20. //code begin :wxx add by 20231027
  21. typedef void* (_stdcall * GenComm_InitInstance)(string);
  22. typedef void (_stdcall * GenComm_ExitInstance)(void*);
  23. typedef bool (_stdcall * GenComm_AddDevClient)(void*, string);
  24. typedef bool (_stdcall * GenComm_DelDevClient)(void*, string);
  25. typedef string (_stdcall * GenComm_DevActInt)(void*, string, int, int, ...);
  26. typedef string (_stdcall * GenComm_DevActDouble)(void*, string, int, int, ...);
  27. //code end 20221021
  28. namespace DIOS::Dev::Detail::SYNBOX
  29. {
  30. typedef struct Sync_Element_s
  31. {
  32. string strIO;
  33. string strSyncName;
  34. string pFun;
  35. int EnableState;
  36. int DisableState;
  37. }Sync_Element_t;
  38. //-----------------------------------------------------------------------------
  39. // V2COMBoxDevice
  40. //-----------------------------------------------------------------------------
  41. namespace nDev = DIOS::Dev;
  42. namespace nsDetail = DIOS::Dev::Detail;
  43. class _DIOSDEVDYNBOX_API SyncBoxDevice :public IODeviceWithSCF <IODeviceDetail>, public SYNBOXMould
  44. {
  45. using super = IODeviceWithSCF <IODeviceDetail>;
  46. using superSYN = SYNBOXMould;
  47. public:
  48. SyncBoxDevice(std::shared_ptr <IOEventCenter> center, nsSCF::SCF SCF, string configfile);
  49. ~SyncBoxDevice();
  50. virtual std::string GetGUID() const override;
  51. bool ReConnect(); //true -> 开始重连处理;false -> 完成重连操作
  52. RET_STATUS DebugSignal(bool flag);
  53. RET_STATUS SendSignal(string signal);
  54. //串口处理
  55. RET_STATUS HWSend(char* strCommand, int nTimeOut = 200);
  56. void FireErrorMessage(const bool Act, const int Code, const char* ResInfo = "");
  57. int DealtheSignal(const char* channel, int state);
  58. void DealtheHB(const char* channel, int state);
  59. int GetConnectFlag();
  60. //CAN口处理
  61. void DealReceiveData(char* data_can, int length_can_data);
  62. //机架、遮光器处理
  63. RET_STATUS SetCollimatorDev(OemCollimator* dev);
  64. RET_STATUS SetMechDev(OemMechanical* dev);
  65. //立柱板节点
  66. RET_STATUS SetConfigInfo(int nPanelType, int nRobotArmAngle);
  67. RET_STATUS SetPhotographyMode(int nExpoMode, int nAECfield = 0,int nAECdensity = 0);
  68. RET_STATUS SetExposureProcess(int nState);
  69. RET_STATUS SetSendMessageEnable(int enableFlag);
  70. //C臂控制板节点
  71. RET_STATUS SetPressureLimit(int nforePressureLimit, int nAllPressureLimit);
  72. RET_STATUS SetAutoTracking(int nAutoTracking);
  73. RET_STATUS SetGrid(unsigned int GridType);
  74. RET_STATUS SetPressureManualRelease();
  75. RET_STATUS SetRecvMessageEnable(bool enableFlag);
  76. RET_STATUS QueryError();
  77. RET_STATUS SetFilter(int filter);
  78. RET_STATUS QueryInfo();//CAN指令
  79. //振动栅节点
  80. RET_STATUS SetVibrateGridExpoTimes(int nTimes);
  81. RET_STATUS StartVibrateGrid();
  82. RET_STATUS StopVibrateGrid();
  83. int GridMSMargin(); //返回震动栅MS的余量
  84. ResDataObject ResDYNConfig;
  85. ResDataObject m_SYNConfig; //driver's config file.
  86. static std::unique_ptr<OemCollimator> m_pCollDev;
  87. static std::unique_ptr<OemMechanical> m_pMechDev;
  88. static bool m_bHeartBeatFlag; //是否启用心跳检测
  89. static bool m_bCANHBFlag; //是否启用CAN数据轮询
  90. atomic<int> m_iHeartBeats; //心跳统计
  91. atomic<int> m_iConnectFlag; //连接标记:0 断连, 1 串口开启成功,尝试发送心跳, 2 尝试发送心跳失败,3 重连成功
  92. int m_iGridMSRadMargin{ 50 }; //震动栅ms手动曝光误差(500-2000ms)
  93. int m_iGridMSAECMargin{ 50 }; //震动栅ms自动曝光误差(500-2000ms)
  94. int m_iFilterMO{ 1 }; //滤过MO
  95. int m_iFilterRH{ 2 }; //滤过RH
  96. int m_iConfSID{ 0 }; //配置的SID
  97. HANDLE m_hArrayEvent[2];
  98. HANDLE m_hExitEvent{ NULL };
  99. HANDLE m_hLoopBeginEvent{ NULL };
  100. HANDLE m_hLoopEndEvent{ NULL };
  101. protected:
  102. //SYN方法
  103. void SetCANState(bool state);
  104. virtual RET_STATUS SetWS(std::string value) override;
  105. virtual RET_STATUS SetExpMode(std::string value) override;
  106. RET_STATUS Reset();
  107. virtual RET_STATUS SimulateFootSwitchSignal(int signal) override;
  108. virtual RET_STATUS SetValue_PPS(FLOAT fluframerate) override;
  109. //发生器方法
  110. virtual RET_STATUS SetGeneratortoSyncStatus(int state) override;
  111. virtual RET_STATUS SetExpEnable() override;
  112. virtual RET_STATUS SetExpDisable() override;
  113. virtual RET_STATUS SetGenAECSignal(int signal) override;
  114. //探测器方法
  115. virtual RET_STATUS PrepareAcquisition() override;
  116. virtual RET_STATUS StartWindowRequest() override;
  117. virtual RET_STATUS SetExposureTimes(int nNum) override;
  118. virtual RET_STATUS StopWindowRequest() override;
  119. virtual RET_STATUS SetFrameRate(FLOAT frameRate) override;
  120. void Register();
  121. void OnCallBack();
  122. private:
  123. //串口处理
  124. RET_STATUS SendBySCF(const char* chChannelID, bool bStatus);
  125. int NotifySignal(const char* name, int state);
  126. void ClearSignal();
  127. int SetMultipleSignal(const char* name, int state);
  128. int SetSignal(const char* name, int state);
  129. int SetPWM(float fpps);
  130. void SendHeartBeat();
  131. void FireNotify(std::string key, std::string context);
  132. //轮询
  133. bool StartHardwareThread();
  134. static DWORD HardwareStatusThread(LPVOID pParam);
  135. HANDLE m_pHardwareThread;
  136. std::unique_ptr<nsDetail::MSGUnit> m_MSGUnit;
  137. int m_nExpTimes{ -1 };
  138. std::string m_strSYNMode{ "SYN0" };
  139. bool m_bClear{ false };
  140. //add by wxx:解决OT1信号在 配置 及 工作流中重复发送的问题
  141. atomic<int> m_bGenAECStatus{ 0 }; //AEC状态 0 -> off; 1-> rad; 2 -> preView
  142. atomic<int> m_iGridStatus{ -1 }; //震动栅状态 0 -> off; 1-> on; 2 -> in movement
  143. atomic<int> m_bVibrateGridReady{ 0 }; //震动栅准备完毕:0 -> init; 2 -> FPD ready && Grid ready
  144. bool m_bAECSecExpFlag{ false };
  145. bool m_bSetBaudOK; //not use now
  146. bool m_bCanLogEnableFlag{ false }; //add by wxx:是否启用CAN口日志打印
  147. int m_bOppressiveMode{ 1 }; //压迫模式:1.普通模式;2.预压迫;3.全压迫
  148. int m_bGridMode{ 1 }; //振栅模式:1.正常模式;2.放大模式
  149. bool m_bDebugSignal{ false }; //手动设置信号模式:0.不启用;1.启用
  150. //设备间通信
  151. LogicClient* m_pGenClient; //订阅调用端
  152. };
  153. }
  154. //-----------------------------------------------------------------------------
  155. // DynBoxDriver
  156. //-----------------------------------------------------------------------------
  157. namespace DIOS::Dev::Detail::SYNBOX
  158. {
  159. class _DIOSDEVDYNBOX_API DynBoxDriver : public IODriverWithSCF <DriverMould>
  160. {
  161. using super = IODriverWithSCF <DriverMould>;
  162. public:
  163. DynBoxDriver ();
  164. virtual ~DynBoxDriver ();
  165. public:
  166. virtual void Prepare () override;
  167. virtual bool DATA_ACTION Connect () override;
  168. virtual void Disconnect() override;
  169. virtual bool isConnected() const override;
  170. virtual void Dequeue (const char * Packet, DWORD Length) override;
  171. virtual void FireNotify (int code, std::string key, std::string content) override;
  172. virtual auto CreateDevice (int index)->std::unique_ptr <IODevice> override;
  173. virtual bool GetDeviceConfig(std::string& Cfg) override;
  174. virtual bool SetDeviceConfig(std::string Cfg) override;
  175. virtual std::string DriverProbe () override;
  176. virtual std::string GetResource () override;
  177. virtual std::string DeviceProbe () override;
  178. static PACKET_RET callbackPackageProcess(const char* RecData, DWORD nLength, DWORD& PacketLength);
  179. bool ReConnection(nsSCF::SCF & DevSCF);
  180. private:
  181. void CanShakeHand();
  182. //void SetCANState(bool state);
  183. bool m_bConnected; // 在 DEMO 模式下, 调用过 Connect 吗? cahnge by wxx:改为连接标志
  184. //static SyncBoxDevice* pSDCDevice;
  185. SyncBoxDevice* pSDCDevice{ nullptr };
  186. OemCollimator* m_pDriCollDev;// = nullptr;
  187. OemMechanical* m_pDriMechDev;// = nullptr;
  188. //std::unique_ptr <DynBoxDevice> pSDCDevice;
  189. ResDataObject m_DeviceConfig;
  190. string g_strAppPath;
  191. ResDataObject m_ConfigAll; //存储当前的配置,用于修改配置时写回文件
  192. ResDataObject m_Configurations; //存储当前配置中“CONFIGURATION”节点的内容
  193. std::unique_ptr <ResDataObject> m_pAttribute;
  194. std::unique_ptr <ResDataObject> m_pDescription;
  195. bool SaveConfigFile(bool bSendNotify);
  196. bool GetDeviceConfigValue(ResDataObject config, const char* pInnerKey, int nPathID, string& strValue);
  197. bool SetDeviceConfigValue(ResDataObject& config, const char* pInnerKey, int nPathID, const char* szValue);
  198. };
  199. }