MultiDPC.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582
  1. // MultiDPC.cpp : 定义 DLL 应用程序的导出函数。
  2. //
  3. #include "stdafx.h"
  4. #include "CDI.h"
  5. #include "MultiDPC.h"
  6. #include "common_api.h"
  7. #include "PacketAnalizer.h"
  8. #define MultiDPC_DeviceID "{399B143C-80F1-4D90-81D1-7C5CECC63EE8}"
  9. MultiDPC::MultiDPC(void)
  10. {
  11. }
  12. MultiDPC::~MultiDPC(void)
  13. {
  14. }
  15. //基本接口
  16. bool SYSTEM_CALL MultiDPC::GetDeviceType(GUID &DevType)
  17. {
  18. return string_2_guid(MultiDPC_DeviceID, DevType);
  19. }
  20. DPCDRIVERTYPE SYSTEM_CALL MultiDPC::GetDPCType()
  21. {
  22. return DPCDRIVER_MDPC;
  23. }
  24. void OEM_IF MultiDPC::AddDPCGUID(const char *pGUID)
  25. {
  26. m_DPCTypes.add(pGUID, "");
  27. }
  28. void OEM_IF MultiDPC::GetDPCGUIDs(ResDataObject &GUIDList)
  29. {
  30. GUIDList = m_DPCTypes;
  31. }
  32. //get device resource
  33. RET_STATUS SYSTEM_CALL MultiDPC::GetDeviceResource(ResDataObject PARAM_OUT *pDeviceResource)
  34. {
  35. bool ret = true;
  36. PRINTA_INFO(m_pLogger, "GetDeviceResource");
  37. RET_STATUS rs = LogicDriver::GetDeviceResource(pDeviceResource);
  38. if (rs != RET_SUCCEED)
  39. {
  40. return rs;
  41. }
  42. //make device type
  43. ret &= pDeviceResource->update("DeviceType", MultiDPC_DeviceID);
  44. //make attributes
  45. ResDataObject val = (*pDeviceResource)["Attribute"];
  46. ResDataObject Actions = (*pDeviceResource)["Action"];
  47. //添加设备属性在此
  48. val.add("DPCTYPES", m_DPCTypes);
  49. ret &= pDeviceResource->update("Attribute", val);
  50. //添加设备行为在此
  51. //APPMODE的添加,更新,删除
  52. ret &= Actions.add("AddDPC", "");
  53. ret &= Actions.add("DelDPC", "");
  54. if (Support_FramePrep())
  55. {
  56. ret &= Actions.add("FramePrep", INFINITE);
  57. }
  58. if (Support_FrameReady())
  59. {
  60. ret &= Actions.add("FrameReady", INFINITE);
  61. }
  62. if (Support_FrameStart())
  63. {
  64. ret &= Actions.add("FrameStart", INFINITE);
  65. }
  66. if (Support_FrameIn())
  67. {
  68. ret &= Actions.add("FrameIn", INFINITE);
  69. }
  70. if (Support_FrameOut())
  71. {
  72. ret &= Actions.add("FrameOut", INFINITE);
  73. }
  74. if (Support_FrameEnd())
  75. {
  76. ret &= Actions.add("FrameEnd", INFINITE);
  77. }
  78. if (Support_SeqError())
  79. {
  80. ret &= Actions.add("SeqError", INFINITE);
  81. }
  82. if (Support_SeqEnd())
  83. {
  84. ret &= Actions.add("SeqEnd", INFINITE);
  85. }
  86. if (Support_FrameError())
  87. {
  88. ret &= Actions.add("FrameError", INFINITE);
  89. }
  90. if (Support_FrameRecover())
  91. {
  92. ret &= Actions.add("FrameRecover", INFINITE);
  93. }
  94. if (Support_SeqRecover())
  95. {
  96. ret &= Actions.add("SeqRecover", INFINITE);
  97. }
  98. if (ret)
  99. {
  100. pDeviceResource->update("Action", Actions);
  101. return RET_SUCCEED;
  102. }
  103. return RET_FAILED;
  104. }
  105. void DATA_ACTION MultiDPC::DisConnect()
  106. {
  107. if ((*m_pConnectionStatus) == true)
  108. {
  109. //发通知
  110. ResDataObject NotifyData;
  111. (*m_pConnectionStatus) = false;
  112. SetEvent(m_DisConnectionStatusEvt);
  113. PacketAnalizer::MakeNotify(NotifyData, PACKET_CMD_UPDATE, m_pConnectionStatus->GetKey(), m_pConnectionStatus->GetVal());
  114. CmdFromLogicDev(&NotifyData);
  115. }
  116. //设置时间
  117. SetLastDisconnectTime(GetTickCount());
  118. }
  119. RET_STATUS SYSTEM_CALL MultiDPC::GetSEQResource(ResDataObject PARAM_OUT *pDeviceResource)
  120. {
  121. RET_STATUS retS = LogicDriver::GetSEQResource(pDeviceResource);
  122. if (retS >= RET_SUCCEED)
  123. {
  124. ResDataObject Actions;
  125. INT Idx = (*pDeviceResource).GetFirstOf("Action");
  126. if (Idx >= 0)
  127. {
  128. Actions = (*pDeviceResource)[Idx];
  129. }
  130. bool ret = true;
  131. if (Support_FramePrep())
  132. {
  133. ret &= Actions.add("FramePrep", INFINITE);
  134. }
  135. if (Support_FrameReady())
  136. {
  137. ret &= Actions.add("FrameReady", INFINITE);
  138. }
  139. if (Support_FrameStart())
  140. {
  141. ret &= Actions.add("FrameStart", INFINITE);
  142. }
  143. if (Support_FrameIn())
  144. {
  145. ret &= Actions.add("FrameIn", INFINITE);
  146. }
  147. if (Support_FrameOut())
  148. {
  149. ret &= Actions.add("FrameOut", INFINITE);
  150. }
  151. if (Support_FrameEnd())
  152. {
  153. ret &= Actions.add("FrameEnd", INFINITE);
  154. }
  155. if (Support_SeqError())
  156. {
  157. ret &= Actions.add("SeqError", INFINITE);
  158. }
  159. if (Support_SeqEnd())
  160. {
  161. ret &= Actions.add("SeqEnd", INFINITE);
  162. }
  163. if (Support_FrameError())
  164. {
  165. ret &= Actions.add("FrameError", INFINITE);
  166. }
  167. if (Support_FrameRecover())
  168. {
  169. ret &= Actions.add("FrameRecover", INFINITE);
  170. }
  171. if (Support_SeqRecover())
  172. {
  173. ret &= Actions.add("SeqRecover", INFINITE);
  174. }
  175. pDeviceResource->update("Action", Actions);
  176. }
  177. return retS;
  178. }
  179. //ResourceCommand Request In and Response Out
  180. RET_STATUS SYSTEM_CALL MultiDPC::Request(ResDataObject PARAM_IN *pRequest, ResDataObject PARAM_OUT *pResponse)
  181. {
  182. ResDataObject res;
  183. RET_STATUS ret = RET_NOSUPPORT;
  184. //1. analize request
  185. PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(pRequest);
  186. //cmd:get,set,add,del,exe,
  187. //ignore open/close
  188. //Action和Attr应该做成一个MAP,经过MAP访问这些资源,不应该是switch case
  189. //为了快速做一版,先保留switch case!!!
  190. string keystr = PacketAnalizer::GetPacketKey(pRequest);
  191. PRINTA_INFO(m_pLogger, "Request is %s", keystr.c_str());
  192. ACTION_SYNC_MODE syncmode = PacketAnalizer::GetPacketSyncMode(pRequest);
  193. switch (cmd){
  194. case PACKET_CMD_GET:
  195. {
  196. if (keystr.size() == 0)
  197. {
  198. //get resource
  199. ret = GetDeviceResource(&res);
  200. pResponse->update("CONTEXT", res);
  201. }
  202. else
  203. {
  204. //it must be attribute get
  205. //Action和Attr应该做成一个MAP,经过MAP访问这些资源
  206. //重新考虑了一遍,这个GET意义不大.因为值的变化总是以Data Notify形式进行同步.
  207. assert(0);//NOT FINISHED YET
  208. //这点需要应用层的确认,如果应用层没有获取,就没人调用进来
  209. //if(keystr == m_Status.GetKey())
  210. //{
  211. // //yes they want it
  212. // //CMD的关键字是否要改成SET???
  213. // pResponse->update("CONTEXT",m_Status.GetVal());
  214. // ret = RET_SUCCEED;
  215. // PacketAnalizer::MakeRetCode(ret,pResponse);
  216. //}
  217. }
  218. }
  219. break;
  220. case PACKET_CMD_EXE:
  221. {
  222. if (keystr == "AddDPC")
  223. {
  224. bool result = true;
  225. ResDataObject obj1,obj2;
  226. result &= PacketAnalizer::GetParam(pRequest, 0, obj1);
  227. result &= PacketAnalizer::GetParam(pRequest, 1, obj2);
  228. if (result)
  229. {
  230. if (m_DPCTypes.GetFirstOf((const char *)obj1) >= 0)
  231. {
  232. ret = (RET_STATUS)AddDPC((const char *)obj1, (const char *)obj2);
  233. }
  234. }
  235. }
  236. else if (keystr == "DelDPC")
  237. {
  238. bool result = true;
  239. ResDataObject obj1, obj2;
  240. result &= PacketAnalizer::GetParam(pRequest, 0, obj1);
  241. result &= PacketAnalizer::GetParam(pRequest, 1, obj2);
  242. if (result)
  243. {
  244. if (m_DPCTypes.GetFirstOf((const char *)obj1) >= 0)
  245. {
  246. ret = (RET_STATUS)DelDPC((const char *)obj1, (const char *)obj2);
  247. }
  248. }
  249. }
  250. else if (keystr == "DisConnect")
  251. {
  252. DisConnect();
  253. ret = RET_SUCCEED;
  254. }
  255. else if (keystr == "FramePrep")
  256. {
  257. ret = (RET_STATUS)FramePrep();
  258. }
  259. else if (keystr == "FrameReady")
  260. {
  261. ret = (RET_STATUS)FrameReady();
  262. }
  263. else if (keystr == "FrameStart")
  264. {
  265. ret = (RET_STATUS)FrameStart();
  266. }
  267. else if (keystr == "FrameIn")
  268. {
  269. ret = (RET_STATUS)FrameIn();
  270. }
  271. else if (keystr == "FrameOut")
  272. {
  273. ret = (RET_STATUS)FrameOut();
  274. }
  275. else if (keystr == "FrameEnd")
  276. {
  277. ret = (RET_STATUS)FrameEnd();
  278. }
  279. else if (keystr == "SeqError")
  280. {
  281. ret = (RET_STATUS)SeqError();
  282. }
  283. else if (keystr == "SeqEnd")
  284. {
  285. ret = (RET_STATUS)SeqEnd();
  286. }
  287. else if (keystr == "FrameError")
  288. {
  289. ret = (RET_STATUS)FrameError();
  290. }
  291. else if (keystr == "FrameRecover")
  292. {
  293. ret = (RET_STATUS)FrameRecover();
  294. }
  295. else if (keystr == "SeqRecover")
  296. {
  297. ret = (RET_STATUS)SeqRecover();
  298. }
  299. else if (keystr == "GetSEQResource")
  300. {
  301. //1. 获取参数
  302. ResDataObject res;
  303. ret = (RET_STATUS)GetSEQResource(&res);
  304. //3. 打包
  305. if (ret == RET_SUCCEED)
  306. {
  307. pResponse->update("CONTEXT", res);
  308. }
  309. }
  310. else
  311. {
  312. ret = RET_NOSUPPORT;
  313. }
  314. }
  315. break;
  316. default:
  317. //对当前设备来讲,其他都是浮云
  318. break;
  319. }
  320. //return status
  321. if (ret == RET_NOSUPPORT)
  322. {
  323. ret = LogicDriver::Request(pRequest, pResponse);
  324. }
  325. PacketAnalizer::MakeRetCode(ret, pResponse);
  326. return ret;
  327. }
  328. //notify to lower layer
  329. RET_STATUS SYSTEM_CALL MultiDPC::CmdToLogicDev(ResDataObject PARAM_IN *pCmd)
  330. {
  331. //这个命令只有一种情况下发生(作为客户端存在的时候)
  332. //1.设备的Notify消息
  333. //发往当前客户端的Notify
  334. //Data&Action notify!!!
  335. //Data Notify分两种
  336. //一种是本数据对象的更新,直接更新
  337. //一种是数据传递给上层,比如图像数据,探测器的剂量需求数据
  338. //Action Notify是发给Owner的
  339. //通知事件,让Owner知道,另外ActionNotify先保留下来
  340. //保留到哪里???
  341. //2.Response
  342. //命令Request发出后的反馈
  343. //1. analize request
  344. //2. call api
  345. //3. check results
  346. //put error log here
  347. assert(0);//not happening
  348. return RET_FAILED;
  349. }
  350. //对象接口
  351. bool SYSTEM_CALL MultiDPC::DriverEntry(ResDataObject& PARAM_IN Configuration)
  352. {
  353. return LogicDriver::DriverEntry(Configuration);
  354. }
  355. //状态机相关
  356. RET_STATUS DATA_ACTION MultiDPC::FramePrep()
  357. {
  358. return RET_FAILED;
  359. }
  360. RET_STATUS DATA_ACTION MultiDPC::FrameReady()
  361. {
  362. return RET_FAILED;
  363. }
  364. RET_STATUS DATA_ACTION MultiDPC::FrameStart()
  365. {
  366. return RET_FAILED;
  367. }
  368. RET_STATUS DATA_ACTION MultiDPC::FrameIn()
  369. {
  370. return RET_FAILED;
  371. }
  372. RET_STATUS DATA_ACTION MultiDPC::FrameOut()
  373. {
  374. return RET_FAILED;
  375. }
  376. RET_STATUS DATA_ACTION MultiDPC::FrameEnd()
  377. {
  378. return RET_FAILED;
  379. }
  380. //3个全局退出&错误Action
  381. RET_STATUS DATA_ACTION MultiDPC::SeqError()
  382. {
  383. return RET_FAILED;
  384. }
  385. RET_STATUS DATA_ACTION MultiDPC::SeqEnd()
  386. {
  387. return RET_FAILED;
  388. }
  389. RET_STATUS DATA_ACTION MultiDPC::FrameError()
  390. {
  391. return RET_FAILED;
  392. }
  393. //1个Recover
  394. RET_STATUS DATA_ACTION MultiDPC::FrameRecover()
  395. {
  396. return RET_FAILED;
  397. }
  398. RET_STATUS DATA_ACTION MultiDPC::SeqRecover()
  399. {
  400. return RET_FAILED;
  401. }
  402. bool DATA_ACTION MultiDPC::Support_FramePrep()
  403. {
  404. return false;
  405. }
  406. bool DATA_ACTION MultiDPC::Support_FrameReady()
  407. {
  408. return false;
  409. }
  410. bool DATA_ACTION MultiDPC::Support_FrameStart()
  411. {
  412. return false;
  413. }
  414. bool DATA_ACTION MultiDPC::Support_FrameIn()
  415. {
  416. return false;
  417. }
  418. bool DATA_ACTION MultiDPC::Support_FrameOut()
  419. {
  420. return false;
  421. }
  422. bool DATA_ACTION MultiDPC::Support_FrameEnd()
  423. {
  424. return false;
  425. }
  426. bool DATA_ACTION MultiDPC::Support_SeqError()
  427. {
  428. return false;
  429. }
  430. bool DATA_ACTION MultiDPC::Support_SeqEnd()
  431. {
  432. return false;
  433. }
  434. bool DATA_ACTION MultiDPC::Support_FrameError()
  435. {
  436. return false;
  437. }
  438. bool DATA_ACTION MultiDPC::Support_FrameRecover()
  439. {
  440. return false;
  441. }
  442. bool DATA_ACTION MultiDPC::Support_SeqRecover()
  443. {
  444. return false;
  445. }
  446. //#define _COMPILE_ONLY
  447. bool DATA_ACTION MultiDPC::AddDPC_Platform(LogicDriver *pDPC, ResDataObject &DrvConfig, const char *pszIdentifystr)
  448. {
  449. pDPC->SetDpcsIdentifyKey(pszIdentifystr);
  450. #ifdef _COMPILE_ONLY
  451. return false;
  452. #else
  453. return GetCommandDispathIF()->AddDPC((PVOID)this, (PVOID)pDPC, DrvConfig);
  454. #endif
  455. }
  456. bool DATA_ACTION MultiDPC::DelDPC_Platform(LogicDriver *pDPC)
  457. {
  458. #ifdef _COMPILE_ONLY
  459. return false;
  460. #else
  461. return GetCommandDispathIF()->DelDPC((PVOID)this, (PVOID)pDPC);
  462. #endif
  463. }
  464. RET_STATUS DATA_ACTION MultiDPC::AddDPC(const char *pGUID, const char *pszIdentifystr)
  465. {
  466. return RET_FAILED;
  467. }
  468. RET_STATUS DATA_ACTION MultiDPC::DelDPC(const char *pGUID, const char *pszIdentifystr)
  469. {
  470. return RET_FAILED;
  471. }