HealthManagerFSM.cpp 72 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565
  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. pConfig->ReadConfigValueInt("TerminalDeploy", "CurrStep", curStep);
  2280. if (curStep == DeployStep_Finished) {
  2281. pConfig->ReadConfigValueInt("TerminalDeploy", "CurrState", stepStatus);
  2282. pConfig->ReadConfigValueInt("TerminalDeploy", "TimeStamp", lastRecordTime);
  2283. LogWarn(Severity_High, Error_Debug, LOG_WARN_HEALTH_INSTALL_TIMESTAMP,
  2284. CSimpleString::Format("[{\"timeStamp\":\"%s\",\"step\":%d,\"state\":%d}]",
  2285. CSmallDateTime(lastRecordTime).ToTimeString().GetData(), curStep, stepStatus));
  2286. pConfig->WriteConfigValueInt("TerminalDeploy", "CurrStep", DeployStep_Begin);
  2287. pConfig->WriteConfigValueInt("TerminalDeploy", "CurrState", DEPLOYSTATE_NOTINIT);
  2288. pConfig->WriteConfigValue("TerminalDeploy", "TimeStamp", CSimpleStringA::Format("0x%08X", (DWORD)CSmallDateTime::GetNow()));
  2289. }
  2290. }
  2291. void CHealthManagerFSM::ShowEntityBootFailedAtFront(LPCTSTR lpcszEntityName, ErrorCodeEnum bootFailedResult, bool isBlock)
  2292. {
  2293. #if defined(RVC_OS_LINUX)
  2294. CEntityLastErrorInfo errInfo = {};
  2295. ErrorCodeEnum errCode = GetEntityBase()->GetFunction()->GetEntityLastError(lpcszEntityName, errInfo);
  2296. CSimpleStringA strErrMsg(true);
  2297. if (!errInfo.strErrMsg.IsNullOrEmpty()) {
  2298. strErrMsg = CSimpleStringA::Format("%s 模块初始化失败:%s", lpcszEntityName, (LPCTSTR)errInfo.strErrMsg);
  2299. } else {
  2300. strErrMsg = CSimpleStringA::Format("%s 模块初始化失败:%s", lpcszEntityName, (LPCTSTR)SpStrError(bootFailedResult));
  2301. }
  2302. if (isBlock) {
  2303. SP::Module::Comm::LogErrorNotiyStruct notifyItem(bootFailedResult, 0);
  2304. SP::Module::Comm::LogNotiyMessageStruct notifyMsg(strErrMsg);
  2305. notifyItem.Notify(notifyMsg);
  2306. } else {
  2307. LogError(Severity_High, bootFailedResult, 0, strErrMsg);
  2308. }
  2309. #endif //RVC_OS_LINUX
  2310. }
  2311. void CHealthManagerFSM::ToCallAccessAuthDoWork()
  2312. {
  2313. if (!m_bInAccessAuthDoWork)
  2314. {
  2315. Dbg("ToCallAccessAuthDoWork");
  2316. AccessAuthTask* pTask = new AccessAuthTask(this);
  2317. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  2318. }
  2319. }
  2320. void CHealthManagerFSM::JudgeIfNeedInitFWB()
  2321. {
  2322. LOG_FUNCTION();
  2323. CSimpleStringA csFWBDevSN("");
  2324. GetEntityBase()->GetFunction()->GetSysVar("FWBDevSN", csFWBDevSN);
  2325. if (csFWBDevSN.GetLength() > 12 && csFWBDevSN.IndexOf("FWB") > 2)
  2326. {
  2327. Dbg("This is fwb,we need to check if update master key.");
  2328. FWBDoInitTask* pTask = new FWBDoInitTask(this);
  2329. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  2330. }
  2331. }
  2332. void CHealthManagerFSM::FWBDoInit()
  2333. {
  2334. LOG_FUNCTION();
  2335. Sleep(2000);
  2336. CSimpleStringA currCheckCode(""), runcfgCkCode("");
  2337. QueryCheckCode(currCheckCode, true);
  2338. CSmartPointer<IConfigInfo> spConfigRun;
  2339. GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  2340. spConfigRun->ReadConfigValue("Run", "ckCode", runcfgCkCode);
  2341. //Dbg("oiltest currCheckCode[%s],runcfgCheckCode[%s]", (const char*)currCheckCode,(const char*)runcfgCkCode);
  2342. if (!currCheckCode.IsNullOrEmpty() && !runcfgCkCode.IsNullOrEmpty() && !currCheckCode.Compare(runcfgCkCode))
  2343. {
  2344. Dbg("check code is the same.");
  2345. return;
  2346. }
  2347. else
  2348. {
  2349. }
  2350. ErrorCodeEnum eErr;
  2351. if (m_pInitClient == NULL)
  2352. {
  2353. m_pInitClient = new InitializerService_ClientBase(this->GetEntityBase());
  2354. eErr = m_pInitClient->Connect();
  2355. if (eErr != Error_Succeed) {
  2356. Dbg("Initializer connected failed.");
  2357. m_pInitClient->SafeDelete();
  2358. m_pInitClient = NULL;
  2359. return;
  2360. }
  2361. else
  2362. Dbg("Initializer connected.");
  2363. }
  2364. InitializerService_GetAuthServerInfo_Req getAuthInfoReq;
  2365. InitializerService_GetAuthServerInfo_Ans getAuthInfoAns;
  2366. eErr = m_pInitClient->GetAuthServerInfo(getAuthInfoReq, getAuthInfoAns,10000);
  2367. if (eErr == Error_Succeed)
  2368. {
  2369. InitializerService_InitializeForBlueTooth_Req initReq;
  2370. InitializerService_InitializeForBlueTooth_Ans initAns;
  2371. initReq.strAuthServer = getAuthInfoAns.strIP;
  2372. initReq.nAuthPort = getAuthInfoAns.nPort;
  2373. initReq.strUserID = "admin";
  2374. initReq.strPassword = "";
  2375. initReq.type = 1;
  2376. eErr = m_pInitClient->InitializeForBlueTooth(initReq, initAns, 60000);
  2377. if (eErr == Error_Succeed)
  2378. {
  2379. Dbg("InitializeForBlueTooth suc.");
  2380. Dbg("write new check code.");
  2381. QueryCheckCode(currCheckCode, true);
  2382. spConfigRun->WriteConfigValue("Run", "ckCode", currCheckCode);
  2383. LogWarn(Severity_Low, Error_Unexpect, HealthManager_UserErrorCode_InitForFWB_Init_Suc, "Init for fwb suc.");
  2384. }
  2385. else
  2386. {
  2387. Dbg("InitializeForBlueTooth failed:%d",eErr);
  2388. LogWarn(Severity_Low, Error_Unexpect, HealthManager_UserErrorCode_InitForFWB_Init_Fail, "Init for fwb failed.");
  2389. }
  2390. }
  2391. else
  2392. {
  2393. Dbg("GetAuthServerInfo failed:%d", eErr);
  2394. LogWarn(Severity_Low, Error_Unexpect, HealthManager_UserErrorCode_InitForFWB_GetAuthAddr_Fail, "Init for fwb,get authaccess address suc.");
  2395. }
  2396. return;
  2397. }
  2398. bool CHealthManagerFSM::IsCutIEBrowser()
  2399. {
  2400. LOG_FUNCTION();
  2401. CSimpleStringA key = "CutBrowser.";
  2402. CSmartPointer<IConfigInfo> spCerConfig;
  2403. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spCerConfig);
  2404. if (eErr == Error_Succeed)
  2405. {
  2406. int tmpCut = 0;
  2407. key += m_sysInfo.strMachineType;
  2408. spCerConfig->ReadConfigValueInt("Common", key, tmpCut);
  2409. if (tmpCut == 1)
  2410. return true;
  2411. }
  2412. return false;
  2413. //if (m_sysInfo.strMachineType.Compare("RVC.Stand2S",true) == 0 || m_sysInfo.strMachineType.Compare("RVC.PAD", true) == 0)
  2414. // return true;
  2415. //else
  2416. // return false;
  2417. }