CCOS.Dev.Generator.Delta_80KAXB.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. #pragma once
  2. #include <thread>
  3. #include <mutex>
  4. #include <condition_variable>
  5. #include <atomic>
  6. #include <memory>
  7. #include <functional>
  8. #include <chrono>
  9. #include <cstdint>
  10. #include <vector>
  11. #include <string>
  12. #include <queue>
  13. #include <unordered_map>
  14. #include <fstream>
  15. #include "CCOS.Dev.IODevice.Detail.hpp"
  16. #include "CCOS.Dev.MSGMould.hpp"
  17. #include "CCOS.Dev.Generator.Mould.hpp"
  18. #include "DAP.BasicMoulds.hpp"
  19. // #include "DeliverModule.h" // 已废弃,Linux下不再使用
  20. #include "LogicClient.h"
  21. #include "SCFWrapper.h"
  22. #define _CCOSDEVGENDelta_API __attribute__((visibility("default")))
  23. // Linux 兼容的数据类型定义
  24. using DWORD = unsigned long;
  25. using LPVOID = void*;
  26. using BOOL = int;
  27. using HANDLE = void*;
  28. using BYTE = unsigned char;
  29. using UINT8 = uint8_t;
  30. using UINT16 = uint16_t;
  31. using UINT32 = uint32_t;
  32. using FLOAT = float;
  33. #define TRUE 1
  34. #define FALSE 0
  35. #define MAX_PATH 260
  36. #define WAIT_OBJECT_0 0
  37. // 睡眠函数(以毫秒为单位)
  38. inline void Sleep(unsigned int milliseconds) {
  39. std::this_thread::sleep_for(std::chrono::milliseconds(milliseconds));
  40. }
  41. enum DELTA_ABNORMAL_LEVEL { //异常等级
  42. REG_ERRO,
  43. REG_WARN
  44. };
  45. enum TransToType
  46. {
  47. tochar = 0,
  48. toint,
  49. tohex
  50. };
  51. struct AECINFORM
  52. {
  53. int Chamber;
  54. int Field;
  55. int Density;
  56. int FilmScreenSpeed;
  57. };
  58. static const int TIMEOUTVALUE = 100;
  59. static int m_nCountTimes = 0;
  60. //-----------------------------------------------------------------------------
  61. // DeltaDevice
  62. //-----------------------------------------------------------------------------
  63. namespace CCOS::Dev::Detail::Generator
  64. {
  65. namespace nDev = CCOS::Dev;
  66. namespace DevDAP = CCOS::Dev::Detail::DAP;
  67. class _CCOSDEVGENDelta_API DeltaDevice : public IODeviceDetail,public GeneratorMould
  68. {
  69. using super = IODeviceDetail;
  70. using superGen = GeneratorMould;
  71. public:
  72. DeltaDevice(std::shared_ptr <IOEventCenter> center, std::shared_ptr<SCFWrapper> SCF,string configfile);
  73. ~DeltaDevice ();
  74. bool DecodeFrame(const char* strPackage, int nLength);
  75. void ProcessCommand(const char* strPackage, int Index, int End);
  76. virtual std::string GetGUID() const override;
  77. virtual RET_STATUS IncKV() override;
  78. virtual RET_STATUS DecKV() override;
  79. virtual RET_STATUS SetKV(float value) override;
  80. virtual RET_STATUS IncMA() override;
  81. virtual RET_STATUS DecMA() override;
  82. virtual RET_STATUS SetMA(float value) override;
  83. virtual RET_STATUS IncMS() override;
  84. virtual RET_STATUS DecMS() override;
  85. virtual RET_STATUS SetMS(float value) override;
  86. virtual RET_STATUS IncMAS() override;
  87. virtual RET_STATUS DecMAS() override;
  88. virtual RET_STATUS SetMAS(float value) override;
  89. virtual RET_STATUS SetTechmode(int value) override;
  90. virtual RET_STATUS SetFocus(int value) override;
  91. virtual RET_STATUS SetAECDensity(int value) override;
  92. virtual RET_STATUS SetAECField(int value) override;
  93. virtual RET_STATUS SetAECFilm(int value) override;
  94. virtual RET_STATUS SetWS(const std::string value) override;
  95. virtual RET_STATUS SetAPR(const _tAPRArgs& t) override;
  96. virtual RET_STATUS QueryHE(int& value) override;
  97. virtual RET_STATUS QueryPostKV(float& value) override;
  98. virtual RET_STATUS QueryPostMA(float& value) override;
  99. virtual RET_STATUS QueryPostMS(float& value) override;
  100. virtual RET_STATUS QueryPostMAS(float& value) override;
  101. virtual RET_STATUS SetGenSynState(int value) override;
  102. virtual RET_STATUS SetGenState(int value) override;
  103. virtual RET_STATUS SetExpEnable() override;
  104. virtual RET_STATUS SetExpDisable()override;
  105. virtual RET_STATUS Reset()override;
  106. virtual RET_STATUS SetExpMode(std::string value) override;
  107. virtual RET_STATUS SetFrameRate(FLOAT frameRate) override;
  108. virtual RET_STATUS SetFLFMode(std::string value) override;
  109. virtual RET_STATUS SetEXAMMode(std::string value) override;
  110. virtual RET_STATUS ActiveSyncMode(_tSyncModeArgs value) override;
  111. static DeltaDevice* g_GenDevice;
  112. //串口处理层(已废弃)
  113. // 注释:DeliverModule已废弃,Linux下不再使用
  114. // static nsSerialGPM::CDeliverModule m_tDelivermodule;
  115. // int m_nCMDType_ACK{ 0 };
  116. // int m_nCMDType_WaitTime{ 0 };
  117. // int m_nCMDType_WaitACK{ 0 };
  118. // int m_nCMDType_WaitSELF{ 0 };
  119. // static void ProcessClientData(const char* pData, unsigned long DataLength, void* lparam);
  120. // static void WriteLog(const char* pData, nsSerialGPM::LOG_V2_LEVEL level);
  121. //RET_STATUS HWSendACKCMD(string strCommand, int headLengh = 1);
  122. //RET_STATUS HWSendWaittimeCMD(string strCommand, int headLengh = 1);
  123. // RET_STATUS HWSendWaitACKCMD(string strCommand, int headLengh = 1);
  124. bool LoadConfig(string configfile);
  125. int GetGenState();
  126. private:
  127. void Register();
  128. RET_STATUS RefreshData();
  129. RET_STATUS HWSend(const char * strCommand, int lengh, int nTimeOut = TIMEOUTVALUE);
  130. void FireNotify(std::string key, std::string context);
  131. void FireErrorMessage(const bool Act, const int Code, const char* ResInfo = ""); //上报错误消息
  132. void FireWarnMessage(const bool Act, const int Code, const char* ResInfo = ""); //上报告警消息
  133. bool GetConfData();
  134. _tSyncModeArgs m_cfgCurrentWSSYN; //当前选中的工作位和对应的同步模式
  135. _tAPRArgs m_tAPRdata; //保存服务传入的参数
  136. ResDataObject m_GenConfig; //driver's config file
  137. std::unique_ptr<DevDAP::DOSEMould> m_DAP; //DAP值
  138. std::unique_ptr<nsDetail::MSGUnit> m_MSGUnit; //错误消息处理对象
  139. string m_ErrorCode; //错误码,防止重复发送
  140. bool m_ExpPreFlagStatus{ false }; //发生器返回的是否允许prepare
  141. bool m_XRayOnFlagStatus{ false }; //发生器返回的X-RAY ON
  142. bool m_SysLimitFlagStatus{ false }; //发生器返回的SYSTEM LIMITS
  143. bool m_InterlockFlagStatus{ false }; //发生器返回的INTERLOCK
  144. bool m_TubeFlagStatus{ false }; //发生器返回的TUBE
  145. bool m_KVHoldFlagStatus{ false }; //发生器返回的KV HOLD
  146. bool m_ServiceFlagStatus{ false }; //发生器返回的SERVICE
  147. bool m_FluLevelFlagStatus{ false }; //发生器返回的FLUORO LEVEL
  148. bool m_ExamProFlagStatus{ false }; //发生器返回的EXAM PROCESS COMPLETED
  149. bool m_ExamSwitchFlagStatus{ false }; //发生器返回的EXPOSURE SWITCH PRESSED
  150. bool m_XRDisableFlagStatus{ false }; //发生器返回的XR DISABLE
  151. bool m_ABSFlagStatus{ false }; //发生器返回的FLUORO LOCK
  152. bool m_AECFlagStatus{ false }; //发生器返回的RAD LOCK
  153. //lsy
  154. bool ChangeGenParam(int kv, float fma, float fms, float fmas);
  155. bool SetRADKV_MA_MS(int kv, float ma, float ms);
  156. bool SetRADKV_MAS(int kv, float mas);
  157. bool SetAECKV_MA_MS(int kv, float ma, float ms);
  158. int FormatCommand(char* buf, int len);
  159. //int GetFacValue(vector<int> Index, int& value);
  160. int GetFacFloatValue(vector<float> Index, float& value);
  161. string m_strCommand;
  162. string uint8ArrayToHexStr(const UINT8* array, size_t length);
  163. string m_strKV;
  164. vector<int> m_vecKV;
  165. string m_strMAS;
  166. vector<float> m_vecMAS;
  167. string m_strMA;
  168. vector<float> m_vecMA;
  169. string m_strMS;
  170. vector<float> m_vecMS;
  171. int m_nTubeMaSFMaxValue{ 160 };
  172. int m_nTubeMaBFMinValue{ 180 };
  173. bool m_nTableUsePanelAEC{ false };
  174. bool m_nWallUsePanelAEC{ false };
  175. bool m_nFreeUsePanelAEC{ false };
  176. bool m_nTableUsePanelDDR{ false };
  177. bool m_nWallUsePanelDDR{ false };
  178. bool m_nFreeUsePanelDDR{ false };
  179. bool m_bSendXwindowToDector{ false };
  180. bool SetAECInformation(int chamber, int field, int density, int film);
  181. bool SetRadMode(int radmode, int desmode);
  182. bool SetDAECEnable(int enable);//打开关闭DAEC功能
  183. int m_nChamberIndex{ 1 };
  184. int WSGen2UI(int InputWS);
  185. int m_nAecFiled{2};
  186. int m_nAecDensity{0};
  187. int m_nAecFilm{ 0 };
  188. bool SetDualEnergyCommand(const _tAPRArgs& t);
  189. bool m_bIsDualExp{ false };
  190. int m_nExposureNumber{ 0 };
  191. bool SetAPRForDual(int nWS, int nFO, int nET, int nAECFieldSel, int nAECFilmSel, float fAECDensity, float fKV, float fMA, float fMS, float fMAS);
  192. bool GetLastExpParamenters(void);
  193. std::unordered_map<std::string, std::string> m_ErrorMessages;
  194. std::unordered_map<std::string, std::string> m_WarnMessages;
  195. void RetrieveFirewareVersion();
  196. string AnalysisCommand(int number, const char* chdigital, int type);
  197. LogicClient* m_pDetectorClient;
  198. int m_nDEFrameRate{ 1 };
  199. int m_nCurErrLevel{ 2 };
  200. bool m_bXronMsg{ false };
  201. std::string GetFileVersion(std::string strFilePathName);
  202. std::string GetDynamicLibraryPath();
  203. void SetNoDrMode();
  204. void SetSyncOutMode();
  205. void SeleckDetectorNumber(int detectorID);
  206. //查询线程
  207. static atomic<int> m_iLoopTime; //循环查询时间(毫秒)
  208. static atomic<bool> m_bExtraFlag; //使能标记
  209. bool StartHardwareStatusThread();
  210. static void HardwareStatusThread(DeltaDevice* pParam);
  211. std::thread m_pHardwareStatusThread;
  212. std::shared_ptr<SCFWrapper> m_SCF;
  213. void RetrieveHU();
  214. void CheckGeneratorStatus();
  215. bool m_nProcessXrayon{ false };
  216. void RetrieveMaxRating();
  217. int m_nMaxKW{ 0 };
  218. //AEC参数
  219. void UpdataAECInformation(AECINFORM aec);//通过发生器返回的参数更新AEC参数
  220. AECINFORM m_AECinformation;
  221. void RetrieveGeneratroDerating();
  222. string m_strConfigPath{ "" };
  223. //断线重连
  224. bool m_bReconnect{ false };
  225. bool m_bSetAPR{ false };
  226. vector<vector<uint8_t>> parse_packets(const vector<uint8_t>& data);
  227. bool m_bLoadConfigFile{ false };
  228. // 数据缓冲区(线程安全)
  229. char m_buffer[1024];
  230. int m_bufferLength{ 0 };
  231. std::queue<uint8_t> m_partialCommandQueue;
  232. int m_currentIndex{ 0 };
  233. std::mutex m_bufferMutex; // 保护缓冲区的互斥锁
  234. };
  235. }
  236. //-----------------------------------------------------------------------------
  237. // DeltaDriver
  238. //-----------------------------------------------------------------------------
  239. namespace CCOS::Dev::Detail::Generator
  240. {
  241. class _CCOSDEVGENDelta_API DeltaDriver : public DriverMould
  242. {
  243. using super = DriverMould;
  244. public:
  245. DeltaDriver ();
  246. virtual ~DeltaDriver ();
  247. public:
  248. //virtual bool DriverEntry (std::string CfgFileName); //配置文件路径,本接口最先调用
  249. virtual void Prepare() override; //在 DriverEntry 之后执行;选择与发生器设备通讯方式(串口、TCP)
  250. virtual std::string DriverProbe() override; //在 Prepare 之后执行;获取配置文件模型名,供上层创建设备work路径
  251. virtual bool DATA_ACTION Connect() override; //在 DriverProbe 之后执行;基于通讯方式与发生器设备建立连接
  252. virtual auto CreateDevice(int index)->std::unique_ptr <IODevice> override; //在 Connect 之后执行;创建逻辑设备对象,供上层创建发生器节点
  253. virtual bool isConnected() const override; //检测发生器设备的连接状态
  254. virtual std::string GetResource() override; //获取配置文件的值
  255. virtual std::string DeviceProbe() override; //获取配置文件模型名,供上层创建设备work路径
  256. virtual void Disconnect() override; //断开与发生器设备的连接状态
  257. virtual void Dequeue(const char* Packet, DWORD Length); //在super::Connect查询,调用 DecodeFrame:根据指定规则接收包,通过响应不同的数据包调用FireNotify上报数据
  258. virtual void FireNotify(int code, std::string key, std::string content); //发生器上报事件
  259. static PACKET_RET callbackPackageProcess(const char* RecData, uint32_t nLength, uint32_t& PacketLength); //判断从设备发来的数据有没有可用的数据包,有数据就接收等待 Dequeue
  260. std::shared_ptr<SCFWrapper> m_scfWrapper;
  261. private:
  262. bool SaveConfigFile(bool bSendNotify);
  263. virtual bool GetDeviceConfig(std::string& Cfg) override;
  264. virtual bool SetDeviceConfig(std::string Cfg) override;
  265. bool GetDeviceConfigValue(ResDataObject config, const char* pInnerKey, int nPathID, string& strValue);
  266. bool SetDeviceConfigValue(ResDataObject& config, const char* pInnerKey, int nPathID, const char* szValue);
  267. ResDataObject m_DeviceConfig;
  268. ResDataObject m_ConfigAll; //存储当前配置项,如果修改配置时写入文件
  269. ResDataObject m_Configurations; //存储当前配置项中CONFIGURATION节点内容
  270. bool m_bDemoMode;
  271. bool m_bDemoConnected; // 在 DEMO 模式下, 是否调用过 Connect
  272. //webconfig使用
  273. ResDataObject m_DeviceConfigSend;
  274. string g_strAppPath;
  275. std::unique_ptr <ResDataObject> m_pAttribute;
  276. std::unique_ptr <ResDataObject> m_pDescription;
  277. DeltaDevice* m_pDevice{ nullptr };
  278. enum class ConnectionState {
  279. Disconnected,
  280. Connecting,
  281. Connected,
  282. Failed
  283. };
  284. enum class ConnectionType {
  285. Serial, // 串口
  286. Ethernet // 网口
  287. };
  288. std::atomic<ConnectionState> m_connectionState{ ConnectionState::Disconnected };
  289. std::chrono::steady_clock::time_point m_lastConnectionAttempt;
  290. std::mutex m_connectionMutex;
  291. const std::chrono::seconds RESET_RETRY_AFTER{ 60 };
  292. // 修改成员变量定义,添加mutable允许const函数修改
  293. mutable int m_connectionRetryCount{ 0 }; // 关键:用mutable修饰
  294. const int MAX_RETRY_COUNT = 3;
  295. const std::chrono::seconds RETRY_INTERVAL{ 5 };
  296. // 串口相关(固定支持的端口,可从配置扩展)
  297. std::vector<std::string> m_serialPorts{ "/dev/ttyUSB0", "/dev/ttyUSB1", "/dev/ttyUSB2", "/dev/ttyUSB3", "/dev/ttyUSB4" };
  298. int m_currentSerialPortIndex{ 0 }; // 当前尝试的串口端口索引
  299. ConnectionType m_currentConnType{ ConnectionType::Serial };
  300. std::string m_SCFDllName;
  301. };
  302. }