DIOS.Dev.Generator.MERCURY.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. #pragma once
  2. #include <atomic>
  3. #include "IODeviceWithSCF.tlh"
  4. #include "IODeviceWithSCF.tli"
  5. #include "CCOS.Dev.IODevice.Detail.hpp"
  6. #include "CCOS.Dev.MSGMould.hpp"
  7. #include "CCOS.Dev.Generator.Mould.hpp"
  8. #ifdef CCOSDEVGENMERCURY_EXPORTS
  9. #define _CCOSDEVGENMERCURY_API __declspec(dllexport)
  10. #else
  11. #define _CCOSDEVGENMERCURY_API __declspec(dllimport)
  12. #endif
  13. enum MERCURY_REGULATION_LEVEL { //故障等级
  14. REG_ERRO,
  15. REG_WARN
  16. };
  17. enum MERCURY_CHARGE_STATE { //电池状态
  18. POWER_LOW,
  19. POWER_NOR
  20. };
  21. enum MERCURYSTATUS
  22. {
  23. MERCURY_PHASE_INI = 1,
  24. MERCURY_PHASE_STANDBY,
  25. MERCURY_PHASE_RAD_PREP,
  26. MERCURY_PHASE_EXPOSURE_RAD,
  27. MERCURY_PHASE_EXPOSURE_FLU_CONTINUOUS,
  28. MERCURY_PHASE_EXPOSURE_FLU_PLUS,
  29. MERCURY_PHASE_EXPOSURE_FLU_BOOST,
  30. MERCURY_PHASE_CALIBRATION,
  31. MERCURY_PHASE_ERROR
  32. };
  33. namespace CCOS::Dev::Detail::Generator
  34. {
  35. using cbFun = std::function <void(char*, int)>;
  36. static const int TIMEOUTVALUE = 100;
  37. /*暂不使用
  38. using JSONString = std::string;
  39. namespace DevDAP = CCOS::Dev::Detail::DAP;
  40. */
  41. //-----------------------------------------------------------------------------
  42. // MERCURYDevice
  43. //-----------------------------------------------------------------------------
  44. namespace nDev = CCOS::Dev;
  45. class _CCOSDEVGENMERCURY_API MERCURYDevice : public IODeviceWithSCF <IODeviceDetail>,public GeneratorMould
  46. {
  47. using super = IODeviceWithSCF <IODeviceDetail>;
  48. using superGen = GeneratorMould;
  49. public:
  50. MERCURYDevice (std::shared_ptr <IOEventCenter> center, nsSCF::SCF SCF, string configfile);
  51. ~MERCURYDevice ();
  52. //发生器支持的通用命令
  53. virtual std::string GetGUID() const override;
  54. virtual RET_STATUS Reset()override;
  55. virtual RET_STATUS SetWS(const string value) override;
  56. virtual RET_STATUS SetGenSynState(int value) override;
  57. virtual RET_STATUS SetGenState(int value);
  58. virtual RET_STATUS SetExpEnable() override;
  59. virtual RET_STATUS SetExpDisable() override;
  60. virtual RET_STATUS QueryHE(int& value) override;
  61. virtual RET_STATUS SetExpMode(std::string value) override;
  62. virtual RET_STATUS SetFrameRate(FLOAT frameRate) override;
  63. virtual RET_STATUS SetEXAMMode(std::string value) override;
  64. virtual RET_STATUS IncKV() override;
  65. virtual RET_STATUS DecKV() override;
  66. virtual RET_STATUS IncKVL() override;
  67. virtual RET_STATUS DecKVL() override;
  68. virtual RET_STATUS SetKV(float value) override;
  69. virtual RET_STATUS IncMA() override;
  70. virtual RET_STATUS DecMA() override;
  71. virtual RET_STATUS SetMA(float value) override;
  72. virtual RET_STATUS IncMS() override;
  73. virtual RET_STATUS DecMS() override;
  74. virtual RET_STATUS SetMS(float value) override;
  75. virtual RET_STATUS IncMAS() override;
  76. virtual RET_STATUS DecMAS() override;
  77. virtual RET_STATUS SetMAS(float value) override;
  78. virtual RET_STATUS SetTechmode(int value) override;
  79. virtual RET_STATUS SetFocus(int value) override;
  80. virtual RET_STATUS SetAECDensity(int value) override;
  81. virtual RET_STATUS SetAECField(int value) override;
  82. virtual RET_STATUS SetAECFilm(int value) override;
  83. virtual RET_STATUS QueryPostKV(float& value) override;
  84. virtual RET_STATUS QueryPostMA(float& value) override;
  85. virtual RET_STATUS QueryPostMS(float& value) override;
  86. virtual RET_STATUS QueryPostMAS(float& value) override;
  87. virtual RET_STATUS SetAPR(const _tAPRArgs& t) override;
  88. bool EnableBucky(int nbucky);
  89. bool ECHO(void);
  90. RET_STATUS Clear_DAP();
  91. RET_STATUS GetValue_DAP(float& value);
  92. //V3新方法
  93. virtual void SubscribeSelf(ccos_mqtt_connection* conn) override;
  94. RET_STATUS SetVibrationGrid(int value);
  95. RET_STATUS GetVibrationGridMS(int &value);
  96. bool ReConnect(); //重连
  97. public:
  98. ResDataObject m_GenConfig; //driver's config file.
  99. //线程变量互斥锁
  100. //atomic<int> m_iReSendCMD; //初始命令重发次数
  101. static atomic<int> m_iLoopTime; //循环间隔时间(毫秒)
  102. atomic<int> m_iHeartBeats; //心跳统计
  103. atomic<bool> m_bConnectFlag; //连接标记
  104. static atomic<bool> m_bExtraFlag; //使用标记
  105. bool m_bGenBusy;
  106. bool m_bReturnFlag;
  107. float m_fPreMA;
  108. float m_fPreMS;
  109. float m_fPreMAS;
  110. int m_nPreET;
  111. int m_nAECMode;//0 fix 1 mas 2 ms
  112. bool m_bSaveMSMA;//根据用途来看,其实是表示 是否处于setapr期间
  113. float m_PrefMS;
  114. float m_fMsLimit;
  115. bool m_bInExpState; //用来表示是否处于曝光状态,因为处于exp状态时,仅有几组指令可以发。
  116. int m_nCtlMode;
  117. bool m_bCheckATUStatus;//
  118. bool m_bDAPEnable;
  119. //串口处理层
  120. //static void __stdcall ProcessClientData(const char* pData, unsigned long DataLength, void* lparam);
  121. //static void __stdcall WriteLog(const char* pData, nsSerialGPM::LOG_V2_LEVEL level);
  122. private:
  123. std::unique_ptr<nsDetail::MSGUnit> m_MSGUnit; //处理消息上报对象指针
  124. HANDLE m_pHardwareStatusThread; //轮询线程句柄
  125. HANDLE m_pHardwareRsSendThread; //重发线程句柄
  126. HANDLE m_hGenPostEvent;
  127. atomic<bool> m_bExpEnable; //曝光使能
  128. atomic<bool> m_bFaultList[18]; //记录 主机请求固件报告故障命令 返回的故障记录
  129. int m_iMaxPower; //最大功率:kV*mA
  130. int MaxHeatContent; //最阳极热容积:kV*mAs
  131. bool m_bMAS_MA_AEC;
  132. enum MyEnum
  133. {
  134. EXPOSURE_SOFTWARE_HARDWARE, //0
  135. EXPOSURE_NOSYNBOX_DIRCETCONNECT_DETECTOR_GEN, //1
  136. EXPOSURE_SOFTWARE_NOSYNBOX //2
  137. };
  138. private:
  139. RET_STATUS HWSend(const char* strCommand, int lengh, bool reSend = false, int nTimeOut = TIMEOUTVALUE); //指令发送接口
  140. void InitCallBack(); //处理指令回调函数
  141. void Register(); //注册对外提供的属性、方法
  142. bool StartHardwareStatusThread(); //启动轮询线程
  143. static DWORD HardwareStatusThread(LPVOID pParam); //定时查询状态信息
  144. //static DWORD HardwareReSendThread(LPVOID pParam); //指令重发
  145. void FireNotify(std::string key, int context);//向上层上报消息
  146. void FireNotify(std::string key, float context);
  147. void FireNotify(std::string key, std::string context);
  148. void FireErrorMessage(const bool Act, const int Code, const char* ResInfo = ""); //上报错误消息
  149. void FireWarnMessage(const bool Act, const int Code, const char* ResInfo = ""); //上报告警消息
  150. //刷新状态部分
  151. void GetST();
  152. void GetTechMode();
  153. void RefreshConData();
  154. //曝光部分
  155. void RespondPR0();
  156. void RespondPR1();
  157. void RespondPR2();
  158. void RespondXR0();
  159. void RespondXR1();
  160. };
  161. }
  162. //-----------------------------------------------------------------------------
  163. // MERCURYDriver
  164. //-----------------------------------------------------------------------------
  165. namespace CCOS::Dev::Detail::Generator
  166. {
  167. class _CCOSDEVGENMERCURY_API MERCURYDriver : public IODriverWithSCF <DriverMould>
  168. {
  169. using super = IODriverWithSCF <DriverMould>;
  170. public:
  171. MERCURYDriver();
  172. virtual ~MERCURYDriver();
  173. public:
  174. virtual void Prepare () override; //在 DriverEntry 之后执行;选择与物理设备通信方式(串口、TCP)
  175. virtual bool DATA_ACTION Connect() override;
  176. virtual std::string DriverProbe() override; //在 Prepare 之后执行;读取配置文件模块参数,供上层创建驱动work路径
  177. bool ReConnection(nsSCF::SCF& DevSCF);
  178. virtual auto CreateDevice(int index)->std::unique_ptr <IODevice> override; //在 Connect 之后执行;创建逻辑设备,供上层创建驱动树节点
  179. virtual bool isConnected() const override; //检查驱动与物理设备连接状态
  180. virtual std::string GetResource() override; //获取配置文件的值
  181. virtual std::string DeviceProbe() override; //读取配置文件模块参数,供上层创建设备work路径
  182. virtual void Disconnect() override; //断开驱动与物理设备连接状态
  183. virtual void Dequeue (const char * Packet, DWORD Length) override; //在super::Connect中轮询,调用 DecodeFrame:查找指令操作对照表,通过对应操作更新数据并调用FireNotify上报更新
  184. virtual void FireNotify (int code, std::string key, std::string content) override; //向监听者上报事件
  185. static PACKET_RET callbackPackageProcess(const char* RecData, DWORD nLength, DWORD& PacketLength); //判断从设备读到的数据有没有可用的数据包,有则最终调度到 Dequeue
  186. private:
  187. bool SaveConfigFile(bool bSendNotify);
  188. virtual bool GetDeviceConfig(std::string& Cfg) override;
  189. virtual bool SetDeviceConfig(std::string Cfg) override;
  190. bool GetDeviceConfigValue(ResDataObject config, const char* pInnerKey, int nPathID, string& strValue);
  191. bool SetDeviceConfigValue(ResDataObject& config, const char* pInnerKey, int nPathID, const char* szValue);
  192. ResDataObject m_DeviceConfig;
  193. ResDataObject m_ConfigAll; //存储当前的配置,用于修改配置时写回文件
  194. ResDataObject m_Configurations; //存储当前配置中“CONFIGURATION”节点的内容
  195. //webconfig使用
  196. ResDataObject m_DeviceConfigSend;
  197. string g_strAppPath;
  198. std::unique_ptr <ResDataObject> m_pAttribute;
  199. std::unique_ptr <ResDataObject> m_pDescription;
  200. };
  201. }