Browse Source

#IQRV #comment [Feature] 无root.ini情况下启动最小集安装实体

gifur 4 years ago
parent
commit
197812af35

+ 12 - 6
Module/mod_CameraConfigManage/mod_CameraConfigManage.cpp

@@ -2,6 +2,7 @@
 #include "mod_CameraConfigManage.h"
 #include "Event.h"
 #include "rec_common.h"
+#include "SpComm.hpp"
 
 #if defined(RVC_OS_WIN)
 #include <tchar.h>
@@ -82,17 +83,22 @@ void CCameraConfigManageEntity::OnPreStart(
 	CAutoArray<CSimpleStringA> strArgs,
 	CSmartPointer<ITransactionContext> pTransactionContext )
 {
+	LOG_FUNCTION();
+    ErrorCodeEnum Error;
+
 	m_eDeviceType = eStand2sType;
 	g_eDeviceType = eStand2sType;
-	LOG_FUNCTION();
-	ErrorCodeEnum Error;
 
 	CSmartPointer<IEntityFunction> spFunction = GetFunction();
 	CSystemStaticInfo stStaticinfo;
 	spFunction->GetSystemStaticInfo(stStaticinfo);
-	if (stricmp(stStaticinfo.strMachineType,"RVC.PAD")==0)
+	SP::MachineFormat::Site site = SP::MachineFormat::Str2Site(stStaticinfo.strSite);
+    SP::MachineFormat::What type = SP::MachineFormat::Str2Type(stStaticinfo.strSite);
+
+
+	if (type == SP::MachineFormat::RVC_PAD)
 	{
-		if (stricmp(stStaticinfo.strSite,"CMB.FLB")==0)
+		if (site == SP::MachineFormat::CMB_FLB)
 		{
 			LOG_TRACE("the type is mobile pad");
 			m_eDeviceType = eMobilePadType;
@@ -103,12 +109,12 @@ void CCameraConfigManageEntity::OnPreStart(
 			m_eDeviceType = ePadtype;
 		}
 	}
-	else if (stricmp(stStaticinfo.strMachineType,"RVC.Desk2S")==0)
+	else if (type == SP::MachineFormat::RVC_Desk2S)
 	{
 		LOG_TRACE("the type is Desk2S");
 		m_eDeviceType = eDesk2SType;
 	}
-	else if (stricmp(stStaticinfo.strMachineType,"RPM.Stand1S")==0)
+	else if (type == SP::MachineFormat::RPM_Stand1S)
 	{
 		LOG_TRACE("the type is RPM.Stand1S");
 		m_eDeviceType = eRpm1sType;

+ 8 - 2
Module/mod_DeviceControl/DeviceControlFSM.cpp

@@ -70,9 +70,15 @@ ErrorCodeEnum CDeviceControlFSM::OnInit()
     m_csMachineType = sysInfo.strMachineType;
     Dbg("machine type:%s", (LPCTSTR)m_csMachineType);
     CSimpleStringA dllName, tmpDevSN("");
+
+#if defined(RVC_OS_WIN)
     spEntityFunction->GetSysVar("FWBDevSN", tmpDevSN);
     m_bFWB = (tmpDevSN.GetLength() > 12 && tmpDevSN.IndexOf("FWB") > 2);
-    if (strnicmp(m_csMachineType, "RVC.PAD", strlen("RVC.PAD")) != 0 || m_bFWB) {
+#endif //RVC_OS_WIN
+
+    const bool IsNotPadType =  (m_csMachineType.IsNullOrEmpty() || m_csMachineType.Compare("RVC.PAD", true) != 0 || m_bFWB);
+
+     if(IsNotPadType) {
         CSimpleStringA csDepPath("");
         eErr = spEntityFunction->GetPath("Dep", csDepPath);
         if (eErr == Error_Succeed) {
@@ -99,7 +105,7 @@ ErrorCodeEnum CDeviceControlFSM::OnInit()
 
     InitializeTokenLib();
 
-    if (strnicmp(m_csMachineType, "RVC.PAD", strlen("RVC.PAD")) == 0 && !m_bFWB)//RVC.PAD to read root.ini
+    if (!IsNotPadType)//RVC.PAD to read root.ini
     {
         int baudRate, port;
         spConfig->ReadConfigValueInt("Device.DeviceControl", "Baudrate", baudRate);

+ 20 - 20
Module/mod_guiconsole/GUIConsoleFSM.cpp

@@ -59,31 +59,31 @@ void CGUIConsoleFSM::s1_on_entry()
     if (hWnd != NULL) {
         SendMessage(hWnd, WM_COMMAND, 419, 0);
     }
-#endif //RVC_OS_WIN
 
-	//灰显“begin initial”菜单,add by zl 20170228
+    //灰显“begin initial”菜单,add by zl 20170228
 	//加开关进行控制,add by zl 20170711
-	CSmartPointer<IConfigInfo> pConfig;
-	auto rc = m_pEntity->GetFunction()->OpenConfig(Config_CenterSetting, pConfig);
-	assert(rc == Error_Succeed);
+    CSmartPointer<IConfigInfo> pConfig;
+    auto rc = m_pEntity->GetFunction()->OpenConfig(Config_CenterSetting, pConfig);
+    assert(rc == Error_Succeed);
 
-	int nUkeyFlg = 0;
-	rc = pConfig->ReadConfigValueInt("Initializer", "SupportUkey", nUkeyFlg);
-	assert(rc == Error_Succeed);
-	Dbg("SupportUkey[%d]", nUkeyFlg);
+    int nUkeyFlg = 0;
+    rc = pConfig->ReadConfigValueInt("Initializer", "SupportUkey", nUkeyFlg);
+    assert(rc == Error_Succeed);
+    Dbg("SupportUkey[%d]", nUkeyFlg);
 
-	if (1==nUkeyFlg)
-	{
-		m_pGuiTask->ShowBeginInit(FALSE);
-	}
+    if (1 == nUkeyFlg) {
+        m_pGuiTask->ShowBeginInit(FALSE);
+    }
 
-	CSystemStaticInfo sysInfo;
-	rc = pFunc->GetSystemStaticInfo(sysInfo);
-	if (rc == Error_Succeed && !sysInfo.strMachineType.Compare("RVC.Pad", true) && !sysInfo.strSite.Compare("cmb.FLB", true)) {
-		m_pGuiTask->EnableMobileDialMenu(TRUE);
-	} else {
-		m_pGuiTask->EnableMobileDialMenu(FALSE);
-	}
+    CSystemStaticInfo sysInfo;
+    rc = pFunc->GetSystemStaticInfo(sysInfo);
+    if (rc == Error_Succeed && !sysInfo.strMachineType.Compare("RVC.Pad", true) && !sysInfo.strSite.Compare("cmb.FLB", true)) {
+        m_pGuiTask->EnableMobileDialMenu(TRUE);
+    } else {
+        m_pGuiTask->EnableMobileDialMenu(FALSE);
+    }
+
+#endif //RVC_OS_WIN
 }
 
 void CGUIConsoleFSM::s1_on_exit()

+ 1 - 0
Module/mod_healthmanager/CMakeLists.txt

@@ -7,6 +7,7 @@ set(${MODULE_PREFIX}_SRCS
 	HealthManagerFSM.h
 	TerminalInfoQueryConn.cpp
 	TerminalInfoQueryConn.h
+	EntityBootStruct.h
 	)
 
 set(MOD_VERSION_STRING "1.0.2-dev1")

+ 118 - 8
Module/mod_healthmanager/EntityBootStruct.h

@@ -3,6 +3,13 @@
 
 #include <vector>
 #include <memory>
+#include <thread>
+#include <chrono>
+#include <algorithm>
+
+#include "iniutil.h"
+
+#include "SpBase.h"
 
 #define ISSUCCEEDED(hr) ((hr) == Error_Succeed)
 #define FAILURED(hr) (!(ISSUCCEEDED(hr)))
@@ -20,14 +27,15 @@ enum EntityBootStep
     CoreBoot,
     SafeLoad,
     IEBrowser,
-    Operating
+    Operating,
+    NotConfigInit,
+    NotConfigSecond
 };
 
-class BootManager;
-
 struct EntityBootInfo
 {
     CSimpleStringA entityName;
+    CSimpleStringA cmdLine;
     EntityBootType bootType;
     ErrorCodeEnum bootResult;
     EntityBootInfo(const char* name, EntityBootType type)
@@ -38,6 +46,8 @@ struct EntityBootInfo
     }
 };
 
+struct StartEntityOperation;
+
 struct BootStep
 {
     CSimpleStringA strSectionName;
@@ -47,12 +57,32 @@ struct BootStep
     BootStep(const char* stepName) :strSectionName(stepName) {}
     virtual ~BootStep() {}
 
-    ErrorCodeEnum LoadConfig(const CSimpleStringA& configPath);
+    static ErrorCodeEnum WaitForAsyncEntitStartOperation(std::vector<StartEntityOperation*>& entityList);
+
+    ErrorCodeEnum LoadConfig(const CSimpleStringA& configPath)
+    {
+        array_header_t* keys = inifile_read_section_key_all(configPath, strSectionName);
+        if (!keys || array_empty(keys)) {
+            return Error_NotExist;
+        }
+
+        entityList.clear();
+
+        for (size_t i = 0; i < keys->nelts; ++i) {
+            char* entityName = ARRAY_IDX(keys, i, char*);
+            int bootType = inifile_read_int(configPath, strSectionName, entityName, 0);
+            Dbg("boot type info: %s=%d", entityName, bootType);
+            EntityBootInfo entityBootInfo{ entityName, static_cast<EntityBootType>(bootType) };
+            entityList.push_back(entityBootInfo);
+        }
+        toolkit_array_free2(keys);
+        return Error_Succeed;
+    }
     bool HasEntity() const
     {
         return(!entityList.empty());
     }
-    ErrorCodeEnum StartStartupEntities(BootManager* pTrigger);
+    ErrorCodeEnum StartStartupEntities(CEntityBase* pTrigger);
 };
 
 struct CoreBootStep : public BootStep
@@ -87,6 +117,22 @@ struct OperatingStep : public BootStep
     }
 };
 
+struct TerminalDeployStep : public BootStep
+{
+    TerminalDeployStep(const CSimpleStringA& sectionPosix)
+        : BootStep(CSimpleStringA("TerminalDeploy"))
+    {
+    }
+};
+
+struct TerminalDeploySecondStep : public BootStep
+{
+    TerminalDeploySecondStep(const CSimpleStringA& sectionPosix)
+        : BootStep(CSimpleStringA("TerminalDeploy.") + sectionPosix)
+    {
+    }
+};
+
 struct StartEntityBaseContext : public IReleasable
 {
     CEntityBase* theEntity;
@@ -110,7 +156,7 @@ struct StartEntitySyncContenxt : public StartEntityBaseContext
     {
         ErrorCodeEnum result(Error_Succeed);
         CSmartPointer<IAsynWaitSp> spWait;
-        result = StartEntity(entityInfo->entityName, nullptr, spWait);
+        result = StartEntity(entityInfo->entityName, entityInfo->cmdLine, spWait);
         if (ISSUCCEEDED(result) && spWait != nullptr) {
             result = spWait->WaitAnswer(60 * 1000);
         }
@@ -124,7 +170,7 @@ struct StartEntityIgnoreContenxt : public StartEntityBaseContext
     ErrorCodeEnum BootEntity(const EntityBootInfo* entityInfo)
     {
         CSmartPointer<IAsynWaitSp> spWait;
-        StartEntity(entityInfo->entityName, nullptr, spWait);
+        StartEntity(entityInfo->entityName, entityInfo->cmdLine, spWait);
         if (spWait != nullptr) {
             spWait->WaitAnswer(100);
         }
@@ -162,7 +208,7 @@ struct StartEntityAsyncContenxt : public StartEntityBaseContext, public ICallbac
         ErrorCodeEnum result(Error_Succeed);
         CSmartPointer<IAsynWaitSp> spWait;
         theFinishedState = Pending;
-        result = StartEntity(entityInfo->entityName, nullptr, spWait);
+        result = StartEntity(entityInfo->entityName, entityInfo->cmdLine, spWait);
         if (ISSUCCEEDED(result) && spWait != nullptr) {
             spWait->SetCallback(this, nullptr);
             result = Error_Pending;
@@ -214,4 +260,68 @@ struct StartEntityOperation
     EntityBootInfo& entInfo;
 };
 
+
+ErrorCodeEnum BootStep::WaitForAsyncEntitStartOperation(std::vector<StartEntityOperation*>& entityList)
+{
+    LOG_FUNCTION();
+
+    ErrorCodeEnum result = Error_Succeed;
+    for (; !entityList.empty();) {
+        auto finishedInstance = find_if(entityList.begin(), entityList.end()
+                                        , [](StartEntityOperation* operation) {
+                                            return operation->IsDone();
+                                        });
+        if (finishedInstance != entityList.end()) {
+            StartEntityOperation* operation = *finishedInstance;
+            entityList.erase(finishedInstance);
+            auto& entity = operation->entInfo;
+            if (FAILURED(entity.bootResult)) {
+                result = entity.bootResult;
+            }
+            delete operation;
+        } else {
+            std::this_thread::sleep_for(std::chrono::milliseconds(100));
+        }
+    }
+    return result;
+}
+
+
+ErrorCodeEnum BootStep::StartStartupEntities(CEntityBase* pTrigger)
+{
+    ErrorCodeEnum result = Error_Succeed;
+    if (HasEntity()) {
+        std::vector <StartEntityOperation*> pendingEntiList;
+        for (auto& entity : entityList) {
+            StartEntityOperation* startOperat = new StartEntityOperation(pTrigger, entity);
+            Dbg("to start entity: %s ...", entity.entityName);
+            result = startOperat->StartEntity();
+            if (!startOperat->IsDone()) {
+                pendingEntiList.push_back(startOperat);
+            } else {
+                if (ISSUCCEEDED(result)) {
+                    Dbg("start entity: %s successfully :)", entity.entityName);
+                } else {
+                    Dbg("start entity: %s failed :( EC: %s", entity.entityName, SpStrError(result));
+                }
+                delete startOperat;
+                if (FAILURED(result)) {
+                    break;
+                }
+            }
+        }
+
+        if (!pendingEntiList.empty()) {
+            result = WaitForAsyncEntitStartOperation(pendingEntiList);
+        }
+        [](std::vector < StartEntityOperation*>& entities) {
+            for (auto& entity : entities) {
+                delete entity;
+            }
+        }(pendingEntiList);
+    }
+
+    return result;
+}
+
 #endif

+ 0 - 1
Module/mod_healthmanager/HealthManagerFSM.cpp

@@ -63,7 +63,6 @@ ErrorCodeEnum CHealthManagerFSM::Initial()
     CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
     CSmartPointer<IAsynWaitSp> spWait;
 
-    
     ErrorCodeEnum err;
 
 	CSimpleStringA cfgPath = "";

+ 53 - 0
Module/mod_healthmanager/mod_healthmanager.cpp

@@ -28,6 +28,8 @@
 #include "fileutil.h"
 #include "iniutil.h"
 
+#include "EntityBootStruct.h"
+
 using namespace std;
 
 #include "mod_healthmanager.h"
@@ -155,6 +157,57 @@ void HealthManagerSession::Handle_DeployTerminal(SpReqAnsContext<HealthManagerSe
     m_pEntity->DeployTerminal(ctx);
 }
 
+static inline int GetDeployStepFromStatus(int status)
+{
+	if (status == DeployStep_Begin || status == DeployStep_GetTerminalInfo) {
+		return 0;
+	}
+    if (status == DeployStep_MediaConfig) {
+        return 0;
+    }
+    if (status == DeployStep_FetchCenterSettings || status == DeployStep_AccessAuthorize) {
+        return 1;
+    }
+	return -1;
+}
+
+void CHealthManagerEntity::OnStarted()
+{
+    int curStep(0);
+    const bool isNeedConfig = IsNotConfigMode(curStep);
+	if (isNeedConfig) {
+		ErrorCodeEnum result(Error_Succeed);
+		CSimpleStringA machineType = SP::Module::Comm::GetCurrMachineType(this);
+		CSimpleStringA configPath = SP::Module::Comm::GetCurrEntityConfigPath(this);
+		std::shared_ptr<TerminalDeployStep> initSteper = std::make_shared<TerminalDeployStep>("");
+		initSteper->LoadConfig(configPath);
+		result = initSteper->StartStartupEntities(this);
+		if (result != Error_Succeed) {
+			return;
+		}
+
+		const int step = GetDeployStepFromStatus(curStep);
+		for (int i = step; i > 0; --i) {
+			switch (i) {
+			case 1: //root.ini配置完成后需要继续进行配置,下载集中配置和初始化
+			{
+                LOG_ASSERT(!machineType.IsNullOrEmpty());
+                std::shared_ptr<TerminalDeploySecondStep> secSteper(nullptr);
+                secSteper = std::make_shared<TerminalDeploySecondStep>(machineType);
+                result = secSteper->StartStartupEntities(this);
+                if (result != Error_Succeed) {
+                    return;
+                }
+			}
+				break;
+			default:
+				break;
+			}
+		}
+
+	}
+}
+
 bool CHealthManagerEntity::DoWatchDog(WatchDogOp eOp)
 {
 	switch(eOp)

+ 10 - 4
Module/mod_healthmanager/mod_healthmanager.h

@@ -103,12 +103,15 @@ public:
 
 	virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext) 
 	{
+        ErrorCodeEnum eErrCode(Error_Succeed);
+
 		int curStep(0);
 		bool isNeedConfig = IsNotConfigMode(curStep);
 
-		if(!isNeedConfig) DoRestart();
-		
-		ErrorCodeEnum eErrCode = m_fsm.Init(this);
+		if (!isNeedConfig) {
+			DoRestart();
+			eErrCode = m_fsm.Init(this);
+		}
 
 		GetFunction()->SubscribeLog(m_uuidUpdate,this,Log_Event,Severity_Middle,Error_IgnoreAll,-1,"UpgradeManager");
 		GetFunction()->SubscribeLog(m_uuidAccessAuth,this,Log_Event,Severity_Middle,Error_IgnoreAll,-1,"AccessAuthorization");
@@ -140,11 +143,13 @@ public:
 		pTransactionContext->SendAnswer(eErrCode) ;
 	}
 
+	void OnStarted() override;
 	
 	virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext) 
 	{ 
 		pTransactionContext->SendAnswer(Error_Succeed); 
 	}
+
 	void EnterState(SpReqAnsContext<HealthManagerService_EnterState_Req, HealthManagerService_EnterState_Ans>::Pointer ctx)
 	{
 		if (ctx->Req.state == "M")
@@ -205,7 +210,6 @@ public:
 	void ReadCenterConfigStr(SpReqAnsContext<HealthManagerService_ReadCenterConfigStr_Req, HealthManagerService_ReadCenterConfigStr_Ans>::Pointer ctx);
 	void ControlTerminalLife(SpReqAnsContext<HealthManagerService_ControlTerminalLife_Req, HealthManagerService_ControlTerminalLife_Ans>::Pointer ctx);
 
-
 	virtual void OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
 		const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID, 
 		const CAutoArray<DWORD> &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage);
@@ -220,7 +224,9 @@ public:
 	 * @return : true: 为未配置模式,false:正常模式
 	 */
 	bool IsNotConfigMode(int& stepMode);
+
 private:
+
 	CHealthManagerFSM m_fsm;
 	//the following is useless?just one var is ok? oiltmp
 	CUUID m_uuidUpdate,m_uuidMediaController,m_uuidFaceTracking,m_uuidAccessAuth,m_uuidInitializer,m_uuidSelfChecker

+ 2 - 2
addin/cfg/HealthManager.ini

@@ -64,12 +64,12 @@ ScannerSet=0
 ContactlessCard=0
 FingerPrint=0
 
-[ConfigBegin.RVC.Stand2S]
+[TerminalDeploy]
 DeviceControl=2
 CameraConfigManage=2
 Chromium=2
 
-[ConfigServer.RVC.Stand2S]
+[TerminalDeploy.RVC.Stand2S]
 PinPad=2
 CenterSetting=2
 Initializer=2