#pragma once #include /* Control characters */ #define STX 0x02 /* Start of DATA */ #define ETX 0x03 /* End of DATA */ #define ACK 0x06 /* Acknowlage */ #define NAK 0x15 /* not acknowlage */ //KV-limits in Kilovolt #define PRV_KV_MIN 40 #define PRV_KV_MAX 150 //mAs-limits in mAs * 10 #define PRV_MAS_MIN 10 #define PRV_MAS_MIN_VA 25 #define PRV_MAS_MAX 5000 //Limit (L) error codes #define MS_LIMIT 0x0900 //ms – Limit #define MA_LIMIT 0x0901 //mA - Limit #define ILLEGAL_CONFIG 0x0902 //Illegal Generator configuration #define MAX_L_ERROR_INDEX 0x094F //Max Error-Code of L-Errors //System Sour Dest Data Req info //CIO -> all #define ID_NetworkInit 0x1D1A //000 111 010001101 0 Broadcast //CIO -> CON2 #define ID_BackRadExam 0x15C0 //000 101 011100000 0 RADIOGRAPHY EXAM #define ID_BackFluroExam 0x15C2 //000 101 011100001 0 FLUOROSCOPY #define ID_BackExpResult 0x15C8 //000 101 011100100 0 EXPOSURE RESULTS #define ID_BackSoftStatus 0x15CA //000 101 011100101 0 SYSTEM STATUS_1 MESSAGE AND DATA #define ID_BackConfigStatus 0x15D2 //000 101 011101001 0 CONFIGURATION STATUS MESSAGE AND DATA #define ID_BackMEREExam 0x15EA //000 101 011110101 0 MULTI-ENERGY REAL-TIME EXAM (MERE) #define ID_BackDAPStatus 0x15E6 //000 101 011110011 0 DAP STATUS MESSAGE AND DATA #define ID_BackGenAndTubeStatus 0x15CC //000 101 011100110 0 GENERATOR/TUBE STATUS MESSAGES AND DATA #define ID_BackDAP_REQ 0x15E7 //000 101 011110011 1 DAP STATUS MESSAGE AND DATA //CON2 -> CIO #define ID_SetRadExam 0xA1C0 //101 000 011100000 0 RADIOGRAPHY EXAM #define ID_GetRadExam 0xA1C1 //101 000 011100000 1 RADIOGRAPHY EXAM #define ID_SetFluroExam 0xA1C2 //101 000 011100001 0 FLUOROSCOPY #define ID_GetFluroExam 0xA1C3 //101 000 011100001 1 FLUOROSCOPY #define ID_SetCardiacExam 0xA1C4 //101 000 011100010 0 CARDIAC EXAM #define ID_SetVascularExam 0xA1C6 //101 000 011100011 0 VASCULAR EXAM #define ID_GetExpResult 0xA1C9 //101 000 011100100 1 EXPOSURE RESULTS #define ID_GetSoftStatus 0xA1CB //101 000 011100101 1 SYSTEM STATUS_1 MESSAGE AND DATA #define ID_GetGenAndTubeStatus 0xA1CD //101 000 011100110 1 GENERATOR/TUBE STATUS MESSAGES AND DATA #define ID_GetIOStatus 0xA1CF //101 000 011100111 1 I/O STATUS MESSAGE AND DATA #define ID_SendSysCommand 0xA1D0 //101 000 011101000 0 SYSTEM COMMANDS #define ID_GetConfigStatus 0xA1D3 //101 000 011101001 1 CONFIGURATION STATUS MESSAGE AND DATA #define ID_GetSWStatus2 0xA1E9 //101 000 011110100 1 SYSTEM STATUS_2 MESSAGE AND DATA #define ID_SetMEREExam 0xA1EA //101 000 011110101 0 MULTI-ENERGY REAL-TIME EXAM (MERE) #define ID_GetMEREExam 0xA1EB //101 000 011110101 1 MULTI-ENERGY REAL-TIME EXAM (MERE) #define ID_SetMERDExam 0xA1EC //101 000 011110110 0 MULTI-ENERGY REAL-TIME DELTA (MERD) #define ID_GetDAPStatus 0xA1E7 //101 000 011110011 1 DAP STATUS MESSAGE AND DATA #pragma pack(push, 1) struct CommHeader { UINT8 CommandHigh; UINT8 CommandLow; }; //Table 4- Data Conveyed by RAD Exam Table. CON2<=>CIO struct RadExam : public CommHeader { UINT8 KVHigh; UINT8 KVLow; UINT8 MA; UINT8 MS; UINT8 MAS; UINT8 FrameRate : 3; UINT8 AEC : 1; UINT8 Exposure : 1; UINT8 Focus : 3; UINT8 LeftField : 1; UINT8 CenterField : 1; UINT8 RightField : 1; UINT8 FilmScreen : 2; UINT8 AECDensity : 3; UINT8 RunLength; }; //Table 19- Data Conveyed in “EXPOSURE RESULT” Message. CIO=>CON2 struct ExpResult : public CommHeader { UINT8 KVHigh; UINT8 KVLow; UINT8 MS; UINT8 FrameCounter; UINT8 MAS1; UINT8 MAS2; UINT8 MAS3; UINT8 EndOfExpCode : 4; UINT8 NA : 3; UINT8 RadOfFluro : 1; }; //Table 20- Data Conveyed in “COMMAND PACKET” Message. CON2=>CIO struct SysCommand : public CommHeader { UINT8 SetWS : 3; UINT8 NA1 : 1; UINT8 StopEmiCal : 1; UINT8 NA2 : 1; UINT8 StartSmallCal : 1; UINT8 StartLargeCal : 1; UINT8 F3 : 1; UINT8 F2 : 1; UINT8 F1 : 1; UINT8 AnodeLowSpeed : 1; UINT8 AnodeHighSpeed : 1; UINT8 AnodeBrake : 1; UINT8 NA3 : 2; UINT8 FaultRst : 1; UINT8 FluTmrRst : 1; UINT8 FluAlmRst : 1; UINT8 DualFluro : 2; UINT8 XmitOnJ14_7 : 1; UINT8 XmitOnJ14_8 : 1; UINT8 XmitOnJ14_9 : 1; UINT8 FIXInverter : 1; UINT8 XmitOnConsoleKeyRelease : 1; UINT8 NA4 : 6; UINT8 NA5 : 5; UINT8 PatientSize : 3; UINT8 NA6; UINT8 NA7 : 2; UINT8 X_RDisable : 1; UINT8 NA8; }; //Table 11- Data Conveyed by “SOFTWARE STATUS_1” Message. CIO=>CON2 struct SoftStatus : public CommHeader { UINT8 SystemState : 4; UINT8 Interlock : 1; UINT8 SystemLimit : 1; UINT8 XRayOn : 1; UINT8 Armed : 1; UINT8 FLUHigh : 1; UINT8 Service : 1; UINT8 KVHold : 1; UINT8 TUEB : 1; UINT8 NA2 : 1; UINT8 J14_7State : 1; UINT8 J14_8State : 1; UINT8 J14_9State : 1; UINT8 RADLimit[2]; UINT8 FluroTimer[2]; UINT8 CalibStatus : 4; UINT8 NA3 : 4; UINT8 RadLock : 1; UINT8 FluroLock : 1; UINT8 XRDisable : 1; UINT8 PartialRun : 1; UINT8 Switch : 1; UINT8 ExamProcess : 1; UINT8 CaliSmall : 1; UINT8 CaliLarge : 1; }; //Table 16- Data Conveyed in “CONFIGURATION STATUS” message. CIO=>CON2 struct ConfigStatus : public CommHeader { UINT8 WSSelected : 3; UINT8 WSEnable : 1; UINT8 FluroEnable : 1; UINT8 RadAnodeSpeed : 2; UINT8 LastRadExamInvalid : 1; UINT8 FR1Enable : 1; UINT8 FR2Enable : 1; UINT8 FR3Enable : 1; UINT8 FR4Enable : 1; UINT8 FR5Enable : 1; UINT8 FR6Enable : 1; UINT8 FR7Enable : 1; UINT8 ExpSwFluro : 1; UINT8 ExpSWJ12 : 1; UINT8 ExpSWConsole : 1; UINT8 LeftFieldEnable : 1; UINT8 CenterFieldEnable : 1; UINT8 RightFieldEnabled : 1; UINT8 SlowFSEnable : 1; UINT8 MedFSEnable : 1; UINT8 FastFSEnable : 1; UINT8 ThreePTDA : 1; UINT8 TwoPTDSA : 1; UINT8 AEC3PTAutoMA : 1; UINT8 AEC2PTAutoKW : 1; UINT8 AEC0PT : 1; UINT8 RadOrCardiac : 1; UINT8 NA1 : 2; UINT8 NA2 : 5; UINT8 PatientSize : 3; UINT8 DualFluroEnable : 1; UINT8 NA3 : 6; UINT8 LastFluroInvalid : 1; UINT8 XFR1Enable : 1; UINT8 XFR2Enable : 1; UINT8 XFR3Enable : 1; UINT8 XFR4Enable : 1; UINT8 XFR5Enable : 1; UINT8 XFR6Enable : 1; UINT8 XFR7Enable : 1; UINT8 HighLevEnable : 1; UINT8 FluroMode : 1; UINT8 FluroAnodeSpeed : 2; UINT8 ManualEnable : 1; UINT8 ABS1Enable : 1; UINT8 ABS2Enable : 1; UINT8 ABS3Enable : 1; UINT8 ABS4Enable : 1; }; //Table 17- Data Conveyed in “DAP STATUS” Message. CIO=>CON2 struct DAPStatus : public CommHeader { UINT8 NA : 3; UINT8 DAPLock : 1; UINT8 DAPErr : 1; UINT8 VerifyDAP : 1; UINT8 DoseRate : 1; UINT8 AccDose : 1; UINT8 DAPRateHigh; UINT8 DAPRateMid; UINT8 DAPRateLow; UINT8 DAPAccHigh; UINT8 DAPAccHMid; UINT8 DAPAccLMid; UINT8 DAPAccLow; }; //Table 14- Data Conveyed by “Generator and Tube Status” Message. CIO=>CON2 struct GenAndTubeStatus : public CommHeader { UINT8 BasketSt : 4; UINT8 GenSt : 4; UINT8 Tube2_value; UINT8 byte2; UINT8 Tube1_value; UINT8 byte4; UINT8 byte5; UINT8 byte6; UINT8 byte7; }; #pragma pack(pop) //特殊取值、指令转换 UINT8 ToR20Stations(float para) { float ftmp = log10(para); ftmp *= 20; ftmp += 0.5; int itmp = (int)ftmp; itmp += 80; return itmp; } float FromR20Stations(UINT8 para) { static const int LUT[20] = { 100, 110, 125, 140, 160, 180, 200, 220, 250, 280, 320, 360, 400, 450, 500, 560, 630, 710, 800, 900 }; int i = para / 20; int j = para % 20; int RJ = LUT[j]; float value = RJ * pow(10.0f, i - 6); return value; } void Encode(char* dest, const char* source, int length) { *dest = STX; dest++; char checkSum = STX; for (int Index = 0; Index < length; Index++) { char ch = *source; source++; // 0xA1 char chh = (ch & 0xf0) >> 4; // 0xA char chl = ch & 0x0f; // 0x1 if (chh >= 0x0a) chh += 'A' - 0x0a; else chh += '0'; if (chl >= 0x0a) chl += 'A' - 0x0a; else chl += '0'; *dest = chh; dest++; *dest = chl; dest++; checkSum += chh; checkSum += chl; } checkSum = ~checkSum; char chh = (checkSum & 0xf0) >> 4; // 0xA char chl = checkSum & 0x0f; // 0x1 if (chh >= 0x0a) chh += 'A' - 0x0a; else chh += '0'; if (chl >= 0x0a) chl += 'A' - 0x0a; else chl += '0'; *dest = chh; dest++; *dest = chl; dest++; *dest = ETX; dest++; *dest = 0; } int Decode(const char* source, int length, char* Data) { if (length < 6) // CMD(4)+CHECK(2) return 0; char ch1 = *source; source++; char ch2 = *source; source++; char ch3 = *source; source++; char ch4 = *source; source++; ch1 = toupper(ch1); ch2 = toupper(ch2); ch3 = toupper(ch3); ch4 = toupper(ch4); if (ch1 >= 'A') ch1 -= 'A' - 0x0a; else ch1 -= '0'; if (ch2 >= 'A') ch2 -= 'A' - 0x0a; else ch2 -= '0'; if (ch3 >= 'A') ch3 -= 'A' - 0x0a; else ch3 -= '0'; if (ch4 >= 'A') ch4 -= 'A' - 0x0a; else ch4 -= '0'; int Cmd = 0; Cmd += ch1; Cmd <<= 4; Cmd += ch2; Cmd <<= 4; Cmd += ch3; Cmd <<= 4; Cmd += ch4; //Cmd << 4; int lengthOfData = (length - 6) / 2; if (lengthOfData <= 0) return Cmd; //char* pData = Data.GetBufferSetLength(lengthOfData + 2); char* pData = Data; *pData = Cmd >> 8; pData++; *pData = Cmd; pData++; for (int Index = 0; Index < lengthOfData; Index++) { ch1 = *source; source++; ch2 = *source; source++; ch1 = toupper(ch1); ch2 = toupper(ch2); if (ch1 >= 'A') ch1 -= 'A' - 0x0a; else ch1 -= '0'; if (ch2 >= 'A') ch2 -= 'A' - 0x0a; else ch2 -= '0'; ch1 <<= 4; ch1 += ch2; *pData = ch1; pData++; } return Cmd; } //按指定格式分割、解析字符串 template void StrSubstrData(const char* strData, char delimiter, std::vector& array) { string strtemp = strData; string strItem = strtemp; // cout << "origin:" << strtemp << endl; std::size_t oldPos = 0; std::size_t findPos = strtemp.find(delimiter); while (findPos != string::npos) { strItem = strtemp.substr(oldPos, findPos - oldPos); if (typeid(T) == typeid(int)) { array.push_back(atoi(strItem.c_str())); } else if (typeid(T) == typeid(float)) { array.push_back(atof(strItem.c_str())); } else if (typeid(T) == typeid(double)) { array.push_back(atof(strItem.c_str())); } else { return; } if (findPos != strtemp.length()) { oldPos = findPos + 1; findPos = strtemp.find(",", oldPos); if (findPos == string::npos) { strItem = strtemp.substr(oldPos, strtemp.length() - oldPos); break; } } else { break; } } if (typeid(T) == typeid(int)) { array.push_back(atoi(strItem.c_str())); } else if (typeid(T) == typeid(float)) { array.push_back(atof(strItem.c_str())); } else if (typeid(T) == typeid(double)) { array.push_back(atof(strItem.c_str())); } else { return; } }