HealthManagerFSM.cpp 61 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216
  1. #include "stdafx.h"
  2. #include <fstream>
  3. #include <string>
  4. #include <algorithm>
  5. #ifdef RVC_OS_WIN
  6. #include <io.h>
  7. #else
  8. #include <unistd.h>
  9. #include <fcntl.h>
  10. #include <errno.h>
  11. #endif
  12. #include "CommEntityUtil.hpp"
  13. #include "mod_healthmanager.h"
  14. #include "publicFunExport.h"
  15. using namespace std;
  16. const int MAX_AYSNC_TIMEOUT = 60000;
  17. const int MAX_IGNORE_TIMEOUT = 100;
  18. unsigned long long GetTickCountRVC() {
  19. #ifdef RVC_OS_WIN
  20. return GetTickCount64();
  21. #else
  22. struct timespec ts;
  23. clock_gettime(CLOCK_MONOTONIC, &ts);
  24. return (ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
  25. #endif //RVC_OS_WIN
  26. }
  27. unsigned long long GetLastErrorRVC() {
  28. #ifdef RVC_OS_WIN
  29. return GetLastError();
  30. #else
  31. return errno;
  32. #endif //RVC_OS_WIN
  33. }
  34. enum EntityOP
  35. {
  36. OP_STOP_ENTITY,
  37. OP_START_ENTITY,
  38. OP_PAUSE_ENTITY,
  39. OP_TERMINATE_ENTITY,
  40. OP_CONTINUE_ENTITY,
  41. };
  42. bool StrEqualNoCase(const char *s1, const char *s2,int len)
  43. {
  44. if (strlen(s1) != strlen(s2))
  45. return false;
  46. for (int i = 0; i < len; ++i)
  47. {
  48. if (toupper(s1[i]) != toupper(s2[i]))
  49. return false;
  50. }
  51. return true;
  52. }
  53. ErrorCodeEnum CHealthManagerFSM::OnInit(void)
  54. {
  55. m_hMD5OKEvt = CreateEventA(NULL, FALSE, FALSE, NULL);
  56. if (m_hMD5OKEvt == NULL)
  57. {
  58. Dbg("CreateEvent failed(%d).", GetLastErrorRVC());
  59. }
  60. return Initial();
  61. }
  62. ErrorCodeEnum CHealthManagerFSM::OnExit(void)
  63. {
  64. return Error_Succeed;
  65. }
  66. void CHealthManagerFSM::s0_on_entry(void)
  67. {
  68. LOG_FUNCTION();
  69. m_fsmState = HM_FSM_INIT;
  70. }
  71. void CHealthManagerFSM::s0_on_exit(void)
  72. {
  73. }
  74. unsigned int CHealthManagerFSM::s0_on_event(FSMEvent* pEvt)
  75. {
  76. LOG_FUNCTION();
  77. int ret = 0;
  78. switch(pEvt->iEvt)
  79. {
  80. case USER_EVT_WAIT_DEAMON_FINISHED:
  81. ret = pEvt->param1;
  82. pEvt->SetHandled();
  83. break;
  84. default:
  85. break;
  86. }
  87. return ret;
  88. }
  89. /** move here from s1_on_entry [Gifur@2021521]*/
  90. static inline bool IsCoolBootThisTime()
  91. {
  92. //oilyang@20190924
  93. //修改为判断冷热启动,热重启不再等待10s
  94. //系统启动小于3分钟,认为是冷启动
  95. const ULONGLONG dwElapse = GetTickCountRVC();
  96. Dbg("have elapsed %d seconds from system start", dwElapse / 1000);
  97. if (dwElapse < 1000 * 60 * 3) {
  98. return true;
  99. }
  100. return false;
  101. }
  102. //CoreBoot
  103. void CHealthManagerFSM::s1_on_entry()
  104. {
  105. m_fsmState = HM_FSM_STATE_COREBOOT;
  106. if (IsCoolBootThisTime()) {
  107. GetEntityBase()->GetFunction()->ShowStartupInfo("正在初始化,请稍等片刻......");
  108. Sleep(10000);
  109. }
  110. ErrorCodeEnum eErrCode;
  111. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","B");
  112. if (eErrCode != Error_Succeed)
  113. {
  114. Dbg("set RunState B failed (%d).",eErrCode);
  115. }
  116. //CoreBootTask* pTask = new CoreBootTask(this);
  117. //GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  118. LOG_FUNCTION();
  119. bool bWatchDog = false,bAsync = false;
  120. m_eStage = LOADSTAGE_COREBOOT;
  121. int ret = 0;
  122. map<CSimpleStringA,EntityLoadInfo>::iterator it;
  123. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  124. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  125. //start entity
  126. vector<CSimpleStringA>::iterator vIt;
  127. if (m_coreBootOpt.size() == 0)
  128. goto COREBOOT_FINISH;
  129. char startMsg[128];
  130. for (vIt = m_vCoreBoot.begin(); vIt != m_vCoreBoot.end(); ++ vIt)
  131. //for (it = m_coreBootOpt.begin();it != m_coreBootOpt.end(); ++it)
  132. {
  133. CSmartPointer<IAsynWaitSp> spWait;//oilyang 20160325 see the following comment
  134. it = m_coreBootOpt.find(*vIt);
  135. if (it == m_coreBootOpt.end())
  136. {
  137. Dbg("cannot find %s",(LPCSTR)*vIt);
  138. continue;
  139. }
  140. Dbg("start,%s,%d",(LPCSTR)it->first,it->second.loadOpt);
  141. CEntityRunInfo entRunInfo;
  142. ErrorCodeEnum errCode = pFunc->GetEntityRunInfo(it->first,entRunInfo);
  143. if (errCode == Error_Succeed && entRunInfo.eState == EntityState_Idle)
  144. {
  145. it->second.eResult = LOADING_SUCCEED;
  146. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  147. if (ret == 0 || ret == 2)
  148. goto COREBOOT_FINISH;
  149. else
  150. continue;
  151. }
  152. ZeroMemory(startMsg, 128);
  153. sprintf(startMsg, "正在启动实体%s...", it->first.GetData());
  154. GetEntityBase()->GetFunction()->ShowStartupInfo(startMsg);
  155. switch(it->second.loadOpt)
  156. {
  157. case LOADOPT_IGNORE:
  158. {
  159. pFuncPrivilege->StartEntity(it->first,NULL,spWait);
  160. if (spWait != NULL)
  161. spWait->WaitAnswer(MAX_IGNORE_TIMEOUT);//oilyang 20160325 the null pointer
  162. it->second.eResult = LOADING_SUCCEED;
  163. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  164. if (ret == 0 || ret == 2)
  165. goto COREBOOT_FINISH;
  166. }
  167. break;
  168. case LOADOPT_ASYNC_VERIFY:
  169. errCode = AsyncStartEntity(it->first,NULL,NULL);
  170. Dbg("%d",errCode);
  171. bAsync = true;
  172. break;
  173. case LOADOPT_SYNC_VERIFY:
  174. {
  175. pFuncPrivilege->StartEntity(it->first,NULL,spWait);
  176. if (spWait != NULL)
  177. errCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  178. Dbg("(coreboot)sync...%d",errCode);
  179. if (errCode == Error_Succeed)
  180. it->second.eResult = LOADING_SUCCEED;
  181. else if (errCode == Error_TimeOut)
  182. it->second.eResult = LOADING_TIMEOUT;
  183. else
  184. it->second.eResult = LOADING_FAILED;
  185. if (_strnicmp(it->first,"WatchDog",strlen("WatchDog")) == 0
  186. && it->second.eResult == LOADING_SUCCEED)
  187. bWatchDog = true;
  188. if (errCode != Error_Succeed) {
  189. ShowEntityBootFailedAtFront(it->first, errCode);
  190. return;
  191. }
  192. else
  193. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  194. Dbg("s1 check ret %d",ret);
  195. if (ret == 0 || ret == 2)
  196. goto COREBOOT_FINISH;
  197. }
  198. break;
  199. default:
  200. break;
  201. }
  202. }
  203. COREBOOT_FINISH:
  204. //start watchdog if have load it sucessfully
  205. if (bWatchDog)
  206. {
  207. /**TODO(Gifur@5/21/2021): 国产化容易出现卡死现象,找个时间点把看门狗的逻辑加上去 */
  208. }
  209. if (!bAsync)
  210. {
  211. FSMEvent *e = new FSMEvent(USER_EVT_COREBOOT_FINISHED);
  212. e->param1 = ret;
  213. PostEventFIFO(e);
  214. }
  215. else
  216. {
  217. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  218. if (ret == 0 || ret == 2)
  219. {
  220. FSMEvent *e = new FSMEvent(USER_EVT_COREBOOT_FINISHED);
  221. e->param1 = ret;
  222. PostEventFIFO(e);
  223. }
  224. }
  225. return;
  226. }
  227. void CHealthManagerFSM::s1_on_exit()
  228. {
  229. LOG_FUNCTION();
  230. }
  231. unsigned int CHealthManagerFSM::s1_on_event(FSMEvent* pEvt)
  232. {
  233. LOG_FUNCTION();
  234. Dbg("s1 evt %d",pEvt->iEvt);
  235. switch(pEvt->iEvt)
  236. {
  237. case USER_EVT_COREBOOT_FINISHED:
  238. pEvt->SetHandled();
  239. if (pEvt->param1 == 2) {
  240. ShowEntityBootFailedAtFront(m_csErrEntity, Error_InvalidState);
  241. }
  242. return pEvt->param1;
  243. break;
  244. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  245. pEvt->SetHandled();
  246. break;
  247. default:
  248. break;
  249. }
  250. return 0;
  251. }
  252. //SafeLoad
  253. void CHealthManagerFSM::s2_on_entry()
  254. {
  255. m_fsmState = HM_FSM_STATE_SAFELOAD;
  256. Sleep(1000);
  257. USBControl();//open usb port oilyang 20150526
  258. ErrorCodeEnum eErrCode;
  259. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","S");
  260. if (eErrCode != Error_Succeed)
  261. {
  262. Dbg("set RunState S failed (%d).",eErrCode);
  263. }
  264. // SafeLoadTask *pTask = new SafeLoadTask(this);
  265. // GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  266. LOG_FUNCTION();
  267. //MessageBoxA(0,0,0,0);
  268. bool bAsync = false;
  269. m_eStage = LOADSTAGE_SAFELOAD;
  270. int ret = 0;
  271. map<CSimpleStringA,EntityLoadInfo>::iterator it;
  272. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  273. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  274. ErrorCodeEnum errCode;
  275. vector<CSimpleStringA>::iterator vIt;
  276. if (m_safeLoadOpt.size() == 0)
  277. goto SAFELOAD_FINISH;
  278. char startMsg[128];
  279. for (vIt = m_vSafeLoad.begin(); vIt != m_vSafeLoad.end(); ++vIt)
  280. //for (it = m_safeLoadOpt.begin();it != m_safeLoadOpt.end(); ++it)
  281. {
  282. CSmartPointer<IAsynWaitSp> spWait;
  283. it = m_safeLoadOpt.find(*vIt);
  284. //Dbg("s %s,%d",(LPCTSTR)it->first,it->second.loadOpt);
  285. if (it == m_safeLoadOpt.end())
  286. {
  287. Dbg("cannot find %s",(LPCSTR)*vIt);
  288. continue;
  289. }
  290. CEntityRunInfo entRunInfo;
  291. errCode = pFunc->GetEntityRunInfo(it->first,entRunInfo);
  292. if (errCode == Error_Succeed && entRunInfo.eState == EntityState_Idle)
  293. {
  294. it->second.eResult = LOADING_SUCCEED;
  295. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  296. if (ret == 0 || ret == 2)
  297. goto SAFELOAD_FINISH;
  298. else
  299. continue;
  300. }
  301. Dbg("start %s,%d",(LPCTSTR)it->first,it->second.loadOpt);
  302. ZeroMemory(startMsg, 128);
  303. sprintf(startMsg, "正在启动实体%s...", it->first.GetData());
  304. GetEntityBase()->GetFunction()->ShowStartupInfo(startMsg);
  305. switch(it->second.loadOpt)
  306. {
  307. case LOADOPT_IGNORE:
  308. {
  309. pFuncPrivilege->StartEntity(it->first,NULL,spWait);
  310. if (spWait != NULL)
  311. spWait->WaitAnswer(MAX_IGNORE_TIMEOUT);
  312. it->second.eResult = LOADING_SUCCEED;
  313. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  314. if (ret == 0 || ret == 2)
  315. goto SAFELOAD_FINISH;
  316. }
  317. break;
  318. case LOADOPT_ASYNC_VERIFY:
  319. AsyncStartEntity(it->first,NULL,NULL);
  320. bAsync = true;
  321. break;
  322. case LOADOPT_SYNC_VERIFY:
  323. {
  324. pFuncPrivilege->StartEntity(it->first,NULL,spWait);
  325. if (spWait != NULL)
  326. errCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  327. Dbg("sync...%d",eErrCode);
  328. if (errCode == Error_Succeed) {
  329. it->second.eResult = LOADING_SUCCEED;
  330. #if defined(RVC_OS_WIN)
  331. if (StrEqualNoCase("MaintainWatcher", it->first, strlen("MaintainWatcher"))) {
  332. Sleep(10000);
  333. if (m_custMngerState == CM_ENTER) {
  334. Dbg("enter CMS...");
  335. FSMEvent* pEvt = new FSMEvent(USER_EVT_ENTER_CUSTOMER_MANAGER);
  336. PostEventFIFO(pEvt);
  337. goto SAFELOAD_END;
  338. }
  339. }
  340. #endif //RVC_OS_WIN
  341. }
  342. else if (errCode == Error_TimeOut)
  343. it->second.eResult = LOADING_TIMEOUT;
  344. else
  345. it->second.eResult = LOADING_FAILED;
  346. if (it->second.eResult != Error_Succeed)
  347. {
  348. char tmp[64] = {0};
  349. sprintf(tmp,"实体 %s 启动失败",it->first.GetData());
  350. //GetEntityBase()->GetFunction()->ShowFatalError(tmp);
  351. Dbg("%s",tmp);
  352. }
  353. if (errCode != Error_Succeed) {
  354. ShowEntityBootFailedAtFront(it->first, errCode);
  355. return;
  356. }
  357. else
  358. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  359. if (ret == 0 || ret == 2)
  360. goto SAFELOAD_FINISH;
  361. }
  362. break;
  363. default:
  364. break;
  365. }
  366. }
  367. SAFELOAD_FINISH:
  368. if (!bAsync)
  369. {
  370. FSMEvent *e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
  371. e->param1 = ret;
  372. PostEventFIFO(e);
  373. }
  374. else
  375. {
  376. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  377. Dbg("s2 %d",ret);
  378. if (ret == 0 || ret == 2)
  379. {
  380. FSMEvent *e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
  381. e->param1 = ret;
  382. PostEventFIFO(e);
  383. }
  384. }
  385. SAFELOAD_END:
  386. return ;
  387. }
  388. void CHealthManagerFSM::s2_on_exit()
  389. {
  390. LOG_FUNCTION();
  391. }
  392. unsigned int CHealthManagerFSM::s2_on_event(FSMEvent* pEvt)
  393. {
  394. LOG_FUNCTION();
  395. int ret = 0;
  396. Dbg("s2 event %d,%d",pEvt->iEvt,pEvt->param1);
  397. switch(pEvt->iEvt)
  398. {
  399. case USER_EVT_SAFELOAD_FINISHED:
  400. {
  401. pEvt->SetHandled();
  402. //ToCheckUPS();
  403. //oiltmp
  404. //according to the system varible TerminalState to do sth.
  405. //Configed
  406. //Breakdown
  407. //Blocking
  408. //Authentication
  409. {
  410. if(pEvt->param1 == 0)
  411. {
  412. //initializer if configured
  413. CSimpleStringA csTermStage("");
  414. ErrorCodeEnum eErrCode;
  415. eErrCode = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage",csTermStage);
  416. Dbg("after safeload to get termstage %s",(LPCTSTR)csTermStage);
  417. //comment this by oilyang 20141018
  418. //if (csTermStage == "B" || csTermStage == "D" || csTermStage == "N")
  419. if (csTermStage == "B" || csTermStage == "N")
  420. return 1;
  421. }
  422. else if (pEvt->param1 == 2)
  423. {
  424. ShowEntityBootFailedAtFront(m_csErrEntity, Error_InvalidState);
  425. ret = 2;
  426. }
  427. }
  428. //Unsubscrible
  429. }
  430. break;
  431. case USER_EVT_SAFELOAD_EXMINE_FINISHED:
  432. if (pEvt->param1 == 0)
  433. ret = 0;
  434. //do something else oiltmp
  435. pEvt->SetHandled();
  436. break;
  437. case USER_EVT_ACCESSAUTH_FINISHED:
  438. pEvt->SetHandled();
  439. ret = pEvt->param1;
  440. break;
  441. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  442. pEvt->SetHandled();
  443. break;
  444. default:
  445. break;
  446. }
  447. return ret;
  448. }
  449. //Operating
  450. void CHealthManagerFSM::s3_on_entry()
  451. {
  452. m_fsmState = HM_FSM_STATE_OP;
  453. #if defined(RVC_OS_WIN)
  454. Sleep(5000);//oilyang for nantian pinpad 20150703
  455. #endif //RVC_OS_WIN
  456. if (m_custMngerState == CM_ENTER)
  457. {
  458. Dbg("in CMS,no need to start hardware.");
  459. return;
  460. }
  461. ErrorCodeEnum eErrCode;
  462. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","O");
  463. if (eErrCode != Error_Succeed)
  464. {
  465. Dbg("set RunState O failed (%d).",eErrCode);
  466. }
  467. // OpLoadTask *pTask = new OpLoadTask(this);
  468. // GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  469. LOG_FUNCTION();
  470. bool bAsync = false;
  471. m_eStage = LOADSTAGE_OPERATING;
  472. int ret = 0;
  473. map<CSimpleStringA,EntityLoadInfo>::iterator it;
  474. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  475. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  476. //start entity
  477. ErrorCodeEnum errCode;
  478. vector<CSimpleStringA>::iterator vIt;
  479. if (m_operatingOpt.size() == 0)
  480. goto OPERATING_FINISH;
  481. char startMsg[128];
  482. for (vIt = m_vOperating.begin(); vIt != m_vOperating.end(); ++vIt)
  483. //for (it = m_operatingOpt.begin();it != m_operatingOpt.end(); ++it)
  484. {
  485. CSmartPointer<IAsynWaitSp> spWait;
  486. it = m_operatingOpt.find(*vIt);
  487. if (it == m_operatingOpt.end())
  488. {
  489. Dbg("cannot find %s",(LPCSTR)*vIt);
  490. continue;
  491. }
  492. CEntityRunInfo entRunInfo;
  493. errCode = pFunc->GetEntityRunInfo(it->first,entRunInfo);
  494. if (errCode == Error_Succeed && entRunInfo.eState == EntityState_Idle)
  495. {
  496. it->second.eResult = LOADING_SUCCEED;
  497. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  498. if (ret == 0 || ret == 2)
  499. goto OPERATING_FINISH;
  500. else
  501. continue;
  502. }
  503. Dbg("op start %s,%d",(LPCTSTR)it->first,it->second.loadOpt);
  504. ZeroMemory(startMsg, 128);
  505. sprintf(startMsg, "正在启动实体%s...", it->first.GetData());
  506. GetEntityBase()->GetFunction()->ShowStartupInfo(startMsg);
  507. switch(it->second.loadOpt)
  508. {
  509. case LOADOPT_IGNORE:
  510. {
  511. pFuncPrivilege->StartEntity(it->first,NULL,spWait);
  512. if (spWait != NULL)
  513. spWait->WaitAnswer(MAX_IGNORE_TIMEOUT);
  514. it->second.eResult = LOADING_SUCCEED;
  515. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  516. if (ret == 0 || ret == 2)
  517. goto OPERATING_FINISH;
  518. }
  519. break;
  520. case LOADOPT_ASYNC_VERIFY:
  521. errCode = AsyncStartEntity(it->first,NULL,NULL);
  522. bAsync = true;
  523. break;
  524. case LOADOPT_SYNC_VERIFY:
  525. {
  526. errCode = pFuncPrivilege->StartEntity(it->first,NULL,spWait);
  527. if (errCode == Error_Succeed)
  528. {
  529. if (spWait != NULL)
  530. errCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  531. }
  532. else
  533. {
  534. Dbg("StartEntity %s failed(%d).",(LPCSTR)it->first,errCode);
  535. break;
  536. }
  537. if (errCode == Error_Succeed)
  538. it->second.eResult = LOADING_SUCCEED;
  539. else if (errCode == Error_TimeOut)
  540. it->second.eResult = LOADING_TIMEOUT;
  541. else
  542. it->second.eResult = LOADING_FAILED;
  543. if (it->second.eResult != Error_Succeed)
  544. {
  545. char tmp[64] = {0};
  546. sprintf(tmp, "实体 %s 启动失败", it->first.GetData());
  547. //GetEntityBase()->GetFunction()->ShowFatalError(tmp);
  548. Dbg("%s", tmp);
  549. }
  550. if (errCode != Error_Succeed) {
  551. ShowEntityBootFailedAtFront(it->first, errCode);
  552. return;
  553. }
  554. else
  555. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  556. if (ret == 0 || ret == 2)
  557. goto OPERATING_FINISH;
  558. }
  559. break;
  560. default:
  561. break;
  562. }
  563. }
  564. OPERATING_FINISH:
  565. Dbg("s3 ret %d",ret);
  566. if (!bAsync)
  567. {
  568. FSMEvent *e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
  569. e->param1 = ret;
  570. PostEventFIFO(e);
  571. }
  572. else
  573. {
  574. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  575. if (ret == 0 || ret == 2)
  576. {
  577. FSMEvent *e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
  578. e->param1 = ret;
  579. PostEventFIFO(e);
  580. }
  581. }
  582. return ;
  583. }
  584. void CHealthManagerFSM::s3_on_exit()
  585. {
  586. LOG_FUNCTION();
  587. }
  588. unsigned int CHealthManagerFSM::s3_on_event(FSMEvent* pEvt)
  589. {
  590. LOG_FUNCTION();
  591. Dbg("s3(Operating) event %d,%d",pEvt->iEvt,pEvt->param1);
  592. int ret = 0;
  593. switch(pEvt->iEvt)
  594. {
  595. case USER_EVT_OPERATING_FINISHED:
  596. ret = pEvt->param1;
  597. if (ret == 2) {
  598. ShowEntityBootFailedAtFront(m_csErrEntity, Error_InvalidState);
  599. }
  600. pEvt->SetHandled();
  601. break;
  602. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  603. pEvt->SetHandled();
  604. break;
  605. default:
  606. break;
  607. }
  608. return ret;
  609. }
  610. //Idle(Operating finished)
  611. void CHealthManagerFSM::s4_on_entry()
  612. {
  613. m_fsmState = HM_FSM_STATE_IDLE;
  614. LOG_FUNCTION();
  615. //oiltmp need to summary info
  616. char buf[256];
  617. memset(buf,0, sizeof(buf));
  618. sprintf(buf, "ver:%s", m_sysInfo.InstallVersion.ToString().GetData());
  619. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_HEALTH_UPLOAD_INFO_ABOUT_TERM, buf);
  620. m_accessAuthCheckMD5 = 0;
  621. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  622. CSmartPointer<IConfigInfo> spConfig, spCerConfig;
  623. ErrorCodeEnum eErrCer = spEntityFunction->OpenConfig(Config_CenterSetting, spCerConfig);
  624. if (eErrCer != Error_Succeed) {
  625. Dbg("open central cfg file failed!");
  626. }
  627. else
  628. spCerConfig->ReadConfigValueInt("AccessAuthorization", "CheckMD5", m_accessAuthCheckMD5);
  629. Dbg("before access auth,read MD5 flag:%d",m_accessAuthCheckMD5);
  630. if (!m_bIdleToMaintain)
  631. {
  632. AccessAuthTask *pTask = new AccessAuthTask(this);
  633. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  634. }
  635. else
  636. m_bIdleToMaintain = false;
  637. }
  638. void CHealthManagerFSM::s4_on_exit()
  639. {
  640. LOG_FUNCTION();
  641. }
  642. unsigned int CHealthManagerFSM::s4_on_event(FSMEvent* pEvt)
  643. {
  644. LOG_FUNCTION();
  645. Dbg("s4 event %d,%d",pEvt->iEvt,pEvt->param1);
  646. switch(pEvt->iEvt)
  647. {
  648. case USER_EVT_ACCESSAUTH_FINISHED:
  649. {
  650. pEvt->SetHandled();
  651. if (pEvt->param1 == 1)
  652. {
  653. //why to do this???
  654. //LogEvent(Severity_Middle,EVENT_CONSOLE_REQ_RESTART_SHELL,"AccessAuth failed,to restart spshell.");
  655. return 1;
  656. }
  657. ToLogWarnTermAboutInfo();
  658. CSimpleStringA csTermStage;
  659. ErrorCodeEnum eErrCode;
  660. eErrCode = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage",csTermStage);
  661. Dbg("after accessauth to get termstage %s",(LPCTSTR)csTermStage);
  662. //oilyang@20170316@comment
  663. //for user desktop,start iebrowser no matter what TerminalStage is.
  664. //if (csTermStage[0] != 'A')
  665. // break;
  666. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","O");
  667. if (eErrCode != Error_Succeed)
  668. {
  669. Dbg("set RunState O failed (%d).",eErrCode);
  670. }
  671. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  672. CSmartPointer<IConfigInfo> spConfigRun,spCerConfig;
  673. ErrorCodeEnum eErrIE = spEntityFunction->OpenConfig(Config_Run, spConfigRun);
  674. if (eErrIE != Error_Succeed) {
  675. Dbg("open cfg file(ie) failed!");
  676. //return err;
  677. }
  678. ErrorCodeEnum eErrCerUrl = spEntityFunction->OpenConfig(Config_CenterSetting, spCerConfig);
  679. if (eErrCerUrl != Error_Succeed) {
  680. Dbg("open central cfg file(ie) failed!");
  681. }
  682. //if load successfully,set FailTimes to 0
  683. spConfigRun->WriteConfigValueInt("Run","FailTimes",0);
  684. if (m_bAccessAuth)
  685. {
  686. m_checkCode = QueryCheckCode();
  687. if (m_checkCode.GetLength() > 1)
  688. m_bEverAuthSucWithDevice = true;
  689. else
  690. m_bEverAuthSucWithDevice = false;
  691. }
  692. else
  693. {
  694. AuthStatus as;
  695. if (m_bEverAuthSucWithDevice)
  696. {
  697. as.result = 1;
  698. as.msg = "设备混用,请接入对应设备或后台重新绑定当前设备";
  699. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(AuthStatus), SP_MSG_SIG_OF(AuthStatus), as);
  700. }
  701. else
  702. {
  703. as.result = 11;
  704. as.msg = "请检查设备是否正常初始化或是否对应绑定设备";
  705. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(AuthStatus), SP_MSG_SIG_OF(AuthStatus), as);
  706. }
  707. }
  708. m_strURLValue = "";
  709. #ifdef RVC_OS_WIN
  710. eErrCerUrl = spCerConfig->ReadConfigValue(GetEntityBase()->GetEntityName(), m_strURL, m_strURLValue);
  711. if (eErrIE == Error_Succeed)
  712. {
  713. Dbg("write ie url.sys [%s]", (const char*)m_strURLValue);
  714. GetEntityBase()->GetFunction()->SetSysVar("IEUrl", m_strURLValue);
  715. }
  716. CSmartPointer<IAsynWaitSp> spWait;
  717. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = spEntityFunction.ConvertCase<IEntityFunctionPrivilege>();
  718. CEntityRunInfo acInfo;
  719. eErrCode = spEntityFunction->GetEntityRunInfo("IEBrowser",acInfo);
  720. if (eErrCode == Error_Succeed && acInfo.eState == EntityState_NoStart)
  721. {
  722. GetEntityBase()->GetFunction()->ShowStartupInfo("正在启动实体IEBrowser...");
  723. eErrIE = pFuncPrivilege->StartEntity("IEBrowser", m_strURLValue, spWait);
  724. if (eErrIE == Error_Succeed)
  725. {
  726. if (spWait != NULL)
  727. eErrIE = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  728. }
  729. else
  730. {
  731. Dbg("Start IEBrowser failed(%d).",eErrIE);
  732. }
  733. }
  734. else if (eErrCode == Error_Succeed && acInfo.eState == EntityState_Idle)
  735. {//if IEBrowser start before healthmanager,we suppose healthmanager is restart unexpectly,then set m_bEnterMainPageEver true
  736. m_bIEBeforeHealth = true;
  737. }
  738. #endif //RVC_OS_WIN
  739. if (!m_bAccessAuth)
  740. PostProcessAfterUpgrade();
  741. }
  742. break;
  743. case USER_EVT_MAITAIN:
  744. Dbg("to maintain...");
  745. m_stateBeforeMaintain = m_fsmState;
  746. m_bIdleToMaintain = true;
  747. pEvt->SetHandled();
  748. break;
  749. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  750. pEvt->SetHandled();
  751. break;
  752. default:
  753. break;
  754. }
  755. return 0;
  756. }
  757. //Fault
  758. void CHealthManagerFSM::s5_on_entry()
  759. {
  760. LOG_FUNCTION();
  761. ToLogWarnTermAboutInfo();
  762. m_fsmState = HM_FSM_STATE_FAULT;
  763. CSmartPointer<IConfigInfo> spConfig,spConfigRun;
  764. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Software, spConfig);
  765. eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  766. int failTimes = 0,maxFailTimes = 3;
  767. spConfig->ReadConfigValueInt("Run","MaxFailTimes",maxFailTimes);
  768. spConfigRun->ReadConfigValueInt("Run","FailTimes",failTimes);
  769. failTimes++;
  770. if (failTimes > maxFailTimes)
  771. {
  772. LogEvent(Severity_Middle,LOG_EVT_HEADLIGHT_RED_ON,"设备故障");
  773. LogWarn(Severity_Middle,Error_Unexpect,LOG_ERR_HEALTH_FAILED,"HealthManager failed.");
  774. eErr = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage","D");
  775. if (eErr != Error_Succeed)
  776. Dbg("set termstage D failed (%d).",eErr);
  777. else
  778. Dbg("Set TerminalStage D.");
  779. }
  780. else
  781. {
  782. Dbg("have failed %d times.",failTimes);
  783. spConfigRun->WriteConfigValueInt("Run","FailTimes",failTimes);
  784. eErr = GetEntityBase()->GetFunction()->SetSysVar("RunState","F");
  785. if (eErr != Error_Succeed)
  786. {
  787. Dbg("set RunState failed (%d).",eErr);
  788. }
  789. }
  790. PostProcessAfterUpgrade();
  791. }
  792. void CHealthManagerFSM::s5_on_exit()
  793. {
  794. LOG_FUNCTION();
  795. }
  796. unsigned int CHealthManagerFSM::s5_on_event(FSMEvent* pEvt)
  797. {
  798. LOG_FUNCTION();
  799. Dbg("s5(Fault) event %d,%d",pEvt->iEvt,pEvt->param1);
  800. switch(pEvt->iEvt)
  801. {
  802. case USER_EVT_MAITAIN:
  803. Dbg("to maintain...");
  804. m_stateBeforeMaintain = m_fsmState;
  805. pEvt->SetHandled();
  806. break;
  807. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  808. pEvt->SetHandled();
  809. break;
  810. default:
  811. break;
  812. }
  813. return 0;
  814. }
  815. //Maintaining
  816. void CHealthManagerFSM::s6_on_entry()
  817. {
  818. LOG_FUNCTION();
  819. m_preFsmState = m_fsmState;
  820. m_fsmState = HM_FSM_STATE_MAINTAINING;
  821. ErrorCodeEnum eErrCode;
  822. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","M");
  823. if (eErrCode != Error_Succeed)
  824. {
  825. Dbg("set RunState M failed (%d).",eErrCode);
  826. }
  827. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  828. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  829. if (pFuncPrivilege == NULL)
  830. {
  831. Dbg("display screen NoPrivilege");
  832. return;
  833. }
  834. ErrorCodeEnum eErr = pFuncPrivilege->DisplayBlueScreen("暂停服务");
  835. Dbg("display blue screen %d",eErr);
  836. }
  837. void CHealthManagerFSM::s6_on_exit()
  838. {
  839. LOG_FUNCTION();
  840. }
  841. unsigned int CHealthManagerFSM::s6_on_event(FSMEvent* pEvt)
  842. {
  843. LOG_FUNCTION();
  844. int ret = 0;
  845. switch(pEvt->iEvt)
  846. {
  847. case USER_EVT_MAITAIN_FINISHED:
  848. pEvt->SetHandled();
  849. {
  850. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  851. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  852. if (pFuncPrivilege == NULL)
  853. {
  854. Dbg("un-display screen NoPrivilege");
  855. return 1;
  856. }
  857. ErrorCodeEnum eErr = pFuncPrivilege->UndisplayBlueScreen();
  858. Dbg("un-display blue screen %d",eErr);
  859. if (m_stateBeforeMaintain == HM_FSM_STATE_IDLE)
  860. {
  861. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->SetSysVar("RunState","O");
  862. if (eErr != Error_Succeed)
  863. {
  864. Dbg("set RunState O failed (%d).",eErr);
  865. }
  866. }
  867. ret = m_preFsmState;
  868. }
  869. break;
  870. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  871. pEvt->SetHandled();
  872. break;
  873. default:
  874. break;
  875. }
  876. return ret;
  877. }
  878. //PrepareOff
  879. void CHealthManagerFSM::s7_on_entry()
  880. {
  881. LOG_FUNCTION();
  882. m_fsmState = HM_FSM_STATE_PREPAREOFF;
  883. ErrorCodeEnum eErrCode;
  884. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","P");
  885. if (eErrCode != Error_Succeed)
  886. {
  887. Dbg("set RunState P failed (%d).",eErrCode);
  888. }
  889. }
  890. void CHealthManagerFSM::s7_on_exit()
  891. {
  892. LOG_FUNCTION();
  893. }
  894. unsigned int CHealthManagerFSM::s7_on_event(FSMEvent* pEvt)
  895. {
  896. LOG_FUNCTION();
  897. Dbg("s7(PrepareOff) event %d",pEvt->iEvt);
  898. switch(pEvt->iEvt)
  899. {
  900. case USER_EVT_MAITAIN:
  901. Dbg("to maintain...");
  902. m_stateBeforeMaintain = m_fsmState;
  903. pEvt->SetHandled();
  904. break;
  905. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  906. pEvt->SetHandled();
  907. break;
  908. default:
  909. break;
  910. }
  911. return 0;
  912. }
  913. //Terminating
  914. void CHealthManagerFSM::s8_on_entry()
  915. {
  916. LOG_FUNCTION();
  917. m_fsmState = HM_FSM_STATE_TERMINATING;
  918. ErrorCodeEnum eErrCode;
  919. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","T");
  920. if (eErrCode != Error_Succeed)
  921. {
  922. Dbg("set RunState T failed (%d).",eErrCode);
  923. }
  924. }
  925. void CHealthManagerFSM::s8_on_exit()
  926. {
  927. LOG_FUNCTION();
  928. }
  929. unsigned int CHealthManagerFSM::s8_on_event(FSMEvent* pEvt)
  930. {
  931. LOG_FUNCTION();
  932. Dbg("s8(Terminating) event %d",pEvt->iEvt);
  933. switch(pEvt->iEvt)
  934. {
  935. case USER_EVT_MAITAIN:
  936. Dbg("to maintain...");
  937. m_stateBeforeMaintain = m_fsmState;
  938. pEvt->SetHandled();
  939. break;
  940. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  941. pEvt->SetHandled();
  942. break;
  943. default:
  944. break;
  945. }
  946. return 0;
  947. }
  948. //Exitting
  949. void CHealthManagerFSM::s9_on_entry()
  950. {
  951. LOG_FUNCTION();
  952. m_fsmState = HM_FSM_STATE_EXITTING;
  953. ErrorCodeEnum eErrCode;
  954. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","E");
  955. if (eErrCode != Error_Succeed)
  956. {
  957. Dbg("set RunState E failed (%d).",eErrCode);
  958. }
  959. }
  960. void CHealthManagerFSM::s9_on_exit()
  961. {
  962. LOG_FUNCTION();
  963. }
  964. unsigned int CHealthManagerFSM::s9_on_event(FSMEvent* pEvt)
  965. {
  966. LOG_FUNCTION();
  967. Dbg("s9(Exitting) event %d",pEvt->iEvt);
  968. switch(pEvt->iEvt)
  969. {
  970. case USER_EVT_MAITAIN:
  971. Dbg("to maintain...");
  972. m_stateBeforeMaintain = m_fsmState;
  973. pEvt->SetHandled();
  974. break;
  975. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  976. pEvt->SetHandled();
  977. break;
  978. default:
  979. break;
  980. }
  981. return 0;
  982. }
  983. //Sleep(L)
  984. void CHealthManagerFSM::s10_on_entry()
  985. {
  986. LOG_FUNCTION();
  987. m_fsmState = HM_FSM_STATE_SLEEP;
  988. ErrorCodeEnum eErrCode;
  989. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","L");
  990. if (eErrCode != Error_Succeed)
  991. {
  992. Dbg("set RunState L failed (%d).",eErrCode);
  993. }
  994. }
  995. void CHealthManagerFSM::s10_on_exit()
  996. {
  997. LOG_FUNCTION();
  998. }
  999. unsigned int CHealthManagerFSM::s10_on_event(FSMEvent* pEvt)
  1000. {
  1001. LOG_FUNCTION();
  1002. Dbg("s10(Sleep) event %d",pEvt->iEvt);
  1003. switch(pEvt->iEvt)
  1004. {
  1005. case USER_EVT_MAITAIN:
  1006. Dbg("to maintain...");
  1007. m_stateBeforeMaintain = m_fsmState;
  1008. pEvt->SetHandled();
  1009. break;
  1010. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  1011. pEvt->SetHandled();
  1012. break;
  1013. default:
  1014. break;
  1015. }
  1016. return 0;
  1017. }
  1018. //In Customer Manager System
  1019. void CHealthManagerFSM::s11_on_entry()
  1020. {
  1021. LOG_FUNCTION();
  1022. m_preFsmState = m_fsmState;
  1023. m_fsmState = HM_FSM_STATE_CMS;
  1024. }
  1025. void CHealthManagerFSM::s11_on_exit()
  1026. {
  1027. LOG_FUNCTION();
  1028. }
  1029. unsigned int CHealthManagerFSM::s11_on_event(FSMEvent* pEvt)
  1030. {
  1031. LOG_FUNCTION();
  1032. Dbg("s11(In CMS) event %d",pEvt->iEvt);
  1033. int ret = 0;
  1034. switch (pEvt->iEvt)
  1035. {
  1036. case USER_EVT_MAITAIN:
  1037. Dbg("to maintain...");
  1038. m_stateBeforeMaintain = m_fsmState;
  1039. pEvt->SetHandled();
  1040. break;
  1041. case USER_EVT_SWITCH_BACK_TO_RVC:
  1042. pEvt->SetHandled();
  1043. ret = m_preFsmState;
  1044. break;
  1045. default:
  1046. break;
  1047. }
  1048. return ret;
  1049. }
  1050. ErrorCodeEnum CHealthManagerFSM::Initial()
  1051. {
  1052. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  1053. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1054. //start entity
  1055. CSmartPointer<IAsynWaitSp> spWait;
  1056. //close all entity if any? oiltmp
  1057. ifstream is;
  1058. ErrorCodeEnum err;
  1059. CSimpleStringA cfgPath = "",strCoreBoot("CoreBoot"),strSafeLoad("SafeLoad"),strOp("Operating"),strIEBrower("IEBrowser");
  1060. err = GetEntityBase()->GetFunction()->GetPath("cfg",cfgPath);
  1061. GetEntityBase()->GetFunction()->GetSystemStaticInfo(m_sysInfo);
  1062. Dbg("machinetype[%s],terminalID[%s]", (LPCTSTR)m_sysInfo.strMachineType,(LPCTSTR)m_sysInfo.strTerminalID);
  1063. strCoreBoot = strCoreBoot + "." + m_sysInfo.strMachineType;
  1064. strSafeLoad = strSafeLoad + "." + m_sysInfo.strMachineType;
  1065. strOp = strOp + "." + m_sysInfo.strMachineType;
  1066. m_strURL = strIEBrower + "." + m_sysInfo.strMachineType + ".Url";
  1067. cfgPath = cfgPath + "/HealthManager.ini";
  1068. Dbg("cfgpath[%s]",(const char*)cfgPath);
  1069. is.open (cfgPath, ios::binary);
  1070. if (!is.is_open())
  1071. {
  1072. DWORD dwErr = GetLastErrorRVC();
  1073. Dbg("open cfg file failed. [%d]",dwErr);
  1074. return Error_IO;
  1075. }
  1076. string line;
  1077. //line = new char[MAX_KEY_VALUE_SIZE];
  1078. long curr,end;
  1079. is.seekg(0,ios_base::end);
  1080. end = is.tellg();
  1081. is.seekg(0,ios_base::beg);
  1082. LoadStage eSection = LOADSTAGE_UNKNOWN;
  1083. CSmartPointer<IConfigInfo> spConfig;
  1084. err = GetEntityBase()->GetFunction()->OpenConfig(Config_Software, spConfig);
  1085. if (err != Error_Succeed) {
  1086. Dbg("open cfg file failed!");
  1087. return Error_IO;
  1088. }
  1089. m_AccessAuthTries = 4;
  1090. m_InitTries = 4;
  1091. m_AccessAuthTimeout = 180000;
  1092. m_InitializationTimeout = 180000;
  1093. int tmpAATries,tmpInitTries,tmpAATimeout,tmpInitTimout;
  1094. if (spConfig->ReadConfigValueInt("init","AccessAuthTries",tmpAATries) == Error_Succeed)
  1095. m_AccessAuthTries = tmpAATries;
  1096. if (spConfig->ReadConfigValueInt("init","InitTries",tmpInitTries) == Error_Succeed)
  1097. m_InitTries = tmpInitTries;
  1098. if (spConfig->ReadConfigValueInt("init","AccessAuthTimeout",tmpAATimeout) == Error_Succeed)
  1099. m_AccessAuthTimeout = tmpAATimeout;
  1100. if (spConfig->ReadConfigValueInt("init","InitializationTimeout",tmpInitTimout) == Error_Succeed)
  1101. m_InitializationTimeout = tmpInitTimout;
  1102. CSmartPointer<IConfigInfo> spConfigRoot;
  1103. GetEntityBase()->GetFunction()->OpenConfig(Config_Root, spConfigRoot);
  1104. CSimpleStringA csGpioVendor("");
  1105. spConfigRoot->ReadConfigValue("Device.Gpio", "Vendor", csGpioVendor);
  1106. if (csGpioVendor.GetLength() > 1)
  1107. m_hasCfgGpioInRootIni = true;
  1108. int count,cbNum,slNum,opNum;
  1109. count = cbNum = slNum = opNum = 0;
  1110. do
  1111. {
  1112. //memset(line,0,MAX_KEY_VALUE_SIZE);
  1113. getline(is,line);
  1114. if (line[0] == '[')
  1115. {
  1116. size_t secEnd = line.find(']',1);
  1117. if (secEnd != string::npos)
  1118. {
  1119. string strSec = line.substr(1,secEnd-1);
  1120. if (StrEqualNoCase(strSec.c_str(),strCoreBoot,strSec.length()))
  1121. eSection = LOADSTAGE_COREBOOT;
  1122. else if (StrEqualNoCase(strSec.c_str(),strSafeLoad,strSec.length()))
  1123. eSection = LOADSTAGE_SAFELOAD;
  1124. else if (StrEqualNoCase(strSec.c_str(),strOp,strSec.length()))
  1125. eSection = LOADSTAGE_OPERATING;
  1126. else
  1127. eSection = LOADSTAGE_UNKNOWN;
  1128. }
  1129. }
  1130. else if (((unsigned)(line[0]+1) > 256) || line[0] == ';')
  1131. {//Chinese and other...
  1132. curr = is.tellg();
  1133. continue;
  1134. }
  1135. else if (isalpha(line[0]))
  1136. {
  1137. if (eSection == LOADSTAGE_UNKNOWN)
  1138. {
  1139. curr = is.tellg();
  1140. continue;
  1141. }
  1142. size_t keyPos = line.find('=',0);
  1143. if (keyPos != string::npos)
  1144. {
  1145. string keyName = line.substr(0,keyPos);
  1146. count++;
  1147. switch(eSection)
  1148. {
  1149. case LOADSTAGE_COREBOOT:
  1150. spConfig->ReadConfigValueInt(strCoreBoot,keyName.c_str(),m_coreBootOpt[keyName.c_str()].loadOpt);
  1151. m_vCoreBoot.push_back(keyName.c_str());
  1152. m_vAllCfgEntity.push_back(keyName.c_str());
  1153. m_coreBootOpt[keyName.c_str()].eResult = LOADING_INIT;
  1154. m_coreBootOpt[keyName.c_str()].initSn = cbNum;
  1155. cbNum++;
  1156. break;
  1157. case LOADSTAGE_SAFELOAD:
  1158. spConfig->ReadConfigValueInt(strSafeLoad,keyName.c_str(),m_safeLoadOpt[keyName.c_str()].loadOpt);
  1159. m_vSafeLoad.push_back(keyName.c_str());
  1160. m_vAllCfgEntity.push_back(keyName.c_str());
  1161. m_safeLoadOpt[keyName.c_str()].eResult = LOADING_INIT;
  1162. m_safeLoadOpt[keyName.c_str()].initSn = slNum;
  1163. slNum++;
  1164. break;
  1165. case LOADSTAGE_OPERATING:
  1166. spConfig->ReadConfigValueInt(strOp,keyName.c_str(),m_operatingOpt[keyName.c_str()].loadOpt);
  1167. if (keyName.compare("Gpio") == 0 && !m_hasCfgGpioInRootIni)
  1168. Dbg("have configure gpio in HealthManager.ini,but can't find gpio in root.ini,ignore start gpio.");
  1169. else
  1170. {
  1171. m_vOperating.push_back(keyName.c_str());
  1172. m_vAllCfgEntity.push_back(keyName.c_str());
  1173. m_operatingOpt[keyName.c_str()].eResult = LOADING_INIT;
  1174. m_operatingOpt[keyName.c_str()].initSn = opNum;
  1175. opNum++;
  1176. }
  1177. break;
  1178. default:
  1179. break;
  1180. }
  1181. }
  1182. }
  1183. curr = is.tellg();
  1184. }while(curr < end);
  1185. is.close();
  1186. Dbg("opt num:[%d]c[%d]s[%d]o[%d]",count,m_coreBootOpt.size(),m_safeLoadOpt.size(),m_operatingOpt.size());
  1187. //read entity loading history record
  1188. CSimpleStringA sysinfoPath = "";
  1189. #ifndef _WIN32
  1190. if (m_sysInfo.strMachineType.Compare("RVC.Stand2S") != 0) {
  1191. CSimpleStringA strErrMsg = CSimpleStringA::Format("当前版本不支持此机型:%s", (LPCTSTR)m_sysInfo.strMachineType);
  1192. SP::Module::Comm::LogErrorNotiyStruct notifyItem(Error_NotSupport, 0);
  1193. SP::Module::Comm::LogNotiyMessageStruct notifyMsg(strErrMsg);
  1194. notifyItem.Notify(notifyMsg);
  1195. return Error_Succeed;
  1196. }
  1197. #endif //NOT _WIN32
  1198. WaitDeamonFinishTask* task = new WaitDeamonFinishTask(this);
  1199. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  1200. return Error_Succeed;
  1201. }
  1202. int CHealthManagerFSM::WaitDeamonFinish()
  1203. {
  1204. int count = 0;
  1205. while(1)//max waiting time
  1206. {
  1207. count++;
  1208. //query if update deamon process is started oiltmp
  1209. //case custody
  1210. //case needreboot
  1211. //case rollback
  1212. //case timeout
  1213. if (count > 2)
  1214. break;
  1215. //Sleep(5000);
  1216. }
  1217. return 0;
  1218. }
  1219. int CHealthManagerFSM::DoInitialization()
  1220. {
  1221. ErrorCodeEnum eErr;
  1222. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  1223. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1224. CEntityRunInfo acInfo;
  1225. eErr = pFunc->GetEntityRunInfo("Initializer",acInfo);
  1226. Dbg("Initializer state return %d",eErr);
  1227. if (eErr == Error_Succeed && (acInfo.eState == EntityState_NoStart || acInfo.eState == EntityState_Idle))
  1228. {
  1229. if (acInfo.eState == EntityState_NoStart)
  1230. {
  1231. CSmartPointer<IAsynWaitSp> spWaitInit;
  1232. eErr = pFuncPrivilege->StartEntity("Initializer",NULL,spWaitInit);
  1233. if (eErr == Error_Succeed)
  1234. eErr = spWaitInit->WaitAnswer(MAX_AYSNC_TIMEOUT);
  1235. eErr = pFunc->GetEntityRunInfo("Initializer",acInfo);
  1236. if (eErr != Error_Succeed || acInfo.eState != EntityState_Idle)
  1237. {
  1238. Dbg("start Initializer failed(%d,%d).",eErr,acInfo.eState);
  1239. return 1;
  1240. }
  1241. }
  1242. if (m_pInitClient == NULL)
  1243. {
  1244. m_pInitClient = new InitializerService_ClientBase(this->GetEntityBase());
  1245. eErr = m_pInitClient->Connect();
  1246. if (eErr != Error_Succeed) {
  1247. Dbg("Initializer connected failed.");
  1248. m_pInitClient->SafeDelete();
  1249. m_pInitClient = NULL;
  1250. return 2;
  1251. }
  1252. else
  1253. Dbg("Initializer connected.");
  1254. }
  1255. InitializerService_Initialize_Info initInfo;
  1256. m_pInitClient->Initialize(initInfo);
  1257. //no need to wait,just go
  1258. return 0;
  1259. }
  1260. else
  1261. {
  1262. Dbg("Get Initializer RunInfo failed(%d).",eErr);
  1263. return 3;
  1264. }
  1265. }
  1266. int CHealthManagerFSM::CoreBootDoWork()
  1267. {
  1268. return 0;
  1269. }
  1270. int CHealthManagerFSM::SafeLoadDoWork()
  1271. {
  1272. return 0;
  1273. }
  1274. int CHealthManagerFSM::OpLoadDoWork()
  1275. {
  1276. return 0;
  1277. }
  1278. //0:auth suc or have already authed;1:auth failed;
  1279. int CHealthManagerFSM::AccessAuthDoWork()
  1280. {
  1281. //oilyang@20190924 comment the following Sleep(5000);
  1282. //Sleep(5000);//oilyang wait for a few seconds
  1283. if (m_bFirstAccessAuth && m_accessAuthCheckMD5 == 1 && m_havReceiveMD5OK == 0)
  1284. {
  1285. Dbg("wait md5 ok.");
  1286. WaitForSingleObject(m_hMD5OKEvt, INFINITE);
  1287. m_bFirstAccessAuth = false;
  1288. Dbg("have received md5 ok event.");
  1289. }
  1290. CSimpleStringA csTermStage("");
  1291. ErrorCodeEnum eErr;
  1292. eErr = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage",csTermStage);
  1293. Dbg("oninit get termstage %s",(LPCTSTR)csTermStage);
  1294. bool bToDoInit = false;
  1295. if (eErr == Error_Succeed)
  1296. {
  1297. if (csTermStage[0] == 'U')
  1298. {
  1299. bToDoInit = true;
  1300. int initTime = 0;
  1301. INITIALIZATION:
  1302. int rc = DoInitialization();
  1303. Dbg("the %d init",initTime);
  1304. initTime++;
  1305. DWORD dwStart = GetTickCountRVC();
  1306. while(1)
  1307. {
  1308. if (!m_bInitSuc && !m_bInitFail)
  1309. {
  1310. Sleep(1000);
  1311. continue;
  1312. }
  1313. else if (m_bInitSuc || m_bInitFail)
  1314. {
  1315. Dbg("init result %d,%d",m_bInitSuc,m_bInitFail);
  1316. //if (m_bInitFail && initTime < m_InitTries)
  1317. if (m_bInitFail)
  1318. {
  1319. Sleep(5000);
  1320. m_bInitFail = false;
  1321. goto INITIALIZATION;
  1322. }
  1323. if (m_bInitSuc)
  1324. break;
  1325. }
  1326. //20130826 oilyang according to xkm,wait forever
  1327. //DWORD dwEnd,dwElapse;
  1328. //dwEnd = GetTickCount();
  1329. //dwElapse = dwEnd - dwStart;
  1330. //if (dwElapse > m_InitializationTimeout)
  1331. //{
  1332. // Dbg("wait init timeout");
  1333. // break;
  1334. //}
  1335. }
  1336. }
  1337. }
  1338. else
  1339. {
  1340. Dbg("get TerminalStage failed(%d).",eErr);
  1341. return 1;
  1342. }
  1343. Dbg("after proc initialization.");
  1344. if (bToDoInit)
  1345. {
  1346. if (m_bInitSuc)
  1347. {
  1348. eErr = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage","C");
  1349. Dbg("set TerminalStage C");
  1350. if (eErr != Error_Succeed)
  1351. Dbg("set TerminalStage C failed(%d).",eErr);
  1352. }
  1353. else
  1354. {
  1355. Dbg("initialization failed.");
  1356. return 1;
  1357. }
  1358. }
  1359. //to accessauth
  1360. ErrorCodeEnum eErrCode;
  1361. eErrCode = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage",csTermStage);
  1362. Dbg("before accessauth get termstage %s",(LPCTSTR)csTermStage);
  1363. if (eErrCode == Error_Succeed)
  1364. {
  1365. //if (csTermStage[0] == 'C' || csTermStage[0] == 'A')
  1366. if (csTermStage[0] != 'U')
  1367. {
  1368. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  1369. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1370. //terminate pinpad
  1371. //CSmartPointer<IAsynWaitSp> spWait;
  1372. //eErrCode = pFuncPrivilege->CloseEntity("PinPad",spWait);
  1373. //Dbg("close pinpad %d.",eErrCode);
  1374. //eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  1375. //if (eErrCode != Error_Succeed)
  1376. //{
  1377. // //terminate pinpad
  1378. // CSmartPointer<IAsynWaitSp> spWait;
  1379. // pFuncPrivilege->TerminateEntity("PinPad",spWait);
  1380. // spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  1381. //}
  1382. //if (eErrCode == Error_Succeed)
  1383. {
  1384. CEntityRunInfo acInfo;
  1385. eErrCode = pFunc->GetEntityRunInfo("AccessAuthorization",acInfo);
  1386. Dbg("AccessAuth state return %d",eErrCode);
  1387. if (eErrCode == Error_Succeed)
  1388. {
  1389. switch(acInfo.eState)
  1390. {
  1391. case EntityState_NoStart:
  1392. {
  1393. CSmartPointer<IAsynWaitSp> spWaitAC;
  1394. eErrCode = pFuncPrivilege->StartEntity("AccessAuthorization",NULL,spWaitAC);
  1395. eErrCode = spWaitAC->WaitAnswer(MAX_AYSNC_TIMEOUT);
  1396. Dbg("start accessauth %d.",eErrCode);
  1397. }
  1398. break;
  1399. case EntityState_Idle:
  1400. Dbg("AccessAuth state idle.");
  1401. break;
  1402. default:
  1403. break;
  1404. }
  1405. if (m_pACClient == NULL)
  1406. {
  1407. m_pACClient = new AccessAuthService_ClientBase(this->GetEntityBase());
  1408. eErrCode = m_pACClient->Connect();
  1409. if (eErrCode != Error_Succeed) {
  1410. Dbg("accessauth connected failed.");
  1411. m_pACClient->SafeDelete();
  1412. m_pACClient = NULL;
  1413. StartPinPadEntity();
  1414. return 1;
  1415. }
  1416. else
  1417. Dbg("accessauth connected.");
  1418. }
  1419. }
  1420. else
  1421. {
  1422. Dbg("Get AccessAuth RunInfo failed(%d).",eErrCode);
  1423. StartPinPadEntity();
  1424. return 1;
  1425. }
  1426. if (m_pACClient != NULL)
  1427. {
  1428. DWORD dwStart = GetTickCountRVC();
  1429. int registCount = 0;
  1430. REGIST: eErrCode = m_pACClient->Regist();
  1431. m_bHasAuthEver = true;
  1432. registCount++;
  1433. Dbg("accessauth regist %d",eErrCode);
  1434. if (eErrCode == Error_Succeed)
  1435. {
  1436. while(1)
  1437. {
  1438. DWORD dwEnd = GetTickCountRVC();
  1439. DWORD dwElapse = dwEnd-dwStart;
  1440. if (dwElapse > m_AccessAuthTimeout)
  1441. {
  1442. Dbg("after x minute");
  1443. StartPinPadEntity();
  1444. //auth failed,rollback to C
  1445. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage","C");
  1446. Dbg("auth fail,set TerminalStage C 1");
  1447. if (eErr != Error_Succeed)
  1448. Dbg("set TerminalStage C failed(%d).",eErr);
  1449. m_bFirstAccessAuth = false;
  1450. return 1;
  1451. }
  1452. Sleep(1000);
  1453. if (!m_bAccessAuth && !m_bACFailed)
  1454. continue;
  1455. if (m_bACFailed && registCount < m_AccessAuthTries)
  1456. {
  1457. LogWarn(Severity_Low,Error_Unexpect,LOG_WARN_HEALTH_ACCESSAUTH_FAILED,"AccessAuth failed.");
  1458. m_bACFailed = false;
  1459. Sleep(5000);
  1460. goto REGIST;
  1461. }
  1462. Dbg("regist try %d times",registCount);
  1463. StartPinPadEntity();
  1464. if (!m_bAccessAuth)
  1465. {
  1466. //auth failed,rollback to C
  1467. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage","C");
  1468. Dbg("auth fail,set TerminalStage C 2");
  1469. if (eErr != Error_Succeed)
  1470. Dbg("set TerminalStage C failed(%d).",eErr);
  1471. }
  1472. break;
  1473. //}
  1474. }
  1475. m_bFirstAccessAuth = false;
  1476. return 0;
  1477. }
  1478. else
  1479. {
  1480. Dbg("accessauth regist failed(%d).",eErrCode);
  1481. StartPinPadEntity();
  1482. //auth failed,rollback to C
  1483. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage","C");
  1484. Dbg("auth fail,set TerminalStage C 3");
  1485. if (eErr != Error_Succeed)
  1486. Dbg("set TerminalStage C failed(%d).",eErr);
  1487. return 1;
  1488. }
  1489. }
  1490. else
  1491. {
  1492. Dbg("Start accessauth failed(%d).",eErrCode);
  1493. StartPinPadEntity();
  1494. //auth failed,rollback to C
  1495. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage","C");
  1496. Dbg("auth fail,set TerminalStage C 4");
  1497. if (eErr != Error_Succeed)
  1498. Dbg("set TerminalStage C failed(%d).",eErr);
  1499. return 1;
  1500. }
  1501. }
  1502. }
  1503. else
  1504. {
  1505. StartPinPadEntity();
  1506. return 0;
  1507. }
  1508. }
  1509. else
  1510. Dbg("Get termstage failed(%d).",eErrCode);
  1511. return 1;
  1512. }
  1513. //return value:
  1514. //0:all entity have started suc
  1515. //1:some entity havn't try to start
  1516. //2:all entity have tried to started,but some failed
  1517. int CHealthManagerFSM::CheckLoadResult(LoadStage eStage)
  1518. {
  1519. int ret = 0;
  1520. map<CSimpleStringA,EntityLoadInfo>::iterator it;
  1521. if (eStage == LOADSTAGE_COREBOOT)
  1522. it = m_coreBootOpt.begin();
  1523. else if (eStage == LOADSTAGE_SAFELOAD)
  1524. it = m_safeLoadOpt.begin();
  1525. else
  1526. it = m_operatingOpt.begin();
  1527. while(1)
  1528. {
  1529. switch(it->second.loadOpt)
  1530. {
  1531. case LOADOPT_IGNORE:
  1532. if (it->second.eResult == LOADING_INIT)
  1533. return 1;
  1534. break;
  1535. case LOADOPT_ASYNC_VERIFY:
  1536. case LOADOPT_SYNC_VERIFY:
  1537. default:
  1538. if (it->second.eResult == LOADING_INIT)
  1539. return 3;
  1540. else if (it->second.eResult != LOADING_SUCCEED)
  1541. {
  1542. m_csErrEntity = it->first;
  1543. ret = 2;
  1544. }
  1545. break;
  1546. }
  1547. it++;
  1548. if (eStage == LOADSTAGE_COREBOOT && it == m_coreBootOpt.end())
  1549. break;
  1550. else if (eStage == LOADSTAGE_SAFELOAD && it == m_safeLoadOpt.end())
  1551. break;
  1552. else if (eStage == LOADSTAGE_OPERATING && it == m_operatingOpt.end())
  1553. break;
  1554. }
  1555. return ret;
  1556. }
  1557. void CHealthManagerFSM::SetAccessAuth(bool bResult)
  1558. {
  1559. m_bAccessAuth = bResult;
  1560. ErrorCodeEnum eErrCode;
  1561. if (bResult)
  1562. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage","A");
  1563. else
  1564. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "C");
  1565. Dbg("SetAccessAuth %d",bResult);
  1566. if (m_pACClient != NULL)
  1567. {
  1568. }
  1569. }
  1570. int CHealthManagerFSM::StartPinPadEntity()
  1571. {
  1572. if (m_coreBootOpt.find("PinPad") == m_coreBootOpt.end() && m_safeLoadOpt.find("PinPad") == m_safeLoadOpt.end()
  1573. && m_operatingOpt.find("PinPad") == m_operatingOpt.end())
  1574. {
  1575. Dbg("not configure pinpad.");
  1576. return 0;
  1577. }
  1578. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  1579. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1580. CEntityRunInfo acInfo;
  1581. ErrorCodeEnum eErrCode;
  1582. eErrCode = pFunc->GetEntityRunInfo("PinPad",acInfo);
  1583. Dbg("pinpad state %d,%d",eErrCode,acInfo.eState);
  1584. if (acInfo.eState == EntityState_NoStart || acInfo.eState == EntityState_Close || acInfo.eState == EntityState_Killed)
  1585. {
  1586. CSmartPointer<IAsynWaitSp> spWait;
  1587. eErrCode = pFuncPrivilege->StartEntity("PinPad",NULL,spWait);
  1588. Dbg("start pinpad %d.",eErrCode);
  1589. if (spWait != NULL)
  1590. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  1591. Dbg("start pinpad wait %d",eErrCode);
  1592. }
  1593. return eErrCode;
  1594. }
  1595. void CHealthManagerFSM::ToReAccessAuth(bool bEver)
  1596. {
  1597. if (m_bFirstAccessAuth)
  1598. return;
  1599. SetAccessAuth(false);
  1600. AccessAuthTask *pTask = new AccessAuthTask(this);
  1601. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1602. }
  1603. ErrorCodeEnum CHealthManagerFSM::AsyncStartEntity(const char *entity_name, const char *cmdline, void *pData)
  1604. {
  1605. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  1606. ErrorCodeEnum errCode;
  1607. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1608. if (pFuncPrivilege != NULL) {
  1609. CSmartPointer<IAsynWaitSp> spWait;
  1610. errCode = pFuncPrivilege->StartEntity(entity_name, cmdline, spWait);
  1611. Dbg("start entity %s",entity_name);
  1612. if (errCode == Error_Succeed) {
  1613. callback_entry *entry = new callback_entry();
  1614. entry->pRawData = pData;
  1615. entry->EntityName = entity_name;
  1616. entry->ErrorResult = Error_Unexpect;
  1617. entry->op = OP_START_ENTITY;
  1618. if (spWait != NULL)
  1619. spWait->SetCallback(this, entry);
  1620. }
  1621. return errCode;
  1622. } else {
  1623. return Error_NoPrivilege;
  1624. }
  1625. }
  1626. ErrorCodeEnum CHealthManagerFSM::AsyncStopEntity(const char *entity_name, void *pData)
  1627. {
  1628. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  1629. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1630. if (pFuncPrivilege != NULL) {
  1631. CSmartPointer<IAsynWaitSp> spWait;
  1632. ErrorCodeEnum Error = pFuncPrivilege->StopEntity(entity_name, spWait);
  1633. if (Error == Error_Succeed) {
  1634. callback_entry *entry = new callback_entry();
  1635. entry->pRawData = pData;
  1636. entry->EntityName = entity_name;
  1637. entry->ErrorResult = Error_Unexpect;
  1638. entry->op = OP_STOP_ENTITY;
  1639. if (spWait != NULL)
  1640. spWait->SetCallback(this, entry);
  1641. }
  1642. return Error;
  1643. } else {
  1644. return Error_NoPrivilege;
  1645. }
  1646. }
  1647. ErrorCodeEnum CHealthManagerFSM::AsyncPauseEntity(const char *entity_name, void *pData)
  1648. {
  1649. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  1650. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1651. if (pFuncPrivilege != NULL) {
  1652. CSmartPointer<IAsynWaitSp> spWait;
  1653. ErrorCodeEnum Error = pFuncPrivilege->PauseEntity(entity_name, spWait);
  1654. if (Error == Error_Succeed) {
  1655. callback_entry *entry = new callback_entry();
  1656. entry->pRawData = pData;
  1657. entry->EntityName = entity_name;
  1658. entry->ErrorResult = Error_Unexpect;
  1659. entry->op = OP_PAUSE_ENTITY;
  1660. if (spWait != NULL)
  1661. spWait->SetCallback(this, entry);
  1662. }
  1663. return Error;
  1664. } else {
  1665. return Error_NoPrivilege;
  1666. }
  1667. }
  1668. ErrorCodeEnum CHealthManagerFSM::AsyncContinueEntity(const char *entity_name, void *pData)
  1669. {
  1670. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  1671. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1672. if (pFuncPrivilege != NULL) {
  1673. CSmartPointer<IAsynWaitSp> spWait;
  1674. ErrorCodeEnum Error = pFuncPrivilege->ContinueEntity(entity_name, spWait);
  1675. if (Error == Error_Succeed) {
  1676. callback_entry *entry = new callback_entry();
  1677. entry->pRawData = pData;
  1678. entry->EntityName = entity_name;
  1679. entry->ErrorResult = Error_Unexpect;
  1680. entry->op = OP_CONTINUE_ENTITY;
  1681. if (spWait != NULL)
  1682. spWait->SetCallback(this, entry);
  1683. }
  1684. return Error;
  1685. } else {
  1686. return Error_NoPrivilege;
  1687. }
  1688. }
  1689. ErrorCodeEnum CHealthManagerFSM::AsyncTerminateEntity(const char *entity_name, void *pData)
  1690. {
  1691. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  1692. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1693. if (pFuncPrivilege != NULL) {
  1694. CSmartPointer<IAsynWaitSp> spWait;
  1695. ErrorCodeEnum Error = pFuncPrivilege->TerminateEntity(entity_name, spWait);
  1696. if (Error == Error_Succeed) {
  1697. callback_entry *entry = new callback_entry();
  1698. entry->pRawData = pData;
  1699. entry->EntityName = entity_name;
  1700. entry->ErrorResult = Error_Unexpect;
  1701. entry->op = OP_TERMINATE_ENTITY;
  1702. if (spWait != NULL)
  1703. spWait->SetCallback(this, entry);
  1704. }
  1705. return Error;
  1706. } else {
  1707. return Error_NoPrivilege;
  1708. }
  1709. }
  1710. void CHealthManagerFSM::OnAnswer(CSmartPointer<IAsynWaitSp> pAsynWaitSp)
  1711. {
  1712. CSmartPointer<ICallbackListener> spCallback;
  1713. CSmartPointer<IReleasable> pData;
  1714. pAsynWaitSp->GetCallback(spCallback, pData);
  1715. //LOG_ASSERT(pData);
  1716. callback_entry *entry = dynamic_cast<callback_entry*>((IReleasable*)(pData.GetRawPointer()));
  1717. entry->ErrorResult = pAsynWaitSp->AsyncGetAnswer();
  1718. callback_entry *new_entry = new callback_entry();
  1719. new_entry->EntityName = entry->EntityName;
  1720. new_entry->ErrorResult = entry->ErrorResult;
  1721. new_entry->op = entry->op;
  1722. new_entry->state = entry->state;
  1723. map<CSimpleStringA,EntityLoadInfo>::iterator it;
  1724. int ret;
  1725. Dbg("stage %d,%s,result %d",m_eStage,(LPCSTR)new_entry->EntityName,new_entry->ErrorResult);
  1726. if (entry->op == OP_START_ENTITY && new_entry->ErrorResult != Error_Succeed) {
  1727. //ShowEntityBootFailedAtFront(new_entry->EntityName, new_entry->ErrorResult, false);
  1728. }
  1729. switch(m_eStage)
  1730. {
  1731. case LOADSTAGE_COREBOOT:
  1732. it = m_coreBootOpt.find(new_entry->EntityName);
  1733. if (it != m_coreBootOpt.end())
  1734. {
  1735. if (new_entry->ErrorResult == Error_Succeed)
  1736. it->second.eResult = LOADING_SUCCEED;
  1737. else if (new_entry->ErrorResult == Error_TimeOut)
  1738. it->second.eResult = LOADING_TIMEOUT;
  1739. else
  1740. it->second.eResult = LOADING_FAILED;
  1741. if (it->second.eResult != Error_Succeed)
  1742. {
  1743. char tmp[64] = {0};
  1744. sprintf(tmp, "实体 %s 启动失败", it->first.GetData());
  1745. //GetEntityBase()->GetFunction()->ShowFatalError(tmp);
  1746. Dbg("%s", tmp);
  1747. }
  1748. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  1749. if (ret == 0 || ret == 2)
  1750. {
  1751. FSMEvent *e = new FSMEvent(USER_EVT_COREBOOT_FINISHED);
  1752. e->param1 = ret;
  1753. PostEventFIFO(e);
  1754. }
  1755. }
  1756. break;
  1757. case LOADSTAGE_SAFELOAD:
  1758. it = m_safeLoadOpt.find(new_entry->EntityName);
  1759. if (it != m_safeLoadOpt.end())
  1760. {
  1761. if (new_entry->ErrorResult == Error_Succeed)
  1762. it->second.eResult = LOADING_SUCCEED;
  1763. else if (new_entry->ErrorResult == Error_TimeOut)
  1764. it->second.eResult = LOADING_TIMEOUT;
  1765. else
  1766. it->second.eResult = LOADING_FAILED;
  1767. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  1768. Dbg("safeload answer %d",ret);
  1769. if (ret == 0 || ret == 2)
  1770. {
  1771. FSMEvent *e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
  1772. e->param1 = ret;
  1773. PostEventFIFO(e);
  1774. }
  1775. }
  1776. else
  1777. Dbg("cannot find %s",(LPCTSTR)new_entry->EntityName);
  1778. break;
  1779. case LOADSTAGE_OPERATING:
  1780. it = m_operatingOpt.find(new_entry->EntityName);
  1781. if (it != m_operatingOpt.end())
  1782. {
  1783. if (new_entry->ErrorResult == Error_Succeed)
  1784. it->second.eResult = LOADING_SUCCEED;
  1785. else if (new_entry->ErrorResult == Error_TimeOut)
  1786. it->second.eResult = LOADING_TIMEOUT;
  1787. else
  1788. it->second.eResult = LOADING_FAILED;
  1789. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  1790. if (ret == 0 || ret == 2)
  1791. {
  1792. FSMEvent *e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
  1793. e->param1 = ret;
  1794. PostEventFIFO(e);
  1795. }
  1796. }
  1797. break;
  1798. default:
  1799. break;
  1800. }
  1801. }
  1802. void CHealthManagerFSM::ToCheckUPS()
  1803. {
  1804. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  1805. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1806. CEntityRunInfo acInfo;
  1807. ErrorCodeEnum eErrCode;
  1808. eErrCode = pFunc->GetEntityRunInfo("Ups",acInfo);
  1809. Dbg("ups state %d,%d",eErrCode,acInfo.eState);
  1810. if (acInfo.eState != EntityState_NoStart)
  1811. {
  1812. CSmartPointer<IAsynWaitSp> spWait;
  1813. eErrCode = pFuncPrivilege->TerminateEntity("Ups",spWait);
  1814. Sleep(2000);
  1815. eErrCode = pFuncPrivilege->StartEntity("Ups",NULL,spWait);
  1816. if (spWait != NULL)
  1817. eErrCode = spWait->WaitAnswer(5000);
  1818. Dbg("restart ups wait %d",eErrCode);
  1819. }
  1820. }
  1821. int CHealthManagerFSM::USBControl()
  1822. {
  1823. CSystemStaticInfo sysInfo;
  1824. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
  1825. if (eErr != Error_Succeed)
  1826. {
  1827. Dbg("Get system static info failed(%d).",eErr);
  1828. return -1;
  1829. }
  1830. Dbg("machinetype[%s]",(LPCTSTR)sysInfo.strMachineType);
  1831. if (sysInfo.strMachineType.Compare("RVC.PAD") == 0)
  1832. {
  1833. if (m_pDevCtrlClient == NULL)
  1834. {
  1835. m_pDevCtrlClient = new DeviceControlService_ClientBase(this->m_pEntity);
  1836. ErrorCodeEnum eErr = m_pDevCtrlClient->Connect();
  1837. if (eErr != Error_Succeed) {
  1838. Dbg("DeviceControl connected failed(%d).",eErr);
  1839. m_pDevCtrlClient->SafeDelete();
  1840. m_pDevCtrlClient = NULL;
  1841. return -1;
  1842. }
  1843. }
  1844. if (m_pDevCtrlClient != NULL)
  1845. {
  1846. DeviceControlService_USB_Req req;
  1847. DeviceControlService_USB_Ans ans;
  1848. req.open = true;
  1849. eErr = m_pDevCtrlClient->USB(req,ans,5000);
  1850. if (eErr != Error_Succeed)
  1851. {
  1852. Dbg("usb control failed(%d).",eErr);
  1853. return -1;
  1854. }
  1855. else
  1856. Dbg("usb opened.");
  1857. }
  1858. }
  1859. return 0;
  1860. }
  1861. CSimpleStringA CHealthManagerFSM::GetEntityCfgInfo(CSimpleStringA name,int &loadOpt)
  1862. {
  1863. CSimpleStringA entityList("");
  1864. Dbg("GetEntityCfgInfo %s",(LPCTSTR)name);
  1865. if (!name.IsNullOrEmpty() && name.Compare("AllConfiguredEntity") == 0)
  1866. {
  1867. for (auto itor = m_vAllCfgEntity.cbegin(); itor != m_vAllCfgEntity.cend(); itor++)
  1868. {
  1869. entityList += (*itor) + ",";
  1870. }
  1871. return entityList;
  1872. }
  1873. #ifdef RVC_OS_WIN
  1874. if (!name.IsNullOrEmpty() && name.Compare("IEBrowser") == 0)
  1875. {
  1876. Dbg("IEBrowser just return 2");
  1877. loadOpt = 2;
  1878. return "";
  1879. }
  1880. #endif //RVC_OS_WIN
  1881. map<CSimpleStringA,EntityLoadInfo>::iterator it;
  1882. for (it = m_coreBootOpt.begin(); it != m_coreBootOpt.end(); ++it)
  1883. {
  1884. if (_strnicmp(name,it->first,name.GetLength()) == 0)
  1885. {
  1886. loadOpt = it->second.loadOpt;
  1887. Dbg("GetEntityCfgInfo %d",loadOpt);
  1888. return "";
  1889. }
  1890. }
  1891. for (it = m_safeLoadOpt.begin(); it != m_safeLoadOpt.end(); ++it)
  1892. {
  1893. if (_strnicmp(name,it->first,name.GetLength()) == 0)
  1894. {
  1895. loadOpt = it->second.loadOpt;
  1896. Dbg("GetEntityCfgInfo %d",loadOpt);
  1897. return "";
  1898. }
  1899. }
  1900. for (it = m_operatingOpt.begin(); it != m_operatingOpt.end(); ++it)
  1901. {
  1902. if (_strnicmp(name,it->first,name.GetLength()) == 0)
  1903. {
  1904. loadOpt = it->second.loadOpt;
  1905. Dbg("GetEntityCfgInfo %d",loadOpt);
  1906. return "";
  1907. }
  1908. }
  1909. loadOpt = 99;
  1910. return "";
  1911. }
  1912. CSimpleStringA CHealthManagerFSM::QueryCheckCode()
  1913. {
  1914. ErrorCodeEnum eErr = Error_Unexpect;
  1915. CSimpleStringA tmpCheckCode("");
  1916. PinPadService_ClientBase *pClient = new PinPadService_ClientBase(this->m_pEntity);
  1917. if (pClient != NULL)
  1918. {
  1919. eErr = pClient->Connect();
  1920. if (eErr == Error_Succeed)
  1921. {
  1922. PinPadService_QueryFunc_Req reqQ;
  1923. PinPadService_QueryFunc_Ans ansQ;
  1924. eErr = pClient->QueryFunc(reqQ, ansQ, 5000);
  1925. if (eErr == Error_Succeed)
  1926. {
  1927. PinPadService_GetCheckCode_Req reqG;
  1928. PinPadService_GetCheckCode_Ans ansG;
  1929. if (ansQ.reserved1 == 2)//if sm only
  1930. {
  1931. reqG.mSN.Init(1);
  1932. reqG.wSN.Init(1);
  1933. reqG.mSN[0] = 1;
  1934. reqG.wSN[0] = 0;
  1935. eErr = pClient->GetCheckCode(reqG, ansG, 10000);
  1936. if (eErr == Error_Succeed)
  1937. {
  1938. tmpCheckCode = ansG.checkcode[0];
  1939. }
  1940. }
  1941. else//3des only or 3des&sm both ok
  1942. {
  1943. reqG.mSN.Init(1);
  1944. reqG.wSN.Init(1);
  1945. reqG.mSN[0] = 0;
  1946. reqG.wSN[0] = 0;
  1947. eErr = pClient->GetCheckCode(reqG, ansG, 10000);
  1948. if (eErr == Error_Succeed)
  1949. {
  1950. tmpCheckCode = ansG.checkcode[0];
  1951. }
  1952. }
  1953. }
  1954. else
  1955. Dbg("QueryFunc failed.error code:%d",eErr);
  1956. }
  1957. else
  1958. Dbg("connect to pinpad failed.error code:%d",eErr);
  1959. }
  1960. return tmpCheckCode;
  1961. }
  1962. CSimpleStringA CHealthManagerFSM::QueryPinPadSM3DesInfo()
  1963. {
  1964. ErrorCodeEnum eErr = Error_Unexpect;
  1965. CSimpleStringA sm3desInfo("support:");
  1966. PinPadService_ClientBase* pClient = new PinPadService_ClientBase(this->m_pEntity);
  1967. if (pClient != NULL)
  1968. {
  1969. eErr = pClient->Connect();
  1970. if (eErr == Error_Succeed)
  1971. {
  1972. PinPadService_QueryFunc_Req reqQ;
  1973. PinPadService_QueryFunc_Ans ansQ;
  1974. eErr = pClient->QueryFunc(reqQ, ansQ, 5000);
  1975. if (eErr == Error_Succeed)
  1976. {
  1977. Dbg("support:%d,loaded:%d",ansQ.encryptkey,ansQ.reserved1);
  1978. if (ansQ.encryptkey == 3)
  1979. sm3desInfo += "sm3des";
  1980. else if((ansQ.encryptkey == 2))
  1981. sm3desInfo += "sm";
  1982. else
  1983. sm3desInfo += "3des";
  1984. sm3desInfo += ",loadkey:";
  1985. if (ansQ.reserved1 == 3)
  1986. sm3desInfo += "sm3des";
  1987. else if ((ansQ.reserved1 == 2))
  1988. sm3desInfo += "sm";
  1989. else
  1990. sm3desInfo += "3des";
  1991. }
  1992. else
  1993. Dbg("QueryFunc failed.error code:%d", eErr);
  1994. }
  1995. else
  1996. Dbg("connect to pinpad failed.error code:%d", eErr);
  1997. }
  1998. return sm3desInfo;
  1999. }
  2000. void CHealthManagerFSM::DeviceReConnect()
  2001. {
  2002. //if haven't called access auth ever or in the 1st accessauth processing,no need to call access auth
  2003. if (QueryAccessAuthStatus() == 2 || m_bFirstAccessAuth)
  2004. return;
  2005. CSimpleStringA tmpCheckCode = QueryCheckCode();
  2006. Dbg("pre check code size:%d,now:%d",m_checkCode.GetLength(),tmpCheckCode.GetLength());
  2007. SetAccessFailedFlag(false);
  2008. if (tmpCheckCode.GetLength() == 0 || m_checkCode.Compare(tmpCheckCode, true) != 0 || !GetAccessAuthFlag() || !m_bEverAuthSucWithDevice)
  2009. {
  2010. if (m_checkCode.GetLength() > 1 && tmpCheckCode.GetLength() > 1 && m_checkCode.Compare(tmpCheckCode, true) != 0)
  2011. {
  2012. AuthStatus as;
  2013. as.result = 1;
  2014. as.msg = "设备混用,请接入对应设备或后台重新绑定当前设备";
  2015. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(AuthStatus), SP_MSG_SIG_OF(AuthStatus), as);
  2016. }
  2017. else
  2018. {
  2019. if (m_checkCode.GetLength() > 1)
  2020. ToReAccessAuth(true);
  2021. else
  2022. ToReAccessAuth();
  2023. }
  2024. }
  2025. }
  2026. int CHealthManagerFSM::QuitFrameworkAndSaveInfo(RebootTriggerEnum eTrigger, RebootWayEnum eWay)
  2027. {
  2028. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  2029. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  2030. Dbg("quit framework and info %d,%d.", eTrigger, eWay);
  2031. const auto result = pFuncPrivilege->Reboot(eTrigger, eWay);
  2032. return (int)result;
  2033. }
  2034. void CHealthManagerFSM::PostProcessAfterUpgrade()
  2035. {
  2036. LOG_FUNCTION();
  2037. CSimpleStringA csRunInfoPath(""), csFileName("");
  2038. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetPath("RunInfo", csRunInfoPath);
  2039. csFileName = csRunInfoPath + "/runcfg/starttime.dat";
  2040. Dbg("file:%s", (const char*)csFileName);
  2041. bool bUpgradeFileExist = false;
  2042. #ifdef RVC_OS_WIN
  2043. bUpgradeFileExist = (_access((const char*)csFileName, 0) == 0);
  2044. #else
  2045. bUpgradeFileExist = (access((const char*)csFileName, F_OK) == 0);
  2046. #endif //RVC_OS_WIN
  2047. if (bUpgradeFileExist)
  2048. {
  2049. Dbg("exist upgrade flag file,to decide if restart framework.");
  2050. //存在升级后的启动文件
  2051. CSmartPointer<IConfigInfo> spConfigRun;
  2052. eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  2053. if (eErr == Error_Succeed)
  2054. {
  2055. int xTimes = 0;
  2056. spConfigRun->ReadConfigValueInt("Run", "UpgradeRestartTimes", xTimes);
  2057. if (xTimes < 3)
  2058. {
  2059. xTimes++;
  2060. Dbg("write Run--UpgradeRestartTimes:%d", xTimes);
  2061. spConfigRun->WriteConfigValueInt("Run", "UpgradeRestartTimes", xTimes);
  2062. if (xTimes == 3)
  2063. {
  2064. //DeleteFileA((const char*)csFileName);
  2065. QuitFrameworkAndSaveInfo(RebootTrigger_Resource, RebootWay_OS);
  2066. }
  2067. else
  2068. QuitFrameworkAndSaveInfo(RebootTrigger_Resource, RebootWay_Framework);
  2069. }
  2070. }
  2071. }
  2072. }
  2073. CSimpleStringA GetOsVersion()
  2074. {
  2075. #ifdef RVC_OS_WIN
  2076. char psBuffer[128];
  2077. FILE* pPipe;
  2078. /* Run DIR so that it writes its output to a pipe. Open this
  2079. * pipe with read text attribute so that we can read it
  2080. * like a text file.
  2081. */
  2082. if ((pPipe = _popen("ver", "rt")) == NULL)
  2083. exit(1);
  2084. /* Read pipe until end of file, or an error occurs. */
  2085. while (fgets(psBuffer, 128, pPipe))
  2086. {
  2087. //puts(psBuffer);
  2088. }
  2089. Dbg("%s", psBuffer);
  2090. /* Close pipe and print return value of pPipe. */
  2091. if (feof(pPipe))
  2092. {
  2093. printf("\nProcess returned %d\n", _pclose(pPipe));
  2094. }
  2095. else
  2096. {
  2097. printf("Error: Failed to read the pipe to the end.\n");
  2098. }
  2099. string str(psBuffer);
  2100. int start = str.find("版本");
  2101. if (start > 0)
  2102. return CSimpleStringA(str.substr(start + 5, str.length() - start - 7).c_str());
  2103. else
  2104. return "";
  2105. #else
  2106. //oiltestlinux
  2107. return "";
  2108. #endif
  2109. }
  2110. void CHealthManagerFSM::ToLogWarnTermAboutInfo()
  2111. {
  2112. LOG_FUNCTION();
  2113. CSmartPointer<IConfigInfo> spConfigRoot;
  2114. GetEntityBase()->GetFunction()->OpenConfig(Config_Root, spConfigRoot);
  2115. CSimpleStringA csEnvCamera(""),csOptCamera,csOSVerion;
  2116. spConfigRoot->ReadConfigValue("Video", "EnvCamera", csEnvCamera);
  2117. spConfigRoot->ReadConfigValue("Video", "OptCamera", csOptCamera);
  2118. std::map<std::string, std::string> termInfo;
  2119. termInfo["version"] = m_sysInfo.InstallVersion.ToString();
  2120. if (!m_csErrEntity.IsNullOrEmpty())
  2121. termInfo["ErrEntity"] = m_csErrEntity;
  2122. termInfo["EnvCamera"] = csEnvCamera;
  2123. termInfo["OptCamera"] = csOptCamera;
  2124. csOSVerion = GetOsVersion();
  2125. if (!csOSVerion.IsNullOrEmpty())
  2126. termInfo["OSVersion"] = csOSVerion;
  2127. termInfo["pinpad"] = QueryPinPadSM3DesInfo();
  2128. Dbg("%s,%s", termInfo["ErrEntity"].c_str(), termInfo["pinpad"].c_str());
  2129. //oiltestlinux as publicfucn have not been moved to linux
  2130. //std::pair<bool, std::string> strResult;
  2131. //strResult = generateJsonStr(termInfo);
  2132. //strResult.second.c_str();
  2133. //Dbg("[%s]", strResult.second.c_str());
  2134. //LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_HEALTH_UPLOAD_INFO_ABOUT_TERM, strResult.second.c_str());
  2135. }
  2136. void CHealthManagerFSM::ShowEntityBootFailedAtFront(LPCTSTR lpcszEntityName, ErrorCodeEnum bootFailedResult, bool isBlock)
  2137. {
  2138. #if defined(RVC_OS_LINUX)
  2139. CEntityLastErrorInfo errInfo = {};
  2140. ErrorCodeEnum errCode = GetEntityBase()->GetFunction()->GetEntityLastError(lpcszEntityName, errInfo);
  2141. CSimpleStringA strErrMsg(true);
  2142. if (!errInfo.strErrMsg.IsNullOrEmpty()) {
  2143. strErrMsg = CSimpleStringA::Format("%s 模块初始化失败:%s", lpcszEntityName, (LPCTSTR)errInfo.strErrMsg);
  2144. } else {
  2145. strErrMsg = CSimpleStringA::Format("%s 模块初始化失败:%s", lpcszEntityName, (LPCTSTR)SpStrError(bootFailedResult));
  2146. }
  2147. if (isBlock) {
  2148. SP::Module::Comm::LogErrorNotiyStruct notifyItem(bootFailedResult, 0);
  2149. SP::Module::Comm::LogNotiyMessageStruct notifyMsg(strErrMsg);
  2150. notifyItem.Notify(notifyMsg);
  2151. } else {
  2152. LogError(Severity_High, bootFailedResult, 0, strErrMsg);
  2153. }
  2154. #endif //RVC_OS_LINUX
  2155. }