HealthManagerFSM.cpp 72 KB

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