123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451 |
- #pragma once
- #include <basetsd.h>
- /* 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 <typename T>
- void StrSubstrData(const char* strData, char delimiter, std::vector<T>& 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;
- }
- }
|