HealthManagerFSM.cpp 63 KB

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