DIOS.Dev.Generator.SPELLMAN.cpp 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396
  1. // CCOS.Dev.GEN.SPELLMAN.cpp : 定义 DLL 应用程序的导出函数。
  2. //
  3. #include "stdafx.h"
  4. #include <assert.h>
  5. #include <functional>
  6. using namespace std::placeholders;
  7. //#include "logger.temp.h"
  8. #include "CCOS.Dev.Generator.SPELLMAN.h"
  9. #include "Helper.JSON.hpp"
  10. using namespace CCOS::Dev::Detail::Generator;
  11. namespace nsGEN = CCOS::Dev::Detail::Generator;
  12. #pragma warning (disable:4244) // warning C4244: “初始化”: 从“double”转换到“float”,可能丢失数据
  13. #pragma warning (disable:4305) // warning C4305: “参数”: 从“double”到“float”截断
  14. #pragma warning (disable:4267) // warning C4267 : “初始化”: 从“size_t”转换到“int”,可能丢失数据
  15. static const int msTimeOut_Lock = 500;
  16. #ifdef _WIN64
  17. #ifdef _DEBUG
  18. static const auto COM_SCFDllName = "Ccos.Dev.SerialSCFX64D.dll";
  19. #else
  20. static const auto COM_SCFDllName = "Ccos.Dev.SerialSCFX64.dll";
  21. #endif
  22. #endif
  23. #ifdef _WIN64
  24. #ifdef _DEBUG
  25. static const auto TCP_SCFDllName = "Ccos.Dev.TcpipSCFX64D.dll";
  26. #else
  27. static const auto TCP_SCFDllName = "Ccos.Dev.TcpipSCFX64.dll";
  28. #endif
  29. #endif
  30. //-----------------------------------------------------------------------------
  31. // SPELLMANDevice
  32. //-----------------------------------------------------------------------------
  33. 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 };
  34. 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 };
  35. float 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 };
  36. int g_AECFIELD_List[] = { 1, 10, 100, 11, 101, 111 };
  37. 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 };
  38. nsGEN::SPELLMANDevice::SPELLMANDevice(std::shared_ptr <IOEventCenter> center, nsSCF::SCF SCF) : super(center, SCF)
  39. {
  40. assert(EventCenter);
  41. //CreateLogger("SPELLMAN");
  42. m_DoseUnit.m_KV.reset(new KVMould(0.0, 40.0, 120.0, 1.0));
  43. m_DoseUnit.m_MA.reset(new MAMould(0.0, 1.0, 1000.0, 0.1));
  44. m_DoseUnit.m_MS.reset(new MSMould(0.0, 1.0, 10000.0, 0.01));
  45. m_DoseUnit.m_MAS.reset(new MASMould(0.0, 0.5, 1000.0, 0.01));
  46. m_DoseUnit.m_Techmode.reset(new TECHMODEMould(0, 0, 2, 1));
  47. m_DoseUnit.m_WS.reset(new WORKSTATIONMould(1, 0, 5, 1));
  48. m_DoseUnit.m_Focus.reset(new FOCUSMould(1, 0, 1, 1));
  49. m_DoseUnit.m_AECField.reset(new AECFIELDMould(0, 0, 111, 1));
  50. m_DoseUnit.m_AECFilm.reset(new AECFILMMould(0, 0, 2, 1));
  51. m_DoseUnit.m_AECDensity.reset(new AECDENSITYMould(0, -4, 4, 1));
  52. m_DoseUnit.m_HE.reset(new TUBEHEATMould(0, 0, 100, 1));
  53. m_DoseUnit.m_PostKV.reset(new POSTKVMould(0.0, 40.0, 120.0, 1.0));
  54. m_DoseUnit.m_PostMA.reset(new POSTMAMould(0.0, 1.0, 1000.0, 0.1));
  55. m_DoseUnit.m_PostMS.reset(new POSTMSMould(0.0, 1.0, 10000.0, 0.01));
  56. m_DoseUnit.m_PostMAS.reset(new POSTMASMould(0.0, 0.5, 1000.0, 0.01));
  57. m_DoseUnit.m_GenSynState.reset(new GENSYNSTATEMould(0, AttrKey::GENERATOR_SYNC_ERR, AttrKey::GENERATOR_SYNC_MAX, 1));
  58. m_DoseUnit.m_GenState.reset(new GENSTATEMould(0, AttrKey::GENERATOR_STATUS_SHUTDOWN, AttrKey::GENERATOR_STATUS_MAX, 1));
  59. m_DoseUnit.m_GenTotalExpNumber.reset(new TOTALEXPNUMMould(0, 0, 9999, 1));
  60. m_DoseUnit.m_GenTotalAcqTimes.reset(new TOTALACQTIMESMould(0, 0, 9999, 1));
  61. m_DoseUnit.m_GenTubeCoolWaitTimes.reset(new TUBECOOLTIMEMould(0, 0, 9999, 1));
  62. m_DoseUnit.m_GenTubeOverLoadNumber.reset(new TUBEOVERLOADNUMMould(0, 0, 9999, 1));
  63. m_DoseUnit.m_GenCurrentExpNumber.reset(new CUREXPNUMMould(0, 0, 9999, 1));
  64. m_DoseUnit.m_ExpMode.reset(new EXPMODEMould(AttrKey::EXPMODE_TYPE::Single));
  65. m_DoseUnit.m_FrameRate.reset(new FRAMERATEMould(0, 0, 16, 1));
  66. m_DoseUnit.m_FLMode.reset(new FLUModeMould(AttrKey::GENERATOR_FLUMode::GENERATOR_FLMODE_NOTFLU));
  67. //m_DoseUnit.m_EXAMMode.reset(new EXAMMODEMould(EXAMMODE_TYPE::MANUAL));
  68. m_MSGUnit.reset(new nsDetail::MSGUnit(center, nsGEN::GeneratorUnitType));
  69. m_DAP.reset(new DevDAP::DOSEMould(0.0, 0.0, 1000.0, 0.01));
  70. m_hGenPostEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
  71. m_pHardwareStatusThread = NULL;
  72. OnCallBack();
  73. Register();
  74. Reset();
  75. Sleep(500);
  76. HWSend("SMK07"); //1 初始化时使能系统配置类型 指令system marker SMKnn 逸动C - ARM系统设置为7.
  77. HWSend("DSN01"); //TRODirection
  78. /*
  79. //以下的设置,需要注意默认值是否正确
  80. HWSend("RSM1"); //立刻发送RSM命令 //表示脚闸的涵义,0 not used , 1 rad , 2 control ,3 cine.
  81. HWSend("FLD2"); //doselevel :H M L ,默认是2
  82. HWSend("FFP2");
  83. HWSend("FTO060"); //timeout 60s
  84. //XET :SetSyncMode(m_nSyncMode);
  85. HWSend("XET1");
  86. //timer : LFC用来设置灯丝最大值,直到收到反馈,结束timer。
  87. */
  88. RefreshData();
  89. StartHardwareStatusThread();
  90. }
  91. nsGEN::SPELLMANDevice::~SPELLMANDevice()
  92. {
  93. CloseHandle(m_hGenPostEvent);
  94. }
  95. std::string nsGEN::SPELLMANDevice::GetGUID() const
  96. {
  97. //PRINTA_INFO("\n===============GetGUID : %s ===================\n", GeneratorUnitType);
  98. return GeneratorUnitType;
  99. }
  100. void nsGEN::SPELLMANDevice::Register()
  101. {
  102. auto Disp = &Dispatch;
  103. superGen::Register(Disp);
  104. superGen::RegisterRAD(Disp);
  105. superGen::RegisterAEC(Disp);
  106. superGen::RegisterExpEnable(Disp);
  107. superGen::RegisterGeneratortoSyncStatus(Disp);
  108. Disp->Get.Push(m_MSGUnit->GetKey().c_str(), [this](std::string& out) { out = m_MSGUnit->JSGet(); return RET_STATUS::RET_SUCCEED; });
  109. auto fun_Clear_DAP = [this](auto a, auto&)
  110. {
  111. return Clear_DAP();
  112. };
  113. Disp->Action.Push("Clear_DAP", fun_Clear_DAP);
  114. auto fun_GetValue_DAP = [this](auto a, auto& b)
  115. {
  116. float value = 0;
  117. RET_STATUS ret = GetValue_DAP(value);
  118. b = ToJSON(value);
  119. return ret;
  120. };
  121. Disp->Action.Push("GetValue_DAP", fun_GetValue_DAP);
  122. auto fun_StartMove = [this](auto a,auto& b)
  123. {
  124. return StartMove();
  125. };
  126. Disp->Action.Push("StartMove", fun_StartMove);
  127. auto fun_EndMove = [this](auto a, auto& b)
  128. {
  129. return EndMove();
  130. };
  131. Disp->Action.Push("EndMove", fun_EndMove);
  132. }
  133. RET_STATUS nsGEN::SPELLMANDevice::IncKV()
  134. {
  135. if (m_DoseUnit.m_ExpMode->JSGet() == AttrKey::EXPMODE_TYPE::TOMO)
  136. {
  137. if (!m_DoseUnit.m_KV->CanInc()) return RET_STATUS::RET_SUCCEED;
  138. return HWSend("FLK+");
  139. }
  140. else
  141. {
  142. if (!m_DoseUnit.m_KV->CanInc()) return RET_STATUS::RET_SUCCEED;
  143. return HWSend("RKVI");
  144. }
  145. }
  146. RET_STATUS nsGEN::SPELLMANDevice::DecKV()
  147. {
  148. if (m_DoseUnit.m_ExpMode->JSGet() == AttrKey::EXPMODE_TYPE::TOMO)
  149. {
  150. if (!m_DoseUnit.m_KV->CanDec()) return RET_STATUS::RET_SUCCEED;
  151. return HWSend("FLK-");
  152. }
  153. else
  154. {
  155. if (!m_DoseUnit.m_KV->CanDec()) return RET_STATUS::RET_SUCCEED;
  156. return HWSend("RKVD");
  157. }
  158. }
  159. RET_STATUS nsGEN::SPELLMANDevice::SetKV(float value)
  160. {
  161. if (!m_DoseUnit.m_KV->Verify(value)) return RET_STATUS::RET_SUCCEED;
  162. if (m_DoseUnit.m_ExpMode->JSGet() != AttrKey::EXPMODE_TYPE::TOMO)
  163. {
  164. char temp[50] = { 0 };
  165. sprintf_s(temp, "RKV%03d", (int)value);
  166. return HWSend(temp);
  167. }
  168. else
  169. {
  170. char temp[50] = { 0 };
  171. sprintf_s(temp, "FLK%03d", (int)value);
  172. return HWSend(temp);
  173. }
  174. }
  175. RET_STATUS nsGEN::SPELLMANDevice::IncMA()
  176. {
  177. if (m_DoseUnit.m_ExpMode->JSGet() != AttrKey::EXPMODE_TYPE::TOMO)
  178. {
  179. if (!m_DoseUnit.m_MA->CanInc()) return RET_STATUS::RET_SUCCEED;
  180. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_V2TYPE::ET_MAS)
  181. {
  182. //PRINTA_INFO("\n Techmode is MAS, can't inc MA");
  183. return RET_STATUS::RET_FAILED;
  184. }
  185. return HWSend("RMAI");
  186. }
  187. else
  188. {
  189. if (!m_DoseUnit.m_MA->CanInc()) return RET_STATUS::RET_SUCCEED;
  190. return HWSend("FLM+");
  191. }
  192. }
  193. RET_STATUS nsGEN::SPELLMANDevice::DecMA()
  194. {
  195. if (m_DoseUnit.m_ExpMode->JSGet() != AttrKey::EXPMODE_TYPE::TOMO)
  196. {
  197. if (!m_DoseUnit.m_MA->CanDec()) return RET_STATUS::RET_SUCCEED;
  198. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_V2TYPE::ET_MAS)
  199. {
  200. //PRINTA_INFO("\n Techmode is MAS, can't dec MA");
  201. return RET_STATUS::RET_FAILED;
  202. }
  203. return HWSend("RMAD");
  204. }
  205. else
  206. {
  207. if (!m_DoseUnit.m_MA->CanDec()) return RET_STATUS::RET_SUCCEED;
  208. return HWSend("FLM-");
  209. }
  210. }
  211. RET_STATUS nsGEN::SPELLMANDevice::SetMA(float value)
  212. {
  213. if (!m_DoseUnit.m_MA->Verify(value)) return RET_STATUS::RET_SUCCEED;
  214. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_V2TYPE::ET_MAS)
  215. {
  216. //PRINTA_INFO("\n Techmode is MAS, can't set MA");
  217. return RET_STATUS::RET_FAILED;
  218. }
  219. if (m_DoseUnit.m_ExpMode->JSGet() != AttrKey::EXPMODE_TYPE::TOMO)
  220. {
  221. char temp[50] = { 0 };
  222. sprintf_s(temp, "RMA%06d", (int)(value * 100));
  223. return HWSend(temp);
  224. }
  225. else
  226. {
  227. char temp[50] = { 0 };
  228. sprintf_s(temp, "FLM%03d", (int)(value * 10));
  229. return HWSend(temp);
  230. }
  231. }
  232. RET_STATUS nsGEN::SPELLMANDevice::IncMS()
  233. {
  234. if (!m_DoseUnit.m_MS->CanInc()) return RET_STATUS::RET_SUCCEED;
  235. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_V2TYPE::ET_MAS)
  236. {
  237. //PRINTA_INFO("\n Techmode is MAS, can't inc MS");
  238. return RET_STATUS::RET_FAILED;
  239. }
  240. return HWSend("RMSI");
  241. }
  242. RET_STATUS nsGEN::SPELLMANDevice::DecMS()
  243. {
  244. if (!m_DoseUnit.m_MS->CanDec()) return RET_STATUS::RET_SUCCEED;
  245. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_V2TYPE::ET_MAS)
  246. {
  247. //PRINTA_INFO("\n Techmode is MAS, can't dec MS");
  248. return RET_STATUS::RET_FAILED;
  249. }
  250. return HWSend("RMSD");
  251. }
  252. RET_STATUS nsGEN::SPELLMANDevice::SetMS(float value)
  253. {
  254. if (!m_DoseUnit.m_MA->Verify(value)) return RET_STATUS::RET_SUCCEED;
  255. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_V2TYPE::ET_MAS)
  256. {
  257. //PRINTA_INFO("\n Techmode is MAS, can't set MS");
  258. return RET_STATUS::RET_FAILED;
  259. }
  260. char temp[50] { 0 };
  261. //RMS%07d 新协议, RMS%04d 旧协议.
  262. sprintf_s(temp, "RMS%07d", (int)(value * 100));
  263. return HWSend(temp);
  264. }
  265. RET_STATUS nsGEN::SPELLMANDevice::IncMAS()
  266. {
  267. if (!m_DoseUnit.m_MAS->CanInc()) return RET_STATUS::RET_SUCCEED;
  268. if (m_DoseUnit.m_Techmode->Get() != AttrKey::TECHMODE_V2TYPE::ET_MAS)
  269. {
  270. //PRINTA_INFO("\n Techmode is not MAS, can't inc MAS");
  271. return RET_STATUS::RET_FAILED;
  272. }
  273. return HWSend("RMXI");
  274. }
  275. RET_STATUS nsGEN::SPELLMANDevice::DecMAS()
  276. {
  277. if (!m_DoseUnit.m_MAS->CanDec()) return RET_STATUS::RET_SUCCEED;
  278. if (m_DoseUnit.m_Techmode->Get() != AttrKey::TECHMODE_V2TYPE::ET_MAS)
  279. {
  280. //PRINTA_INFO("\n Techmode is not MAS, can't dec MAS");
  281. return RET_STATUS::RET_FAILED;
  282. }
  283. return HWSend("RMXD");
  284. }
  285. RET_STATUS nsGEN::SPELLMANDevice::SetMAS(float value)
  286. {
  287. if (!m_DoseUnit.m_MA->Verify(value)) return RET_STATUS::RET_SUCCEED;
  288. if (m_DoseUnit.m_Techmode->Get() != AttrKey::TECHMODE_V2TYPE::ET_MAS)
  289. {
  290. //PRINTA_INFO("\n Techmode is not MAS, can't set MAS");
  291. return RET_STATUS::RET_FAILED;
  292. }
  293. char temp[50] = { 0 };
  294. sprintf_s(temp, "RMX%06d", (int)(value * 1000));
  295. return HWSend(temp);
  296. }
  297. RET_STATUS nsGEN::SPELLMANDevice::SetTechmode(int value)
  298. {
  299. if (!m_DoseUnit.m_Techmode->Verify(value)) return RET_STATUS::RET_SUCCEED;
  300. if (value == AttrKey::TECHMODE_V2TYPE::ET_AEC)//if AEC, translate to time. why? i need reason.
  301. value = AttrKey::TECHMODE_V2TYPE::ET_TIME;
  302. char temp[50] = { 0 };
  303. sprintf_s(temp, "RET%01d", (int)value);
  304. return HWSend(temp);
  305. }
  306. RET_STATUS nsGEN::SPELLMANDevice::SetFocus(int value)
  307. {
  308. if (!m_DoseUnit.m_Focus->Verify(value)) return RET_STATUS::RET_SUCCEED;
  309. char temp[50] = { 0 };
  310. sprintf_s(temp, "RFO%01d", (int)value);
  311. return HWSend(temp);
  312. }
  313. RET_STATUS nsGEN::SPELLMANDevice::SetAECDensity(int value)
  314. {
  315. if (!m_DoseUnit.m_AECDensity->Verify(value)) return RET_STATUS::RET_SUCCEED;
  316. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_V2TYPE::ET_AEC)
  317. return RET_STATUS::RET_FAILED;
  318. char temp[50] = { 0 };
  319. if (value >= 0)
  320. {
  321. sprintf_s(temp, "RFN+%01d", (int)value);
  322. }
  323. else
  324. {
  325. sprintf_s(temp, "RFN-%01d", (int)value);
  326. }
  327. return HWSend(temp);
  328. }
  329. RET_STATUS nsGEN::SPELLMANDevice::SetAECField(int value)
  330. {
  331. if (!m_DoseUnit.m_AECField->Verify(value)) return RET_STATUS::RET_SUCCEED;
  332. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_V2TYPE::ET_MAS)
  333. return RET_STATUS::RET_FAILED;
  334. char temp[50] = { 0 };
  335. sprintf_s(temp, "RFI%03d", (int)value);
  336. return HWSend(temp);
  337. }
  338. RET_STATUS nsGEN::SPELLMANDevice::SetAECFilm(int value)
  339. {
  340. if (!m_DoseUnit.m_AECFilm->Verify(value)) return RET_STATUS::RET_SUCCEED;
  341. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_V2TYPE::ET_MAS)
  342. return RET_STATUS::RET_FAILED;
  343. char temp[50] = { 0 };
  344. sprintf_s(temp, "RFS%03d", (int)value);
  345. return HWSend(temp);
  346. }
  347. RET_STATUS nsGEN::SPELLMANDevice::SetWS(const string value)
  348. {
  349. int tempws = 0;
  350. if (value == "Table") tempws = 0;
  351. else if (value == "Wall") tempws = 1;
  352. else if (value == "Direct") tempws = 2;
  353. else if (value == "Free") tempws = 3;
  354. char temp[50] = { 0 };
  355. sprintf_s(temp, "EWS%01d", tempws);
  356. return HWSend(temp);
  357. }
  358. RET_STATUS nsGEN::SPELLMANDevice::SetAPR(const _tAPRArgs& t)
  359. {
  360. m_t = t;
  361. //PRINTA_INFO("*********************Enter SetAPR,but do nothing**********************");
  362. return RET_STATUS::RET_SUCCEED;
  363. //if (m_bExpSucc)
  364. //{
  365. // if (m_DoseUnit.m_ExpMode->JSGet() == AttrKey::EXPMODE_TYPE::Single)
  366. // {
  367. // m_DoseUnit.m_ExpMode->Update(AttrKey::EXPMODE_TYPE::TOMO);
  368. // }
  369. // else if (m_DoseUnit.m_ExpMode->JSGet() == AttrKey::EXPMODE_TYPE::TOMO)
  370. // {
  371. // m_DoseUnit.m_ExpMode->Update(AttrKey::EXPMODE_TYPE::Single);
  372. // }
  373. //}
  374. //if (m_DoseUnit.m_ExpMode->JSGet() == AttrKey::EXPMODE_TYPE::Single)
  375. //{
  376. // //PRINTA_INFO("Enter SetAPR Single");
  377. // SetWS(m_DoseUnit.m_WS->JSGet());
  378. // SetKV(t.fKV);
  379. // SetFocus(t.nFocus);
  380. // SetTechmode(t.nTechmode);
  381. // if (t.nTechmode == AttrKey::TECHMODE_V2TYPE::ET_MAS)//mas
  382. // {
  383. // return SetMAS(t.fMAS);
  384. // }
  385. // else if (t.nTechmode == AttrKey::TECHMODE_V2TYPE::ET_AEC)//aec
  386. // {
  387. // SetAECField(t.nAECField);
  388. // SetAECFilm(t.nAECFilm);
  389. // SetAECDensity(t.nAECDensity);
  390. // SetMA(t.fMA);
  391. // return SetMS(t.fMS);
  392. // }
  393. // else//time
  394. // {
  395. // SetMA(t.fMA);
  396. // return SetMS(t.fMS);
  397. // }
  398. //}
  399. //else if (m_DoseUnit.m_ExpMode->JSGet() == AttrKey::EXPMODE_TYPE::TOMO)
  400. //{
  401. // //PRINTA_INFO("Enter SetAPR FLU");
  402. // char temp[50] = { 0 };
  403. // sprintf_s(temp, "FLK%03d", (int)(t.fKV));
  404. // HWSend(temp);
  405. // sprintf_s(temp, "FLM%03d", (int)(10 * (t.fMA)));
  406. // HWSend(temp);
  407. // sprintf_s(temp, "FLS%03d", (int)(10 * (m_DoseUnit.m_FrameRate->Get())));
  408. // return HWSend(temp);
  409. //}
  410. //else if (m_DoseUnit.m_ExpMode->JSGet() == AttrKey::EXPMODE_TYPE::CoutineSerial)
  411. //{
  412. // //PRINTA_INFO("Enter SetAPR CF,but do nothing now.");
  413. // return RET_STATUS::RET_SUCCEED;
  414. //}
  415. }
  416. RET_STATUS nsGEN::SPELLMANDevice::QueryHE(int& value)
  417. {
  418. return RET_STATUS::RET_SUCCEED;
  419. }
  420. RET_STATUS nsGEN::SPELLMANDevice::QueryPostKV(float& value)
  421. {
  422. value = m_DoseUnit.m_PostKV->Get();
  423. return RET_STATUS::RET_SUCCEED;
  424. }
  425. RET_STATUS nsGEN::SPELLMANDevice::QueryPostMA(float& value)
  426. {
  427. value = m_DoseUnit.m_PostMA->Get();
  428. return RET_STATUS::RET_SUCCEED;
  429. }
  430. RET_STATUS nsGEN::SPELLMANDevice::QueryPostMS(float& value)
  431. {
  432. value = m_DoseUnit.m_PostMS->Get();
  433. return RET_STATUS::RET_SUCCEED;
  434. }
  435. RET_STATUS nsGEN::SPELLMANDevice::QueryPostMAS(float& value)
  436. {
  437. value = m_DoseUnit.m_PostMAS->Get();
  438. return RET_STATUS::RET_SUCCEED;
  439. }
  440. RET_STATUS nsGEN::SPELLMANDevice::Clear_DAP()
  441. {
  442. char temp[50] = "EDZ";
  443. return HWSend(temp);
  444. }
  445. RET_STATUS nsGEN::SPELLMANDevice::GetValue_DAP(float& value)
  446. {
  447. value = m_DAP->Get();
  448. return RET_STATUS::RET_SUCCEED;
  449. }
  450. RET_STATUS nsGEN::SPELLMANDevice::StartMove()
  451. {
  452. //PRINTA_INFO("Enter startMove");
  453. char temp[50] = { 0 };
  454. if (m_DoseUnit.m_ExpMode->JSGet() != AttrKey::EXPMODE_TYPE::Single)
  455. {
  456. sprintf_s(temp, "FLS%03d", (int)(m_DoseUnit.m_FrameRate->Get() * 10)); //pps 需要放大10倍
  457. HWSend(temp);
  458. }
  459. //点片EXO2 ,PF :EXO1 CF:EXO3
  460. if (m_DoseUnit.m_ExpMode->JSGet() == AttrKey::EXPMODE_TYPE::Single)
  461. {
  462. sprintf_s(temp, "EXO%01d", (int)(2));
  463. HWSend(temp);
  464. }
  465. else if (m_DoseUnit.m_ExpMode->JSGet() == AttrKey::EXPMODE_TYPE::TOMO)
  466. {
  467. sprintf_s(temp, "EXO%01d", (int)(1));
  468. HWSend(temp);
  469. }
  470. else if (m_DoseUnit.m_ExpMode->JSGet() == AttrKey::EXPMODE_TYPE::CoutineSerial)
  471. {
  472. sprintf_s(temp, "EXO%01d", (int)(3));
  473. HWSend(temp);
  474. }
  475. sprintf_s(temp, "TIC%01d", (int)(1));
  476. HWSend(temp);
  477. //PRINTA_INFO("end startmove");
  478. return RET_STATUS::RET_SUCCEED;
  479. }
  480. RET_STATUS nsGEN::SPELLMANDevice::EndMove()
  481. {
  482. printf("enter EndMove\n");
  483. //PRINTA_INFO("Enter endmove");
  484. char temp[50]{ 0 };
  485. sprintf_s(temp, "EXO%01d", (int)(0));
  486. HWSend(temp);
  487. sprintf_s(temp, "TIC%01d", (int)(0));
  488. HWSend(temp);
  489. SetFLFMode(to_string((int)AttrKey::GENERATOR_FLUMode::GENERATOR_FLMODE_NOTFLU));
  490. printf("end EndMove\n");
  491. //PRINTA_INFO("end EndMove");
  492. return RET_STATUS::RET_SUCCEED;
  493. }
  494. RET_STATUS nsGEN::SPELLMANDevice::SetGenSynState(int value)
  495. {
  496. return RET_STATUS::RET_SUCCEED;
  497. }
  498. RET_STATUS nsGEN::SPELLMANDevice::SetGenState(int value)
  499. {
  500. return RET_STATUS::RET_SUCCEED;
  501. }
  502. RET_STATUS nsGEN::SPELLMANDevice::SetExpMode(std::string value)
  503. {
  504. //PRINTA_INFO("Enter SetExpMode...%s",value);
  505. m_DoseUnit.m_ExpMode->Update(value);
  506. //退出CBCT,设置exp mode时,强制退出cbct,因为放在endmove中,偶发执行不到的问题。
  507. SetFLFMode("0");
  508. HWSend("TIC0");
  509. if (m_DoseUnit.m_ExpMode->JSGet() == AttrKey::EXPMODE_TYPE::Single)
  510. {
  511. //PRINTA_INFO("Enter SetAPR Single kv=%f ma=%f",m_t.fKV,m_t.fMA);
  512. SetWS(m_DoseUnit.m_WS->JSGet());
  513. if (abs(m_t.fKV) == 0) //如果上层传入参数为零,那么查询
  514. {
  515. HWSend("RKV?");
  516. }
  517. else
  518. {
  519. SetKV(m_t.fKV);
  520. }
  521. SetFocus(m_t.nFocus);
  522. SetTechmode(m_t.nTechmode);
  523. if (m_t.nTechmode == AttrKey::TECHMODE_V2TYPE::ET_MAS)//mas
  524. {
  525. SetMAS(m_t.fMAS);
  526. }
  527. else if (m_t.nTechmode == AttrKey::TECHMODE_V2TYPE::ET_AEC)//aec
  528. {
  529. SetAECField(m_t.nAECField);
  530. SetAECFilm(m_t.nAECFilm);
  531. SetAECDensity(m_t.nAECDensity);
  532. SetMA(m_t.fMA);
  533. SetMS(m_t.fMS);
  534. }
  535. else//time
  536. {
  537. if (abs(m_t.fMA) == 0)
  538. {
  539. HWSend("RMA?");
  540. }
  541. else
  542. {
  543. SetMA(m_t.fMA);
  544. }
  545. SetMS(m_t.fMS);
  546. }
  547. }
  548. else if (m_DoseUnit.m_ExpMode->JSGet() == AttrKey::EXPMODE_TYPE::TOMO)
  549. {
  550. char temp[50] = { 0 };
  551. sprintf_s(temp, "FLK%03d", (int)(m_DoseUnit.m_KV->Get()));
  552. HWSend(temp);
  553. sprintf_s(temp, "FLM%03d", (int)(10*(m_DoseUnit.m_MA->Get())));
  554. HWSend(temp);
  555. sprintf_s(temp, "FLS%03d", (int)(10*(m_DoseUnit.m_FrameRate->Get())));
  556. //PRINTA_INFO("Enter SetAPR TOMO kv=%d ma=%d", m_DoseUnit.m_KV->Get(), m_DoseUnit.m_MA->Get());
  557. HWSend(temp);
  558. }
  559. //无论哪种模式,我都会设置FLF2= PF. 仅测试用,后续正式版本,得删除.
  560. char temp[50] = { 0 };
  561. sprintf_s(temp, "FLF%01d", (int)(2));
  562. HWSend(temp);
  563. //理论上来说,设置exp模式的时候,若点片,RPS主动设置为0.
  564. if (AttrKey::EXPMODE_TYPE::Single == value)
  565. {
  566. //PRINTA_INFO("now is Single mode, send RPS0");
  567. SetRPS(0);
  568. }
  569. return RET_STATUS::RET_SUCCEED;
  570. }
  571. RET_STATUS nsGEN::SPELLMANDevice::SetFLFMode(std::string value)
  572. {
  573. char temp[50]{ 0 };
  574. sprintf_s(temp, "RTS%s",value);
  575. return HWSend(temp);
  576. }
  577. RET_STATUS nsGEN::SPELLMANDevice::SetEXAMMode(std::string value)
  578. {
  579. return RET_STATUS::RET_SUCCEED;
  580. }
  581. RET_STATUS nsGEN::SPELLMANDevice::SetFrameRate(FLOAT frameRate)
  582. {
  583. m_DoseUnit.m_FrameRate->Update(frameRate);
  584. return RET_STATUS::RET_SUCCEED;
  585. }
  586. RET_STATUS nsGEN::SPELLMANDevice::SetRPS(int rps)
  587. {
  588. char temp[50]{ 0 };
  589. sprintf_s(temp, "RPS%03d", rps * 10);
  590. return HWSend(temp);
  591. }
  592. RET_STATUS nsGEN::SPELLMANDevice::RefreshData()
  593. {
  594. HWSend("RKV?");
  595. HWSend("RMA?");
  596. HWSend("RMS?");
  597. return RET_STATUS::RET_SUCCEED;
  598. }
  599. RET_STATUS nsGEN::SPELLMANDevice::SetExpEnable()
  600. {
  601. return HWSend("EXB1");
  602. }
  603. RET_STATUS nsGEN::SPELLMANDevice::SetExpDisable()
  604. {
  605. return HWSend("EXB0");
  606. }
  607. RET_STATUS nsGEN::SPELLMANDevice::Reset()
  608. {
  609. return HWSend("ERE1");//ERE1 = reset gen.
  610. }
  611. RET_STATUS nsGEN::SPELLMANDevice::HWSend(char* strCommand, int nTimeOut)
  612. {
  613. if (!m_SCF) return RET_STATUS::RET_FAILED;
  614. char strSendCommand[100] = { 0 };
  615. int len = strlen(strCommand);
  616. int tmpSum = 0;
  617. for (int i = 0; i < len; i++)
  618. {
  619. tmpSum += (int)strCommand[i];
  620. }
  621. char checkSum = char(tmpSum + 5);
  622. strSendCommand[0] = 0x02;
  623. memcpy(strSendCommand + 1, strCommand, len);
  624. strSendCommand[len + 1] = 0x03;
  625. strSendCommand[len + 2] = checkSum;
  626. printf("==OUT==: %s \n", strSendCommand);
  627. //PRINTA_INFO("==OUT==: %s \n", strSendCommand);
  628. int retLength;
  629. m_SCF.Lock(msTimeOut_Lock)
  630. .SendPacket(strSendCommand, strlen(strSendCommand), nTimeOut, retLength);
  631. Sleep(nTimeOut);
  632. return RET_STATUS::RET_SUCCEED;
  633. }
  634. //-----------------------------------------------------------------------------
  635. // ProcessCmd
  636. //-----------------------------------------------------------------------------
  637. void nsGEN::SPELLMANDevice::FireNotify(std::string key, std::string content)
  638. {
  639. EventCenter->OnNotify(1, key, content);
  640. }
  641. struct tFrameMapping
  642. {
  643. static const int MaxLen = 5; // 前缀不能超超过 5 个字符 !
  644. using cbFun = std::function <void(const char*, int)>;
  645. char strHead[MaxLen];
  646. int NbOfCharOfHead;
  647. cbFun fun;
  648. tFrameMapping(char* str, int len, cbFun f)
  649. {
  650. assert(len < MaxLen); //len最大只能是4
  651. strHead[0] = 0x02; //STX
  652. for (int i = 0; i < len; i++) //给strHead赋值
  653. strHead[i + 1] = str[i];
  654. NbOfCharOfHead = len + 1;
  655. fun = f;
  656. }
  657. };
  658. static std::list <tFrameMapping> arFrame;
  659. static bool DecodeFrame(const char* strFrame, int length);
  660. void nsGEN::SPELLMANDevice::OnCallBack()
  661. {
  662. auto HWNotProcess = [](const char* value, int length) -> void
  663. {
  664. printf("\n This commands didn't need to process!\n");
  665. //PRINTA_INFO("\n This commands didn't need to process!\n");
  666. };
  667. auto HWKV = [this](const char* value, int length) -> void
  668. {
  669. assert(value);
  670. if (m_DoseUnit.m_KV->Update(atof(value)))
  671. FireNotify(AttrKey::KV, m_DoseUnit.m_KV->JSGet());
  672. };
  673. auto HWMAS = [this](const char* value, int length)
  674. {
  675. assert(value);
  676. float fmas = atof(value) / 1000.0;
  677. if (m_DoseUnit.m_Techmode->Get() == AttrKey::TECHMODE_V2TYPE::ET_TIME)
  678. {
  679. if (m_DoseUnit.m_MAS->Update(0))
  680. FireNotify(AttrKey::MAS, m_DoseUnit.m_MAS->JSGet());
  681. }
  682. else
  683. {
  684. if (m_DoseUnit.m_MAS->Update(fmas))
  685. FireNotify(AttrKey::MAS, m_DoseUnit.m_MAS->JSGet());
  686. }
  687. };
  688. auto HWMA = [this](const char* value, int length)
  689. {
  690. assert(value);
  691. float fma = atof(value) / 100.0;
  692. if (m_DoseUnit.m_MA->Update(fma))
  693. FireNotify(AttrKey::MA, m_DoseUnit.m_MA->JSGet());
  694. };
  695. auto HWMS = [this](const char* value, int length)
  696. {
  697. assert(value);
  698. if (m_DoseUnit.m_MS->Update(atof(value) / 100.0))
  699. FireNotify(AttrKey::MS, m_DoseUnit.m_MS->JSGet());
  700. };
  701. auto HWFocus = [this](const char* value, int length)
  702. {
  703. assert(value);
  704. if (m_DoseUnit.m_Focus->Update(atoi(value)))
  705. FireNotify(AttrKey::FOCUS, m_DoseUnit.m_Focus->JSGet());
  706. };
  707. auto HWTechmode = [this](const char* value, int length)
  708. {
  709. assert(value);
  710. if (m_DoseUnit.m_Techmode->Update(atoi(value)))
  711. FireNotify(AttrKey::TECHMODE, m_DoseUnit.m_Techmode->JSGet());
  712. };
  713. auto HWAECField = [this](const char* value, int length)
  714. {
  715. assert(value);
  716. int nvalue = atoi(value);
  717. if (m_DoseUnit.m_AECField->Update(nvalue))
  718. FireNotify(AttrKey::AECFIELD, m_DoseUnit.m_AECField->JSGet());
  719. };
  720. auto HWAECFilm = [this](const char* value, int length)
  721. {
  722. assert(value);
  723. if (m_DoseUnit.m_AECFilm->Update(atoi(value)))
  724. FireNotify(AttrKey::AECFILM, m_DoseUnit.m_AECFilm->JSGet());
  725. };
  726. auto HWAECDensity = [this](const char* value, int length)
  727. {
  728. assert(value);
  729. if (m_DoseUnit.m_AECDensity->Update(atoi(value)))
  730. FireNotify(AttrKey::AECDENSITY, m_DoseUnit.m_AECDensity->JSGet());
  731. };
  732. auto HWWS = [this](const char* value, int length)
  733. {
  734. assert(value);
  735. int nValue = atoi(value);
  736. if (m_DoseUnit.m_WS->Update(nValue))
  737. {
  738. FireNotify(m_DoseUnit.m_WS->GetKey(), m_DoseUnit.m_WS->JSGet());
  739. }
  740. };
  741. auto HWPR = [this](const char* value, int length)
  742. {
  743. assert(value);
  744. int nValue = atoi(value);
  745. if (nValue == 2)
  746. {
  747. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_READY);
  748. ResetEvent(m_hGenPostEvent);
  749. HWSend("PR2");
  750. }
  751. else if (nValue == 1)
  752. {
  753. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_PREPARE);
  754. HWSend("PR1");
  755. }
  756. else if (nValue == 0)
  757. {
  758. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_OFF);
  759. HWSend("PR0");
  760. }
  761. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  762. };
  763. auto HWXR = [this](const char* value, int length)
  764. {
  765. assert(value);
  766. int nValue = atoi(value);
  767. if (nValue == 1)
  768. {
  769. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_XRAYON);
  770. }
  771. else if (nValue == 0)
  772. {
  773. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_OFF);
  774. }
  775. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  776. };
  777. auto HWAPDOSE = [this](const char* value, int length)//mas
  778. {
  779. assert(value);
  780. if(m_DoseUnit.m_PostMAS->Update(atof(value) / 1000.0))
  781. FireNotify(m_DoseUnit.m_PostMAS->GetKey(), m_DoseUnit.m_PostMAS->JSGet());
  782. //SetEvent(m_hGenPostEvent);
  783. };
  784. auto HWATDOSE = [this](const char* value, int length)
  785. {
  786. assert(value);
  787. if(m_DoseUnit.m_PostMS->Update(atof(value)))
  788. FireNotify(m_DoseUnit.m_PostMS->GetKey(), m_DoseUnit.m_PostMS->JSGet());
  789. //SetEvent(m_hGenPostEvent);
  790. };
  791. auto HWDAP = [this](const char* value, int length)
  792. {
  793. //assert(value);
  794. //m_DoseUnit.m_da->Update(atof(value));
  795. //FireNotify(m_DoseUnit.m_PostMS->GetKey(), m_DoseUnit.m_PostMS->JSGet());
  796. //SetEvent(m_hGenPostEvent);
  797. };
  798. auto HWERROR = [this](const char* value, int length)
  799. {
  800. assert(value);
  801. int nValue = atoi(value);
  802. if (nValue != 0)
  803. {
  804. char ErrorCode[10]{ "" };
  805. sprintf_s(ErrorCode, "SPELLMANECOM_ERR_%d", nValue);
  806. int level = 1;
  807. m_MSGUnit->AddErrorMessage(ErrorCode, level, "");
  808. }
  809. else
  810. {
  811. int level = 1;
  812. char ErrorCode[10]{ "" };
  813. m_MSGUnit->DelErrorMessage(ErrorCode, level, "");
  814. }
  815. };
  816. auto HWWARN = [this](const char* value, int length)
  817. {
  818. assert(value);
  819. int nValue = atoi(value);
  820. if (nValue != 0)
  821. {
  822. char WarnCode[10]{ "" };
  823. sprintf_s(WarnCode, "SPELLMANECOM_WARN_%d", nValue);
  824. int level = 1;
  825. m_MSGUnit->AddWarnMessage(WarnCode, level, "");
  826. }
  827. else
  828. {
  829. int level = 1;
  830. char WarnCode[10]{ "" };
  831. m_MSGUnit->AddWarnMessage(WarnCode, level, "");
  832. }
  833. };
  834. auto HWEHE = [this](const char* value, int length)
  835. {
  836. assert(value);
  837. if(m_DoseUnit.m_HE->Update(atoi(value)))
  838. FireNotify(m_DoseUnit.m_HE->GetKey(), m_DoseUnit.m_HE->JSGet());
  839. };
  840. auto HWFLK = [this](const char* value, int length)
  841. {
  842. assert(value);
  843. if (m_DoseUnit.m_KV->Update(atof(value)))
  844. FireNotify(AttrKey::KV, m_DoseUnit.m_KV->JSGet());
  845. };
  846. auto HWFLM = [this](const char* value, int length)
  847. {
  848. assert(value);
  849. if (m_DoseUnit.m_MA->Update(atof(value)/10.0))
  850. FireNotify(AttrKey::MA, m_DoseUnit.m_MA->JSGet());
  851. };
  852. auto HWFLS = [this](const char* value, int length)
  853. {
  854. assert(value);
  855. if (m_DoseUnit.m_FrameRate->Update(atof(value)/10.0))
  856. FireNotify(AttrKey::FRAMERATE, m_DoseUnit.m_FrameRate->JSGet());
  857. };
  858. auto HWFLX = [this](const char* value, int length)
  859. {
  860. assert(value);
  861. int nValue = atoi(value);
  862. if (nValue == 1)
  863. {
  864. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_FLU_XRAYON);
  865. }
  866. else if (nValue == 0)
  867. {
  868. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_FLU_XRAYOFF);
  869. }
  870. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  871. };
  872. auto HWFLP = [this](const char* value, int length)
  873. {
  874. assert(value);
  875. int nValue = atoi(value);
  876. if (nValue == 1)
  877. {
  878. ////PRINTA_INFO("\n recv FLP1\n"); //FLP1尚未真正的ready.
  879. }
  880. else if (nValue == 4)
  881. {
  882. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_FLU_READY); //根据全新定义 FLP4 才表示 ready。
  883. }
  884. else if (nValue == 0)
  885. {
  886. m_DoseUnit.m_GenSynState->Update(AttrKey::GENERATOR_FLU_OFF);
  887. }
  888. FireNotify(m_DoseUnit.m_GenSynState->GetKey(), m_DoseUnit.m_GenSynState->JSGet());
  889. };
  890. // 有部分前缀是包含关系, 长的包含短的, 例如 KVS 包含了 KV.
  891. // 因此长的在前面, 短的在后面
  892. // !!! Device 是个短寿命对象, 而 arFrame 是静态变量 !!!
  893. // !!! 因此, 在添加到 arFrame 之前, 务必先清零 !!!
  894. arFrame.clear();
  895. arFrame.push_back(tFrameMapping("RKVI", 4, HWNotProcess));
  896. arFrame.push_back(tFrameMapping("RKVD", 4, HWNotProcess));
  897. arFrame.push_back(tFrameMapping("RMAI", 4, HWNotProcess));
  898. arFrame.push_back(tFrameMapping("RMAD", 4, HWNotProcess));
  899. arFrame.push_back(tFrameMapping("RMSI", 4, HWNotProcess));
  900. arFrame.push_back(tFrameMapping("RMSD", 4, HWNotProcess));
  901. arFrame.push_back(tFrameMapping("RMXI", 4, HWNotProcess));
  902. arFrame.push_back(tFrameMapping("RMXD", 4, HWNotProcess));
  903. arFrame.push_back(tFrameMapping("EXB", 3, HWNotProcess));
  904. arFrame.push_back(tFrameMapping("ERE", 3, HWNotProcess));
  905. arFrame.push_back(tFrameMapping("RR", 2, HWNotProcess));
  906. arFrame.push_back(tFrameMapping("RPS", 3, HWNotProcess));
  907. arFrame.push_back(tFrameMapping("EXO", 3, HWNotProcess));
  908. arFrame.push_back(tFrameMapping("TIC", 3, HWNotProcess));
  909. arFrame.push_back(tFrameMapping("RTS", 3, HWNotProcess));
  910. arFrame.push_back(tFrameMapping("DSN", 3, HWNotProcess));
  911. arFrame.push_back(tFrameMapping("RKV", 3, HWKV));
  912. arFrame.push_back(tFrameMapping("RMX", 3, HWMAS));
  913. arFrame.push_back(tFrameMapping("RMA", 3, HWMA));
  914. arFrame.push_back(tFrameMapping("RMS", 3, HWMS));
  915. arFrame.push_back(tFrameMapping("RET", 3, HWTechmode));
  916. arFrame.push_back(tFrameMapping("RFO", 3, HWFocus));
  917. arFrame.push_back(tFrameMapping("RFI", 3, HWAECField));
  918. arFrame.push_back(tFrameMapping("RFS", 3, HWAECFilm));
  919. arFrame.push_back(tFrameMapping("RFN", 3, HWAECDensity));
  920. arFrame.push_back(tFrameMapping("EWS", 3, HWWS));
  921. arFrame.push_back(tFrameMapping("PR", 2, HWPR));
  922. arFrame.push_back(tFrameMapping("XR", 2, HWXR));
  923. arFrame.push_back(tFrameMapping("RAP", 3, HWAPDOSE));
  924. arFrame.push_back(tFrameMapping("RAT", 3, HWATDOSE));
  925. arFrame.push_back(tFrameMapping("ERR", 3, HWERROR));
  926. arFrame.push_back(tFrameMapping("EWN", 3, HWWARN));
  927. arFrame.push_back(tFrameMapping("EHE", 3, HWEHE));
  928. arFrame.push_back(tFrameMapping("FLK", 3, HWFLK));
  929. arFrame.push_back(tFrameMapping("FLM", 3, HWFLM));
  930. arFrame.push_back(tFrameMapping("FLS", 3, HWFLS));
  931. arFrame.push_back(tFrameMapping("FLF", 3, HWNotProcess));
  932. arFrame.push_back(tFrameMapping("FLP", 3, HWFLP));
  933. arFrame.push_back(tFrameMapping("FLX", 3, HWFLX));
  934. }
  935. bool nsGEN::SPELLMANDevice::StartHardwareStatusThread()
  936. {
  937. //PRINTA_INFO("enter Start HardwareStatus Thread ");
  938. if (m_pHardwareStatusThread == NULL)
  939. {
  940. DWORD m_HardwareStatusID;
  941. m_pHardwareStatusThread = CreateThread(0, 0, HardwareStatusThread, this, 0, &m_HardwareStatusID);
  942. if (m_pHardwareStatusThread == NULL)
  943. {
  944. //PRINTA_FATAL("Start HardwareStatus Thread Failed");
  945. return false;
  946. }
  947. }
  948. return true;
  949. }
  950. DWORD nsGEN::SPELLMANDevice::HardwareStatusThread(LPVOID pParam)
  951. {
  952. SPELLMANDevice* pCurGen = (SPELLMANDevice*)pParam;
  953. if (pCurGen == NULL)
  954. {
  955. return false;
  956. }
  957. //PRINTA_INFO("HardwareStatusThread start");
  958. while (true)
  959. {
  960. Sleep(2000);
  961. pCurGen->HWSend("EHE?");
  962. }
  963. //PRINTA_INFO("HardwareStatusThread stop");
  964. return true;
  965. }
  966. //-----------------------------------------------------------------------------
  967. // SPELLMANDriver
  968. //-----------------------------------------------------------------------------
  969. nsGEN::SPELLMANDriver::SPELLMANDriver()
  970. {
  971. m_bDemoConnected = false;
  972. }
  973. nsGEN::SPELLMANDriver::~SPELLMANDriver()
  974. {
  975. }
  976. auto nsGEN::SPELLMANDriver::CreateDevice(int index) -> std::unique_ptr <IODevice>
  977. {
  978. if (!m_SCF.isConnected())
  979. return nullptr;
  980. auto dev = std::unique_ptr <IODevice>(new IODevice(new SPELLMANDevice(EventCenter, m_SCF)));
  981. return dev;
  982. }
  983. void nsGEN::SPELLMANDriver::FireNotify(int code, std::string key, std::string content)
  984. {
  985. EventCenter->OnNotify(code, key, content);
  986. }
  987. void nsGEN::SPELLMANDriver::Prepare()
  988. {
  989. m_SCFDllName = GetConnectDLL(m_ConfigFileName);
  990. super::Prepare();
  991. }
  992. bool DATA_ACTION nsGEN::SPELLMANDriver::Connect()
  993. {
  994. ResDataObject Connection = GetConnectParam(m_ConfigFileName);
  995. //mLog::Info("connections:{$} \n", Connection.encode());
  996. printf("connections:%s \n", Connection.encode());
  997. //PRINTA_INFO("connections:%s \n", Connection.encode());
  998. auto erCode = m_SCF.Connect(Connection.encode(), &nsGEN::SPELLMANDriver::callbackPackageProcess, SCF_PACKET_TRANSFER, 3000);
  999. if (erCode != SCF_ERR::SCF_SUCCEED)
  1000. return false;
  1001. auto rc = super::Connect();
  1002. if (!rc)
  1003. return false;
  1004. //return (erCode == SCF_ERR::SCF_SUCCEED);
  1005. return true;
  1006. }
  1007. void nsGEN::SPELLMANDriver::Disconnect()
  1008. {
  1009. super::Disconnect();
  1010. m_SCF.Disconnect();
  1011. m_bDemoConnected = false;
  1012. }
  1013. bool nsGEN::SPELLMANDriver::isConnected() const
  1014. {
  1015. return super::isConnected();
  1016. }
  1017. std::string nsGEN::SPELLMANDriver::DriverProbe()
  1018. {
  1019. ResDataObject r_config, HardwareInfo;
  1020. if (r_config.loadFile(m_ConfigFileName.c_str()))
  1021. {
  1022. HardwareInfo.add("MajorID", r_config["CONFIGURATION"]["MajorID"]);
  1023. HardwareInfo.add("MinorID", r_config["CONFIGURATION"]["MinorID"]);
  1024. HardwareInfo.add("VendorID", r_config["CONFIGURATION"]["VendorID"]);
  1025. HardwareInfo.add("ProductID", r_config["CONFIGURATION"]["ProductID"]);
  1026. HardwareInfo.add("SerialID", r_config["CONFIGURATION"]["SerialID"]);
  1027. }
  1028. else
  1029. {
  1030. HardwareInfo.add("MajorID", "Generator");
  1031. HardwareInfo.add("MinorID", "Dr");
  1032. HardwareInfo.add("VendorID", "SPELLMAN");
  1033. HardwareInfo.add("ProductID", "HF");
  1034. HardwareInfo.add("SerialID", "Drv");
  1035. }
  1036. string ret = HardwareInfo.encode();
  1037. return ret;
  1038. }
  1039. std::string nsGEN::SPELLMANDriver::GetResource()
  1040. {
  1041. ResDataObject temp;
  1042. if (!temp.loadFile(m_ConfigFileName.c_str()))
  1043. return std::string();
  1044. auto r_config = temp["CONFIGURATION"];
  1045. for (auto& Item : m_ConfigInfo)
  1046. {
  1047. string key = Item.GetKey();
  1048. if (key == ConfKey::CcosGeneratorType)
  1049. {
  1050. Item.SetCurrentValue(((string)r_config["VendorID"]).c_str());
  1051. }
  1052. else if (key == ConfKey::CcosGeneratorModel)
  1053. {
  1054. Item.SetCurrentValue(((string)r_config["ProductID"]).c_str());
  1055. }
  1056. else if (key == ConfKey::CcosWSTable || key == ConfKey::CcosWSWall || key == ConfKey::CcosWSFree
  1057. || key == ConfKey::CcosWSTomo || key == ConfKey::CcosWSConventional)
  1058. {
  1059. Item.SetCurrentValue(((string)r_config[key.c_str()]).c_str());
  1060. }
  1061. else if (key == ConfKey::CcosSynTable || key == ConfKey::CcosSynWall || key == ConfKey::CcosSynFree
  1062. || key == ConfKey::CcosSynTomo || key == ConfKey::CcosSynConventional)
  1063. {
  1064. Item.SetCurrentValue(((string)r_config[key.c_str()]).c_str());
  1065. }
  1066. else if (key == ConfKey::CcosSCFType)
  1067. {
  1068. Item.SetCurrentValue(((string)r_config["connections"][0]["type"]).c_str());
  1069. }
  1070. else if (key == ConfKey::CcosSCFPort || key == ConfKey::CcosSCFBaudrate || key == ConfKey::CcosSCFBytesize
  1071. || key == ConfKey::CcosSCFParity || key == ConfKey::CcosSCFStopbits || key == ConfKey::CcosSCFIP)
  1072. {
  1073. if (r_config["connections"][0].GetFirstOf(key.c_str()) >= 0)
  1074. {
  1075. Item.SetCurrentValue(((string)r_config["connections"][0][key.c_str()]).c_str());
  1076. }
  1077. }
  1078. }
  1079. ResDataObject resAttr, resDescription;
  1080. for (auto Item : m_ConfigInfo)
  1081. {
  1082. resAttr.add(Item.GetKey(), Item.GetCurrentValue());
  1083. resDescription.add(Item.GetKey(), Item.GetDescription());
  1084. }
  1085. ResDataObject resDeviceResource;
  1086. resDeviceResource.add(ConfKey::CcosGeneratorAttribute, resAttr);
  1087. resDeviceResource.add(ConfKey::CcosGeneratorDescription, resDescription);
  1088. string res = resDeviceResource.encode();
  1089. printf("resDeviceResource :%s \n", resDeviceResource.encode());
  1090. //PRINTA_INFO("resDeviceResource :%s \n", resDeviceResource.encode());
  1091. return res;
  1092. }
  1093. std::string nsGEN::SPELLMANDriver::DeviceProbe()
  1094. {
  1095. ResDataObject r_config, HardwareInfo;
  1096. if (r_config.loadFile(m_ConfigFileName.c_str()))
  1097. {
  1098. HardwareInfo.add("MajorID", r_config["CONFIGURATION"]["MajorID"]);
  1099. HardwareInfo.add("MinorID", r_config["CONFIGURATION"]["MinorID"]);
  1100. HardwareInfo.add("VendorID", r_config["CONFIGURATION"]["VendorID"]);
  1101. HardwareInfo.add("ProductID", r_config["CONFIGURATION"]["ProductID"]);
  1102. HardwareInfo.add("SerialID", r_config["CONFIGURATION"]["SerialID"]);
  1103. }
  1104. else
  1105. {
  1106. HardwareInfo.add("MajorID", "Generator");
  1107. HardwareInfo.add("MinorID", "Dr");
  1108. HardwareInfo.add("VendorID", "SPELLMAN");
  1109. HardwareInfo.add("ProductID", "HF");
  1110. HardwareInfo.add("SerialID", "1234");
  1111. }
  1112. string ret = HardwareInfo.encode();
  1113. return ret;
  1114. }
  1115. void nsGEN::SPELLMANDriver::Dequeue(const char* Packet, DWORD Length)
  1116. {
  1117. DecodeFrame(Packet, Length);
  1118. }
  1119. PACKET_RET nsGEN::SPELLMANDriver::callbackPackageProcess(const char* RecData, DWORD nLength, DWORD& PacketLength)
  1120. {
  1121. if (nLength < 1)
  1122. {
  1123. printf("nLength < 1, nLength==%d \n", nLength);
  1124. //PRINTA_INFO("nLength < 1, nLength==%d \n", nLength);
  1125. return PACKET_USELESS;
  1126. }
  1127. for (DWORD i = 0; i < nLength - 1; i++)
  1128. {
  1129. //1 首先寻找包头
  1130. if (RecData[i]==0x02)
  1131. {
  1132. if (i!=0)
  1133. {
  1134. PacketLength = i; //i之前的数据,全部扔掉
  1135. char strtemp[100] = { 0 };
  1136. memcpy(strtemp, RecData, i);
  1137. strtemp[PacketLength + 1] = 0;
  1138. printf("==IN error data ==:%s,PacketLength=%d,nLength=%d\n", strtemp, PacketLength, nLength);
  1139. //for test
  1140. //for (int j = 0; j < nLength; j++)
  1141. //{
  1142. // printf("%2X,", RecData[j]);
  1143. //}
  1144. //printf("\n");
  1145. return PACKET_USELESS;
  1146. }
  1147. }
  1148. if (RecData[i] == 0x03)
  1149. {
  1150. PacketLength = i + 2; //+2 because STX , sum.
  1151. char strtemp[100] = { 0 };
  1152. memcpy(strtemp, RecData, i); // STX+RKC005(not include 03 + sum); //only 复制 0x03之前的数据,这样解析时,后面的03 ,sum 都不要了。
  1153. strtemp[PacketLength + 1] = 0;
  1154. printf("==IN==:%s\n", strtemp);
  1155. //PRINTA_INFO("==IN==:%s\n", strtemp);
  1156. return PACKET_ISPACKET;
  1157. }
  1158. }
  1159. return PACKET_NOPACKET;
  1160. }
  1161. //-----------------------------------------------------------------------------
  1162. // DecodeFrame
  1163. //-----------------------------------------------------------------------------
  1164. static bool DecodeFrame(const char* strFrame, int length)
  1165. {
  1166. auto pr = [strFrame, length](const tFrameMapping& Item)
  1167. {
  1168. for (int i = 0; i < Item.NbOfCharOfHead; i++)
  1169. {
  1170. if (strFrame[i] != Item.strHead[i])
  1171. {
  1172. return false;
  1173. }
  1174. }
  1175. return true;
  1176. };
  1177. auto found = std::find_if(arFrame.begin(), arFrame.end(), pr);
  1178. if (found == arFrame.end())
  1179. {
  1180. return false;
  1181. }
  1182. const auto& Item = *found;
  1183. auto pc = strFrame;
  1184. char data[100] = { 0 };
  1185. memcpy(data, strFrame + Item.NbOfCharOfHead, length - Item.NbOfCharOfHead - 2);
  1186. //pc += Item.NbOfCharOfHead; //---------jk++:pc is value. why? plus NbOfCharOfHead. 意思是pc的指针后移几个数,
  1187. Item.fun(data, length - Item.NbOfCharOfHead - 2);//第二个参数 不重要
  1188. return true;
  1189. }
  1190. //-----------------------------------------------------------------------------
  1191. // GetIODriver & CreateIODriver
  1192. //-----------------------------------------------------------------------------
  1193. static nsGEN::SPELLMANDriver gIODriver;
  1194. extern "C" CCOS::Dev::IODriver * __cdecl GetIODriver() // 返回静态对象的引用, 调用者不能删除 !
  1195. {
  1196. return &gIODriver;
  1197. }
  1198. extern "C" CCOS::Dev::IODriver * __cdecl CreateIODriver() // 返回新对象, 调用者必须自行删除此对象 !
  1199. {
  1200. return new nsGEN::SPELLMANDriver();
  1201. }