HealthManagerFSM.cpp 73 KB

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