Define_EMD_EPS4580.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  1. #pragma once
  2. #include <cstdint>
  3. #include <cmath>
  4. // Linux兼容的类型定义
  5. #ifndef UINT8
  6. typedef uint8_t UINT8;
  7. #endif
  8. #ifndef UINT16
  9. typedef uint16_t UINT16;
  10. #endif
  11. #ifndef UINT32
  12. typedef uint32_t UINT32;
  13. #endif
  14. /* Control characters */
  15. #define STX 0x02 /* Start of DATA */
  16. #define ETX 0x03 /* End of DATA */
  17. #define ACK 0x06 /* Acknowlage */
  18. #define NAK 0x15 /* not acknowlage */
  19. //KV-limits in Kilovolt
  20. #define PRV_KV_MIN 40
  21. #define PRV_KV_MAX 150
  22. //mAs-limits in mAs * 10
  23. #define PRV_MAS_MIN 10
  24. #define PRV_MAS_MIN_VA 25
  25. #define PRV_MAS_MAX 5000
  26. //Limit (L) error codes
  27. #define MS_LIMIT 0x0900 //ms �C Limit
  28. #define MA_LIMIT 0x0901 //mA - Limit
  29. #define ILLEGAL_CONFIG 0x0902 //Illegal Generator configuration
  30. #define MAX_L_ERROR_INDEX 0x094F //Max Error-Code of L-Errors
  31. //System Sour Dest Data Req info
  32. //CIO -> all
  33. #define ID_NetworkInit 0x1D1A //000 111 010001101 0 Broadcast
  34. //CIO -> CON2
  35. #define ID_BackRadExam 0x15C0 //000 101 011100000 0 RADIOGRAPHY EXAM
  36. #define ID_BackFluroExam 0x15C2 //000 101 011100001 0 FLUOROSCOPY
  37. #define ID_BackExpResult 0x15C8 //000 101 011100100 0 EXPOSURE RESULTS
  38. #define ID_BackSoftStatus 0x15CA //000 101 011100101 0 SYSTEM STATUS_1 MESSAGE AND DATA
  39. #define ID_BackConfigStatus 0x15D2 //000 101 011101001 0 CONFIGURATION STATUS MESSAGE AND DATA
  40. #define ID_BackMEREExam 0x15EA //000 101 011110101 0 MULTI-ENERGY REAL-TIME EXAM (MERE)
  41. #define ID_BackDAPStatus 0x15E6 //000 101 011110011 0 DAP STATUS MESSAGE AND DATA
  42. #define ID_BackGenAndTubeStatus 0x15CC //000 101 011100110 0 GENERATOR/TUBE STATUS MESSAGES AND DATA
  43. #define ID_BackDAP_REQ 0x15E7 //000 101 011110011 1 DAP STATUS MESSAGE AND DATA
  44. //CON2 -> CIO
  45. #define ID_SetRadExam 0xA1C0 //101 000 011100000 0 RADIOGRAPHY EXAM
  46. #define ID_GetRadExam 0xA1C1 //101 000 011100000 1 RADIOGRAPHY EXAM
  47. #define ID_SetFluroExam 0xA1C2 //101 000 011100001 0 FLUOROSCOPY
  48. #define ID_GetFluroExam 0xA1C3 //101 000 011100001 1 FLUOROSCOPY
  49. #define ID_SetCardiacExam 0xA1C4 //101 000 011100010 0 CARDIAC EXAM
  50. #define ID_SetVascularExam 0xA1C6 //101 000 011100011 0 VASCULAR EXAM
  51. #define ID_GetExpResult 0xA1C9 //101 000 011100100 1 EXPOSURE RESULTS
  52. #define ID_GetSoftStatus 0xA1CB //101 000 011100101 1 SYSTEM STATUS_1 MESSAGE AND DATA
  53. #define ID_GetGenAndTubeStatus 0xA1CD //101 000 011100110 1 GENERATOR/TUBE STATUS MESSAGES AND DATA
  54. #define ID_GetIOStatus 0xA1CF //101 000 011100111 1 I/O STATUS MESSAGE AND DATA
  55. #define ID_SendSysCommand 0xA1D0 //101 000 011101000 0 SYSTEM COMMANDS
  56. #define ID_GetConfigStatus 0xA1D3 //101 000 011101001 1 CONFIGURATION STATUS MESSAGE AND DATA
  57. #define ID_GetSWStatus2 0xA1E9 //101 000 011110100 1 SYSTEM STATUS_2 MESSAGE AND DATA
  58. #define ID_SetMEREExam 0xA1EA //101 000 011110101 0 MULTI-ENERGY REAL-TIME EXAM (MERE)
  59. #define ID_GetMEREExam 0xA1EB //101 000 011110101 1 MULTI-ENERGY REAL-TIME EXAM (MERE)
  60. #define ID_SetMERDExam 0xA1EC //101 000 011110110 0 MULTI-ENERGY REAL-TIME DELTA (MERD)
  61. #define ID_GetDAPStatus 0xA1E7 //101 000 011110011 1 DAP STATUS MESSAGE AND DATA
  62. #pragma pack(push, 1)
  63. struct CommHeader
  64. {
  65. UINT8 CommandHigh;
  66. UINT8 CommandLow;
  67. };
  68. //Table 4- Data Conveyed by RAD Exam Table. CON2<=>CIO
  69. struct RadExam : public CommHeader
  70. {
  71. UINT8 KVHigh;
  72. UINT8 KVLow;
  73. UINT8 MA;
  74. UINT8 MS;
  75. UINT8 MAS;
  76. UINT8 FrameRate : 3;
  77. UINT8 AEC : 1;
  78. UINT8 Exposure : 1;
  79. UINT8 Focus : 3;
  80. UINT8 LeftField : 1;
  81. UINT8 CenterField : 1;
  82. UINT8 RightField : 1;
  83. UINT8 FilmScreen : 2;
  84. UINT8 AECDensity : 3;
  85. UINT8 RunLength;
  86. };
  87. //Table 19- Data Conveyed in ��EXPOSURE RESULT�� Message. CIO=>CON2
  88. struct ExpResult : public CommHeader
  89. {
  90. UINT8 KVHigh;
  91. UINT8 KVLow;
  92. UINT8 MS;
  93. UINT8 FrameCounter;
  94. UINT8 MAS1;
  95. UINT8 MAS2;
  96. UINT8 MAS3;
  97. UINT8 EndOfExpCode : 4;
  98. UINT8 NA : 3;
  99. UINT8 RadOfFluro : 1;
  100. };
  101. //Table 20- Data Conveyed in ��COMMAND PACKET�� Message. CON2=>CIO
  102. struct SysCommand : public CommHeader
  103. {
  104. UINT8 SetWS : 3;
  105. UINT8 NA1 : 1;
  106. UINT8 StopEmiCal : 1;
  107. UINT8 NA2 : 1;
  108. UINT8 StartSmallCal : 1;
  109. UINT8 StartLargeCal : 1;
  110. UINT8 F3 : 1;
  111. UINT8 F2 : 1;
  112. UINT8 F1 : 1;
  113. UINT8 AnodeLowSpeed : 1;
  114. UINT8 AnodeHighSpeed : 1;
  115. UINT8 AnodeBrake : 1;
  116. UINT8 NA3 : 2;
  117. UINT8 FaultRst : 1;
  118. UINT8 FluTmrRst : 1;
  119. UINT8 FluAlmRst : 1;
  120. UINT8 DualFluro : 2;
  121. UINT8 XmitOnJ14_7 : 1;
  122. UINT8 XmitOnJ14_8 : 1;
  123. UINT8 XmitOnJ14_9 : 1;
  124. UINT8 FIXInverter : 1;
  125. UINT8 XmitOnConsoleKeyRelease : 1;
  126. UINT8 NA4 : 6;
  127. UINT8 NA5 : 5;
  128. UINT8 PatientSize : 3;
  129. UINT8 NA6;
  130. UINT8 NA7 : 2;
  131. UINT8 X_RDisable : 1;
  132. UINT8 NA8;
  133. };
  134. //Table 11- Data Conveyed by ��SOFTWARE STATUS_1�� Message. CIO=>CON2
  135. struct SoftStatus : public CommHeader
  136. {
  137. UINT8 SystemState : 4;
  138. UINT8 Interlock : 1;
  139. UINT8 SystemLimit : 1;
  140. UINT8 XRayOn : 1;
  141. UINT8 Armed : 1;
  142. UINT8 FLUHigh : 1;
  143. UINT8 Service : 1;
  144. UINT8 KVHold : 1;
  145. UINT8 TUEB : 1;
  146. UINT8 NA2 : 1;
  147. UINT8 J14_7State : 1;
  148. UINT8 J14_8State : 1;
  149. UINT8 J14_9State : 1;
  150. UINT8 RADLimit[2];
  151. UINT8 FluroTimer[2];
  152. UINT8 CalibStatus : 4;
  153. UINT8 NA3 : 4;
  154. UINT8 RadLock : 1;
  155. UINT8 FluroLock : 1;
  156. UINT8 XRDisable : 1;
  157. UINT8 PartialRun : 1;
  158. UINT8 Switch : 1;
  159. UINT8 ExamProcess : 1;
  160. UINT8 CaliSmall : 1;
  161. UINT8 CaliLarge : 1;
  162. };
  163. //Table 16- Data Conveyed in ��CONFIGURATION STATUS�� message. CIO=>CON2
  164. struct ConfigStatus : public CommHeader
  165. {
  166. UINT8 WSSelected : 3;
  167. UINT8 WSEnable : 1;
  168. UINT8 FluroEnable : 1;
  169. UINT8 RadAnodeSpeed : 2;
  170. UINT8 LastRadExamInvalid : 1;
  171. UINT8 FR1Enable : 1;
  172. UINT8 FR2Enable : 1;
  173. UINT8 FR3Enable : 1;
  174. UINT8 FR4Enable : 1;
  175. UINT8 FR5Enable : 1;
  176. UINT8 FR6Enable : 1;
  177. UINT8 FR7Enable : 1;
  178. UINT8 ExpSwFluro : 1;
  179. UINT8 ExpSWJ12 : 1;
  180. UINT8 ExpSWConsole : 1;
  181. UINT8 LeftFieldEnable : 1;
  182. UINT8 CenterFieldEnable : 1;
  183. UINT8 RightFieldEnabled : 1;
  184. UINT8 SlowFSEnable : 1;
  185. UINT8 MedFSEnable : 1;
  186. UINT8 FastFSEnable : 1;
  187. UINT8 ThreePTDA : 1;
  188. UINT8 TwoPTDSA : 1;
  189. UINT8 AEC3PTAutoMA : 1;
  190. UINT8 AEC2PTAutoKW : 1;
  191. UINT8 AEC0PT : 1;
  192. UINT8 RadOrCardiac : 1;
  193. UINT8 NA1 : 2;
  194. UINT8 NA2 : 5;
  195. UINT8 PatientSize : 3;
  196. UINT8 DualFluroEnable : 1;
  197. UINT8 NA3 : 6;
  198. UINT8 LastFluroInvalid : 1;
  199. UINT8 XFR1Enable : 1;
  200. UINT8 XFR2Enable : 1;
  201. UINT8 XFR3Enable : 1;
  202. UINT8 XFR4Enable : 1;
  203. UINT8 XFR5Enable : 1;
  204. UINT8 XFR6Enable : 1;
  205. UINT8 XFR7Enable : 1;
  206. UINT8 HighLevEnable : 1;
  207. UINT8 FluroMode : 1;
  208. UINT8 FluroAnodeSpeed : 2;
  209. UINT8 ManualEnable : 1;
  210. UINT8 ABS1Enable : 1;
  211. UINT8 ABS2Enable : 1;
  212. UINT8 ABS3Enable : 1;
  213. UINT8 ABS4Enable : 1;
  214. };
  215. //Table 17- Data Conveyed in ��DAP STATUS�� Message. CIO=>CON2
  216. struct DAPStatus : public CommHeader
  217. {
  218. UINT8 NA : 3;
  219. UINT8 DAPLock : 1;
  220. UINT8 DAPErr : 1;
  221. UINT8 VerifyDAP : 1;
  222. UINT8 DoseRate : 1;
  223. UINT8 AccDose : 1;
  224. UINT8 DAPRateHigh;
  225. UINT8 DAPRateMid;
  226. UINT8 DAPRateLow;
  227. UINT8 DAPAccHigh;
  228. UINT8 DAPAccHMid;
  229. UINT8 DAPAccLMid;
  230. UINT8 DAPAccLow;
  231. };
  232. //Table 14- Data Conveyed by ��Generator and Tube Status�� Message. CIO=>CON2
  233. struct GenAndTubeStatus : public CommHeader
  234. {
  235. UINT8 BasketSt : 4;
  236. UINT8 GenSt : 4;
  237. UINT8 Tube2_value;
  238. UINT8 byte2;
  239. UINT8 Tube1_value;
  240. UINT8 byte4;
  241. UINT8 byte5;
  242. UINT8 byte6;
  243. UINT8 byte7;
  244. };
  245. #pragma pack(pop)
  246. //����ȡֵ��ָ��ת��
  247. UINT8 ToR20Stations(float para)
  248. {
  249. float ftmp = log10(para);
  250. ftmp *= 20;
  251. ftmp += 0.5;
  252. int itmp = (int)ftmp;
  253. itmp += 80;
  254. return itmp;
  255. }
  256. float FromR20Stations(UINT8 para)
  257. {
  258. static const int LUT[20] =
  259. {
  260. 100, 110, 125, 140, 160, 180, 200, 220, 250, 280,
  261. 320, 360, 400, 450, 500, 560, 630, 710, 800, 900
  262. };
  263. int i = para / 20;
  264. int j = para % 20;
  265. int RJ = LUT[j];
  266. float value = RJ * pow(10.0f, i - 6);
  267. return value;
  268. }
  269. void Encode(char* dest, const char* source, int length)
  270. {
  271. *dest = STX; dest++;
  272. char checkSum = STX;
  273. for (int Index = 0; Index < length; Index++)
  274. {
  275. char ch = *source; source++; // 0xA1
  276. char chh = (ch & 0xf0) >> 4; // 0xA
  277. char chl = ch & 0x0f; // 0x1
  278. if (chh >= 0x0a) chh += 'A' - 0x0a;
  279. else chh += '0';
  280. if (chl >= 0x0a) chl += 'A' - 0x0a;
  281. else chl += '0';
  282. *dest = chh; dest++;
  283. *dest = chl; dest++;
  284. checkSum += chh;
  285. checkSum += chl;
  286. }
  287. checkSum = ~checkSum;
  288. char chh = (checkSum & 0xf0) >> 4; // 0xA
  289. char chl = checkSum & 0x0f; // 0x1
  290. if (chh >= 0x0a) chh += 'A' - 0x0a;
  291. else chh += '0';
  292. if (chl >= 0x0a) chl += 'A' - 0x0a;
  293. else chl += '0';
  294. *dest = chh; dest++;
  295. *dest = chl; dest++;
  296. *dest = ETX; dest++;
  297. *dest = 0;
  298. }
  299. int Decode(const char* source, int length, char* Data)
  300. {
  301. if (length < 6) // CMD(4)+CHECK(2)
  302. return 0;
  303. char ch1 = *source; source++;
  304. char ch2 = *source; source++;
  305. char ch3 = *source; source++;
  306. char ch4 = *source; source++;
  307. ch1 = toupper(ch1);
  308. ch2 = toupper(ch2);
  309. ch3 = toupper(ch3);
  310. ch4 = toupper(ch4);
  311. if (ch1 >= 'A') ch1 -= 'A' - 0x0a; else ch1 -= '0';
  312. if (ch2 >= 'A') ch2 -= 'A' - 0x0a; else ch2 -= '0';
  313. if (ch3 >= 'A') ch3 -= 'A' - 0x0a; else ch3 -= '0';
  314. if (ch4 >= 'A') ch4 -= 'A' - 0x0a; else ch4 -= '0';
  315. int Cmd = 0;
  316. Cmd += ch1; Cmd <<= 4;
  317. Cmd += ch2; Cmd <<= 4;
  318. Cmd += ch3; Cmd <<= 4;
  319. Cmd += ch4; //Cmd << 4;
  320. int lengthOfData = (length - 6) / 2;
  321. if (lengthOfData <= 0)
  322. return Cmd;
  323. //char* pData = Data.GetBufferSetLength(lengthOfData + 2);
  324. char* pData = Data;
  325. *pData = Cmd >> 8; pData++;
  326. *pData = Cmd; pData++;
  327. for (int Index = 0; Index < lengthOfData; Index++)
  328. {
  329. ch1 = *source; source++;
  330. ch2 = *source; source++;
  331. ch1 = toupper(ch1);
  332. ch2 = toupper(ch2);
  333. if (ch1 >= 'A') ch1 -= 'A' - 0x0a; else ch1 -= '0';
  334. if (ch2 >= 'A') ch2 -= 'A' - 0x0a; else ch2 -= '0';
  335. ch1 <<= 4;
  336. ch1 += ch2;
  337. *pData = ch1;
  338. pData++;
  339. }
  340. return Cmd;
  341. }
  342. //��ָ����ʽ�ָ�����ַ���
  343. template <typename T>
  344. void StrSubstrData(const char* strData, char delimiter, std::vector<T>& array)
  345. {
  346. string strtemp = strData;
  347. string strItem = strtemp;
  348. // cout << "origin:" << strtemp << endl;
  349. std::size_t oldPos = 0;
  350. std::size_t findPos = strtemp.find(delimiter);
  351. while (findPos != string::npos)
  352. {
  353. strItem = strtemp.substr(oldPos, findPos - oldPos);
  354. if (typeid(T) == typeid(int))
  355. {
  356. array.push_back(atoi(strItem.c_str()));
  357. }
  358. else if (typeid(T) == typeid(float))
  359. {
  360. array.push_back(atof(strItem.c_str()));
  361. }
  362. else if (typeid(T) == typeid(double))
  363. {
  364. array.push_back(atof(strItem.c_str()));
  365. }
  366. else
  367. {
  368. return;
  369. }
  370. if (findPos != strtemp.length())
  371. {
  372. oldPos = findPos + 1;
  373. findPos = strtemp.find(",", oldPos);
  374. if (findPos == string::npos)
  375. {
  376. strItem = strtemp.substr(oldPos, strtemp.length() - oldPos);
  377. break;
  378. }
  379. }
  380. else
  381. {
  382. break;
  383. }
  384. }
  385. if (typeid(T) == typeid(int))
  386. {
  387. array.push_back(atoi(strItem.c_str()));
  388. }
  389. else if (typeid(T) == typeid(float))
  390. {
  391. array.push_back(atof(strItem.c_str()));
  392. }
  393. else if (typeid(T) == typeid(double))
  394. {
  395. array.push_back(atof(strItem.c_str()));
  396. }
  397. else
  398. {
  399. return;
  400. }
  401. }