CDI.cpp 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548
  1. // CDI.cpp : 定义 DLL 应用程序的导出函数。
  2. //
  3. #include "CDI.h"
  4. #include "DrvTree.h"
  5. #include "common_api.h"
  6. #include "LocalConfig.h"
  7. //#include "ebus.h"
  8. #include "DriverManager.h"
  9. //#include "DevBusManager.h"
  10. #include "DeviceBus.h"
  11. #include "PacketAnalizer.h"
  12. #include "PacketCommon.h"
  13. //#include "ClientManager.h"
  14. #include "HandleManager.h"
  15. #include "BusUnitClient.h"
  16. #include "ProcThreadManager.h"
  17. //#include "ShareMemory_IF.h"
  18. #include "Crc64.h"
  19. //#include "ShareMemory_Server.h"
  20. //#include "ShareMemory_Client.h"
  21. //#include "CcosConsoleScript.h"
  22. //#include "APlatformDcs.h"
  23. #include "ModuleClient.h"
  24. #include <iostream>
  25. #include <unistd.h>
  26. #include <limits.h>
  27. #include <sys/types.h>
  28. #include <sys/wait.h>
  29. #include <sys/time.h>
  30. #include <sys/file.h>
  31. #include <cstring>
  32. #include <pthread.h>
  33. #include <fcntl.h>
  34. #include <cctype>
  35. #include <algorithm>
  36. #include "debug.h"
  37. //globle names
  38. CDI g_CDI;
  39. //Log4CPP::Logger* mLog::gLogger = nullptr;
  40. CDI::CDI()
  41. {
  42. m_MasterProcId = 0;
  43. m_ExitHandle = LinuxEvent::CreateEvent(LinuxEvent::MANUAL_RESET,false);
  44. m_prootClient = NULL;
  45. //m_DCSMap = NULL;
  46. return;
  47. }
  48. CDI::~CDI()
  49. {
  50. if (m_prootClient)
  51. {
  52. delete ((BusUnitClient*)m_prootClient);
  53. m_prootClient = NULL;
  54. }
  55. return;
  56. }
  57. /*
  58. INT CDI::LoadAllDCS()
  59. {
  60. //find all *.DCS
  61. m_DCSMap = new map<HMODULE,CcosConsoleScript*>();
  62. string basedll = string(DCSBASE) + string(".dcs.dll");
  63. string procdir = GetProcessDirectory();
  64. vector<string> filelist;
  65. FindSubFiles(procdir, filelist, true, "*.dcs.dll");
  66. for (size_t i = 0; i < filelist.size(); i++)
  67. {
  68. std::string::size_type pos = 0;
  69. //skip me first.DCSBASE.DCS
  70. if ((pos = filelist[i].find(basedll, pos)) != std::string::npos)
  71. {
  72. continue;
  73. }
  74. HMODULE dllhandle = LoadLibrary(filelist[i].c_str());
  75. if (dllhandle)
  76. {
  77. LOADDCS loadfunc = (LOADDCS)GetProcAddress(dllhandle, "LoadDCS");
  78. UNLOADDCS unloadfunc = (UNLOADDCS)GetProcAddress(dllhandle, "UnLoadDCS");
  79. if (loadfunc && unloadfunc)
  80. {
  81. CcosConsoleScript *pDCS = loadfunc();
  82. if (pDCS)
  83. {
  84. (*((map<HMODULE, CcosConsoleScript*> *)m_DCSMap))[dllhandle] = pDCS;
  85. }
  86. else
  87. {
  88. printf("LoadDCS failed.file:%s", filelist[i].c_str());
  89. DebugPrint("LoadDCS failed.file:%s", filelist[i].c_str());
  90. }
  91. }
  92. else
  93. {
  94. printf("no LoadDCS/UnLoadDCS function in dllfile:%s", filelist[i].c_str());
  95. DebugPrint("no LoadDCS/UnLoadDCS function in dllfile:%s", filelist[i].c_str());
  96. }
  97. }
  98. else
  99. {
  100. printf("\n\nError at load Dcs file.ErrorCode:%d\n\nDcsFile:%s\n\n",GetLastError(), filelist[i].c_str());
  101. DebugPrint("\n\nError at load Dcs file.ErrorCode:%d\n\nDcsFile:%s\n\n", GetLastError(), filelist[i].c_str());
  102. }
  103. //CcosConsoleScript *pDCS = new APlatformDcs();
  104. //if (pDCS)
  105. //{
  106. // //map it
  107. // (*((vector<CcosConsoleScript*> *)m_DCSMap)).push_back(pDCS);
  108. //}
  109. }
  110. return 0;
  111. }
  112. INT CDI::UnLoadAllDCS()
  113. {
  114. if (m_DCSMap)
  115. {
  116. map<HMODULE, CcosConsoleScript*>::iterator iter = (*((map<HMODULE, CcosConsoleScript*> *)m_DCSMap)).begin();
  117. while (iter != (*((map<HMODULE, CcosConsoleScript*> *)m_DCSMap)).end())
  118. {
  119. UNLOADDCS unloadfunc = (UNLOADDCS)GetProcAddress(iter->first, "UnLoadDCS");
  120. if (unloadfunc)
  121. {
  122. unloadfunc(iter->second);
  123. }
  124. ++iter;
  125. }
  126. (*((map<HMODULE, CcosConsoleScript*> *)m_DCSMap)).clear();
  127. delete (map<HMODULE, CcosConsoleScript*> *)m_DCSMap;
  128. m_DCSMap = NULL;
  129. }
  130. return 0;
  131. }
  132. */
  133. INT CDI::CommandInput(const char *pszCmd)
  134. {
  135. return 0;
  136. /*
  137. bool hit = false;
  138. if (m_DCSMap)
  139. {
  140. if (pszCmd && strlen(pszCmd) > 0)
  141. {
  142. string exp = pszCmd;
  143. //makeLowerStr(exp);
  144. ResDataObject Req = CcosConsoleScript::SeperateCommand(pszCmd);
  145. if (Req.size() > 0)
  146. {
  147. map<HMODULE, CcosConsoleScript*>::iterator iter = (*((map<HMODULE, CcosConsoleScript*> *)m_DCSMap)).begin();
  148. while (iter != (*((map<HMODULE, CcosConsoleScript*> *)m_DCSMap)).end())
  149. {
  150. if (exp == "help")
  151. {
  152. iter->second->Help();
  153. hit = true;
  154. ++iter;
  155. continue;
  156. }
  157. else
  158. {
  159. if (iter->second->Command(Req) == DCS_NOT_SUPPORT)
  160. {
  161. ++iter;
  162. continue;
  163. }
  164. hit = true;
  165. }
  166. break;
  167. ++iter;
  168. }
  169. //for (size_t i = 0; i < (*((vector<CcosConsoleScript*> *)m_DCSMap)).size(); i++)
  170. //{
  171. // if (exp == "help")
  172. // {
  173. // (*((vector<CcosConsoleScript*> *)m_DCSMap))[i]->Help();
  174. // hit = true;
  175. // continue;
  176. // }
  177. // else
  178. // {
  179. // if ((*((vector<CcosConsoleScript*> *)m_DCSMap))[i]->Command(Req) == DCS_NOT_SUPPORT)
  180. // {
  181. // continue;
  182. // }
  183. // hit = true;
  184. // }
  185. // break;
  186. //}
  187. if (hit == false)
  188. {
  189. printf("%s is not right command.plz use help for more info\n", (const char *)Req[0]);
  190. }
  191. return 1;
  192. }
  193. }
  194. }
  195. return 0;*/
  196. }
  197. void CDI::StartMqttServer()
  198. {
  199. return;
  200. char exePath[PATH_MAX];
  201. ssize_t len = readlink("/proc/self/exe", exePath, sizeof(exePath) - 1);
  202. if (len == -1) {
  203. std::cerr << "Failed to get executable path" << std::endl;
  204. return;
  205. }
  206. exePath[len] = '\0';
  207. std::string mqtt_path = exePath;
  208. size_t pos = mqtt_path.find_last_of('/');
  209. if (pos == std::string::npos) {
  210. std::cerr << "Invalid executable path" << std::endl;
  211. return;
  212. }
  213. mqtt_path.erase(pos + 1); // 保留末尾的 '/'
  214. std::string work_dir = mqtt_path + "emqx";
  215. mqtt_path += "emqx/bin/emqx";
  216. std::cout << "Try Start Mqtt Server First.. " << mqtt_path << std::endl;
  217. pid_t pid = fork();
  218. if (pid == 0) { // 子进程
  219. // 重定向标准输出/错误到/dev/null(相当于隐藏输出)
  220. int null_fd = open("/dev/null", O_WRONLY);
  221. dup2(null_fd, STDOUT_FILENO);
  222. dup2(null_fd, STDERR_FILENO);
  223. close(null_fd);
  224. // 准备参数
  225. char* args[] = {
  226. const_cast<char*>("emqx"),
  227. const_cast<char*>("start"),
  228. nullptr
  229. };
  230. // 切换工作目录并执行
  231. chdir(work_dir.c_str());
  232. execv(mqtt_path.c_str(), args);
  233. // 如果execv失败
  234. std::cerr << "execv failed: " << strerror(errno) << std::endl;
  235. _exit(1);
  236. }
  237. else if (pid > 0) { // 父进程
  238. // 非阻塞等待子进程退出
  239. waitpid(pid, nullptr, WNOHANG);
  240. std::cout << "Mqtt server started in background (PID: " << pid << ")" << std::endl;
  241. }
  242. else {
  243. std::cerr << "fork failed: " << strerror(errno) << std::endl;
  244. }
  245. /*
  246. if (!CreateProcess(NULL, // No module name (use command line)
  247. (LPSTR)mqtt_path.c_str(), // Command line
  248. NULL, // Process handle not inheritable
  249. NULL, // Thread handle not inheritable
  250. FALSE, // Set handle inheritance to FALSE
  251. CREATE_NEW_CONSOLE, // No creation flags
  252. NULL, // Use parent's environment block
  253. szFileName,
  254. //pfullWorkPath, // Use parent's starting directory
  255. &si, // Pointer to STARTUPINFO structure
  256. &pinfo) // Pointer to PROCESS_INFORMATION structure
  257. )
  258. {
  259. printf("CreateProcess failed (%d).\n", GetLastError());
  260. printf("Command path :%s\n", mqtt_path);
  261. }*/
  262. }
  263. void* CDI::InitShareMemory(void* pPara)
  264. {
  265. CDI* pCdi = (CDI*)pPara;
  266. ////mLog::FINFO("Begin");
  267. //CCOS_PROC_TYPE Master = GetConfigMode();
  268. //DWORD dwTick = GetTickCount();
  269. //if (Master == CCOS_PROC_CHANNEL)
  270. //{
  271. // //channel
  272. // if (ShareMemory_ServerStart() == false || ShareMemory_ClientStart() == false)
  273. // {
  274. // //mLog::FERROR("Can't Start Console Thread.sharememory server start failed.Exit in 3sec");
  275. // sleep(3);
  276. // return 0;
  277. // }
  278. // //mLog::FINFO( "-*-*-*-* Channel ShareMemory Use Time {$} ms", GetTickCount() - dwTick );
  279. // dwTick = GetTickCount();
  280. //}
  281. //else if (Master == CCOS_PROC_MASTER)
  282. //{
  283. // //main proc
  284. // if (ShareMemory_ClientStart() == false)
  285. // {
  286. // //mLog::FERROR("Can't Start Console Thread.sharememory client start failed.Exit in 3sec");
  287. // sleep(3);
  288. // return 0;
  289. // }
  290. // std::cout << "-*-*-*-* ShareMemory_ClientStart Use Time" << GetTickCount() - dwTick << " ms" << endl;
  291. // dwTick = GetTickCount();
  292. //}
  293. ////share memory init
  294. //DWORD BigBlockSize, BigBlockCount, SmallBlockSize, SmallBlockCount;
  295. //if (GetShareMemSettings(BigBlockSize, BigBlockCount, SmallBlockSize, SmallBlockCount) == false)
  296. //{
  297. // //mLog::FERROR("Can't GetShareMemSettings");
  298. // return false;
  299. //}
  300. //if (Init_Circle_SM_IF(BigBlockSize, BigBlockCount, SmallBlockSize, SmallBlockCount) < 0)
  301. //{
  302. // //mLog::FERROR("Can't Init_Circle_SM_IF");
  303. // return false;
  304. //}
  305. //mLog::FINFO( "-*-*-*-* Init_Circle_SM_IF Use Time {$} ms" , GetTickCount() - dwTick );
  306. //dwTick = GetTickCount();
  307. return 0;
  308. }
  309. /// <summary>
  310. /// 返回当前所有设备
  311. /// </summary>
  312. /// <param name="pDevices"></param>
  313. /// <param name="nDevNums"></param>
  314. /// <returns></returns>
  315. const char* CDI::GetAllDevice(void** pDevices, int& nDevNums)
  316. {
  317. return g_DrvManager.GetAllDevice(pDevices, nDevNums);
  318. }
  319. bool CDI::InitAs(CCOS_PROC_TYPE Master, UINT64 MasterProcId)
  320. {
  321. //NOT FINISHED YET
  322. //no Slave status
  323. pthread_t hShareMemoryHandle;
  324. ModuleClient hstClient("CDI_NOTIFY", "", "", false);
  325. string devPathNull = "";
  326. string mjrID = GetDeviceID();
  327. mjrID = mjrID.substr(0, mjrID.find_first_of('/'));
  328. if (mjrID.length() <= 0)
  329. mjrID = "Channel";
  330. string topic = "CCOS/HOST/" + mjrID + "/Status/Startup";
  331. DWORD dwTick = GetTickCount();
  332. if (Master == CCOS_PROC_CHANNEL)
  333. {
  334. //if (//mLog::gLogger == nullptr)
  335. //{
  336. // string strLogPath = GetProcessDirectory() + R"(\Conf\Log4CPP.Config.xml)";
  337. // string LogHost = ((string)getLogRootpath()).c_str();
  338. // Log4CPP::ThreadContext::Map::Set(ECOM::Utility::Hash("LogFileName"), "Platform");
  339. // Log4CPP::GlobalContext::Map::Set(ECOM::Utility::Hash("LogHost"), LogHost.c_str() + 1);
  340. // //Log4CPP::ThreadContext::Map::Set(ECOM::Utility::Hash("LogHost"), LogHost.c_str() + 1);
  341. // cout << endl << "LogHost = " << LogHost << endl << endl;
  342. // auto rc = Log4CPP::LogManager::LoadConfigFile(strLogPath.c_str());
  343. // //mLog::gLogger = Log4CPP::LogManager::GetLogger("Platform");
  344. // //mLog::FINFO("Code Build datetime [{$} {$}]", __DATE__, __TIME__);
  345. //}
  346. // Linux下使用文件锁实现单实例检测
  347. int lock_fd = open("/tmp/Channel.lock", O_CREAT | O_RDWR, 0666);
  348. if (lock_fd == -1) {
  349. perror("open lock file failed");
  350. return false;
  351. }
  352. if (flock(lock_fd, LOCK_EX | LOCK_NB) == -1) {
  353. if (errno == EWOULDBLOCK) {
  354. printf("Can't Start Console Thread.already exist.Exit in 3sec\n");
  355. close(lock_fd);
  356. sleep(3);
  357. return false;
  358. }
  359. }
  360. //启动MQTTserver 允许多次启动
  361. //mLog::FINFO("StartMqttServer");
  362. StartMqttServer();
  363. //mLog::FINFO("StartMqttServer Use Time {$} ", GetTickCount() - dwTick);
  364. dwTick = GetTickCount();
  365. }
  366. else if (Master == CCOS_PROC_MASTER)
  367. {
  368. //if (//mLog::gLogger == nullptr)
  369. //{
  370. // string strLogPath = GetProcessDirectory() + R"(\Conf\Log4CPP.Config.xml)";
  371. // string LogHost = ((string)getRootpath()).c_str();
  372. // if (LogHost.length() <= 1)
  373. // {
  374. // char szName[256];
  375. // sprintf(szName, "/LogicDevice_%08d", GetCurrentProcessId());
  376. // LogHost = szName;
  377. // }
  378. // setLogRootpath(LogHost.c_str());
  379. // Log4CPP::ThreadContext::Map::Set(ECOM::Utility::Hash("LogFileName"), "Platform");
  380. // Log4CPP::GlobalContext::Map::Set(ECOM::Utility::Hash("LogHost"), LogHost.c_str() + 1);
  381. // //Log4CPP::ThreadContext::Map::Set(ECOM::Utility::Hash("LogHost"), LogHost.c_str() + 1);
  382. // cout << endl << "LogHost = " << LogHost << endl << endl;
  383. // auto rc = Log4CPP::LogManager::LoadConfigFile(strLogPath.c_str());
  384. // //mLog::gLogger = Log4CPP::LogManager::GetLogger("Platform");
  385. // //mLog::FINFO("Code Build datetime [{$} {$}]", __DATE__, __TIME__);
  386. std::cout << "Code Build datetime [" << __DATE__ << " " << __TIME__ << "]\n";
  387. //}
  388. //get full proc path
  389. string keyStr,targetStr;
  390. targetStr = "";
  391. string dir = GetProcessDirectory();
  392. transform(dir.begin(), dir.end(), dir.begin(),
  393. [](unsigned char c) { return tolower(c); });
  394. size_t pos = 0;
  395. while ((pos = dir.find('\\', pos)) != string::npos) {
  396. dir.replace(pos, 1, "/");
  397. }
  398. //make md5
  399. unsigned char digest[35];
  400. memset(digest, 0, 35);
  401. }
  402. hstClient.Open(devPathNull.c_str(), ALL_ACCESS);
  403. std::cout << "hstClient.Notify" << "\n";
  404. hstClient.Notify(topic.c_str(), GetDeviceID().c_str(), "Startup", "Status", "Init started");
  405. SetConfigMode(Master);
  406. std::cout << "Start backgroud InitShareMemory " << "\n";
  407. {
  408. pthread_attr_t attr;
  409. pthread_attr_init(&attr);
  410. pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
  411. // 创建线程
  412. if (pthread_create(&hShareMemoryHandle, &attr,
  413. InitShareMemory, this) != 0) {
  414. perror("pthread_create failed");
  415. return false;
  416. }
  417. pthread_attr_destroy(&attr);
  418. }
  419. //mLog::FINFO("CDI ");
  420. //Master & Channel
  421. hstClient.Notify(topic.c_str(), GetDeviceID().c_str(), "Startup", "Status", "Load Root Driver");
  422. int nGrpcPort = 9000;
  423. if (Master == CCOS_PROC_MASTER || Master == CCOS_PROC_CHANNEL)
  424. {
  425. //mLog::FINFO("CDI InitAs RPROC_TYPE {$}", (int) Master);
  426. std::cout << "CDI InitAs RPROC_TYPE " << Master << std::endl;
  427. //load root driver
  428. //mLog::FINFO("g_DrvManager.LoadRootDrv ");
  429. if (g_DrvManager.LoadRootDrv() == false)
  430. {
  431. //log here
  432. //
  433. std::cout << "Failed to load root drv." <<std::endl;
  434. //mLog::FINFO("Failed to load root drv.");
  435. UnLoadAll();
  436. return false;
  437. }
  438. ResDataObject rootRes;
  439. LogicDevice* pDev[10];
  440. int nNum = 0;
  441. g_DrvManager.GetAllDevice((void**)pDev, nNum);
  442. std::cout << "Now Add Deivce Num is " << nNum << std::endl;
  443. //mLog::FINFO("Now Add Deivce Num is {$}", nNum);
  444. for (int x = 0; x < nNum; x++)
  445. {
  446. string path = pDev[x]->GetCcosRootPath();
  447. //mLog::FINFO("[{$}] Dev is {$}", x, path);
  448. std::cout << "[" << x << "] Dev is " << path << std::endl;
  449. // CCOS/HOST/
  450. if (path.length() > 10 && path.substr(0, 10) == "CCOS/HOST/")
  451. {
  452. pDev[x]->GetDeviceResource(&rootRes);
  453. std::cout << "Dev " << path << " resource is " << rootRes.encode() << std::endl;
  454. //mLog::FINFO("Dev {$} resource is {$}", path, rootRes.encode());
  455. nGrpcPort = rootRes["Attribute"]["GrpcPort"];
  456. //mLog::FINFO("This Driver GRPC Port is {$}", nGrpcPort);
  457. std::cout << "This Driver GRPC Port is " << nGrpcPort << std::endl;
  458. }
  459. }
  460. std::cout << "g_DrvManager.LoadRootDrv over."<< std::endl;
  461. //mLog::FINFO("g_DrvManager.LoadRootDrv over.");
  462. }
  463. else {
  464. std::cout << "CDI InitAs RPROC_TYPE " << Master << std::endl;
  465. //mLog::FINFO("CDI InitAs RPROC_TYPE {$}", (int)Master);
  466. }
  467. std::cout << "CDI -*-*-*-* g_DrvManager.LoadRootDrv() Use Time " << GetTickCount() - dwTick<<" ms" << std::endl;
  468. //mLog::FINFO("CDI -*-*-*-* g_DrvManager.LoadRootDrv() Use Time {$} ms", GetTickCount() - dwTick);
  469. dwTick = GetTickCount();
  470. //make sure root exist
  471. //LoadAllDCS();
  472. //load bus driver
  473. hstClient.Notify(topic.c_str(), GetDeviceID().c_str(), "Startup", "Status", "Load Bus Driver");
  474. //mLog::FINFO("CDI::InitAs LoadBusDrv ");
  475. if (LoadBusDrv() == false)
  476. {
  477. //log here
  478. //
  479. std::cout << "Failed to load bus drv."<< std::endl;
  480. //mLog::FINFO("Failed to load bus drv.");
  481. UnLoadAll();
  482. return false;
  483. }
  484. std::cout << "LoadBusDrv use time " << GetTickCount() - dwTick << std::endl;
  485. //mLog::FINFO("LoadBusDrv use time {$}", GetTickCount() - dwTick);
  486. dwTick = GetTickCount();
  487. //mLog::FINFO("CDI InitAs g_DrvTree.StartThread");
  488. //start monitoring root driver,and update drvtree
  489. if (g_DrvTree.StartThread() == false)
  490. {
  491. //log here
  492. std::cout << "Failed to start drv tree thread." << std::endl;
  493. //mLog::FINFO("Failed to start drv tree thread.");
  494. UnLoadAll();
  495. return false;
  496. }
  497. std::cout << "CDI g_DrvTree.StartThread Use Time " << GetTickCount() - dwTick << std::endl;
  498. //mLog::FINFO("CDI g_DrvTree.StartThread Use Time {$} ms", GetTickCount() - dwTick);
  499. dwTick = GetTickCount();
  500. /*
  501. if (Master == CCOS_PROC_CLIENT)
  502. {
  503. //ccos client
  504. assert(0);//NOT FINISHED YET
  505. }
  506. else */
  507. static int idx_test = 0;
  508. if (Master == CCOS_PROC_CHANNEL)
  509. {
  510. //ccos channel
  511. //mLog::FINFO("CDI InitAs g_DrvManager.UpdateRootDrvStatus");
  512. if (g_DrvManager.UpdateRootDrvStatus(1))
  513. {
  514. //mLog::FINFO("CDI g_DrvManager.UpdateRootDrvStatus Use Time {$} ms", GetTickCount() - dwTick);
  515. dwTick = GetTickCount();
  516. //mLog::FINFO("CDI InitBusUnit");
  517. if (InitBusUnit())
  518. {
  519. //mLog::FINFO("CDI InitBusUnit Use Time {$} ms ", GetTickCount() - dwTick );
  520. dwTick = GetTickCount();
  521. //等待共享内存线程结束
  522. struct timespec ts;
  523. clock_gettime(CLOCK_REALTIME, &ts);
  524. ts.tv_sec += 2; // 2秒超时
  525. // 使用pthread_timedjoin_np实现超时等待
  526. if (pthread_timedjoin_np(hShareMemoryHandle, nullptr, &ts) != 0) {
  527. fprintf(stderr, "InitShareMemory thread timeout\n");
  528. }
  529. //mLog::FINFO("CDI WaitForSingleObject hShareMemoryHandle over.");
  530. return true;
  531. }
  532. UnLoadAll();
  533. }
  534. return false;
  535. }
  536. else if (Master == CCOS_PROC_MASTER)
  537. {
  538. //load all drivers in pocket
  539. //ResDataObject filelist;
  540. //if (GetDriverConfigFiles(filelist))
  541. //{
  542. // for (size_t i = 0; i < filelist.size(); i++)
  543. // {
  544. // //1.load drv
  545. // if (g_DrvManager.LoadDriver(filelist.GetKey(i)) == false)
  546. // {
  547. // //log here
  548. // printf("Failed Load Drver:%s\n", filelist.GetKey(i));
  549. // }
  550. // //printf("Load %s succeed\n", filelist.GetKey(i));
  551. // }
  552. //}
  553. size_t idx = 0;
  554. const char *pszConfigDriverpath = GetDriverConfigFilepath(idx);
  555. std::cout << "CDI InitAs g_DrvManager.LoadDriver(pszConfigDriverpath) " << idx << std::endl;
  556. //mLog::FINFO("CDI InitAs g_DrvManager.LoadDriver(pszConfigDriverpath) {$}", idx);
  557. while (pszConfigDriverpath)
  558. {
  559. //mLog::FINFO("CDI InitAs g_DrvManager.LoadDriver: {$}", pszConfigDriverpath);
  560. std::cout << "CDI InitAs g_DrvManager.LoadDriver:" << pszConfigDriverpath << std::endl;
  561. string msg = "Load Main Driver ";
  562. msg += pszConfigDriverpath;
  563. hstClient.Notify(topic.c_str(), GetDeviceID().c_str(), "Startup", "Status",msg.c_str() );
  564. if (g_DrvManager.LoadDriver(pszConfigDriverpath) == false)
  565. {
  566. //log here
  567. //mLog::FINFO("Failed Load Drver:{$}", pszConfigDriverpath);
  568. }
  569. else
  570. {
  571. std::cout << "Load " << pszConfigDriverpath<< "succeed" << std::endl;
  572. //mLog::FINFO("Load {$} succeed", pszConfigDriverpath);
  573. }
  574. //mLog::FINFO("CDI g_DrvManager.LoadDriver Use Time {$} ms", GetTickCount() - dwTick );
  575. dwTick = GetTickCount();
  576. pszConfigDriverpath = GetDriverConfigFilepath(++idx);
  577. }
  578. std::cout << "CDI UpdateRootDrvStatus" <<std::endl;
  579. //mLog::FINFO("CDI UpdateRootDrvStatus");
  580. if (g_DrvManager.UpdateRootDrvStatus(1))
  581. {
  582. //mLog::FINFO("CDI g_DrvManager.UpdateRootDrvStatus Use Time {$} ms", GetTickCount() - dwTick);
  583. dwTick = GetTickCount();
  584. //mLog::FINFO("CDI InitBusUnit");
  585. std::cout << "CDI InitBusUnit" << std::endl;
  586. if (InitBusUnit())
  587. {
  588. //mLog::FINFO("CDI InitBusUnit Use Time {$} ms", GetTickCount() - dwTick);
  589. dwTick = GetTickCount();
  590. //等待共享内存线程结束
  591. struct timespec ts;
  592. clock_gettime(CLOCK_REALTIME, &ts);
  593. ts.tv_sec += 2; // 2秒超时
  594. // 使用pthread_timedjoin_np实现超时等待
  595. if (pthread_timedjoin_np(hShareMemoryHandle, nullptr, &ts) != 0) {
  596. fprintf(stderr, "InitShareMemory thread timeout\n");
  597. }
  598. std::cout << "CDI WaitForSingleObject(hShareMemoryHandle over" << std::endl;
  599. //mLog::FINFO("CDI WaitForSingleObject(hShareMemoryHandle over");
  600. idx_test++;
  601. std::cout << "CDI g_DrvManager.DynDriverInitLoadAll "<< idx_test << std::endl;
  602. //mLog::FINFO("CDI g_DrvManager.DynDriverInitLoadAll {$}", idx_test);
  603. g_DrvManager.DynDriverInitLoadAll();
  604. hstClient.Notify(topic.c_str(), GetDeviceID().c_str(), "Startup", "Status", "Start OK");
  605. topic = "CCOS/HOST/" + mjrID + "/Status/Running";
  606. string runMsg = "{\"GrpcPort\":" + to_string(nGrpcPort) + "}";
  607. hstClient.Notify(topic.c_str(), (string("CCOS/DRIVER/")+ GetDeviceID()).c_str(), "Running", "Status", runMsg.c_str());
  608. //mLog::FINFO("CDI DynDriverInitLoadAll over. Started ok.");
  609. std::cout << "CDI DynDriverInitLoadAll over. Started ok." << std::endl;
  610. return true;
  611. }
  612. else
  613. {
  614. //mLog::FINFO("Failed to init bus unit.");
  615. }
  616. }
  617. std::cout << "CDI UnLoadAll" << std::endl;
  618. //mLog::FINFO("CDI UnLoadAll");
  619. UnLoadAll();
  620. return false;
  621. }
  622. /*else if (Master == CCOS_PROC_SLAVE)
  623. {
  624. //slave
  625. assert(0);//NOT FINISHED YET
  626. }*/
  627. std::cout << "-*-*-*-* Shoud not Execute, execpet somting failed..... Use Time" << GetTickCount() - dwTick << " ms" << endl;
  628. dwTick = GetTickCount();
  629. if (InitBusUnit())
  630. {
  631. std::cout << "-*-*-*-* InitBusUnit again Use Time" << GetTickCount() - dwTick << " ms" << endl;
  632. dwTick = GetTickCount();
  633. //等待共享内存线程结束
  634. struct timespec ts;
  635. clock_gettime(CLOCK_REALTIME, &ts);
  636. ts.tv_sec += 2; // 2秒超时
  637. // 使用pthread_timedjoin_np实现超时等待
  638. if (pthread_timedjoin_np(hShareMemoryHandle, nullptr, &ts) != 0) {
  639. fprintf(stderr, "InitShareMemory thread timeout\n");
  640. }
  641. idx_test++;
  642. std::cout << "- *-*-*-* ========= g_DrvManager.DynDriverInitLoadAll 2 " << idx_test << endl;
  643. g_DrvManager.DynDriverInitLoadAll();
  644. return true;
  645. }
  646. UnLoadAll();
  647. return false;
  648. }
  649. /*
  650. bool CDI::ReceivedFromLocalBus(ResDataObject &packet)
  651. {
  652. bool ret = true;
  653. RES_//mLog::FINFO(packet, "Packet from Local Bus");
  654. //correct it's direction
  655. try {
  656. PacketAnalizer::UpdatePacketRoute(packet, CCOS_PACKET_ROUTE_LOCAL);
  657. //do the normal dispatch
  658. ret = ReceivedFromBus(packet);
  659. }
  660. catch (...)
  661. {
  662. ret = false;
  663. }
  664. return ret;
  665. }
  666. bool CDI::ReceivedFromEthBus(ResDataObject &packet)
  667. {
  668. bool ret = true;
  669. RES_//mLog::FINFO(packet, "Packet from Eth Bus");
  670. //correct it's direction
  671. try {
  672. PacketAnalizer::UpdatePacketRoute(packet, CCOS_PACKET_ROUTE_ETH);
  673. //do the normal dispatch
  674. ret = ReceivedFromBus(packet);
  675. }
  676. catch (...)
  677. {
  678. ret = false;
  679. }
  680. return ret;
  681. }
  682. */
  683. bool CDI::SendCcosPacket(ResDataObject& packet)
  684. {
  685. CCOS_PACKET_ROUTE Route;
  686. if (!PacketAnalizer::GetPacketRoute(&packet, Route))
  687. return false;
  688. bool sendtoLocalMachine = false;
  689. bool sendBlockData = false;
  690. //packet cmd
  691. PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(&packet);
  692. if (cmd == PACKET_CMD_DATA)
  693. {
  694. sendBlockData = true;
  695. }
  696. string DesBusId;
  697. if (!PacketAnalizer::GetDestinationBusId(packet, DesBusId))
  698. {
  699. return false;
  700. }
  701. //Precaculate direction
  702. if (Route == CCOS_PACKET_ROUTE_ANY)
  703. {
  704. //choose one
  705. Route = GetBusIdDirection(DesBusId);
  706. }
  707. //caculate again
  708. if (Route == CCOS_PACKET_ROUTE_LOCAL)
  709. {
  710. //target in this machine
  711. sendtoLocalMachine = true;
  712. }
  713. else if (Route == CCOS_PACKET_ROUTE_ETH)
  714. {
  715. //target is not in this machine
  716. }
  717. else if (Route == CCOS_PACKET_ROUTE_ANY)
  718. {
  719. //if still any direction,then try local and try eth
  720. //local first
  721. if (DoSendPacket(packet, true, sendBlockData, DesBusId) == CMD_ECHO_OK)
  722. {
  723. return CMD_ECHO_OK;
  724. }
  725. //try eth
  726. return DoSendPacket(packet, false, sendBlockData, DesBusId);
  727. }
  728. else
  729. {
  730. //ignore
  731. return CMD_ECHO_IGNORE;
  732. }
  733. //do send
  734. return DoSendPacket(packet, sendtoLocalMachine, sendBlockData, DesBusId);
  735. }
  736. //1.command comes from client
  737. //2.dispatch command comes from device
  738. bool CDI::ReceivedFromBus(ResDataObject &packet)
  739. {
  740. bool ret = true;
  741. /*
  742. //check destination & dispatch
  743. CMD_ECHO DispatchRet = DispatchPacket(packet);
  744. if (DispatchRet == CMD_ECHO_OK)
  745. {
  746. //log here
  747. //mLog::FINFO("Trasform Succeed");
  748. return true;
  749. }
  750. else if (DispatchRet == CMD_ECHO_IGNORE)
  751. {
  752. //mLog::FINFO("Ignore Packet");
  753. return false;
  754. }
  755. else if (DispatchRet == CMD_ECHO_NG)//this proc
  756. {
  757. //dispatch to the process
  758. //mLog::FINFO("Dispatch to Local");
  759. DispatchRet = DispatchToLocal(packet);
  760. if (DispatchRet == CMD_ECHO_OK)
  761. {
  762. //mLog::FINFO("Dispatch to Local Succeed");
  763. return true;
  764. }
  765. else if (DispatchRet == CMD_ECHO_NG)//device access failed
  766. {
  767. //request in
  768. //make failed Res and send it
  769. //mLog::FERROR("Dispatch to Local Failed.no access right");
  770. Ex_ResponseRemoteClientReq(packet, RET_FAILED, "no access right");
  771. return true;//保持连线
  772. }
  773. else if (DispatchRet == CMD_ECHO_NOTARGET)
  774. {
  775. //deal later
  776. //mLog::FERROR("Dispatch to Local Failed.no target exist");
  777. }
  778. else
  779. {
  780. //ignore
  781. //mLog::FERROR("Dispatch to Local Failed.no idea....");
  782. }
  783. }
  784. if (DispatchRet == CMD_ECHO_NOTARGET)
  785. {
  786. PACKET_TYPE type = PacketAnalizer::GetPacketType(&packet);
  787. PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(&packet);
  788. //failed send packet
  789. switch (type)
  790. {
  791. case PACKET_TYPE_REQ:
  792. //make INVALID Res and send it
  793. if (cmd != PACKET_CMD_CLOSE)
  794. {
  795. //mLog::FERROR("Response to Owner.no device exist....");
  796. Ex_ResponseRemoteClientReq(packet, RET_INVALID, "no device exist");
  797. }
  798. break;
  799. case PACKET_TYPE_RES:
  800. case PACKET_TYPE_NOTIFY:
  801. //make Close Notify and send it
  802. //mLog::FERROR("Request Close to Device.no Owner exist...");
  803. Ex_RequestRemoteClientClose(packet);
  804. break;
  805. default:
  806. //log here??
  807. //mLog::FERROR("Packet error.WTF happenning???");
  808. return false;
  809. break;
  810. }
  811. return false;
  812. }
  813. else
  814. {
  815. //junky packet
  816. //mLog::FERROR("Packet error junky packet.");
  817. }
  818. */
  819. return false;
  820. }
  821. /*
  822. //broardcast
  823. bool CDI::ReceivedDeviceNotify(ResDataObject &packet)
  824. {
  825. vector<CcosDevFileHandle> OwnerList;
  826. if (g_HandleManager.GetNotifyOwners(packet, OwnerList))
  827. {
  828. //NOT FINISHED YET
  829. //need to seperate this proc owner,local proc owner,eth owner
  830. for (DWORD i = 0; i < OwnerList.size(); i++)
  831. {
  832. //make notify
  833. ResDataObject notify;
  834. notify = packet;
  835. //add
  836. PacketAnalizer::UpdateNotifyHandle(notify, OwnerList[i]);
  837. //printf("Driver Thread:%d,Send Notify\n", GetCurrentThreadId());
  838. RES_//mLog::FINFO(notify,"Notify to Owners:\n");
  839. ReceivedFromDevice(notify);
  840. }
  841. return true;
  842. }
  843. else
  844. {
  845. //printf("Driver Thread:%d,Failed to Notify.no packet owner exist\n", GetCurrentThreadId());
  846. }
  847. return false;
  848. }*/
  849. //notify & response.
  850. bool CDI::ReceivedFromDevice(ResDataObject &packet)
  851. {
  852. /*
  853. PACKET_TYPE type = PacketAnalizer::GetPacketType(&packet);
  854. switch (type)
  855. {
  856. case PACKET_TYPE_RES:
  857. case PACKET_TYPE_NOTIFY:
  858. break;
  859. default:
  860. //log here??
  861. printf("Driver Thread:%d,ReceivedFromDevice.wrong packet type\n", GetCurrentThreadId());
  862. //mLog::FINFO("ReceivedFromDevice.wrong packet type");
  863. return false;
  864. break;
  865. }
  866. bool ret = true;
  867. //check destination & dispatch
  868. CMD_ECHO DispatchRet = DispatchPacket(packet);
  869. if (DispatchRet == CMD_ECHO_OK)
  870. {
  871. //log here
  872. //mLog::FINFO("Done Dispatch");
  873. return true;
  874. }
  875. else if (DispatchRet == CMD_ECHO_NG)//this proc
  876. {
  877. //this proc
  878. //mLog::FINFO("Local Dispatch");
  879. //dispatch to the process
  880. DispatchRet = DispatchToLocal(packet);
  881. if (DispatchRet == CMD_ECHO_OK)
  882. {
  883. return true;
  884. }
  885. //no client exist
  886. //mLog::FINFO("no client exist in Local");
  887. Ex_ResponseDeviceRes(packet);
  888. }
  889. else if (DispatchRet == CMD_ECHO_NOTARGET)
  890. {
  891. //failed send packet to target
  892. //mLog::FINFO("no client exist in Local");
  893. Ex_ResponseDeviceRes(packet);
  894. }
  895. else
  896. {
  897. //junky packet
  898. }
  899. */
  900. return false;
  901. }
  902. /*
  903. //request
  904. bool CDI::ReceivedFromClient(ResDataObject &packet)
  905. {
  906. assert(0); //没有从客户端交互的了
  907. return true;
  908. PACKET_TYPE type = PacketAnalizer::GetPacketType(&packet);
  909. switch (type)
  910. {
  911. case PACKET_TYPE_REQ:
  912. break;
  913. default:
  914. //log here??
  915. return false;
  916. break;
  917. }
  918. bool ret = true;
  919. UINT64 ProcId;
  920. UINT64 Addr;
  921. if (PacketAnalizer::GetPacketHandleProcId(&packet, ProcId, false) == true &&
  922. PacketAnalizer::GetPacketHandleAddr(&packet, Addr, false) == true)
  923. {
  924. if (g_ClientManager.FindClient(Addr) == false)
  925. {
  926. //log here
  927. //no client registed
  928. return false;
  929. }
  930. //check destination & dispatch
  931. CMD_ECHO DispatchRet = DispatchPacket(packet);
  932. if (DispatchRet == CMD_ECHO_OK)
  933. {
  934. //log here
  935. return true;
  936. }
  937. else if (DispatchRet == CMD_ECHO_NG)//this proc
  938. {
  939. //target is this proc
  940. //dispatch to the process
  941. DispatchRet = To_Local_RequestProcedure(packet);
  942. if (DispatchRet == CMD_ECHO_OK)
  943. {
  944. return true;
  945. }
  946. else if (DispatchRet == CMD_ECHO_NG)//access right NG
  947. {
  948. //权限不够
  949. Ex_ResponseClientReq(packet,RET_FAILED,"no access right");
  950. return true;//保持连线
  951. }
  952. //其他情况,全部返回失败,由客户端自行断开
  953. }
  954. else if (DispatchRet == CMD_ECHO_NOTARGET)
  955. {
  956. //failed send out packet
  957. //the target must be at outside of the process
  958. //just return false
  959. }
  960. else
  961. {
  962. //junky packet
  963. }
  964. }
  965. return false;
  966. }
  967. */
  968. /*
  969. bool CDI::RegistClient(UINT64 Address)
  970. {
  971. return g_ClientManager.RegistClient(Address);
  972. }
  973. bool CDI::UnRegistClient(UINT64 Address)
  974. {
  975. return g_ClientManager.UnRegistClient(Address);
  976. }*/
  977. bool CDI::Registhandle(void* Handle)
  978. {
  979. CcosDevFileHandle *pHandle = (CcosDevFileHandle *)Handle;
  980. bool ret = g_HandleManager.Registhandle(*pHandle);
  981. //mLog::FINFO("RegistHandle.Id:{$},Result:{$}", (UINT64)(*pHandle)[CCOS_PACKET_HANDLE_KEY], ret);
  982. return ret;
  983. }
  984. bool CDI::UnRegistHandle(UINT64 CrcCode)
  985. {
  986. //mLog::FINFO("UnRegistHandle Entry.Id:{$}", CrcCode);
  987. bool ret = g_HandleManager.UnRegistHandle(CrcCode);
  988. //mLog::FINFO("UnRegistHandle.Id:{$},Result:{$}", CrcCode, ret);
  989. return ret;
  990. }
  991. void CDI::UnLoadAll()
  992. {
  993. //printf("--------Exit System Entry--------\n");
  994. Thread_Lock();
  995. //printf("UnLoadAllDCS\n");
  996. //UnLoadAllDCS();
  997. //mLog::FINFO("UnLoadAllDrivers");
  998. //printf("UnLoadAllDrivers\n");
  999. g_DrvManager.UnloadDrivers();
  1000. //mLog::FINFO("UnLoadRootDriver");
  1001. //printf("UnloadRootDriver\n");
  1002. g_DrvManager.UnloadRootDriver();
  1003. //mLog::FINFO("StopDriverTree");
  1004. if (g_DrvTree.StopThread(100) == false)
  1005. {
  1006. //mLog::FINFO("StopDriverTree Used Terminate!!!!!!!!!!!!!!!");
  1007. //printf("StopDriverTree Used Terminate!!!!!!!!!!!!!!!\n");
  1008. }
  1009. ////mLog::FINFO("HandleManager.Clear");
  1010. //g_HandleManager.Clear();
  1011. //HandleManager没必要卸载,因为它保存的是本地设备的句柄,而本地设备在卸载后,
  1012. //会有统一的Close Notify发给Owner.
  1013. //mLog::FINFO("StopBusManager");
  1014. //printf("StopBusManager\n");
  1015. if (UnloadBusDrv() == false)
  1016. {
  1017. //mLog::FINFO("StopBusManagerThread Used Terminate!!!!!!!!!!!!!!!");
  1018. //printf("StopBusManagerThread Used Terminate!!!!!!!!!!!!!!!\n");
  1019. }
  1020. /*
  1021. //mLog::FINFO("UnRegistAllClient");
  1022. printf("UnRegistAllClient\n");
  1023. g_ClientManager.UnRegistAll();*/
  1024. //mLog::FINFO("Exit LogSystem");
  1025. //printf("ExitLoggerModule\n");
  1026. //ExitLoggerModule();
  1027. Thread_UnLock();
  1028. //printf("SetEventExit\n");
  1029. m_ExitHandle->SetEvent();
  1030. //printf("Clear Sharememory\n");
  1031. //Exit_Circle_SM_IF();
  1032. //printf("--------Exit System Exit--------\n");
  1033. }
  1034. //bool CDI::RegistThread(PVOID pCcosThread)
  1035. //{
  1036. // return true;
  1037. // //return g_PTManager.RegistThread(pCcosThread);
  1038. //}
  1039. //
  1040. //void CDI::UnRegistThread(DWORD Tid)
  1041. //{
  1042. // return;
  1043. // //BusUnRegistThread(Tid);//buss
  1044. // //CleanupForThread(Tid);//locks
  1045. // //g_PTManager.UnRegistThread(Tid);
  1046. //}
  1047. //bool CDI::GetThreadsLogger(DWORD Tid, PVOID &pLogger)
  1048. //{
  1049. // pLogger = g_PTManager.GetThreadLogger(Tid);
  1050. //
  1051. // return (pLogger != NULL);
  1052. //}
  1053. bool CDI::InitBusUnit()
  1054. {
  1055. if (m_prootClient == NULL)
  1056. {
  1057. m_prootClient = new BusUnitClient("CDI_BusUnit_rootClient");
  1058. //for test
  1059. CcosDevFileHandle Handle;
  1060. ((BusUnitClient*)m_prootClient)->GetFileHandle(Handle);
  1061. //mLog::FINFO("RootClient init Address:{$}", (UINT64)Handle.GetTarget()[CCOS_PACK_TARGET_ADDR]);
  1062. //printf("RootClient init Address:%I64u\n", (UINT64)Handle.GetTarget()[CCOS_PACK_TARGET_ADDR]);
  1063. if (((BusUnitClient*)m_prootClient)->Open((const char*)getRootpath(), ALL_ACCESS) >= RET_SUCCEED)
  1064. {
  1065. //for test
  1066. //mLog::FINFO("RootClient Open Succeed");
  1067. //printf("RootClient Open Succeed\n");
  1068. return true;
  1069. }
  1070. //for test
  1071. //mLog::FINFO("RootClient Open Failed");
  1072. //printf("RootClient Open Failed\n");
  1073. delete ((BusUnitClient*)m_prootClient);
  1074. m_prootClient = NULL;
  1075. }
  1076. return false;
  1077. }
  1078. bool CDI::WaitExit(DWORD timeout,bool Exit)
  1079. {
  1080. if (Exit)
  1081. {
  1082. ((BusUnitClient*)m_prootClient)->Close();
  1083. //do the Exit Job
  1084. //printf("UnLoadAll On Purpose\n");
  1085. //mLog::FINFO("UnLoadAll On Purpose ");
  1086. UnLoadAll();
  1087. //printf("UnLoadAll Finished\n");
  1088. usleep(100000);
  1089. return true;
  1090. }
  1091. std::shared_ptr<LinuxEvent> hand = ((BusUnitClient*)m_prootClient)->GetNotifyHandle();
  1092. DWORD wait = hand->Wait(timeout);
  1093. if (wait == WAIT_OBJECT_0)
  1094. {
  1095. //printf("WaitExit:Got Root Notify\n");
  1096. //update status
  1097. ResDataObject packet;
  1098. try {
  1099. //printf("Thread:%d,DrvTree Thread Loop\n", GetCurrentThreadId());
  1100. if (((BusUnitClient*)m_prootClient)->IsClosed() == true)
  1101. {
  1102. //printf("WaitExit:Try Open Root \n");
  1103. //mLog::FINFO("client handle is closed.Try Open Root");
  1104. //try once
  1105. if (((BusUnitClient*)m_prootClient)->Open((const char*)getRootpath(), ALL_ACCESS) == false)
  1106. {
  1107. //printf("Thread:%d,Open Failed\n", GetCurrentThreadId());
  1108. //mLog::FERROR("Thread:{$},Open root : {$} Failed.unloadall...\n", GetCurrentThreadId(), (const char*)getRootpath());
  1109. UnLoadAll();
  1110. return true;
  1111. }
  1112. //printf("WaitExit:Try Open Root Succeed\n");
  1113. }
  1114. //below is opened status
  1115. PACKET_CMD cmd;
  1116. do {
  1117. cmd = ((BusUnitClient*)m_prootClient)->ReadCmd(packet);
  1118. if (cmd == PACKET_CMD_UPDATE)
  1119. {
  1120. //printf("Got Root Update\n");
  1121. string key = PacketAnalizer::GetPacketKey(&packet);
  1122. if (key == "ExitFlag")
  1123. {
  1124. if (((BusUnitClient*)m_prootClient)->GetExitFlag())
  1125. {
  1126. ((BusUnitClient*)m_prootClient)->Close();
  1127. //do the Exit Job
  1128. //printf("Entering Exit Job\n");
  1129. //mLog::FINFO("ExitFlag is Set.Entering Exit Job\n");
  1130. UnLoadAll();
  1131. return true;
  1132. }
  1133. }
  1134. //ignore others
  1135. }
  1136. else
  1137. {
  1138. //ignore others
  1139. //printf("Thread:%d,DrvTree Thread Ignore\n", GetCurrentThreadId(), cmd);
  1140. }
  1141. } while (cmd != PACKET_CMD_NONE);
  1142. }
  1143. catch (...)
  1144. {
  1145. //printf("Thread:%d,Exeption in DrvTree Thread\n", GetCurrentThreadId());
  1146. }
  1147. return false;
  1148. }
  1149. //timeout no quit
  1150. return false;
  1151. }
  1152. void CDI::Ex_RequestRemoteClientClose(ResDataObject &Res)
  1153. {
  1154. try {
  1155. ResDataObject Req;
  1156. //send close notify
  1157. if (PacketAnalizer::MakeCloseRequestByRes(Res, Req))
  1158. {
  1159. DispatchPacket(Req);
  1160. }
  1161. }
  1162. catch (...)
  1163. {
  1164. }
  1165. }
  1166. void CDI::Ex_ResponseRemoteClientReq(ResDataObject &Req, RET_STATUS status, const char *pInfo)
  1167. {
  1168. try {
  1169. ResDataObject Res;
  1170. if (PacketAnalizer::MakeResponseByReq(Res, Req, status, pInfo))
  1171. {
  1172. DispatchPacket(Res);
  1173. }
  1174. //send close notify
  1175. }
  1176. catch (...)
  1177. {
  1178. }
  1179. }
  1180. void CDI::Ex_ResponseClientReq(ResDataObject &Req, RET_STATUS status, const char *pInfo)
  1181. {
  1182. try {
  1183. ResDataObject Res;
  1184. PacketAnalizer::MakeResponseByReq(Res, Req, status, pInfo);
  1185. CMD_ECHO ret = CMD_ECHO_OK;//To_Local_ResponseProcedure(Res);
  1186. if (ret == CMD_ECHO_OK)
  1187. {
  1188. //log here
  1189. }
  1190. }
  1191. catch (...)
  1192. {
  1193. }
  1194. }
  1195. void CDI::Ex_ResponseDeviceRes(ResDataObject &Res)
  1196. {
  1197. try {
  1198. //清除句柄
  1199. UINT64 Crc = 0;
  1200. PacketAnalizer::GetPacketHandleCrc(&Res, Crc);
  1201. g_HandleManager.UnRegistHandle(Crc);
  1202. }
  1203. catch (...)
  1204. {
  1205. }
  1206. }
  1207. void CDI::Ex_ResponseEbus(ResDataObject &packet)
  1208. {
  1209. //Req
  1210. //Res
  1211. }
  1212. /*
  1213. CMD_ECHO CDI::DispatchToLocal(ResDataObject &packet)
  1214. {
  1215. //match to this proc
  1216. //request:dispatch to device
  1217. //response:dispatch to client
  1218. //notify:dispatch to client
  1219. CMD_ECHO echo = CMD_ECHO_IGNORE;
  1220. //check req or res
  1221. PACKET_TYPE type = PacketAnalizer::GetPacketType(&packet);
  1222. switch (type)
  1223. {
  1224. case PACKET_TYPE_REQ:
  1225. echo = (To_Local_RequestProcedure(packet));
  1226. break;
  1227. case PACKET_TYPE_RES:
  1228. assert(0); //从eBus上不再会收到res,因为不会发req了,client的收发转到MQTT了
  1229. //echo = To_Local_ResponseProcedure(packet);
  1230. break;
  1231. case PACKET_TYPE_NOTIFY:
  1232. assert(0); //从eBus上不再会收到notify,notify的收发转到MQTT了
  1233. //echo = To_Local_NotifyProcedure(packet);
  1234. break;
  1235. default:
  1236. //log here??
  1237. break;
  1238. }
  1239. return echo;
  1240. }*/
  1241. /*
  1242. bool CDI::AddDPC(PVOID pMDPC, PVOID pDPC, ResDataObject &DrvConfig)
  1243. {
  1244. return g_DrvManager.LoadDPC((MultiDPC*)pMDPC, (DriverDPC*)pDPC, DrvConfig);
  1245. }
  1246. bool CDI::DelDPC(PVOID pMDPC, PVOID pDPC)
  1247. {
  1248. return g_DrvManager.UnLoadDPC((MultiDPC*)pMDPC, (DriverDPC*)pDPC);
  1249. }
  1250. */
  1251. CDI_C_API CDI *GetCommandDispathIF()
  1252. {
  1253. return &g_CDI;
  1254. }
  1255. /*
  1256. CDI_C_API bool InitClientEnv()
  1257. {
  1258. if (GetCommandDispathIF()->InitAs(CCOS_PROC_CLIENT, (UINT64)GetCurrentProcessId()))
  1259. {
  1260. return true;
  1261. }
  1262. return false;
  1263. }
  1264. CDI_C_API bool DestroyClientEnv()
  1265. {
  1266. GetCommandDispathIF()->UnLoadAll();
  1267. return true;
  1268. }
  1269. */
  1270. CDI_C_API CDInterface* GetCDI()
  1271. {
  1272. return &g_CDI;
  1273. }