DriverManager.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <conio.h>
  4. #include <stdio.h>
  5. //#include "scf.h"
  6. #include "CDI.h"
  7. #include "LocalConfig.h"
  8. #include "BusUnitClient.h"
  9. #include "LogicClient.h"
  10. #include "common_api.h"
  11. #include "PacketAnalizer.h"
  12. #include "AutoDmp.h"
  13. #include <iostream>
  14. #define CRTDBG_MAP_ALLOC
  15. #include <stdlib.h>
  16. #include <crtdbg.h>
  17. #include "ShareMemory_Client.h"
  18. #include <chrono>
  19. #include "DeviceManager.h"
  20. const int maxDeviceNum = 30;
  21. int totalDeviceNum = 0;
  22. LogicDevice* g_AllDevice[maxDeviceNum];
  23. using namespace std;
  24. AutoDmp atdmp;
  25. LDM_API const char* add_driver(char* driverName)
  26. {
  27. if (AddDriverConfig(driverName) == false)
  28. {
  29. printf("DriverConfig File not Right.%s \nexit in 3sec\n", driverName);
  30. Sleep(3000);
  31. return 0;
  32. }
  33. return GetMajorID().c_str();
  34. }
  35. const char* pszAllDevice = "";
  36. /// <summary>
  37. /// //返回以;分割的可以Open的设备URI列表
  38. /// </summary>
  39. /// <param name="rpcPort">本驱动实际监听的RPC端口号</param>
  40. /// <param name="httpPort">本驱动实际监听的HTTP端口号</param>
  41. /// <returns>以;分割的可以Open的设备URI列表字符串</returns>
  42. LDM_API const char* get_all_device(int rpcPort, int httpPort)
  43. {
  44. if (totalDeviceNum <= 0)
  45. {
  46. if (GetCommandDispathIF()->InitAs(DIOS_PROC_MASTER, (UINT64)GetCurrentProcessId()))
  47. {
  48. //启动成功,返回设备树
  49. return (pszAllDevice = GetCommandDispathIF()->GetAllDevice((void**)(&g_AllDevice[0]), totalDeviceNum));
  50. }
  51. else
  52. {
  53. cout << "Call from GRPC " << "get_all_device init failed." << endl;
  54. return "";
  55. }
  56. }
  57. else
  58. {
  59. return (pszAllDevice = GetCommandDispathIF()->GetAllDevice((void**)(&g_AllDevice[0]), totalDeviceNum));
  60. }
  61. return "";
  62. }
  63. void* CreateCgoStruct(std::vector<string>& argList)
  64. {
  65. int nLen = sizeof(void*) * argList.size();
  66. for (int x = 0; x < argList.size(); x++)
  67. {
  68. nLen += argList[x].length();
  69. nLen += 1;
  70. }
  71. void* ret = malloc(nLen);
  72. char* pString = ((char*)ret) + argList.size() * sizeof(void*);
  73. for (int x = 0; x < argList.size(); x++)
  74. {
  75. string msg = argList[x];
  76. ((char**)ret)[x] = pString;
  77. memcpy(pString, msg.c_str(), msg.length() + 1);
  78. pString += (msg.length() + 1);
  79. }
  80. return ret;
  81. }
  82. /// <summary>
  83. /// 打开设备
  84. /// </summary>
  85. /// <param name="devIdx"></param>
  86. /// <param name="devUri"></param>
  87. /// <param name="devGroup"></param>
  88. /// <param name="reply"></param>
  89. /// <returns></returns>
  90. LDM_API int open_device(int devIdx, char* devUri, char* devGroup, void** reply) {
  91. if (devIdx >= totalDeviceNum)
  92. {
  93. if (devUri != nullptr && devUri[0] == 0)
  94. {
  95. string msg = "Enum All Device ok.";
  96. string context = pszAllDevice ;
  97. std::vector<string> allDev;
  98. SplitDeviceList(pszAllDevice, allDev);
  99. ResDataObject rescontext,resList;
  100. rescontext.add("Driver", resList);
  101. rescontext.add("Device", resList);
  102. rescontext.add("Host", resList);
  103. for (int x = 0; x < allDev.size(); x++)
  104. {
  105. //DIOS/DRIVER
  106. //DIOS/HOST/
  107. //DIOS/DEVICE
  108. if (allDev[x].substr(0, 11) == "DIOS/DRIVER")
  109. {
  110. rescontext["Driver"].update(allDev[x].c_str(), "");
  111. }
  112. else if (allDev[x].substr(0, 11) == "DIOS/DEVICE")
  113. {
  114. rescontext["Device"].update(allDev[x].c_str(), "");
  115. }
  116. else if (allDev[x].substr(0, 9) == "DIOS/HOST")
  117. {
  118. rescontext["Host"].update(allDev[x].c_str(), "");
  119. }
  120. }
  121. context = rescontext.encode();
  122. std::vector<string> params;
  123. params.push_back(msg);
  124. params.push_back(context);
  125. *reply = CreateCgoStruct(params);
  126. return RET_SUCCEED;
  127. }
  128. *reply = nullptr;
  129. return 0;
  130. }
  131. LogicDevice* pDev = nullptr;
  132. int nScanStart, nScanEnd;
  133. if (devIdx >= 0)
  134. {
  135. pDev = g_AllDevice[devIdx];
  136. if (pDev == nullptr)
  137. {
  138. *reply = nullptr;
  139. return 0;
  140. }
  141. nScanStart = nScanEnd = devIdx;
  142. }
  143. else
  144. {
  145. nScanStart = 0;
  146. nScanEnd = totalDeviceNum - 1;
  147. }
  148. string devUriString = devUri;
  149. for (; nScanStart <= nScanEnd; nScanStart++) {
  150. if (devUriString == g_AllDevice[nScanStart]->GetDiosAbstractPath() ||
  151. devUriString == g_AllDevice[nScanStart]->GetDiosRootPath()) {
  152. pDev = g_AllDevice[nScanStart];
  153. break;
  154. }
  155. }
  156. if (pDev != nullptr)
  157. {
  158. //设备路径校验ok
  159. ResDataObject resResource;
  160. RET_STATUS ret = pDev->DevOpen(devUri, devGroup, resResource);
  161. std::vector<string> params;
  162. string msg = "Open ok.";
  163. string context = resResource.size() > 0 ? resResource.encode() : (const char*)resResource;
  164. params.push_back(msg);
  165. params.push_back(context);
  166. *reply = CreateCgoStruct(params);
  167. return RET_SUCCEED;
  168. }
  169. cout << "Call from GRPC " << "open_device" << endl;
  170. return 0;
  171. }
  172. /// <summary>
  173. /// 关闭设备
  174. /// </summary>
  175. /// <param name="devIdx"></param>
  176. /// <param name="devUri"></param>
  177. /// <param name="devGroup"></param>
  178. /// <param name="reply"></param>
  179. /// <returns></returns>
  180. LDM_API int close_device(int devIdx, char* devUri, char* devGroup, void** reply) {
  181. if (devIdx >= totalDeviceNum)
  182. {
  183. *reply = nullptr;
  184. return 0;
  185. }
  186. LogicDevice* pDev = nullptr;
  187. int nScanStart, nScanEnd;
  188. if (devIdx >= 0)
  189. {
  190. pDev = g_AllDevice[devIdx];
  191. if (pDev == nullptr)
  192. {
  193. *reply = nullptr;
  194. return 0;
  195. }
  196. nScanStart = nScanEnd = devIdx;
  197. }
  198. else
  199. {
  200. nScanStart = 0;
  201. nScanEnd = totalDeviceNum - 1;
  202. }
  203. string devUriString = devUri;
  204. for (; nScanStart <= nScanEnd; nScanStart++) {
  205. if (devUriString == g_AllDevice[nScanStart]->GetDiosAbstractPath() ||
  206. devUriString == g_AllDevice[nScanStart]->GetDiosRootPath()) {
  207. pDev = g_AllDevice[nScanStart];
  208. break;
  209. }
  210. }
  211. if (pDev != nullptr)
  212. {
  213. //设备路径校验ok
  214. ResDataObject resResource;
  215. RET_STATUS ret = pDev->DevClose(devUri, devGroup, resResource);
  216. std::vector<string> params;
  217. string msg = "Close ok.";
  218. string context = resResource.size() > 0 ? resResource.encode() : (const char*)resResource;
  219. params.push_back(msg);
  220. params.push_back(context);
  221. *reply = CreateCgoStruct(params);
  222. return RET_SUCCEED;
  223. }
  224. cout << "Call from GRPC " << "close_device" << endl;
  225. return 0;
  226. }
  227. /// <summary>
  228. /// 获取设备属性
  229. /// </summary>
  230. /// <param name="devIdx"></param>
  231. /// <param name="devUri"></param>
  232. /// <param name="devProperty"></param>
  233. /// <param name="reply"></param>
  234. /// <returns></returns>
  235. LDM_API int device_get(int devIdx, char* devUri, char* devProperty, void** reply)
  236. {
  237. if (devIdx >= totalDeviceNum)
  238. {
  239. *reply = nullptr;
  240. return 0;
  241. }
  242. LogicDevice* pDev = nullptr;
  243. int nScanStart, nScanEnd;
  244. if (devIdx >= 0)
  245. {
  246. pDev = g_AllDevice[devIdx];
  247. if (pDev == nullptr)
  248. {
  249. *reply = nullptr;
  250. return 0;
  251. }
  252. nScanStart = nScanEnd = devIdx;
  253. }
  254. else
  255. {
  256. nScanStart = 0;
  257. nScanEnd = totalDeviceNum - 1;
  258. }
  259. string devUriString = devUri;
  260. for (; nScanStart <= nScanEnd; nScanStart++) {
  261. if (devUriString == g_AllDevice[nScanStart]->GetDiosAbstractPath() ||
  262. devUriString == g_AllDevice[nScanStart]->GetDiosRootPath()) {
  263. pDev = g_AllDevice[nScanStart];
  264. break;
  265. }
  266. }
  267. if (pDev != nullptr)
  268. {
  269. //设备路径校验ok
  270. ResDataObject resResource;
  271. RET_STATUS ret = pDev->DevGet(devUri, devProperty, resResource);
  272. std::vector<string> params;
  273. string msg = "Get ok.";
  274. string context = resResource.size() > 0? resResource.encode(): (const char*)resResource;
  275. params.push_back(devProperty);
  276. params.push_back(msg);
  277. params.push_back(context);
  278. *reply = CreateCgoStruct(params);
  279. return ret;
  280. }
  281. cout << "Call from GRPC " << "device get" << endl;
  282. return 0;
  283. }
  284. /// <summary>
  285. /// 设置设备属性
  286. /// </summary>
  287. /// <param name="devIdx"></param>
  288. /// <param name="devUri"></param>
  289. /// <param name="devProperty"></param>
  290. /// <param name="devValueSet"></param>
  291. /// <param name="reply"></param>
  292. /// <returns></returns>
  293. LDM_API int device_set(int devIdx, char* devUri, char* devProperty, char* devValueSet, void** reply)
  294. {
  295. if (devIdx >= totalDeviceNum)
  296. {
  297. *reply = nullptr;
  298. return 0;
  299. }
  300. LogicDevice* pDev = nullptr;
  301. int nScanStart, nScanEnd;
  302. if (devIdx >= 0)
  303. {
  304. pDev = g_AllDevice[devIdx];
  305. if (pDev == nullptr)
  306. {
  307. *reply = nullptr;
  308. return 0;
  309. }
  310. nScanStart = nScanEnd = devIdx;
  311. }
  312. else
  313. {
  314. nScanStart = 0;
  315. nScanEnd = totalDeviceNum - 1;
  316. }
  317. string devUriString = devUri;
  318. for (; nScanStart <= nScanEnd; nScanStart++) {
  319. if (devUriString == g_AllDevice[nScanStart]->GetDiosAbstractPath() ||
  320. devUriString == g_AllDevice[nScanStart]->GetDiosRootPath()) {
  321. pDev = g_AllDevice[nScanStart];
  322. break;
  323. }
  324. }
  325. if (pDev != nullptr)
  326. {
  327. //设备路径校验ok
  328. ResDataObject resResource;
  329. RET_STATUS ret = pDev->DevSet(devUri, devProperty, devValueSet, resResource);
  330. std::vector<string> params;
  331. string msg = "Set ok.";
  332. string context = resResource.size() > 0 ? resResource.encode() : (const char*)resResource;
  333. params.push_back(devProperty);
  334. params.push_back(msg);
  335. params.push_back(context);
  336. *reply = CreateCgoStruct(params);
  337. return ret;
  338. }
  339. return 0;
  340. }
  341. /// <summary>
  342. /// 更新设备属性,设备额外做工作,并返回执行结果
  343. /// </summary>
  344. /// <param name="devIdx"></param>
  345. /// <param name="devUri"></param>
  346. /// <param name="devProperty"></param>
  347. /// <param name="devValueUpdate"></param>
  348. /// <param name="reply"></param>
  349. /// <returns></returns>
  350. LDM_API int device_update(int devIdx, char* devUri, char* devProperty, char* devValueUpdate, void** reply)
  351. {
  352. if (devIdx >= totalDeviceNum)
  353. {
  354. *reply = nullptr;
  355. return 0;
  356. }
  357. LogicDevice* pDev = nullptr;
  358. int nScanStart, nScanEnd;
  359. if (devIdx >= 0)
  360. {
  361. pDev = g_AllDevice[devIdx];
  362. if (pDev == nullptr)
  363. {
  364. *reply = nullptr;
  365. return 0;
  366. }
  367. nScanStart = nScanEnd = devIdx;
  368. }
  369. else
  370. {
  371. nScanStart = 0;
  372. nScanEnd = totalDeviceNum - 1;
  373. }
  374. string devUriString = devUri;
  375. for (; nScanStart <= nScanEnd; nScanStart++) {
  376. if (devUriString == g_AllDevice[nScanStart]->GetDiosAbstractPath() ||
  377. devUriString == g_AllDevice[nScanStart]->GetDiosRootPath()) {
  378. pDev = g_AllDevice[nScanStart];
  379. break;
  380. }
  381. }
  382. if (pDev != nullptr)
  383. {
  384. //设备路径校验ok
  385. ResDataObject resResource;
  386. RET_STATUS ret = pDev->DevUpdate(devUri, devProperty, devValueUpdate, resResource);
  387. std::vector<string> params;
  388. string msg = "Update ok.";
  389. string context = resResource.size() > 0 ? resResource.encode() : (const char*)resResource;
  390. params.push_back(devProperty);
  391. params.push_back(msg);
  392. params.push_back(context);
  393. *reply = CreateCgoStruct(params);
  394. return ret;
  395. }
  396. return 0;
  397. }
  398. /// <summary>
  399. /// 设备属性添加
  400. /// </summary>
  401. /// <param name="devIdx"></param>
  402. /// <param name="devUri"></param>
  403. /// <param name="devProperty"></param>
  404. /// <param name="devValueAdd"></param>
  405. /// <param name="reply"></param>
  406. /// <returns></returns>
  407. LDM_API int device_add(int devIdx, char* devUri, char* devProperty, char* devValueAdd, void** reply)
  408. {
  409. if (devIdx >= totalDeviceNum)
  410. {
  411. *reply = nullptr;
  412. return 0;
  413. }
  414. LogicDevice* pDev = nullptr;
  415. int nScanStart, nScanEnd;
  416. if (devIdx >= 0)
  417. {
  418. pDev = g_AllDevice[devIdx];
  419. if (pDev == nullptr)
  420. {
  421. *reply = nullptr;
  422. return 0;
  423. }
  424. nScanStart = nScanEnd = devIdx;
  425. }
  426. else
  427. {
  428. nScanStart = 0;
  429. nScanEnd = totalDeviceNum - 1;
  430. }
  431. string devUriString = devUri;
  432. for (; nScanStart <= nScanEnd; nScanStart++) {
  433. if (devUriString == g_AllDevice[nScanStart]->GetDiosAbstractPath() ||
  434. devUriString == g_AllDevice[nScanStart]->GetDiosRootPath()) {
  435. pDev = g_AllDevice[nScanStart];
  436. break;
  437. }
  438. }
  439. if (pDev != nullptr)
  440. {
  441. //设备路径校验ok
  442. ResDataObject resResource;
  443. RET_STATUS ret = pDev->DevAdd(devUri, devProperty, devValueAdd , resResource);
  444. std::vector<string> params;
  445. string msg = "Add ok.";
  446. string context = resResource.size() > 0 ? resResource.encode() : (const char*)resResource;
  447. params.push_back(devProperty);
  448. params.push_back(msg);
  449. params.push_back(context);
  450. *reply = CreateCgoStruct(params);
  451. return ret;
  452. }
  453. return 0;
  454. }
  455. /// <summary>
  456. /// 设备属性移除
  457. /// </summary>
  458. /// <param name="devIdx"></param>
  459. /// <param name="devUri"></param>
  460. /// <param name="devProperty"></param>
  461. /// <param name="devValueDel"></param>
  462. /// <param name="reply"></param>
  463. /// <returns></returns>
  464. LDM_API int device_del(int devIdx, char* devUri, char* devProperty, char* devValueDel, void** reply)
  465. {
  466. if (devIdx >= totalDeviceNum)
  467. {
  468. *reply = nullptr;
  469. return 0;
  470. }
  471. LogicDevice* pDev = nullptr;
  472. int nScanStart, nScanEnd;
  473. if (devIdx >= 0)
  474. {
  475. pDev = g_AllDevice[devIdx];
  476. if (pDev == nullptr)
  477. {
  478. *reply = nullptr;
  479. return 0;
  480. }
  481. nScanStart = nScanEnd = devIdx;
  482. }
  483. else
  484. {
  485. nScanStart = 0;
  486. nScanEnd = totalDeviceNum - 1;
  487. }
  488. string devUriString = devUri;
  489. for (; nScanStart <= nScanEnd; nScanStart++) {
  490. if (devUriString == g_AllDevice[nScanStart]->GetDiosAbstractPath() ||
  491. devUriString == g_AllDevice[nScanStart]->GetDiosRootPath()) {
  492. pDev = g_AllDevice[nScanStart];
  493. break;
  494. }
  495. }
  496. if (pDev != nullptr)
  497. {
  498. //设备路径校验ok
  499. ResDataObject resResource;
  500. RET_STATUS ret = pDev->DevDel(devUri, devProperty, devValueDel , resResource);
  501. std::vector<string> params;
  502. string msg = "Del ok.";
  503. string context = resResource.size() > 0 ? resResource.encode() : (const char*)resResource;
  504. params.push_back(devProperty);
  505. params.push_back(msg);
  506. params.push_back(context);
  507. *reply = CreateCgoStruct(params);
  508. return ret;
  509. }
  510. return 0;
  511. }
  512. /// <summary>
  513. /// 设备执行Action
  514. /// </summary>
  515. /// <param name="devIdx"></param>
  516. /// <param name="devUri"></param>
  517. /// <param name="devFunction"></param>
  518. /// <param name="devReqParams"></param>
  519. /// <param name="reply"></param>
  520. /// <returns></returns>
  521. LDM_API int device_action(int devIdx, char* devUri, char* devFunction, char* devReqParams, void** reply)
  522. {
  523. if (devIdx >= totalDeviceNum)
  524. {
  525. *reply = nullptr;
  526. return 0;
  527. }
  528. LogicDevice* pDev = nullptr;
  529. int nScanStart, nScanEnd;
  530. if (devIdx >= 0)
  531. {
  532. pDev = g_AllDevice[devIdx];
  533. if (pDev == nullptr)
  534. {
  535. *reply = nullptr;
  536. return 0;
  537. }
  538. nScanStart = nScanEnd = devIdx;
  539. }
  540. else
  541. {
  542. nScanStart = 0;
  543. nScanEnd = totalDeviceNum - 1;
  544. }
  545. string devUriString = devUri;
  546. string absPath, rootPath;
  547. for (; nScanStart <= nScanEnd; nScanStart++) {
  548. absPath = g_AllDevice[nScanStart]->GetDiosAbstractPath();
  549. rootPath = g_AllDevice[nScanStart]->GetDiosRootPath();
  550. if (devUriString == absPath || devUriString == rootPath) {
  551. pDev = g_AllDevice[nScanStart];
  552. break;
  553. }
  554. if ( absPath._Starts_with(devUriString) || rootPath._Starts_with(devUriString))
  555. {
  556. pDev = g_AllDevice[nScanStart];
  557. break;
  558. }
  559. }
  560. if (pDev != nullptr)
  561. {
  562. //设备路径校验ok
  563. ResDataObject resResource;
  564. RET_STATUS ret = pDev->DevAction(devUri, devFunction, devReqParams , resResource);
  565. std::vector<string> params;
  566. string msg = "Action ok.";
  567. string context = resResource.size() > 0 ? resResource.encode() : (const char*)resResource;
  568. params.push_back(devFunction);
  569. params.push_back(msg);
  570. params.push_back(context);
  571. *reply = CreateCgoStruct(params);
  572. return ret;
  573. }
  574. return 0;
  575. }
  576. /// <summary>
  577. /// 给设备发送消息,用于消息交换
  578. /// </summary>
  579. /// <param name="devIdx"></param>
  580. /// <param name="devUri"></param>
  581. /// <param name="devTopic"></param>
  582. /// <param name="devMessageValue"></param>
  583. /// <param name="reply"></param>
  584. /// <returns></returns>
  585. LDM_API int device_message(int devIdx, char* devUri, char* devTopic, char* devMessageValue, void** reply)
  586. {
  587. if (devIdx >= totalDeviceNum)
  588. {
  589. *reply = nullptr;
  590. return 0;
  591. }
  592. LogicDevice* pDev = nullptr;
  593. int nScanStart, nScanEnd;
  594. if (devIdx >= 0)
  595. {
  596. pDev = g_AllDevice[devIdx];
  597. if (pDev == nullptr)
  598. {
  599. *reply = nullptr;
  600. return 0;
  601. }
  602. nScanStart = nScanEnd = devIdx;
  603. }
  604. else
  605. {
  606. nScanStart = 0;
  607. nScanEnd = totalDeviceNum - 1;
  608. }
  609. string devUriString = devUri;
  610. for (; nScanStart <= nScanEnd; nScanStart++) {
  611. if (devUriString == g_AllDevice[nScanStart]->GetDiosAbstractPath() ||
  612. devUriString == g_AllDevice[nScanStart]->GetDiosRootPath()) {
  613. pDev = g_AllDevice[nScanStart];
  614. break;
  615. }
  616. }
  617. if (pDev != nullptr)
  618. {
  619. //设备路径校验ok
  620. ResDataObject resResource;
  621. RET_STATUS ret = pDev->DevMessage(devUri, devTopic, devMessageValue, resResource);
  622. std::vector<string> params;
  623. string msg = "Set ok.";
  624. string context = resResource.size() > 0 ? resResource.encode() : (const char*)resResource;
  625. params.push_back(devTopic);
  626. params.push_back(msg);
  627. params.push_back(context);
  628. *reply = CreateCgoStruct(params);
  629. return ret;
  630. }
  631. return 0;
  632. }
  633. //LDM_API int device_get() {
  634. // cout << "Call from GRPC " << "device_get" << endl;
  635. //
  636. // return 0;
  637. //}
  638. //
  639. //LDM_API int device_update() {
  640. // cout << "Call from GRPC " << "device_update" << endl;
  641. // return 0;
  642. //}
  643. //
  644. //LDM_API int device_add() {
  645. // cout << "Call from GRPC " << "device_add" << endl;
  646. // return 0;
  647. //}
  648. //
  649. //LDM_API int device_del() {
  650. // cout << "Call from GRPC " << "device_del" << endl;
  651. // return 0;
  652. //}
  653. //
  654. //LDM_API int device_action() {
  655. // cout << "Call from GRPC " << "device_action" << endl;
  656. // return 0;
  657. //}
  658. //
  659. //LDM_API int device_message() {
  660. // cout << "Call from GRPC " << "device_message" << endl;
  661. // return 0;
  662. //}
  663. /// <summary>
  664. /// 释放结构体内的每一个char*
  665. /// </summary>
  666. /// <param name="pPoirnt"></param>
  667. /// <param name="nItemCount"></param>
  668. /// <returns></returns>
  669. LDM_API int free_struct(void* pPoirnt, int nItemCount)
  670. {
  671. if(pPoirnt != nullptr)
  672. free(pPoirnt);
  673. return RET_SUCCEED;
  674. }