Define_EMD_EPS4580.h 11 KB

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