Selaa lähdekoodia

#IQRV #comment 合并VTMLoader

gifur 1 vuosi sitten
vanhempi
sitoutus
a417a71f27
72 muutettua tiedostoa jossa 3902 lisäystä ja 3259 poistoa
  1. 1 1
      CMakeLists.txt
  2. 1 37
      CMakePresets.json
  3. 0 66
      CMakeSettings.json
  4. 1 2
      Module/CMakeLists.txt
  5. 124 82
      Module/include/CommEntityUtil.hpp
  6. 5 9
      Module/include/EventCode.h
  7. 2 0
      Module/mod_CenterSetting/CMakeLists.txt
  8. 10 31
      Module/mod_CenterSetting/mod_centersetting.cpp
  9. 18 2
      Module/mod_CustMngrAuth/CustMngrAuthFSM.cpp
  10. 10 3
      Module/mod_DeviceControl/mod_DeviceControl.cpp
  11. 3 2
      Module/mod_IDCertificate/IDCertFSM.cpp
  12. 2 1
      Module/mod_IDCertificate/IDCertFSM.h
  13. 0 39
      Module/mod_ResourceWatcher/ResourceWatcherFSM.cpp
  14. 39 2
      Module/mod_ResourceWatcher/ResourceWatcherFSM.h
  15. 596 647
      Module/mod_accessauth/AccessAuthFSM.cpp
  16. 0 21
      Module/mod_accessauth/AccessAuthFSM.h
  17. 68 37
      Module/mod_accessauth/mod_AccessAuth.cpp
  18. 25 7
      Module/mod_cardissuer/CardIssuerFSM.cpp
  19. 1 0
      Module/mod_chromium/CSocketClient.cpp
  20. 2 0
      Module/mod_chromium/CWebsocketServer.cpp
  21. 36 16
      Module/mod_chromium/mod_chromium.cpp
  22. 4 2
      Module/mod_chromium/mod_chromium.h
  23. 0 90
      Module/mod_chromium/portCheck/portCheck.cpp
  24. 0 2
      Module/mod_chromium/portCheck/portCheck.h
  25. 12 0
      Module/mod_guiconsole/GUIConsole_def_g.h
  26. 0 5
      Module/mod_guiconsole/guitask.cpp
  27. 0 1
      Module/mod_healthmanager/CMakeLists.txt
  28. 63 52
      Module/mod_healthmanager/HealthManagerFSM.cpp
  29. 7 8
      Module/mod_healthmanager/HealthManagerFSM.h
  30. 87 321
      Module/mod_healthmanager/mod_healthmanager.cpp
  31. 36 23
      Module/mod_healthmanager/mod_healthmanager.h
  32. 38 58
      Module/mod_pinpad/PinPadFSM.cpp
  33. 7 9
      Module/mod_pinpad/PinPadFSM.h
  34. 3 1
      Module/mod_pinpad/PinPad_UserErrorCode.h
  35. 0 147
      Module/mod_pinpad/PinPad_client_g.h
  36. 3 87
      Module/mod_pinpad/PinPad_def_g.h
  37. 0 81
      Module/mod_pinpad/PinPad_server_g.h
  38. 10 43
      Module/mod_pinpad/pinpad.xml
  39. 41 112
      Module/mod_selfchecker/SelfCheckerFSM.cpp
  40. 3 5
      Module/mod_selfchecker/SelfCheckerFSM.h
  41. 17 0
      Module/mod_selfchecker/mod_selfchecker.cpp
  42. 3 2
      Module/mod_selfchecker/mod_selfchecker.h
  43. 0 26
      Module/mod_ups/CMakeLists.txt
  44. 0 238
      Module/mod_ups/UpsFSM.cpp
  45. 0 138
      Module/mod_ups/UpsFSM.h
  46. 0 277
      Module/mod_ups/Ups_client_g.h
  47. 0 114
      Module/mod_ups/Ups_def_g.h
  48. 0 191
      Module/mod_ups/Ups_server_g.h
  49. 0 118
      Module/mod_ups/mod_ups.cpp
  50. 0 33
      Module/mod_ups/ups.xml
  51. 35 0
      Module/mod_vtmloader/CMakeLists.txt
  52. 1585 0
      Module/mod_vtmloader/VtmLoaderFSM.cpp
  53. 197 0
      Module/mod_vtmloader/VtmLoaderFSM.h
  54. 8 0
      Module/mod_vtmloader/VtmLoader_UserCode.h
  55. 130 0
      Module/mod_vtmloader/VtmLoader_client_g.h
  56. 45 0
      Module/mod_vtmloader/VtmLoader_def_g.h
  57. 109 0
      Module/mod_vtmloader/VtmLoader_server_g.h
  58. 53 0
      Module/mod_vtmloader/mod_vtmloader.cpp
  59. 63 0
      Module/mod_vtmloader/mod_vtmloader.h
  60. 163 0
      Module/mod_vtmloader/resource.h
  61. 8 0
      Module/mod_vtmloader/stdafx.cpp
  62. 44 0
      Module/mod_vtmloader/stdafx.h
  63. 94 0
      Module/mod_vtmloader/tokenDefine.h
  64. 11 0
      Module/mod_vtmloader/vtmloader.xml
  65. 1 0
      Other/libpublicFun/CMakeLists.txt
  66. 1 17
      Other/libpublicFun/portCheck.cpp
  67. 6 0
      addin/cfg/UserCodeToMsgTip.ini
  68. 2 2
      addin/cfg/shell.ini.in
  69. 12 0
      addin/res/ManagerDesktop/css/errType.css
  70. 2 2
      addin/res/ManagerDesktop/entityCheck.html
  71. 54 48
      addin/res/ManagerDesktop/js/entityCheck.js
  72. 1 1
      addin/res/ManagerDesktop/js/entityService.js

+ 1 - 1
CMakeLists.txt

@@ -284,7 +284,7 @@ if(CONAN_CACHE_CLEAR)
 	conan_local_remove()
 endif(CONAN_CACHE_CLEAR)
 
-conan_cmake_run(REQUIRES RvcFramework/1.2.0.32@LR04.02_FrameworkLib/dev
+conan_cmake_run(REQUIRES RvcFramework/1.2.0.42@LR04.02_FrameworkLib/dev
 	Audio/2023.0509.01@LR04.02_MediaRes/testing
 BASIC_SETUP CMAKE_TARGETS)
 include(DependencyConanFiles)

+ 1 - 37
CMakePresets.json

@@ -1,27 +1,7 @@
 {
   "version": 2,
   "configurePresets": [
-    {
-      "name": "linux-default",
-      "displayName": "Linux Debug",
-      "description": "面向适用于 Linux 的 Windows 子系统(WSL)或远程 Linux 系统。",
-      "generator": "Unix Makefiles",
-      "binaryDir": "${sourceDir}/out/build/${presetName}",
-      "cacheVariables": {
-        "CMAKE_BUILD_TYPE": "Debug",
-        "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}",
-        "SIMULATE_ON": {
-          "value": "False",
-          "type": "BOOL"
-        },
-        "BUILD_TESTING": "OFF",
-        "BUILD_DEVADAPTER": "ON"
-      },
-      "vendor": {
-        "microsoft.com/VisualStudioSettings/CMake/1.0": { "hostOS": [ "Linux" ] },
-        "microsoft.com/VisualStudioRemoteSettings/CMake/1.0": { "sourceDir": "$env{HOME}/.vs/$ms{projectDirName}" }
-      }
-    },
+
     {
       "name": "linux-release",
       "displayName": "Linux Release",
@@ -42,22 +22,6 @@
         "microsoft.com/VisualStudioSettings/CMake/1.0": { "hostOS": [ "Linux" ] },
         "microsoft.com/VisualStudioRemoteSettings/CMake/1.0": { "sourceDir": "$env{HOME}/.vs/$ms{projectDirName}" }
       }
-    },
-    {
-      "name": "windows-default",
-      "displayName": "Windows x64 Debug",
-      "description": "面向具有 Visual Studio 开发环境的 Windows。",
-      "generator": "Ninja",
-      "binaryDir": "${sourceDir}/out/build/${presetName}",
-      "architecture": {
-        "value": "x64",
-        "strategy": "external"
-      },
-      "cacheVariables": {
-        "CMAKE_BUILD_TYPE": "Debug",
-        "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}"
-      },
-      "vendor": { "microsoft.com/VisualStudioSettings/CMake/1.0": { "hostOS": [ "Windows" ] } }
     }
   ]
 }

+ 0 - 66
CMakeSettings.json

@@ -1,71 +1,5 @@
 {
   "configurations": [
-    {
-      "name": "x86-Debug",
-      "generator": "Visual Studio 16 2019",
-      "configurationType": "Debug",
-      "buildRoot": "${projectDir}\\out\\build\\${name}",
-      "installRoot": "${projectDir}\\out\\install\\${name}",
-      "cmakeCommandArgs": "-D BUILD_TESTING=ON -D BUILD_DEVADAPTER=ON",
-      "buildCommandArgs": "",
-      "ctestCommandArgs": "-C Debug",
-      "inheritEnvironments": [ "msvc_x86" ],
-      "variables": [
-        {
-          "name": "SIMULATE_ON",
-          "value": "False",
-          "type": "BOOL"
-        },
-        {
-          "name": "BUILD_DEVADAPTER",
-          "value": "True",
-          "type": "BOOL"
-        },
-        {
-          "name": "BUILD_SAMPLES",
-          "value": "False",
-          "type": "BOOL"
-        }
-      ]
-    },
-    {
-      "name": "x86-Release",
-      "generator": "Visual Studio 16 2019",
-      "configurationType": "Release",
-      "buildRoot": "${projectDir}\\out\\build\\${name}",
-      "installRoot": "${projectDir}\\out\\install\\${name}",
-      "cmakeCommandArgs": "-D BUILD_TESTING=OFF",
-      "buildCommandArgs": "",
-      "ctestCommandArgs": "-C Release",
-      "inheritEnvironments": [ "msvc_x86" ]
-    },
-    {
-      "name": "ARM64-GCC-Debug",
-      "generator": "Unix Makefiles",
-      "configurationType": "Debug",
-      "cmakeExecutable": "cmake",
-      "remoteCopySourcesExclusionList": [ ".vs", ".git", "out" ],
-      "cmakeCommandArgs": "-D BUILD_TESTING=OFF -D WITH_CI_NUMBER=OFF -D SIMULATE_ON=OFF -D BUILD_DEVADAPTER=ON",
-      "buildCommandArgs": "",
-      "ctestCommandArgs": "--output-on-failure",
-      "inheritEnvironments": [ "linux_arm" ],
-      "remoteMachineName": "${defaultRemoteMachineName}",
-      "remoteCMakeListsRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/src",
-      "remoteBuildRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/out/build/${name}",
-      "remoteInstallRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/out/install/${name}",
-      "remoteCopySources": true,
-      "rsyncCommandArgs": "-t --delete --delete-excluded --exclude \"/build\" --exclude \"/out\" --exclude-from=.gitignore",
-      "remoteCopyBuildOutput": false,
-      "remoteCopySourcesMethod": "rsync",
-      "addressSanitizerRuntimeFlags": "detect_leaks=0",
-      "variables": [
-        {
-          "name": "SIMULATE_ON",
-          "value": "False",
-          "type": "BOOL"
-        }
-      ]
-    },
     {
       "name": "ARM64-GCC-Release",
       "generator": "Unix Makefiles",

+ 1 - 2
Module/CMakeLists.txt

@@ -188,12 +188,10 @@ add_subdirectory(mod_evtconverter)
 add_subdirectory(mod_interactivelog)
 add_subdirectory(mod_chromium)
 
-add_subdirectory(mod_ups)
 add_subdirectory(mod_ScannerSet)
 add_subdirectory(mod_HSPScanner)
 add_subdirectory(mod_ContactlessCard)
 add_subdirectory(mod_gpio)
-add_subdirectory(mod_watchdog)
 add_subdirectory(mod_DeviceControl)
 add_subdirectory(mod_facetracking)
 add_subdirectory(mod_initiativetransfer)
@@ -211,6 +209,7 @@ add_subdirectory(mod_alarm)
 add_subdirectory(mod_RomoteController)
 add_subdirectory(mod_ResourceWatcher)
 add_subdirectory(mod_livenessdetection)
+add_subdirectory(mod_vtmloader)
 
 #below should be compiled succesufully.
 add_subdirectory(mod_SalesRecorder)

+ 124 - 82
Module/include/CommEntityUtil.hpp

@@ -18,7 +18,8 @@
 #define streq stricmp
 
 #else
-
+#include <linux/ethtool.h>
+#include <linux/sockios.h>
 #include <net/if.h>
 #include <sys/ioctl.h>
 #include <unistd.h>
@@ -44,7 +45,7 @@
 #define MINUS_DIV (60)
 
 typedef unsigned long long ULLINT;
-typedef CAutoArray<CSimpleStringA>  NetworkAddressesList;
+
 
 #define SLEEP(interval) std::this_thread::sleep_for(std::chrono::milliseconds(interval))
 
@@ -735,7 +736,7 @@ static bool IsLocalAdapter(const std::string& name)
 #endif //_MSC_VER
 	}
 
-static ErrorCodeEnum GetINETMacAddresses(NetworkAddressesList& macList, NetworkAddressesList& ipList)
+static ErrorCodeEnum GetINETMacAddresses(CAutoArray<NetworkAdapterItem>& netLists)
 {
 #if defined(RVC_OS_WIN)
 	PIP_ADAPTER_ADDRESSES pAddresses = NULL;
@@ -760,9 +761,12 @@ static ErrorCodeEnum GetINETMacAddresses(NetworkAddressesList& macList, NetworkA
 	}
 	PIP_ADAPTER_ADDRESSES pFirst = pAddresses;
 	while (pAddresses) {
-		if (pAddresses->FirstUnicastAddress->Address.lpSockaddr->sa_family == AF_INET &&
+		if (pAddresses->FirstUnicastAddress &&
+			pAddresses->IfType != IF_TYPE_SOFTWARE_LOOPBACK &&
 			pAddresses->OperStatus == IfOperStatusUp &&
-			pAddresses->IfType != IF_TYPE_SOFTWARE_LOOPBACK) {
+			pAddresses->FirstUnicastAddress->Address.lpSockaddr->sa_family == AF_INET 
+			) {
+			NetworkAdapterItem netItem;
 			BYTE* pa = pAddresses->PhysicalAddress;
 			if (!pa) {
 				pAddresses = pAddresses->Next ? pAddresses->Next : NULL;
@@ -805,96 +809,134 @@ static ErrorCodeEnum GetINETMacAddresses(NetworkAddressesList& macList, NetworkA
 				bAddressInt[4],
 				bAddressInt[5]);
 
-			macList.Append(&tmpmac, 0, 1);
 			sockaddr_in* sa_in = (sockaddr_in*)pAddresses->FirstUnicastAddress->Address.lpSockaddr;
 			char buf_addr[100] = { 0 };
 			CSimpleStringA tmpip = CSimpleStringA(inet_ntop(AF_INET, &(sa_in->sin_addr), buf_addr, 100));
-			ipList.Append(&tmpip, 0, 1);
+			
+			if (tmpip.Compare("127.0.0.1") == 0 && tmpmac.Compare("00:00:00:00:00:00") == 0) {
+				//skip
+			}
+			else
+			{
+				netItem.friend_name = strFriendlyName;
+				netItem.description = strDescription;
+				netItem.mac = tmpmac;
+				netItem.ip = tmpip;
+				netItem.operStatus = (pAddresses->OperStatus == IfOperStatusUp) ? 1 : 0;//stay the same value with Linux/UOS
+				netItem.type = pAddresses->IfType;
+				netLists.Append(&netItem, 0, 1);
+			}
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s, %s: OperStatus: %d, IfType = %d, ip=%s, mac=%s"
 				, strFriendlyName.GetData(), strDescription.GetData()
 				, pAddresses->OperStatus, pAddresses->IfType, tmpip.GetData(), tmpmac.GetData());
-}
+		}
 		pAddresses = pAddresses->Next ? pAddresses->Next : NULL;
-}
+	}
 	HeapFree(GetProcessHeap(), 0, pFirst);
 	return Error_Succeed;
 
 #else
-    std::map<std::string, std::string> inteIPs;
-    std::map<std::string, std::string> inteMacs;
-
-    char buf[512];
-    toolkit_interface_address_t* info;
-    int count, i;
-    toolkit_interface_addresses(&info, &count);
-    i = count;
-    Dbg("Number of interfaces: %d", count);
-    while (i--) {
-        toolkit_interface_address_t interface = info[i];
-
-        Dbg("Name: %s", interface.name);
-        Dbg("Internal? %s", interface.is_internal ? "Yes" : "No");
-        if (interface.address.address4.sin_family == AF_INET) {
-            toolkit_ip4_name(&interface.address.address4, buf, sizeof(buf));
-            Dbg("IPv4 address: %s", buf);
-            inteIPs[interface.name] = buf;
-        } else if (interface.address.address4.sin_family == AF_INET6) {
-            toolkit_ip6_name(&interface.address.address6, buf, sizeof(buf));
-            Dbg("IPv6 address: %s", buf);
-            //inteIPs[interface.name] = buf;
-        }
-    }
+	std::map<std::string, std::string> inteIPs;
+	std::map<std::string, std::string> inteMacs;
+	std::map<std::string, int> inteStatus;
+
+	char buf[512];
+	toolkit_interface_address_t* info;
+	int count, i;
+	toolkit_interface_addresses(&info, &count);
+	i = count;
+	Dbg("Number of interfaces: %d", count);
+	while (i--) {
+		toolkit_interface_address_t interface = info[i];
+
+		Dbg("Name: %s", interface.name);
+		Dbg("Internal? %s", interface.is_internal ? "Yes" : "No");
+		if (interface.address.address4.sin_family == AF_INET) {
+			toolkit_ip4_name(&interface.address.address4, buf, sizeof(buf));
+			Dbg("IPv4 address: %s", buf);
+			inteIPs[interface.name] = buf;
+		}
+		else if (interface.address.address4.sin_family == AF_INET6) {
+			toolkit_ip6_name(&interface.address.address6, buf, sizeof(buf));
+			Dbg("IPv6 address: %s", buf);
+			//inteIPs[interface.name] = buf;
+		}
+	}
 
-    toolkit_free_interface_addresses(info, count);
-    {
-        int fd, interface;
-        struct ifreq buf[16];
-        struct ifconf ifc;
-        char mac[32] = { 0 };
-        if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) {
-            int i = 0;
-            ifc.ifc_len = sizeof(buf);
-            ifc.ifc_buf = (caddr_t)buf;
-            if (!ioctl(fd, SIOCGIFCONF, (char*)&ifc)) {
-                interface = ifc.ifc_len / sizeof(struct ifreq);
-                Dbg("interface num is %d", interface);
-                while (i < interface) {
-                    Dbg("Name: %s", buf[i].ifr_name);
-                    if (!(ioctl(fd, SIOCGIFHWADDR, (char*)&buf[i]))) {
-                        sprintf(mac, "%02X:%02X:%02X:%02X:%02X:%02X",
-                                (unsigned char)buf[i].ifr_hwaddr.sa_data[0],
-                                (unsigned char)buf[i].ifr_hwaddr.sa_data[1],
-                                (unsigned char)buf[i].ifr_hwaddr.sa_data[2],
-                                (unsigned char)buf[i].ifr_hwaddr.sa_data[3],
-                                (unsigned char)buf[i].ifr_hwaddr.sa_data[4],
-                                (unsigned char)buf[i].ifr_hwaddr.sa_data[5]);
-                        Dbg("HWaddr %s", mac);
-                        inteMacs[buf[i].ifr_name] = mac;
-                    }
-                    i++;
-                }
-            }
-            close(fd);
-        }
-    }
+	toolkit_free_interface_addresses(info, count);
+
+	int fd, interface;
+	struct ifreq bufIfreq[16];
+	struct ifconf ifc;
+	char mac[32] = { 0 };
+	if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) {
+		int i = 0;
+		ifc.ifc_len = sizeof(bufIfreq);
+		ifc.ifc_buf = (caddr_t)bufIfreq;
+		if (!ioctl(fd, SIOCGIFCONF, (char*)& ifc)) {
+			interface = ifc.ifc_len / sizeof(struct ifreq);
+			Dbg("interface num is %d", interface);
+			while (i < interface) {
+				Dbg("Name: %s", bufIfreq[i].ifr_name);
+				if (!(ioctl(fd, SIOCGIFHWADDR, (char*)& bufIfreq[i]))) {
+					sprintf(mac, "%02X:%02X:%02X:%02X:%02X:%02X",
+						(unsigned char)bufIfreq[i].ifr_hwaddr.sa_data[0],
+						(unsigned char)bufIfreq[i].ifr_hwaddr.sa_data[1],
+						(unsigned char)bufIfreq[i].ifr_hwaddr.sa_data[2],
+						(unsigned char)bufIfreq[i].ifr_hwaddr.sa_data[3],
+						(unsigned char)bufIfreq[i].ifr_hwaddr.sa_data[4],
+						(unsigned char)bufIfreq[i].ifr_hwaddr.sa_data[5]);
+					Dbg("HWaddr %s", mac);
+					inteMacs[bufIfreq[i].ifr_name] = mac;
+				}
+				struct ethtool_value edata;
+
+				edata.cmd = ETHTOOL_GLINK;
+				edata.data = 0;
+				bufIfreq[i].ifr_data = (char*)& edata;
+				//oiltmp@20231026 只检测了以太网卡
+				if (ioctl(fd, SIOCETHTOOL, (char*)& bufIfreq[i]) == -1) {
+					//up down
+					Dbg("Name: %s is down", bufIfreq[i].ifr_name);
+					inteStatus[bufIfreq[i].ifr_name] = 0;
+				}
+				else
+				{
+					Dbg("Name: %s is up", bufIfreq[i].ifr_name);
+					inteStatus[bufIfreq[i].ifr_name] = 1;
+				}
+				i++;
+			}
+		}
+		close(fd);
+	}
 
-    std::map<std::string, std::string>::const_iterator map_it = inteIPs.begin();
-    while (map_it != inteIPs.end()) {
-        CSimpleStringA tmpip(map_it->second.c_str());
-        CSimpleStringA tmpmac(true);
-        auto it = inteMacs.find(std::string(map_it->first));
-        if (it != inteMacs.end()) {
-            tmpmac = it->second.c_str();
-        }
-        if (tmpip.Compare("127.0.0.1") == 0 && tmpmac.Compare("00:00:00:00:00:00") == 0) {
-            //skip
-        } else {
-            ipList.Append(&tmpip, 0, 1);
-            macList.Append(&tmpmac, 0, 1);
-        }
-        ++map_it;
-    }
-    return Error_Succeed;
+	std::map<std::string, std::string>::const_iterator map_it = inteIPs.begin();
+	while (map_it != inteIPs.end()) {
+		NetworkAdapterItem netItem;
+		CSimpleStringA tmpip(map_it->second.c_str());
+		CSimpleStringA tmpmac(true);
+		CSimpleStringA tmpname(true);
+		auto it = inteMacs.find(std::string(map_it->first));
+		if (it != inteMacs.end()) {
+			tmpmac = it->second.c_str();
+		}
+		if (tmpip.Compare("127.0.0.1") == 0 && tmpmac.Compare("00:00:00:00:00:00") == 0) {
+			//skip
+		}
+		else {
+			tmpname = map_it->first.c_str();
+			netItem.friend_name = "";//oiltmp
+			netItem.description = tmpname;
+			netItem.mac = tmpmac;
+			netItem.ip = tmpip;
+			netItem.operStatus = inteStatus[map_it->first];
+			netItem.type = 6;//oiltest haven't find the in linux
+			netLists.Append(&netItem, 0, 1);
+		}
+		++map_it;
+	}
+	return Error_Succeed;
 
 #endif //RVC_OS_WIN
 

+ 5 - 9
Module/include/EventCode.h

@@ -81,6 +81,11 @@ static const char* Device_Type_Table[] = {
 #define EVENT_MOD_DOWNLOAD_STARTSYNC			0x10500032		// 开始同步
 #define EVENT_MOD_DOWNLOAD_SYNCHRONIZED			0x10500031		// 完成同步
 
+#define Event_VtmLoader_GetConfig_Suc 			0x10f00001	//配置拉取完成
+#define Event_VtmLoader_EntityLoad_Finished 	0x10f00002	//实体加载完成
+#define Event_VtmLoader_EntityLoad_Failed 		0x10f00003	//实体加载失败
+#define Event_VtmLoader_GetConfig_Fail 		0x10f00004	//配置拉取失败
+
 #ifndef _WIN32
 /*----MaintainWatcher--modify--by--LZM--at--2020/4/8----*/
 #define EVENT_UKEY_INSERTED  						 0x21000001  //维护证书插入,检测到维护证书插入
@@ -151,12 +156,6 @@ static const char* Device_Type_Table[] = {
 /*----AccessAuth--modify--by--LZM--at--2020/4/8----*/
 #define EVENT_ACCESSAUTH_SUCCEED                     0x50200001  //准入成功
 
-#define LOG_WARN_ACCESS_GET_DNS_CUST		         0x50200030  //获取DNS成功
-#define LOG_WARN_ACCESS_SET_DNS_CUST		         0x50200031  //设置DNS成功
-#define LOG_ERR_ACCESS_SET_DNS_FAILED		         0x50200032
-#define LOG_WARN_ACCESS_DELETE_DNS_CUST	             0x50200033
-#define LOG_ERR_ACCESS_DELETE_DNS_FAILED	         0x50200034
-
 #define EVENT_ACCESSAUTH_FAILED                      0x50280002  //准入失败
 #define EVENT_ACCESSAUTH_TIMEOUT                     0x50280003  //准入超时
 #define ERROR_ACCESSAUTH_SETTIMEZONE                 0x50280004  //设置系统标准时区失败
@@ -734,9 +733,6 @@ ERROR_ACCESSAUTH_CONNECT_ACS_x}
 #define	LOG_EVT_IEBROWSER_LIGHT_ASSISTANT_OFF	0x401000F4	//灯光提示工作人员协助 关闭
 #define	LOG_EVT_IEBROWSER_RESTART_MACHINE	0x401000F5	//用户桌面,立即重启电脑
 #define	LOG_EVT_IEBROWSER_SHUTDOWN_MACHINE	0x401000F6	//用户桌面,立即关闭电脑
-/*国产化新增开始*/
-#define	LOG_EVT_IEBROWSER_SHUTDOWN_MACHINE_THROUGH_UPS	0x401000F7	//通过UPS关闭电脑
-/*国产化新增结束*/
 #define LOG_EVT_IEBROWSER_SET_RECOMMANDDER 0x401000E1
 #define LOG_TRACE_ENTITY_START_TIME						0x401000E2	//实体启动时间
 

+ 2 - 0
Module/mod_CenterSetting/CMakeLists.txt

@@ -17,6 +17,8 @@ target_include_directories(${MODULE_NAME} PRIVATE
 	${CONAN_INCLUDE_DIRS_JSONCPP}
 )
 
+set(CMAKE_CXX_FLAGS "${CMAK_CXX_FLAGS} -g3")
+
 target_link_directories(${MODULE_NAME} PRIVATE
 	${CONAN_LIB_DIRS_JSONCPP}
 )

+ 10 - 31
Module/mod_CenterSetting/mod_centersetting.cpp

@@ -155,13 +155,20 @@ ErrorCodeEnum CCenterSettingEntity::DownloadCenterSetting(SpReqAnsContext<Center
 	return Error_Succeed;
 }
 
-#ifdef RVC_OS_WIN
 DWORD getCenterCfgThread(LPVOID param)
 {
 	CCenterSettingEntity* req = (CCenterSettingEntity*)param;
-
 	bool isUpdate = false, isReset = false;
 	CSimpleString version;
+	if(false == req->GetFunction()->HasPrivilege())
+	{
+		LogWarn(Severity_High, Error_Unexpect, ERR_MOD_CENTERSETTING_CONNECT_FAILED,
+			CSimpleStringA::Format("下载集中配置失败:%s do not has privilege", __FUNCTION__));
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402101Z01").setResultCode("RTA1104")("集中配置下载失败");
+		return -1;
+	}
+
+
 	auto ret = req->GetFunction()->GetPrivilegeFunction()->TryUpdateCenterCfg(isUpdate, isReset, version);
 	if (ret != ErrorCodeEnum::Error_Succeed)
 	{
@@ -185,41 +192,13 @@ DWORD getCenterCfgThread(LPVOID param)
 		LogEvent(Severity_Middle, EVENT_MOD_CENTERSETTING_CRITICAL_UPDATE, "SpShell:Update centersetting with critical items.");
 	return 0;
 }
-#endif
 
 void CCenterSettingEntity::OnTimeout(DWORD dwTimerID)
 {
 	if(m_isUseMemCfg)
 	{
-#ifdef RVC_OS_WIN
-		CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&getCenterCfgThread, this, 0, NULL));
-#else
 		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("use memory config....");
-		bool isUpdate = false, isReset = false;
-		CSimpleString version;
-		ErrorCodeEnum ret = Error_NotSupport;
-		ret = GetFunction()->GetPrivilegeFunction()->TryUpdateCenterCfg(isUpdate, isReset, version);
-		if (ret != ErrorCodeEnum::Error_Succeed) {
-			LogWarn(Severity_High, Error_Unexpect, ERR_MOD_CENTERSETTING_CONNECT_FAILED,
-					CSimpleStringA::Format("下载集中配置失败:%d", ret));
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402101Z01").setResultCode("RTA1104")("集中配置下载失败");
-			return;
-		} else {
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Update centersettings config succ.");
-		}
-
-		if (!isUpdate) {
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetCenterSetting")("Centersetting not changed from spshell");
-			return;
-		}
-
-		LogWarn(Severity_Low, Error_Succeed, EVENT_MOD_CENTERSETTING_UPDATE_CENTER,
-				CSimpleStringA::Format("下载集中配置成功,版本号变更成:%s", version.GetData()));
-		LogEvent(Severity_Low, EVENT_MOD_CENTERSETTING_UPDATE_CENTER, "Update Centersetting.");
-
-		if (isReset)
-			LogEvent(Severity_Middle, EVENT_MOD_CENTERSETTING_CRITICAL_UPDATE, "SpShell:Update centersetting with critical items.");
-#endif
+		CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&getCenterCfgThread, this, 0, NULL));
 	} 
 	else
 	{

+ 18 - 2
Module/mod_CustMngrAuth/CustMngrAuthFSM.cpp

@@ -405,10 +405,26 @@ unsigned int CCustMngrAuthFSM::s4_on_event(FSMEvent* pEvt)
 		pEvt->SetHandled();
 		break;
 	case USER_EVT_COLLECTFINGERPRINTINFO_FINISHED:
-		pEvt->SetHandled();
+		{
+			pEvt->SetHandled();
+			if (m_pFingerPrint != NULL && !m_pFingerPrint->QuerySessionClosed())
+			{
+				m_pFingerPrint->GetFunction()->CloseSession();
+				m_pFingerPrint = NULL;
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("M_pFingerPrint disconnected.");
+			}
+		}
 		break;
 	case USER_EVT_GENERATE_TEMPLATE_FINISHED:
-		pEvt->SetHandled();
+		{
+			pEvt->SetHandled();
+			if (m_pFingerPrint != NULL && !m_pFingerPrint->QuerySessionClosed())
+			{
+				m_pFingerPrint->GetFunction()->CloseSession();
+				m_pFingerPrint = NULL;
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("M_pFingerPrint disconnected.");
+			}
+		}
 		break;
 	case USER_EVT_COLLECTFINGERPRINT_CANCEL:
 		{

+ 10 - 3
Module/mod_DeviceControl/mod_DeviceControl.cpp

@@ -101,9 +101,16 @@ void CDeviceControlEntity::QueryHardwareInfo(SpReqAnsContext<DeviceControlServic
     GetFunction()->GetSystemStaticInfo(info);
     CSimpleStringA deviceFct("");
 
-    NetworkAddressesList macAddrs;
-    NetworkAddressesList ipAddrs;
-    SP::Module::Net::GetINETMacAddresses(macAddrs, ipAddrs);
+	CAutoArray<SP::Module::Net::NetworkAdapterItem> netList;
+	SP::Module::Net::GetINETMacAddresses(netList);
+
+	CAutoArray<CSimpleStringA> ipAddrs, macAddrs;
+	for (int i = 0; i < netList.GetCount(); i++) {
+		CSimpleStringA tmpip = netList[i].ip.c_str();
+		CSimpleStringA tmpmac = netList[i].mac.c_str();
+		ipAddrs.Append(&tmpip, 0, 1);
+		macAddrs.Append(&tmpmac, 0, 1);
+	}
 
     // pad设备厂商为Microsoft, 其他设备读取root中的pinpad字段下的vendor
     if (info.strMachineType == "RVC.PAD") {

+ 3 - 2
Module/mod_IDCertificate/IDCertFSM.cpp

@@ -579,6 +579,7 @@ ErrorCodeEnum CIDCertFSM::OnInit()
 
 	supportUCS2 = FALSE;
 	igestionVer = FALSE;
+
 	return Error_Succeed;
 }
 ErrorCodeEnum CIDCertFSM::OnExit()
@@ -1527,7 +1528,7 @@ int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCe
 						}
 						else
 						{
-							if (igestionVer == true)
+							if (igestionVer == TRUE)
 							{
 								CSimpleStringA warnMsg = "ScanIDAndSaveImage() suc. But GetPngBlobEx() failed.";
 								if (transImgMsg.GetLength() != 0)
@@ -2273,7 +2274,7 @@ int CIDCertFSM::Initial() //linux ver
 		CSimpleStringA szMod(m_devCatInfo.szModel);
 		if (strstr(m_devCatInfo.szModel, "CODE=UCS2") != NULL)
 		{
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("测试为UCS2新库。");
+			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("UCS2新库。");
 			supportUCS2 = TRUE;
 		}
 

+ 2 - 1
Module/mod_IDCertificate/IDCertFSM.h

@@ -360,7 +360,8 @@ private:
 	unordered_map<int, string> nationalCode;
 #endif
 	BOOL supportUCS2; //支持生僻字
-	BOOL igestionVer; //吸入式	
+	BOOL igestionVer; //吸入式设备
+
 	CSimpleStringA m_csAlarmMsg;
 
 	bool invalidBreak;

+ 0 - 39
Module/mod_ResourceWatcher/ResourceWatcherFSM.cpp

@@ -69,7 +69,6 @@ const int TIMER_HARDWARE_CHECK = 2;
 const int DEFAULT_VERSION_SAVED_COUNT = 2;
 const int MAX_VERSION_PATH = 256;
 
-const int DEFAULT_DAY_OF_BACKWARD = 90;
 const int MAX_DAY_OF_BACKWARD = 365;
 const char* DEFAULT_DELETE_FILE_SUFFIX = "*";
 LPCTSTR UPLOAD_VIDEO_PATH = "UploadVideo";
@@ -142,44 +141,6 @@ private:
     bool m_bDeleteSelf;
 };
 
-ResourceWatcherFSM::ResourceWatcherFSM(void)
-    :m_IsPadDevice(FALSE),
-	m_csUploadVideoPath(true),
-	m_cardswiperStatus(-1),
-    m_nDayOfBackward(DEFAULT_DAY_OF_BACKWARD),
-    m_bReadyFlag(false),
-    m_bVideoClearReady(false),
-    m_nMinSavedDay(DEFAULT_SAVE_DATE_COUNT),
-    m_strTerminalNo(true),
-    m_strDefaultDns(true),
-    m_strBackupDns(true),
-    m_nEnableSetDns(0),
-    m_bFirstRunAfterBoot(FALSE),
-    m_bGetStatusRotate(FALSE),
-    m_csDelFileSuffix(true),
-    m_failDelCnt(0),
-    m_bIsConfigMode(FALSE),
-	m_cpuTop(0)
-{
-#if defined(RVC_OS_WIN)
-    m_iNonSignedTotal = 0;
-    m_xIdlePre = 0;
-    m_xKernelPre = 0;
-    m_xUserPre = 0;
-    m_bNeedForceDiskCheck = false;
-    m_DoneDetectAutostart = true;
-    mUiRequireBytes.QuadPart = 0ui64;
-    mUiCalibration.QuadPart = 0ui64;
-    m_nProbeIndex = 0;
-    memset(m_strProbeAddress, 0, sizeof(CSimpleStringA) * MAX_NETWORK_PROBE_COUNT);
-#else
-    mAllVideoFileSizeCal = 0;
-    mMaxFileSize = 0;
-    mUiCalibration = 0;
-    mUiRequireBytes = 0;
-    mftAd0RemoveTime = 0;
-#endif //RVC_OS_WIN
-}
 
 ResourceWatcherFSM::~ResourceWatcherFSM(void)
 {

+ 39 - 2
Module/mod_ResourceWatcher/ResourceWatcherFSM.h

@@ -297,11 +297,48 @@ struct SystemBasicInfo
 
 	SystemBasicInfo():strManufacturer(true), strProductName(true), strSerialNumber(true) {}
 };
-
+const int DEFAULT_DAY_OF_BACKWARD = 90;
 class ResourceWatcherFSM : public FSMImpl<ResourceWatcherFSM>
 {
 public:
-	ResourceWatcherFSM(void);
+	ResourceWatcherFSM(void)
+		:m_IsPadDevice(FALSE),
+		m_csUploadVideoPath(true),
+		m_cardswiperStatus(-1),
+		m_nDayOfBackward(DEFAULT_DAY_OF_BACKWARD),
+		m_bReadyFlag(false),
+		m_bVideoClearReady(false),
+		m_nMinSavedDay(DEFAULT_SAVE_DATE_COUNT),
+		m_strTerminalNo(true),
+		m_strDefaultDns(true),
+		m_strBackupDns(true),
+		m_nEnableSetDns(0),
+		m_bFirstRunAfterBoot(FALSE),
+		m_bGetStatusRotate(FALSE),
+		m_csDelFileSuffix(true),
+		m_failDelCnt(0),
+		m_bIsConfigMode(FALSE),
+		m_cpuTop(0)
+	{
+#if defined(RVC_OS_WIN)
+		m_iNonSignedTotal = 0;
+		m_xIdlePre = 0;
+		m_xKernelPre = 0;
+		m_xUserPre = 0;
+		m_bNeedForceDiskCheck = false;
+		m_DoneDetectAutostart = true;
+		mUiRequireBytes.QuadPart = 0ui64;
+		mUiCalibration.QuadPart = 0ui64;
+		m_nProbeIndex = 0;
+		memset(m_strProbeAddress, 0, sizeof(CSimpleStringA) * MAX_NETWORK_PROBE_COUNT);
+#else
+		mAllVideoFileSizeCal = 0;
+		mMaxFileSize = 0;
+		mUiCalibration = 0;
+		mUiRequireBytes = 0;
+		mftAd0RemoveTime = 0;
+#endif //RVC_OS_WIN
+	};
 	~ResourceWatcherFSM(void);
 
 	enum { s0, s1, s2, s3 };

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 596 - 647
Module/mod_accessauth/AccessAuthFSM.cpp


+ 0 - 21
Module/mod_accessauth/AccessAuthFSM.h

@@ -410,8 +410,6 @@ public:
 		Event_ReqTokenFail,
 		Event_ReqTokenSucc,
 		Event_ReqTokenCancel,
-		Event_NetworkIllegal,
-		Event_NetworkRecover,
 		Event_AccessAuthSucc
 	};
 
@@ -472,9 +470,6 @@ public:
 	int IsInternetEnv();
 #endif // RVC_OS_WIN
 
-	/*True: Legal; False: illegal*/
-	BOOL DetectNetworkLegality(CSimpleStringA& strInfo);
-
 	CSimpleStringA GetEntryPermitSysVar();
 	ErrorCodeEnum SetEntryPermitSysVar(const CSimpleStringA& newVal);
 	ErrorCodeEnum LoadCenterConfig();
@@ -486,7 +481,6 @@ public:
 	{
 		m_fNetworkChecking = busing;
 	}
-	BOOL IsCenterSettingFilesExist();
 	void SetDevPubKey(CSimpleStringA csDevPubKey) { m_strDevPubKey = csDevPubKey; }
 	CSimpleStringA GetDevPubKey() { return m_strDevPubKey; }
 
@@ -496,21 +490,6 @@ public:
 #endif // RVC_OS_LINUX
 
 private:
-#ifdef RVC_OS_WIN
-	ErrorCodeEnum GetDns(string& dnsList);
-	void LoadNetworkCheckURLConfig();
-	void LoadDNSSettingsConfig();
-	ErrorCodeEnum TestNetworkAvailableOrNot(CSimpleStringA& strInfo);
-	ErrorCodeEnum SetDNS(CSimpleStringA& outMsg, BOOL fAutoDelete = FALSE);
-	ErrorCodeEnum GetDNS(CSimpleStringA& strInfo);
-
-	BOOL IsDNSSettingsAvailable()
-	{
-		return (!m_strDefaultDNS.IsNullOrEmpty() && !m_strBackupDNS.IsNullOrEmpty());
-	}
-	CSimpleStringA GetCurrRelateInfo();
-#endif // RVC_OS_WIN
-	bool IsNetworkChecking() const { return m_fNetworkChecking; }
 	void GetDiffSyncTimeFromCenterSettings();
 
 public:

+ 68 - 37
Module/mod_accessauth/mod_AccessAuth.cpp

@@ -70,7 +70,7 @@ struct InitializerInitMKTask : ITaskSp
 				if (m_entity->LoadKeysToPinPadACS(tmkpair.second, initMKRet.tpk, initMKRet.edk, initMKRet.index) == Error_Succeed)
 					m_entity->EndInitMK(Error_Succeed, "");
 				else
-					m_entity->EndInitMK(ERR_INITIALIZER_INIT_EXCEPTION, "加载秘钥到密码键盘失败");//,待完善细化错误码oiltest
+					m_entity->EndInitMK(ERR_INITIALIZER_INIT_EXCEPTION, "加载秘钥到密码键盘失败,请检查密码键盘连接状态,多次失败请联系厂商排查。");//,待完善细化错误码oiltest
 			}
 			else
 				m_entity->EndInitMK(Error_Succeed, "");
@@ -167,7 +167,7 @@ struct InitializerInitMKTask : ITaskSp
 			SP::Module::Restful::CommResponseJson responseStatus;
 			SP::Module::Restful::GetStatusFromDebranchResponse(result.content, responseStatus);
 			if (!responseStatus.IsOperatedOK()) {
-				Dbg("update wk failed: %s", responseStatus.errorMsg.c_str());
+				Dbg("InitializerInitMKNew failed: %s", responseStatus.errorMsg.c_str());
 				m_entity->EndInitMK(ERR_INITIALIZER_INIT_EXCEPTION, responseStatus.errorMsg.c_str());
 			}
 			else {
@@ -178,7 +178,7 @@ struct InitializerInitMKTask : ITaskSp
 						m_entity->EndInitMK(Error_Succeed, "");
 					}
 					else {
-						m_entity->EndInitMK(ERR_INITIALIZER_INIT_EXCEPTION, "加载秘钥到密码键盘失败");//,待完善细化错误码oiltest
+						m_entity->EndInitMK(ERR_INITIALIZER_INIT_EXCEPTION, "加载秘钥到密码键盘失败,请检查密码键盘连接状态,多次失败请联系厂商排查。");//,待完善细化错误码oiltest
 					}
 				}
 				else {
@@ -305,15 +305,6 @@ void CAccessAuthEntity::OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointe
 
 void CAccessAuthEntity::OnSysVarEvent(const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName)
 {
-#ifdef RVC_OS_WIN
-	if ((strnicmp(pszKey, "NetState", strlen("NetState")) == 0)) {
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OnSysVarEvent %s, old->new:%s->%s", pszKey, pszOldValue, pszValue);
-		if (strcmp(pszValue, "C") == 0) {
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Recover CMD fire!");
-			m_FSM.PostEventFIFO(new FSMEvent(CAccessAuthFSM::Event_NetworkRecover));
-		}
-	}
-#endif // RVC_OS_WIN
 }
 
 // 开始准入
@@ -399,7 +390,7 @@ DWORD CAccessAuthEntity::SaveSM2KeyPair(const CBlob &pubKey, const CBlob &priKey
 		req.pub_key = pubKey;
 		req.pri_key = priKey;
 		TokenService_SetKeyPair_Ans ans;
-		rc = pTokenServiceClient->SetKeyPair(req, ans, 3000);
+		rc = (*pTokenServiceClient)(EntityResource::getLink().upgradeLink())->SetKeyPair(req, ans, 3000);
 		pTokenServiceClient->GetFunction()->CloseSession();
 		if (rc != Error_Succeed)
 		{
@@ -442,8 +433,9 @@ ErrorCodeEnum CAccessAuthEntity::SaveTokenAndSharedSK(const CBlob &token, const
 	{
 		TokenService_SetToken_Req req = {};
 		req.token = token;
-		TokenService_SetToken_Ans ans;
-		rc = pTokenServiceClient->SetToken(req, ans, 5000);
+		TokenService_SetToken_Ans ans; 
+		EntityResource::setLink(EntityResource::getLink().upgradeLink());
+		rc = (*pTokenServiceClient)(EntityResource::getLink())->SetToken(req, ans, 5000);
 		if (rc == Error_Succeed)
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SetToken")
 				("save token succ, token: [%s]", ByteArrayToHexStr((BYTE*)token.m_pData, token.m_iLength).c_str());
@@ -461,7 +453,7 @@ ErrorCodeEnum CAccessAuthEntity::SaveTokenAndSharedSK(const CBlob &token, const
 		TokenService_SetSharedSK_Req req2 = {};
 		req2.ssk = sharedSK;
 		TokenService_SetSharedSK_Ans ans2 = {};
-		rc = pTokenServiceClient->SetSharedSK(req2, ans2, 5000);
+		rc = (*pTokenServiceClient)(EntityResource::getLink().upgradeLink())->SetSharedSK(req2, ans2, 5000);
 		if (rc == Error_Succeed)
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SetSharedSK")
 				("save shared session key succ");
@@ -562,7 +554,7 @@ int CAccessAuthEntity::GetPinPadCapability()
 		PinPadService_QueryFunc_Req req;
 		PinPadService_QueryFunc_Ans ans;
 
-		rc = pPinPad->QueryFunc(req, ans, 3000);
+		rc = (*pPinPad)(EntityResource::getLink().upgradeLink())->QueryFunc(req,ans,3000);
 		if (rc == Error_Succeed)
 		{
 			nCapability = ans.encryptkey;
@@ -624,6 +616,7 @@ bool CAccessAuthEntity::SaveAuthKey(BYTE *pKey)
 #ifdef RVC_OS_WIN
 	iniPath = runInfoPath + "\\runcfg\\AccessAuthorization.ini";
 	GetPrivateProfileString("TerminalPD", "PrivateKey", "", privateKey, BUF_SIZE, iniPath.GetData());
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("GetTerminalPublicKey")("iniPath:%s", iniPath.GetData());
 #else
 	iniPath = runInfoPath + SPLIT_SLASH_STR "runcfg" SPLIT_SLASH_STR "AccessAuthorization.ini";
 	Dbg("path ex:%s", iniPath.GetData());
@@ -1111,7 +1104,7 @@ int CAccessAuthEntity::GetPinPadIDAndDeviceID(CSimpleStringA &strPinPadID, CSimp
 		PinPadService_GetDevInfo_Req req = {};
 		PinPadService_GetDevInfo_Ans ans = {};
 
-		rc = pPinPadClient->GetDevInfo(req, ans, 3000);
+		auto rc = (*pPinPadClient)(EntityResource::getLink().upgradeLink())->GetDevInfo(req, ans, 3000);
 		if (rc == Error_Succeed)
 		{
 			if (ans.state == DEVICE_STATUS_NORMAL)
@@ -1634,7 +1627,6 @@ void CAccessAuthEntity::EndInitMK(DWORD rc, const char *pszErrMsg)
 
 	// 通知UI窗口
 	if (m_ctx != NULL) {
-		Dbg("success");
 		m_ctx->Ans.Errcode = rc;
 		m_ctx->Ans.ErrMsg = m_strLastErrMsg;
 		m_ctx->Answer(Error_Succeed);
@@ -1691,7 +1683,7 @@ ErrorCodeEnum CAccessAuthEntity::LoadKeysToPinPadACS(string TMK, string TPK, str
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("LoadKeysToPinPadACS")("req.reserved3=%s", req.reserved3.GetData());
 
 		PinPadService_LoadKeysSM_Ans ans = {};
-		rc = pPinPad->LoadKeysSM(req, ans, 30000);
+		rc = (*pPinPad)(EntityResource::getLink().upgradeLink())->LoadKeysSM(req, ans, 30000);
 		if (rc == Error_Succeed)
 			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("LoadKeysToPinPadACS")("load sm key to pinpad succ");
 		else
@@ -1823,9 +1815,7 @@ pair<string, string> CAccessAuthEntity::EncryptedByPubKey(CSimpleStringA pubKey,
 	}
 	else
 		memcpy(pxxKey, pOldPubKey, 65);
-	//RVCCOMM_API bool EncWithSM2PubKey(BYTE * pSource, int nSourceLen, BYTE * pDest, int* pDestLen, BYTE * pPubKey, int nKeyLen);
 	int retSM2 = EncWithSM2PubKey((unsigned char*)m_btRam, 16, (unsigned char*)random_enc_bypbk, &outMsgLen, (unsigned char*)pxxKey, 65);
-	//int retSM2 = CMBSM2Encrypt((unsigned char*)pxxKey, 65, (unsigned char*)btRam, 16, (unsigned char*)random_enc_bypbk, &outMsgLen);
 	if (!retSM2 || outMsgLen != 113)
 	{
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("EncryptedTmkToDevice")("EncWithSM2PubKey failed outMsgLen:%d.", outMsgLen);
@@ -1867,13 +1857,39 @@ pair<string, string> CAccessAuthEntity::EncryptedByPubKey(CSimpleStringA pubKey,
 #ifdef RVC_OS_WIN
 void CAccessAuthEntity::GetTermSysInfo()
 {
+	//oilyang@20231008 to get system info from runcfg first
+	//no matter calculating from runcfg succeed or not,we also get system info from system api for update runcfg
+	bool bCalcFromRunCfg = false;
+	CSimpleString csInfo, strErrMsg, strRet;
+	CSmartPointer<IConfigInfo> pConfigRun;
+	ErrorCodeEnum eErr = GetFunction()->OpenConfig(Config_Run, pConfigRun);
+	if (eErr == Error_Succeed && pConfigRun->ReadConfigValue("system", "info", csInfo) == Error_Succeed && !csInfo.IsNullOrEmpty()) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("read device info from runcfg: [%s]", csInfo.GetData());
+
+		ZeroMemory(m_btTermSysInfoSM3, sizeof(m_btTermSysInfoSM3));
+		if (!SM3Hash(reinterpret_cast<BYTE*>(const_cast<char*>(csInfo.GetData())), csInfo.GetLength(), m_btTermSysInfoSM3))
+		{
+			strErrMsg = "get sm3 hash as fingerprint fail";
+			SetAuthErrMsg((const char*)strErrMsg);
+			this->GetFunction()->SetSysVar("AuthErrMsg", (const char*)strErrMsg, true);
+			m_FSM.doWarnMsg(ERROR_ACCESSAUTH_GETSM3HASH, (const char*)strErrMsg);
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("GetTerminalFingerPrint")((const char*)strErrMsg);
+			m_iGetTermSysInfo = -1;
+		}
+		else
+		{
+			m_iGetTermSysInfo = 1;
+			bCalcFromRunCfg = true;
+		}
+	}
+	else
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetTermSysInfo, OpenConfig Config_Run error=%d.", eErr);
+
 	ULONGLONG ullStart = GetTickCount64();
 	char szTmp[1024] = {};
 	int nTmpBufLen = 1024;
-	CSimpleStringA strErrMsg;
 	CSmartPointer<IEntityFunction> spFunction = this->GetFunction();
 
-	CSimpleStringA strRet;
 	if (!QueryWMIDevice(Processor, "ProcessorId", szTmp, &nTmpBufLen))
 	{
 		strErrMsg = CSimpleStringA::Format("查询 cpu id 失败: %d, 请尝试重启应用", GetLastError());
@@ -1883,7 +1899,8 @@ void CAccessAuthEntity::GetTermSysInfo()
 			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "Processor", GetLastError()).c_str(), true, strErrMsg.GetData());
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("QueryWMIDevice")
 			(GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "Processor", GetLastError()).c_str());
-		m_iGetTermSysInfo = -1;
+		if (!bCalcFromRunCfg)
+			m_iGetTermSysInfo = -1;
 		return;
 	}
 	strRet = szTmp;
@@ -1899,7 +1916,8 @@ void CAccessAuthEntity::GetTermSysInfo()
 			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "BaseBoard", GetLastError()).c_str(), true, strErrMsg.GetData());
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("QueryWMIDevice")
 			(GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "BaseBoard", GetLastError()).c_str());
-		m_iGetTermSysInfo = -1;
+		if (!bCalcFromRunCfg)\
+			m_iGetTermSysInfo = -1;
 		return;
 	}
 
@@ -1917,26 +1935,39 @@ void CAccessAuthEntity::GetTermSysInfo()
 			GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "DiskDrive", GetLastError()).c_str(), true, strErrMsg.GetData());
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("QueryWMIDevice")
 			(GetOutPutStr("%s%s%s%d", "QueryWMIDevice", "False", "DiskDrive", GetLastError()).c_str());
-		m_iGetTermSysInfo = -1;
+		if (!bCalcFromRunCfg)
+			m_iGetTermSysInfo = -1;
 		return;
 	}
 
 	strRet += "|";
 	strRet += szTmp;
 
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("QueryWMIDevice")("device info: [%s]", (const char*)strRet);
+	if (!bCalcFromRunCfg || csInfo.Compare(strRet) != 0)
+	{
+		eErr = pConfigRun->WriteConfigValue("system", "info", strRet.GetData());
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("QueryWMIDevice")("device info changed,before[%s],current[%s],write to runcfg:%d"
+			, csInfo.GetData(), strRet.GetData(), eErr);
+	}
+	else
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("QueryWMIDevice")("device info: [%s]", strRet.GetData());
 
-	ZeroMemory(m_btTermSysInfoSM3, sizeof(m_btTermSysInfoSM3));
-	if (!SM3Hash(reinterpret_cast<BYTE*>(const_cast<char*>(strRet.GetData())), strRet.GetLength(), m_btTermSysInfoSM3))
+	
+	if (!bCalcFromRunCfg)
 	{
-		strErrMsg = "get sm3 hash as fingerprint fail";
-		SetAuthErrMsg((const char*)strErrMsg);
-		spFunction->SetSysVar("AuthErrMsg", (const char*)strErrMsg, true);
-		m_FSM.doWarnMsg(ERROR_ACCESSAUTH_GETSM3HASH, (const char*)strErrMsg);
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("GetTerminalFingerPrint")((const char*)strErrMsg);
-		m_iGetTermSysInfo = -1;
+		ZeroMemory(m_btTermSysInfoSM3, sizeof(m_btTermSysInfoSM3));
+		if (!SM3Hash(reinterpret_cast<BYTE*>(const_cast<char*>(strRet.GetData())), strRet.GetLength(), m_btTermSysInfoSM3))
+		{
+			strErrMsg = "get sm3 hash as fingerprint fail";
+			SetAuthErrMsg((const char*)strErrMsg);
+			spFunction->SetSysVar("AuthErrMsg", (const char*)strErrMsg, true);
+			m_FSM.doWarnMsg(ERROR_ACCESSAUTH_GETSM3HASH, (const char*)strErrMsg);
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("GetTerminalFingerPrint")((const char*)strErrMsg);
+			m_iGetTermSysInfo = -1;
+		}
+		else
+			m_iGetTermSysInfo = 1;
 	}
-	m_iGetTermSysInfo = 1;
 	ULONGLONG ullEnd = GetTickCount64();
 	if (ullEnd - ullStart > 5000)
 		LogWarn(Severity_Middle, Error_Unexpect, AccessAuthorization_UserErrorCode_GetTermCostTooLong, CSimpleStringA::Format("获取系统信息耗时过长:%d秒", (ullEnd - ullStart) / 1000));

+ 25 - 7
Module/mod_cardissuer/CardIssuerFSM.cpp

@@ -2633,8 +2633,14 @@ int CCardIssuerFSM::ReadCard_Contact(SpReqAnsContext<CardIssuerService_Read_Req,
 				bReadCardInfo = true;
 				if (m_issueStatus)
 				{
-					m_mixedEx[m_currentHopper - 1] = 0;
-					SetCardMixed(m_mixedEx[m_currentHopper - 1], m_currentHopper);
+					//设置为mixed从读卡失败恢复为成功时才触发同步计数和写运行时
+					if (m_mixedEx[m_currentHopper - 1]!= 0) {
+						m_mixedEx[m_currentHopper - 1] = 0;
+						SetCardMixed(m_mixedEx[m_currentHopper - 1], m_currentHopper);
+					}
+					else {
+						SetDevStateAndSendMsg(DEVICE_STATUS_NORMAL);
+					}
 				}
 			}
 			if (_strnicmp(track2Data.t2Account, ddd, strlen(ddd)) && (track2Data.t2Account.GetLength() != 8))
@@ -2884,8 +2890,14 @@ int CCardIssuerFSM::ReadCard_RF(SpReqAnsContext<CardIssuerService_Read_Req, Card
 				bReadCardInfo = true;
 				if (m_issueStatus)
 				{
-					m_mixedEx[m_currentHopper - 1] = 0;
-					SetCardMixed(m_mixedEx[m_currentHopper - 1], m_currentHopper);
+					//设置为mixed从读卡失败恢复为0时才触发同步计数和写运行时
+					if (m_mixedEx[m_currentHopper - 1] != 0) {
+						m_mixedEx[m_currentHopper - 1] = 0;
+						SetCardMixed(m_mixedEx[m_currentHopper - 1], m_currentHopper);
+					}
+					else {
+						SetDevStateAndSendMsg(DEVICE_STATUS_NORMAL);
+					}
 				}
 			}
 			if (_strnicmp(track2Data.t2Account, ddd, strlen(ddd)) && (track2Data.t2Account.GetLength() != 8))
@@ -3300,9 +3312,15 @@ int CCardIssuerFSM::PreOnline_Contact(SpReqAnsContext<CardIssuerService_PreOnlin
 			t2ICTrack2 = pICTrack2;
 			if (m_issueStatus)
 			{
-				m_mixedEx[m_currentHopper - 1] = 0;
-				bool bSetMix = SetCardMixed(m_mixedEx[m_currentHopper - 1], m_currentHopper);
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnline>, set %d card mixed %d,%d", m_currentHopper, bSetMix, m_mixedEx[m_currentHopper - 1]);
+				//设置为mixed从读卡失败恢复为0时才触发同步计数和写运行时
+				if (m_mixedEx[m_currentHopper - 1] != 0) {
+					m_mixedEx[m_currentHopper - 1] = 0;
+					bool bSetMix = SetCardMixed(m_mixedEx[m_currentHopper - 1], m_currentHopper);
+					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("<PreOnline>, set %d card mixed %d,%d", m_currentHopper, bSetMix, m_mixedEx[m_currentHopper - 1]);
+				}
+				else {
+					SetDevStateAndSendMsg(DEVICE_STATUS_NORMAL);
+				}
 			}
 		}
 		if (_strnicmp(track2Data.t2Account,ddd,strlen(ddd)))

+ 1 - 0
Module/mod_chromium/CSocketClient.cpp

@@ -22,6 +22,7 @@ bool checkHttpThreadFun(const std::string url) {
 
 std::pair<bool, std::string> DetectActiveHttp(std::vector<std::string> urlArr)
 {
+	return std::make_pair(true, urlArr[0]);
 	try {
 		std::vector<boost::shared_future<bool>> threadArr;
 #if (defined _WIN32 || defined _WIN64)

+ 2 - 0
Module/mod_chromium/CWebsocketServer.cpp

@@ -805,10 +805,12 @@ namespace Chromium {
 		// get message from socket and deserialize 
 		// then send back to the web client
 		auto bufferLength = msg.getBufferLength();
+		/*
 		if (bufferLength > MAX_TRANSFER_LEN)
 			DbgEx("WebSocket Search message_from_socket : buffer len = %d, buffer pre50:%s", msg.getBufferLength(), msg.printfHEX(50).c_str());
 		else
 			receivehexdump(msg.getPayload(), msg.getLength());
+			*/
 		//else
 		//	DbgEx("WebSocket Search message_from_socket : buffer len = %d", msg.getBufferLength());
 

+ 36 - 16
Module/mod_chromium/mod_chromium.cpp

@@ -441,12 +441,6 @@ namespace Chromium {
 				DbgEx("RegistSysVarEvent UIState failed!");
 			if (Error_Succeed != GetFunction()->RegistSysVarEvent("TerminalStage", this))
 				DbgEx("RegistSysVarEvent TerminalStage failed!");
-			if (Error_Succeed != GetFunction()->RegistSysVarEvent("EntryPermit", this))
-				DbgEx("RegistSysVarEvent EntryPermit failed!");
-			if (Error_Succeed != GetFunction()->RegistSysVarEvent("SessionID", this))
-				DbgEx("RegistSysVarEvent SessionID failed!");
-			if (Error_Succeed != GetFunction()->RegistSysVarEvent("CustomerID", this))
-				DbgEx("RegistSysVarEvent CustomerID failed!");
 			if (Error_Succeed != GetFunction()->RegistSysVarEvent("CardStoreInUse", this))
 				DbgEx("RegistSysVarEvent CardStoreInUse failed!");
 		}
@@ -464,11 +458,14 @@ namespace Chromium {
 
 		do
 		{
-			CSimpleStringA t_EntryPermit, t_terminalState;
-			GetFunction()->GetSysVar("EntryPermit", t_EntryPermit);
-			GetFunction()->GetSysVar("TerminalStage", t_terminalState);
-			/** Z开头标识终端配种模式 [Gifur@20211017]*/
-		    if ('A' != t_terminalState[0] &&  'Z' != t_terminalState[0])
+			CSimpleStringA t_terminalState;
+			ErrorCodeEnum rc = ErrorCodeEnum::Error_Succeed;
+			if ((rc = GetFunction()->GetSysVar("TerminalStage", t_terminalState)) != ErrorCodeEnum::Error_Succeed)
+			{
+				DbgEx("%s read TerminalStage Error %d, maybe not exist", __FUNCTION__, rc);
+				break;
+			}
+		    else if ('A' != t_terminalState[0] &&  'Z' != t_terminalState[0])
 			{
 				if (m_withBrowser)
 					break;//run IEBrowser
@@ -529,19 +526,19 @@ namespace Chromium {
 		DbgEx("open page extend %s, pid:%d", Error_Succeed == openRet.first ? "success" : "fail", openRet.second);
 	}
 
-	void CChromiumEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs, CSmartPointer<ITransactionContext> pTransactionContext)
+	void CChromiumEntity::startWithCfg()
 	{
-		OnPreStart_Init(strArgs, pTransactionContext);//初始化部分, perf ,killchromium, signal, get custom url
-		if (!OnPreStart_socketStart(strArgs, pTransactionContext)) {//OnPreStart_socketStart()->new CWebsocketServer(strStructPath, this) 时间过长
+		OnPreStart_Init(m_strArgs, m_pTransactionContext);//初始化部分, perf ,killchromium, signal, get custom url
+		if (!OnPreStart_socketStart(m_strArgs, m_pTransactionContext)) {//OnPreStart_socketStart()->new CWebsocketServer(strStructPath, this) 时间过长
 			return;
 		}
 		if (!IsConfigMode()) {
-			if (!OnPreStart_register(strArgs, pTransactionContext)) {
+			if (!OnPreStart_register(m_strArgs, m_pTransactionContext)) {
 				return;
 			}
 			//if contain default setting, then oepn web by setting
 #if (defined _WIN32 || defined _WIN64)
-			if (strArgs.GetCount())
+			if (m_strArgs.GetCount())
 			{
 				if (!m_strCustomMainUrl.IsNullOrEmpty())
 					openMainPage();
@@ -554,6 +551,23 @@ namespace Chromium {
 				return;
 			}
 		}
+	}
+
+	void CChromiumEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs, CSmartPointer<ITransactionContext> pTransactionContext)
+	{
+		m_strArgs = strArgs;
+		m_pTransactionContext = pTransactionContext;
+
+		CSimpleStringA t_terminalState;
+		if (ErrorCodeEnum::Error_Succeed == GetFunction()->GetSysVar("TerminalStage", t_terminalState))
+		{
+			DbgEx("OnPreStart TerminalStage:%s", t_terminalState.GetData());
+			startWithCfg();//属于chromium重启或者其他情况,已经初始化好配置
+		}
+		else
+		DbgEx("subscribe VtmLoader %s",
+			(Error_Succeed == GetFunction()->SubscribeLog(m_uuidVTMLoader, this, Log_Event, Severity_None, Error_IgnoreAll, -1, "VtmLoader")) ? "success" : "failed");
+
 		
 		pTransactionContext->SendAnswer(Error_Succeed);
 	}
@@ -715,6 +729,12 @@ namespace Chromium {
 		const CAutoArray<DWORD>& Param, const char* pszEntityName, const char* pszModuleName, const char* pszMessage, const linkContext& pLinkInfo)
 	{
 		DbgEx("OnLog %x from entity %s, msg : %s", dwUserCode, NULL == pszEntityName ? "" : pszEntityName, NULL == pszMessage ? "" : pszMessage);
+		if (Event_VtmLoader_GetConfig_Suc == dwUserCode || Event_VtmLoader_GetConfig_Fail == dwUserCode)
+		{
+			refreshLogLevel();//后置后需要刷新log level,因为chromium是先启动的实体
+			startWithCfg();
+		}
+
 #if (defined _WIN32 || defined _WIN64)
 		//No Log_Notify
 #else

+ 4 - 2
Module/mod_chromium/mod_chromium.h

@@ -124,7 +124,7 @@ namespace Chromium {
 		void openMainPage();
 		void openAdPage();
 		void openExtendPage();
-
+		void startWithCfg();
 		bool CheckIsCardStore();
 
 	private:
@@ -142,12 +142,14 @@ namespace Chromium {
 		boost::container::deque<SYS_EVENT_PARAM> m_eventArr;
 		boost::mutex m_eventContorl, m_eventConditionMu; //sysvarEvent变化时阻塞修改
 		boost::condition_variable_any m_eventCondition;//满足有数据时激活线程
+		CAutoArray<CSimpleStringA> m_strArgs;
+		CSmartPointer<ITransactionContext> m_pTransactionContext;
 	public:
 		boost::timed_mutex m_firstStartMain;//首次启动主页
 		int getBrowserStartTimes();
 	private:
 		//subscribe
-		CUUID m_uidCameraListener, m_uuidAccessAuth, m_uuidResourceWatch,m_uidBrowserListenser, m_uuidAccessAuthErr, m_uuidAllFault;
+		CUUID m_uidCameraListener, m_uuidAccessAuth, m_uuidResourceWatch,m_uidBrowserListenser, m_uuidAccessAuthErr, m_uuidAllFault, m_uuidVTMLoader;
         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, const linkContext& pLinkInfo);

+ 0 - 90
Module/mod_chromium/portCheck/portCheck.cpp

@@ -1,90 +0,0 @@
-#include "stdafx.h"
-#include <stdio.h>
-#include <string>
-
-#if (defined _WIN32 || defined _WIN64)
-#include <winsock.h>
-#pragma comment(lib,"Ws2_32.lib")
-#include "Wininet.h"  
-#pragma comment(lib,"Wininet.lib") 
-#else
-#include <requests/Exception.hpp>
-#include <requests/Request.hpp>
-#include <requests/Url.hpp>
-#endif
-
-
-#if (defined _WIN32 || defined _WIN64)
-bool checkHttpActive(const char* httpUrl)
-{
-	TCHAR szHostName[128];
-	TCHAR szUrlPath[256];
-	URL_COMPONENTS crackedURL = { 0 };
-	crackedURL.dwStructSize = sizeof(URL_COMPONENTS);
-	crackedURL.lpszHostName = szHostName;
-	crackedURL.dwHostNameLength = ARRAYSIZE(szHostName);
-	crackedURL.lpszUrlPath = szUrlPath;
-	crackedURL.dwUrlPathLength = ARRAYSIZE(szUrlPath);
-	InternetCrackUrl(httpUrl, (DWORD)strlen(httpUrl), 0, &crackedURL);
-
-	HINTERNET hInternet = InternetOpen("Microsoft InternetExplorer", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
-	if (hInternet == NULL)
-		return false;
-
-	HINTERNET hHttpSession = InternetConnect(hInternet, crackedURL.lpszHostName, crackedURL.nPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
-	if (hHttpSession == NULL)
-	{
-		InternetCloseHandle(hInternet);
-		return false;
-	}
-
-	HINTERNET hHttpRequest = HttpOpenRequest(hHttpSession, "GET", crackedURL.lpszUrlPath, NULL, "", NULL, 0, 0);
-	if (hHttpRequest == NULL)
-	{
-		InternetCloseHandle(hHttpSession);
-		InternetCloseHandle(hInternet);
-		return false;
-	}
-
-	/**
-	 * 查询http状态码(这一步不是必须的),但是HttpSendRequest()必须要调用
-	 */
-
-	DWORD dwRetCode = 0;
-	DWORD dwSizeOfRq = sizeof(DWORD);
-	if (!HttpSendRequest(hHttpRequest, NULL, 0, NULL, 0) ||
-		!HttpQueryInfo(hHttpRequest, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &dwRetCode, &dwSizeOfRq, NULL)
-		|| dwRetCode >= 400)
-	{
-		InternetCloseHandle(hHttpRequest);
-		InternetCloseHandle(hHttpSession);
-		InternetCloseHandle(hInternet);
-
-		return false;
-	}
-	InternetCloseHandle(hHttpRequest);
-	InternetCloseHandle(hHttpSession);
-
-	return true;
-}
-#else
-bool checkHttpActive(const char* httpUrl)
-{
-	requests::Request request;
-	requests::Url url(httpUrl);
-
-	try
-	{
-		// 发起 HTTP 请求,阻塞
-		auto resp = request.get(url);
-		return true;
-	}
-	catch (requests::Exception& e)
-	{
-		std::cout << e.what() << std::endl;
-	}
-	return false;
-}
-
-#endif
-

+ 0 - 2
Module/mod_chromium/portCheck/portCheck.h

@@ -1,2 +0,0 @@
-
-bool checkHttpActive(const char* httpUrl);

+ 12 - 0
Module/mod_guiconsole/GUIConsole_def_g.h

@@ -36,6 +36,18 @@ namespace GUIConsole {
 #define GUIConsoleService_MethodSignature_AddTradeManage 485018637
 #define GUIConsoleService_MethodSignature_QueryMaterialInfo 467755649
 
+#define GUIConsoleService_LogCode_GetCurrentMaintainer "QLR040250800"
+#define GUIConsoleService_LogCode_Empower "QLR040250801"
+#define GUIConsoleService_LogCode_Takeover "QLR040250802"
+#define GUIConsoleService_LogCode_ForceQuit "QLR040250803"
+#define GUIConsoleService_LogCode_AddMaterialCounter "QLR040250804"
+#define GUIConsoleService_LogCode_GetMaterialCounter "QLR040250805"
+#define GUIConsoleService_LogCode_ResetMaterialCounter "QLR040250806"
+#define GUIConsoleService_LogCode_RegistSwallowedCard "QLR040250807"
+#define GUIConsoleService_LogCode_SyncMaterialCount "QLR040250808"
+#define GUIConsoleService_LogCode_AddTradeManage "QLR040250809"
+#define GUIConsoleService_LogCode_QueryMaterialInfo "QLR040250810"
+
 struct GUIConsoleService_GetCurrentMaintainer_Req
 {
 

+ 0 - 5
Module/mod_guiconsole/guitask.cpp

@@ -637,11 +637,6 @@ void GUITask::OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const Lo
 		auto centersettingPath = generateCenterSettingPath();
 		load_debugLevelInCentersetting(centersettingPath.c_str());
 
-		//此时实体的idx已经存在,更新一下实体的logDebugLevel
-		CAutoArray<CSimpleStringA> strEntityNames;
-		CAutoArray<WORD> wEntityDevelopID;
-		GetAllEntityIdx(strEntityNames, wEntityDevelopID);
-		update_debugLevel(strEntityNames, wEntityDevelopID);
 
 	}
 		

+ 0 - 1
Module/mod_healthmanager/CMakeLists.txt

@@ -22,7 +22,6 @@ target_include_directories(${MODULE_NAME} PRIVATE
 	${MODULE_BASE_DIR}/mod_cardswiper
 	${MODULE_BASE_DIR}/mod_ContactlessCard
 	${MODULE_BASE_DIR}/mod_DeviceControl
-	${MODULE_BASE_DIR}/mod_watchdog
 	${MODULE_BASE_DIR}/mod_ups
 	${MODULE_BASE_DIR}/mod_interactioncontext
 	${MODULE_BASE_DIR}/mod_UpgradeMgr

+ 63 - 52
Module/mod_healthmanager/HealthManagerFSM.cpp

@@ -292,6 +292,10 @@ void CHealthManagerFSM::s0_on_entry(void)
 {
 	LOG_FUNCTION();
 	m_fsmState = HM_FSM_INIT;
+	m_ullElapseFromOSStart = SP::Module::Comm::RVCGetTickCount();
+	m_elapseTimeFromOSStart = m_ullElapseFromOSStart / 1000;
+	CSimpleStringA xMsg = CSimpleStringA::Format("{\"Decripstion\":\"Entity start\",\"version\":\"%s\",\"elapseTime\":\"%d\"}", m_sysInfo.InstallVersion.ToString().GetData(), m_elapseTimeFromOSStart);
+	LogWarn(Severity_Low, Error_Unexpect, HealthManager_UserErrorCode_Enter_SafeLoad_State, xMsg.GetData());
 }
 void CHealthManagerFSM::s0_on_exit(void)
 {
@@ -495,11 +499,6 @@ void CHealthManagerFSM::s2_on_entry()
 {
 	LOG_FUNCTION();
 	m_fsmState = HM_FSM_STATE_SAFELOAD;
-
-	ULONGLONG dwElapse = GetTickCountRVC();//使用机器启动时间秒数
-	DWORD elapseTimeTemp = dwElapse / 1000;
-	CSimpleStringA xMsg = CSimpleStringA::Format("{\"Decripstion\":\"Enter safeload state.\",\"version\":\"%s\",\"elapseTime\":\"%d\"}", m_sysInfo.InstallVersion.ToString().GetData(), elapseTimeTemp);
-	LogWarn(Severity_Low, Error_Unexpect, HealthManager_UserErrorCode_Enter_SafeLoad_State, xMsg.GetData());
 	ErrorCodeEnum eErrCode;
 	eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState", "S");
 	if (eErrCode != Error_Succeed)
@@ -647,7 +646,6 @@ unsigned int CHealthManagerFSM::s2_on_event(FSMEvent* pEvt)
 	case USER_EVT_SAFELOAD_FINISHED:
 		{
 			pEvt->SetHandled();
-			//ToCheckUPS();
 			//oiltmp
 			//according to the system varible TerminalState to do sth.
 			//Configed
@@ -890,16 +888,6 @@ void CHealthManagerFSM::s4_on_entry()
 		spCerConfig->ReadConfigValue("NonExclusive", "NewStartPage", m_NewStartPage);
 	}
 	DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("before access auth,read MD5 flag:%d",m_accessAuthCheckMD5);
-	if (!m_bIdleToMaintain)
-	{	
-		if (m_iAccessAuth == AccessAuth_Init)
-		{
-			WaitToCallAccessAuthTask* pTask = new WaitToCallAccessAuthTask(this);
-			GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
-		}
-	}
-	else
-		m_bIdleToMaintain = false;
 }
 void CHealthManagerFSM::s4_on_exit()
 {
@@ -976,6 +964,27 @@ unsigned int CHealthManagerFSM::s4_on_event(FSMEvent* pEvt)
 	case USER_EVT_ENTER_CUSTOMER_MANAGER:
 		pEvt->SetHandled();
 		break;
+	case USER_EVT_VTMLOADER_FINISHED:
+	{
+		pEvt->SetHandled();
+		if (pEvt->iEvt == 1)
+		{
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("VtmLoader load entity failed, to Set TerminalStage C.");
+			GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "C");
+			break;
+		}
+		if (!m_bIdleToMaintain)//???no use anymore?
+		{
+			if (m_iAccessAuth == AccessAuth_Init)
+			{
+				WaitToCallAccessAuthTask* pTask = new WaitToCallAccessAuthTask(this);
+				GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
+			}
+		}
+		else
+			m_bIdleToMaintain = false;
+	}
+		break;
 	default:
 		break;
 	}
@@ -1320,6 +1329,20 @@ int CHealthManagerFSM::WaitDeamonFinish()
 int CHealthManagerFSM::AccessAuthDoWork()
 {
 	LOG_FUNCTION();
+	//to check if PinPad is ok, wait for 5 seconds,then go on
+	//RVC.CardStore have no PinPad
+	int waitCount = 0;
+	while (waitCount < 5)
+	{
+		if (m_bPinPadOpenSuc || m_sysInfo.strMachineType.Compare("RVC.CardStore",true) == 0)
+			break;
+		else
+		{
+			Sleep(1000);
+			waitCount++;
+		}
+	}
+
 	m_bInAccessAuthDoWork = true;
 	CSimpleStringA csTermStage("");
 	ErrorCodeEnum eErr;
@@ -1728,25 +1751,7 @@ void CHealthManagerFSM::OnAnswer(CSmartPointer<IAsynWaitSp> pAsynWaitSp)
 		break;
 	}
 }
-void CHealthManagerFSM::ToCheckUPS()
-{
-	CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
-	CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
-	CEntityRunInfo acInfo;
-	ErrorCodeEnum eErrCode;
-	eErrCode = pFunc->GetEntityRunInfo("Ups",acInfo);
-	DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("ToCheckUPS")("ups state %d,%d",eErrCode,acInfo.eState);
-	if (acInfo.eState != EntityState_NoStart)
-	{
-		CSmartPointer<IAsynWaitSp> spWait;
-		eErrCode = pFuncPrivilege->TerminateEntity("Ups",spWait);
-		Sleep(2000);
-		eErrCode = pFuncPrivilege->StartEntity("Ups",NULL,spWait);
-		if (spWait != NULL)
-			eErrCode = spWait->WaitAnswer(5000);
-		DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("ToCheckUPS")("restart ups wait %d",eErrCode);
-	}
-}
+
 CSimpleStringA CHealthManagerFSM::GetEntityCfgInfo(CSimpleStringA name,int &loadOpt)
 {
 	CSimpleStringA entityList(""),csBrowserName("IEBrowser");
@@ -2218,21 +2223,20 @@ void CHealthManagerFSM::ToLogWarnTermAboutInfo()
 	CSmartPointer<IConfigInfo> spConfigRun;
 	GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
 
-	NetworkAddressesList macAddrs;
-	NetworkAddressesList ipAddrs;
-	SP::Module::Net::GetINETMacAddresses(macAddrs, ipAddrs);
+	CAutoArray<SP::Module::Net::NetworkAdapterItem> netList;
+	SP::Module::Net::GetINETMacAddresses(netList);
 	CSimpleStringA csMac(""), csIP("");
-    for (int i = 0; i < macAddrs.GetCount(); i++) {
+    for (int i = 0; i < netList.GetCount(); i++) {
 		if (!csMac.IsNullOrEmpty()) {
 			csMac += ";";
 		}
-		csMac += macAddrs[i];
+		csMac += netList[i].mac.c_str();
 	}
-    for (int i = 0; i < ipAddrs.GetCount(); i++) {
+    for (int i = 0; i < netList.GetCount(); i++) {
 		if (!csIP.IsNullOrEmpty()) {
 			csIP += ";";
 		}
-        csIP += ipAddrs[i];
+        csIP += netList[i].ip.c_str();
     }
 
 	termInfo["MACs"] = csMac;
@@ -2250,6 +2254,10 @@ void CHealthManagerFSM::ToLogWarnTermAboutInfo()
 	termInfo["elapseTime"] = _itoa(elapseTimeTemp, elapseTime, 10);
 #endif
 	
+	CSimpleStringA csRunPath("");
+	GetEntityBase()->GetFunction()->GetPath("Run", csRunPath);
+	termInfo["AppPath"] = csRunPath;
+
 	std::pair<bool, std::string> strResult;
 	std::pair<bool, std::string> strPCInfo;
 	strResult = generateJsonStr(termInfo);
@@ -2410,7 +2418,7 @@ void CHealthManagerFSM::FWBDoInit()
 	}
 
 
-	eErr = m_pACClient->UpdateWK();
+	eErr = (*m_pACClient)(EntityResource::getLink().upgradeLink())->UpdateWK();
 	if (eErr == Error_Succeed)
 	{
 		GetEntityBase()->GetFunction()->SetSysVar("InitFWBFromStart", "Y");
@@ -2429,15 +2437,12 @@ bool CHealthManagerFSM::IfInUpgradeProcess()
 {
 	CSimpleStringA csRunCfgPath(""), csFileName("");
 
-	ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetPath("RunInfo", csRunCfgPath);
+	ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetPath("RunCfg", csRunCfgPath);
+	csFileName = csRunCfgPath + SPLIT_SLASH_STR + "starttime.dat";
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("csFileName:%s", csFileName.GetData());
 #if defined(RVC_OS_WIN)
-	csFileName = csRunCfgPath + "\\runcfg\\starttime.dat";
-	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("oiltest csFileName:%s", csFileName.GetData());
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("IfInUpgradeProcess")("file :%s", (const char*)csFileName);
 	if (_access((const char*)csFileName, 0) == 0) {
 #else
-	csFileName = csRunCfgPath + "/runcfg/starttime.dat";
-	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("file :%s", (const char*)csFileName);
 	if (access((const char*)csFileName, F_OK) == 0) {
 #endif
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("IfInUpgradeProcess")("升级切换中");
@@ -2652,10 +2657,16 @@ void CHealthManagerFSM::QueryHardwareInfo(SpReqAnsContext<HealthManagerService_Q
 	CSystemStaticInfo info;
 	GetEntityBase()->GetFunction()->GetSystemStaticInfo(info);
 
-	NetworkAddressesList macAddrs;
-	NetworkAddressesList ipAddrs;
-	SP::Module::Net::GetINETMacAddresses(macAddrs, ipAddrs);
+	CAutoArray<SP::Module::Net::NetworkAdapterItem> netList;
+	SP::Module::Net::GetINETMacAddresses(netList);
 
+	CAutoArray<CSimpleStringA> ipAddrs, macAddrs;
+	for (int i = 0; i < netList.GetCount(); i++) {
+		CSimpleStringA tmpip = netList[i].ip.c_str();
+		CSimpleStringA tmpmac = netList[i].mac.c_str();
+		ipAddrs.Append(&tmpip, 0, 1);
+		macAddrs.Append(&tmpmac, 0, 1);
+	}
 	ctx->Ans.ip = ipAddrs;
 	ctx->Ans.mac = macAddrs;
 	ctx->Ans.machineType = info.strMachineType;

+ 7 - 8
Module/mod_healthmanager/HealthManagerFSM.h

@@ -68,6 +68,7 @@ enum EvtType
 	USER_EVT_MAITAIN_FINISHED,
 	USER_EVT_ENTER_CUSTOMER_MANAGER,
 	USER_EVT_SWITCH_BACK_TO_RVC,
+	USER_EVT_VTMLOADER_FINISHED,
 };
 enum LoadStage
 {
@@ -83,8 +84,6 @@ enum EntityLoadFaultStage
 };
 enum EntityOption
 {
-	WATCHDOG,
-	UPS,
 	HEARTBEAT,
 	SELFCHECKER
 };
@@ -191,8 +190,8 @@ public:
 	END_FSM_STATE()
 
 	BEGIN_FSM_RULE(CHealthManagerFSM,s0)
-		FSM_RULE_ENTRY(s0,s1,USER_EVT_WAIT_DEAMON_FINISHED,0)
-		//FSM_RULE_ENTRY(s0,s5,USER_EVT_WAIT_DEAMON_FINISHED,1)
+		//FSM_RULE_ENTRY(s0,s1,USER_EVT_WAIT_DEAMON_FINISHED,0)
+		FSM_RULE_ENTRY(s0,s4, USER_EVT_WAIT_DEAMON_FINISHED,0)
 		FSM_RULE_ENTRY(s1,s2,USER_EVT_COREBOOT_FINISHED,0)
 		FSM_RULE_ENTRY(s1,s2,USER_EVT_COREBOOT_FINISHED,1)
 		FSM_RULE_ENTRY(s1,s5,USER_EVT_COREBOOT_FINISHED,2)
@@ -243,7 +242,7 @@ public:
 	, m_checkCode(""), m_accessAuthCheckMD5(0), m_havReceiveMD5OK(0), m_bFirstAccessAuth(true)
 	, m_bIEBeforeHealth(false), m_hasCfgGpioInRootIni(false), m_csErrEntity(""), m_bInAccessAuthDoWork(false)
 	, m_bEntityNewStart(true), m_autoDoInitCount(0), m_bDoingAutoInit(false), m_iDoNotUpdateWKDaily(0)
-	, m_wkUpdatePeriod(1), mCofigMode(false){}
+	, m_wkUpdatePeriod(1), mCofigMode(false), m_bPinPadOpenSuc(false){}
 	~CHealthManagerFSM(){}
 	virtual ErrorCodeEnum OnInit();
 	virtual ErrorCodeEnum OnExit();
@@ -345,6 +344,7 @@ public:
 
 	CSimpleStringA GetAuthErrMsg();
 	void QueryHardwareInfo(SpReqAnsContext<HealthManagerService_QueryHardwareInfo_Req, HealthManagerService_QueryHardwareInfo_Ans>::Pointer ctx);
+	void SetPinPadOpenSuc() { m_bPinPadOpenSuc = true; }
 
 private:
 	
@@ -354,7 +354,6 @@ private:
 	virtual ErrorCodeEnum AsyncContinueEntity(const char *entity_name, void *pData);
 	virtual ErrorCodeEnum AsyncTerminateEntity(const char *entity_name, void *pData);
 	virtual void OnAnswer(CSmartPointer<IAsynWaitSp> pAsynWaitSp);
-	void ToCheckUPS();
 	void SaveOsVersion();
 	CSimpleStringA GetOsVersion();
 	void QueryComputerInfo();
@@ -378,8 +377,8 @@ private:
 		,m_havReceiveMD5OK,m_autoDoInitCount, m_sleepEnterOpMS/*启动第三阶段等待时间,单位毫秒*/, m_sleepColdBootMS/*冷启动等待时间,单位毫秒*/
 		,m_iAccessAuth/*-1 未准入; 0 准入失败;1 准入成功*/, m_iDoNotUpdateWKDaily, m_wkUpdatePeriod;
 	AccessAuthService_ClientBase *m_pACClient;
-	bool m_bInitSuc,m_bInitFail,m_bIdleToMaintain,m_bHasAuthEver,m_bFirstAccessAuth
-		,m_bIEBeforeHealth, m_hasCfgGpioInRootIni,m_bInAccessAuthDoWork,m_bEntityNewStart,m_bDoingAutoInit;
+	bool m_bInitSuc, m_bInitFail, m_bIdleToMaintain, m_bHasAuthEver, m_bFirstAccessAuth
+		, m_bIEBeforeHealth, m_hasCfgGpioInRootIni, m_bInAccessAuthDoWork, m_bEntityNewStart, m_bDoingAutoInit, m_bPinPadOpenSuc;
 	DWORD m_AccessAuthTimeout,m_InitializationTimeout,m_elapseTimeFromOSStart;
 	ULONGLONG m_ullElapseFromOSStart;
 	DeviceControlService_ClientBase *m_pDevCtrlClient;

+ 87 - 321
Module/mod_healthmanager/mod_healthmanager.cpp

@@ -328,115 +328,54 @@ void CHealthManagerEntity::OnStarted()
 #endif
 }
 
-int CHealthManagerEntity::SystemRestart(bool bPeriod, bool bImmediately,bool bNow)
+int CHealthManagerEntity::SystemRestart(bool bPeriod, bool bImmediately, bool bNow)
 {
 	if (bPeriod)
 	{
-		DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("SystemRestart")("restart periodly.");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SystemRestart")("restart periodly.");
 		m_restartTimes = 0;
 	}
 	if (bNow)
 	{
 		m_fsm.QuitFrameworkAndSaveInfo(m_eRebootTrigger, m_eRebootWay);
 		int x = SystemShutdown(TRUE);
-		DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("SystemRestart")("From ie to shutdown %d",x);
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SystemRestart")("From ie to shutdown %d", x);
 		return 0;
 	}
 	SYSTEMTIME localTime;
 	GetLocalTimeRVC(localTime);
 
-	
+
 	CSmartPointer<IConfigInfo> spConfigRun;
 	ErrorCodeEnum err = GetFunction()->OpenConfig(Config_Run, spConfigRun);
 	if (err != Error_Succeed) {
-		DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("SystemRestart")("open cfg file failed!");
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SystemRestart")("open cfg file failed!");
 		return -1;
 	}
-	//
 
-	//ups restart
-	if (m_pUpsClient != NULL)
+	if (!m_bToRestart)
 	{
-		if (!m_bToRestart)
-		{
-			m_restartTimes++;
-			if (m_restartTimes > m_maxRestartTimes)
-			{
-				DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("SystemRestart")("restart too many times(%d,%d),give up.",m_restartTimes,m_maxRestartTimes);
-				m_restartTimes--;
-				return -1;
-			}
-			DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("SystemRestart")("the %d restart.",m_restartTimes);
-			spConfigRun->WriteConfigValueInt("Run","RestartTimes",m_restartTimes);
-			if (m_lastHour != localTime.wHour)
-			{
-				m_lastHour = localTime.wHour;
-				DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("set last hour to %d", m_lastHour);
-				spConfigRun->WriteConfigValueInt("Run", "LastHour", m_lastHour);
-			}
-		}
-		else
-			return 0;
-		UpsService_Shutdown_Req req;
-		UpsService_Shutdown_Ans ans;
-		if (bImmediately)
+		m_restartTimes++;
+		if (m_restartTimes > m_maxRestartTimes)
 		{
-			req.ShutdownTime = 1;
-			req.UpTime = 1;
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SystemRestart")("restart too many times(%d,%d),give up.", m_restartTimes, m_maxRestartTimes);
+			m_restartTimes--;
+			return -1;
 		}
-		else
-		{
-			req.ShutdownTime = 1;//oiltmp
-			req.UpTime = 3; //oiltmp
-		}
-		ErrorCodeEnum eErrShutdown = (*m_pUpsClient)(EntityResource::getLink().upgradeLink())->Shutdown(req,ans,10000);
-		if (eErrShutdown == Error_Succeed)
-		{
-			//m_lastHour = localTime.wHour;
-			DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("SystemRestart")("to shutdown");
-			m_bToRestart = true;
-			Sleep(20000);
-			m_fsm.QuitFrameworkAndSaveInfo(m_eRebootTrigger,m_eRebootWay);
-			int ret;
-			if (m_bGetUpsStateFlag)
-				ret = SystemShutdown();
-			else
-				ret = SystemShutdown(TRUE);
-			DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("after ups,SystemShutdown result %d",ret);
-		}
-		else
-			DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("shutdown failed(%d)",eErrShutdown);
-
-	}
-	else
-	{
-		DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("no ups,so to restart directly.");
-		if (!m_bToRestart)
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SystemRestart")("the %d restart.", m_restartTimes);
+		spConfigRun->WriteConfigValueInt("Run", "RestartTimes", m_restartTimes);
+		if (m_lastHour != localTime.wHour)
 		{
-			m_restartTimes++;
-			if (m_restartTimes > m_maxRestartTimes)
-			{
-				DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("SystemRestart")("restart too many times(%d,%d),give up.",m_restartTimes,m_maxRestartTimes);
-				m_restartTimes--;
-				return -1;
-			}
-			DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("SystemRestart")("the %d restart.",m_restartTimes);
-			spConfigRun->WriteConfigValueInt("Run","RestartTimes",m_restartTimes);
-			if (m_lastHour != localTime.wHour)
-			{
-				m_lastHour = localTime.wHour;
-				DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("SystemRestart")("set last hour to %d", m_lastHour);
-				spConfigRun->WriteConfigValueInt("Run", "LastHour", m_lastHour);
-			}
-			//oilyang 20140606
-			//framework to reboot os
-			//int ret = SystemShutdown(TRUE);
-			m_fsm.QuitFrameworkAndSaveInfo(m_eRebootTrigger,RebootWay_OS);
-			//Dbg("no ups,SystemShutdown result %d",ret);
+			m_lastHour = localTime.wHour;
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("SystemRestart")("set last hour to %d", m_lastHour);
+			spConfigRun->WriteConfigValueInt("Run", "LastHour", m_lastHour);
 		}
+		//oilyang 20140606
+		//framework to reboot os
+		//int ret = SystemShutdown(TRUE);
+		m_fsm.QuitFrameworkAndSaveInfo(m_eRebootTrigger, RebootWay_OS);
 	}
-
-	return 0; 
+	return 0;
 }
 /** 这里建议改用调用框架提供的接口,关机、重启均支持 [Gifur@202135]*/
 //system api shutdown
@@ -500,60 +439,7 @@ int CHealthManagerEntity::SystemShutdown(BOOL bReboot)
 	return 0;//oiltestlinux
 #endif //RVC_OS_WIN
 }
-ErrorCodeEnum CHealthManagerEntity::SystemShutdownThroughUPS(DWORD msPreShutdown, DWORD msPreRestart)
-{
-	bool upsIsNull = true;
-	ErrorCodeEnum result = Error_Unexpect;
-
-	if (m_pUpsClient) {
-		m_pUpsClient->GetFunction()->CloseSession();
-		m_pUpsClient = NULL;
-		upsIsNull = false;
-	}
-	m_pUpsClient = new UpsService_ClientBase(this);
-	ErrorCodeEnum eErrConn = m_pUpsClient->Connect();
-	if (eErrConn != Error_Succeed) {
-		Dbg("Ups connected failed: %s", SpStrError(eErrConn));
-		m_pUpsClient->SafeDelete();
-		m_pUpsClient = NULL;
-		return eErrConn;
-	}
-
-	do
-	{
-		UpsService_GetStatus_Req req;
-		UpsService_GetStatus_Ans ans;
-		ErrorCodeEnum eErrState = (*m_pUpsClient)(EntityResource::getLink().upgradeLink())->GetStatus(req, ans, 3000);
-		Dbg("current state %d", ans.Status);
-
-	} while (false);
-
-	do
-	{
-		UpsService_Shutdown_Req req;
-		UpsService_Shutdown_Ans ans;
-		req.ShutdownTime = msPreShutdown; //刚好可以等到框架退出
-		req.UpTime = msPreRestart; //要求5分钟内拔掉电源来实现真正断电关机
-		ErrorCodeEnum eErrShutdown = (*m_pUpsClient)(EntityResource::getLink().upgradeLink())->Shutdown(req, ans, 10000);
-		if (eErrShutdown == Error_Succeed) {
-			Dbg("Invoke UPS::Shutdown successfully.");
-			result = Error_Succeed;
-		}
-		else {
-			CSimpleStringA tmp = CSimpleStringA::Format("通过UPS关机失败:%s", SpStrError(eErrShutdown));
-			this->GetFunction()->ShowFatalError(tmp);
-			result = eErrShutdown;
-		}
-
-	} while (false);
-
-	if (upsIsNull && m_pUpsClient) {
-		m_pUpsClient->GetFunction()->CloseSession();
-		m_pUpsClient = NULL;
-	}
 
-	return result;
-}
 int CHealthManagerEntity::FrameworkShutdown(bool bRestart)
 {
 #if defined(RVC_OS_WIN)
@@ -717,45 +603,6 @@ void CHealthManagerEntity::AfterWaitRestartPC()
 		SystemRestart(false, true);
 	}
 }
-void CHealthManagerEntity::UpsSupplyLockScreen()
-{
-	ErrorCodeEnum eErr;
-	CSimpleStringA csCustomerHandle("");
-	eErr = GetFunction()->GetSysVar("CustomerHandle",csCustomerHandle);
-	DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("UpsSupplyLockScreen")("ups lock screen cust handle %d,%s",eErr,(LPCTSTR)csCustomerHandle);
-	if (eErr != Error_Succeed)
-	{
-		DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("UpsSupplyLockScreen")("get CustomerHandle failed (%d).",eErr);
-	}
-	else// if (csCustomerHandle[0] == 'N')
-	{
-		CSmartPointer<IEntityFunction> pFunc = GetFunction();
-		CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
-		if (pFuncPrivilege == NULL)
-		{
-			DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("UpsSupplyLockScreen")("display screen NoPrivilege");
-			return;
-		}
-		pFuncPrivilege->DisplayBlueScreen("暂停服务");
-		LogEvent(Severity_High,LOG_EVT_HEALTH_UPS_NO_ELECTOR,"ups no elector,to shutdown machine");
-		DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("UpsSupplyLockScreen")("ups no elector,display screen.");
-		//oiltmp eject card and sth else
-		Sleep(30000);
-		if (m_bUpsWaitLock)
-		{
-			m_bUpsWaitLock = false;
-			m_bScreenLock = true;
-			int ret = SystemShutdown();
-			DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("UpsSupplyLockScreen")("SystemShutdown result %d",ret);
-		}
-		else
-		{
-			pFuncPrivilege->UndisplayBlueScreen();
-			m_bUpsWaitLock = false;
-			m_bScreenLock = false;
-		}
-	}
-}
 void CHealthManagerEntity::OnCheckTimeTimeout()
 {
 	//oilyang@20220330 check if need restart framework by THE key CenterSetting updated.
@@ -857,66 +704,6 @@ void CHealthManagerEntity::OnCheckTimeTimeout()
 				DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("OnCheckTimeTimeout")("restart machine[%d][%d] bRet=%d, LastError=%d", localTime.wHour, localTime.wMinute, bRet, GetLastError());			}
 		}
 	}
-	if (m_pUpsClient == NULL)
-	{
-		CSimpleStringA csRunState("B");
-		GetFunction()->GetSysVar("RunState",csRunState);
-		if (csRunState[0] != 'B' || csRunState[0] != 'I')
-		{
-			if(m_sysStaticInfo.strMachineType.Compare("RVC.Stand2S", true) == 0) ////单屏版没有UPS模块
-			{
-				int ret = ConnectUps();
-				DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("OnCheckTimeTimeout")("connect ups %d.", ret);
-			}
-		}
-	}
-	else
-	{
-		UpsService_GetStatus_Req req;
-		UpsService_GetStatus_Ans ans;
-		ErrorCodeEnum eErrState = (*m_pUpsClient)(EntityResource::getLink().upgradeLink())->GetStatus(req,ans,3000);
-		if (eErrState == Error_Succeed)
-		{
-			m_bGetUpsStateFlag = true;
-			switch(ans.Status)
-			{
-			case UPS_STATUS_NORMAL:
-				m_bUpsWaitLock = false;
-				m_upsNoElectorCount = 0;
-				break;
-			case UPS_STATUS_ERROR_TO_GET_STATUS:
-				m_upsStateCount++;
-				if (m_upsStateCount > 3)
-				{
-					//logwarn oiltmp
-				}
-				break;
-			case UPS_STATUS_NO_ELECTOR:
-				m_bUpsWaitLock = true;
-				m_upsNoElectorCount++;
-				if (m_upsNoElectorCount > 2)
-				{
-					//logwarn oiltmp
-					//notify front end
-					//shutdown pc or not?
-				}
-				break;
-			default:
-				break;
-			}
-			//Dbg("current state %d",ans.Status);
-		}
-		else
-		{
-			DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("OnCheckTimeTimeout")("get ups state failed(%d).",eErrState);
-			m_bGetUpsStateFlag = false;
-			if (eErrState == Error_NetBroken)
-			{
-				m_pUpsClient->GetFunction()->CloseSession();
-				m_pUpsClient = NULL;
-			}
-		}
-	}
 
 	int iCheckGuardian = 0;
 	if (m_fsm.GetFSMState() == HM_FSM_STATE_IDLE || (m_fsm.GetFSMState() == HM_FSM_STATE_CMS))
@@ -1036,28 +823,7 @@ void CHealthManagerEntity::OnCheckTimeTimeout()
 		//m_bWaitRestartPC = false;
 		AfterWaitRestartPC();
 	}
-	if (m_bUpsWaitLock)
-	{
-		UpsSupplyLockScreen();
-	}
-	else
-	{
-		//no need to un-display blue screen? oiltest 20140320
-		//if (m_bScreenLock)
-		//{
-		//	CSmartPointer<IEntityFunction> pFunc = GetFunction();
-		//	CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
-		//	if (pFuncPrivilege == NULL)
-		//	{
-		//		Dbg("unlock screen NoPrivilege");
-		//		return;
-		//	}
-
-		//	pFuncPrivilege->UndisplayBlueScreen();
-		//	m_bScreenLock = false;
 
-		//}
-	}
 	GetFunction()->ResetTimer(HEALTHMANAGER_TIMER_ID, HEALTHMANAGER_TIMER_INTERVAL);
 }
 
@@ -1224,6 +990,9 @@ bool CHealthManagerEntity::StartGuardian()
 {
 	LOG_FUNCTION();
 
+	//oiltmp TODO 如果是未安装,不启动guardian
+	//root.ini 不存在,表示未安装
+
 	DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("StartGuardian")("启动 to start guardian");
 	// Start the child process.
 	CSimpleStringA csBinPath, csAll, csSep("\"");
@@ -1565,35 +1334,7 @@ void CHealthManagerEntity::SplitModuleNames(CSimpleStringA csLine, ModuleReMode
 		}
 	}
 }
-int CHealthManagerEntity::ConnectUps()
-{
-	if (m_pUpsClient == NULL)
-	{
-		m_pUpsClient = new UpsService_ClientBase(this);
-		ErrorCodeEnum eErrConn = m_pUpsClient->Connect();
-		if (eErrConn != Error_Succeed) {
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("ConnectUps")("Ups connected failed(%d).", eErrConn);
-			m_pUpsClient->SafeDelete();
-			m_pUpsClient = NULL;
-		}
-		else
-		{
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("ConnectUps")("ups entity connected.");
-			UpsService_GetStatus_Req req;
-			UpsService_GetStatus_Ans ans;
-			ErrorCodeEnum eErrState = (*m_pUpsClient)(EntityResource::getLink().upgradeLink())->GetStatus(req, ans, 3000);
-			if (eErrState == Error_Succeed)
-			{
-				m_bGetUpsStateFlag = true;
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("ConnectUps")("current state %d", ans.Status);
-				return 0;
-			}
-			else
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("ConnectUps")("connect get ups state failed(%d).", eErrState);
-		}
-	}
-	return -1;
-}
+
 bool CHealthManagerEntity::SaveCurrentVersion()
 {
 	CSimpleStringA csRootVer,csRunInfo,csBakFile,csVerFile;
@@ -1770,40 +1511,30 @@ void CHealthManagerEntity::ReadCenterConfigStr(SpReqAnsContext<HealthManagerServ
 void CHealthManagerEntity::ControlTerminalLife(
 	SpReqAnsContext<HealthManagerService_ControlTerminalLife_Req, HealthManagerService_ControlTerminalLife_Ans>::Pointer ctx)
 {
-    //< !--1:restart app; 2: shutdown app; 3:shutdown app and guardian; 4: restart pc; 5: poweroff; 6:poweroff with ups-- >
+    //< !--1:restart app; 2: shutdown app; 3:shutdown app and guardian; 4: restart pc; 5: poweroff; -- >
 	int retCode = 0;
 	ErrorCodeEnum result = Error_Unexpect;
 	switch (ctx->Req.cmdType) {
 	case 1:
-        retCode = m_fsm.QuitFrameworkAndSaveInfo(RebootTrigger_ManualLocal, RebootWay_Framework);
-        result = Error_Succeed;
+		retCode = m_fsm.QuitFrameworkAndSaveInfo(RebootTrigger_ManualLocal, RebootWay_Framework);
+		result = Error_Succeed;
 		break;
-    case 2:
-        retCode = m_fsm.QuitFrameworkAndSaveInfo(RebootTrigger_Unknown, RebootWay_Framework);
-        result = Error_Succeed;
-        break;
-    case 3:
+	case 2:
+		retCode = m_fsm.QuitFrameworkAndSaveInfo(RebootTrigger_Unknown, RebootWay_Framework);
+		result = Error_Succeed;
+		break;
+	case 3:
 		retCode = m_fsm.QuitFrameworkAndSaveInfo(RebootTrigger_DeadForever, RebootWay_Framework);
 		result = Error_Succeed;
-        break;
-    case 4:
+		break;
+	case 4:
 		retCode = m_fsm.QuitFrameworkAndSaveInfo(RebootTrigger_ManualLocal, RebootWay_OS);
-        result = Error_Succeed;
-        break;
-    case 5:
+		result = Error_Succeed;
+		break;
+	case 5:
 		retCode = m_fsm.QuitFrameworkAndSaveInfo(RebootTrigger_DeadForever, RebootWay_OS);
-        result = Error_Succeed;
-        break;
-    case 6:
-		if(ctx->Req.reserved1 > 0 && ctx->Req.reserved2 > 0)
-			result = SystemShutdownThroughUPS(ctx->Req.reserved1, ctx->Req.reserved2);
-		else 
-            result = SystemShutdownThroughUPS();
-		if (result == Error_Succeed) {
-            Sleep(300);
-            m_fsm.QuitFrameworkAndSaveInfo(RebootTrigger_DeadForever, RebootWay_OS);
-		}
-        break;
+		result = Error_Succeed;
+		break;
 	default:
 		result = Error_Param;
 		break;
@@ -1938,16 +1669,6 @@ void CHealthManagerEntity::OnLog(const CAutoArray<CUUID>& SubIDs, const CUUID nL
 		SystemShutdown();
 		break;
 	}
-	case LOG_EVT_IEBROWSER_SHUTDOWN_MACHINE_THROUGH_UPS:
-	{
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("User descktop said to shutdown machine now through UPS");
-		if (Error_Succeed == SystemShutdownThroughUPS()) {
-			///**TODO(Gifur@7/16/2021): 主动跟监护进程做一次握手,避免在关机过程中提前重启了框架 */
-			Sleep(300);
-			m_fsm.QuitFrameworkAndSaveInfo(RebootTrigger_DeadForever, RebootWay_Framework);
-		}
-		break;
-	}
 	case LOG_EVT_SELFCHECK_OS_RESTART:
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("selfcheck to wait chance to restart(os) pc.");
 		m_eRebootTrigger = RebootTrigger_RunExcepition;
@@ -2111,6 +1832,8 @@ void CHealthManagerEntity::OnLog(const CAutoArray<CUUID>& SubIDs, const CUUID nL
 	}
 	break;
 	case LOG_EVT_PINPAD_OPEN_SUC:
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("PinPad open suc.");
+		m_fsm.SetPinPadOpenSuc();
 		m_fsm.JudgeIfNeedInitFWB();
 		break;
 	case EVENT_MOD_CENTERSETTING_CRITICAL_UPDATE:
@@ -2241,7 +1964,7 @@ bool CHealthManagerEntity::StartManagerDesktopPage(CSimpleStringA pageName)
 		req.param2 = CSimpleStringA::Format("0*0");
 		req.top = -1;
 
-		error = chromiumClient->OpenBrowser(req, ans, 10000);
+		error = (*chromiumClient)(EntityResource::getLink().upgradeLink())->OpenBrowser(req, ans, 10000);
 		chromiumClient->GetFunction()->CloseSession();
 
 		if (error != Error_Succeed)
@@ -3584,6 +3307,49 @@ bool CHealthManagerEntity::IsLackOfConfig(int& stepMode)
 	}
 	return false;
 }
+void CHealthManagerEntity::OnEntityStateHook(const char* pszEntityName, const char* pszTriggerEntity, EntityStateEnum eState, EntityStateEnum eLastState)
+{
+	DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("%s trigger by %s: from %s to %s", pszEntityName, pszTriggerEntity, SpStrEntityState(eLastState), SpStrEntityState(eState));
+	CSmartPointer<IEntityFunction> pFunc = GetFunction();
+	CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
+	if (pFuncPrivilege == NULL)
+	{
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("NoPrivilege");
+		return;
+	}
+	CSmartPointer<IAsynWaitSp> spWait;
+	ErrorCodeEnum errCode;
+	{
+		switch (eState)
+		{
+		case EntityState_Lost:
+		{
+			CSimpleStringA tmpWarnMsg = CSimpleStringA::Format("%s lost. trig entity:%s,lastState:%d", pszEntityName, pszTriggerEntity, eLastState);
+			CEntityStaticInfo esi = { 0 };
+			ErrorCodeEnum ec = GetFunction()->GetEntityStaticInfo(pszEntityName, esi);
+			//0x101 0x21D
+			int iByteHigh, iByteLow;
+			iByteHigh = (esi.wEntityDevelopID & 0xF00) >> 8;
+			iByteLow = esi.wEntityDevelopID & 0xFF;
+			if (iByteHigh < 1 || iByteHigh > 9)
+			{
+				DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("Unexpected entity id:%x", esi.wEntityDevelopID);
+				break;
+			}
+			CSimpleStringA csResultCode(true);
+			//'0':0x30	'A':0x41
+			if (iByteLow > 0 && iByteLow < 10)
+				csResultCode.Format("RTA51%c%c", iByteHigh + 0x30, iByteLow + 0x30);
+			else
+				csResultCode.Format("RTA51%c%c", iByteHigh + 0x30, iByteLow -10 + 0x41);
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402501Z001").setResultCode(csResultCode.GetData())(tmpWarnMsg.GetData());
+		}
+		break;
+		default:
+			break;
+		}
+	}
+}
 
 SP_BEGIN_ENTITY_MAP()
 	SP_ENTITY(CHealthManagerEntity)

+ 36 - 23
Module/mod_healthmanager/mod_healthmanager.h

@@ -12,12 +12,9 @@
 #include "HealthManager_server_g.h"
 using namespace HealthManager;
 
-#include "Ups_client_g.h"
-#include "UpsClass.h"
 #include "UpgradeManager_client_g.h"
 
 using namespace std;
-using namespace Ups;
 using namespace UpgradeManager;
 
 
@@ -33,12 +30,6 @@ typedef ErrorCodeEnum (*pfFrameworkQuit)(RebootTriggerEnum eReason);
 #define DEPLOYSTATE_DONE 1
 #define DEPLOYSTATE_FAILED 2
 
-enum WatchDogOp
-{
-	WD_OP_START,
-	WD_OP_STOP,
-	WD_OP_REFRESH
-};
 enum ModuleReMode
 {
 	RESTART_MODE_DEFAULT,
@@ -97,15 +88,15 @@ public:
 private:
 	CHealthManagerEntity *m_pEntity;
 };
-class CHealthManagerEntity : public CEntityBase, public ILogListener, public ISysVarListener, public IBroadcastListener,public ITimerListener
+class CHealthManagerEntity : public CEntityBase, public ILogListener, public IEntityStateListener, public ISysVarListener, public IBroadcastListener,public ITimerListener
 {
 public:
-	CHealthManagerEntity() :m_bInit(true), m_pUpsClient(NULL)
+	CHealthManagerEntity() :m_bInit(true)
 		, xxx(0), m_MCStart(0), m_bWaitRestartPC(false)
-		, m_upsStateCount(0), m_bUpsWaitLock(false), m_bScreenLock(false), m_bToRestart(false)
-		, m_upsNoElectorCount(0), m_bSayIdle(false), m_bGuardianRun(false), m_bHealthInit(false), m_pUpgMgr(NULL)
+		, m_bScreenLock(false), m_bToRestart(false)
+		, m_bSayIdle(false), m_bGuardianRun(false), m_bHealthInit(false), m_pUpgMgr(NULL)
 		, m_bVerRollback(false), m_eRebootTrigger(RebootTrigger_Resource), m_eRebootWay(RebootWay_Unknown)
-		, m_bGetUpsStateFlag(false), m_menuChoice(""), m_menuPre(""), m_netState("N"), m_bBrowserIdleFirst(true)
+		, m_menuChoice(""), m_menuPre(""), m_netState("N"), m_bBrowserIdleFirst(true)
 		, m_bNeedToRestartPAD(false), m_preDay(99), m_bInMainPage(false), m_maxRunDays(7)
 		, m_bEnterMainPageEver(false), m_connectStatus(0), m_bHaveThrowMainPage(false)
 		,m_bNeedAuthRetry(false), m_bNeedGuardianRestart(true), m_bNeedGuardian(true)
@@ -148,8 +139,19 @@ public:
 		GetFunction()->SubscribeLog(m_uuidHeartBeat,this,Log_Event,Severity_Middle,Error_IgnoreAll,-1,"HeartBeat",false);
 		GetFunction()->SubscribeLog(m_uuidCenterS, this, Log_Event, Severity_Middle, Error_IgnoreAll, -1, "CenterSetting");
 		GetFunction()->SubscribeLog(m_uuidPublic, this, Log_Event, Severity_Middle, Error_IgnoreAll, -1, "Chromium");
+		eErrCode = GetFunction()->SubscribeLog(m_uuidVtmLoader, this, Log_Event, Severity_Middle, Error_IgnoreAll, -1, "VtmLoader");
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("SubscribeLog VtmLoader eErrCode:%d", eErrCode);
 
 		GetFunction()->RegistSysVarEvent("UIState", this);
+		CSmartPointer<IEntityFunction> pFunc = GetFunction();
+		CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
+		eErrCode = pFuncPrivilege->RegistEntityStateEvent(NULL, this);
+		if (eErrCode != Error_Succeed)
+		{
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("RegistEntityState failed(%d).", eErrCode);
+			pTransactionContext->SendAnswer(eErrCode);
+			return;
+		}
 		//UpgradeManager
 
 #if defined(RVC_OS_WIN)
@@ -205,6 +207,18 @@ public:
 
 	void DoEvent(SpReqAnsContext<HealthManagerService_DoEvent_Req, HealthManagerService_DoEvent_Ans>::Pointer ctx)
 	{
+		//oiltest
+		if (ctx->Req.code == Event_VtmLoader_EntityLoad_Finished || ctx->Req.code == Event_VtmLoader_EntityLoad_Failed)
+		{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("receive Event_VtmLoader_EntityLoad_Finished");
+			FSMEvent* pEvt = new FSMEvent(USER_EVT_VTMLOADER_FINISHED);
+			if (ctx->Req.code == Event_VtmLoader_EntityLoad_Finished)
+				pEvt->param1 = 0;
+			else
+				pEvt->param1 = 1;
+			m_fsm.PostEventFIFO(pEvt);
+		}
+		ctx->Answer(Error_Succeed);
 	}
 
 	void GetEntityCfgInfo(SpReqAnsContext<HealthManagerService_GetEntityCfgInfo_Req, HealthManagerService_GetEntityCfgInfo_Ans>::Pointer ctx)
@@ -231,7 +245,6 @@ public:
 
 	int SystemRestart(bool bPeriod,bool bUpsImmediately,bool bNow=false);
 	int SystemShutdown(BOOL bReboot=FALSE);
-	ErrorCodeEnum  SystemShutdownThroughUPS(DWORD msPreShutdown = 5, DWORD msPreRestart = 5);
 	int FrameworkShutdown(bool bRestart=true);
 	int UpdateSiteChangeFlag();
 	int UpdateSiteToRuncfg(bool bWriteSite=true,bool bClearSiteFlag = false);
@@ -263,33 +276,35 @@ public:
 	 * @return : true: 为未配置模式,false:正常模式
 	 */
 	bool IsLackOfConfig(int& stepMode);
+	virtual void OnEntityStateHook(const char* pszEntityName, const char* pszTriggerEntity, EntityStateEnum eState, EntityStateEnum eLastState);
+	virtual void OnUserStateHook(const char* pszEntityName, DWORD dwState, DWORD dwLastState) { return; }
+	virtual void OnCeateConnection(const char* pszCallerEntity, const char* pszServiceEntity) { return; }
+	virtual void OnCloseConnection(const char* pszCallerEntity, const char* pszServiceEntity) { return; }
 
 private:
 	CHealthManagerFSM m_fsm;
 	//the following is useless?just one var is ok? oiltmp
 	CUUID m_uuidUpdate,m_uuidMediaController,m_uuidFaceTracking,m_uuidAccessAuth,m_uuidSelfChecker
-		, m_uuidRemoteController, m_uuidGUIConsole, m_uuidHeartBeat, m_uuidIE, m_uuidCenterS;
+		, m_uuidRemoteController, m_uuidGUIConsole, m_uuidHeartBeat, m_uuidIE, m_uuidCenterS, m_uuidVtmLoader;
 	CUUID m_uuidCardSwiper,m_uuidPublic, m_uuid4SIPPhone;
 	int m_devCfgNum,m_connectStatus;
 	int m_restartHour, m_restartMinute, m_lastHour, m_restartTimes, m_maxRestartTimes, m_preDay, m_dayNum, m_maxRunDays;
-	bool m_bInit,m_bWaitRestartPC,m_bUpsWaitLock,m_bScreenLock,m_bToRestart,m_testFlag,m_bSayIdle
+	bool m_bInit, m_bWaitRestartPC, m_bScreenLock, m_bToRestart, m_testFlag, m_bSayIdle
 		, m_bGuardianRun, m_bHealthInit, m_bVerRollback, m_bBrowserIdleFirst, m_bNeedToRestartPAD
-		, m_bInMainPage, m_bEnterMainPageEver,m_bHaveThrowMainPage,m_bToRestartByCenterSetting;
+		, m_bInMainPage, m_bEnterMainPageEver, m_bHaveThrowMainPage, m_bToRestartByCenterSetting;
 	bool m_bNeedAuthRetry/*需要重试准入*/, m_bNeedGuardianRestart/*需要重启*/, m_bNeedGuardian;
 	DWORD m_wDayOfWeek,m_MCStart,m_MCEnd,m_dwTimeOfAuthSuc;
-	int xxx,m_upsStateCount,m_upsNoElectorCount,m_worktimeStart, m_worktimeEnd,m_maxWaitMainpageTime;
+	int xxx,m_worktimeStart, m_worktimeEnd,m_maxWaitMainpageTime;
 	RebootTriggerEnum m_eRebootTrigger;
 	RebootWayEnum m_eRebootWay;
 	CSimpleStringA m_menuChoice,m_currentVer,m_menuPre,m_netState, m_versionEx;
 	map<CSimpleStringA,ModuleRunInfo> m_modRunInfo;
 	map<CSimpleStringA,ModuleReMode> m_modCfgInfo;
 	map<ModuleReMode,RestartModeInfo> m_restartMode;
-	UpsService_ClientBase *m_pUpsClient;
 	UpgradeMgrService_ClientBase *m_pUpgMgr;
 
 	pfShakeHands m_pfShake;
 	pfUpgradeRestart m_pfUpgradeRestart;
-	bool m_bGetUpsStateFlag;
 	CSystemStaticInfo m_sysStaticInfo;
 	bool m_fConfigMode;
 
@@ -298,8 +313,6 @@ private:
 	void OnCheckTimeTimeout();
 	ErrorCodeEnum RestartModule(const char* pEntityName);
 	void AfterWaitRestartPC();
-	void UpsSupplyLockScreen();
-	int ConnectUps();
 	void SplitModuleNames(CSimpleStringA csLine,ModuleReMode eMode);
 	bool SaveCurrentVersion();
 	bool SaveFrameStartTimeForUpgrade();

+ 38 - 58
Module/mod_pinpad/PinPadFSM.cpp

@@ -33,10 +33,6 @@ void CPinPadFSM::ToLogWarnInfoAboutTermCustom()
 		strFileHash = nullptr;
 	}
 
-	if (m_b3DESLoaded)
-		termInfo["3desKeyLoad"] = "true";
-	else
-		termInfo["3desKeyLoad"] = "false";
 	if (m_bSMLoaded)
 		termInfo["SMKeyLoad"] = "true";
 	else
@@ -81,6 +77,7 @@ void CPinPadFSM::s0_on_entry()
 	LOG_FUNCTION();
 	FSMEvent *e = new FSMEvent(USER_EVT_INIT);
 	PostEventFIFO(e);
+	m_ullConnectCost = SP::Module::Comm::RVCGetTickCount();
 }
 void CPinPadFSM::s0_on_exit()
 {
@@ -361,14 +358,10 @@ int CPinPadFSM::Initial()
 	ErrorCodeEnum eErrDev;
 	auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
 
-	CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
-	CSmartPointer<IConfigInfo> spConfig;
-	eErrDev = spEntityFunction->OpenConfig(Config_Root, spConfig);
-	if (eErrDev != Error_Succeed) {
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("open cfg file failed! %s", SpStrError(eErrDev));
-		LogWarn(Severity_Middle, eErrDev, PinPad_UserErrorCode_Open_Root_File_Failed, "Initial:OpenConfig");
-		return eErrDev;
-	}
+	GetEntityBase()->GetFunction()->GetSystemStaticInfo(m_sysStaticInfo);
+	m_deviceNo = m_sysStaticInfo.strTerminalID;
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("m_deviceNo:%s", m_deviceNo.GetData());
+	m_devCheckData = "0000000000000000";
 
 	CSimpleStringA tmpVendor(""), tmpDevSN(""), tmpDLLVersion(""), csDepPath(""), csBackslash(SPLIT_SLASH_STR);
 	GetEntityBase()->GetFunction()->GetSysVar("FWBVendor", tmpVendor);
@@ -410,12 +403,8 @@ int CPinPadFSM::Initial()
 	HARDWARE_ENTITY_SET_VENDOR_NAME(m_entCode, m_adapterInfo.strVendor);
 	ToLogRootINIInfo();
 	pEntity->InitializeVendorLogSwitch();
-	spConfig->ReadConfigValue("Terminal", "TerminalNo", m_deviceNo);
-	m_devCheckData = "0000000000000000";
-	m_keySN = "000";
-	//写死,不从root.ini中读取
-	//spConfig->ReadConfigValue("Device.PinPad", "Checkdata", m_devCheckData);
-	//spConfig->ReadConfigValue("Device.PinPad", "Keysn", m_keySN);
+	
+
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to load vendor dll.");
 
 	eErrDev = m_hDevHelper.LoadUp(m_adapterInfo.adapterFilePath);
@@ -494,20 +483,17 @@ int CPinPadFSM::Initial()
 	m_encryptkey = m_hDevHelper->GetEncryptFunc();
 	m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetEncryptFunc").setCostTime(m_ullEndTime - m_ullBeginTime)("Error_Succeed");
-	eErrDev = spEntityFunction->OpenConfig(Config_Run, spConfig);
+	CSmartPointer<IConfigInfo> spConfig;
+	eErrDev = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfig);
 	if (eErrDev != Error_Succeed)
 	{
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("read run cfg failed(sm).");
-		m_b3DESLoaded = false;
 		m_bSMLoaded = false;
 		LogWarn(Severity_Middle, eErrDev, PinPad_UserErrorCode_Open_RunCfgFile_Failed, "Initial:OpenConfig");
 	}
 	else
 	{
 		int tmpLoad = 0;
-		eErrDev = spConfig->ReadConfigValueInt("Load", "3DES", tmpLoad);
-		if (eErrDev == Error_Succeed)
-			m_b3DESLoaded = tmpLoad;
 		eErrDev = spConfig->ReadConfigValueInt("Load", "SM", tmpLoad);
 		if (eErrDev == Error_Succeed)
 			m_bSMLoaded = tmpLoad;
@@ -515,7 +501,7 @@ int CPinPadFSM::Initial()
 		spConfig->ReadConfigValue("Load", "SN_SM", m_keySNSM);
 		spConfig->ReadConfigValue("Load", "ckckck", m_lastCheckCode);
 	}
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("encrypt key :%d,load key :%d,%d", m_encryptkey,m_b3DESLoaded,m_bSMLoaded);
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("encrypt key :%d,load key :%d", m_encryptkey,m_bSMLoaded);
 	DevCategoryInfo devInfo;
 	ZeroMemory(devInfo.szModel, MAX_DEV_MODEL_LEN);
 	ZeroMemory(devInfo.szType, MAX_DEV_TYPE_LEN);
@@ -540,7 +526,8 @@ int CPinPadFSM::Initial()
 	}
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("model:%s,type:%s,vendor:%s", (const char*)m_szModel, (const char*)m_szType, (const char*)m_szVendor);
 
-	CSimpleStringA xTmpStr = CSimpleStringA::Format("(hw support):%d,load key :%d,%d,SMSN:%s", m_encryptkey, m_b3DESLoaded, m_bSMLoaded, m_keySNSM.GetData());
+	CSimpleStringA xTmpStr = CSimpleStringA::Format("(hw support):%d,load key :%d,SMSN:%s", m_encryptkey, m_bSMLoaded, m_keySNSM.GetData());
+	LogWarn(Severity_Low, Error_Unexpect, PinPad_UserErrorCode_DevConnect_CostTime, CSimpleStringA::Format("%d",(SP::Module::Comm::RVCGetTickCount()-m_ullConnectCost)/1000));
 	LogWarn(Severity_Low, Error_Unexpect, PinPad_UserErrorCode_PinPad_InfoAboutKey_Onboot, xTmpStr.GetData());
 	LogEvent(Severity_Middle, LOG_EVT_PINPAD_OPEN_SUC, "Open pinpad suc.");
 	return 0;
@@ -666,7 +653,6 @@ ErrorCodeEnum CPinPadFSM::GetEncryptText(SpReqAnsContext<PinPadService_GetInputS
 	LOG_FUNCTION();
 	ErrorCodeEnum errCode;
 	CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
-	//bSMFlag:to use 3des or use sm
 	int len, timeout;
 	bool confirm, bSMFlag = false;
 
@@ -682,6 +668,8 @@ ErrorCodeEnum CPinPadFSM::GetEncryptText(SpReqAnsContext<PinPadService_GetInputS
 	if (!bSMFlag)
 	{
 		LogWarn(Severity_Low, Error_Unexpect, PinPad_UserErrorCode_PinPad_Not_SM, "Encryption is not SM");
+		ctxSM->Answer(Error_Unexpect, PinPad_UserErrorCode_UnknownSMFlag);
+		return Error_Unexpect;
 	}
 
 	AccountInfo accInfo;
@@ -730,10 +718,7 @@ ErrorCodeEnum CPinPadFSM::GetEncryptText(SpReqAnsContext<PinPadService_GetInputS
 		return Error_DevCommFailed;
 	}
 	m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
-	if (!bSMFlag)
-		errCode = m_hDevHelper->ActiveWorkingKey(0, 0);
-	else
-		errCode = m_hDevHelper->ActiveWorkingKey(1, 0);
+	errCode = m_hDevHelper->ActiveWorkingKey(1, 0);
 	m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ActiveWorkingKey").setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(errCode));
 	if (errCode != Error_Succeed)
@@ -752,14 +737,7 @@ ErrorCodeEnum CPinPadFSM::GetEncryptText(SpReqAnsContext<PinPadService_GetInputS
 		return Error_DevCommFailed;
 	}
 	m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
-	if (!bSMFlag)
-	{
-		errCode = m_hDevHelper->SetParam(EPP_PT_SET_PIN_ALGORITH, EPP_PIN_ALGO_ISO9564_1_ANSI);
-	}
-	else
-	{
-		errCode = m_hDevHelper->SetParam(EPP_PT_SET_PIN_ALGORITH, EPP_PIN_ALGO_SM4);
-	}
+	errCode = m_hDevHelper->SetParam(EPP_PT_SET_PIN_ALGORITH, EPP_PIN_ALGO_SM4);
 	m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetParam").setCostTime(m_ullEndTime - m_ullBeginTime)("%s", SpStrError(errCode));
 	if (errCode != Error_Succeed)
@@ -943,10 +921,7 @@ Err:
 		memset(dstInfo.data, 0, MAX_EN_DECRYPT_DATA_SIZE);
 		//set param
 		m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
-		if (!bSMFlag)
-			errCode = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_3DES);
-		else
-			errCode = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_SM4);
+		errCode = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_SM4);
 		if (errCode == Error_Succeed)
 			errCode = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE, EPP_ALGO_MODE_CBC);
 		m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
@@ -1003,15 +978,7 @@ Err:
 		}
 		ctxSM->Ans.checkcode = tmpCheckCode;
 		ctxSM->Ans.deviceno = m_deviceNo;
-		if (!bSMFlag)
-			ctxSM->Ans.keyseq = m_keySN;
-		else
-		{
-			if (m_keySNSM.GetLength() < 2)//如果忘记配置
-				ctxSM->Ans.keyseq = "001";
-			else
-				ctxSM->Ans.keyseq = m_keySNSM;
-		}
+		ctxSM->Ans.keyseq = m_keySNSM;
 
 		CSimpleStringA tmpLastCkCode = m_lastCheckCode;
 		if (m_lastCheckCode.IsNullOrEmpty() || strnicmp(tmpCheckCode, m_lastCheckCode, m_lastCheckCode.GetLength()) != 0)
@@ -1028,12 +995,12 @@ Err:
 		}
 		if (!tmpLastCkCode.IsNullOrEmpty() && strnicmp(tmpCheckCode, tmpLastCkCode, tmpLastCkCode.GetLength()) != 0)
 		{
-			CSimpleStringA xCkChangeMsg = CSimpleStringA::Format("last ck:%s,current ck:%s,m_keySN:%s,m_keySNSM:%s", tmpLastCkCode.GetData()
-				, tmpCheckCode, m_keySN.GetData(), m_keySNSM.GetData());
+			CSimpleStringA xCkChangeMsg = CSimpleStringA::Format("last ck:%s,current ck:%s,m_keySNSM:%s", tmpLastCkCode.GetData()
+				, tmpCheckCode, m_keySNSM.GetData());
 			LogWarn(Severity_Low, Error_Unexpect, PinPad_UserErrorCode_PinPad_CheckCode_Changed, xCkChangeMsg.GetData());
 		}
 
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_keySN:%s,m_keySNSM:%s", (const char*)m_keySN, (const char*)m_keySNSM);
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_keySNSM:%s", (const char*)m_keySNSM);
 	}
 	else
 	{
@@ -1079,8 +1046,14 @@ int CPinPadFSM::GetInput(SpReqAnsContext<PinPadService_GetInputSM_Req, PinPadSer
 		m_bPinInput = false;
 		return 1;
 	}
-	ErrorCodeEnum err;
 
+	if (!m_inputSMCtx->Req.encrypt)
+	{
+		SetErrPackage("GetInput(SM)", m_devSN, Error_Unexpect, PinPad_UserErrorCode_NoPlainInput);
+		m_inputSMCtx->Answer(Error_Unexpect, AlarmDEC());
+		return 1;
+	}
+	ErrorCodeEnum err;
 	err = GetEncryptText(m_inputSMCtx);
 
 	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)
@@ -1141,7 +1114,6 @@ int CPinPadFSM::LoadKeySM(SpReqAnsContext<PinPadService_LoadKeysSM_Req, PinPadSe
 				return 0;
 			}
 #endif
-			return 0;
 		}
 		else
 		{
@@ -1282,7 +1254,7 @@ int CPinPadFSM::LoadKeySM(SpReqAnsContext<PinPadService_LoadKeysSM_Req, PinPadSe
 int CPinPadFSM::EncryptSM(SpReqAnsContext<PinPadService_EncryptDataSM_Req, PinPadService_EncryptDataSM_Ans>::Pointer ctx)
 {
 
-	if (ctx->Req.smflag == 1 || ctx->Req.smflag == 11)
+	if (!(ctx->Req.smflag == 1 || ctx->Req.smflag == 11))
 	{
 		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("密钥标识不支持,ctx->Req.smflag:%d", ctx->Req.smflag);
 		ctx->Answer(Error_Unexpect, PinPad_UserErrorCode_UnknownSMFlag);
@@ -1342,6 +1314,7 @@ ErrorCodeEnum CPinPadFSM::GetCheckCode(SpReqAnsContext<PinPadService_GetCheckCod
 	ErrorCodeEnum eErr = Error_Unexpect;
 	bool bGetOK = true;
 	ctx->Ans.checkcode.Init(ctx->Req.mSN.GetCount());
+	ctx->Ans.index.Init(ctx->Req.mSN.GetCount());
 	for (int i = 0; i < ctx->Req.mSN.GetCount(); i++)
 	{
 		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("mSN:%d,wSN:%d,origData[%s]", ctx->Req.mSN[i], ctx->Req.wSN[i], m_devCheckData.GetData());
@@ -1350,7 +1323,12 @@ ErrorCodeEnum CPinPadFSM::GetCheckCode(SpReqAnsContext<PinPadService_GetCheckCod
 		if (ctx->Req.mSN[i] == 1)
 			eErr = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_SM4);
 		else
-			eErr = m_hDevHelper->SetParam(EPP_PT_SET_ENCRYPT_METHOD, EPP_ALGO_METHOD_3DES);
+		{
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(PinPadService_LogCode_GetCheckCode).setResultCode("RTA260B")("mSN:%d", ctx->Req.mSN[i]);
+			ctx->Ans.checkcode[i] = "";
+			ctx->Ans.index[i] = "";
+			continue;
+		}
 		if (eErr == Error_Succeed)
 			eErr = m_hDevHelper->SetParam(EPP_PT_SET_ECB_CBC_MODE, EPP_ALGO_MODE_CBC);
 		else
@@ -1391,6 +1369,8 @@ ErrorCodeEnum CPinPadFSM::GetCheckCode(SpReqAnsContext<PinPadService_GetCheckCod
 				return Error_DevCommFailed;
 			}
 			ctx->Ans.checkcode[i] = (const char*)dstInfo.data;
+			if (ctx->Req.wSN[i] == 0)
+				ctx->Ans.index[i] = m_keySNSM;
 		}
 	}
 	DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setLogCode("QLR040220610")("计算校验码成功");

+ 7 - 9
Module/mod_pinpad/PinPadFSM.h

@@ -179,7 +179,7 @@ public:
 		m_bWaitingMore(false), m_bExit(false), m_bPlainPin(true),
 		m_bEntityExit(false), m_bPinInput(false), m_bLoadKey(false), m_bEncrypt(false)
 		, m_dwDevCommFailCount(0), m_dwPinPadRunCount(0), m_eDevState(DEVICE_STATUS_NOT_READY), m_encryptkey(1)
-		, m_bSM(false), m_b3DESLoaded(false), m_bSMLoaded(false), m_iInWhatPage(PageType_Other), m_szModel(""), m_szType("")
+		, m_bSM(false), m_bSMLoaded(false), m_iInWhatPage(PageType_Other), m_szModel(""), m_szType("")
 		, m_szVendor(""),m_csMachineType(true), m_csSite(true), m_terminalNo(true), m_port(true), m_Baudrate(true)
 		, m_devSN(""){
 			HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x206);
@@ -266,8 +266,7 @@ public:
 		devFunc = loadFunc = 0;
 		devFunc = m_encryptkey;
 		int tmp = 0;
-		if (m_b3DESLoaded)
-			tmp = 1;
+
 		if (m_bSMLoaded)
 			tmp += 2;
 		
@@ -275,9 +274,7 @@ public:
 			loadFunc = 2;
 		else
 			loadFunc = tmp;
-		//20161216 oilyang add 为了兼容密钥更新有问题的设备
-		if (loadFunc == 0)
-			loadFunc = 1;
+
 		return 0;
 	}
 
@@ -293,9 +290,9 @@ private:
 	SpReqAnsContext<PinPadService_GetInputSM_Req, PinPadService_GetInputSM_Ans>::Pointer m_inputSMCtx;
 	char m_szAccount[MAX_ACCOUNT_LEN];
 	bool m_bFrontCancel,m_bWaitingMore,m_bExit,m_bPlainPin,m_bEntityExit
-		,m_bPinInput,m_bLoadKey,m_bEncrypt,m_bSM,m_b3DESLoaded,m_bSMLoaded;
-	ULLINT m_ullBeginTime, m_ullEndTime;
-	CSimpleStringA m_deviceNo, m_port, m_Baudrate, m_devCheckData,m_keySN,m_keySNSM,m_szModel,m_szType,m_szVendor,m_devSN/*fwb SN*/;
+		,m_bPinInput,m_bLoadKey,m_bEncrypt,m_bSM,m_bSMLoaded;
+	ULLINT m_ullBeginTime, m_ullEndTime,m_ullConnectCost;
+	CSimpleStringA m_deviceNo, m_port, m_Baudrate, m_devCheckData,m_keySNSM,m_szModel,m_szType,m_szVendor,m_devSN/*fwb SN*/;
 	char m_buf[4];
 	ErrorCodeEnum m_testResult;
 	DWORD m_dwDevCommFailCount,m_dwPinPadRunCount;
@@ -303,6 +300,7 @@ private:
 	int m_encryptkey;
 	int m_iInWhatPage/*在哪个页面,区分首页,用户桌面,其他页*/;
 	CSimpleStringA m_csMachineType, m_csSite, m_terminalNo,m_lastCheckCode;
+	CSystemStaticInfo m_sysStaticInfo;
 
 	CSimpleStringA m_csAlarmMsg;
 	map<int, CtxInfo> m_mapCtx;

+ 3 - 1
Module/mod_pinpad/PinPad_UserErrorCode.h

@@ -29,7 +29,7 @@
 #define PinPad_UserErrorCode_PinPad_SM_First						(PinPad_UserErrorCode_Start + 21)
 #define PinPad_UserErrorCode_PinPad_LoadKey_SMSN					(PinPad_UserErrorCode_Start + 22)
 #define PinPad_UserErrorCode_PinPad_LoadKey_Clear_SMSN				(PinPad_UserErrorCode_Start + 23)
-#define PinPad_UserErrorCode_PinPad_LoadKey_3DesSN					(PinPad_UserErrorCode_Start + 24)
+//#define PinPad_UserErrorCode_PinPad_LoadKey_3DesSN					(PinPad_UserErrorCode_Start + 24)
 #define PinPad_UserErrorCode_PinPad_InfoAboutKey_Onboot				(PinPad_UserErrorCode_Start + 25)
 #define PinPad_UserErrorCode_PinPad_CheckCode_Changed				(PinPad_UserErrorCode_Start + 26)
 
@@ -43,4 +43,6 @@
 #define PinPad_UserErrorCode_PinPad_GetPinBlock_Call				(PinPad_UserErrorCode_Start + 32)
 #define PinPad_UserErrorCode_Unexpected_Exit						(PinPad_UserErrorCode_Start + 33)
 #define PinPad_UserErrorCode_UnknownSMFlag							(PinPad_UserErrorCode_Start + 34)
+#define PinPad_UserErrorCode_DevConnect_CostTime					(PinPad_UserErrorCode_Start + 35)
+#define PinPad_UserErrorCode_NoPlainInput							(PinPad_UserErrorCode_Start + 36)
 #endif //_PINPAD_USER_ERROR_CODE_H

+ 0 - 147
Module/mod_pinpad/PinPad_client_g.h

@@ -59,55 +59,6 @@ public:
 		return Error;
 	}
 
-	ErrorCodeEnum GetInput(PinPadService_GetInput_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(PinPadService_Method_GetInput, PinPadService_MethodSignature_GetInput, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum GetInput(PinPadService_GetInput_Req &Req, PinPadService_GetInput_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = GetInput(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum GetInput(PinPadService_GetInput_Req &Req, PinPadService_GetInput_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = GetInput(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum GetInput(PinPadService_GetInput_Req &Req, PinPadService_GetInput_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = GetInput(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
 	ErrorCodeEnum InputWaitMore()
 	{
 		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
@@ -150,104 +101,6 @@ public:
 		return ret;
 	}
 
-	ErrorCodeEnum LoadKeys(PinPadService_LoadKeys_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(PinPadService_Method_LoadKeys, PinPadService_MethodSignature_LoadKeys, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum LoadKeys(PinPadService_LoadKeys_Req &Req, PinPadService_LoadKeys_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = LoadKeys(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum LoadKeys(PinPadService_LoadKeys_Req &Req, PinPadService_LoadKeys_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = LoadKeys(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum LoadKeys(PinPadService_LoadKeys_Req &Req, PinPadService_LoadKeys_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = LoadKeys(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum EncryptData(PinPadService_EncryptData_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(PinPadService_Method_EncryptData, PinPadService_MethodSignature_EncryptData, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum EncryptData(PinPadService_EncryptData_Req &Req, PinPadService_EncryptData_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = EncryptData(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum EncryptData(PinPadService_EncryptData_Req &Req, PinPadService_EncryptData_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = EncryptData(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum EncryptData(PinPadService_EncryptData_Req &Req, PinPadService_EncryptData_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = EncryptData(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
 	ErrorCodeEnum GetInputSM(PinPadService_GetInputSM_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
 	{
 		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();

+ 3 - 87
Module/mod_pinpad/PinPad_def_g.h

@@ -12,12 +12,9 @@ namespace PinPad {
 // const goes here
 //
 
-#define PinPadService_Method_GetInput 0
 #define PinPadService_Method_InputWaitMore 1
 #define PinPadService_Method_InputCancel 2
 #define PinPadService_Method_Exit 3
-#define PinPadService_Method_LoadKeys 4
-#define PinPadService_Method_EncryptData 5
 #define PinPadService_Method_GetInputSM 6
 #define PinPadService_Method_LoadKeysSM 7
 #define PinPadService_Method_EncryptDataSM 8
@@ -25,12 +22,9 @@ namespace PinPad {
 #define PinPadService_Method_GetCheckCode 10
 #define PinPadService_Method_GetDevInfo 65535
 
-#define PinPadService_MethodSignature_GetInput 90833662
 #define PinPadService_MethodSignature_InputWaitMore -1387532134
 #define PinPadService_MethodSignature_InputCancel 1552926476
 #define PinPadService_MethodSignature_Exit -1158854104
-#define PinPadService_MethodSignature_LoadKeys -99876521
-#define PinPadService_MethodSignature_EncryptData 68188518
 #define PinPadService_MethodSignature_GetInputSM -1531281659
 #define PinPadService_MethodSignature_LoadKeysSM -2091559314
 #define PinPadService_MethodSignature_EncryptDataSM 1251510330
@@ -38,12 +32,10 @@ namespace PinPad {
 #define PinPadService_MethodSignature_GetCheckCode -1480133527
 #define PinPadService_MethodSignature_GetDevInfo 296205965
 
-#define PinPadService_LogCode_GetInput "QLR040220600"
+
 #define PinPadService_LogCode_InputWaitMore "QLR040220601"
 #define PinPadService_LogCode_InputCancel "QLR040220602"
 #define PinPadService_LogCode_Exit "QLR040220603"
-#define PinPadService_LogCode_LoadKeys "QLR040220604"
-#define PinPadService_LogCode_EncryptData "QLR040220605"
 #define PinPadService_LogCode_GetInputSM "QLR040220606"
 #define PinPadService_LogCode_LoadKeysSM "QLR040220607"
 #define PinPadService_LogCode_EncryptDataSM "QLR040220608"
@@ -51,36 +43,6 @@ namespace PinPad {
 #define PinPadService_LogCode_GetCheckCode "QLR040220610"
 #define PinPadService_LogCode_GetDevInfo "QLR040220699"
 
-struct PinPadService_GetInput_Req
-{
-	int timeout;
-	int length;
-	bool encrypt;
-	bool confirm;
-	CSimpleStringA account;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & timeout & length & encrypt & confirm & account;
-	}
-
-};
-
-struct PinPadService_GetInput_Ans
-{
-	CSimpleStringA data;
-	CSimpleStringA deviceno;
-	CSimpleStringA keyseq;
-	CSimpleStringA checkcode;
-	bool enter;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & data & deviceno & keyseq & checkcode & enter;
-	}
-
-};
-
 struct PinPadService_InputWaitMore_Info
 {
 
@@ -108,53 +70,6 @@ struct PinPadService_Exit_Info
 
 };
 
-struct PinPadService_LoadKeys_Req
-{
-	CSimpleStringA masterkey;
-	CSimpleStringA workingkey1;
-	CSimpleStringA workingkey2;
-	bool initializeflag;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & masterkey & workingkey1 & workingkey2 & initializeflag;
-	}
-
-};
-
-struct PinPadService_LoadKeys_Ans
-{
-	int result;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & result;
-	}
-
-};
-
-struct PinPadService_EncryptData_Req
-{
-	CSimpleStringA data;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & data;
-	}
-
-};
-
-struct PinPadService_EncryptData_Ans
-{
-	CSimpleStringA ciphertext;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & ciphertext;
-	}
-
-};
-
 struct PinPadService_GetInputSM_Req
 {
 	int timeout;
@@ -304,10 +219,11 @@ struct PinPadService_GetCheckCode_Req
 struct PinPadService_GetCheckCode_Ans
 {
 	CAutoArray<CSimpleStringA> checkcode;
+	CAutoArray<CSimpleStringA> index;
 
 	void Serialize(SpBuffer &Buf)
 	{
-		auto & buf = Buf & checkcode;
+		auto & buf = Buf & checkcode & index;
 	}
 
 };

+ 0 - 81
Module/mod_pinpad/PinPad_server_g.h

@@ -30,13 +30,6 @@ public:
 	{
 		ErrorCodeEnum Error = Error_Succeed;
 		switch (dwMessageID) {
-		case PinPadService_Method_GetInput:
-			if (dwSignature == PinPadService_MethodSignature_GetInput) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
 		case PinPadService_Method_InputWaitMore:
 			if (dwSignature == PinPadService_MethodSignature_InputWaitMore) {
 				bOverlap = true;
@@ -58,20 +51,6 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
-		case PinPadService_Method_LoadKeys:
-			if (dwSignature == PinPadService_MethodSignature_LoadKeys) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case PinPadService_Method_EncryptData:
-			if (dwSignature == PinPadService_MethodSignature_EncryptData) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
 		case PinPadService_Method_GetInputSM:
 			if (dwSignature == PinPadService_MethodSignature_GetInputSM) {
 				bOverlap = true;
@@ -125,11 +104,6 @@ public:
 	{
 		ErrorCodeEnum Error = Error_Succeed;
 		switch (dwMessageID) {
-		case PinPadService_Method_GetInput:
-			if (dwSignature != PinPadService_MethodSignature_GetInput) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
 		case PinPadService_Method_InputWaitMore:
 			if (dwSignature != PinPadService_MethodSignature_InputWaitMore) {
 				Error = Error_MethodSignatureFailed;
@@ -145,16 +119,6 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
-		case PinPadService_Method_LoadKeys:
-			if (dwSignature != PinPadService_MethodSignature_LoadKeys) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case PinPadService_Method_EncryptData:
-			if (dwSignature != PinPadService_MethodSignature_EncryptData) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
 		case PinPadService_Method_GetInputSM:
 			if (dwSignature != PinPadService_MethodSignature_GetInputSM) {
 				Error = Error_MethodSignatureFailed;
@@ -192,11 +156,6 @@ public:
 		return Error;
 	}
 
-	virtual void Handle_GetInput(SpReqAnsContext<PinPadService_GetInput_Req, PinPadService_GetInput_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
 	virtual void Handle_InputWaitMore(SpOnewayCallContext<PinPadService_InputWaitMore_Info>::Pointer ctx)
 	{
 	/// override by user
@@ -212,16 +171,6 @@ public:
 	/// override by user
 	}
 
-	virtual void Handle_LoadKeys(SpReqAnsContext<PinPadService_LoadKeys_Req, PinPadService_LoadKeys_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_EncryptData(SpReqAnsContext<PinPadService_EncryptData_Req, PinPadService_EncryptData_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
 	virtual void Handle_GetInputSM(SpReqAnsContext<PinPadService_GetInputSM_Req, PinPadService_GetInputSM_Ans>::Pointer ctx)
 	{
 	/// override by user
@@ -268,16 +217,6 @@ public:
 			}
 #endif
 			switch (dwMessageID) {
-				case PinPadService_Method_GetInput:
-					{
-						SpReqAnsContext<PinPadService_GetInput_Req,PinPadService_GetInput_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<PinPadService_GetInput_Req,PinPadService_GetInput_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_GetInput(ctx);
-					}
-					break;
 				case PinPadService_Method_InputWaitMore:
 					{
 						SpOnewayCallContext<PinPadService_InputWaitMore_Info>::Pointer ctx;
@@ -308,26 +247,6 @@ public:
 						Handle_Exit(ctx);
 					}
 					break;
-				case PinPadService_Method_LoadKeys:
-					{
-						SpReqAnsContext<PinPadService_LoadKeys_Req,PinPadService_LoadKeys_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<PinPadService_LoadKeys_Req,PinPadService_LoadKeys_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_LoadKeys(ctx);
-					}
-					break;
-				case PinPadService_Method_EncryptData:
-					{
-						SpReqAnsContext<PinPadService_EncryptData_Req,PinPadService_EncryptData_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<PinPadService_EncryptData_Req,PinPadService_EncryptData_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_EncryptData(ctx);
-					}
-					break;
 				case PinPadService_Method_GetInputSM:
 					{
 						SpReqAnsContext<PinPadService_GetInputSM_Req,PinPadService_GetInputSM_Ans>::Pointer ctx;

+ 10 - 43
Module/mod_pinpad/pinpad.xml

@@ -1,48 +1,13 @@
 <?xml version="1.0" encoding="gb2312" ?>
 <entity name="PinPad">
 	<class name="PinPadService" overlap="true" exclusive="false">
-		<twoway name="GetInput" overlap="true">
-			<req>
-				<param name="timeout" type="int" />
-				<param name="length" type="int" />
-				<param name="encrypt" type="bool" />
-				<param name="confirm" type="bool" />
-				<param name="account" type="string" />
-			</req>
-			<res>
-				<param name="data" type="string" />
-				<param name="deviceno" type="string" />
-				<param name="keyseq" type="string" />
-				<param name="checkcode" type="string" />
-				<param name="enter" type="bool" />
-			</res>			
-		</twoway>		
-		<oneway name="InputWaitMore" overlap="true">		
+		<oneway name="InputWaitMore" overlap="true" method_id="1">		
 		</oneway>
-		<oneway name="InputCancel" overlap="true">		
+		<oneway name="InputCancel" overlap="true" method_id="2">		
 		</oneway>
-		<oneway name="Exit" overlap="true">		
+		<oneway name="Exit" overlap="true" method_id="3">		
 		</oneway>
-		<twoway name="LoadKeys" overlap="true">
-			<req>
-				<param name="masterkey" type="string" />
-				<param name="workingkey1" type="string" />
-				<param name="workingkey2" type="string" />
-				<param name="initializeflag" type="bool" />
-			</req>
-			<res>
-				<param name="result" type="int" />
-			</res>			
-		</twoway>
-		<twoway name="EncryptData" overlap="true">
-			<req>
-				<param name="data" type="string" />
-			</req>
-			<res>
-				<param name="ciphertext" type="string" />
-			</res>			
-		</twoway>
-		<twoway name="GetInputSM" overlap="true">
+		<twoway name="GetInputSM" overlap="true" method_id="6">
 			<req>
 				<param name="timeout" type="int" />
 				<param name="length" type="int" />
@@ -67,7 +32,7 @@
 				<param name="reserved4" type="string" />
 			</res>			
 		</twoway>
-		<twoway name="LoadKeysSM" overlap="true">
+		<twoway name="LoadKeysSM" overlap="true" method_id="7">
 			<req>
 				<param name="smflag" type="int" />
 				<param name="masterkey" type="string" />
@@ -88,7 +53,7 @@
 				<param name="reserved4" type="string" />
 			</res>			
 		</twoway>
-		<twoway name="EncryptDataSM" overlap="true">
+		<twoway name="EncryptDataSM" overlap="true" method_id="8">
 			<req>
 				<param name="smflag" type="int" />
 				<param name="data" type="string" />
@@ -105,7 +70,7 @@
 				<param name="reserved4" type="string" />
 			</res>			
 		</twoway>
-		<twoway name="QueryFunc" overlap="true">
+		<twoway name="QueryFunc" overlap="true" method_id="9">
 			<req>
 				<param name="reserved1" type="int" />
 				<param name="reserved2" type="int" />
@@ -120,13 +85,15 @@
 				<param name="reserved4" type="string" />
 			</res>			
 		</twoway>
-		<twoway name="GetCheckCode" overlap="true">
+		<twoway name="GetCheckCode" overlap="true" method_id="10">
 			<req>
 				<param name="mSN" type="array_int" />
 				<param name="wSN" type="array_int" />
 			</req>
 			<res>
 				<param name="checkcode" type="array_string" />
+				<!--if it is the TPK key, the index is zhe TPK SN-->
+				<param name="index" type="array_string" />
 			</res>			
 		</twoway>										
 		<twoway name="GetDevInfo" overlap="true" method_id="65535">

+ 41 - 112
Module/mod_selfchecker/SelfCheckerFSM.cpp

@@ -1,5 +1,6 @@
 #include "stdafx.h"
 #define WIN32_LEAN_AND_MEAN
+#include <algorithm>
 #include "SelfCheckerFSM.h"
 #include "EventCode.h"
 #pragma comment(lib,"user32.lib")
@@ -107,7 +108,6 @@ void CSelfCheckerFSM::s0_on_entry()
 			|| tmpNames[i] == "Download" || tmpNames[i] == "UpgradeRun" || tmpNames[i] == "UpgradeManager")
 		{
 			m_allEntity.push_back(tmpNames[i]);
-			m_activeEntity.push_back(tmpNames[i]);
 		}
 	}
 	FSMEvent* pEvt = new FSMEvent(USER_EVT_INIT);
@@ -278,6 +278,8 @@ ErrorCodeEnum CSelfCheckerFSM::Initial()
 		spConfigRun->ReadConfigValueInt("WarnRecord", "disk", m_diskLastWarnHour);
 	}
 
+	m_activeEntity.push_back("Chromium");
+
 	return Error_Succeed;
 }
 ErrorCodeEnum CSelfCheckerFSM::ExceptionErrorProcess(const char* pszEntityName, ErrorCodeEnum eCode)
@@ -472,7 +474,7 @@ ErrorCodeEnum CSelfCheckerFSM::CheckEntity(const char* pszEntityName, EntityTest
 			//the hardward entity and some other entity no need to test
 			if (_strnicmp("PinPad", pszEntityName, strlen("PinPad")) == 0 || _strnicmp("CardIssuer", pszEntityName, strlen("CardIssuer")) == 0
 				|| _strnicmp("CardSwiper", pszEntityName, strlen("CardSwiper")) == 0 || _strnicmp("ContactlessCard", pszEntityName, strlen("ContactlessCard")) == 0
-				|| _strnicmp("IDCertificate", pszEntityName, strlen("IDCertificate")) == 0 || _strnicmp("ups", pszEntityName, strlen("ups")) == 0
+				|| _strnicmp("IDCertificate", pszEntityName, strlen("IDCertificate")) == 0
 				|| _strnicmp("gpio", pszEntityName, strlen("gpio")) == 0 || _strnicmp("HSPScanner", pszEntityName, strlen("HSPScanner")) == 0
 				|| _strnicmp("FingerPrint", pszEntityName, strlen("FingerPrint")) == 0
 				)
@@ -480,7 +482,9 @@ ErrorCodeEnum CSelfCheckerFSM::CheckEntity(const char* pszEntityName, EntityTest
 		}
 	}
 	//oilyang@20170926 no need to check by self.Let the HealthManager entity to do it.
-	if (pszEntityName != NULL && strnicmp(pszEntityName, GetEntityBase()->GetEntityName(), strlen(GetEntityBase()->GetEntityName())) == 0)
+	//oilyang@20231106 no need to check VtmLoader
+	if (pszEntityName != NULL && (strnicmp(pszEntityName, GetEntityBase()->GetEntityName(), strlen(GetEntityBase()->GetEntityName())) == 0
+		|| strnicmp(pszEntityName, "VtmLoader", strlen("VtmLoader")) == 0))
 		return Error_Succeed;
 	CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
 	CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
@@ -536,60 +540,9 @@ void CSelfCheckerFSM::OnNormalWorkTimerout(void* pData)
 
 void CSelfCheckerFSM::DoOnCreated(const char* pszEntityName, ErrorCodeEnum eOnStartErrorCode, const char* pszCallerEntity)
 {
-	if (eOnStartErrorCode == Error_Succeed)
-	{
-		vector<CSimpleStringA>::iterator it, itAct;
-		bool bFound = false, bActFound = false;
-
-		for (it = m_allEntity.begin(); it != m_allEntity.end(); ++it)
-		{
-			if (!strncmp(pszEntityName, *it, it->GetLength()))
-			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("already exist %s", pszEntityName);
-				bFound = true;
-				break;
-			}
-		}
-		if (!bFound)
-			m_allEntity.push_back(pszEntityName);
-
-		for (itAct = m_activeEntity.begin(); itAct != m_activeEntity.end(); ++itAct)
-		{
-			if (!strncmp(pszEntityName, *itAct, itAct->GetLength()))
-			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("active entity already exist %s", pszEntityName);
-				bActFound = true;
-				break;
-			}
-		}
-		if (!bActFound)
-		{
-			m_activeEntity.push_back(pszEntityName);
-		}
-		m_entCfgInfo[pszEntityName].entityRestartCount = 0;
-	}
 }
 void CSelfCheckerFSM::DoOnClosed(const char* pszEntityName, EntityCloseCauseEnum eCloseCause, ErrorCodeEnum eOnCloseErrorCode, const char* pszCallerEntity)
 {
-	//not close by selfchecker
-	if (strncmp(pszCallerEntity, GetEntityBase()->GetEntityName(), strlen(pszCallerEntity)))
-	{
-		if (eCloseCause == CloseCause_Self || eCloseCause == CloseCause_Other)
-		{
-			vector<CSimpleStringA>::iterator it;
-			for (it = m_activeEntity.begin(); it != m_activeEntity.end(); ++it)
-			{
-				if (!strncmp(pszEntityName, *it, it->GetLength()))
-				{
-					DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("onclosed %s", pszEntityName);
-					//oilyang@20210425 as almost all entity's start configure have been set to 0(can be ignored)
-					//no need to erase the m_activeEntity any more
-					//m_activeEntity.erase(it);
-					break;
-				}
-			}
-		}
-	}
 }
 void CSelfCheckerFSM::DoOnException(const char* pszEntityName, const char* pszFunctionName, EntityStateEnum eState, EntityStateEnum eLastState, ErrorCodeEnum eErrorCode)
 {
@@ -796,22 +749,6 @@ ErrorCodeEnum CSelfCheckerFSM::GetEntityErrorList(int& warmLevel, CSimpleStringA
 }
 int CSelfCheckerFSM::Proc(string entity, ProcType eType, DWORD dwCode, const char* pszMessage)
 {
-	ConnectToHealthManager();
-	if (!m_entRunInfo[entity.c_str()].bGetLoadOpt)
-	{
-		if (m_pHealthClient != NULL)
-		{
-			HealthManagerService_GetEntityCfgInfo_Req req;
-			HealthManagerService_GetEntityCfgInfo_Ans ans;
-			req.name = entity.c_str();
-			ErrorCodeEnum errCode = (*m_pHealthClient)(EntityResource::getLink().upgradeLink())->GetEntityCfgInfo(req, ans, 10000);
-			if (errCode == Error_Succeed)
-			{
-				m_entRunInfo[entity.c_str()].bGetLoadOpt = true;
-				SetEntityCfgInfo(entity.c_str(), ans.loadOpt);
-			}
-		}
-	}
 	map<string, EntityCfg, EntityNameCompare>::iterator it;
 	if ((it = m_mapEntity.find(entity.c_str())) == m_mapEntity.end())
 	{
@@ -1178,51 +1115,9 @@ void CSelfCheckerFSM::UpgradeActionProcess(const char* pszEntityName, const char
 {
 	return;
 }
-ErrorCodeEnum CSelfCheckerFSM::ConnectToHealthManager()
-{
-	if (m_pHealthClient == NULL || m_pHealthClient->QuerySessionClosed())
-	{
-		m_pHealthClient = new HealthManagerService_ClientBase(GetEntityBase());
-		ErrorCodeEnum ErrorConn = m_pHealthClient->Connect();
-		if (ErrorConn != Error_Succeed) {
-			m_pHealthClient->SafeDelete();
-			m_pHealthClient = NULL;
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Connect to Healthmanager failed.%d", ErrorConn);
-			return Error_Unexpect;
-		}
-		else
-		{
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("HealthManager connected.");
-		}
-	}
-	return Error_Succeed;
-}
 void CSelfCheckerFSM::SetEverEnterMainPageFlag(bool bValue)
 {
 	m_bEverInMainPage = bValue;
-	if (!m_bHaveGetEntityList)
-	{
-		ConnectToHealthManager();
-		if (m_pHealthClient != NULL)
-		{
-			HealthManagerService_GetEntityCfgInfo_Req req;
-			HealthManagerService_GetEntityCfgInfo_Ans ans;
-			req.name = "AllConfiguredEntity";
-			ErrorCodeEnum errCode = (*m_pHealthClient)(EntityResource::getLink().upgradeLink())->GetEntityCfgInfo(req, ans, 5000);
-			if (errCode == Error_Succeed)
-			{
-				m_bHaveGetEntityList = true;
-				CAutoArray<CSimpleStringA> allCfgEntity = ans.reserved2.Split(',');
-				m_activeEntity.clear();
-				for (int i = 0; i < allCfgEntity.GetCount(); i++)
-				{
-					if (allCfgEntity[i].Trim().GetLength() > 1)//except for empty entity name
-						m_activeEntity.push_back(allCfgEntity[i]);
-				}
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to get all entity list:%s", ans.reserved2);
-			}
-		}
-	}
 }
 void CSelfCheckerFSM::AddFWBEntityToList()
 {
@@ -1261,4 +1156,38 @@ void CSelfCheckerFSM::AddFWBEntityToList()
 		m_activeEntity.push_back("IDCertificate");
 	if (!bActFingerPrintFound)
 		m_activeEntity.push_back("FingerPrint");
+}
+void CSelfCheckerFSM::GetEntityList(CSimpleStringA csList)
+{
+
+
+	CAutoArray<CSimpleStringA> arrStageList;
+	arrStageList.Init(64);
+	arrStageList = csList.Split('|');
+	for (int i = 0; i < arrStageList.GetCount(); ++i)
+	{
+		CAutoArray<CSimpleStringA> arrEntity;
+		arrEntity.Init(2);
+		arrEntity = arrStageList[i].Split('=');
+		if (arrEntity.GetCount() < 2)
+			break;
+		//去重,防止前面已经加载了
+		if (find(m_activeEntity.begin(), m_activeEntity.end(), arrEntity[0].GetData()) != m_activeEntity.end())
+			continue;
+		m_activeEntity.push_back(arrEntity[0]);
+		m_entRunInfo[arrEntity[0]].bGetLoadOpt = true;
+		if (arrEntity[1].Compare("1") == 0)
+		{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s config with loadopt 1", arrEntity[0].GetData());
+			m_entRunInfo[arrEntity[0]].loadOpt = 1;
+		}
+		else if (arrEntity[1].Compare("2") == 0)
+		{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s config with loadopt 2", arrEntity[0].GetData());
+			m_entRunInfo[arrEntity[0]].loadOpt = 2;
+		}
+		else
+			m_entRunInfo[arrEntity[0]].loadOpt = 0;
+	}
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_activeEntity has %d entity", m_activeEntity.size());
 }

+ 3 - 5
Module/mod_selfchecker/SelfCheckerFSM.h

@@ -24,11 +24,10 @@
 #include <map>
 #include <vector>
 #include "SpFSM.h"
+#include "SpHelper.h"
 using namespace tinyxml2;
 using namespace std;
 
-#include "../mod_healthmanager/HealthManager_client_g.h"
-using namespace HealthManager;
 
 const int MAX_KEY_VALUE_SIZE = 1024;
 class	CSelfCheckerEntity;
@@ -144,7 +143,7 @@ public:
 		FSM_RULE_ENTRY(s0, s1, USER_EVT_INIT, 0)
 		END_FSM_RULE()
 
-		CSelfCheckerFSM() :m_warmLevel(0), m_bFirstCalcCpu(true), m_pHealthClient(NULL) , m_diskLastWarnHour(1)
+		CSelfCheckerFSM() :m_warmLevel(0), m_bFirstCalcCpu(true), m_diskLastWarnHour(1)
 	, m_bEverInMainPage(false), m_bHaveGetEntityList(false), m_bFWBEntityAdd(false){}
 	~CSelfCheckerFSM(){}
 	virtual ErrorCodeEnum OnInit();
@@ -178,6 +177,7 @@ public:
 	int Proc(string entity, ProcType eType, DWORD dwCode,const char *pszMessage="");
 	void SetEverEnterMainPageFlag(bool bValue = true);
 	void AddFWBEntityToList();
+	void GetEntityList(CSimpleStringA csList);
 private:
 	ErrorCodeEnum Initial();
 	void OnNormalWorkTimerout(void *pData);
@@ -189,7 +189,6 @@ private:
 	void CheckEntityResouce(const char *pszEntityName,CEntityRunInfo &Info);
 	//bool IsKeyEntity(const char *pszEntityName);
 	bool ReadXmlFile(const char *szFileName);
-	ErrorCodeEnum ConnectToHealthManager();
 	
 private:
 	map<CSimpleStringA,EntityCfgInfo> m_entCfgInfo;
@@ -202,7 +201,6 @@ private:
 	bool m_bInIssue,m_bFirstCalcCpu, m_bEverInMainPage,m_bHaveGetEntityList,m_bFWBEntityAdd;
 	//CSimpleStringA m_csKeyEntity;
 	__int64  m_xIdlePre,m_xKernelPre,m_xUserPre;
-	HealthManagerService_ClientBase *m_pHealthClient;
 	CSystemStaticInfo m_sysInfo;
 };
 

+ 17 - 0
Module/mod_selfchecker/mod_selfchecker.cpp

@@ -281,6 +281,23 @@ void CSelfCheckerEntity::OnSysVarEvent(const char* pszKey, const char* pszValue,
 			m_fsm.SetEverEnterMainPageFlag();
 		}
 	}
+	else if ((_strnicmp(pszKey, "TerminalStage", strlen("TerminalStage")) == 0))
+	{
+		//oiltmp
+		if (!m_bGetEntityList)
+		{
+			m_bGetEntityList = true;
+			CSmartPointer<IConfigInfo> spConfigCen;
+			GetFunction()->OpenConfig(Config_CenterSetting, spConfigCen);
+			CSimpleStringA csCoreBootList(true), csSafeLoadList(true), csOperatingList(true), csKeyCB("CoreBootList."), csKeySL("SafeLoadList."), csKeyOp("OperatingList.");
+			spConfigCen->ReadConfigValue("VtmLoader", (csKeyCB + m_sysInfo.strMachineType).GetData(), csCoreBootList);
+			spConfigCen->ReadConfigValue("VtmLoader", (csKeySL + m_sysInfo.strMachineType).GetData(), csSafeLoadList);
+			spConfigCen->ReadConfigValue("VtmLoader", (csKeyOp + m_sysInfo.strMachineType).GetData(), csOperatingList);
+			m_fsm.GetEntityList(csCoreBootList);
+			m_fsm.GetEntityList(csSafeLoadList);
+			m_fsm.GetEntityList(csOperatingList);
+		}
+	}
 }
 
 SP_BEGIN_ENTITY_MAP()

+ 3 - 2
Module/mod_selfchecker/mod_selfchecker.h

@@ -29,7 +29,7 @@ class CSelfCheckerEntity : public CEntityBase,public IEntityLifeListener,public
 	,public ILogListener
 {
 public:
-	CSelfCheckerEntity():m_bIEIdle(false), m_bEverInMainPage(false), m_maxEtyRestartTimes(5){ }
+	CSelfCheckerEntity():m_bIEIdle(false), m_bEverInMainPage(false), m_maxEtyRestartTimes(5), m_bGetEntityList(false){ }
 	virtual ~CSelfCheckerEntity() {}
 	virtual const char *GetEntityName() const { return "SelfChecker"; }
 	
@@ -66,6 +66,7 @@ public:
 		GetFunction()->SubscribeLog(m_uuidCardSwiper,this,Log_Event,Severity_High,Error_IgnoreAll,-1,"CardSwiper",false);
 		GetFunction()->SubscribeLog(m_uuidCardSwiper, this, Log_Error, Severity_Middle, Error_IgnoreAll, -1, "CardSwiper");
 		GetFunction()->RegistSysVarEvent("UIState", this);
+		GetFunction()->RegistSysVarEvent("TerminalStage", this);
 		m_csQueryStateEntity = "CardIssuer,CardSwiper,IDCertificate,PinPad,MediaController,CounterConnector";
 		CSmartPointer<IConfigInfo> spCenterConfig;
 		CSimpleStringA csQueryStateEntity(true);
@@ -133,7 +134,7 @@ public:
 private:
 	CSelfCheckerFSM m_fsm;
 	map<CSimpleStringA,EntityProcessInfo> m_entityProcInfo;
-	bool m_bIEIdle, m_bEverInMainPage;
+	bool m_bIEIdle, m_bEverInMainPage, m_bGetEntityList;
 	CUUID m_uuidCardIsuuer,m_uuidCardSwiper,m_uuidPinPad,m_uuidIDCertificate,m_uuidMedia;
 	CSimpleStringA m_csQueryStateEntity;
 	vector<CSimpleStringA> m_vQueryStateEntity;

+ 0 - 26
Module/mod_ups/CMakeLists.txt

@@ -1,26 +0,0 @@
-# 定义实体名称
-define_module("Ups")
-
-
-set(${MODULE_PREFIX}_SRCS
-	mod_ups.cpp
-	UpsFSM.h
-	UpsFSM.cpp
-	)
-
-set(MOD_VERSION_STRING "0.0.1-dev1")
-
-add_module_libraries(${MODULE_PREFIX} ${MODULE_NAME} ${MOD_VERSION_STRING})
-
-target_include_directories(${MODULE_NAME} PRIVATE
-	${DevHeadPath}
-	${ModuleCommonHeadPath}
-	${RVC_OTHER_DEPENDENIES_DIR}/libpublicFun
-)
-
-# 添加实体需要依赖的其他共享库(包括系统库)
-set(${MODULE_PREFIX}_SYSLIBS libpublicFun)
-target_link_libraries(${MODULE_NAME} ${MODULE_BASE_LIBS} ${${MODULE_PREFIX}_SYSLIBS})
-
-deploy_module(${MODULE_PREFIX} ${MODULE_NAME})
-

+ 0 - 238
Module/mod_ups/UpsFSM.cpp

@@ -1,238 +0,0 @@
-#include "stdafx.h"
-#include "UpsFSM.h"
-#include "GetDevInfoHelper.h"
-#include "EventCode.h"
-
-#include <map>
-#include "RVCComm.h"
-#include "publicFunExport.h"
-
-const int MAX_UPS_INIT_TRIES = 3;
-
-
-bool isnostr(const char *str)
-{
-	int len = strlen(str);
-	if (len == 0)
-		return true;
-	for (int i = 0; i < len; ++i)
-	{
-		if (*(str+i) != ' ')
-			return false;
-	}
-	return true;
-}
-ErrorCodeEnum CUpsFSM::OnInit()
-{
-	LOG_FUNCTION();
-	CSystemStaticInfo sysInfo;
-	GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
-	m_csMachineType = sysInfo.strMachineType;
-
-	auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
-	pEntity->InitializeVendorLogSwitch();
-	FulfillAdapterInfoFrom(pEntity->vendorLibInfo);
-
-	LogWarn(Severity_Low, Error_Unexpect, LOG_ERR_UPS_LOGWARN_ROOTINFO, m_adapterInfo.adapterFilePath.GetData());
-	ToLogRootINIInfo();
-
-	ErrorCodeEnum eErrDev = m_hDevHelper.LoadUp(m_adapterInfo.adapterFilePath);
-	if (eErrDev != Error_Succeed) {
-		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load vendor dll(%s) failed.", (LPCTSTR)m_adapterInfo.adapterFileName);
-		return Error_DevLoadFileFailed;
-	}
-	int initTries = 0;
-	do {
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%d,%d", m_adapterInfo.GetPortInt(), m_adapterInfo.GetBaudrateInt());
-		eErrDev = m_hDevHelper->DevOpen(m_adapterInfo.GetPortInt(), m_adapterInfo.GetBaudrateInt());
-		if (eErrDev != Error_Succeed) {
-			SetErrPackage("OnInit::DevOpen", m_devSN, eErrDev, MEC_DEVAPI_UPS_DevOpen);
-			AlarmDEC();
-			initTries++;
-			Sleep(200);
-			continue;
-		}
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("open ups succeed.");
-		m_bOpened = true;
-		ZeroMemory(m_devCatInfo.szModel, sizeof(m_devCatInfo.szModel));
-		ZeroMemory(m_devCatInfo.szType, sizeof(m_devCatInfo.szType));
-		ZeroMemory(m_devCatInfo.szVendor, sizeof(m_devCatInfo.szVendor));
-		eErrDev = m_hDevHelper->GetDevCategory(m_devCatInfo);
-		if (eErrDev == Error_Succeed) {
-			m_adapterInfo.FulfillCategoryInfo(m_devCatInfo);
-		} else if (eErrDev == Error_NotImpl) {
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetDevCategory return Error_NotImpl.");
-		} else {
-			SetErrPackage("OnInit::GetDevCategory", m_devSN, eErrDev, MEC_DEVAPI_UPS_GetDevCategory);
-			AlarmDEC();
-		}
-		break;
-	} while (initTries < MAX_UPS_INIT_TRIES);
-
-	return Error_Succeed;
-}
-ErrorCodeEnum CUpsFSM::OnExit()
-{
-	ErrorCodeEnum eErr = Error_Succeed;
-	if (m_hDevHelper != nullptr) {
-		m_hDevHelper.TearDown();
-	}
-	return eErr;
-}
-
-void CUpsFSM::s0_on_entry()
-{
-	UpsStatusEnum eUpsState;
-	ErrorCodeEnum eErrCode = m_hDevHelper->GetDevStatus(eUpsState);
-	if (eErrCode != Error_Succeed) {
-		LOG_UPS_ERROR_MSG_MACRO(eErrCode, GetDevStatus);
-	} else {
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("UpsState: %d", eUpsState);
-	}
-	m_testResult = Error_Succeed;
-
-	if (m_FirstStart) {
-		m_FirstStart = FALSE;
-		ToLogWarnInfoAboutTerm();
-	}
-	m_testResult = Error_Succeed;
-}
-void CUpsFSM::s0_on_exit()
-{
-
-}
-unsigned int CUpsFSM::s0_on_event(FSMEvent* e)
-{
-	switch(e->iEvt)
-	{
-	case USER_EVT_SHUTDOWN:
-		{
-			e->SetHandled();
-			ShutDownTask* task = new ShutDownTask(this);
-			ShutDownEvent* sde = dynamic_cast<ShutDownEvent*>(e);
-			task->ctx = sde->ctx;
-			GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
-			return 0;
-		}
-		break;
-	case USER_EVT_GETSTATUS:
-		{
-			e->SetHandled();
-			UpsStatusEnum eUpsState;
-			ErrorCodeEnum eErrState = m_hDevHelper->GetDevStatus(eUpsState);
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s,%d",SpStrError(eErrState), eUpsState);
-			GetStatusEvent* pGse = dynamic_cast<GetStatusEvent*>(e);
-			pGse->ctx->Ans.Status = eUpsState;
-			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("status: %d",pGse->ctx->Ans.Status);
-			pGse->ctx->Answer(eErrState);
-		}
-		break;
-	default:
-		return 1;
-	}
-	return 0;
-}
-
-void CUpsFSM::s1_on_entry()
-{
-}
-void CUpsFSM::s1_on_exit()
-{
-
-}
-unsigned int CUpsFSM::s1_on_event(FSMEvent* e)
-{
-	LOG_FUNCTION();
-	switch(e->iEvt)
-	{
-	case USER_EVT_SHUTDOWN_FINISHED:
-		{
-			e->SetHandled();
-			return e->param1;
-		}
-	default:
-		return 1;
-	}
-}
-
-void CUpsFSM::s2_on_entry()
-{
-	CheckTask *pTask = new CheckTask(this);
-	GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
-	m_testResult = Error_InvalidState;
-}
-void CUpsFSM::s2_on_exit()
-{
-}
-unsigned int CUpsFSM::s2_on_event(FSMEvent* pEvt)
-{
-	int ret = 0;
-	switch(pEvt->iEvt)
-	{
-	case USER_EVT_CHECK_FINISHED:
-		ret = pEvt->param1;
-		break;
-	default:
-		break;
-	}
-	return ret;
-}
-
-int CUpsFSM::ShutDown(SpReqAnsContext<UpsService_Shutdown_Req,UpsService_Shutdown_Ans>::Pointer ctx)
-{
-	LOG_FUNCTION();
-
-	UpsStatusEnum eUpsStatus;
-    DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("shutdown time: %d, uptime: %d", ctx->Req.ShutdownTime, ctx->Req.UpTime);
-	ErrorCodeEnum err = m_hDevHelper->GetDevStatus(eUpsStatus);
-	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("(%s)status:[%d],%d,%d",SpStrError(err), eUpsStatus, ctx->Req.ShutdownTime, ctx->Req.UpTime);
-    if (ctx->Req.ShutdownTime < 0 || ctx->Req.UpTime < 0) {
-        DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("error param");
-        ctx->Answer(Error_Param);
-        return 2; //do not jump
-    }
-	err = m_hDevHelper->Shutdown(ctx->Req.ShutdownTime,ctx->Req.UpTime);
-	if (err == Error_Succeed)
-	{
-		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("shutdown...");
-		ctx->Answer(Error_Succeed);
-		return 0;
-	}
-	else
-	{
-		LOG_UPS_ERROR_MSG_MACRO(err, Shutdown);
-		ctx->Answer(Error_Unexpect);
-		return 1;
-	}
-}
-int CUpsFSM::CheckStatus()
-{
-	int i = 0;
-	while(1)
-	{
-		if (m_hDevHelper != nullptr)
-		{
-			UpsStatusEnum eUpsStatus;
-			ErrorCodeEnum eErr;
-			eErr = m_hDevHelper->GetDevStatus(eUpsStatus);
-			if (eErr == Error_Succeed)
-			{
-				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CheckStatus %d",eUpsStatus);
-				if (eUpsStatus == UPS_STATUS_NORMAL || eUpsStatus == UPS_STATUS_NO_ELECTOR)
-					return 0;
-			}
-		}
-		Sleep(10000);
-		i++;
-		if (i > 30)
-		{
-			DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("have try 5 minutes.");
-			i = 0;
-		}
-	}
-	return 1;
-}
-void CUpsFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
-{
-	pTransactionContext->SendAnswer(m_testResult);
-}

+ 0 - 138
Module/mod_ups/UpsFSM.h

@@ -1,138 +0,0 @@
-#ifndef __UPS_FSM_H
-#define __UPS_FSM_H
-
-#pragma once
-
-#include "SpFSM.h"
-#include "DevFSMCommBase.hpp"
-
-#define USER_EVT_TEST	EVT_USER+1
-#define USER_EVT_QUIT	EVT_USER+2
-#define USER_EVT_OPEN	EVT_USER+3
-#define USER_EVT_GETSTATUS	EVT_USER+4
-#define USER_EVT_SHUTDOWN	EVT_USER+5
-#define USER_EVT_SHUTDOWN_FINISHED	EVT_USER+6
-#define USER_EVT_CHECK_FINISHED	EVT_USER+7
-
-#include "Ups_server_g.h"
-#include "UpsClass.h"
-using namespace std;
-using namespace Ups;
-
-class OpenUpsEvent : public FSMEvent
-{
-public:
-	OpenUpsEvent() : FSMEvent(USER_EVT_OPEN){}
-	virtual ~OpenUpsEvent(){}
-	SpReqAnsContext<UpsService_Open_Req,UpsService_Open_Ans>::Pointer ctx;
-	virtual void OnUnhandled()
-	{
-		if (ctx != NULL)
-			ctx->Answer(Error_InvalidState);
-	}
-};
-class GetStatusEvent : public FSMEvent
-{
-public:
-	GetStatusEvent() : FSMEvent(USER_EVT_GETSTATUS){}
-	virtual ~GetStatusEvent(){}
-	SpReqAnsContext<UpsService_GetStatus_Req,UpsService_GetStatus_Ans>::Pointer ctx;
-	virtual void OnUnhandled()
-	{
-		if (ctx != NULL)
-			ctx->Answer(Error_InvalidState);
-	}
-};
-class ShutDownEvent : public FSMEvent
-{
-public:
-	ShutDownEvent() : FSMEvent(USER_EVT_SHUTDOWN){}
-	virtual ~ShutDownEvent(){}
-	SpReqAnsContext<UpsService_Shutdown_Req,UpsService_Shutdown_Ans>::Pointer ctx;
-	//oiltest
-	BYTE btShutTime,btRestartTime;
-	virtual void OnUnhandled()
-	{
-		if (ctx != NULL)
-			ctx->Answer(Error_InvalidState);
-	}
-};
-
-class CUpsFSM : public CCommDevFSM<CUpsFSM, UpsClass>
-{
-public:
-	enum {s0,s1,s2};
-
-	BEGIN_FSM_STATE(CUpsFSM)
-		FSM_STATE_ENTRY(s0,"Normal",s0_on_entry,s0_on_exit,s0_on_event)
-		FSM_STATE_ENTRY(s1,"ShutDown",s1_on_entry,s1_on_exit,s1_on_event)
-		FSM_STATE_ENTRY(s2,"Fail",s2_on_entry,s2_on_exit,s2_on_event)
-		END_FSM_STATE()
-
-		BEGIN_FSM_RULE(CUpsFSM, s0)
-		FSM_RULE_ENTRY(s0, s1, USER_EVT_SHUTDOWN, 0)
-		FSM_RULE_ENTRY(s0, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
-		FSM_RULE_ENTRY(s1, s2, USER_EVT_SHUTDOWN_FINISHED, 1)
-		FSM_RULE_ENTRY(s1, s0, USER_EVT_SHUTDOWN_FINISHED, 2)
-		FSM_RULE_ENTRY(s1, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
-		FSM_RULE_ENTRY(s2, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
-		FSM_RULE_ENTRY(s2, s0, USER_EVT_CHECK_FINISHED, 0)
-		END_FSM_RULE()
-
-	CUpsFSM():m_testResult(Error_Succeed), m_csMachineType(true), m_devSN("")
-	{
-		HARDWARE_ENTITY_RESET_ENTITYID(m_entCode, 0x20E);
-		m_FirstStart = TRUE;
-		ZeroMemory(&m_adapterInfo, sizeof(m_adapterInfo));
-	}
-	virtual ~CUpsFSM() {};
-
-	virtual ErrorCodeEnum OnInit();
-	virtual ErrorCodeEnum OnExit();
-
-	virtual void s0_on_entry();
-	virtual void s0_on_exit();
-	virtual unsigned int s0_on_event(FSMEvent* e);
-
-	virtual void s1_on_entry();
-	virtual void s1_on_exit();
-	virtual unsigned int s1_on_event(FSMEvent* e);
-
-	virtual void s2_on_entry();
-	virtual void s2_on_exit();
-	virtual unsigned int s2_on_event(FSMEvent* e);
-
-	int ShutDown(SpReqAnsContext<UpsService_Shutdown_Req,UpsService_Shutdown_Ans>::Pointer ctx);
-	int CheckStatus();
-	void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
-private:
-	ErrorCodeEnum m_testResult;
-	CSimpleStringA m_csMachineType;
-	DevCategoryInfo m_devCatInfo;
-	CSimpleStringA m_devSN;
-};
-struct ShutDownTask : public ITaskSp
-{
-	CUpsFSM *fsm;
-	
-	ShutDownTask(CUpsFSM* f) : fsm(f) {}
-	SpReqAnsContext<UpsService_Shutdown_Req,UpsService_Shutdown_Ans>::Pointer ctx;
-	void Process()
-	{
-		FSMEvent *e = new FSMEvent(USER_EVT_SHUTDOWN_FINISHED);
-		e->param1 = fsm->ShutDown(ctx);
-		fsm->PostEventFIFO(e);
-	}
-};
-struct CheckTask : public ITaskSp
-{
-	CUpsFSM *fsm;
-	CheckTask(CUpsFSM *f) : fsm(f) {}
-	void Process()
-	{
-		FSMEvent *e = new FSMEvent(USER_EVT_CHECK_FINISHED);
-		e->param1 = fsm->CheckStatus();
-		fsm->PostEventFIFO(e);
-	}
-};
-#endif //__UPS_FSM_H

+ 0 - 277
Module/mod_ups/Ups_client_g.h

@@ -1,277 +0,0 @@
-
-#ifndef __UPS_CLIENT_G_H
-#define __UPS_CLIENT_G_H
-
-#pragma once
-
-// This code is generated by spgen tool!
-
-#include "Ups_def_g.h"
-
-namespace Ups {
-class UpsService_ClientBase : public CClientSessionBase {
-public:
-	explicit UpsService_ClientBase(CEntityBase *pEntity) : m_pEntityBase(pEntity), m_bSysManaged(false) {}
-
-	UpsService_ClientBase* operator () (const linkContext &curLink) 
-	{
-		m_context = curLink;
-		return this;
-	}
-
-protected:
-	virtual ~UpsService_ClientBase()
-	{
-		/// override by user
-	}
-public:
-
-	void OnConnectSucceed()
-	{
-		bSessionClosed = false;
-	}
-	void OnClose(ErrorCodeEnum)
-	{
-		Dbg("session closed.");
-		bSessionClosed = true;
-	}
-	bool QuerySessionClosed()
-	{
-		return bSessionClosed;
-	}
-	ErrorCodeEnum Connect(CSmartPointer<IAsynWaitSp> &spAsyncWait)
-	{
-		CSmartPointer<IEntityFunction> pFunc = m_pEntityBase->GetFunction();
-		ErrorCodeEnum Error = pFunc->ConnectRemoteEntity(this, "Ups", "UpsService", spAsyncWait);
-		if (Error == Error_Succeed) {
-			m_bSysManaged = true;
-			bSessionClosed = false;
-		}
-		return Error;
-	}
-	ErrorCodeEnum Connect()
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Connect(spAsyncWait);
-		if (Error == Error_Succeed) {
-			Error = spAsyncWait->WaitAnswer();
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum Open(UpsService_Open_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(UpsService_Method_Open, UpsService_MethodSignature_Open, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum Open(UpsService_Open_Req &Req, UpsService_Open_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Open(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum Open(UpsService_Open_Req &Req, UpsService_Open_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Open(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum Open(UpsService_Open_Req &Req, UpsService_Open_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Open(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum GetStatus(UpsService_GetStatus_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(UpsService_Method_GetStatus, UpsService_MethodSignature_GetStatus, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum GetStatus(UpsService_GetStatus_Req &Req, UpsService_GetStatus_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = GetStatus(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum GetStatus(UpsService_GetStatus_Req &Req, UpsService_GetStatus_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = GetStatus(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum GetStatus(UpsService_GetStatus_Req &Req, UpsService_GetStatus_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = GetStatus(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum Shutdown(UpsService_Shutdown_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(UpsService_Method_Shutdown, UpsService_MethodSignature_Shutdown, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum Shutdown(UpsService_Shutdown_Req &Req, UpsService_Shutdown_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Shutdown(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum Shutdown(UpsService_Shutdown_Req &Req, UpsService_Shutdown_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Shutdown(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum Shutdown(UpsService_Shutdown_Req &Req, UpsService_Shutdown_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Shutdown(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-	ErrorCodeEnum Close(UpsService_Close_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
-	{
-		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
-		CAutoBuffer Buf = SpObject2Buffer(Req);
-		if (m_context.checkEmpty())
-		{
-			m_context.AutoGenerate();
-			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
-			m_context = m_context.upgradeLink();
-		}
-		auto ret = pFunc->AsyncRequest(UpsService_Method_Close, UpsService_MethodSignature_Close, Buf, spAsyncWait, m_context, dwTimeout);
-		m_context.clear();
-		return ret;
-	}
-	ErrorCodeEnum Close(UpsService_Close_Req &Req, UpsService_Close_Ans &Ans, DWORD dwTimeout)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Close(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum Close(UpsService_Close_Req &Req, UpsService_Close_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Close(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-	ErrorCodeEnum Close(UpsService_Close_Req &Req, UpsService_Close_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
-	{
-		CSmartPointer<IAsynWaitSp> spAsyncWait;
-		ErrorCodeEnum Error = Close(Req, spAsyncWait, dwTimeout);
-		if (Error == Error_Succeed) {
-			bool bEnd = false;
-			CSimpleString str;
-			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
-			LOG_ASSERT(Error || bEnd);
-		}
-		return Error;
-	}
-
-
-	bool SafeDelete()
-	{
-		if (!m_bSysManaged) {
-			delete this;
-		}
-		return m_bSysManaged;
-	}
-
-protected:
-	bool m_bSysManaged;
-	CEntityBase *m_pEntityBase;
-	linkContext m_context;
-	bool bSessionClosed;
-};
-
-///////////////////////////
-
-} // namespace Ups
-#endif // __UPS_CLIENT_G_H

+ 0 - 114
Module/mod_ups/Ups_def_g.h

@@ -1,114 +0,0 @@
-#ifndef __UPS_DEF_G_H
-#define __UPS_DEF_G_H
-
-#pragma once
-
-// This code is generated by spgen tool!
-
-#include "SpHelper.h"
-
-namespace Ups {
-//
-// const goes here
-//
-
-#define UpsService_Method_Open 0
-#define UpsService_Method_GetStatus 1
-#define UpsService_Method_Shutdown 2
-#define UpsService_Method_Close 3
-
-#define UpsService_MethodSignature_Open 1935607479
-#define UpsService_MethodSignature_GetStatus 384808567
-#define UpsService_MethodSignature_Shutdown -315118099
-#define UpsService_MethodSignature_Close -811482585
-
-#define UpsService_LogCode_Open "QLR040220E00"
-#define UpsService_LogCode_GetStatus "QLR040220E01"
-#define UpsService_LogCode_Shutdown "QLR040220E02"
-#define UpsService_LogCode_Close "QLR040220E03"
-
-struct UpsService_Open_Req
-{
-	CSimpleStringA Com;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & Com;
-	}
-
-};
-
-struct UpsService_Open_Ans
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-struct UpsService_GetStatus_Req
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-struct UpsService_GetStatus_Ans
-{
-	int Status;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & Status;
-	}
-
-};
-
-struct UpsService_Shutdown_Req
-{
-	int ShutdownTime;
-	int UpTime;
-
-	void Serialize(SpBuffer &Buf)
-	{
-		auto & buf = Buf & ShutdownTime & UpTime;
-	}
-
-};
-
-struct UpsService_Shutdown_Ans
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-struct UpsService_Close_Req
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-struct UpsService_Close_Ans
-{
-
-	void Serialize(SpBuffer &Buf)
-	{
-	}
-
-};
-
-
-///////////////////////////
-
-} // namespace Ups
-
-#endif // __UPS_DEF_G_H

+ 0 - 191
Module/mod_ups/Ups_server_g.h

@@ -1,191 +0,0 @@
-
-#ifndef __UPS_SERVER_G_H
-#define __UPS_SERVER_G_H
-
-#pragma once
-
-// This code is generated by spgen tool!
-
-#include "Ups_def_g.h"
-
-namespace Ups {
-class UpsService_ServerSessionBase : public CServerSessionBase
-{
-public:
-	UpsService_ServerSessionBase()
-	{
-		/// override by user
-	}
-
-	virtual ~UpsService_ServerSessionBase()
-	{
-		/// override by user
-	}
-
-	virtual bool IsExclusive() { return false; }
-
-	virtual bool IsSessionOverlap() { return true; }
-
-	virtual ErrorCodeEnum GetMessageAttr(DWORD dwMessageID, DWORD dwSignature, bool &bOverlap)
-	{
-		ErrorCodeEnum Error = Error_Succeed;
-		switch (dwMessageID) {
-		case UpsService_Method_Open:
-			if (dwSignature == UpsService_MethodSignature_Open) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case UpsService_Method_GetStatus:
-			if (dwSignature == UpsService_MethodSignature_GetStatus) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case UpsService_Method_Shutdown:
-			if (dwSignature == UpsService_MethodSignature_Shutdown) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case UpsService_Method_Close:
-			if (dwSignature == UpsService_MethodSignature_Close) {
-				bOverlap = true;
-			} else {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		default:
-			Error = Error_MethodNotFound;
-			break;
-		}
-		return Error;
-	}
-
-	int CheckMessageSignature(DWORD dwMessageID, DWORD dwSignature)
-	{
-		ErrorCodeEnum Error = Error_Succeed;
-		switch (dwMessageID) {
-		case UpsService_Method_Open:
-			if (dwSignature != UpsService_MethodSignature_Open) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case UpsService_Method_GetStatus:
-			if (dwSignature != UpsService_MethodSignature_GetStatus) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case UpsService_Method_Shutdown:
-			if (dwSignature != UpsService_MethodSignature_Shutdown) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		case UpsService_Method_Close:
-			if (dwSignature != UpsService_MethodSignature_Close) {
-				Error = Error_MethodSignatureFailed;
-			}
-			break;
-		default:
-			Error = Error_MethodNotFound;
-			break;
-		}
-		return Error;
-	}
-
-	virtual void Handle_Open(SpReqAnsContext<UpsService_Open_Req, UpsService_Open_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_GetStatus(SpReqAnsContext<UpsService_GetStatus_Req, UpsService_GetStatus_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_Shutdown(SpReqAnsContext<UpsService_Shutdown_Req, UpsService_Shutdown_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void Handle_Close(SpReqAnsContext<UpsService_Close_Req, UpsService_Close_Ans>::Pointer ctx)
-	{
-	/// override by user
-	}
-
-	virtual void OnRequest(CSmartPointer<ITransactionContext> pTransactionContext)
-	{
-		CAutoBuffer Buf;
-		DWORD dwMessageID;
-		DWORD dwMessageSignature;
-		ErrorCodeEnum Error = pTransactionContext->GetReceiveBuffer(dwMessageID, dwMessageSignature, Buf);
-		if (Error == Error_Succeed) {
-#ifdef DEBUG
-			assert(CheckMessageSignature(dwMessageID, dwMessageSignature) == Error_Succeed);
-#else
-			if (CheckMessageSignature(dwMessageID, dwMessageSignature) != Error_Succeed) {
-				pTransactionContext->SendAnswer(Error_MethodSignatureFailed);
-				return;
-			}
-#endif
-			switch (dwMessageID) {
-				case UpsService_Method_Open:
-					{
-						SpReqAnsContext<UpsService_Open_Req,UpsService_Open_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<UpsService_Open_Req,UpsService_Open_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_Open(ctx);
-					}
-					break;
-				case UpsService_Method_GetStatus:
-					{
-						SpReqAnsContext<UpsService_GetStatus_Req,UpsService_GetStatus_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<UpsService_GetStatus_Req,UpsService_GetStatus_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_GetStatus(ctx);
-					}
-					break;
-				case UpsService_Method_Shutdown:
-					{
-						SpReqAnsContext<UpsService_Shutdown_Req,UpsService_Shutdown_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<UpsService_Shutdown_Req,UpsService_Shutdown_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_Shutdown(ctx);
-					}
-					break;
-				case UpsService_Method_Close:
-					{
-						SpReqAnsContext<UpsService_Close_Req,UpsService_Close_Ans>::Pointer ctx;
-						ctx.Attach(new SpReqAnsContext<UpsService_Close_Req,UpsService_Close_Ans>(pTransactionContext));
-						SpBuffer2Object(Buf, ctx->Req);
-						pTransactionContext->GetLinkContext(ctx->link);
-						EntityResource::setLink(ctx->link);
-						Handle_Close(ctx);
-					}
-					break;
-				default:
-					assert(0);
-					break;
-			}
-			
-		} else {
-			pTransactionContext->SendAnswer(Error);
-		}
-	}
-
-};
-
-
-///////////////////////////
-
-} // namespace Ups
-#endif // __UPS_SERVER_G_H

+ 0 - 118
Module/mod_ups/mod_ups.cpp

@@ -1,118 +0,0 @@
-#include "stdafx.h"
-
-#include "SpBase.h"
-
-#include "modVer.h"
-
-#include "UpsFSM.h"
-#include "DevEntityCommBase.hpp"
-
-using namespace Ups;
-
-class CUpsEntity;
-
-class UpsServerSession : public UpsService_ServerSessionBase
-{
-public:
-	UpsServerSession(CUpsEntity* pEntity) : m_pEntity(pEntity){}
-	virtual ~UpsServerSession(){}
-	virtual void Handle_Open(SpReqAnsContext<UpsService_Open_Req, UpsService_Open_Ans>::Pointer ctx);
-	virtual void Handle_GetStatus(SpReqAnsContext<UpsService_GetStatus_Req, UpsService_GetStatus_Ans>::Pointer ctx);
-	virtual void Handle_Shutdown(SpReqAnsContext<UpsService_Shutdown_Req, UpsService_Shutdown_Ans>::Pointer ctx);
-	virtual void Handle_Close(SpReqAnsContext<UpsService_Close_Req, UpsService_Close_Ans>::Pointer ctx);
-
-private:
-	CUpsEntity* m_pEntity;
-};
-
-class CUpsEntity : public CDevAdptEntityBase
-{
-public:
-	CUpsEntity(){}
-	virtual ~CUpsEntity(){}
-	virtual const char *GetEntityName() const { return "Ups"; }
-	const char* GetEntityVersion() const { return MODULE_VERSION_FULL; }
-	virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext) 
-	{ 
-		LOG_FUNCTION();
-		ErrorCodeEnum err = m_fsm.Init(this);
-		pTransactionContext->SendAnswer(err);
-	}
-
-	virtual void OnPrePause(CSmartPointer<ITransactionContext> pTransactionContext) 
-	{
-		pTransactionContext->SendAnswer(Error_Succeed); 
-	}
-	virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext) 
-	{ 		
-		pTransactionContext->SendAnswer(Error_Succeed);
-	}
-
-	virtual CServerSessionBase* OnNewSession(const char*,const char*)
-	{
-		LOG_FUNCTION();
-		return new UpsServerSession(this);
-	}
-
-	void Open(SpReqAnsContext<UpsService_Open_Req, UpsService_Open_Ans>::Pointer ctx)
-	{
-        //OpenUpsEvent* e = new OpenUpsEvent();
-        //e->ctx = ctx;
-        //m_fsm.PostEventFIFO(e);
-		ctx->Answer(Error_NotImpl);
-	}
-
-	void GetStatus(SpReqAnsContext<UpsService_GetStatus_Req, UpsService_GetStatus_Ans>::Pointer ctx)
-	{
-		GetStatusEvent* e = new GetStatusEvent();
-		e->ctx = ctx;
-		m_fsm.PostEventFIFO(e);
-	}
-
-	void Shutdown(SpReqAnsContext<UpsService_Shutdown_Req, UpsService_Shutdown_Ans>::Pointer ctx)
-	{
-		ShutDownEvent* e = new ShutDownEvent();
-		e->ctx = ctx;
-		m_fsm.PostEventFIFO(e);
-	}
-
-	void Close(SpReqAnsContext<UpsService_Close_Req, UpsService_Close_Ans>::Pointer ctx)
-	{
-		ctx->Answer(Error_NotImpl);
-	}
-
-
-	virtual bool IsService()const{return true;}
-	virtual bool IsMultiThread()const{return false;}
-private:
-	CUpsFSM m_fsm;
-};
-
-void UpsServerSession::Handle_Open(SpReqAnsContext<UpsService_Open_Req, UpsService_Open_Ans>::Pointer ctx)
-{
-	DbgToBeidou(ctx->link, __FUNCTION__)();
-	m_pEntity->Open(ctx);
-}
-
-void UpsServerSession::Handle_GetStatus(SpReqAnsContext<UpsService_GetStatus_Req, UpsService_GetStatus_Ans>::Pointer ctx)
-{
-	DbgToBeidou(ctx->link, __FUNCTION__)();
-	m_pEntity->GetStatus(ctx);
-}
-
-void UpsServerSession::Handle_Shutdown(SpReqAnsContext<UpsService_Shutdown_Req, UpsService_Shutdown_Ans>::Pointer ctx)
-{
-	DbgToBeidou(ctx->link, __FUNCTION__)();
-	m_pEntity->Shutdown(ctx);
-}
-
-void UpsServerSession::Handle_Close(SpReqAnsContext<UpsService_Close_Req, UpsService_Close_Ans>::Pointer ctx)
-{
-	DbgToBeidou(ctx->link, __FUNCTION__)();
-	m_pEntity->Close(ctx);
-}
-
-SP_BEGIN_ENTITY_MAP()
-	SP_ENTITY(CUpsEntity)
-SP_END_ENTITY_MAP()
-

+ 0 - 33
Module/mod_ups/ups.xml

@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="gb2312" ?>
-<entity name="Ups">
-	<class name="UpsService" overlap="true" exclusive="false">
-		<twoway name="Open" overlap="true">
-			<req>
-				<param name="Com" type="string" />
-			</req>
-			<res>
-			</res>			
-		</twoway>
-		<twoway name="GetStatus" overlap="true">
-			<req>
-			</req>
-			<res>
-				<param name="Status" type="int" />
-			</res>			
-		</twoway>
-		<twoway name="Shutdown" overlap="true">
-			<req>
-				<param name="ShutdownTime" type="int" />
-				<param name="UpTime" type="int" />
-			</req>
-			<res>
-			</res>			
-		</twoway>
-		<twoway name="Close" overlap="true">
-			<req>
-			</req>
-			<res>
-			</res>			
-		</twoway>						
-	</class>
-</entity>

+ 35 - 0
Module/mod_vtmloader/CMakeLists.txt

@@ -0,0 +1,35 @@
+define_module("VtmLoader")
+
+
+set(${MODULE_PREFIX}_SRCS
+	VtmLoaderFSM.cpp
+	mod_vtmloader.cpp
+	${OTHER_LIB_BASE_DIR}/libRestfulFunc/RestfulFunc.h
+)
+
+
+message(STATUS "module=${${MODULE_PREFIX}_SRCS}")
+
+set(MOD_VERSION_STRING "1.0.0-dev2")
+add_module_libraries(${MODULE_PREFIX} ${MODULE_NAME} ${MOD_VERSION_STRING})
+
+target_include_directories(${MODULE_NAME} PRIVATE
+	${RVC_FRAMEWORK_INCLUDES_DIR}	
+	${ModuleCommonHeadPath}
+	${DevHeadPath}
+	${MODULE_BASE_DIR}/mod_healthmanager
+	${OTHER_LIB_BASE_DIR}/libpublicFun
+)
+
+target_link_directories(${MODULE_NAME} PRIVATE
+	${ThirdPartyLib}
+	${OTHER_LIB_BASE_DIR}/libRestfulFunc
+)
+
+# 添加实体需要依赖的其他共享库(包括系统库)
+set(${MODULE_PREFIX}_LIBS ${MODULE_BASE_ALL_LIBS} RestfulFunc)#${CONAN_PKG_LIBS_BOOST} RVCCrypt NewRVCCrypt
+target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS} libpublicFun)
+
+
+
+deploy_module(${MODULE_PREFIX} ${MODULE_NAME})

+ 1585 - 0
Module/mod_vtmloader/VtmLoaderFSM.cpp

@@ -0,0 +1,1585 @@
+#include "stdafx.h"
+#include <algorithm>
+#include "VtmLoaderFSM.h"
+#include "VtmLoader_UserCode.h"
+#include "EventCode.h"
+#if defined(RVC_OS_WIN)
+#include <io.h>
+#else
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include "RestfulFunc.h"
+#endif //RVC_OS_WIN
+#include "../mod_healthmanager/HealthManager_client_g.h"
+using namespace HealthManager;
+using namespace SP::Module::Net;
+
+#define ALLOW_MULTI_NETWORKD_CARDS
+const int MAX_AYSNC_TIMEOUT = 60000;
+const int MAX_IGNORE_TIMEOUT = 100;
+
+enum EntityOP
+{
+	OP_STOP_ENTITY,
+	OP_START_ENTITY,
+	OP_PAUSE_ENTITY,
+	OP_TERMINATE_ENTITY,
+	OP_CONTINUE_ENTITY,
+};
+
+struct callback_entry : public IReleasable
+{
+	virtual ~callback_entry() {}
+
+	CSimpleStringA EntityName;
+	union {
+		void* pRawData;
+		int state;
+	};
+	int op;
+	ErrorCodeEnum ErrorResult;
+};
+DWORD tokenUpdate(void* param)
+{
+	CVtmLoaderFSM* t_entity = (CVtmLoaderFSM*)param;
+	while (true)
+	{
+		if (t_entity->refreshToken())
+			Sleep(t_entity->m_refreshWaitSec * 1000);
+		else
+			Sleep(20 * 1000);
+	}
+	return 0;
+}
+DWORD checkUrlActive(LPVOID param)
+{
+	CVtmLoaderFSM* entityInfo = (CVtmLoaderFSM*)param;
+	CSmartPointer<IConfigInfo> pConfig;
+	CSimpleString t_endpoint, t_materialUrl;
+	CSimpleString errMsg;
+
+	Sleep(60 * 1000);
+	long srcClo = clock();
+	entityInfo->GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, pConfig);
+
+	do {
+		if (Error_Succeed != pConfig->ReadConfigValue("Common", "SendEndpoint", t_endpoint))
+		{
+			errMsg = "checkUrlActive read Common::SendEndpoint err";
+			break;
+		}
+
+		if (t_endpoint.GetLength() == 0)
+		{
+			errMsg = "checkUrlActive endpoint len=0 err";
+			break;
+		}
+
+		//if (!checkHttpActive(t_endpoint.GetData()))
+		//	errMsg.Append(CSimpleString::Format("checkHttpActive endpoint err:%s !", t_endpoint.GetData()));
+		//else if((clock() - srcClo) > 3000)
+		//	errMsg.Append(CSimpleString::Format("checkHttpActive endpoint too long:%d !", clock() - srcClo));
+
+		srcClo = clock();
+
+	} while (false);
+
+	if (errMsg.GetLength() > 0)
+		LogWarn(SeverityLevelEnum::Severity_Middle, Error_Unexpect, WARN_SendEndpoint_URL_ERR, errMsg.GetData());
+
+	//do get upload log Info for a while
+	while (true)
+	{
+		if (entityInfo->m_uploadLogInfo_waitSec <= 0)
+			break;
+		Sleep(entityInfo->m_uploadLogInfo_waitSec * 1000);
+		unsigned long t_upload_TerminalSys_Suc, t_upload_TerminalUser_Suc, t_upload_BussinessSys_Suc, t_upload_BussinessUser_Suc, t_upload_beidou_Suc;
+		unsigned long t_upload_TerminalSys_Err, t_upload_TerminalUser_Err, t_upload_BussinessSys_Err, t_upload_BussinessUser_Err, t_upload_beidou_Err;
+		entityInfo->GetEntityBase()->GetFunction()->GetPrivilegeFunction()->GetSendLogInfo(&t_upload_TerminalSys_Suc, &t_upload_TerminalUser_Suc,
+			&t_upload_BussinessSys_Suc, &t_upload_BussinessUser_Suc, &t_upload_beidou_Suc,
+			&t_upload_TerminalSys_Err, &t_upload_TerminalUser_Err, &t_upload_BussinessSys_Err, &t_upload_BussinessUser_Err, &t_upload_beidou_Err);
+		LogWarn(SeverityLevelEnum::Severity_Low, Error_Trace, WARN_SendEndpoint_LOG_INFO,
+			CSimpleString::Format("checkUrlActive::GetSendLogInfo, TS_Suc:%d, TU_Suc:%d, BS_Suc:%d, BU_Suc:%d, beidou_Suc:%d, TS_Err:%d, TU_Err:%d, BS_Err:%d, BU_Err:%d, beidou_Err:%d"
+				, t_upload_TerminalSys_Suc, t_upload_TerminalUser_Suc, t_upload_BussinessSys_Suc, t_upload_BussinessUser_Suc, t_upload_beidou_Suc,
+				t_upload_TerminalSys_Err, t_upload_TerminalUser_Err, t_upload_BussinessSys_Err, t_upload_BussinessUser_Err, t_upload_beidou_Err).GetData());
+	}
+
+
+	return 0;
+}
+
+bool CVtmLoaderFSM::refreshToken()
+{
+	CSimpleString oldToken, newToken;
+	ErrorCodeEnum eErr = Error_Succeed;
+	if (Error_Succeed != (eErr = GetEntityBase()->GetFunction()->GetPrivilegeFunction()->TryUpdateToken(oldToken, newToken)))
+	{
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210F13").setResultCode("RTA1F02")("Get center setting, TryUpdateToken failed:0x%x", eErr);
+		return false;
+	}
+	return true;
+}
+
+CVtmLoaderFSM::CVtmLoaderFSM()
+{
+	m_refreshWaitSec = 1200;
+	m_uploadLogInfo_waitSec = 3600;
+	m_defaultSystemId = "LR04.02_Terminal";
+	m_iCanIgnoreAddrDetect = 0;
+	m_ullMaxAddrDetectTime = 10*60*1000;//10 minutes
+	m_iDetectInterval = 5000;
+}
+
+CVtmLoaderFSM::~CVtmLoaderFSM()
+{
+}
+
+ErrorCodeEnum CVtmLoaderFSM::OnInit()
+{
+	AddStateHooker(this);
+
+	GetEntityBase()->GetFunction()->GetSystemStaticInfo(m_sysInfo);
+	return Error_Succeed;
+}
+
+ErrorCodeEnum CVtmLoaderFSM::OnExit()
+{
+	RemoveStateHooker(this);
+	return Error_Succeed;
+}
+
+void CVtmLoaderFSM::OnStateTrans(int iSrcState, int iDstState)
+{
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("state change from %s to %s", GetStateName(iSrcState), GetStateName(iDstState));
+}
+
+void CVtmLoaderFSM::s0_on_entry()
+{
+	LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "开始网卡、网络连通性检查");
+	NetWorkCheckAndGetSettingTask* task = new NetWorkCheckAndGetSettingTask(this);
+	GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
+}
+
+void CVtmLoaderFSM::s0_on_exit()
+{
+}
+
+unsigned int CVtmLoaderFSM::s0_on_event(FSMEvent* pEvt)
+{
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s0_on_event,pEvt:%d,pEvt->param1:%d", pEvt->iEvt, pEvt->param1);
+	switch (pEvt->iEvt)
+	{
+	case Event_NetworkCheck_Passed:
+		pEvt->SetHandled();
+		return pEvt->param1;
+	default:
+		break;
+	}
+	return 0;
+}
+		
+void CVtmLoaderFSM::ShowEntityBootFailedAtFront(LPCTSTR lpcszEntityName, ErrorCodeEnum bootFailedResult, bool isBlock)
+{
+#if defined(RVC_OS_LINUX)
+
+	CEntityLastErrorInfo errInfo = {};
+	ErrorCodeEnum errCode = GetEntityBase()->GetFunction()->GetEntityLastError(lpcszEntityName, errInfo);
+	CSimpleStringA strErrMsg(true);
+	if (!errInfo.strErrMsg.IsNullOrEmpty()) {
+		strErrMsg = CSimpleStringA::Format("%s:%s", lpcszEntityName, (LPCTSTR)errInfo.strErrMsg);
+	}
+	else {
+		strErrMsg = CSimpleStringA::Format("%s模块初始化失败: %s", lpcszEntityName, (LPCTSTR)SpStrError(bootFailedResult));
+	}
+
+	if (CSimpleStringA(lpcszEntityName).Compare("SIPPhone", true) == 0)
+	{
+		GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", strErrMsg.GetData());//实体启动失败保存到错误页字段
+	}
+
+	if (isBlock) {
+		SP::Module::Comm::LogErrorNotiyStruct notifyItem(bootFailedResult, 0);
+		SP::Module::Comm::LogNotiyMessageStruct notifyMsg(strErrMsg);
+		notifyItem.Notify(notifyMsg);
+	}
+	else {
+		LogError(Severity_High, bootFailedResult, 0, strErrMsg);
+	}
+
+#endif //RVC_OS_LINUX
+}
+
+//CoreBoot
+void CVtmLoaderFSM::s1_on_entry()
+{
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s1_on_entry");
+	ErrorCodeEnum eErrCode;
+	CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
+	CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = spEntityFunction.ConvertCase<IEntityFunctionPrivilege>();
+
+
+	bool bAsync = false;
+	m_eStage = LOADSTAGE_COREBOOT;
+	int ret = 0;
+	map<CSimpleStringA, EntityLoadInfo>::iterator it;
+	//start entity
+
+	vector<CSimpleStringA>::iterator vIt;
+	if (m_coreBootOpt.size() == 0)
+		goto COREBOOT_FINISH;
+
+	char startMsg[128];
+	for (vIt = m_vCoreBoot.begin(); vIt != m_vCoreBoot.end(); ++vIt)
+	{
+		CSmartPointer<IAsynWaitSp> spWait;//oilyang 20160325 see the following comment
+		it = m_coreBootOpt.find(*vIt);
+		if (it == m_coreBootOpt.end())
+		{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("cannot find %s", (LPCSTR)* vIt);
+			continue;
+		}
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start,%s,%d", (LPCSTR)it->first, it->second.loadOpt);
+		CEntityRunInfo entRunInfo;
+		ErrorCodeEnum errCode = spEntityFunction->GetEntityRunInfo(it->first, entRunInfo);
+		if (errCode == Error_Succeed && entRunInfo.eState == EntityState_Idle)
+		{
+			it->second.eResult = LOADING_SUCCEED;
+			ret = CheckLoadResult(LOADSTAGE_COREBOOT);
+			if (ret == 0 || ret == 2)
+				goto COREBOOT_FINISH;
+			else
+				continue;
+		}
+		ZeroMemory(startMsg, 128);
+		//sprintf(startMsg, "正在启动实体%s...", it->first.GetData());
+		//GetEntityBase()->GetFunction()->ShowStartupInfo(startMsg);
+		switch (it->second.loadOpt)
+		{
+		case LOADOPT_IGNORE:
+		{
+			pFuncPrivilege->StartEntity(it->first, NULL, spWait);
+			if (spWait != NULL)
+				spWait->WaitAnswer(MAX_IGNORE_TIMEOUT);//oilyang 20160325 the null pointer
+			it->second.eResult = LOADING_SUCCEED;
+			ret = CheckLoadResult(LOADSTAGE_COREBOOT);
+			if (ret == 0 || ret == 2)
+				goto COREBOOT_FINISH;
+		}
+		break;
+		case LOADOPT_ASYNC_VERIFY:
+			errCode = AsyncStartEntity(it->first, NULL, NULL);
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("AsyncStartEntity:%d", errCode);
+			bAsync = true;
+			break;
+		case LOADOPT_SYNC_VERIFY:
+		{
+			pFuncPrivilege->StartEntity(it->first, NULL, spWait);
+			if (spWait != NULL)
+				errCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("(coreboot)sync...%d", errCode);
+			if (errCode == Error_Succeed)
+				it->second.eResult = LOADING_SUCCEED;
+			else if (errCode == Error_TimeOut)
+				it->second.eResult = LOADING_TIMEOUT;
+			else
+				it->second.eResult = LOADING_FAILED;
+			if (errCode != Error_Succeed) {
+				return;
+#if defined(RVC_OS_LINUX)
+				ShowEntityBootFailedAtFront(it->first, errCode);
+				return;
+#endif //RVC_OS_LINUX
+			}
+			else
+				ret = CheckLoadResult(LOADSTAGE_COREBOOT);
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s1 check ret %d", ret);
+			if (ret == 0 || ret == 2)
+				goto COREBOOT_FINISH;
+		}
+		break;
+		default:
+			break;
+		}
+	}
+COREBOOT_FINISH:
+
+	if (!bAsync)
+	{
+		FSMEvent* e = new FSMEvent(USER_EVT_COREBOOT_FINISHED);
+		e->param1 = ret;
+		PostEventFIFO(e);
+	}
+	else
+	{
+		ret = CheckLoadResult(LOADSTAGE_COREBOOT);
+		if (ret == 0 || ret == 2)
+		{
+			FSMEvent* e = new FSMEvent(USER_EVT_COREBOOT_FINISHED);
+			e->param1 = ret;
+			PostEventFIFO(e);
+		}
+	}
+	return;
+}
+void CVtmLoaderFSM::s1_on_exit()
+{
+	LOG_FUNCTION();
+}
+unsigned int CVtmLoaderFSM::s1_on_event(FSMEvent* pEvt)
+{
+	LOG_FUNCTION();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s1 evt %d", pEvt->iEvt);
+	switch (pEvt->iEvt)
+	{
+	case USER_EVT_COREBOOT_FINISHED:
+		pEvt->SetHandled();
+		if (pEvt->param1 == 2) {
+#if defined(RVC_OS_LINUX)
+			ShowEntityBootFailedAtFront(m_csErrEntity, Error_InvalidState);
+#endif
+		}
+		return pEvt->param1;
+		break;
+	default:
+		break;
+	}
+	return 0;
+}
+//SafeLoad
+void CVtmLoaderFSM::s2_on_entry()
+{
+	LOG_FUNCTION();
+	LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "CoreBoot 阶段实体加载完成");
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040210F14")("Stage Coreboot have done.");
+	ULONGLONG dwElapse = SP::Module::Comm::RVCGetTickCount();//使用机器启动时间秒数
+	DWORD elapseTimeTemp = dwElapse / 1000;
+	CSimpleStringA xMsg = CSimpleStringA::Format("{\"Decripstion\":\"Enter safeload state.\",\"version\":\"%s\",\"elapseTime\":\"%d\"}", m_sysInfo.InstallVersion.ToString().GetData(), elapseTimeTemp);
+	//LogWarn(Severity_Low, Error_Unexpect, HealthManager_UserErrorCode_Enter_SafeLoad_State, xMsg.GetData());
+
+
+	bool bAsync = false;
+	m_eStage = LOADSTAGE_SAFELOAD;
+	int ret = 0;
+	map<CSimpleStringA, EntityLoadInfo>::iterator it;
+	CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
+	CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
+
+	ErrorCodeEnum errCode;
+	vector<CSimpleStringA>::iterator vIt;
+	if (m_safeLoadOpt.size() == 0)
+		goto SAFELOAD_FINISH;
+	char startMsg[128];
+	for (vIt = m_vSafeLoad.begin(); vIt != m_vSafeLoad.end(); ++vIt)
+	{
+		CSmartPointer<IAsynWaitSp> spWait;
+		it = m_safeLoadOpt.find(*vIt);
+		if (it == m_safeLoadOpt.end())
+		{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("cannot find %s", (LPCSTR)* vIt);
+			continue;
+		}
+		CEntityRunInfo entRunInfo;
+		errCode = pFunc->GetEntityRunInfo(it->first, entRunInfo);
+		if (errCode == Error_Succeed && entRunInfo.eState == EntityState_Idle)
+		{
+			it->second.eResult = LOADING_SUCCEED;
+			ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
+			if (ret == 0 || ret == 2)
+				goto SAFELOAD_FINISH;
+			else
+				continue;
+		}
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start %s,%d", (LPCTSTR)it->first, it->second.loadOpt);
+		switch (it->second.loadOpt)
+		{
+		case LOADOPT_IGNORE:
+		{
+			pFuncPrivilege->StartEntity(it->first, NULL, spWait);
+			if (spWait != NULL)
+				spWait->WaitAnswer(MAX_IGNORE_TIMEOUT);
+			it->second.eResult = LOADING_SUCCEED;
+			ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
+			if (ret == 0 || ret == 2)
+				goto SAFELOAD_FINISH;
+		}
+		break;
+		case LOADOPT_ASYNC_VERIFY:
+			AsyncStartEntity(it->first, NULL, NULL);
+			bAsync = true;
+			break;
+		case LOADOPT_SYNC_VERIFY:
+		{
+			ZeroMemory(startMsg, 128);
+			sprintf(startMsg, "正在启动实体%s...", it->first.GetData());
+			GetEntityBase()->GetFunction()->ShowStartupInfo(startMsg);
+			pFuncPrivilege->StartEntity(it->first, NULL, spWait);
+			if (spWait != NULL)
+				errCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("sync...%d", errCode);
+			if (errCode == Error_Succeed) {
+				it->second.eResult = LOADING_SUCCEED;
+			}
+			else if (errCode == Error_TimeOut)
+				it->second.eResult = LOADING_TIMEOUT;
+			else
+				it->second.eResult = LOADING_FAILED;
+			if (it->second.eResult != Error_Succeed)
+			{
+				char tmp[128] = { 0 };
+				if (it->first.Compare("SIPPhone", true) == 0) {
+					if (LOADING_TIMEOUT == it->second.eResult) {
+						sprintf(tmp, "实体 %s 启动超时(%d),请尝试重启应用解决", it->first.GetData(), it->second.eResult);
+					}
+					else {
+						sprintf(tmp, "实体 %s 启动失败(%d),识别不到声卡,请尝试重启计算机解决,多次无效后请联系厂商处理", it->first.GetData(), it->second.eResult);
+					}
+				}
+				else {
+					sprintf(tmp, "实体 %s 启动失败 %d", it->first.GetData(), it->second.eResult);
+				}
+#if defined(RVC_OS_WIN)
+				GetEntityBase()->GetFunction()->ShowFatalError(tmp);
+				GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", tmp);//实体启动失败保存到错误页字段
+#else
+				ShowEntityBootFailedAtFront(it->first, errCode);
+#endif
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("启动失败:%s", tmp);
+				m_csErrEntity = m_csErrEntity + "|" + it->first;
+				FSMEvent* e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
+				e->param1 = 2;//"SYNC START" enity started failed.
+				PostEventFIFO(e);
+				return;
+			}
+			//if (errCode != Error_Succeed)
+			//	return;
+			//else
+			ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
+			if (ret == 0 || ret == 2)
+				goto SAFELOAD_FINISH;
+		}
+		break;
+		default:
+			break;
+		}
+	}
+SAFELOAD_FINISH:
+	if (!bAsync)
+	{
+		FSMEvent* e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
+		e->param1 = ret;
+		PostEventFIFO(e);
+	}
+	else
+	{
+		ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s2 %d", ret);
+		if (ret == 0 || ret == 2)
+		{
+			FSMEvent* e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
+			e->param1 = ret;
+			PostEventFIFO(e);
+		}
+	}
+SAFELOAD_END:
+	return;
+}
+void CVtmLoaderFSM::s2_on_exit()
+{
+	LOG_FUNCTION();
+}
+unsigned int CVtmLoaderFSM::s2_on_event(FSMEvent* pEvt)
+{
+	LOG_FUNCTION();
+	int ret = 0;
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s2 event %d,%d", pEvt->iEvt, pEvt->param1);
+	switch (pEvt->iEvt)
+	{
+	case USER_EVT_SAFELOAD_FINISHED:
+	{
+		pEvt->SetHandled();
+		//oiltmp
+		//according to the system varible TerminalState to do sth.
+		//Configed
+		//Breakdown
+		//Blocking
+		//Authentication
+		{
+			if (pEvt->param1 == 0)
+			{
+				//initializer if configured
+				CSimpleStringA csTermStage("");
+				ErrorCodeEnum eErrCode;
+				eErrCode = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage", csTermStage);
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("after safeload to get termstage %s", (LPCTSTR)csTermStage);
+				if (csTermStage == "B" || csTermStage == "N")
+					return 1;
+			}
+			else if (pEvt->param1 == 2)
+			{
+#if defined(RVC_OS_LINUX)
+				ShowEntityBootFailedAtFront(m_csErrEntity, Error_InvalidState);
+#endif 
+				ret = 2;
+			}
+
+		}
+		//Unsubscrible
+	}
+	break;
+	case USER_EVT_SAFELOAD_EXMINE_FINISHED:
+		if (pEvt->param1 == 0)
+			ret = 0;
+		//do something else oiltmp
+		pEvt->SetHandled();
+		break;
+	case USER_EVT_ACCESSAUTH_FINISHED:
+		pEvt->SetHandled();
+		ret = pEvt->param1;
+		break;
+	default:
+		break;
+	}
+	return ret;
+}
+//Operating
+void CVtmLoaderFSM::s3_on_entry()
+{
+	LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "SafeLoad 阶段实体加载完成");
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040210F15")("Stage Safeload have done.");
+	Sleep(m_sleepEnterOpMS);
+	bool bAsync = false;
+	m_eStage = LOADSTAGE_OPERATING;
+	int ret = 0;
+	map<CSimpleStringA, EntityLoadInfo>::iterator it;
+	CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
+	CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
+	//start entity
+
+	ErrorCodeEnum errCode;
+	vector<CSimpleStringA>::iterator vIt;
+	if (m_operatingOpt.size() == 0)
+		goto OPERATING_FINISH;
+	char startMsg[128];
+	for (vIt = m_vOperating.begin(); vIt != m_vOperating.end(); ++vIt)
+	{
+		CSmartPointer<IAsynWaitSp> spWait;
+		it = m_operatingOpt.find(*vIt);
+		if (it == m_operatingOpt.end())
+		{
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("cannot find %s", (LPCSTR)* vIt);
+			continue;
+		}
+
+		CEntityRunInfo entRunInfo;
+		errCode = pFunc->GetEntityRunInfo(it->first, entRunInfo);
+		if (errCode == Error_Succeed && entRunInfo.eState == EntityState_Idle)
+		{
+			it->second.eResult = LOADING_SUCCEED;
+			ret = CheckLoadResult(LOADSTAGE_OPERATING);
+			if (ret == 0 || ret == 2)
+				goto OPERATING_FINISH;
+			else
+				continue;
+		}
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("op start %s,%d", (LPCTSTR)it->first, it->second.loadOpt);
+		switch (it->second.loadOpt)
+		{
+		case LOADOPT_IGNORE:
+		{
+			pFuncPrivilege->StartEntity(it->first, NULL, spWait);
+			if (spWait != NULL)
+				spWait->WaitAnswer(MAX_IGNORE_TIMEOUT);
+			it->second.eResult = LOADING_SUCCEED;
+			ret = CheckLoadResult(LOADSTAGE_OPERATING);
+			if (ret == 0 || ret == 2)
+				goto OPERATING_FINISH;
+		}
+		break;
+		case LOADOPT_ASYNC_VERIFY:
+			errCode = AsyncStartEntity(it->first, NULL, NULL);
+			bAsync = true;
+			break;
+		case LOADOPT_SYNC_VERIFY:
+		{
+			ZeroMemory(startMsg, 128);
+			sprintf(startMsg, "正在启动实体%s...", it->first.GetData());
+			GetEntityBase()->GetFunction()->ShowStartupInfo(startMsg);
+			errCode = pFuncPrivilege->StartEntity(it->first, NULL, spWait);
+			if (errCode == Error_Succeed)
+			{
+				if (spWait != NULL)
+					errCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
+			}
+			else
+			{
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("StartEntity %s failed(%d).", (LPCSTR)it->first, errCode);
+				break;
+			}
+			if (errCode == Error_Succeed)
+				it->second.eResult = LOADING_SUCCEED;
+			else if (errCode == Error_TimeOut)
+				it->second.eResult = LOADING_TIMEOUT;
+			else
+				it->second.eResult = LOADING_FAILED;
+			if (it->second.eResult != Error_Succeed)
+			{
+				char tmp[128] = { 0 };
+				if (it->first.Compare("SIPPhone", true) == 0) {
+					if (LOADING_TIMEOUT == it->second.eResult) {
+						sprintf(tmp, "实体 %s 启动超时(%d),请尝试重启应用解决", it->first.GetData(), it->second.eResult);
+					}
+					else {
+						sprintf(tmp, "实体 %s 启动失败(%d),识别不到声卡,请尝试重启计算机解决,多次无效后请联系厂商处理", it->first.GetData(), it->second.eResult);
+					}
+				}
+				else {
+					sprintf(tmp, "实体 %s 启动失败 %d", it->first.GetData(), it->second.eResult);
+				}
+#if defined(RVC_OS_WIN)
+				GetEntityBase()->GetFunction()->ShowFatalError(tmp);
+#else
+				ShowEntityBootFailedAtFront(it->first, errCode);
+#endif 
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("启动失败:%s", tmp);
+				m_csErrEntity = m_csErrEntity + "|" + it->first;
+				FSMEvent* e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
+				e->param1 = 2;//"SYNC START" enity started failed.
+				PostEventFIFO(e);
+				return;
+			}
+			if (errCode != Error_Succeed)
+				return;
+			else
+				ret = CheckLoadResult(LOADSTAGE_OPERATING);
+			if (ret == 0 || ret == 2)
+				goto OPERATING_FINISH;
+		}
+		break;
+		default:
+			break;
+		}
+	}
+OPERATING_FINISH:
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s3 ret %d", ret);
+	if (!bAsync)
+	{
+		FSMEvent* e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
+		e->param1 = ret;
+		PostEventFIFO(e);
+	}
+	else
+	{
+		ret = CheckLoadResult(LOADSTAGE_OPERATING);
+		if (ret == 0 || ret == 2)
+		{
+			FSMEvent* e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
+			e->param1 = ret;
+			PostEventFIFO(e);
+		}
+	}
+	return;
+}
+void CVtmLoaderFSM::s3_on_exit()
+{
+	LOG_FUNCTION();
+}
+unsigned int CVtmLoaderFSM::s3_on_event(FSMEvent* pEvt)
+{
+	LOG_FUNCTION();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s3(Operating) event %d,%d", pEvt->iEvt, pEvt->param1);
+	int ret = 0;
+	switch (pEvt->iEvt)
+	{
+	case USER_EVT_OPERATING_FINISHED:
+		ret = pEvt->param1;
+		if (ret == 2) {
+#if defined(RVC_OS_LINUX)
+			ShowEntityBootFailedAtFront(m_csErrEntity, Error_InvalidState);
+#endif
+		}
+		pEvt->SetHandled();
+		break;
+	default:
+		break;
+	}
+	return ret;
+}
+//Idle(Operating finished)
+void CVtmLoaderFSM::s4_on_entry()
+{
+	LOG_FUNCTION();
+	LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "Operating 阶段实体加载完成");
+	//oiltmp wait for analyse progress, then change to app log format
+	LogWarn(Severity_Low, Error_Succeed, VtmLoader_NetCard_Cost, CSimpleStringA::Format("%d", m_ullNetCardCost).GetData());
+	LogWarn(Severity_Low, Error_Succeed, VtmLoader_NetworkDetect_Cost, CSimpleStringA::Format("%d", m_ullNetDetectCost).GetData());
+	LogWarn(Severity_Low, Error_Succeed, VtmLoader_GetConfig_Cost, CSimpleStringA::Format("%d", m_ullGetConfigCost).GetData());
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040210F16")("Stage Operating have done.");
+	NoticeEntityLoadTask* pTask = new NoticeEntityLoadTask(this,Event_VtmLoader_EntityLoad_Finished);
+	GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
+}
+void CVtmLoaderFSM::s4_on_exit()
+{
+	LOG_FUNCTION();
+}
+unsigned int CVtmLoaderFSM::s4_on_event(FSMEvent* pEvt)
+{
+	LOG_FUNCTION();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s4 event %d,%d", pEvt->iEvt, pEvt->param1);
+	switch (pEvt->iEvt)
+	{
+	default:
+		break;
+	}
+	return 0;
+}
+//Fault
+void CVtmLoaderFSM::s5_on_entry()
+{
+	LOG_FUNCTION();
+	LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, "实体加载失败,启动终止。请排查启动失败实体或重启应用");
+	NoticeEntityLoadTask* pTask = new NoticeEntityLoadTask(this, Event_VtmLoader_EntityLoad_Failed);
+	GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
+	CSmartPointer<IConfigInfo> spConfigCen, spConfigRun;
+	ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spConfigCen);
+	eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
+	int failTimes = 0, maxFailTimes = 2;
+	do {
+		int value(0);
+		spConfigCen->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "MaxFailTimes", value);
+		if (value > 0) {
+			maxFailTimes = value;
+		}
+	} while (false);
+	spConfigRun->ReadConfigValueInt("Run", "FailTimes", failTimes);
+	failTimes++;
+	//LogWarn(Severity_High, Error_Unexpect, LOG_ERR_HEALTH_FAILED, "HealthManager failed.");
+	//oilyang@20210930 add to call for Close Page
+	//GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "C");
+	//if (failTimes > maxFailTimes)
+	//{
+	//	//LogEvent(Severity_Middle, LOG_EVT_HEADLIGHT_RED_ON, "设备故障");
+	//	eErr = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "D");
+	//	if (eErr != Error_Succeed) {
+	//		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("set termstage D failed (%d).", eErr);
+	//	}
+	//	else {
+	//		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Set TerminalStage D.");
+	//	}
+	//}
+	//else
+	//{
+	//	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("have failed %d times.", failTimes);
+	//	spConfigRun->WriteConfigValueInt("Run", "FailTimes", failTimes);
+	//	eErr = GetEntityBase()->GetFunction()->SetSysVar("RunState", "F");
+	//	if (eErr != Error_Succeed)
+	//	{
+	//		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("set RunState failed (%d).", eErr);
+	//	}
+	//}
+}
+void CVtmLoaderFSM::s5_on_exit()
+{
+	LOG_FUNCTION();
+}
+unsigned int CVtmLoaderFSM::s5_on_event(FSMEvent* pEvt)
+{
+	LOG_FUNCTION();
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s5(Fault) event %d,%d", pEvt->iEvt, pEvt->param1);
+	switch (pEvt->iEvt)
+	{
+	case USER_EVT_ACCESSAUTH_FINISHED:
+		pEvt->SetHandled();
+		if (pEvt->param1 == 1)
+		{
+			return 1;
+		}
+		break;
+	default:
+		break;
+	}
+	return 0;
+}
+
+
+BOOL CVtmLoaderFSM::DetectNetworkLegality(CSimpleStringA& strInfo)
+{
+	BOOL result(TRUE);
+	strInfo.Clear();
+
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Detect network legality...");
+
+	BOOL fLocalLANConnected(FALSE);
+	unsigned int curTimes = 1;
+	const unsigned int maxTimes = 3;
+
+	do {
+		CAutoArray<NetworkAdapterItem> netList;
+		if (SP::Module::Net::GetINETMacAddresses(netList) == Error_Succeed)
+		{
+			for (int i = 0; i < netList.GetCount(); i++) {
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("interface(%d):%s", i, netList[i].description.c_str());
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ip(%d):%s", i, netList[i].ip.c_str());
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("mac(%d):%s", i, netList[i].mac.c_str());
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("operStatus(%d):%d", i, netList[i].operStatus);
+				DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("type(%d):%d", i, netList[i].type);
+				//if (netList[i].type == IF_TYPE_ETHERNET_CSMACD && netList[i].operStatus == IfOperStatusUp)
+				if (netList[i].operStatus == 1)//oiltest
+				{
+					fLocalLANConnected = TRUE;
+					break;
+				}
+			}
+		}
+		Sleep(500);
+		curTimes++;
+	} while (curTimes < maxTimes && !fLocalLANConnected);
+
+	if (!fLocalLANConnected) {
+		strInfo = "未检查到有网卡连接,请检查网络连接";
+		result = FALSE;
+	}
+	return result;
+}
+int CVtmLoaderFSM::NetWorkCheckAndGetSetting()
+{
+	//检查网卡状态
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to check network status");
+	CSimpleStringA strMsg(true), tmpTS("X");
+	//GetEntityBase()->GetFunction()->GetSysVar("TerminalStage", tmpTS);
+	int netcheckCount = 1;
+	ULLINT ullTmpStart = SP::Module::Comm::RVCGetTickCount();
+	//for rvc.pad only
+	if (!m_sysInfo.strTerminalID.IsNullOrEmpty() && m_sysInfo.strTerminalID.SubString(m_sysInfo.strTerminalID.GetLength() - 4, 1).Compare("5") == 0)
+		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s is pad,no network connection detect.", m_sysInfo.strTerminalID.GetData());
+	else
+	{
+		while (true)
+		{
+			if (!DetectNetworkLegality(strMsg)) {
+				//LogWarn(Severity_High, Error_Unexpect, VtmLoader_UserCode_NetCard_UnAvaible, strMsg.GetData());
+				//LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, strMsg.GetData());
+				LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("%s。%d 秒后自动重试(第%d次重试)。请检查网线是否插好、网络是否正常"
+					, strMsg.GetData(), m_iDetectInterval / 1000, netcheckCount).GetData());
+				//if (tmpTS.Compare("E") != 0)
+				//{
+				//	GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "E");
+				//	tmpTS = "E";
+				//}
+				Sleep(5000);
+				netcheckCount++;
+			}
+			else
+			{
+				m_ullNetCardCost = (SP::Module::Comm::RVCGetTickCount() - ullTmpStart) / 1000;//second
+				LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "网卡状态正常");
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040210F10")("network interface ok.");
+				break;
+			}
+		}
+		ullTmpStart = SP::Module::Comm::RVCGetTickCount();
+		//检查网络连通性(网络连通性是否作为关键路径走配置,默认不是关键路径)
+		if (!DetectHttpActive())
+		{
+			//网络连通性检查未通过,提示确认网络后重启应用?界面加一个重启按钮?
+			LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, "网络连通性检查失败,请检查网络");
+			return -1;
+		}
+	}
+	m_ullNetDetectCost = (SP::Module::Comm::RVCGetTickCount() - ullTmpStart) / 1000;//second
+	ullTmpStart = SP::Module::Comm::RVCGetTickCount();
+	//拉取配置并通知提前启动的实体(Chromium)
+	//重试5次,失败则放弃
+	int getRetry = 0;
+	while(true)
+	{
+		if (GetConfig())
+			break;
+		else
+		{
+			if (getRetry >= 5)
+				return -2;
+			getRetry++;
+			Sleep(5000 * getRetry);
+		}
+	}
+
+	m_ullGetConfigCost = (SP::Module::Comm::RVCGetTickCount() - ullTmpStart) / 1000;//second
+	//加载实体列表
+	EntityLoad();
+
+	return 0;
+}
+int CVtmLoaderFSM::EntityLoad()
+{
+	//前提:收到了配置拉取完成的指令,才会进入到这里
+	//为了测试,假装已经拿到了集中配置
+	LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "开始加载实体");
+	CSmartPointer<IConfigInfo> spConfigCen,spRunCfg;
+	GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spConfigCen);
+	GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spRunCfg);
+	CSimpleStringA csCoreBootList(true), csSafeLoadList(true), csOperatingList(true),csKeyCB("CoreBootList."),csKeySL("SafeLoadList."),csKeyOp("OperatingList.");
+	spConfigCen->ReadConfigValue(GetEntityBase()->GetEntityName(), (csKeyCB + m_sysInfo.strMachineType).GetData(), csCoreBootList);
+	spConfigCen->ReadConfigValue(GetEntityBase()->GetEntityName(), (csKeySL + m_sysInfo.strMachineType).GetData(), csSafeLoadList);
+	spConfigCen->ReadConfigValue(GetEntityBase()->GetEntityName(), (csKeyOp + m_sysInfo.strMachineType).GetData(), csOperatingList);
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("CoreBoot.EntityList.%s:%s", m_sysInfo.strMachineType.GetData(), csCoreBootList.GetData());
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("SafeLoad.EntityList.%s:%s", m_sysInfo.strMachineType.GetData(), csSafeLoadList.GetData());
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Operating.EntityList.%s:%s", m_sysInfo.strMachineType.GetData(), csOperatingList.GetData());
+
+	//oiltmp 如果没有配置,则走默认配置
+	if (csCoreBootList.IsNullOrEmpty() || csCoreBootList.IndexOf("HealthManager") < 0 || csCoreBootList.IndexOf("AccessAuthorization") < 0
+		|| csCoreBootList.IndexOf("UpgradeManager") < 0 || csCoreBootList.IndexOf("HeartBeat") < 0
+		|| csCoreBootList.IndexOf("TokenKeeper") < 0 || csCoreBootList.IndexOf("ResourceWatcher") < 0
+		|| csCoreBootList.IndexOf("EventConverter") < 0 || csCoreBootList.IndexOf("Alarm") < 0
+		|| csCoreBootList.IndexOf("CenterSetting") < 0 || csCoreBootList.IndexOf("DeviceControl") < 0)
+	{
+		if (csCoreBootList.IsNullOrEmpty())
+		{
+			LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, "CoreBoot配置为空,请联系总行开发人员检查");
+			DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR040210F14").setResultCode("RTA1F05")("CoreBoot配置为空,请联系总行开发人员检查");
+		}
+		else
+		{
+			LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("CoreBoot配置异常,请联系总行开发人员检查(%s)", csCoreBootList.GetData()).GetData());
+			DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM).setLogCode("QLR040210F14").setResultCode("RTA1F05")(CSimpleStringA::Format("CoreBoot配置异常,请联系总行开发人员检查(%s)", csCoreBootList.GetData()));
+		}
+		//if have PinPad module
+		//if (m_sysInfo.strMachineType.Compare("RVC.CardStore", true) == 0)
+		//	csCoreBootList = "HealthManager=0|TokenKeeper=0|Alarm=0|UpgradeManager=0|DeviceControl=0|ResourceWatcher=0|AccessAuthorization=0|HeartBeat=0|EventConverter=0|CenterSetting=0";
+		//else
+		//	csCoreBootList = "HealthManager=0|TokenKeeper=0|Alarm=0|UpgradeManager=0|DeviceControl=0|ResourceWatcher=0|AccessAuthorization=0|HeartBeat=0|EventConverter=0|CenterSetting=0|PinPad=0";
+	}
+
+	spConfigCen->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "SleepEnterOpMS", m_sleepEnterOpMS);
+	if (m_sleepEnterOpMS <= 0 || m_sleepEnterOpMS > 20000)
+		m_sleepEnterOpMS = 1000;//default
+
+	//save centersetting to runcfg for vtmloader. using it before download centersetting
+	int iTmp = 0;
+	if (spConfigCen->ReadConfigValueInt("Common", "CanIgnoreAddrDetect", iTmp) == Error_Succeed && iTmp > 0)
+		spRunCfg->WriteConfigValueInt("Common", "CanIgnoreAddrDetect", iTmp);
+	iTmp = 0;
+	if (spConfigCen->ReadConfigValueInt("Common", "MaxAddrDetectTimes", iTmp) == Error_Succeed && iTmp > 0)
+		spRunCfg->WriteConfigValueInt("Common", "MaxAddrDetectTimes", iTmp);
+	iTmp = 0;
+	if (spConfigCen->ReadConfigValueInt("Common", "AddrDetectInterval", iTmp) == Error_Succeed && iTmp > 0)
+		spRunCfg->WriteConfigValueInt("Common", "AddrDetectInterval", iTmp);
+	CSimpleStringA csTmpAddr(true);
+	if (spConfigCen->ReadConfigValue("Common", "SettingDetectAddr", csTmpAddr) == Error_Succeed && !csTmpAddr.IsNullOrEmpty())
+		spRunCfg->WriteConfigValue("Common", "SettingDetectAddr", csTmpAddr.GetData());
+	csTmpAddr = "";
+	if (spConfigCen->ReadConfigValue("Common", "AccessAuthDetectAddr", csTmpAddr) == Error_Succeed && !csTmpAddr.IsNullOrEmpty())
+		spRunCfg->WriteConfigValue("Common", "AccessAuthDetectAddr", csTmpAddr.GetData());
+
+	//int count, cbNum, slNum, opNum;
+	//count = cbNum = slNum = opNum = 0;
+
+	CAutoArray<CSimpleStringA> arrCoreBoot;
+	arrCoreBoot.Init(64);
+	arrCoreBoot = csCoreBootList.Split('|');
+	for (int i = 0; i < arrCoreBoot.GetCount(); ++i)
+	{
+		CAutoArray<CSimpleStringA> arrEntity;
+		arrEntity.Init(2);
+		arrEntity = arrCoreBoot[i].Split('=');
+		if (arrEntity.GetCount() < 2)
+			break;
+		if (arrEntity[0].Compare("VtmLoader", true) == 0 || arrEntity[0].Compare("Chromium", true) == 0
+			|| arrEntity[0].Compare("GuiConsole", true) == 0)
+			continue;
+		m_vCoreBoot.push_back(arrEntity[0]);
+		if (arrEntity[1].Compare("1") == 0)
+			m_coreBootOpt[arrEntity[0]].loadOpt = LOADOPT_ASYNC_VERIFY;
+		else if (arrEntity[1].Compare("2") == 0)
+			m_coreBootOpt[arrEntity[0]].loadOpt = LOADOPT_SYNC_VERIFY;
+		else
+			m_coreBootOpt[arrEntity[0]].loadOpt = LOADOPT_IGNORE;
+		m_coreBootOpt[arrEntity[0].GetData()].eResult = LOADING_INIT;
+		//m_entityBootOpt[arrEntity[0].GetData()].initSn = cbNum;
+		//cbNum++;
+	}
+	CAutoArray<CSimpleStringA> arrSafeLoad;
+	arrSafeLoad.Init(64);
+	arrSafeLoad = csSafeLoadList.Split('|');
+	for (int i = 0; i < arrSafeLoad.GetCount(); ++i)
+	{
+		CAutoArray<CSimpleStringA> arrEntity;
+		arrEntity.Init(2);
+		arrEntity = arrSafeLoad[i].Split('=');
+		if (arrEntity.GetCount() < 2)
+			break;
+		if (arrEntity[0].Compare("VtmLoader", true) == 0 || arrEntity[0].Compare("Chromium", true) == 0
+			|| arrEntity[0].Compare("GuiConsole", true) == 0)
+			continue;
+		//去重,防止前面已经加载了
+		if (find(m_vCoreBoot.begin(), m_vCoreBoot.end(), arrEntity[0].GetData()) != m_vCoreBoot.end())
+			continue;
+		m_vSafeLoad.push_back(arrEntity[0].GetData());
+		if (arrEntity[1].Compare("1") == 0)
+			m_safeLoadOpt[arrEntity[0]].loadOpt = LOADOPT_ASYNC_VERIFY;
+		else if (arrEntity[1].Compare("2") == 0)
+			m_safeLoadOpt[arrEntity[0]].loadOpt = LOADOPT_SYNC_VERIFY;
+		else
+			m_safeLoadOpt[arrEntity[0]].loadOpt = LOADOPT_IGNORE;
+		m_safeLoadOpt[arrEntity[0].GetData()].eResult = LOADING_INIT;
+		//m_safeLoadOpt[arrEntity[0].GetData()].initSn = slNum;
+		//slNum++;
+	}
+	CAutoArray<CSimpleStringA> arrOperating;
+	arrOperating.Init(64);
+	arrOperating = csOperatingList.Split('|');
+	for (int i = 0; i < arrOperating.GetCount(); ++i)
+	{
+		CAutoArray<CSimpleStringA> arrEntity;
+		arrEntity.Init(2);
+		arrEntity = arrOperating[i].Split('=');
+		if (arrEntity.GetCount() < 2)
+			break;
+		if (arrEntity[0].Compare("VtmLoader", true) == 0 || arrEntity[0].Compare("Chromium", true) == 0
+			|| arrEntity[0].Compare("GuiConsole", true) == 0)
+			continue;
+		//去重,防止前面已经加载了
+		if (find(m_vCoreBoot.begin(), m_vCoreBoot.end(), arrEntity[0].GetData()) != m_vCoreBoot.end()
+			|| find(m_vSafeLoad.begin(), m_vSafeLoad.end(), arrEntity[0].GetData()) != m_vSafeLoad.end())
+			continue;
+		m_vOperating.push_back(arrEntity[0].GetData());
+		if (arrEntity[1].Compare("1") == 0)
+			m_operatingOpt[arrEntity[0]].loadOpt = LOADOPT_ASYNC_VERIFY;
+		else if (arrEntity[1].Compare("2") == 0)
+			m_operatingOpt[arrEntity[0]].loadOpt = LOADOPT_SYNC_VERIFY;
+		else
+			m_operatingOpt[arrEntity[0]].loadOpt = LOADOPT_IGNORE;
+		m_operatingOpt[arrEntity[0].GetData()].eResult = LOADING_INIT;
+		//m_operatingOpt[arrEntity[0].GetData()].initSn = opNum;
+		//opNum++;
+	}
+	return 0;
+}
+int CVtmLoaderFSM::CheckLoadResult(LoadStage eStage)
+{
+	int ret = 0;
+	CSimpleStringA csLogCode = "QLR040210F14";
+	map<CSimpleStringA, EntityLoadInfo>::iterator it;
+	if (eStage == LOADSTAGE_COREBOOT)
+		it = m_coreBootOpt.begin();
+	else if (eStage == LOADSTAGE_SAFELOAD)
+	{
+		it = m_safeLoadOpt.begin();
+		csLogCode = "QLR040210F15";
+	}
+	else
+	{
+		it = m_operatingOpt.begin();
+		csLogCode = "QLR040210F16";
+	}
+	while (1)
+	{
+		switch (it->second.loadOpt)
+		{
+		case LOADOPT_IGNORE:
+			if (it->second.eResult == LOADING_INIT)
+				return 1;
+			break;
+		case LOADOPT_ASYNC_VERIFY:
+		case LOADOPT_SYNC_VERIFY:
+		default:
+			if (it->second.eResult == LOADING_INIT)
+				return 3;
+			else if (it->second.eResult != LOADING_SUCCEED)
+			{
+				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(csLogCode).setResultCode("RTA1F04")("%s start failed", m_csErrEntity);
+				m_csErrEntity = m_csErrEntity + "|" + it->first;
+				ret = 2;
+			}
+			break;
+		}
+		it++;
+		if (eStage == LOADSTAGE_COREBOOT && it == m_coreBootOpt.end())
+			break;
+		else if (eStage == LOADSTAGE_SAFELOAD && it == m_safeLoadOpt.end())
+			break;
+		else if (eStage == LOADSTAGE_OPERATING && it == m_operatingOpt.end())
+			break;
+	}
+	return ret;
+}
+ErrorCodeEnum CVtmLoaderFSM::AsyncStartEntity(const char* entity_name, const char* cmdline, void* pData)
+{
+	CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
+	ErrorCodeEnum errCode;
+	CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
+	if (pFuncPrivilege != NULL) {
+		CSmartPointer<IAsynWaitSp> spWait;
+		errCode = pFuncPrivilege->StartEntity(entity_name, cmdline, spWait);
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("AsyncStartEntity")("start entity %s", entity_name);
+		if (errCode == Error_Succeed) {
+			callback_entry* entry = new callback_entry();
+			entry->pRawData = pData;
+			entry->EntityName = entity_name;
+			entry->ErrorResult = Error_Unexpect;
+			entry->op = OP_START_ENTITY;
+			if (spWait != NULL)
+				spWait->SetCallback(this, entry);
+		}
+		return errCode;
+	}
+	else {
+		return Error_NoPrivilege;
+	}
+}
+void CVtmLoaderFSM::OnAnswer(CSmartPointer<IAsynWaitSp> pAsynWaitSp)
+{
+	CSmartPointer<ICallbackListener> spCallback;
+	CSmartPointer<IReleasable> pData;
+	pAsynWaitSp->GetCallback(spCallback, pData);
+	callback_entry* entry = dynamic_cast<callback_entry*>((IReleasable*)(pData.GetRawPointer()));
+	entry->ErrorResult = pAsynWaitSp->AsyncGetAnswer();
+	callback_entry* new_entry = new callback_entry();
+
+	new_entry->EntityName = entry->EntityName;
+	new_entry->ErrorResult = entry->ErrorResult;
+	new_entry->op = entry->op;
+	new_entry->state = entry->state;
+
+	map<CSimpleStringA, EntityLoadInfo>::iterator it;
+	int ret;
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("OnAnswer")("stage %d,%s,result %d", m_eStage, (LPCSTR)new_entry->EntityName, new_entry->ErrorResult);
+	switch (m_eStage)
+	{
+	case LOADSTAGE_COREBOOT:
+		it = m_coreBootOpt.find(new_entry->EntityName);
+		if (it != m_coreBootOpt.end())
+		{
+			if (new_entry->ErrorResult == Error_Succeed)
+				it->second.eResult = LOADING_SUCCEED;
+			else if (new_entry->ErrorResult == Error_TimeOut)
+				it->second.eResult = LOADING_TIMEOUT;
+			else
+				it->second.eResult = LOADING_FAILED;
+			if (it->second.eResult != Error_Succeed)
+			{
+				char tmp[64] = { 0 };
+				sprintf(tmp, "实体 %s 启动失败-----", it->first.GetData());
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("OnAnswer")("启动失败:%s -----", tmp);
+			}
+			ret = CheckLoadResult(LOADSTAGE_COREBOOT);
+			if (ret == 0 || ret == 2)
+			{
+				FSMEvent* e = new FSMEvent(USER_EVT_COREBOOT_FINISHED);
+				e->param1 = ret;
+				PostEventFIFO(e);
+			}
+		}
+		break;
+	case LOADSTAGE_SAFELOAD:
+		it = m_safeLoadOpt.find(new_entry->EntityName);
+		if (it != m_safeLoadOpt.end())
+		{
+			if (new_entry->ErrorResult == Error_Succeed)
+				it->second.eResult = LOADING_SUCCEED;
+			else if (new_entry->ErrorResult == Error_TimeOut)
+				it->second.eResult = LOADING_TIMEOUT;
+			else
+				it->second.eResult = LOADING_FAILED;
+			ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("OnAnswer")("safeload answer %d", ret);
+			if (ret == 0 || ret == 2)
+			{
+				FSMEvent* e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
+				e->param1 = ret;
+				PostEventFIFO(e);
+			}
+		}
+		else {
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("OnAnswer")("cannot find %s", (LPCTSTR)new_entry->EntityName);
+		}
+
+		break;
+	case LOADSTAGE_OPERATING:
+		it = m_operatingOpt.find(new_entry->EntityName);
+		if (it != m_operatingOpt.end())
+		{
+			if (new_entry->ErrorResult == Error_Succeed)
+				it->second.eResult = LOADING_SUCCEED;
+			else if (new_entry->ErrorResult == Error_TimeOut)
+				it->second.eResult = LOADING_TIMEOUT;
+			else
+				it->second.eResult = LOADING_FAILED;
+			ret = CheckLoadResult(LOADSTAGE_OPERATING);
+			if (ret == 0 || ret == 2)
+			{
+				FSMEvent* e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
+				e->param1 = ret;
+				PostEventFIFO(e);
+			}
+		}
+		break;
+	default:
+		break;
+	}
+}
+void CVtmLoaderFSM::NoticeEntityLoad(int evtCode)
+{
+	HealthManagerService_ClientBase* pHMClient = new HealthManagerService_ClientBase(m_pEntity);
+	int count = 0;
+	bool bConnected = false;
+	do
+	{
+		ErrorCodeEnum eErrConn = Error_Unexpect;
+		ErrorCodeEnum eErrCall = Error_Unexpect;
+		if (!bConnected)
+		{
+			eErrConn = pHMClient->Connect();
+			if (eErrConn == Error_Succeed)
+				bConnected = true;
+		}
+		
+		if (bConnected)
+		{
+			HealthManagerService_DoEvent_Req req;
+			HealthManagerService_DoEvent_Ans ans;
+			req.code = evtCode;
+			eErrCall = pHMClient->DoEvent(req, ans, 5000);
+			if (eErrCall == Error_Succeed)
+				break;
+		}
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Notice HealthManager failed,eErrConn:%d,eErrCall:%d", eErrConn, eErrCall);
+		Sleep(2000);
+		count++;
+	} while (count < 100);
+}
+bool CVtmLoaderFSM::DetectHttpActive()
+{
+	memset(m_httpCheckResult, 0, sizeof(m_httpCheckResult));
+
+	CSmartPointer<IConfigInfo> pConfigRun;
+	CSimpleStringA strSettingAddr(true),strAccessAuthAddr(true);
+	CSimpleStringA errMsg;
+
+	
+	ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, pConfigRun);
+	if (eErr == Error_Succeed)
+	{
+		int iTmp = 0;
+		if (pConfigRun->ReadConfigValueInt("Common", "CanIgnoreAddrDetect", iTmp) == Error_Succeed && iTmp > 0)
+			m_iCanIgnoreAddrDetect = iTmp;
+		iTmp = 0;
+		if (pConfigRun->ReadConfigValueInt("Common", "MaxAddrDetectTime", iTmp) == Error_Succeed && iTmp > 0)
+			m_ullMaxAddrDetectTime = iTmp;
+		iTmp = 0;
+		if (pConfigRun->ReadConfigValueInt("Common", "AddrDetectInterval", iTmp) == Error_Succeed && iTmp > 0)
+			m_iDetectInterval = iTmp;
+	}
+
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("eErr:%d, iDetectInterval:%d", eErr, m_iDetectInterval);
+
+	//oiltmp 由于行外pad即将下线,暂时不考虑行外地址探测
+	CSimpleStringA csTmpAddr(true);
+	//集中配置探测地址
+	pConfigRun->ReadConfigValue("Common", "SettingDetectAddr", csTmpAddr);
+	if (csTmpAddr.IsNullOrEmpty())
+	{
+#ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
+		strSettingAddr = "https://accessproxy-service.paasst.cmbchina.cn/centerconfig/rvc/detect";
+#elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/
+		strSettingAddr = "https://accessproxy-service.paas.cmbchina.cn/centerconfig/rvc/detect";
+#elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
+		strSettingAddr = "https://accessproxy-service.paasuat.cmbchina.cn/centerconfig/rvc/detect";
+#elif defined(DEVOPS_ON_DEV)/*DevOps流水线编译,Dev环境*/
+		strSettingAddr = "https://accessproxy-service.paas.cmbchina.cn/centerconfig/rvc/detect";
+#else/*本地编译等非DevOps环境编译的版本*/
+		strSettingAddr = "https://accessproxy-service.paasst.cmbchina.cn/centerconfig/rvc/detect";
+#endif
+	}
+	else
+		strSettingAddr = csTmpAddr;
+	csTmpAddr = "";
+	pConfigRun->ReadConfigValue("Common", "AccessAuthDetectAddr", strAccessAuthAddr);
+	//准入探测地址
+	if (strAccessAuthAddr.IsNullOrEmpty())
+	{
+#ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
+		strAccessAuthAddr = "https://terminalaccess.paasst.cmbchina.cn/tsas/detect";
+#elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/
+		strAccessAuthAddr = "https://accessproxy-service.paas.cmbchina.cn/tsaccess/tsas/detect";
+#elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
+		strAccessAuthAddr = "https://terminalaccess.paasuat.cmbchina.cn/tsas/detect";
+#elif defined(DEVOPS_ON_DEV)/*DevOps流水线编译,Dev环境*/
+		strAccessAuthAddr = "https://terminalaccess.paas.cmbchina.cn/tsas/detect";
+#else/*本地编译等非DevOps环境编译的版本*/
+		strAccessAuthAddr = "https://terminalaccess.paasst.cmbchina.cn/tsas/detect";
+#endif
+}
+	else
+		strAccessAuthAddr = csTmpAddr;
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("CenterSetting addr:%s, strAccessAuthAddr:%s", strSettingAddr.GetData(), strAccessAuthAddr.GetData());
+
+	HttpConnCheckTask* pCSTask = new HttpConnCheckTask(this, strSettingAddr, HttpAddr_CenterSetting);
+	GetEntityBase()->GetFunction()->PostThreadPoolTask(pCSTask);
+
+	HttpConnCheckTask* pAATask = new HttpConnCheckTask(this, strAccessAuthAddr, HttpAddr_AccessAuth);
+	GetEntityBase()->GetFunction()->PostThreadPoolTask(pAATask);
+	ULLINT beginTick, endTick;
+	beginTick = SP::Module::Comm::RVCGetTickCount();
+	do {
+		Sleep(2000);
+		if (m_httpCheckResult[HttpAddr_CenterSetting] == HttpConnResult_OK || m_httpCheckResult[HttpAddr_AccessAuth] == HttpConnResult_OK)
+			return true;
+		else
+		{
+			endTick = SP::Module::Comm::RVCGetTickCount();
+		}
+	} while (endTick - beginTick < m_ullMaxAddrDetectTime);
+
+	if (m_iCanIgnoreAddrDetect > 0)
+		return true;
+	else
+		return false;
+}
+bool CVtmLoaderFSM::IsRootINIExist(CSimpleStringA& path)
+{
+	CSimpleStringA csHardwareCfg(true);
+	ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetPath("HardwareCfg", csHardwareCfg);
+	if (eErr != Error_Succeed)
+	{
+		path = CSimpleStringA::Format("GetPath of HardwareCfg failed(%d)", eErr);
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get path of Run failed:%s", SpStrError(eErr));
+		return false;
+	}
+	path = csHardwareCfg + SPLIT_SLASH_STR + "root.ini";
+#if defined(RVC_OS_WIN)
+	if (_access(path.GetData(), 0) == 0) {
+#else
+	if (access(path.GetData(), F_OK) == 0) {
+#endif
+		return true;
+	}
+	else
+	{
+		DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("root.ini(%s) is not exist.", path.GetData());
+		return false;
+	}
+}
+bool CVtmLoaderFSM::GetConfig()
+{
+	//拉取配置前先检查root.ini文件
+	CSimpleStringA csTmpRootIni("");
+	if (!IsRootINIExist(csTmpRootIni))
+	{
+		LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("root.ini不存在,请检查(%s)", csTmpRootIni.GetData()).GetData());
+		return false;
+	}
+	ErrorCodeEnum eErr = Error_Succeed;
+#ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
+	CSimpleString channelId = "5fdd82e3b90a4de69f9da4738e5f1216";
+	CSimpleString tokenSecret = "eca829c78067c686561bd844129321c8a78af3";
+	CSimpleString CommonLaunchUrl = "https://rvc-gateway.paasst.cmbchina.cn|https://rvc-gateway-out.paasst.cmbchina.cn";
+	CSimpleString CenterConfigTotal = "https://accessproxy-service.paasst.cmbchina.cn/centerconfig";
+
+#elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
+	CSimpleString channelId = "7eb748cb71744c87b5c126e05af8cce7";
+	CSimpleString tokenSecret = "eca529c78967c640561bd844229391c8a78af3";
+	CSimpleString CommonLaunchUrl = "https://rvc-gateway.paasuat.cmbchina.cn|https://rvc-gateway-out.paasuat.cmbchina.cn";
+	CSimpleString CenterConfigTotal = "https://accessproxy-service.paasuat.cmbchina.cn/centerconfig|https://accessproxy-service.paasuat.cmbchina.cn/centerconfigdmz";
+#elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/
+	CSimpleString channelId = "572f7577fa9f425c8475a8d77db4ae31";
+	CSimpleString tokenSecret = "eca129c78767c670561bd844629361c8a78af3";
+	CSimpleString CommonLaunchUrl = "https://rvc-gateway.paas.cmbchina.cn|https://vtmunify.paas.cmbchina.com/gateway";
+	CSimpleString CenterConfigTotal = "https://accessproxy-service.paas.cmbchina.cn/centerconfig|https://vtmunify.paas.cmbchina.com/centerconfig";
+#else/*本地编译等非DevOps环境编译的版本*/
+	CSimpleString channelId = "5fdd82e3b90a4de69f9da4738e5f1216";
+	CSimpleString tokenSecret = "eca829c78067c686561bd844129321c8a78af3";
+	CSimpleString CommonLaunchUrl = "https://rvc-gateway.paasst.cmbchina.cn";
+	CSimpleString CenterConfigTotal = "https://accessproxy-service.paasst.cmbchina.cn/centerconfig";
+#endif
+	LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, "开始拉取配置");
+	if (Error_Succeed != (eErr = GetEntityBase()->GetFunction()->GetPrivilegeFunction()->InitCfgUrl(channelId, tokenSecret, CommonLaunchUrl, CenterConfigTotal)))
+	{
+		LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("拉取配置,初始化配置地址失败:0x%x(%s)", eErr, SpStrError(eErr)).GetData());
+		DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210F13").setResultCode("RTA1F01")("Get config,InitCfgUrl failed.");
+		LogEvent(Severity_High, Event_VtmLoader_GetConfig_Fail, "拉取配置,初始化配置地址失败");
+		return false;
+	}
+	else
+	{
+		CSimpleString oldToken, newToken;
+		if (Error_Succeed != (eErr = GetEntityBase()->GetFunction()->GetPrivilegeFunction()->TryUpdateToken(oldToken, newToken)))
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210F13").setResultCode("RTA1F02")("Get config, TryUpdateToken failed:0x%x", eErr);
+		//if token update failed,we can also update cfg suc
+		if (Error_Succeed != (eErr = GetEntityBase()->GetFunction()->GetPrivilegeFunction()->TryUpdateCfg()))
+		{
+			LogWarn(Severity_High, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("拉取配置失败:0x%x(%s)", eErr, SpStrError(eErr)).GetData());
+			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR040210F13").setResultCode("RTA1F03")("Get config, TryUpdateCfg failed:0x%x", eErr);
+			LogEvent(Severity_High, Event_VtmLoader_GetConfig_Fail, "拉取配置失败");
+			return false;
+		}
+	}
+
+
+
+
+
+	//all cfg is ready, then init the entity
+
+	eErr = SubscribeEntitysEvents();
+	if (eErr != Error_Succeed)
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("subscribe event fail, 0x%x", eErr);
+	else
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("subscribe event succeed");
+
+	CSmartPointer<IConfigInfo> pConfig;
+	CSimpleString t_endpoint, t_topicSys, t_topicUser, t_topicBeidou, t_bussSys, t_bussUser;
+	bool readSender = false;
+
+	eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, pConfig);
+	if (eErr == Error_Succeed && Error_Succeed == pConfig->ReadConfigValue("Common", "SendEndpoint", t_endpoint)
+		&& Error_Succeed == pConfig->ReadConfigValue("Common", "SendSys", t_topicSys)
+		&& Error_Succeed == pConfig->ReadConfigValue("Common", "SendUser", t_topicUser)
+		&& Error_Succeed == pConfig->ReadConfigValue("Common", "SendBeidou", t_topicBeidou)
+		&& Error_Succeed == pConfig->ReadConfigValue("Common", "BusinessSys", t_bussSys)
+		&& Error_Succeed == pConfig->ReadConfigValue("Common", "BusinessUser", t_bussUser)
+		&& 0 != t_topicSys.GetLength()
+		&& 0 != t_topicUser.GetLength()
+		&& 0 != t_topicBeidou.GetLength()
+		&& 0 != t_bussSys.GetLength()
+		&& 0 != t_bussUser.GetLength())
+	{
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("endpoint:%s, topicSys:%s, topicUser:%s, topicBeidou:%s, bussSys:%s, bussUser:%s", t_endpoint.GetData(), t_topicSys.GetData(), t_topicUser.GetData(), t_topicBeidou.GetData(), t_bussSys.GetData(), t_bussUser.GetData());
+
+		if (0 != t_endpoint.GetLength())
+		{
+			GetEntityBase()->GetFunction()->GetPrivilegeFunction()->BeginLogSend(t_endpoint.GetData(), t_topicSys.GetData(), t_topicUser.GetData(), t_topicBeidou.GetData(), t_bussSys.GetData(), t_bussUser.GetData());
+		}
+		else
+			DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("endpoint is empty, do not begin send log");
+	}
+	else
+	{
+		const char* default_endpoint = "https://kafkaproxy.paas.cmbchina.cn/api/kafka/log/send";
+		const char* topicSys = "LR18_23_VTMTerminalLogService_L_sys_VTMTerminalSysLog_SRC_SZ";
+		const char* topicUser = "LR18_23_VTMTerminalLogService_L_biz_VTMTerminalUserLog_SRC_SZ";
+		const char* topicBeidou = "LR18_23_VTMTerminalLogService_L_trace_VTMTerminalTraceLog_SRC_SZ";
+		const char* topicBussSys = "LR18_23_VTMTerminalLogService_L_sys_VTMBusiness_SRC_SZ";
+		const char* topicBussUser = "LR18_23_VTMTerminalLogService_L_biz_VTMBusiness_SRC_SZ";
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("read endpoint and topic err, need check centersetting, use default %s-%s-%s-%s-%s-%s", default_endpoint, topicSys, topicUser, topicBeidou, topicBussSys, topicBussUser);
+		GetEntityBase()->GetFunction()->GetPrivilegeFunction()->BeginLogSend(default_endpoint, topicSys, topicUser, topicBeidou, topicBussSys, topicBussUser);
+	}
+
+	GetEntityBase()->GetFunction()->GetSystemStaticInfo(m_sysInfo);
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("terminalNo:%s, MachineType:%s, MachineVersion:%s, Site:%s, Screen:%d, EnrolGPS:%f.%f, EnrolAddr:%s"
+		, m_sysInfo.strTerminalID.GetData(), m_sysInfo.strMachineType.GetData(), m_sysInfo.MachineVersion.ToString().GetData()
+		, m_sysInfo.strSite.GetData(), m_sysInfo.eScreen, m_sysInfo.EnrolGPS.GetLatitude(), m_sysInfo.EnrolGPS.GetLongitude(), m_sysInfo.strEnrolAddr);
+
+	int tmpSec = 0;
+	if (Error_Succeed == pConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "refreshTokenWaitSec", tmpSec) && tmpSec > 0)
+		m_refreshWaitSec = tmpSec;
+
+	int t_sec = 0;
+	pConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "UploadLogWaitSec", t_sec);
+	if (t_sec > 0)
+		m_uploadLogInfo_waitSec = t_sec;
+
+	CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)& checkUrlActive, this, 0, NULL));
+	CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)& tokenUpdate, this, 0, NULL));
+
+
+	//通知Chromium实体
+	LogEvent(Severity_High, Event_VtmLoader_GetConfig_Suc, "Get config succeed.");
+	DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR040210F13")("Get config succeed.");
+	return true;
+}
+ErrorCodeEnum CVtmLoaderFSM::SubscribeEntitysEvents()
+{
+	//want to do what?
+
+	auto rc = Error_Succeed;
+	//auto pFunc = GetEntityBase()->GetFunction();
+	//auto rc = pFunc->SubscribeLog(m_SubLogID2, this, Log_Event, Severity_None, Error_IgnoreAll, -1, "Gpio");
+
+	//// 准入成功事件
+	//rc = pFunc->SubscribeLog(m_SubLogID3, this, Log_Event, Severity_None, Error_IgnoreAll, 0x50200001, "AccessAuthorization");
+
+	// 业务首页加载事件
+	//rc = pFunc->SubscribeLog(m_SubLogID3, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_HEALTH_FIRST_ENTER_MAINPADE, "HealthManager");
+
+	return rc;
+}
+int CVtmLoaderFSM::HttpConnCheck(CSimpleStringA csHttAddr, HttpAddrType eType)
+{
+	DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to HttpConnCheck");
+	ULLINT beginTick = SP::Module::Comm::RVCGetTickCount();
+	int httpcheckCount = 1;
+	bool bCheckOK = false;
+	while(true){
+#if defined(RVC_OS_LINUX)
+		string msg;
+		int curFlag = HttpProbe(csHttAddr.GetData(), msg, 5);
+		if (curFlag > 0 && curFlag < 400)
+			bCheckOK = true;
+#else
+		bCheckOK = checkHttpActive(csHttAddr.GetData());
+#endif
+		if (!bCheckOK)
+		{
+			LogWarn(Severity_Middle, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("尝试连接总行服务失败(%s),%d 秒后自动重试(第%d次重试)。请确认终端到总行服务网络是否正常", csHttAddr.GetData(), m_iDetectInterval/1000, httpcheckCount).GetData());
+			m_httpCheckResult[eType] = HttpConnResult_Failed;
+			Sleep(m_iDetectInterval);
+			httpcheckCount++;
+			CAutoArray<NetworkAdapterItem> netList;
+			if (SP::Module::Net::GetINETMacAddresses(netList) == Error_Succeed)
+			{
+				string tmpDns;
+				GetDns(tmpDns);
+				for (int i = 0; i < netList.GetCount(); i++) {
+					LogWarn(Severity_Middle, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("(%d)interface:%s; ip:%s; mac:%s; %s", i, netList[i].description.c_str()
+						, netList[i].ip.c_str(), netList[i].mac.c_str(), tmpDns.c_str()).GetData());
+				}
+			}
+		}
+		else
+		{
+			m_httpCheckResult[eType] = HttpConnResult_OK;
+			if ((SP::Module::Comm::RVCGetTickCount() - beginTick) > 3000)
+			{
+				LogWarn(Severity_Low, Error_Unexpect, VtmLoader_BootInfoPrint, CSimpleStringA::Format("第(%d)次尝试连接总行服务成功(%s),但是网络偏慢,连接花了(%d)秒,请检查网络!"
+					, httpcheckCount, csHttAddr.GetData(), (SP::Module::Comm::RVCGetTickCount() - beginTick)/1000).GetData());
+			}
+			LogWarn(Severity_Low, Error_Succeed, VtmLoader_BootInfoPrint, CSimpleStringA::Format("尝试连接总行服务成功(%s)", csHttAddr.GetData()).GetData());
+			return 0;
+		}
+	} 
+
+	return -1;
+}
+void CVtmLoaderFSM::GetDns(string& dns)
+{
+	dns = "";
+#if defined(RVC_OS_LINUX)
+
+	FILE* stream;
+	char* line = NULL;
+	size_t len = 0;
+	ssize_t read;
+
+	stream = popen("cat /etc/resolv.conf", "r");
+	string tmpStr;
+	while ((read = getline(&line, &len, stream)) != -1)
+	{
+		tmpStr = line;
+		int pos = tmpStr.find("nameserver");
+		if (pos != string::npos)
+		{
+			tmpStr = tmpStr.replace(pos, strlen("nameserver"), "dns");
+			dns += tmpStr + ";";
+		}
+	}
+	int rnPos = dns.find("\n");
+	while (rnPos != string::npos)
+	{
+		dns.replace(rnPos, 1, " ");
+		rnPos = dns.find("\n");
+	}
+#else
+#endif
+	return;
+}

+ 197 - 0
Module/mod_vtmloader/VtmLoaderFSM.h

@@ -0,0 +1,197 @@
+#pragma once
+#include "SpBase.h"
+#include "SpFSM.h"
+//#include "IHttpFunc.h"
+#include "CommEntityUtil.hpp"
+enum EvtType
+{
+	Event_NetworkCheck_Passed = EVT_USER + 1,		// 网络检查通过,包括网卡及到总行服务的连通性
+	USER_EVT_COREBOOT_FINISHED,
+	USER_EVT_SAFELOAD_FINISHED,
+	USER_EVT_SAFELOAD_EXMINE_FINISHED,
+	USER_EVT_OPERATING_FINISHED,
+	USER_EVT_ACCESSAUTH_FINISHED,
+};
+
+enum LoadStage
+{
+	LOADSTAGE_UNKNOWN,
+	LOADSTAGE_COREBOOT,
+	LOADSTAGE_SAFELOAD,
+	LOADSTAGE_OPERATING
+};
+enum EntityLoadFaultStage
+{
+	ENTITYLOAD_SAFELOADFAULT,
+	ENTITYLOAD_OPERATINGFAULT,
+};
+enum EntityOption
+{
+	HEARTBEAT,
+	SELFCHECKER
+};
+enum LoadingOpt
+{
+	LOADOPT_IGNORE,
+	LOADOPT_ASYNC_VERIFY,
+	LOADOPT_SYNC_VERIFY
+};
+enum LoadingResult
+{
+	LOADING_SUCCEED,
+	LOADING_INIT,
+	LOADING_FAILED,
+	LOADING_TIMEOUT,
+};
+enum HttpAddrType
+{
+	HttpAddr_CenterSetting,
+	HttpAddr_AccessAuth
+};
+enum HttpConnResult
+{
+	HttpConnResult_OK = 1,
+	HttpConnResult_Failed
+};
+struct EntityLoadInfo
+{
+	int initSn;
+	int loadOpt;
+	LoadingResult eResult;
+};
+struct EntityLoadFault
+{
+	CSimpleStringA name;
+	int count;
+};
+class CVtmLoaderEntity;
+
+class CVtmLoaderFSM : public FSMImpl<CVtmLoaderFSM>, public IFSMStateHooker, public ICallbackListener
+{
+public:
+
+	CVtmLoaderFSM();
+	~CVtmLoaderFSM();
+
+private:
+	virtual ErrorCodeEnum OnInit();
+	virtual ErrorCodeEnum OnExit();
+	virtual void OnStateTrans(int iSrcState, int iDstState);	
+
+	enum{s0, s1, s2, s3, s4, s5};
+	
+	BEGIN_FSM_STATE(CVtmLoaderFSM)
+		FSM_STATE_ENTRY(s0, "None",s0_on_entry,s0_on_exit,s0_on_event)
+		FSM_STATE_ENTRY(s1, "CoreBoot", s1_on_entry, s1_on_exit, s1_on_event)
+		FSM_STATE_ENTRY(s2, "SafeLoad", s2_on_entry, s2_on_exit, s2_on_event)
+		FSM_STATE_ENTRY(s3, "Loading", s3_on_entry, s3_on_exit, s3_on_event)
+		FSM_STATE_ENTRY(s4, "Operating", s4_on_entry, s4_on_exit, s4_on_event)
+		FSM_STATE_ENTRY(s5, "Fault", s5_on_entry, s5_on_exit, s5_on_event)
+	END_FSM_STATE()
+
+	BEGIN_FSM_RULE(CVtmLoaderFSM,s0)
+		FSM_RULE_ENTRY(s0, s1, Event_NetworkCheck_Passed,0)
+		FSM_RULE_ENTRY(s1, s2, USER_EVT_COREBOOT_FINISHED, 0)
+		FSM_RULE_ENTRY(s1, s2, USER_EVT_COREBOOT_FINISHED, 1)
+		FSM_RULE_ENTRY(s1, s5, USER_EVT_COREBOOT_FINISHED, 2)
+		FSM_RULE_ENTRY(s2, s3, USER_EVT_SAFELOAD_FINISHED, 0)
+		FSM_RULE_ENTRY(s2, s5, USER_EVT_SAFELOAD_FINISHED, 2)
+		FSM_RULE_ENTRY(s3, s4, USER_EVT_OPERATING_FINISHED, 0)
+		FSM_RULE_ENTRY(s3, s5, USER_EVT_OPERATING_FINISHED, 2)
+		FSM_RULE_ENTRY(s4, s5, USER_EVT_ACCESSAUTH_FINISHED, 1)
+	END_FSM_RULE()
+public:
+	int m_refreshWaitSec, m_uploadLogInfo_waitSec;
+	int NetWorkCheckAndGetSetting();
+	bool GetConfig();
+	bool DetectHttpActive();
+	bool refreshToken();
+	int EntityLoad();
+	void NoticeEntityLoad(int evtCode);
+	/*True: Legal; False: illegal*/
+	BOOL DetectNetworkLegality(CSimpleStringA& strInfo);
+	int CheckLoadResult(LoadStage eStage);
+	int HttpConnCheck(CSimpleStringA csHttAddr, HttpAddrType eType);
+	
+private:
+	void s0_on_entry();
+	void s0_on_exit();
+	unsigned int s0_on_event(FSMEvent* event);
+
+	void s1_on_entry();
+	void s1_on_exit();
+	unsigned int s1_on_event(FSMEvent* event);
+		
+	void s2_on_entry();
+	void s2_on_exit();
+	unsigned int s2_on_event(FSMEvent* event);
+
+	void s3_on_entry();
+	void s3_on_exit();
+	unsigned int s3_on_event(FSMEvent* event);
+
+	void s4_on_entry();
+	void s4_on_exit();
+	unsigned int s4_on_event(FSMEvent* event);
+
+	void s5_on_entry();
+	void s5_on_exit();
+	unsigned int s5_on_event(FSMEvent* event);
+
+	ErrorCodeEnum AsyncStartEntity(const char* entity_name, const char* cmdline, void* pData);
+	void OnAnswer(CSmartPointer<IAsynWaitSp> pAsynWaitSp);
+	bool IsRootINIExist(CSimpleStringA& path);
+	ErrorCodeEnum SubscribeEntitysEvents();
+	void ShowEntityBootFailedAtFront(LPCTSTR lpcszEntityName, ErrorCodeEnum bootFailedResult, bool isBlock = true);
+	void GetDns(string& dns);
+
+private:
+	CSystemStaticInfo m_sysInfo;
+	CSimpleStringA m_strNetworkCheckUrl, m_csErrEntity, m_defaultSystemId;
+	int m_sleepEnterOpMS, m_iCanIgnoreAddrDetect, m_iDetectInterval;
+	ULLINT m_ullMaxAddrDetectTime, m_ullNetCardCost, m_ullNetDetectCost, m_ullGetConfigCost;
+	int m_httpCheckResult[2];
+	//DNS Settings
+	CSimpleStringA m_strDefaultDNS;
+	CSimpleStringA m_strBackupDNS;
+	LoadStage m_eStage;
+	vector<CSimpleStringA> m_vCoreBoot, m_vSafeLoad, m_vOperating;
+	map<CSimpleStringA, EntityLoadInfo> m_coreBootOpt;
+	map<CSimpleStringA, EntityLoadInfo> m_safeLoadOpt;
+	map<CSimpleStringA, EntityLoadInfo> m_operatingOpt;
+};
+
+struct NetWorkCheckAndGetSettingTask : public ITaskSp
+{
+	CVtmLoaderFSM* fsm;
+	NetWorkCheckAndGetSettingTask(CVtmLoaderFSM* f) : fsm(f) {}
+	void Process()
+	{
+		FSMEvent* pEvt = new FSMEvent(Event_NetworkCheck_Passed);
+		pEvt->param1 = fsm->NetWorkCheckAndGetSetting();
+		fsm->PostEventFIFO(pEvt);
+	}
+};
+
+struct NoticeEntityLoadTask : public ITaskSp
+{
+	CVtmLoaderFSM* fsm;
+	int evtCode;
+	NoticeEntityLoadTask(CVtmLoaderFSM* f,int evtCode) : fsm(f),evtCode(evtCode) {}
+	void Process()
+	{
+		fsm->NoticeEntityLoad(evtCode);
+	}
+};
+
+struct HttpConnCheckTask : public ITaskSp
+{
+	CVtmLoaderFSM* fsm;
+	CSimpleStringA csHttAddr;
+	HttpAddrType eType;
+	HttpConnCheckTask(CVtmLoaderFSM* f,CSimpleStringA addr, HttpAddrType eType) : fsm(f),csHttAddr(addr),eType(eType) {}
+	void Process()
+	{
+		fsm->HttpConnCheck(csHttAddr, eType);
+	}
+};

+ 8 - 0
Module/mod_vtmloader/VtmLoader_UserCode.h

@@ -0,0 +1,8 @@
+const int VtmLoader_UserCode_NetCard_OK = 0x10f00201;
+const int VtmLoader_UserCode_NetCard_UnAvaible = 0x10f00202;
+const int WARN_SendEndpoint_URL_ERR = 0x10f00203;
+const int WARN_SendEndpoint_LOG_INFO = 0x10f00204;
+const int VtmLoader_BootInfoPrint = 0x10f00205;
+const int VtmLoader_NetCard_Cost = 0x10f00206;
+const int VtmLoader_NetworkDetect_Cost = 0x10f00207;
+const int VtmLoader_GetConfig_Cost = 0x10f00208;

+ 130 - 0
Module/mod_vtmloader/VtmLoader_client_g.h

@@ -0,0 +1,130 @@
+
+#ifndef __VTMLOADER_CLIENT_G_H
+#define __VTMLOADER_CLIENT_G_H
+
+#pragma once
+
+// This code is generated by spgen tool!
+
+#include "VtmLoader_def_g.h"
+
+namespace VtmLoader {
+class VtmLoaderService_ClientBase : public CClientSessionBase {
+public:
+	explicit VtmLoaderService_ClientBase(CEntityBase *pEntity) : m_pEntityBase(pEntity), m_bSysManaged(false) {}
+
+	VtmLoaderService_ClientBase* operator () (const linkContext &curLink) 
+	{
+		m_context = curLink;
+		return this;
+	}
+
+protected:
+	virtual ~VtmLoaderService_ClientBase()
+	{
+		/// override by user
+	}
+public:
+
+	void OnConnectSucceed()
+	{
+		bSessionClosed = false;
+	}
+	void OnClose(ErrorCodeEnum)
+	{
+		Dbg("session closed.");
+		bSessionClosed = true;
+	}
+	bool QuerySessionClosed()
+	{
+		return bSessionClosed;
+	}
+	ErrorCodeEnum Connect(CSmartPointer<IAsynWaitSp> &spAsyncWait)
+	{
+		CSmartPointer<IEntityFunction> pFunc = m_pEntityBase->GetFunction();
+		ErrorCodeEnum Error = pFunc->ConnectRemoteEntity(this, "VtmLoader", "VtmLoaderService", spAsyncWait);
+		if (Error == Error_Succeed) {
+			m_bSysManaged = true;
+			bSessionClosed = false;
+		}
+		return Error;
+	}
+	ErrorCodeEnum Connect()
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = Connect(spAsyncWait);
+		if (Error == Error_Succeed) {
+			Error = spAsyncWait->WaitAnswer();
+		}
+		return Error;
+	}
+
+	ErrorCodeEnum notice(VtmLoaderService_notice_Req &Req, CSmartPointer<IAsynWaitSp> &spAsyncWait, DWORD dwTimeout)
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		CAutoBuffer Buf = SpObject2Buffer(Req);
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->AsyncRequest(VtmLoaderService_Method_notice, VtmLoaderService_MethodSignature_notice, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum notice(VtmLoaderService_notice_Req &Req, VtmLoaderService_notice_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = notice(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum notice(VtmLoaderService_notice_Req &Req, VtmLoaderService_notice_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = notice(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum notice(VtmLoaderService_notice_Req &Req, VtmLoaderService_notice_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = notice(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			CSimpleString str;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwUserError, str, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+
+
+	bool SafeDelete()
+	{
+		if (!m_bSysManaged) {
+			delete this;
+		}
+		return m_bSysManaged;
+	}
+
+protected:
+	bool m_bSysManaged;
+	CEntityBase *m_pEntityBase;
+	linkContext m_context;
+	bool bSessionClosed;
+};
+
+///////////////////////////
+
+} // namespace VtmLoader
+#endif // __VTMLOADER_CLIENT_G_H

+ 45 - 0
Module/mod_vtmloader/VtmLoader_def_g.h

@@ -0,0 +1,45 @@
+#ifndef __VTMLOADER_DEF_G_H
+#define __VTMLOADER_DEF_G_H
+
+#pragma once
+
+// This code is generated by spgen tool!
+
+#include "SpHelper.h"
+
+namespace VtmLoader {
+//
+// const goes here
+//
+
+#define VtmLoaderService_Method_notice 0
+
+#define VtmLoaderService_MethodSignature_notice -1920069053
+
+struct VtmLoaderService_notice_Req
+{
+	int stage;
+	CSimpleStringA test1;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & stage & test1;
+	}
+
+};
+
+struct VtmLoaderService_notice_Ans
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+
+///////////////////////////
+
+} // namespace VtmLoader
+
+#endif // __VTMLOADER_DEF_G_H

+ 109 - 0
Module/mod_vtmloader/VtmLoader_server_g.h

@@ -0,0 +1,109 @@
+
+#ifndef __VTMLOADER_SERVER_G_H
+#define __VTMLOADER_SERVER_G_H
+
+#pragma once
+
+// This code is generated by spgen tool!
+
+#include "VtmLoader_def_g.h"
+
+namespace VtmLoader {
+class VtmLoaderService_ServerSessionBase : public CServerSessionBase
+{
+public:
+	VtmLoaderService_ServerSessionBase()
+	{
+		/// override by user
+	}
+
+	virtual ~VtmLoaderService_ServerSessionBase()
+	{
+		/// override by user
+	}
+
+	virtual bool IsExclusive() { return false; }
+
+	virtual bool IsSessionOverlap() { return true; }
+
+	virtual ErrorCodeEnum GetMessageAttr(DWORD dwMessageID, DWORD dwSignature, bool &bOverlap)
+	{
+		ErrorCodeEnum Error = Error_Succeed;
+		switch (dwMessageID) {
+		case VtmLoaderService_Method_notice:
+			if (dwSignature == VtmLoaderService_MethodSignature_notice) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		default:
+			Error = Error_MethodNotFound;
+			break;
+		}
+		return Error;
+	}
+
+	int CheckMessageSignature(DWORD dwMessageID, DWORD dwSignature)
+	{
+		ErrorCodeEnum Error = Error_Succeed;
+		switch (dwMessageID) {
+		case VtmLoaderService_Method_notice:
+			if (dwSignature != VtmLoaderService_MethodSignature_notice) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		default:
+			Error = Error_MethodNotFound;
+			break;
+		}
+		return Error;
+	}
+
+	virtual void Handle_notice(SpReqAnsContext<VtmLoaderService_notice_Req, VtmLoaderService_notice_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void OnRequest(CSmartPointer<ITransactionContext> pTransactionContext)
+	{
+		CAutoBuffer Buf;
+		DWORD dwMessageID;
+		DWORD dwMessageSignature;
+		ErrorCodeEnum Error = pTransactionContext->GetReceiveBuffer(dwMessageID, dwMessageSignature, Buf);
+		if (Error == Error_Succeed) {
+#ifdef DEBUG
+			assert(CheckMessageSignature(dwMessageID, dwMessageSignature) == Error_Succeed);
+#else
+			if (CheckMessageSignature(dwMessageID, dwMessageSignature) != Error_Succeed) {
+				pTransactionContext->SendAnswer(Error_MethodSignatureFailed);
+				return;
+			}
+#endif
+			switch (dwMessageID) {
+				case VtmLoaderService_Method_notice:
+					{
+						SpReqAnsContext<VtmLoaderService_notice_Req,VtmLoaderService_notice_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<VtmLoaderService_notice_Req,VtmLoaderService_notice_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						Handle_notice(ctx);
+					}
+					break;
+				default:
+					assert(0);
+					break;
+			}
+			
+		} else {
+			pTransactionContext->SendAnswer(Error);
+		}
+	}
+
+};
+
+
+///////////////////////////
+
+} // namespace VtmLoader
+#endif // __VTMLOADER_SERVER_G_H

+ 53 - 0
Module/mod_vtmloader/mod_vtmloader.cpp

@@ -0,0 +1,53 @@
+#include "stdafx.h"
+#include "mod_vtmloader.h"
+#include "EventCode.h"
+#include "VtmLoader_UserCode.h"
+#include "publicFunExport.h"
+//#pragma comment(lib, "libpublicFun.lib")
+#include "tokenDefine.h"
+#include <SpIni.h>
+
+
+void CVtmLoaderEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext) 
+{
+	m_FSM.Init(this);
+	pTransactionContext->SendAnswer(Error_Succeed) ;		
+}
+
+void CVtmLoaderEntity::OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext) 
+{ 
+	//m_task.Close();
+	m_FSM.PostExitEvent();
+	UnsubscribeEntitysEvents();
+	pTransactionContext->SendAnswer(Error_Succeed); 
+}	
+
+CServerSessionBase *CVtmLoaderEntity::OnNewSession(const char* /*pszRemoteEntityName*/, const char * /*pszParam*/)
+{
+	return new CVtmLoaderSession(this);
+}
+
+void CVtmLoaderEntity::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, const linkContext &pLinkInfo)
+	{
+		
+	}
+
+
+
+	ErrorCodeEnum CVtmLoaderEntity::UnsubscribeEntitysEvents()
+{
+	auto pFunc = GetFunction();
+		
+	if ((__int64)m_SubLogID2 != 0)
+		pFunc->UnsubscribeLog(m_SubLogID2);
+
+	if ((__int64)m_SubLogID3 != 0)
+		pFunc->UnsubscribeLog(m_SubLogID3);
+
+	return Error_Succeed;
+}
+SP_BEGIN_ENTITY_MAP()
+	SP_ENTITY(CVtmLoaderEntity)
+SP_END_ENTITY_MAP()

+ 63 - 0
Module/mod_vtmloader/mod_vtmloader.h

@@ -0,0 +1,63 @@
+#pragma once
+
+#include "SpBase.h"
+#include "VtmLoaderFSM.h"
+//#include "IHttpFunc.h"
+#include "VtmLoader_server_g.h"
+using namespace VtmLoader;
+
+// 
+class CVtmLoaderEntity : public CEntityBase, public ILogListener
+{
+public:
+	CVtmLoaderEntity() :m_SubLogID1(0), m_SubLogID2(0), m_dwBeginTime(0),
+		m_strUserID(""), m_strUserName(""), m_strAuthorizer(""), m_strCurRight(""), m_strAuthTime("")
+	{
+	}
+
+	virtual ~CVtmLoaderEntity() {}
+	virtual const char *GetEntityName() const { return "VtmLoader"; }
+	virtual bool IsService()const{return true;}
+
+	virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext);
+	virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext) ;
+	virtual CServerSessionBase *OnNewSession(const char* /*pszRemoteEntityName*/, const char * /*pszParam*/);
+	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, const linkContext &pLinkInfo);
+	
+	ErrorCodeEnum UnsubscribeEntitysEvents();
+	CSimpleStringA GetCurMaintainer(){ return m_strUserID;}
+
+
+protected:
+	//GUITask m_task;
+	CVtmLoaderFSM m_FSM;
+	CUUID m_SubLogID1;
+	CUUID m_SubLogID2;
+	CUUID m_SubLogID3;
+	CUUID m_SubLogID4;
+
+	// µ±Ç°Î¬»¤Óû§ÐÅÏ¢
+	CSimpleStringA m_strUserID;
+	CSimpleStringA m_strUserName;
+	CSimpleStringA m_strCurRight;
+	CSimpleStringA m_strAuthorizer;
+	CSimpleStringA m_strAuthTime;
+	DWORD m_dwBeginTime;
+public:
+
+	//static std::string m_httpToken;
+	//IHttpFunc* m_pHttpFunc;
+};
+
+class CVtmLoaderSession : public VtmLoaderService_ServerSessionBase
+{
+public:
+	CVtmLoaderSession(CVtmLoaderEntity *pEntity) : m_pEntity(pEntity) {}
+	virtual ~CVtmLoaderSession() {}
+	
+private:
+	CVtmLoaderEntity *m_pEntity;
+};
+

+ 163 - 0
Module/mod_vtmloader/resource.h

@@ -0,0 +1,163 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ 生成的包含文件。
+// 供 mod_guiconsole.rc 使用
+//
+#define IDOK2                           2
+#define IDOK3                           3
+#define IDOK4                           4
+#define IDR_MAINFRAME                   101
+#define IDD_ABOUTDIALOG                 106
+#define IDD_ABOUTBOX                    106
+#define IDD_HIGHLEVELDLG                108
+#define IDD_SYSINFODLG                  109
+#define IDD_CONTROLDLG                  110
+#define IDD_USERLOGIN                   114
+#define IDD_SYSINITDLG                  115
+#define IDD_DIALOG1                     116
+#define IDD_STARTPAGE                   116
+#define IDB_LOGO                        128
+#define IDC_VIEWOSINFO                  1005
+#define IDC_VIEWOSINFO2                 1006
+#define IDC_SETDEBUGLEVEL               1006
+#define IDC_VIEWOSINFO3                 1007
+#define IDC_ROLLBACKUPGRADE             1007
+#define IDC_VIEWOSINFO4                 1008
+#define IDC_VIEWOSINFO5                 1009
+#define IDC_EditUser                    1009
+#define IDC_VIEWOSINFO6                 1010
+#define IDC_MODENROLLINFO               1010
+#define IDC_EditPassword                1010
+#define IDC_VIEWOSINFO7                 1011
+#define IDC_STARTOSSHELL                1011
+#define IDC_VIEWOSINFO8                 1012
+#define IDC_SETDEBUGLEVEL2              1012
+#define IDC_RESETDBGLEVEL               1012
+#define IDC_VIEWOSINFO9                 1013
+#define IDC_RESTARTPOWER                1013
+#define IDC_MODENROLLINFO2              1013
+#define IDC_VIEWOSINFO10                1014
+#define IDC_MODENROLLINFO3              1014
+#define IDC_MATERIALMGR                 1014
+#define IDC_VIEWOSINFO11                1015
+#define IDC_PRINT_CONFIG                1015
+#define IDC_VIEWOSINFO12                1016
+#define IDC_VIEWOSINFO13                1017
+#define IDC_VIEWFWINFO                  1018
+#define IDC_VARBUTTON1                  1019
+#define IDC_VARBUTTON2                  1020
+#define IDC_VARBUTTON3                  1021
+#define IDC_VARBUTTON4                  1022
+#define IDC_VIEWSYSLOG                  1023
+#define IDC_VIEWENTCONFIG               1024
+#define IDC_VIEWUPGRADELOG              1025
+#define IDC_VIEWINSTALLDIR              1026
+#define IDC_VIEWSYSVAR                  1027
+#define IDC_MONITLOG                    1028
+#define IDC_MONITORLOG                  1028
+#define IDC_VIEWDOWNLOAD                1029
+#define IDC_RESTARTSHELL                1030
+#define IDC_SHUTDOWNSHELL               1031
+#define IDC_EXITACCESSAUTH              1032
+#define IDC_RESTARTAUTH                 1033
+#define IDC_MANUALUPGRADE               1034
+#define IDC_RESTARTAUTH2                1034
+#define IDC_UNREGTERMINAL               1035
+#define IDC_EDITGPS                     1036
+#define IDC_EDITADDR                    1037
+#define IDC_LABELGPS                    1038
+#define IDC_LABELADDR                   1039
+#define IDC_GROUPINFO                   1040
+#define IDC_EDIT1                       1041
+#define IDC_EDIT2                       1042
+#define IDC_EDIT3                       1043
+#define IDC_EDIT4                       1044
+#define IDC_EDIT5                       1045
+#define IDC_EDIT6                       1046
+#define IDC_EDIT7                       1047
+#define IDC_COMMITRESULT                1048
+#define IDC_CANCELCHECK                 1049
+#define IDC_STATIC1                     1050
+#define IDC_STATIC2                     1051
+#define IDC_STATIC3                     1052
+#define IDC_STATIC4                     1053
+#define IDC_STATIC5                     1054
+#define IDC_STATIC6                     1055
+#define IDC_STATIC7                     1056
+#define IDC_STATIC8                     1057
+#define IDC_COMBO1                      1058
+#define IDC_STATIC9                     1059
+#define IDC_EDIT8                       1060
+#define IDC_PROMPT                      1061
+#define IDC_DATETIMEPICKER1             1062
+#define IDC_DATETIMEPICKER2             1063
+#define IDC_SYSTEM_INIT                 1063
+#define IDC_SYSTEM_RESTORE              1064
+#define IDC_INIT_STATIC                 1065
+#define IDC_RESTORE_STATIC              1066
+#define IDC_BUTTON1                     1067
+#define IDC_CAMERA_CONFIG               1067
+#define IDC_VOICECONFIG                 1068
+#define IDC_CLOSEWIFI                   1069
+#define IDC_CLOSEAUTOROTATION           1070
+#define IDC_MINDPI                      1071
+#define IDC_EXITVTM                     1071
+#define IDC_SYSTEM_MAININIT             1072
+#define IDC_RICHEDIT                    1072
+#define IDC_SYSTEM_MAINRESTORE          1073
+#define IDC_ACCOUNTCONFIG               1074
+#define IDC_RICHEDIT21                  1074
+#define IDC_DEFAULTDIX                  1075
+#define IDC_PROGRESS                    1075
+#define IDC_EXITBTN                     1076
+#define IDC_STATIC_BASICINFO            1076
+#define IDC_LIST1                       4001
+#define IDC_VIEWLIST1                   4001
+#define IDC_MSG_LIST                    4001
+#define IDC_LIST2                       4002
+#define ID_FILE_EXIT                    40001
+#define ID_HELP_ABOUT                   40002
+#define ID_START                        40003
+#define ID_STOP                         40004
+#define ID_PAUSE                        40005
+#define ID_CONTINUE                     40006
+#define ID_FILE_RESTART                 40007
+#define ID_SETTINGS_DIAL                40008
+#define ID_STARTPAGE                    40009
+#define ID_ABOUT                        40011
+#define ID_FRESH                        40014
+#define ID_KILL                         40015
+#define ID_CUSTOMIZESTART               40016
+#define ID_CUSTOMIZESTART40017          40017
+#define ID_CUSTOMIZESTART40018          40018
+#define ID_FILE_REBOOT                  40030
+#define ID_FILE_TEST                    40033
+#define ID_FILE_INITIALIZE              40040
+#define ID_FILE_DELKEYSET               40041
+#define ID_DEBUG_B                      40042
+#define ID_FILE_MAINTAIN                40043
+#define ID_BUTTON40044                  40044
+#define ID_BUTTON40045                  40045
+#define ID_BUTTON40046                  40046
+#define ID_FILE_HIGHLEVEL               40047
+#define ID_ACCELERATOR40019             41000
+#define ID_STARTMENU_BEGIN              41000
+#define ID_ACCELERATOR40021             41001
+#define ID_ACCELERATOR40022             41002
+#define ID_ACCELERATOR40023             41003
+#define ID_ACCELERATOR40024             41004
+#define ID_ACCELERATOR40025             41005
+#define ID_ACCELERATOR40026             41006
+#define ID_ACCELERATOR40027             41007
+#define ID_ACCELERATOR40028             41008
+#define ID_STARTMENU_END                41999
+
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        130
+#define _APS_NEXT_COMMAND_VALUE         40048
+#define _APS_NEXT_CONTROL_VALUE         1077
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif

+ 8 - 0
Module/mod_vtmloader/stdafx.cpp

@@ -0,0 +1,8 @@
+// stdafx.cpp : source file that includes just the standard includes
+// SpBase.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
+// TODO: reference any additional headers you need in STDAFX.H
+// and not in this file

+ 44 - 0
Module/mod_vtmloader/stdafx.h

@@ -0,0 +1,44 @@
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently, but
+// are changed infrequently
+//
+
+#pragma once
+
+#include "targetver.h"
+
+#if 0
+#if (defined(_DEBUG) || defined(DEBUG))
+#ifndef _CRTDBG_MAP_ALLOC
+#define _CRTDBG_MAP_ALLOC
+#endif
+#endif 
+#endif
+
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+
+#if defined(_MSC_VER)
+#include <WinSock2.h>
+#include <Mmsystem.h>
+#include <windows.h>
+#include <crtdbg.h>
+#include <process.h>
+#else
+#include <winpr/winsock.h>
+#include <winpr/windows.h>
+
+#endif //_MSC_VER
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+
+#pragma warning( disable: 4127 )
+
+#include "AutoArray.h"
+#include "SimpleString.h"
+#include "SmartPointer.h"
+
+// TODO: reference additional headers your program requires here

+ 94 - 0
Module/mod_vtmloader/tokenDefine.h

@@ -0,0 +1,94 @@
+#pragma once
+#include "IHttpFunc.h"
+#include <string>
+#if defined(RVC_OS_WIN)
+#include "json.h"
+#else
+#include "json/json.h"
+#endif
+#include "SpSecureClient.h"
+
+#define TOKEN_GETURL_ERR 0x10A00001
+#define GET_CHANNELID_ERR 0x10A00002
+#define GET_TOKEN_ERR 0x10A00003
+
+struct QueryChannelIDHTTPReq : CHTTPReq {
+	QueryChannelIDHTTPReq()
+	{
+		m_timeOut = 500;
+		m_withToken = false;
+	}
+	std::string systemId;
+
+	virtual string ToJson() {
+		char reqcontent[512];
+		sprintf(reqcontent, "{\"channelId\":\"\",\"systemId\":\"%s\",\"state\":\"\"}", systemId.c_str());
+		return reqcontent;
+	}
+};
+
+struct QueryChannelIDHTTPRet : CHTTPRet {
+	QueryChannelIDHTTPRet() {}
+	std::string m_channelId;
+	std::string m_tokenSecret;
+	virtual bool Parse(std::string strData) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("QueryChannelIDHTTPRet: data = %s", strData.c_str());
+		Json::Value root;
+		Json::Reader reader;
+		reader.parse(strData, root);
+		if (root.isNull() || root["data"].isNull())
+			return false;
+		for (int i = 0; i < root["data"].size(); i++)
+		{
+			auto curObject = root["data"][i];
+			if (!curObject["channelId"].isNull() && curObject["channelId"].isString())
+			{
+				m_channelId = curObject["channelId"].asString();
+				return true;
+			}
+			else
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse channelId failed");
+			if (!curObject["clientSecret"].isNull() && curObject["clientSecret"].isString())
+			{
+				m_tokenSecret = curObject["clientSecret"].asString();
+				return true;
+			}
+			else
+				DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("parse clientSecret failed");
+		}
+		return false;
+	}
+};
+
+struct QueryTokenHTTPReq : CHTTPReq {
+	QueryTokenHTTPReq()
+	{
+		m_timeOut = 500;
+		m_withToken = false;
+	}
+	std::string channelId;
+	std::string tokenSecret;
+	std::string businessId;
+
+	virtual string ToJson() {
+		char reqcontent[512];
+		sprintf(reqcontent, "{\"channelId\":\"%s\",\"businessId\":\"%s\",\"clientSecret\":\"%s\"}", channelId.c_str(), businessId.c_str(), tokenSecret.c_str());
+		return reqcontent;
+	}
+};
+
+struct QueryTokenHTTPRet : CHTTPRet {
+	QueryTokenHTTPRet() {}
+	std::string m_token;
+	virtual bool Parse(std::string strData) {
+		DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("QueryTokenHTTPRet: data = %s", strData.c_str());
+		Json::Value root;
+		Json::Reader reader;
+		reader.parse(strData, root);
+		if (root.isNull() || root["data"].isNull())
+			return false;
+
+		m_token = root["data"].asString();
+		return true;
+	}
+};

+ 11 - 0
Module/mod_vtmloader/vtmloader.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="gb2312"?>
+<entity name="VtmLoader">
+  <class name="VtmLoaderService" overlap="true" exclusive="false">
+	<twoway name="notice" overlap="true">
+      <req>
+        <param name="stage" type="int"/>
+		<param name="test1" type="string"/>
+      </req>
+    </twoway>
+  </class>
+</entity>

+ 1 - 0
Other/libpublicFun/CMakeLists.txt

@@ -5,6 +5,7 @@ set(${MODULE_PREFIX}_SRCS
     publicExport.h
     publicFunExport.cpp
     publicFunExport.h
+    portCheck.cpp
     ${ThirdPartyHeadRoot}/CJson/cJSON.c
     exLog/log.h
     exLog/log.cpp

+ 1 - 17
Other/libpublicFun/portCheck.cpp

@@ -8,9 +8,6 @@
 #include "Wininet.h"  
 #pragma comment(lib,"Wininet.lib") 
 #else
-#include <requests/Exception.hpp>
-#include <requests/Request.hpp>
-#include <requests/Url.hpp>
 #endif
 
 
@@ -70,20 +67,7 @@ bool checkHttpActive(const char* httpUrl)
 #else
 bool checkHttpActive(const char* httpUrl)
 {
-	requests::Request request;
-	requests::Url url(httpUrl);
-
-	try
-	{
-		// ·¢Æð HTTP ÇëÇó£¬×èÈû
-		auto resp = request.get(url);
-		return true;
-	}
-	catch (requests::Exception& e)
-	{
-		std::cout << e.what() << std::endl;
-	}
-	return false;
+	true;
 }
 
 #endif

+ 6 - 0
addin/cfg/UserCodeToMsgTip.ini

@@ -30,6 +30,8 @@
 0x20300207=[RTA230E] 卡箱1未检测到卡片,请检测卡箱1中卡片是否放好或卡片余量过低
 0x20300208=[RTA230F] 卡箱2未检测到卡片,请检测卡箱2中卡片是否放好或卡片余量过低
 0x20300209=[RTA230G] 卡箱3未检测到卡片,请检测卡箱3中卡片是否放好或卡片余量过低
+0x20300210=[RTA2314] 卡库有旧的盘库记录,不允许开始新的盘库
+0x20300212=[RTA2315] 卡库无本地盘库记录,请退出后重试
 0x2030020A=[RTA230H] 卡箱1本地计数无卡,请执行清机计划
 0x2030020B=[RTA230J] 卡箱2本地计数无卡,请执行清机计划
 0x2030020C=[RTA230K] 卡箱3本地计数无卡,请执行清机计划
@@ -49,6 +51,9 @@
 0x203002A5=[RTA230Y] 卡库未正常启动,请确认卡库启动完成之后再发起业务
 0x203002A3=[RTA230W] [HW] 跨机时卡库处理耗时过长,请联系卡库厂商排查
 0x20300269=[RTA2311] [HW] 卡库卡机未成功启动,请联系卡库厂商排查卡库
+0x203002C8=[RTA2316] [HW] 卡库盘库失败,卡槽移卡失败,请联系厂商排查
+0x203002C9=[RTA2317] [HW] 卡库盘库失败,读卡失败吞卡,请联系厂商排查
+0x203002CA=[RTA2318] [HW] 卡库盘库失败,卡移回卡槽失败,请联系厂商排查
 
 0x20300032=[RTA2320] [HW] 查询卡槽状态失败,请联系卡库厂商排查
 0x20300002=[RTA2322] [HW] 取卡机状态失败,请重试或联系厂商排查
@@ -89,6 +94,7 @@
 0x20600221=[RTA260F] 密码输入时收到退出事件,请重试
 0x20600202=[RTA2610] 打开运行时文件失败,请联系行内开发人员排查
 0x20600222=[RTA2611] 不能识别的密钥标识,请联系行内开发人员排查
+0x20600224=[RTA2612] 不支持明文输入获取,请联系行内开发人员排查
 
 0x2180000D=[RTA2O01] 连接高拍仪实体模块失败,请尝试重启应用或联系厂商排查
 0x2180000E=[RTA2O02] 操作频繁,请稍候重试

+ 2 - 2
addin/cfg/shell.ini.in

@@ -29,7 +29,7 @@ FingerPrint=0,@LIB_PREFIX@mod_FingerPrint@LIB_SUFFIX@,0x204
 PinPad=0,@LIB_PREFIX@mod_PinPad@LIB_SUFFIX@,0x206
 MediaController=0,@LIB_PREFIX@mod_mediacontroller@LIB_SUFFIX@,0x208
 Gpio=0,@LIB_PREFIX@mod_Gpio@LIB_SUFFIX@,0x209
-WatchDog=0,@LIB_PREFIX@mod_WatchDog@LIB_SUFFIX@,0x20D
+;WatchDog=0,@LIB_PREFIX@mod_WatchDog@LIB_SUFFIX@,0x20D
 Ups=0,@LIB_PREFIX@mod_Ups@LIB_SUFFIX@,0x20E
 MaintainWatcher=0,@LIB_PREFIX@mod_MaintainWatcher@LIB_SUFFIX@,0x210
 ;Radar=0,@LIB_PREFIX@mod_radar@LIB_SUFFIX@,0x211
@@ -144,7 +144,7 @@ shell_token=GUIConsole,""
 InitFWBFromStart=HealthManager,""
 
 [Startup]
-Number=2
+Number=0
 2=GUIConsole
 1=HealthManager
 

+ 12 - 0
addin/res/ManagerDesktop/css/errType.css

@@ -238,6 +238,18 @@ input[type="number"]{
     justify-content: center;
 }
 .btn_confirm{
+	width: 300px;
+	height: 80px;
+	border-radius: 40px;
+	background-image: linear-gradient(to bottom right, #4D7BFE, #749FFF);
+	font-size: 32px;
+	color: #FFFFFF;
+	display: inline-flex;
+	align-items: center;
+	justify-content: center;
+}
+
+.rows_restart .btn_confirm{
 	width: 200px;
 	height: 50px;
 	border-radius: 40px;

+ 2 - 2
addin/res/ManagerDesktop/entityCheck.html

@@ -71,10 +71,10 @@
 			<!-- 硬件检测Start -->
 			<div class="entity-box">
 				<div class="entity-check" id="entityList">
-					<div class="entity-item netCardLink">
+					<!-- <div class="entity-item netCardLink">
 						<h5 class="fz_28"><i class="icon-type"></i>网卡连接</h5>
 						<p class="fz_24"></p>
-					</div>
+					</div> -->
 					<div class="entity-item checkNet">
 						<h5 class="fz_28"><i class="icon-type"></i>网络连接</h5>
 						<p class="fz_24"></p>

+ 54 - 48
addin/res/ManagerDesktop/js/entityCheck.js

@@ -222,57 +222,63 @@ function getBizLinkDetect(url,urlTitle,idx){
 	})
 }
 
-// 网卡连接
+// 网卡连接-删除后,检测按钮异常,临时方案
 function getNetCardLink(){
-  let date = +new Date
-  let dateTime = getFamtterTimer(date)
-
-  let req = new Request()
-
-	let timeoutFn= setTimeout(function(){
-		// '请求超时'
-    $('.netCardLink').fadeIn();
-    let elem = document.querySelector('.netCardLink .icon-type');
-		elem&&elem.classList.add('icon-err')
-    $('.netCardLink p').html('「'+dateTime+'」网卡连接失败')
-    retest[1] = 'Y'
-    set_retest(retest,test)
-    testResult[1] = 'N'
-    set_testResult(testResult,goBusiHome)
-	},60000)
-
-	AccessAuthService.GetNetMsg(req, function(res) {
-		logEvent("GetNetMsg ret: "+JSON.stringify(res));
-		if(res){
-			clearTimeout(timeoutFn);
-      retest[1] = 'Y'
-      set_retest(retest,test)
-
-      $('.netCardLink').fadeIn();
-      let elem = document.querySelector('.netCardLink .icon-type');
-      if(res.errorCode==0)
-      { 
-        if(res.netStatus==1){
-          elem&&elem.classList.add('icon-suc')
-          $('.netCardLink p').html('「'+dateTime+'」网卡连接成功')
-          testResult[1] = 'Y'
-          set_testResult(testResult,goBusiHome)
-        }else{
-          elem&&elem.classList.add('icon-err')
-          $('.netCardLink p').html('「'+dateTime+'」网卡连接失败')
-          testResult[1] = 'N'
-          set_testResult(testResult,goBusiHome)
-        }
-      }else{
-        elem&&elem.classList.add('icon-err')
-        $('.netCardLink p').html('「'+dateTime+'」网卡连接失败')
-        testResult[1] = 'N'
-        set_testResult(testResult,goBusiHome)
-      }
-		}
-	})
+  testResult[1] = 'Y'
+  set_testResult(testResult,goBusiHome)
 }
 
+// 网卡连接
+// function getNetCardLink(){
+//   let date = +new Date
+//   let dateTime = getFamtterTimer(date)
+
+//   let req = new Request()
+
+// 	let timeoutFn= setTimeout(function(){
+// 		// '请求超时'
+//     $('.netCardLink').fadeIn();
+//     let elem = document.querySelector('.netCardLink .icon-type');
+// 		elem&&elem.classList.add('icon-err')
+//     $('.netCardLink p').html('「'+dateTime+'」网卡连接失败')
+//     retest[1] = 'Y'
+//     set_retest(retest,test)
+//     testResult[1] = 'N'
+//     set_testResult(testResult,goBusiHome)
+// 	},60000)
+
+// 	AccessAuthService.GetNetMsg(req, function(res) {
+// 		logEvent("GetNetMsg ret: "+JSON.stringify(res));
+// 		if(res){
+// 			clearTimeout(timeoutFn);
+//       retest[1] = 'Y'
+//       set_retest(retest,test)
+
+//       $('.netCardLink').fadeIn();
+//       let elem = document.querySelector('.netCardLink .icon-type');
+//       if(res.errorCode==0)
+//       { 
+//         if(res.netStatus==1){
+//           elem&&elem.classList.add('icon-suc')
+//           $('.netCardLink p').html('「'+dateTime+'」网卡连接成功')
+//           testResult[1] = 'Y'
+//           set_testResult(testResult,goBusiHome)
+//         }else{
+//           elem&&elem.classList.add('icon-err')
+//           $('.netCardLink p').html('「'+dateTime+'」网卡连接失败')
+//           testResult[1] = 'N'
+//           set_testResult(testResult,goBusiHome)
+//         }
+//       }else{
+//         elem&&elem.classList.add('icon-err')
+//         $('.netCardLink p').html('「'+dateTime+'」网卡连接失败')
+//         testResult[1] = 'N'
+//         set_testResult(testResult,goBusiHome)
+//       }
+// 		}
+// 	})
+// }
+
 function retestFn(){
   IsRetest = true
   retest =['N','N'];

+ 1 - 1
addin/res/ManagerDesktop/js/entityService.js

@@ -471,7 +471,7 @@ var AccessAuthService = {
     },
     _methodID : {
         InitializeNew: 4,
-        GetNetMsg: 6
+        GetNetMsg: 6,
     },
             
     _methodSignature :{

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä