DIOS.Dev.Generator.IMD.cpp 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887
  1. // CCOS.Dev.GEN.IMD.cpp : 定义 DLL 应用程序的导出函数。
  2. //
  3. #include "stdafx.h"
  4. #include <assert.h>
  5. #include <functional>
  6. #include <fstream>
  7. using namespace std::placeholders;
  8. //#include "logger.temp.h"
  9. #include "CCOS.Dev.Generator.IMD.h"
  10. #include "Helper.JSON.hpp"
  11. using namespace CCOS::Dev::Detail::Generator;
  12. namespace nsGEN = CCOS::Dev::Detail::Generator;
  13. #pragma warning (disable:4244)
  14. #pragma warning (disable:4305)
  15. #pragma warning (disable:4267)
  16. #pragma comment(lib, "version.lib")
  17. static const int msTimeOut_Lock = 500;
  18. #ifdef _WIN64
  19. #ifdef _DEBUG
  20. static const auto COM_SCFDllName = "Ccos.Dev.SerialSCFX64D.dll";
  21. #else
  22. static const auto COM_SCFDllName = "Ccos.Dev.SerialSCFX64.dll";
  23. #endif
  24. #endif
  25. #ifdef _WIN64
  26. #ifdef _DEBUG
  27. static const auto TCP_SCFDllName = "Ccos.Dev.TcpipSCFX64D.dll";
  28. #else
  29. static const auto TCP_SCFDllName = "Ccos.Dev.TcpipSCFX64.dll";
  30. #endif
  31. #endif
  32. //-----------------------------------------------------------------------------
  33. // IMDDevice
  34. //-----------------------------------------------------------------------------
  35. std::vector <float> g_MA_List = { 8, 10, 12.5, 16, 20, 25, 32, 40, 50, 64, 80, 100, 125, 160, 200, 250, 320, 400, 500, 640 };
  36. std::vector <float> g_MAS_List = { 1, 1.25, 1.6, 2, 2.5, 3.2, 4, 5, 6.4, 8, 10, 12.5, 16, 20, 25, 32, 40, 50, 64, 80, 100, 125, 160, 200, 250, 320, 400, 500, 640, 800, 1000 };
  37. std::vector <int> g_MS_List = { 1, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 25, 32, 40, 50, 64, 80, 100, 125, 160, 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200, 4000, 5000, 6400, 8000, 10000 };
  38. int g_AECFIELD_List[] = { 1, 10, 100, 11, 101, 111 };
  39. std::vector <float> gf_MA_List = { 8, 10, 12.5, 16, 20, 25, 32, 40, 50, 64, 80, 100, 125, 160, 200, 250, 320, 400, 500, 640 };
  40. string GetProcessDirectory()
  41. {
  42. string ret = "";
  43. char szFilename[MAX_PATH] = { 0 };
  44. DWORD res = GetModuleFileNameA(0, szFilename, MAX_PATH);
  45. if (res == 0)
  46. {
  47. return ret;
  48. }
  49. string fullpath = szFilename;
  50. string::size_type firstHit = fullpath.find_last_of('\\');
  51. if (firstHit == string::npos || firstHit == 0)
  52. {
  53. return ret;
  54. }
  55. ret = fullpath.substr(0, firstHit);//kick last \
  56. return ret;
  57. }
  58. nsGEN::IMDDevice::IMDDevice(std::shared_ptr <IOEventCenter> center, nsSCF::SCF SCF) : super(center, SCF)
  59. {
  60. assert(EventCenter);
  61. string version;
  62. if (GetVersion(version, hMyModule))
  63. mLog::FINFO("\n===============IMD log begin : module version:{$} ===================\n", version.c_str());
  64. else
  65. mLog::FINFO("\n===============log begin : version:0.0.0.0 ===================\n");
  66. //获取delta动态库版本号
  67. string strDeltaPath;
  68. strDeltaPath = GetDynamicLibraryPath() + "\\CCOS.Dev.Generator.IMD64.dll";
  69. string strVersion;
  70. strVersion = GetFileVersion(strDeltaPath);
  71. mLog::FINFO("=====================log begin :delta dll version{$}===strDeltaPath {$}====================", strVersion, strDeltaPath);
  72. mLog::FINFO("Enter IMDDevice(std::shared_ptr <IOEventCenter> center, nsSCF::SCF SCF) : super(center, SCF)");
  73. m_DoseUnit.m_KV.reset(new KVMould(0.0, 40.0, 120.0, 1.0));
  74. m_DoseUnit.m_MA.reset(new MAMould(0.0, 1.0, 1000.0, 0.1));
  75. m_DoseUnit.m_MS.reset(new MSMould(0.0, 1.0, 10000.0, 0.01));
  76. m_DoseUnit.m_MAS.reset(new MASMould(0.0, 0.5, 1000.0, 0.01));
  77. m_DoseUnit.m_Techmode.reset(new TECHMODEMould(0, 0, 2, 1));
  78. m_DoseUnit.m_WS.reset(new WORKSTATIONMould(1, 0, 5, 1));
  79. m_DoseUnit.m_Focus.reset(new FOCUSMould(1, 0, 1, 1));
  80. m_DoseUnit.m_AECField.reset(new AECFIELDMould(0, 0, 111, 1));
  81. m_DoseUnit.m_AECFilm.reset(new AECFILMMould(0, 0, 2, 1));
  82. m_DoseUnit.m_AECDensity.reset(new AECDENSITYMould(0, -4, 4, 1));
  83. m_DoseUnit.m_HE.reset(new TUBEHEATMould(0, 0, 100, 1));
  84. m_DoseUnit.m_PostKV.reset(new POSTKVMould(0.0, 40.0, 120.0, 1.0));
  85. m_DoseUnit.m_PostMA.reset(new POSTMAMould(0.0, 1.0, 1000.0, 0.1));
  86. m_DoseUnit.m_PostMS.reset(new POSTMSMould(0.0, 1.0, 10000.0, 0.01));
  87. m_DoseUnit.m_PostMAS.reset(new POSTMASMould(0.0, 0.5, 1000.0, 0.01));
  88. m_DoseUnit.m_GenSynState.reset(new GENSYNSTATEMould(0, AttrKey::GENERATOR_SYNC_ERR, AttrKey::GENERATOR_SYNC_MAX, 1));
  89. m_DoseUnit.m_GenState.reset(new GENSTATEMould(0, AttrKey::GENERATOR_STATUS_SHUTDOWN, AttrKey::GENERATOR_STATUS_MAX, 1));
  90. m_DoseUnit.m_GenTotalExpNumber.reset(new TOTALEXPNUMMould(0, 0, 9999, 1));
  91. m_DoseUnit.m_GenTotalAcqTimes.reset(new TOTALACQTIMESMould(0, 0, 9999, 1));
  92. m_DoseUnit.m_GenTubeCoolWaitTimes.reset(new TUBECOOLTIMEMould(0, 0, 9999, 1));
  93. m_DoseUnit.m_GenTubeOverLoadNumber.reset(new TUBEOVERLOADNUMMould(0, 0, 9999, 1));
  94. m_DoseUnit.m_GenCurrentExpNumber.reset(new CUREXPNUMMould(0, 0, 9999, 1));
  95. m_DoseUnit.m_ExpMode.reset(new EXPMODEMould(AttrKey::EXPMODE_TYPE::Single));
  96. m_DoseUnit.m_FrameRate.reset(new FRAMERATEMould(0, 0, 16, 1));
  97. m_DoseUnit.m_FLMode.reset(new FLUModeMould(AttrKey::GENERATOR_FLUMode::GENERATOR_FLMODE_NOTFLU));
  98. m_MSGUnit.reset(new nsDetail::MSGUnit(center, nsGEN::GeneratorUnitType));
  99. m_DAP.reset(new DevDAP::DOSEMould(0.0, 0.0, 1000.0, 0.01));
  100. m_DoseUnit.m_FLMode.reset(new FLUModeMould(AttrKey::GENERATOR_FLUMode::GENERATOR_FLMODE_NOTFLU));
  101. m_DoseUnit.m_FLIntTime.reset(new FLUIntTimeMould(0.0, 0.0, 100.0, 0.1));
  102. m_DoseUnit.m_FLAccTime.reset(new FLAccTimeMould(0.0, 0.0, 999.0, 0.1));
  103. m_DoseUnit.m_FLKV.reset(new FLUKVMould(0, 40, 125, 1));
  104. m_DoseUnit.m_FLMS.reset(new FLUMSMould(10.0, 10.0, 999999.0, 0.01));
  105. m_DoseUnit.m_FLMA.reset(new FLUMAMould(0.5, 0.5, 99.0, 0.1));
  106. m_DoseUnit.m_ABSStatus.reset(new FLUABSStatusMould(0, 0, 2, 1));
  107. m_DoseUnit.m_PPS.reset(new PPSMould(0.5, 0.5, 30, 0.1));
  108. m_DoseUnit.m_DoseLevel.reset(new FLUDoseLevelMould(0, 0, 2, 1));
  109. m_DoseUnit.m_Curve.reset(new FLUCurveMould(0, 0, 3, 1));
  110. m_hGenPostEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
  111. m_pHardwareStatusThread = NULL;
  112. OnCallBack();
  113. Register();
  114. Reset();
  115. HWSend("SMK07"); //1 初始化时使能系统配置类型 指令system marker SMKnn 逸动C - ARM系统设置为7.
  116. HWSend("DSN01");
  117. RefreshData();
  118. StartHardwareStatusThread();
  119. mLog::FINFO("Exit IMDDevice(std::shared_ptr <IOEventCenter> center, nsSCF::SCF SCF) : super(center, SCF)");
  120. }
  121. std::string IMDDevice::GetDynamicLibraryPath()
  122. {
  123. HMODULE hModule = GetModuleHandle("CCOS.Dev.Generator.IMD64.dll");
  124. char path[MAX_PATH];
  125. GetModuleFileName(hModule, path, MAX_PATH);
  126. std::string fullPath(path);
  127. size_t pos = fullPath.find_last_of("\\/");
  128. mLog::FINFO("Delta dll fullPath {$}", fullPath);
  129. return fullPath.substr(0, pos);
  130. }
  131. std::string IMDDevice::GetFileVersion(std::string strFilePathName)
  132. {
  133. DWORD dwVerSize = GetFileVersionInfoSize(strFilePathName.c_str(), NULL);
  134. if (dwVerSize == 0)
  135. {
  136. return false;
  137. }
  138. LPVOID pVersionBuffer = malloc(dwVerSize);
  139. GetFileVersionInfo(strFilePathName.c_str(), 0, dwVerSize, pVersionBuffer);
  140. VS_FIXEDFILEINFO* pInfo;
  141. UINT nInfoLen;
  142. std::string strVersion = "";
  143. if (VerQueryValue(pVersionBuffer, "\\", (void**)&pInfo, &nInfoLen))
  144. {
  145. strVersion = to_string(HIWORD(pInfo->dwFileVersionMS)) + "." + to_string(LOWORD(pInfo->dwFileVersionMS)) + "."
  146. + to_string(HIWORD(pInfo->dwFileVersionLS)) + "." + to_string(LOWORD(pInfo->dwFileVersionLS));
  147. }
  148. return strVersion;
  149. }
  150. bool CCOS::Dev::Detail::Generator::IMDDevice::LoadConfig(string configfile)
  151. {
  152. std::ifstream file(configfile);
  153. if (!file) {
  154. // 文件不存在,直接返回空的Connection对象
  155. mLog::FINFO("Config file does not exist: {$}", configfile);
  156. return -1;
  157. }
  158. else
  159. {
  160. mLog::FINFO("load {$} successful", configfile.c_str());
  161. }
  162. if (m_bLoadConfigFile)
  163. {
  164. mLog::FINFO("Configuration already loaded.");
  165. return 0;
  166. }
  167. ResDataObject temp;
  168. m_strConfigPath = configfile;
  169. temp.loadFile(m_strConfigPath.c_str());
  170. m_GenConfig = temp["CONFIGURATION"];
  171. TransJsonText(m_GenConfig);
  172. m_bLoadConfigFile = true;
  173. return true;
  174. }
  175. nsGEN::IMDDevice::IMDDevice(std::shared_ptr <IOEventCenter> center, nsSCF::SCF SCF, string configfile) : super(center, SCF)
  176. {
  177. assert(EventCenter);
  178. mLog::FINFO("verson:3.0.0.2");
  179. m_DoseUnit.m_KV.reset(new KVMould(0.0, 40.0, 120.0, 1.0));
  180. m_DoseUnit.m_MA.reset(new MAMould(0.0, 1.0, 1000.0, 0.1));
  181. m_DoseUnit.m_MS.reset(new MSMould(0.0, 1.0, 10000.0, 0.01));
  182. m_DoseUnit.m_MAS.reset(new MASMould(0.0, 0.5, 1000.0, 0.01));
  183. m_DoseUnit.m_Techmode.reset(new TECHMODEMould(0, 0, 2, 1));
  184. m_DoseUnit.m_WS.reset(new WORKSTATIONMould(1, 0, 5, 1));
  185. m_DoseUnit.m_Focus.reset(new FOCUSMould(1, 0, 1, 1));
  186. m_DoseUnit.m_AECField.reset(new AECFIELDMould(0, 0, 111, 1));
  187. m_DoseUnit.m_AECFilm.reset(new AECFILMMould(0, 0, 2, 1));
  188. m_DoseUnit.m_AECDensity.reset(new AECDENSITYMould(0, -4, 4, 1));
  189. m_DoseUnit.m_HE.reset(new TUBEHEATMould(0, 0, 100, 1));
  190. m_DoseUnit.m_PostKV.reset(new POSTKVMould(0.0, 40.0, 120.0, 1.0));
  191. m_DoseUnit.m_PostMA.reset(new POSTMAMould(0.0, 1.0, 1000.0, 0.1));
  192. m_DoseUnit.m_PostMS.reset(new POSTMSMould(0.0, 1.0, 10000.0, 0.01));
  193. m_DoseUnit.m_PostMAS.reset(new POSTMASMould(0.0, 0.5, 1000.0, 0.01));
  194. m_DoseUnit.m_GenSynState.reset(new GENSYNSTATEMould(0, AttrKey::GENERATOR_SYNC_ERR, AttrKey::GENERATOR_SYNC_MAX, 1));
  195. m_DoseUnit.m_GenState.reset(new GENSTATEMould(0, AttrKey::GENERATOR_STATUS_SHUTDOWN, AttrKey::GENERATOR_STATUS_MAX, 1));
  196. m_DoseUnit.m_GenTotalExpNumber.reset(new TOTALEXPNUMMould(0, 0, 9999, 1));
  197. m_DoseUnit.m_GenTotalAcqTimes.reset(new TOTALACQTIMESMould(0, 0, 9999, 1));
  198. m_DoseUnit.m_GenTubeCoolWaitTimes.reset(new TUBECOOLTIMEMould(0, 0, 9999, 1));
  199. m_DoseUnit.m_GenTubeOverLoadNumber.reset(new TUBEOVERLOADNUMMould(0, 0, 9999, 1));
  200. m_DoseUnit.m_GenCurrentExpNumber.reset(new CUREXPNUMMould(0, 0, 9999, 1));
  201. m_DoseUnit.m_ExpMode.reset(new EXPMODEMould(AttrKey::EXPMODE_TYPE::Single));
  202. m_DoseUnit.m_FrameRate.reset(new FRAMERATEMould(0, 0, 16, 1));
  203. m_DoseUnit.m_FLMode.reset(new FLUModeMould(AttrKey::GENERATOR_FLUMode::GENERATOR_FLMODE_NOTFLU));
  204. m_MSGUnit.reset(new nsDetail::MSGUnit(center, nsGEN::GeneratorUnitType));
  205. m_DAP.reset(new DevDAP::DOSEMould(0.0, 0.0, 1000.0, 0.01));
  206. m_DoseUnit.m_FLMode.reset(new FLUModeMould(AttrKey::GENERATOR_FLUMode::GENERATOR_FLMODE_NOTFLU));
  207. m_DoseUnit.m_FLIntTime.reset(new FLUIntTimeMould(0.0, 0.0, 100.0, 0.1));
  208. m_DoseUnit.m_FLAccTime.reset(new FLAccTimeMould(0.0, 0.0, 999.0, 0.1));
  209. m_DoseUnit.m_FLKV.reset(new FLUKVMould(0, 40, 125, 1));
  210. m_DoseUnit.m_FLMS.reset(new FLUMSMould(10.0, 10.0, 999999.0, 0.01));
  211. m_DoseUnit.m_FLMA.reset(new FLUMAMould(0.5, 0.5, 99.0, 0.1));
  212. m_DoseUnit.m_ABSStatus.reset(new FLUABSStatusMould(0, 0, 2, 1));
  213. m_DoseUnit.m_PPS.reset(new PPSMould(0.5, 0.5, 30, 0.1));
  214. m_DoseUnit.m_DoseLevel.reset(new FLUDoseLevelMould(0, 0, 2, 1));
  215. m_DoseUnit.m_Curve.reset(new FLUCurveMould(0, 0, 3, 1));
  216. //m_DoseUnit.m_XwindowStatus.reset(new XWINDOWSITYMould(AttrKey::XWINDOW_OFF, AttrKey::XWINDOW_OFF, AttrKey::XWINDOW_ON, 1));
  217. m_hGenPostEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
  218. m_pHardwareStatusThread = NULL;
  219. m_bLoadConfigFile = false;
  220. m_strConfigPath = configfile;
  221. OnCallBack();
  222. Register();
  223. Reset();
  224. //int nSMK = (int)(m_GenConfig["SMK"]);
  225. //char cmdTemp[50] = { 0 };
  226. //sprintf_s(cmdTemp, "SMK%02d", nSMK);
  227. //HWSend(cmdTemp);
  228. //int nDSN = (int)(m_GenConfig["DSN"]);
  229. //sprintf_s(cmdTemp, "DSN%02d", nDSN);
  230. //HWSend(cmdTemp);
  231. HWSend("RSM1"); //表示脚闸的涵义,0 not used , 1 rad , 2 control ,3 cine.
  232. HWSend("FLD2"); //doselevel :H M L ,默认是2
  233. HWSend("FFP2");
  234. HWSend("FTO060"); //timeout 60s
  235. HWSend("XET0");
  236. HWSend("EST");
  237. RefreshData();
  238. StartHardwareStatusThread();
  239. }
  240. void nsGEN::IMDDevice::SubscribeSelf(ccos_mqtt_connection* conn)
  241. {
  242. SubscribeTopic(conn, "CCOS/DEVICE/Subsystem/Notify/CurrentSMState");
  243. }
  244. nsGEN::IMDDevice::~IMDDevice()
  245. {
  246. CloseHandle(m_hGenPostEvent);
  247. }
  248. std::string nsGEN::IMDDevice::GetGUID() const
  249. {
  250. mLog::FINFO("\n===============GetGUID : {$} ===================\n", GeneratorUnitType);
  251. return GeneratorUnitType;
  252. }
  253. void nsGEN::IMDDevice::Register()
  254. {
  255. auto Disp = &Dispatch;
  256. superGen::Register(Disp);
  257. superGen::RegisterRAD(Disp);
  258. superGen::RegisterAEC(Disp);
  259. superGen::RegisterExpEnable(Disp);
  260. superGen::RegisterFluoro(Disp);
  261. superGen::RegisterGeneratortoSyncStatus(Disp);
  262. Disp->Get.Push(m_MSGUnit->GetKey().c_str(), [this](std::string& out) { out = m_MSGUnit->JSGet(); return RET_STATUS::RET_SUCCEED; });
  263. auto fun_Clear_DAP = [this](auto a, auto&)
  264. {
  265. return Clear_DAP();
  266. };
  267. Disp->Action.Push("Clear_DAP", fun_Clear_DAP);
  268. auto fun_GetValue_DAP = [this](auto a, auto& b)
  269. {
  270. float value = 0;
  271. RET_STATUS ret = GetValue_DAP(value);
  272. b = ToJSON(value);
  273. return ret;
  274. };
  275. Disp->Action.Push("GetValue_DAP", fun_GetValue_DAP);
  276. //auto fun_StartMove = [this](auto a,auto& b)
  277. //{
  278. // return StartMove();
  279. //};
  280. //Disp->Action.Push("SetExoStartTic", fun_StartMove);
  281. //auto fun_EndMove = [this](auto a, auto& b)
  282. //{
  283. // return EndMove();
  284. //};
  285. //Disp->Action.Push("SetExoEndTic", fun_EndMove);
  286. }
  287. RET_STATUS nsGEN::IMDDevice::IncKV()
  288. {
  289. if (!m_DoseUnit.m_KV->CanInc()) return RET_STATUS::RET_SUCCEED;
  290. return HWSend("RKVI");
  291. }
  292. RET_STATUS nsGEN::IMDDevice::DecKV()
  293. {
  294. if (!m_DoseUnit.m_KV->CanDec()) return RET_STATUS::RET_SUCCEED;
  295. return HWSend("RKVD");
  296. }
  297. RET_STATUS nsGEN::IMDDevice::SetKV(float value)
  298. {
  299. if (!m_DoseUnit.m_KV->Verify(value)) return RET_STATUS::RET_SUCCEED;
  300. char temp[50] = { 0 };
  301. sprintf_s(temp, "RKV%03d", (int)value);
  302. return HWSend(temp);
  303. }
  304. RET_STATUS nsGEN::IMDDevice::IncMA()
  305. {
  306. if (!m_DoseUnit.m_MA->CanInc()) return RET_STATUS::RET_SUCCEED;
  307. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_V2TYPE::ET_MAS)
  308. {
  309. mLog::FINFO("\n Techmode is MAS, can't inc MA");
  310. return RET_STATUS::RET_FAILED;
  311. }
  312. return HWSend("RMAI");
  313. }
  314. RET_STATUS nsGEN::IMDDevice::DecMA()
  315. {
  316. if (!m_DoseUnit.m_MA->CanDec()) return RET_STATUS::RET_SUCCEED;
  317. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_V2TYPE::ET_MAS)
  318. {
  319. mLog::FINFO("\n Techmode is MAS, can't dec MA");
  320. return RET_STATUS::RET_FAILED;
  321. }
  322. return HWSend("RMAD");
  323. }
  324. RET_STATUS nsGEN::IMDDevice::SetMA(float value)
  325. {
  326. if (!m_DoseUnit.m_MA->Verify(value)) return RET_STATUS::RET_SUCCEED;
  327. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_V2TYPE::ET_MAS)
  328. {
  329. mLog::FINFO("\n Techmode is MAS, can't set MA");
  330. return RET_STATUS::RET_FAILED;
  331. }
  332. char temp[50] = { 0 };
  333. sprintf_s(temp, "RMA%06d", (int)(value * 100));
  334. return HWSend(temp);
  335. }
  336. RET_STATUS nsGEN::IMDDevice::IncMS()
  337. {
  338. if (!m_DoseUnit.m_MS->CanInc()) return RET_STATUS::RET_SUCCEED;
  339. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_V2TYPE::ET_MAS)
  340. {
  341. mLog::FINFO("\n Techmode is MAS, can't inc MS");
  342. return RET_STATUS::RET_FAILED;
  343. }
  344. return HWSend("RMSI");
  345. }
  346. RET_STATUS nsGEN::IMDDevice::DecMS()
  347. {
  348. if (!m_DoseUnit.m_MS->CanDec()) return RET_STATUS::RET_SUCCEED;
  349. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_V2TYPE::ET_MAS)
  350. {
  351. mLog::FINFO("\n Techmode is MAS, can't dec MS");
  352. return RET_STATUS::RET_FAILED;
  353. }
  354. return HWSend("RMSD");
  355. }
  356. RET_STATUS nsGEN::IMDDevice::SetMS(float value)
  357. {
  358. if (!m_DoseUnit.m_MA->Verify(value)) return RET_STATUS::RET_SUCCEED;
  359. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_V2TYPE::ET_MAS)
  360. {
  361. mLog::FINFO("\n Techmode is MAS, can't set MS");
  362. return RET_STATUS::RET_FAILED;
  363. }
  364. char temp[50] { 0 };
  365. sprintf_s(temp, "RMS%07d", (int)(value * 100));
  366. return HWSend(temp);
  367. }
  368. RET_STATUS nsGEN::IMDDevice::IncMAS()
  369. {
  370. if (!m_DoseUnit.m_MAS->CanInc()) return RET_STATUS::RET_SUCCEED;
  371. if (m_DoseUnit.m_Techmode->Get() != AttrKey::TECHMODE_V2TYPE::ET_MAS)
  372. {
  373. mLog::FINFO("\n Techmode is not MAS, can't inc MAS");
  374. return RET_STATUS::RET_FAILED;
  375. }
  376. return HWSend("RMXI");
  377. }
  378. RET_STATUS nsGEN::IMDDevice::DecMAS()
  379. {
  380. if (!m_DoseUnit.m_MAS->CanDec()) return RET_STATUS::RET_SUCCEED;
  381. if (m_DoseUnit.m_Techmode->Get() != AttrKey::TECHMODE_V2TYPE::ET_MAS)
  382. {
  383. mLog::FINFO("\n Techmode is not MAS, can't dec MAS");
  384. return RET_STATUS::RET_FAILED;
  385. }
  386. return HWSend("RMXD");
  387. }
  388. RET_STATUS nsGEN::IMDDevice::SetMAS(float value)
  389. {
  390. if (!m_DoseUnit.m_MA->Verify(value)) return RET_STATUS::RET_SUCCEED;
  391. if (m_DoseUnit.m_Techmode->Get() != AttrKey::TECHMODE_V2TYPE::ET_MAS)
  392. {
  393. mLog::FINFO("\n Techmode is not MAS, can't set MAS");
  394. return RET_STATUS::RET_FAILED;
  395. }
  396. char temp[50] = { 0 };
  397. sprintf_s(temp, "RMX%06d", (int)(value * 1000));
  398. return HWSend(temp);
  399. }
  400. RET_STATUS nsGEN::IMDDevice::SetTechmode(int value)
  401. {
  402. if (!m_DoseUnit.m_Techmode->Verify(value)) return RET_STATUS::RET_SUCCEED;
  403. if (value == AttrKey::TECHMODE_V2TYPE::ET_AEC)//if AEC, translate to time. why? i need reason.
  404. value = AttrKey::TECHMODE_V2TYPE::ET_TIME;
  405. char temp[50] = { 0 };
  406. sprintf_s(temp, "RET%01d", (int)value);
  407. return HWSend(temp);
  408. }
  409. RET_STATUS nsGEN::IMDDevice::SetFocus(int value)
  410. {
  411. if (!m_DoseUnit.m_Focus->Verify(value)) return RET_STATUS::RET_SUCCEED;
  412. char temp[50] = { 0 };
  413. sprintf_s(temp, "RFO%01d", (int)value);
  414. return HWSend(temp);
  415. }
  416. RET_STATUS nsGEN::IMDDevice::SetAECDensity(int value)
  417. {
  418. if (!m_DoseUnit.m_AECDensity->Verify(value)) return RET_STATUS::RET_SUCCEED;
  419. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_V2TYPE::ET_AEC)
  420. return RET_STATUS::RET_FAILED;
  421. char temp[50] = { 0 };
  422. if (value >= 0)
  423. {
  424. sprintf_s(temp, "RFN+%01d", (int)value);
  425. }
  426. else
  427. {
  428. sprintf_s(temp, "RFN-%01d", (int)value);
  429. }
  430. return HWSend(temp);
  431. }
  432. RET_STATUS nsGEN::IMDDevice::SetAECField(int value)
  433. {
  434. if (!m_DoseUnit.m_AECField->Verify(value)) return RET_STATUS::RET_SUCCEED;
  435. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_V2TYPE::ET_MAS)
  436. return RET_STATUS::RET_FAILED;
  437. char temp[50] = { 0 };
  438. sprintf_s(temp, "RFI%03d", (int)value);
  439. return HWSend(temp);
  440. }
  441. RET_STATUS nsGEN::IMDDevice::SetAECFilm(int value)
  442. {
  443. if (!m_DoseUnit.m_AECFilm->Verify(value)) return RET_STATUS::RET_SUCCEED;
  444. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_V2TYPE::ET_MAS)
  445. return RET_STATUS::RET_FAILED;
  446. char temp[50] = { 0 };
  447. sprintf_s(temp, "RFS%03d", (int)value);
  448. return HWSend(temp);
  449. }
  450. RET_STATUS nsGEN::IMDDevice::SetWS(const string value)
  451. {
  452. int tempws = 0;
  453. if (value == "Table") tempws = 0;
  454. else if (value == "Wall") tempws = 1;
  455. else if (value == "Direct") tempws = 2;
  456. else if (value == "Free") tempws = 3;
  457. char temp[50] = { 0 };
  458. sprintf_s(temp, "EWS%01d", tempws);
  459. return HWSend(temp);
  460. }
  461. RET_STATUS nsGEN::IMDDevice::SetAPR(const _tAPRArgs& t)
  462. {
  463. m_t = t;
  464. {
  465. mLog::FINFO("*********************Enter SetAPR**********************");
  466. if (!m_DoseUnit.m_KV->Verify(t.fKV))
  467. {
  468. mLog::FERROR("SetAPR:KV Out of bounds[{$}] \n", t.fKV);
  469. }
  470. else if (!m_DoseUnit.m_MA->Verify(t.fMA) && (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_TYPE::TECHMODE_NOAEC_3P ||
  471. m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_TYPE::TECHMODE_AEC_3P))
  472. {
  473. mLog::FERROR("SetAPR:MA Out of bounds[{$}] \n", t.fMA);
  474. }
  475. else if (!m_DoseUnit.m_MS->Verify(t.fMS) && (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_TYPE::TECHMODE_NOAEC_3P ||
  476. m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_TYPE::TECHMODE_AEC_3P))
  477. {
  478. mLog::FERROR("SetAPR:MS Out of bounds[{$}] \n", t.fMS);
  479. }
  480. else if (!m_DoseUnit.m_MAS->Verify(t.fMAS) && (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_TYPE::TECHMODE_NOAEC_2P ||
  481. m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_TYPE::TECHMODE_AEC_2P))
  482. {
  483. mLog::FERROR("SetAPR:MAS Out of bounds[{$}] \n", t.fMAS);
  484. //add by wxx for test
  485. float oldKV = m_DoseUnit.m_KV->Get();
  486. float oldMAS = m_DoseUnit.m_MAS->Get();
  487. float oldMA = m_DoseUnit.m_MA->Get();
  488. float oldMS = m_DoseUnit.m_MS->Get();
  489. int oldFocus = m_DoseUnit.m_Focus->Get();
  490. mLog::FERROR("SetAPR:old KV[{$}],MAS[{$}],MA[{$}],Focus[{$}]", oldKV, oldMAS, oldMA, oldFocus);
  491. char temp[50] = { 0 };
  492. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_TYPE::TECHMODE_NOAEC_3P ||
  493. m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_TYPE::TECHMODE_AEC_3P)
  494. {
  495. SetKV(oldKV);
  496. SetMS(oldMA);
  497. SetMA(oldMA);
  498. SetFocus(oldFocus);
  499. //char temp[50] = { 0 };
  500. //sprintf_s(temp, "50,%d,%d,%d,%d,", (int)(oldMS), (int)round(oldKV * 1000 / 12.21), (int)round(oldMA / 0.04884), (int)(oldFocus));
  501. //return HWSend(temp);
  502. }
  503. else if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_TYPE::TECHMODE_NOAEC_2P ||
  504. m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_TYPE::TECHMODE_AEC_2P)
  505. {
  506. //char temp[50] = { 0 };
  507. //sprintf_s(temp, "10,%d,", (int)round(oldKV * 1000 / 12.21));
  508. //HWSend(temp);
  509. SetKV(oldKV);
  510. float tempValue = oldMAS;
  511. if (m_DoseUnit.m_MAS->CanToUpdate(tempValue, g_MAS_List))
  512. {
  513. mLog::FDEBUG("SetAPR:update MAS[{$}]->[{$}]->[{$}]", m_DoseUnit.m_MAS->Get(), oldFocus, tempValue);
  514. SetMAS(tempValue);
  515. //char temp[50] = { 0 };
  516. //sprintf_s(temp, "74,%d,", (int)round(tempValue / 0.1));
  517. //HWSend(temp);
  518. }
  519. }
  520. }
  521. else if (!m_DoseUnit.m_Focus->Verify(t.nFocus))
  522. {
  523. mLog::FERROR("SetAPR:Focus Out of bounds[{$}] \n", t.nFocus);
  524. }
  525. else
  526. {
  527. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_TYPE::TECHMODE_NOAEC_3P ||
  528. m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_TYPE::TECHMODE_AEC_3P)
  529. {
  530. SetKV(t.fKV);
  531. SetMS(t.fMS);
  532. SetMA(t.fMA);
  533. SetFocus(t.nFocus);
  534. //char temp[50] = { 0 };
  535. //sprintf_s(temp, "50,%d,%d,%d,%d,", (int)(t.fMS), (int)round(t.fKV * 1000 / 12.21), (int)round(t.fMA / 0.04884), (int)(t.nFocus));
  536. //return HWSend(temp);
  537. }
  538. else if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_TYPE::TECHMODE_NOAEC_2P ||
  539. m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_TYPE::TECHMODE_AEC_2P)
  540. {
  541. //char temp[50] = { 0 };
  542. //sprintf_s(temp, "10,%d,", (int)round(t.fKV * 1000 / 12.21));
  543. //HWSend(temp);
  544. SetKV(t.fKV);
  545. float tempValue = t.fMAS;
  546. if (m_DoseUnit.m_MAS->CanToUpdate(tempValue, g_MAS_List))
  547. {
  548. SetMAS(tempValue);
  549. mLog::FDEBUG("SetAPR:update MAS[{$}]->[{$}]->[{$}]", m_DoseUnit.m_MAS->Get(), t.fMAS, tempValue);
  550. //char temp[50] = { 0 };
  551. //sprintf_s(temp, "74,%d,", (int)round(tempValue / 0.1));
  552. //HWSend(temp);
  553. }
  554. }
  555. }
  556. }
  557. return RET_STATUS::RET_SUCCEED;
  558. }
  559. RET_STATUS nsGEN::IMDDevice::SetAPF(const _tAPFArgs& t)
  560. {
  561. mLog::FINFO("SetAPF: nWS={$}, Flu mode ={$}, ABS mode ={$}, DoseLever ={$}, nFlkv =={$}, FlMA ={$}", t.nWS, t.nFluMode, t.nABSMode, t.nDoseLever, t.nFLKV, t.fFLMA, t.nPPS);
  562. //SetABSMode(t.nABSMode);
  563. //SetFLFMode(to_string(t.nFluMode));
  564. //SetFluDoseLever(t.nDoseLever);
  565. SetFluKV(t.nFLKV);
  566. Sleep(20);
  567. SetFluMA(t.fFLMA);
  568. return RET_STATUS::RET_SUCCEED;
  569. }
  570. RET_STATUS nsGEN::IMDDevice::QueryHE(int& value)
  571. {
  572. return RET_STATUS::RET_SUCCEED;
  573. }
  574. RET_STATUS nsGEN::IMDDevice::QueryPostKV(float& value)
  575. {
  576. value = m_DoseUnit.m_PostKV->Get();
  577. return RET_STATUS::RET_SUCCEED;
  578. }
  579. RET_STATUS nsGEN::IMDDevice::QueryPostMA(float& value)
  580. {
  581. return HWSend("RAP?");
  582. }
  583. RET_STATUS nsGEN::IMDDevice::QueryPostMS(float& value)
  584. {
  585. return HWSend("RAT?");
  586. }
  587. RET_STATUS nsGEN::IMDDevice::QueryPostMAS(float& value)
  588. {
  589. value = m_DoseUnit.m_PostMAS->Get();
  590. return RET_STATUS::RET_SUCCEED;
  591. }
  592. RET_STATUS nsGEN::IMDDevice::Clear_DAP()
  593. {
  594. char temp[50] = "EDZ";
  595. return HWSend(temp);
  596. }
  597. RET_STATUS nsGEN::IMDDevice::GetValue_DAP(float& value)
  598. {
  599. value = m_DAP->Get();
  600. return RET_STATUS::RET_SUCCEED;
  601. }
  602. void nsGEN::IMDDevice::StartMove()
  603. {
  604. mLog::FINFO("Enter startMove");
  605. char temp[50] = { 0 };
  606. sprintf_s(temp, "RPW%04d", (int)(10));
  607. HWSend(temp);
  608. //点片EXO2 ,PF :EXO1 CF:EXO3 from zhao?? 不知道哪来的逻辑,应该是只有0和1才对
  609. if (m_DoseUnit.m_ExpMode->JSGet() == AttrKey::EXPMODE_TYPE::Single)
  610. {
  611. sprintf_s(temp, "EXO%01d", (int)(2));
  612. HWSend(temp);
  613. }
  614. else if (m_DoseUnit.m_ExpMode->JSGet() == AttrKey::EXPMODE_TYPE::TOMO)
  615. {
  616. sprintf_s(temp, "EXO%01d", (int)(1));
  617. HWSend(temp);
  618. }
  619. else if (m_DoseUnit.m_ExpMode->JSGet() == AttrKey::EXPMODE_TYPE::CoutineSerial)
  620. {
  621. sprintf_s(temp, "EXO%01d", (int)(3));
  622. HWSend(temp);
  623. }
  624. else if (m_DoseUnit.m_ExpMode->JSGet() == AttrKey::EXPMODE_TYPE::PulseSerial)
  625. {
  626. sprintf_s(temp, "EXO%01d", (int)(1));
  627. HWSend(temp);
  628. }
  629. if (m_DoseUnit.m_ExpMode->JSGet() != AttrKey::EXPMODE_TYPE::CoutineSerial)
  630. {
  631. sprintf_s(temp, "TIC%01d", (int)(1));
  632. HWSend(temp);
  633. }
  634. mLog::FINFO("end startmove");
  635. }
  636. void nsGEN::IMDDevice::EndMove()
  637. {
  638. printf("enter EndMove\n");
  639. mLog::FINFO("Enter endmove");
  640. char temp[50]{ 0 };
  641. sprintf_s(temp, "EXO%01d", (int)(0));
  642. HWSend(temp);
  643. sprintf_s(temp, "TIC%01d", (int)(0));
  644. HWSend(temp);
  645. printf("end EndMove\n");
  646. mLog::FINFO("end EndMove");
  647. }
  648. RET_STATUS nsGEN::IMDDevice::SetGenSynState(int value)
  649. {
  650. return RET_STATUS::RET_SUCCEED;
  651. }
  652. RET_STATUS nsGEN::IMDDevice::SetGenState(int value)
  653. {
  654. return RET_STATUS::RET_SUCCEED;
  655. }
  656. RET_STATUS nsGEN::IMDDevice::SetExpMode(std::string value)
  657. {
  658. mLog::FINFO("Enter SetExpMode...{$}",value);
  659. m_DoseUnit.m_ExpMode->Update(value);
  660. //退出CBCT,设置exp mode时,强制退出cbct,因为放在endmove中,偶发执行不到的问题。
  661. if (m_DoseUnit.m_ExpMode->JSGet() == AttrKey::EXPMODE_TYPE::Single)
  662. {
  663. mLog::FINFO("now is Single mode, send RPS0");
  664. SetRPS(0);
  665. }
  666. else if(m_DoseUnit.m_ExpMode->JSGet() == AttrKey::EXPMODE_TYPE::TOMO)
  667. {
  668. mLog::FINFO("now is Single mode, send RPS");
  669. SetRPS((int)(10 * (m_DoseUnit.m_FrameRate->Get())));
  670. }
  671. else if (m_DoseUnit.m_ExpMode->JSGet() == AttrKey::EXPMODE_TYPE::PulseSerial)
  672. {
  673. HWSend("FLF2");
  674. }
  675. else if (m_DoseUnit.m_ExpMode->JSGet() == AttrKey::EXPMODE_TYPE::CoutineSerial)
  676. {
  677. HWSend("FLF1");
  678. }
  679. HWSend("TIC0");
  680. return RET_STATUS::RET_SUCCEED;
  681. }
  682. RET_STATUS nsGEN::IMDDevice::SetFLFMode(std::string value)
  683. {
  684. if (value == AttrKey::FLFMODE_TYPE::FLF_CONTI)
  685. {
  686. m_DoseUnit.m_FLMode->Update(AttrKey::GENERATOR_FLUMode::GENERATOR_FLMODE_CF);
  687. return HWSend("FLF1");
  688. }
  689. else if (value == AttrKey::FLFMODE_TYPE::FLF_HL_CONTI)
  690. {
  691. m_DoseUnit.m_FLMode->Update(AttrKey::GENERATOR_FLUMode::GENERATOR_FLMODE_HCF);
  692. return HWSend("FLF1");
  693. }
  694. else if (value == AttrKey::FLFMODE_TYPE::FLF_PULSE)
  695. {
  696. m_DoseUnit.m_FLMode->Update(AttrKey::GENERATOR_FLUMode::GENERATOR_FLMODE_PF);
  697. return HWSend("FLF2");
  698. }
  699. else if (value == AttrKey::FLFMODE_TYPE::FLF_HL_PULSE)
  700. {
  701. m_DoseUnit.m_FLMode->Update(AttrKey::GENERATOR_FLUMode::GENERATOR_FLMODE_HPF);
  702. return HWSend("FLF2");
  703. }
  704. return RET_STATUS::RET_SUCCEED;
  705. }
  706. RET_STATUS nsGEN::IMDDevice::SetGenCurrentSMState(std::string value)
  707. {
  708. m_strCurrentSMState = value;
  709. return RET_STATUS::RET_SUCCEED;
  710. }
  711. RET_STATUS nsGEN::IMDDevice::SetEXAMMode(std::string value)
  712. {
  713. return RET_STATUS::RET_SUCCEED;
  714. }
  715. RET_STATUS nsGEN::IMDDevice::SetFrameRate(FLOAT frameRate)
  716. {
  717. m_DoseUnit.m_FrameRate->Update(frameRate);
  718. return RET_STATUS::RET_SUCCEED;
  719. }
  720. RET_STATUS nsGEN::IMDDevice::SetRPS(int rps)
  721. {
  722. char temp[50]{ 0 };
  723. sprintf_s(temp, "RPS%03d", rps * 10);
  724. return HWSend(temp);
  725. }
  726. RET_STATUS nsGEN::IMDDevice::RefreshData()
  727. {
  728. HWSend("RKV?");
  729. HWSend("RMA?");
  730. HWSend("RMS?");
  731. HWSend("RR");
  732. return RET_STATUS::RET_SUCCEED;
  733. }
  734. RET_STATUS nsGEN::IMDDevice::SetExpEnable()
  735. {
  736. if (m_DoseUnit.m_GenState->Get() != nsGEN::AttrKey::GENERATOR_STATUS_ERROR)
  737. {
  738. m_DoseUnit.m_GenState->Update(nsGEN::AttrKey::GENERATOR_STATUS_STANDBY);
  739. FireNotify(AttrKey::GENSTATE, m_DoseUnit.m_GenState->JSGet());
  740. }
  741. return HWSend("EXB1");
  742. }
  743. RET_STATUS nsGEN::IMDDevice::SetExpDisable()
  744. {
  745. if (m_DoseUnit.m_GenState->Get() != nsGEN::AttrKey::GENERATOR_STATUS_ERROR)
  746. {
  747. m_DoseUnit.m_GenState->Update(nsGEN::AttrKey::GENERATOR_STATUS_SLEEP);
  748. FireNotify(AttrKey::GENSTATE, m_DoseUnit.m_GenState->JSGet());
  749. }
  750. return HWSend("EXB0");
  751. }
  752. RET_STATUS nsGEN::IMDDevice::Reset()
  753. {
  754. return HWSend("ERE1");
  755. }
  756. RET_STATUS nsGEN::IMDDevice::HWSend(char* strCommand, int nTimeOut)
  757. {
  758. if (!m_SCF) return RET_STATUS::RET_FAILED;
  759. char strSendCommand[100] = { 0 };
  760. int len = strlen(strCommand);
  761. int tmpSum = 0;
  762. for (int i = 0; i < len; i++)
  763. {
  764. tmpSum += (int)strCommand[i];
  765. }
  766. char checkSum = char(tmpSum + 5);
  767. strSendCommand[0] = 0x02;
  768. memcpy(strSendCommand + 1, strCommand, len);
  769. strSendCommand[len + 1] = 0x03;
  770. strSendCommand[len + 2] = checkSum;
  771. printf("==OUT==: %s \n", strSendCommand);
  772. mLog::FINFO("==OUT==: {$} \n", strSendCommand);
  773. int retLength;
  774. m_SCF.Lock(msTimeOut_Lock)
  775. .SendPacket(strSendCommand, strlen(strSendCommand), nTimeOut, retLength);
  776. Sleep(nTimeOut);
  777. return RET_STATUS::RET_SUCCEED;
  778. }
  779. //-----------------------------------------------------------------------------
  780. // ProcessCmd
  781. //-----------------------------------------------------------------------------
  782. void nsGEN::IMDDevice::FireNotify(std::string key, std::string content)
  783. {
  784. EventCenter->OnNotify(1, key, content);
  785. }
  786. struct tFrameMapping
  787. {
  788. static const int MaxLen = 5; // 前缀不能超超过 5 个字符 !
  789. using cbFun = std::function <void(const char*, int)>;
  790. char strHead[MaxLen];
  791. int NbOfCharOfHead;
  792. cbFun fun;
  793. tFrameMapping(char* str, int len, cbFun f)
  794. {
  795. assert(len < MaxLen); //len最大只能是4
  796. strHead[0] = 0x02; //STX
  797. for (int i = 0; i < len; i++) //给strHead赋值
  798. strHead[i + 1] = str[i];
  799. NbOfCharOfHead = len + 1;
  800. fun = f;
  801. }
  802. };
  803. static std::list <tFrameMapping> arFrame;
  804. static bool DecodeFrame(const char* strFrame, int length);
  805. void nsGEN::IMDDevice::OnCallBack()
  806. {
  807. auto HWNotProcess = [](const char* value, int length) -> void
  808. {
  809. printf("\n This commands didn't need to process!\n");
  810. mLog::FINFO("\n This commands didn't need to process!\n");
  811. };
  812. auto HWKV = [this](const char* value, int length) -> void
  813. {
  814. assert(value);
  815. if (m_DoseUnit.m_KV->Update(atof(value)))
  816. FireNotify(AttrKey::KV, m_DoseUnit.m_KV->JSGet());
  817. };
  818. auto HWMAS = [this](const char* value, int length)
  819. {
  820. assert(value);
  821. float fmas = atof(value) / 1000.0;
  822. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_V2TYPE::ET_TIME)
  823. {
  824. if (m_DoseUnit.m_MAS->Update(0))
  825. FireNotify(AttrKey::MAS, m_DoseUnit.m_MAS->JSGet());
  826. }
  827. else
  828. {
  829. if (m_DoseUnit.m_MAS->Update(fmas))
  830. FireNotify(AttrKey::MAS, m_DoseUnit.m_MAS->JSGet());
  831. }
  832. };
  833. auto HWMA = [this](const char* value, int length)
  834. {
  835. assert(value);
  836. float fma = atof(value) / 100.0;
  837. if (m_DoseUnit.m_MA->Update(fma))
  838. FireNotify(AttrKey::MA, m_DoseUnit.m_MA->JSGet());
  839. };
  840. auto HWMS = [this](const char* value, int length)
  841. {
  842. assert(value);
  843. if (m_DoseUnit.m_MS->Update(atof(value) / 100.0))
  844. FireNotify(AttrKey::MS, m_DoseUnit.m_MS->JSGet());
  845. };
  846. auto HWFocus = [this](const char* value, int length)
  847. {
  848. assert(value);
  849. if (m_DoseUnit.m_Focus->Update(atoi(value)))
  850. FireNotify(AttrKey::FOCUS, m_DoseUnit.m_Focus->JSGet());
  851. };
  852. auto HWTechmode = [this](const char* value, int length)
  853. {
  854. assert(value);
  855. if (m_DoseUnit.m_Techmode->Update(atoi(value)))
  856. FireNotify(AttrKey::TECHMODE, m_DoseUnit.m_Techmode->JSGet());
  857. };
  858. auto HWAECField = [this](const char* value, int length)
  859. {
  860. assert(value);
  861. int nvalue = atoi(value);
  862. if (m_DoseUnit.m_AECField->Update(nvalue))
  863. FireNotify(AttrKey::AECFIELD, m_DoseUnit.m_AECField->JSGet());
  864. };
  865. auto HWAECFilm = [this](const char* value, int length)
  866. {
  867. assert(value);
  868. if (m_DoseUnit.m_AECFilm->Update(atoi(value)))
  869. FireNotify(AttrKey::AECFILM, m_DoseUnit.m_AECFilm->JSGet());
  870. };
  871. auto HWAECDensity = [this](const char* value, int length)
  872. {
  873. assert(value);
  874. if (m_DoseUnit.m_AECDensity->Update(atoi(value)))
  875. FireNotify(AttrKey::AECDENSITY, m_DoseUnit.m_AECDensity->JSGet());
  876. };
  877. auto HWWS = [this](const char* value, int length)
  878. {
  879. assert(value);
  880. int nValue = atoi(value);
  881. if (m_DoseUnit.m_WS->Update(nValue))
  882. {
  883. FireNotify(m_DoseUnit.m_WS->GetKey(), m_DoseUnit.m_WS->JSGet());
  884. }
  885. };
  886. auto HWPR = [this](const char* value, int length)
  887. {
  888. assert(value);
  889. int nValue = atoi(value);
  890. if (nValue == 2)
  891. {
  892. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_READY);
  893. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  894. ResetEvent(m_hGenPostEvent);
  895. HWSend("PR2");
  896. m_DoseUnit.m_ExpMode->Update(AttrKey::EXPMODE_TYPE::Single);
  897. StartMove();
  898. }
  899. else if (nValue == 1)
  900. {
  901. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_PREPARE);
  902. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  903. HWSend("PR1");
  904. }
  905. else if (nValue == 0)
  906. {
  907. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_OFF);
  908. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  909. HWSend("PR0");
  910. EndMove();
  911. }
  912. };
  913. auto HWXR = [this](const char* value, int length)
  914. {
  915. assert(value);
  916. int nValue = atoi(value);
  917. if (nValue == 1)
  918. {
  919. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_XRAYON);
  920. }
  921. else if (nValue == 0)
  922. {
  923. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_OFF);
  924. HWSend("RAP?");
  925. HWSend("RAT?");
  926. }
  927. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  928. };
  929. auto HWAPDOSE = [this](const char* value, int length)//mas
  930. {
  931. assert(value);
  932. if(m_DoseUnit.m_PostMAS->Update(atof(value) / 1000.0))
  933. FireNotify(m_DoseUnit.m_PostMAS->GetKey(), m_DoseUnit.m_PostMAS->JSGet());
  934. //SetEvent(m_hGenPostEvent);
  935. };
  936. auto HWATDOSE = [this](const char* value, int length)
  937. {
  938. assert(value);
  939. if(m_DoseUnit.m_PostMS->Update(atof(value)))
  940. FireNotify(m_DoseUnit.m_PostMS->GetKey(), m_DoseUnit.m_PostMS->JSGet());
  941. //SetEvent(m_hGenPostEvent);
  942. };
  943. auto HWDAP = [this](const char* value, int length)
  944. {
  945. //assert(value);
  946. //m_DoseUnit.m_da->Update(atof(value));
  947. //FireNotify(m_DoseUnit.m_PostMS->GetKey(), m_DoseUnit.m_PostMS->JSGet());
  948. //SetEvent(m_hGenPostEvent);
  949. };
  950. auto HWERROR = [this](const char* value, int length)
  951. {
  952. assert(value);
  953. int nValue = atoi(value);
  954. if (nValue != 0)
  955. {
  956. char ErrorCode[10]{ "" };
  957. sprintf_s(ErrorCode, "IMDECOM_ERR_%d", nValue);
  958. int level = 1;
  959. m_MSGUnit->AddErrorMessage(ErrorCode, level, "");
  960. }
  961. else
  962. {
  963. int level = 1;
  964. char ErrorCode[10]{ "" };
  965. m_MSGUnit->DelErrorMessage(ErrorCode, level, "");
  966. }
  967. };
  968. auto HWWARN = [this](const char* value, int length)
  969. {
  970. assert(value);
  971. int nValue = atoi(value);
  972. if (nValue != 0)
  973. {
  974. char WarnCode[10]{ "" };
  975. sprintf_s(WarnCode, "IMDECOM_WARN_%d", nValue);
  976. int level = 1;
  977. m_MSGUnit->AddWarnMessage(WarnCode, level, "");
  978. }
  979. else
  980. {
  981. int level = 1;
  982. char WarnCode[10]{ "" };
  983. m_MSGUnit->AddWarnMessage(WarnCode, level, "");
  984. }
  985. };
  986. auto HWEHE = [this](const char* value, int length)
  987. {
  988. assert(value);
  989. if(m_DoseUnit.m_HE->Update(atoi(value)))
  990. FireNotify(m_DoseUnit.m_HE->GetKey(), m_DoseUnit.m_HE->JSGet());
  991. };
  992. auto HWFLK = [this](const char* value, int length)
  993. {
  994. assert(value);
  995. if (m_DoseUnit.m_FLKV->Update(atof(value)))
  996. FireNotify(AttrKey::FLUKV, m_DoseUnit.m_FLKV->JSGet());
  997. };
  998. auto HWFLM = [this](const char* value, int length)
  999. {
  1000. assert(value);
  1001. if (m_DoseUnit.m_FLMA->Update(atof(value)/10.0))
  1002. FireNotify(AttrKey::FLUMA, m_DoseUnit.m_FLMA->JSGet());
  1003. };
  1004. auto HWFLS = [this](const char* value, int length)
  1005. {
  1006. assert(value);
  1007. if (m_DoseUnit.m_PPS->Update(atof(value)/10.0))
  1008. FireNotify(AttrKey::FLUPPS, m_DoseUnit.m_PPS->JSGet());
  1009. };
  1010. auto HWFLX = [this](const char* value, int length)
  1011. {
  1012. assert(value);
  1013. int nValue = atoi(value);
  1014. if (nValue == 1)
  1015. {
  1016. m_bXrayonProcess = true;
  1017. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_FLU_XRAYON);
  1018. }
  1019. else if (nValue == 0)
  1020. {
  1021. m_bXrayonProcess = false;
  1022. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_FLU_XRAYOFF);
  1023. }
  1024. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  1025. };
  1026. auto HWFLP = [this](const char* value, int length)
  1027. {
  1028. assert(value);
  1029. int nValue = atoi(value);
  1030. mLog::FINFO("FLP value [{$}]", nValue);
  1031. if (nValue == 1)
  1032. {
  1033. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_FLU_READY); //根据全新定义 FLP1 才表示 ready。
  1034. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  1035. if (m_DoseUnit.m_FLMode->JSGet() == to_string(AttrKey::GENERATOR_FLUMode::GENERATOR_FLMODE_CF))
  1036. {
  1037. m_DoseUnit.m_ExpMode->Update(AttrKey::EXPMODE_TYPE::CoutineSerial);
  1038. }
  1039. else if (m_DoseUnit.m_FLMode->JSGet() == to_string(AttrKey::GENERATOR_FLUMode::GENERATOR_FLMODE_PF))
  1040. {
  1041. m_DoseUnit.m_ExpMode->Update(AttrKey::EXPMODE_TYPE::PulseSerial);
  1042. }
  1043. StartMove();
  1044. }
  1045. else if (nValue == 4)
  1046. {
  1047. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_FLU_READY); //根据全新定义 FLP4 才表示 ready。
  1048. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  1049. if (m_DoseUnit.m_FLMode->JSGet() == to_string(AttrKey::GENERATOR_FLUMode::GENERATOR_FLMODE_CF))
  1050. {
  1051. m_DoseUnit.m_ExpMode->Update(AttrKey::EXPMODE_TYPE::CoutineSerial);
  1052. }
  1053. else if (m_DoseUnit.m_FLMode->JSGet() == to_string(AttrKey::GENERATOR_FLUMode::GENERATOR_FLMODE_PF))
  1054. {
  1055. m_DoseUnit.m_ExpMode->Update(AttrKey::EXPMODE_TYPE::PulseSerial);
  1056. }
  1057. StartMove();
  1058. }
  1059. else if (nValue == 0)
  1060. {
  1061. m_bXrayonProcess = false;
  1062. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_FLU_OFF);
  1063. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  1064. EndMove();
  1065. }
  1066. };
  1067. auto HWFLI = [this](const char* value, int length)
  1068. {
  1069. assert(value);
  1070. if (m_DoseUnit.m_FLIntTime->Update(atof(value) / 10.0))
  1071. FireNotify(AttrKey::FLUIntTime, m_DoseUnit.m_FLIntTime->JSGet());
  1072. };
  1073. auto HWEST = [this](const char* value, int length)
  1074. {
  1075. assert(value);
  1076. int nValue = atoi(value);
  1077. mLog::FINFO("EST [{$}]", nValue);
  1078. assert(value);
  1079. if (nValue == 1)
  1080. {
  1081. m_DoseUnit.m_GenState->Update(AttrKey::GENERATOR_STATUS_INIT);
  1082. }
  1083. else if ((nValue == 4) || (nValue == 5))
  1084. {
  1085. m_DoseUnit.m_GenState->Update(AttrKey::GENERATOR_STATUS_EXP);
  1086. }
  1087. else if (nValue == 6)
  1088. {
  1089. m_DoseUnit.m_GenState->Update(AttrKey::GENERATOR_STATUS_CALIBRATION);
  1090. }
  1091. else if (nValue == 7)
  1092. {
  1093. m_DoseUnit.m_GenState->Update(AttrKey::GENERATOR_STATUS_ERROR);
  1094. }
  1095. else
  1096. {
  1097. m_DoseUnit.m_GenState->Update(AttrKey::GENERATOR_STATUS_STANDBY);
  1098. }
  1099. FireNotify(m_DoseUnit.m_GenState->GetKey(), m_DoseUnit.m_GenState->JSGet());
  1100. };
  1101. auto HWFLT = [this](const char* value, int length)
  1102. {
  1103. assert(value);
  1104. float flt = atof(value) / 10.0;
  1105. mLog::FINFO("flt: {$} ", flt);
  1106. m_DoseUnit.m_FLAccTime->Update(flt);
  1107. FireNotify(m_DoseUnit.m_FLAccTime->GetKey(), m_DoseUnit.m_FLAccTime->JSGet());
  1108. };
  1109. auto HWTIC = [this](const char* value, int length)
  1110. {
  1111. assert(value);
  1112. int nValue = atoi(value);
  1113. //try
  1114. //{
  1115. // if ((int)m_GenConfig["SendXwindowToDetector"] == 1)
  1116. // {
  1117. // m_pSubSystemClient = new LogicClient("DV3_Detector", "", "NSQ", false);
  1118. // if (m_pSubSystemClient->Open("CCOS/DEVICE/Subsystem/Notify/CurrentSMState", ALL_ACCESS)) //换成探测器的路径
  1119. // {
  1120. // mLog::FDEBUG("Ccos_V3 Create DV3_SubSystem Client success");
  1121. // }
  1122. // }
  1123. //}
  1124. //catch (const std::exception&)
  1125. //{
  1126. //}
  1127. //if (m_pSubSystemClient != NULL)
  1128. //{
  1129. // if (!m_pSubSystemClient->IsClosed())
  1130. // {
  1131. // mLog::FINFO("m_pSubSystemClient is open");
  1132. // ResDataObject Request, Response;
  1133. // Request.add("P0", 1);
  1134. // m_pSubSystemClient->Action("DualSecondExpReady", Request, Response, 4993);
  1135. // }
  1136. // else
  1137. // {
  1138. // mLog::FINFO("DV3_Detector Client is Close");
  1139. // }
  1140. //}
  1141. //else
  1142. //{
  1143. // mLog::FINFO("DV3_FullUCB Client is NULL");
  1144. //}
  1145. //mLog::FINFO("m_strCurrentSMState [{$}] nValue [{$}]", m_strCurrentSMState, nValue);
  1146. //while (strcmp(m_strCurrentSMState.c_str(), "FrameReady") == 0)
  1147. //{
  1148. // if (nValue == 10)
  1149. // {
  1150. // m_DoseUnit.m_XwindowStatus->Update(AttrKey::XWINDOW_ON);
  1151. // }
  1152. // else if (nValue == 01)
  1153. // {
  1154. // m_DoseUnit.m_XwindowStatus->Update(AttrKey::XWINDOW_OFF);
  1155. // }
  1156. // FireNotify(m_DoseUnit.m_XwindowStatus->GetKey(), m_DoseUnit.m_XwindowStatus->JSGet());
  1157. //}
  1158. };
  1159. // 有部分前缀是包含关系, 长的包含短的, 例如 KVS 包含了 KV.
  1160. // 因此长的在前面, 短的在后面
  1161. // !!! Device 是个短寿命对象, 而 arFrame 是静态变量 !!!
  1162. // !!! 因此, 在添加到 arFrame 之前, 务必先清零 !!!
  1163. arFrame.clear();
  1164. arFrame.push_back(tFrameMapping("RKVI", 4, HWNotProcess));
  1165. arFrame.push_back(tFrameMapping("RKVD", 4, HWNotProcess));
  1166. arFrame.push_back(tFrameMapping("RMAI", 4, HWNotProcess));
  1167. arFrame.push_back(tFrameMapping("RMAD", 4, HWNotProcess));
  1168. arFrame.push_back(tFrameMapping("RMSI", 4, HWNotProcess));
  1169. arFrame.push_back(tFrameMapping("RMSD", 4, HWNotProcess));
  1170. arFrame.push_back(tFrameMapping("RMXI", 4, HWNotProcess));
  1171. arFrame.push_back(tFrameMapping("RMXD", 4, HWNotProcess));
  1172. arFrame.push_back(tFrameMapping("EXB", 3, HWNotProcess));
  1173. arFrame.push_back(tFrameMapping("ERE", 3, HWNotProcess));
  1174. arFrame.push_back(tFrameMapping("RR", 2, HWNotProcess));
  1175. arFrame.push_back(tFrameMapping("RPS", 3, HWNotProcess));
  1176. arFrame.push_back(tFrameMapping("EXO", 3, HWNotProcess));
  1177. arFrame.push_back(tFrameMapping("TIC", 3, HWTIC));
  1178. arFrame.push_back(tFrameMapping("RTS", 3, HWNotProcess));
  1179. arFrame.push_back(tFrameMapping("DSN", 3, HWNotProcess));
  1180. arFrame.push_back(tFrameMapping("RKV", 3, HWKV));
  1181. arFrame.push_back(tFrameMapping("RMX", 3, HWMAS));
  1182. arFrame.push_back(tFrameMapping("RMA", 3, HWMA));
  1183. arFrame.push_back(tFrameMapping("RMS", 3, HWMS));
  1184. arFrame.push_back(tFrameMapping("RET", 3, HWTechmode));
  1185. arFrame.push_back(tFrameMapping("RFO", 3, HWFocus));
  1186. arFrame.push_back(tFrameMapping("RFI", 3, HWAECField));
  1187. arFrame.push_back(tFrameMapping("RFS", 3, HWAECFilm));
  1188. arFrame.push_back(tFrameMapping("RFN", 3, HWAECDensity));
  1189. arFrame.push_back(tFrameMapping("EWS", 3, HWWS));
  1190. arFrame.push_back(tFrameMapping("PR", 2, HWPR));
  1191. arFrame.push_back(tFrameMapping("XR", 2, HWXR));
  1192. arFrame.push_back(tFrameMapping("RAP", 3, HWAPDOSE));
  1193. arFrame.push_back(tFrameMapping("RAT", 3, HWATDOSE));
  1194. arFrame.push_back(tFrameMapping("ERR", 3, HWERROR));
  1195. arFrame.push_back(tFrameMapping("EWN", 3, HWWARN));
  1196. arFrame.push_back(tFrameMapping("EHE", 3, HWEHE));
  1197. arFrame.push_back(tFrameMapping("FLK", 3, HWFLK));
  1198. arFrame.push_back(tFrameMapping("FLM", 3, HWFLM));
  1199. arFrame.push_back(tFrameMapping("FLS", 3, HWFLS));
  1200. arFrame.push_back(tFrameMapping("FLF", 3, HWNotProcess));
  1201. arFrame.push_back(tFrameMapping("FLP", 3, HWFLP));
  1202. arFrame.push_back(tFrameMapping("FLX", 3, HWFLX));
  1203. arFrame.push_back(tFrameMapping("FLI", 3, HWFLI));
  1204. arFrame.push_back(tFrameMapping("FLT", 3, HWFLT));
  1205. arFrame.push_back(tFrameMapping("EST", 3, HWEST));
  1206. }
  1207. bool nsGEN::IMDDevice::StartHardwareStatusThread()
  1208. {
  1209. mLog::FINFO("enter Start HardwareStatus Thread ");
  1210. if (m_pHardwareStatusThread == NULL)
  1211. {
  1212. DWORD m_HardwareStatusID;
  1213. m_pHardwareStatusThread = CreateThread(0, 0, HardwareStatusThread, this, 0, &m_HardwareStatusID);
  1214. if (m_pHardwareStatusThread == NULL)
  1215. {
  1216. mLog::Fatal("Start HardwareStatus Thread Failed");
  1217. return false;
  1218. }
  1219. }
  1220. return true;
  1221. }
  1222. DWORD nsGEN::IMDDevice::HardwareStatusThread(LPVOID pParam)
  1223. {
  1224. IMDDevice* pCurGen = (IMDDevice*)pParam;
  1225. if (pCurGen == NULL)
  1226. {
  1227. return false;
  1228. }
  1229. mLog::FINFO("HardwareStatusThread start");
  1230. while (true)
  1231. {
  1232. Sleep(2000);
  1233. if (!pCurGen->m_bXrayonProcess)
  1234. {
  1235. pCurGen->HWSend("EHE?");
  1236. pCurGen->HWSend("EST");
  1237. //pCurGen->GetFluAccTimer();
  1238. }
  1239. }
  1240. mLog::FINFO("HardwareStatusThread stop");
  1241. return true;
  1242. }
  1243. bool nsGEN::IMDDevice::GetFLIntTimer()
  1244. {
  1245. mLog::FINFO("Enter GetFLIntTimer");
  1246. HWSend("FLI?");
  1247. return true;
  1248. }
  1249. //-----------------------------------------------------------------------------
  1250. // IMDDriver
  1251. //-----------------------------------------------------------------------------
  1252. nsGEN::IMDDriver::IMDDriver()
  1253. {
  1254. }
  1255. nsGEN::IMDDriver::~IMDDriver()
  1256. {
  1257. }
  1258. auto nsGEN::IMDDriver::CreateDevice(int index) -> std::unique_ptr <IODevice>
  1259. {
  1260. mLog::FINFO("CreateDevice");
  1261. m_pDevice = new IMDDevice(EventCenter, m_SCF, m_ConfigFileName);
  1262. auto dev = std::unique_ptr <IODevice>(new IODevice(m_pDevice));
  1263. return dev;
  1264. }
  1265. void nsGEN::IMDDriver::FireNotify(int code, std::string key, std::string content)
  1266. {
  1267. EventCenter->OnNotify(code, key, content);
  1268. }
  1269. Log4CPP::Logger* mLog::gLogger = nullptr;
  1270. void nsGEN::IMDDriver::Prepare()
  1271. {
  1272. string strLogPath = GetProcessDirectory() + R"(\OEMDrivers\Generator\Conf\Log4CPP.Config.GEN.xml)";
  1273. Log4CPP::GlobalContext::Map::Set(ECOM::Utility::Hash("LogFileName"), "GEN.IMD");
  1274. auto rc = Log4CPP::LogManager::LoadConfigFile(strLogPath.c_str());
  1275. mLog::gLogger = Log4CPP::LogManager::GetLogger("GEN.IMD");
  1276. mLog::FINFO("Enter Prepare.");
  1277. m_SCFDllName = GetConnectDLL(m_ConfigFileName);
  1278. super::Prepare();
  1279. }
  1280. bool nsGEN::IMDDriver::Connect()
  1281. {
  1282. mLog::FINFO("ConfigFileName: {$}", m_ConfigFileName);
  1283. super::DisConnect();
  1284. m_SCF.Disconnect();
  1285. // 检查文件是否存在
  1286. std::ifstream file(m_ConfigFileName);
  1287. if (!file) {
  1288. // 文件不存在,直接返回空的Connection对象
  1289. mLog::FINFO("{$} does not exist", m_ConfigFileName);
  1290. return false;
  1291. }
  1292. ResDataObject Connection = GetConnectParam(m_ConfigFileName);
  1293. mLog::FINFO("Connections: {$}", Connection.encode());
  1294. printf("connections:%s \n", Connection.encode());
  1295. auto erCode = m_SCF.Connect(Connection.encode(), &nsGEN::IMDDriver::callbackPackageProcess, SCF_PACKET_TRANSFER, 3000);
  1296. if (erCode != SCF_ERR::SCF_SUCCEED)
  1297. {
  1298. mLog::FINFO("SCF connection failed: erCode != SCF_ERR::SCF_SUCCEED");
  1299. super::Disconnect();
  1300. m_SCF.Disconnect();
  1301. return false;
  1302. }
  1303. auto rc = super::Connect();
  1304. if (!rc)
  1305. {
  1306. mLog::FINFO("super::Connect() failed");
  1307. super::Disconnect();
  1308. m_SCF.Disconnect();
  1309. return false;
  1310. }
  1311. if (m_pDevice == nullptr)
  1312. {
  1313. return false;
  1314. }
  1315. mLog::FINFO("Connect Successful");
  1316. return true;
  1317. }
  1318. void nsGEN::IMDDriver::Disconnect()
  1319. {
  1320. super::Disconnect();
  1321. m_SCF.Disconnect();
  1322. mLog::Close();
  1323. mLog::gLogger = nullptr;
  1324. }
  1325. bool nsGEN::IMDDriver::isConnected() const
  1326. {
  1327. if (!super::isConnected())
  1328. {
  1329. mLog::FINFO("No valid connection!!!");
  1330. return false;
  1331. }
  1332. if (m_pDevice == nullptr)
  1333. {
  1334. mLog::FINFO("m_pDevice == nullptr");
  1335. return false;
  1336. }
  1337. if (!m_pDevice->LoadConfig(m_ConfigFileName))
  1338. {
  1339. return false;
  1340. }
  1341. int genState = m_pDevice->GetGenState();
  1342. mLog::FINFO("m_pDevice->GetGenState(): {$}", genState);
  1343. return genState > 0; // 只有返回值大于 0 时才返回 true
  1344. }
  1345. std::string nsGEN::IMDDriver::DriverProbe()
  1346. {
  1347. ResDataObject r_config, HardwareInfo;
  1348. if (r_config.loadFile(m_ConfigFileName.c_str()))
  1349. {
  1350. HardwareInfo.add("MajorID", r_config["CONFIGURATION"]["MajorID"]);
  1351. HardwareInfo.add("MinorID", r_config["CONFIGURATION"]["MinorID"]);
  1352. HardwareInfo.add("VendorID", r_config["CONFIGURATION"]["VendorID"]);
  1353. HardwareInfo.add("ProductID", r_config["CONFIGURATION"]["ProductID"]);
  1354. HardwareInfo.add("SerialID", r_config["CONFIGURATION"]["SerialID"]);
  1355. }
  1356. else
  1357. {
  1358. HardwareInfo.add("MajorID", "Generator");
  1359. HardwareInfo.add("MinorID", "Dr");
  1360. HardwareInfo.add("VendorID", "IMD");
  1361. HardwareInfo.add("ProductID", "HF");
  1362. HardwareInfo.add("SerialID", "Drv");
  1363. }
  1364. string ret = HardwareInfo.encode();
  1365. return ret;
  1366. }
  1367. std::string nsGEN::IMDDriver::GetResource()
  1368. {
  1369. ResDataObject temp;
  1370. if (!temp.loadFile(m_ConfigFileName.c_str()))
  1371. return std::string();
  1372. auto r_config = temp["CONFIGURATION"];
  1373. for (auto& Item : m_ConfigInfo)
  1374. {
  1375. string key = Item.GetKey();
  1376. if (key == ConfKey::CcosGeneratorType)
  1377. {
  1378. Item.SetCurrentValue(((string)r_config["VendorID"]).c_str());
  1379. }
  1380. else if (key == ConfKey::CcosGeneratorModel)
  1381. {
  1382. Item.SetCurrentValue(((string)r_config["ProductID"]).c_str());
  1383. }
  1384. else if (key == ConfKey::CcosWSTable || key == ConfKey::CcosWSWall || key == ConfKey::CcosWSFree
  1385. || key == ConfKey::CcosWSTomo || key == ConfKey::CcosWSConventional)
  1386. {
  1387. Item.SetCurrentValue(((string)r_config[key.c_str()]).c_str());
  1388. }
  1389. else if (key == ConfKey::CcosSynTable || key == ConfKey::CcosSynWall || key == ConfKey::CcosSynFree
  1390. || key == ConfKey::CcosSynTomo || key == ConfKey::CcosSynConventional)
  1391. {
  1392. Item.SetCurrentValue(((string)r_config[key.c_str()]).c_str());
  1393. }
  1394. else if (key == ConfKey::CcosSCFType)
  1395. {
  1396. Item.SetCurrentValue(((string)r_config["connections"][0]["type"]).c_str());
  1397. }
  1398. else if (key == ConfKey::CcosSCFPort || key == ConfKey::CcosSCFBaudrate || key == ConfKey::CcosSCFBytesize
  1399. || key == ConfKey::CcosSCFParity || key == ConfKey::CcosSCFStopbits || key == ConfKey::CcosSCFIP)
  1400. {
  1401. if (r_config["connections"][0].GetFirstOf(key.c_str()) >= 0)
  1402. {
  1403. Item.SetCurrentValue(((string)r_config["connections"][0][key.c_str()]).c_str());
  1404. }
  1405. }
  1406. }
  1407. ResDataObject resAttr, resDescription;
  1408. for (auto Item : m_ConfigInfo)
  1409. {
  1410. resAttr.add(Item.GetKey(), Item.GetCurrentValue());
  1411. resDescription.add(Item.GetKey(), Item.GetDescription());
  1412. }
  1413. ResDataObject resDeviceResource;
  1414. resDeviceResource.add(ConfKey::CcosGeneratorAttribute, resAttr);
  1415. resDeviceResource.add(ConfKey::CcosGeneratorDescription, resDescription);
  1416. string res = resDeviceResource.encode();
  1417. printf("resDeviceResource :%s \n", resDeviceResource.encode());
  1418. mLog::FINFO("resDeviceResource :{$} \n", resDeviceResource.encode());
  1419. return res;
  1420. }
  1421. std::string nsGEN::IMDDriver::DeviceProbe()
  1422. {
  1423. ResDataObject r_config, HardwareInfo;
  1424. if (r_config.loadFile(m_ConfigFileName.c_str()))
  1425. {
  1426. HardwareInfo.add("MajorID", r_config["CONFIGURATION"]["MajorID"]);
  1427. HardwareInfo.add("MinorID", r_config["CONFIGURATION"]["MinorID"]);
  1428. HardwareInfo.add("VendorID", r_config["CONFIGURATION"]["VendorID"]);
  1429. HardwareInfo.add("ProductID", r_config["CONFIGURATION"]["ProductID"]);
  1430. HardwareInfo.add("SerialID", r_config["CONFIGURATION"]["SerialID"]);
  1431. }
  1432. else
  1433. {
  1434. HardwareInfo.add("MajorID", "Generator");
  1435. HardwareInfo.add("MinorID", "Dr");
  1436. HardwareInfo.add("VendorID", "IMD");
  1437. HardwareInfo.add("ProductID", "HF");
  1438. HardwareInfo.add("SerialID", "1234");
  1439. }
  1440. string ret = HardwareInfo.encode();
  1441. return ret;
  1442. }
  1443. RET_STATUS nsGEN::IMDDevice::IncFluKV()
  1444. {
  1445. if (!m_DoseUnit.m_FLKV->CanInc()) return RET_STATUS::RET_SUCCEED;
  1446. return HWSend("FLK+");
  1447. }
  1448. RET_STATUS nsGEN::IMDDevice::DecFluKV()
  1449. {
  1450. if (!m_DoseUnit.m_FLKV->CanDec()) return RET_STATUS::RET_SUCCEED;
  1451. return HWSend("FLK-");
  1452. }
  1453. RET_STATUS nsGEN::IMDDevice::SetFluKV(float value)
  1454. {
  1455. if (!m_DoseUnit.m_FLKV->Verify(value)) return RET_STATUS::RET_SUCCEED;
  1456. char temp[50] = { 0 };
  1457. sprintf_s(temp, "FLK%03d", (int)value);
  1458. return HWSend(temp);
  1459. }
  1460. RET_STATUS nsGEN::IMDDevice::IncFluMA()
  1461. {
  1462. if (!m_DoseUnit.m_FLMA->CanInc()) return RET_STATUS::RET_SUCCEED;
  1463. return HWSend("FLM+");
  1464. }
  1465. RET_STATUS nsGEN::IMDDevice::DecFluMA()
  1466. {
  1467. if (!m_DoseUnit.m_FLMA->CanDec()) return RET_STATUS::RET_SUCCEED;
  1468. return HWSend("FLM-");
  1469. }
  1470. RET_STATUS nsGEN::IMDDevice::SetFluMA(float value)
  1471. {
  1472. if (!m_DoseUnit.m_FLMA->Verify(value)) return RET_STATUS::RET_SUCCEED;
  1473. char temp[50] = { 0 };
  1474. sprintf_s(temp, "FLM%03d", (int)(value*10));
  1475. return HWSend(temp);
  1476. }
  1477. RET_STATUS nsGEN::IMDDevice::IncFluMS()
  1478. {
  1479. return RET_STATUS::RET_SUCCEED;
  1480. }
  1481. RET_STATUS nsGEN::IMDDevice::DecFluMS()
  1482. {
  1483. return RET_STATUS::RET_SUCCEED;
  1484. }
  1485. RET_STATUS nsGEN::IMDDevice::SetFluMS(float value)
  1486. {
  1487. return RET_STATUS::RET_SUCCEED;
  1488. }
  1489. RET_STATUS nsGEN::IMDDevice::SetPPS(float frameRate)
  1490. {
  1491. if (!m_DoseUnit.m_PPS->Verify(frameRate)) return RET_STATUS::RET_SUCCEED;
  1492. char temp[50] = { 0 };
  1493. sprintf_s(temp, "FLS%03d", (int)(frameRate * 10)); //pps 需要放大10倍
  1494. return HWSend(temp);
  1495. }
  1496. RET_STATUS nsGEN::IMDDevice::INCPPS()
  1497. {
  1498. if (!m_DoseUnit.m_PPS->CanInc()) return RET_STATUS::RET_SUCCEED;
  1499. return HWSend("FLS+");
  1500. }
  1501. RET_STATUS nsGEN::IMDDevice::DECPPS()
  1502. {
  1503. if (!m_DoseUnit.m_PPS->CanDec()) return RET_STATUS::RET_SUCCEED;
  1504. return HWSend("FLS-");
  1505. }
  1506. RET_STATUS nsGEN::IMDDevice::SetPluseWidth(float fplusewidth)
  1507. {
  1508. return RET_STATUS::RET_SUCCEED;
  1509. }
  1510. RET_STATUS nsGEN::IMDDevice::SetABSMode(int nMode)
  1511. {
  1512. if (!m_DoseUnit.m_ABSStatus->Verify(nMode)) return RET_STATUS::RET_SUCCEED;
  1513. char temp[50] = { 0 };
  1514. mLog::FINFO("SetABSMode[{$}] \n", nMode);
  1515. sprintf_s(temp, "FLA%1d", nMode);
  1516. return HWSend(temp);
  1517. }
  1518. RET_STATUS nsGEN::IMDDevice::SetABSCurve(int curveNum)
  1519. {
  1520. return RET_STATUS::RET_SUCCEED;
  1521. }
  1522. RET_STATUS nsGEN::IMDDevice::IncABSCurve()
  1523. {
  1524. return RET_STATUS::RET_SUCCEED;
  1525. }
  1526. RET_STATUS nsGEN::IMDDevice::DecABSCurve()
  1527. {
  1528. return RET_STATUS::RET_SUCCEED;
  1529. }
  1530. RET_STATUS nsGEN::IMDDevice::SetABSValue(float fABSValue)
  1531. {
  1532. return RET_STATUS::RET_SUCCEED;
  1533. }
  1534. RET_STATUS nsGEN::IMDDevice::SetABSTargetEXI(float fEXIValue)
  1535. {
  1536. return RET_STATUS::RET_SUCCEED;
  1537. }
  1538. float nsGEN::IMDDevice::GetFluIntTimer()
  1539. {
  1540. return HWSend("FLI?");
  1541. }
  1542. float nsGEN::IMDDevice::GetFluAccTimer()
  1543. {
  1544. return HWSend("FLT?");
  1545. }
  1546. RET_STATUS nsGEN::IMDDevice::ResetFluTimer(int ntype)
  1547. {
  1548. char temp[50] = { 0 };
  1549. sprintf_s(temp, "FLR%d", ntype);
  1550. mLog::FINFO("ReSetFluAccTimer[{$}] \n", ntype);
  1551. HWSend(temp);
  1552. Sleep(200);
  1553. GetFluAccTimer();
  1554. return RET_STATUS::RET_SUCCEED;
  1555. }
  1556. RET_STATUS nsGEN::IMDDevice::SetFluPre(int bPrepare)
  1557. {
  1558. return RET_STATUS::RET_SUCCEED;
  1559. }
  1560. RET_STATUS nsGEN::IMDDevice::SetFluEXP(int bPrepare)
  1561. {
  1562. return RET_STATUS::RET_SUCCEED;
  1563. }
  1564. RET_STATUS nsGEN::IMDDevice::SetFluMAG(int nsize)
  1565. {
  1566. return RET_STATUS::RET_SUCCEED;
  1567. }
  1568. RET_STATUS nsGEN::IMDDevice::DisableMAG()
  1569. {
  1570. return RET_STATUS::RET_SUCCEED;
  1571. }
  1572. RET_STATUS nsGEN::IMDDevice::SetFluDoseLever(int nlever)
  1573. {
  1574. return RET_STATUS::RET_SUCCEED;
  1575. }
  1576. RET_STATUS nsGEN::IMDDevice::SetHalfDose(int nlever)
  1577. {
  1578. return RET_STATUS::RET_SUCCEED;
  1579. }
  1580. RET_STATUS nsGEN::IMDDevice::TransferRadCurve(int ncurve)
  1581. {
  1582. return RET_STATUS::RET_SUCCEED;
  1583. }
  1584. int nsGEN::IMDDevice::GetGenState()
  1585. {
  1586. if (m_DoseUnit.m_GenState != NULL)
  1587. {
  1588. return m_DoseUnit.m_GenState->Get();
  1589. }
  1590. else
  1591. {
  1592. return 0;
  1593. }
  1594. }
  1595. void nsGEN::IMDDriver::Dequeue(const char* Packet, DWORD Length)
  1596. {
  1597. DecodeFrame(Packet, Length);
  1598. }
  1599. PACKET_RET nsGEN::IMDDriver::callbackPackageProcess(const char* RecData, DWORD nLength, DWORD& PacketLength)
  1600. {
  1601. if (nLength < 1)
  1602. {
  1603. printf("nLength < 1, nLength==%d \n", nLength);
  1604. mLog::FINFO("nLength < 1, nLength=={$} \n", nLength);
  1605. return PACKET_USELESS;
  1606. }
  1607. for (DWORD i = 0; i < nLength - 1; i++)
  1608. {
  1609. //1 首先寻找包头
  1610. if (RecData[i]==0x02)
  1611. {
  1612. if (i!=0)
  1613. {
  1614. PacketLength = i; //i之前的数据,全部扔掉
  1615. char strtemp[100] = { 0 };
  1616. memcpy(strtemp, RecData, i);
  1617. strtemp[PacketLength + 1] = 0;
  1618. printf("==IN error data ==:%s,PacketLength=%d,nLength=%d\n", strtemp, PacketLength, nLength);
  1619. return PACKET_USELESS;
  1620. }
  1621. }
  1622. if (RecData[i] == 0x03)
  1623. {
  1624. PacketLength = i + 2; //+2 because STX , sum.
  1625. char strtemp[100] = { 0 };
  1626. memcpy(strtemp, RecData, i); // STX+RKC005(not include 03 + sum); //only 复制 0x03之前的数据,这样解析时,后面的03 ,sum 都不要了。
  1627. strtemp[PacketLength + 1] = 0;
  1628. printf("==IN==:%s\n", strtemp);
  1629. mLog::FINFO("==IN==:{$}\n", strtemp);
  1630. return PACKET_ISPACKET;
  1631. }
  1632. }
  1633. return PACKET_NOPACKET;
  1634. }
  1635. //-----------------------------------------------------------------------------
  1636. // DecodeFrame
  1637. //-----------------------------------------------------------------------------
  1638. static bool DecodeFrame(const char* strFrame, int length)
  1639. {
  1640. auto pr = [strFrame, length](const tFrameMapping& Item)
  1641. {
  1642. for (int i = 0; i < Item.NbOfCharOfHead; i++)
  1643. {
  1644. if (strFrame[i] != Item.strHead[i])
  1645. {
  1646. return false;
  1647. }
  1648. }
  1649. return true;
  1650. };
  1651. auto found = std::find_if(arFrame.begin(), arFrame.end(), pr);
  1652. if (found == arFrame.end())
  1653. {
  1654. return false;
  1655. }
  1656. const auto& Item = *found;
  1657. auto pc = strFrame;
  1658. char data[100] = { 0 };
  1659. memcpy(data, strFrame + Item.NbOfCharOfHead, length - Item.NbOfCharOfHead - 2);
  1660. //pc += Item.NbOfCharOfHead; //---------jk++:pc is value. why? plus NbOfCharOfHead. 意思是pc的指针后移几个数,
  1661. Item.fun(data, length - Item.NbOfCharOfHead - 2);//第二个参数 不重要
  1662. return true;
  1663. }
  1664. //-----------------------------------------------------------------------------
  1665. // GetIODriver & CreateIODriver
  1666. //-----------------------------------------------------------------------------
  1667. static nsGEN::IMDDriver gIODriver;
  1668. extern "C" CCOS::Dev::IODriver * __cdecl GetIODriver() // 返回静态对象的引用, 调用者不能删除 !
  1669. {
  1670. return &gIODriver;
  1671. }
  1672. extern "C" CCOS::Dev::IODriver * __cdecl CreateIODriver() // 返回新对象, 调用者必须自行删除此对象 !
  1673. {
  1674. return new nsGEN::IMDDriver();
  1675. }