Browse Source

1、新增全局函数:Split
2、新增配置项:resource_run.cfg中的部分内容;
3、将全局魔数使用命名空间枚举代替;
4、测试项Fail,则用例Fail,任务Fail;用例Faile,则任务Fail;

scbc.sat2 5 years ago
parent
commit
e42da2e8b9

+ 21 - 0
SATService/SATService/Global.cpp

@@ -223,6 +223,10 @@ namespace GLOBAL
 
 
 		// 读取其他目录的配置文件;sat_result_dir
 		// 读取其他目录的配置文件;sat_result_dir
 		_stprintf_s(szIniPath, _T("%s%s"), g_szPython27Dir, "Lib\\site-packages\\ssat_sdk\\config\\resource_run.cfg");
 		_stprintf_s(szIniPath, _T("%s%s"), g_szPython27Dir, "Lib\\site-packages\\ssat_sdk\\config\\resource_run.cfg");
+		GetPrivateProfileString(_T("COMM"), _T("serial_communicator_port"), _T(""), g_stSATConfig.szTVPort, MAX_PATH, szIniPath);
+		GetPrivateProfileString(_T("Abnormal"), _T("reboot"), NULL, g_stSATConfig.szTVReboot, MAX_PATH, szIniPath);
+		GetPrivateProfileString(_T("Abnormal"), _T("shutdown"), NULL, g_stSATConfig.szTVShutdown, MAX_PATH, szIniPath);
+		g_stSATConfig.bWatchTVPort = GetPrivateProfileInt(_T("Abnormal"), _T("Watch"), 0, szIniPath);
 		GetPrivateProfileString(_T("COMM"), _T("sat_result_dir"), _T(""), g_stSATConfig.szCaseResultDir, MAX_PATH, szIniPath);
 		GetPrivateProfileString(_T("COMM"), _T("sat_result_dir"), _T(""), g_stSATConfig.szCaseResultDir, MAX_PATH, szIniPath);
 		// 将反斜转正斜;
 		// 将反斜转正斜;
 		std::string dir = Replace(g_stSATConfig.szCaseResultDir, "\\", "/");
 		std::string dir = Replace(g_stSATConfig.szCaseResultDir, "\\", "/");
@@ -1400,4 +1404,21 @@ namespace GLOBAL
 		return TRUE;
 		return TRUE;
 	}
 	}
 
 
+	void Split(std::string str1, std::string str2, std::vector<std::string> &vt)
+	{
+		if ( str1.size() == 0 || str2.size() == 0 )
+			return;
+
+		int npos = str1.find(str2);
+		while( std::string::npos != npos )
+		{
+			vt.push_back(str1.substr(0, npos));
+			str1 = str1.substr(npos + str2.size());
+			npos = str1.find(str2);
+		}
+
+		if ( str1.size() )
+			vt.push_back(str1);
+	}
+
 };
 };

+ 10 - 0
SATService/SATService/Global.h

@@ -60,6 +60,14 @@ namespace GLOBAL
 		DWORD dwScriptTimeout;
 		DWORD dwScriptTimeout;
 		// xml目录;
 		// xml目录;
 		TCHAR szCaseResultDir[MAX_PATH];
 		TCHAR szCaseResultDir[MAX_PATH];
+		// 电视机串口号;
+		TCHAR szTVPort[MAX_PATH];
+		// 是否开启串口监控;
+		BOOL  bWatchTVPort;
+		// 重启关键字;
+		TCHAR szTVReboot[MAX_PATH];
+		// 关机关键字;
+		TCHAR szTVShutdown[MAX_PATH];
 		// 这个可以忽略不要;
 		// 这个可以忽略不要;
 		typedef struct  __ST_LD__
 		typedef struct  __ST_LD__
 		{
 		{
@@ -185,6 +193,8 @@ namespace GLOBAL
 	std::string Replace(std::string strSrc, std::string strNew, std::string strOld);
 	std::string Replace(std::string strSrc, std::string strNew, std::string strOld);
 	// 获取Python27路径;
 	// 获取Python27路径;
 	BOOL Python27Dir();
 	BOOL Python27Dir();
+	// 指定字符串分隔;
+	void Split(std::string str1, std::string str2, std::vector<std::string> &vt);
 };
 };
 
 
 #endif
 #endif

+ 9 - 1
SATService/SATService/PythonExecutor.cpp

@@ -108,7 +108,8 @@ DWORD CPythonExecutor::_StderrLogExportThread(LPVOID lpParam)
 			continue;
 			continue;
 
 
 		GLOBAL::WritePythonLog(that->m_szLogPath, chBuf);
 		GLOBAL::WritePythonLog(that->m_szLogPath, chBuf);
-		that->m_pCaseObj->_nExecutionState = 4;
+		// 脚本结果异常;
+		that->m_pCaseObj->_nExecutionResult = SATHTTP::ABNORMAL;
 		memset(chBuf, 0, BUFSIZE);
 		memset(chBuf, 0, BUFSIZE);
 	} while (!that->m_bStopLogExport); 
 	} while (!that->m_bStopLogExport); 
 	
 	
@@ -593,9 +594,16 @@ bool CPythonExecutor::IsScriptOver()
 		 WaitForSingleObject(m_hStderrLogThread, 0) == WAIT_OBJECT_0 && 
 		 WaitForSingleObject(m_hStderrLogThread, 0) == WAIT_OBJECT_0 && 
 		 WaitForSingleObject(m_hWorkThread, 0) == WAIT_OBJECT_0)
 		 WaitForSingleObject(m_hWorkThread, 0) == WAIT_OBJECT_0)
 	{
 	{
+		// 标记任务完成;
+		m_pCaseObj->_nExecutionState = SATHTTP::EXECUTED;
+		// 如果任务结果为空,标记成功;
+		if ( m_pCaseObj->_nExecutionResult == SATHTTP::NONE )
+			m_pCaseObj->_nExecutionResult = SATHTTP::SUCCESS;
 		GLOBAL::WriteTextLog(_T("====>脚本(%s)已完成"), m_pCaseObj->strCaseName.c_str());
 		GLOBAL::WriteTextLog(_T("====>脚本(%s)已完成"), m_pCaseObj->strCaseName.c_str());
 		return true;
 		return true;
 	}
 	}
 
 
+	//GLOBAL::WriteTextLog(_T("====>脚本(%s)未结束"), m_pCaseObj->strCaseName.c_str());
+
 	return false;
 	return false;
 }
 }

+ 201 - 24
SATService/SATService/SATExecutor.cpp

@@ -2,6 +2,7 @@
 #include "SATExecutor.h"
 #include "SATExecutor.h"
 #include "PythonExecutor.h"
 #include "PythonExecutor.h"
 #include "CharEncoding.h"
 #include "CharEncoding.h"
+#include "SynSerial.h"
 
 
 CSATExecutor::CSATExecutor(void)
 CSATExecutor::CSATExecutor(void)
 {
 {
@@ -35,7 +36,8 @@ SATHTTP::STTask* CSATExecutor::IsThereATaskInProcess()
 {
 {
 	std::list<SATHTTP::STTask>::iterator it = m_vtTask.begin();
 	std::list<SATHTTP::STTask>::iterator it = m_vtTask.begin();
 	for ( ; it != m_vtTask.end(); it++ ) {
 	for ( ; it != m_vtTask.end(); it++ ) {
-		if ( it->_nExecutionState == 1 ) {
+		// 执行中的任务;
+		if ( it->_nExecutionState == SATHTTP::INEXECUTED ) {
 			return &(*it);
 			return &(*it);
 		}
 		}
 	}
 	}
@@ -47,7 +49,8 @@ SATHTTP::STTask* CSATExecutor::GetFreeTask()
 {
 {
 	std::list<SATHTTP::STTask>::iterator it = m_vtTask.begin();
 	std::list<SATHTTP::STTask>::iterator it = m_vtTask.begin();
 	for ( ; it != m_vtTask.end(); it++ ) {
 	for ( ; it != m_vtTask.end(); it++ ) {
-		if ( it->_nExecutionState == 0 ) {
+		// 未执行的任务;
+		if ( it->_nExecutionState == SATHTTP::UNEXECUTED ) {
 			return &(*it);
 			return &(*it);
 		}
 		}
 	}
 	}
@@ -61,8 +64,8 @@ void CSATExecutor::DelFinishedTask()
 	std::list<SATHTTP::STTask>::iterator it = m_vtTask.begin();
 	std::list<SATHTTP::STTask>::iterator it = m_vtTask.begin();
 	for ( ; it != m_vtTask.end(); it++ ) {
 	for ( ; it != m_vtTask.end(); it++ ) {
 		// 状态为2的完成任务;
 		// 状态为2的完成任务;
-		if ( it->_nExecutionState == 2 ) {
-			GLOBAL::WriteTextLog("删除已完成任务:%s", it->Job.strUniqueId.c_str());
+		if ( it->_nExecutionState == SATHTTP::EXECUTED ) {
+			GLOBAL::WriteTextLog("==>删除已完成任务:%s", it->Job.strUniqueId.c_str());
 			// 删除所有执行器对象;
 			// 删除所有执行器对象;
 			for (std::vector<SATHTTP::STCase>::iterator _case = it->Job.vtCases.begin(); _case != it->Job.vtCases.end(); _case++ ) {
 			for (std::vector<SATHTTP::STCase>::iterator _case = it->Job.vtCases.begin(); _case != it->Job.vtCases.end(); _case++ ) {
 				if ( _case->_pExcutor )
 				if ( _case->_pExcutor )
@@ -79,7 +82,8 @@ SATHTTP::STCase* CSATExecutor::IsCaseScriptProcess(std::vector<SATHTTP::STCase>
 {
 {
 	std::vector<SATHTTP::STCase>::iterator it = vtCases.begin();
 	std::vector<SATHTTP::STCase>::iterator it = vtCases.begin();
 	for ( ; it != vtCases.end(); it++) {
 	for ( ; it != vtCases.end(); it++) {
-		if ( it->_nExecutionState == 1 ) {
+		// 执行中的脚本;
+		if ( it->_nExecutionState == SATHTTP::INEXECUTED ) {
 			return &(*it);
 			return &(*it);
 		}
 		}
 	}
 	}
@@ -91,7 +95,8 @@ SATHTTP::STCase* CSATExecutor::GetFreeCaseScript(std::vector<SATHTTP::STCase> &v
 {
 {
 	std::vector<SATHTTP::STCase>::iterator it = vtCases.begin();
 	std::vector<SATHTTP::STCase>::iterator it = vtCases.begin();
 	for ( ; it != vtCases.end(); it++) {
 	for ( ; it != vtCases.end(); it++) {
-		if ( it->_nExecutionState == 0 ) {
+		// 未执行的脚本;
+		if ( it->_nExecutionState == SATHTTP::UNEXECUTED ) {
 			return &(*it);
 			return &(*it);
 		}
 		}
 	}
 	}
@@ -101,6 +106,7 @@ SATHTTP::STCase* CSATExecutor::GetFreeCaseScript(std::vector<SATHTTP::STCase> &v
 
 
 SATHTTP::STCase* CSATExecutor::ExecuteFreeCaseScript(SATHTTP::STTask* pTask)
 SATHTTP::STCase* CSATExecutor::ExecuteFreeCaseScript(SATHTTP::STTask* pTask)
 {
 {
+	// 多取未执行的脚本;
 	SATHTTP::STCase* pCase = GetFreeCaseScript(pTask->Job.vtCases);
 	SATHTTP::STCase* pCase = GetFreeCaseScript(pTask->Job.vtCases);
 	if (pCase) {		
 	if (pCase) {		
 		if ( !pCase->_pExcutor ) {
 		if ( !pCase->_pExcutor ) {
@@ -114,14 +120,14 @@ SATHTTP::STCase* CSATExecutor::ExecuteFreeCaseScript(SATHTTP::STTask* pTask)
 					pExcutor->SetCaseObje(pCase);
 					pExcutor->SetCaseObje(pCase);
 					pExcutor->StartScript();
 					pExcutor->StartScript();
 					// 标记用例执行中;
 					// 标记用例执行中;
-					pCase->_nExecutionState = 1;
+					pCase->_nExecutionState = SATHTTP::INEXECUTED;
 				}
 				}
-				else { // 初始化失败;
-					pCase->_nExecutionState = 4;
+				else { // 标记脚本失败;
+					pCase->_nExecutionResult = SATHTTP::FAIL;
 				}
 				}
 
 
 				// 标记任务为执行中;
 				// 标记任务为执行中;
-				pTask->_nExecutionState = 1;
+				pTask->_nExecutionState = SATHTTP::INEXECUTED;
 				// 记录开始时间;
 				// 记录开始时间;
 				pCase->_ulStartTickCount = GetTickCount64();
 				pCase->_ulStartTickCount = GetTickCount64();
 				pCase->_strStartTime = CTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S"));
 				pCase->_strStartTime = CTime::GetCurrentTime().Format(_T("%Y-%m-%d %H:%M:%S"));
@@ -272,10 +278,9 @@ bool CSATExecutor::UpdateDevice()
 	stUpdateDeviceReq.devicelist.assign(m_vtDevice.begin(), m_vtDevice.end());
 	stUpdateDeviceReq.devicelist.assign(m_vtDevice.begin(), m_vtDevice.end());
 	if ( !::UpdateDeviceMessage(url, stUpdateDeviceReq, stUpdateDeviceResp) )
 	if ( !::UpdateDeviceMessage(url, stUpdateDeviceReq, stUpdateDeviceResp) )
 	{
 	{
+		GLOBAL::WriteTextLog("更新设备信息失败");
 		return false;
 		return false;
 	}
 	}
-
-	GLOBAL::WriteTextLog("更新设备信息成功");
 	
 	
 	return true;
 	return true;
 }
 }
@@ -385,11 +390,11 @@ bool CSATExecutor::UploadCaseLog(SATHTTP::STTask* pTask, SATHTTP::STCase *pCase)
 	stSaveLogReq.strUploads = pCase->_strCaseLog;
 	stSaveLogReq.strUploads = pCase->_strCaseLog;
 	if ( SaveCaseOrTaskLog(url, stSaveLogReq, stSaveLogResp) )
 	if ( SaveCaseOrTaskLog(url, stSaveLogReq, stSaveLogResp) )
 	{
 	{
-		GLOBAL::WriteTextLog("上传日志成功:任务=%s, 用例=%s, 图片=%s", pTask->Job.strUniqueId.c_str(), pCase->strCaseName.c_str(), pCase->_strCaseLog.c_str());
+		GLOBAL::WriteTextLog("上传日志成功:任务=%s, 用例=%s, 日志=%s", pTask->Job.strUniqueId.c_str(), pCase->strCaseName.c_str(), pCase->_strCaseLog.c_str());
 		return true;
 		return true;
 	}
 	}
 
 
-	GLOBAL::WriteTextLog("上传日志失败:任务=%s, 用例=%s, 图片=%s", pTask->Job.strUniqueId.c_str(), pCase->strCaseName.c_str(), pCase->_strCaseLog.c_str());
+	GLOBAL::WriteTextLog("上传日志失败:任务=%s, 用例=%s, 日志=%s", pTask->Job.strUniqueId.c_str(), pCase->strCaseName.c_str(), pCase->_strCaseLog.c_str());
 
 
 	return false;
 	return false;
 }
 }
@@ -403,7 +408,13 @@ bool CSATExecutor::ReportCaseItemFinish(SATHTTP::STTask* pTask, SATHTTP::STCase
 	SATHTTP::STJobProcessReq stJobProcessReq;
 	SATHTTP::STJobProcessReq stJobProcessReq;
 	SATHTTP::STJobProcessResp stJobProcessResp;
 	SATHTTP::STJobProcessResp stJobProcessResp;
 
 
+	// 根据测试项结果决定测试项成功与否;
 	stJobProcessReq.strResultState = caseItem.result ? "1" : "0";
 	stJobProcessReq.strResultState = caseItem.result ? "1" : "0";
+	// 如果测试项失败,标记用例和任务失败;
+	if ( !caseItem.result ) {
+		pCase->_nExecutionResult = SATHTTP::FAIL;
+		pTask->_nExecutionResult = SATHTTP::FAIL;
+	}
 	stJobProcessReq.strCaseScene = "";
 	stJobProcessReq.strCaseScene = "";
 	// 索引;
 	// 索引;
 	_itoa_s(pCase->_nCaseStep, szValue, 10);
 	_itoa_s(pCase->_nCaseStep, szValue, 10);
@@ -501,10 +512,23 @@ bool CSATExecutor::ReportCaseFinish(SATHTTP::STTask* pTask, SATHTTP::STCase *pCa
 	SATHTTP::STJobProcessResp stJobProcessResp;
 	SATHTTP::STJobProcessResp stJobProcessResp;
 
 
 	// 上报用例结果:0表示脚本成功执行,	1表示脚本出错或超时;
 	// 上报用例结果:0表示脚本成功执行,	1表示脚本出错或超时;
-	if ( pCase->_nExecutionState == 2 )
-		stJobProcessReq.strResultState = "0";	// 脚本未执行完成;
-	else //if ( pCase->_nExecutionState == 1 )	
-		stJobProcessReq.strResultState = "1";	// 脚本执行中,认为fail;
+	if ( pCase->_nExecutionState == SATHTTP::EXECUTED )
+	{
+		if ( pCase->_nExecutionResult == SATHTTP::SUCCESS )
+			stJobProcessReq.strResultState = "0";	// 脚本未执行完成;
+		else
+		{
+			stJobProcessReq.strResultState = "1";
+			// 同时标记任务失败;
+			pTask->_nExecutionResult = SATHTTP::FAIL;
+		}
+	}
+	else
+	{
+		stJobProcessReq.strResultState = "1";	// 脚本执行未完成,认为fail;
+		// 同时标记任务失败;
+		pTask->_nExecutionResult = SATHTTP::FAIL;
+	}
 	
 	
 	stJobProcessReq.strCaseScene = "";
 	stJobProcessReq.strCaseScene = "";
 	// 索引;
 	// 索引;
@@ -562,7 +586,7 @@ bool CSATExecutor::ReportCaseFinish(SATHTTP::STTask* pTask, SATHTTP::STCase *pCa
 
 
 	if ( SetResultList(url, stJobProcessReq, stJobProcessResp) )
 	if ( SetResultList(url, stJobProcessReq, stJobProcessResp) )
 	{
 	{
-		GLOBAL::WriteTextLog("上传用例结果完成【失败】:任务=%s, 用例=%s", pTask->Job.strUniqueId.c_str(), pCase->strCaseName.c_str());
+		GLOBAL::WriteTextLog("上传用例结果完成【成功】:任务=%s, 用例=%s", pTask->Job.strUniqueId.c_str(), pCase->strCaseName.c_str());
 		return true;
 		return true;
 	}
 	}
 
 
@@ -581,8 +605,11 @@ bool CSATExecutor::ReportCaseResult(SATHTTP::STTask* pTask, SATHTTP::STCase *pCa
 	std::vector<STCaseItem> vtCaseItem;
 	std::vector<STCaseItem> vtCaseItem;
 	GetCaseXMLResult(xmlpath, vtCaseItem);
 	GetCaseXMLResult(xmlpath, vtCaseItem);
 	// 如果测试项空,任务失败;
 	// 如果测试项空,任务失败;
-	if ( vtCaseItem.size() == 0 )
-		pCase->_nExecutionState = 4;
+	if ( vtCaseItem.size() == 0 ) {
+		pCase->_nExecutionResult = SATHTTP::ABNORMAL;
+		// 同时标记任务失败;
+		pTask->_nExecutionResult = SATHTTP::FAIL;
+	}
 	
 	
 	int nIndex = 1;
 	int nIndex = 1;
 	TCHAR szValue[MAX_PATH] = {0};
 	TCHAR szValue[MAX_PATH] = {0};
@@ -730,8 +757,15 @@ bool CSATExecutor::ReportTaskFinish(SATHTTP::STTask* pTask)
 	SATHTTP::STJobProcessResp stJobProcessResp;
 	SATHTTP::STJobProcessResp stJobProcessResp;
 
 
 	// 需要处理(只要有用例失败,任务就失败)
 	// 需要处理(只要有用例失败,任务就失败)
-	stJobProcessReq.strResultState = "0";	// 脚本执行中,认为fail;
-
+	if ( pTask->_nExecutionState == SATHTTP::EXECUTED )
+	{
+		if ( pTask->_nExecutionResult == SATHTTP::SUCCESS )
+			stJobProcessReq.strResultState = "0";	// 脚本执行中,认为fail;
+		else
+			stJobProcessReq.strResultState = "1";	// 脚本执行中,认为fail;
+	}
+	else
+		stJobProcessReq.strResultState = "1";	// 脚本执行中,认为fail;
 	stJobProcessReq.strCaseScene = "";
 	stJobProcessReq.strCaseScene = "";
 	// 索引;
 	// 索引;
 	stJobProcessReq.strCaseStep = "0";
 	stJobProcessReq.strCaseStep = "0";
@@ -1051,7 +1085,14 @@ DWORD CSATExecutor::ExecuteScriptThread(LPVOID lpVoid)
 					CPythonExecutor *pExcutor = (CPythonExecutor*)pCase->_pExcutor;
 					CPythonExecutor *pExcutor = (CPythonExecutor*)pCase->_pExcutor;
 					if ( pExcutor ) {
 					if ( pExcutor ) {
 						if ( pExcutor->IsScriptOver() ) {
 						if ( pExcutor->IsScriptOver() ) {
-							pCase->_nExecutionState = 2;
+							// 标记脚本已执行;
+							pCase->_nExecutionState = SATHTTP::EXECUTED;
+							// 如果脚本异常,标记任务失败;
+							if ( pCase->_nExecutionResult == SATHTTP::ABNORMAL ) {
+								// 设置任务执行结果失败;
+								pTask->_nExecutionResult = SATHTTP::FAIL;
+								GLOBAL::WriteTextLog("用例脚本异常退出(%s)", pCase->strCaseName.c_str());
+							}
 							// 上报服务器,完成脚本用例,并上传用例结果;
 							// 上报服务器,完成脚本用例,并上传用例结果;
 							that->ReportCaseResult(pTask, pCase);
 							that->ReportCaseResult(pTask, pCase);
 						}
 						}
@@ -1127,3 +1168,139 @@ DWORD CSATExecutor::ExecuteScriptThread(LPVOID lpVoid)
 
 
 	return 0;
 	return 0;
 }
 }
+
+DWORD CSATExecutor::WathTVPortThread(PVOID lpVoid)
+{
+	CSynSerial tv;
+	std::string buffer;
+	TCHAR szLastPort[10] = {0};
+	_tcscpy_s(szLastPort, GLOBAL::g_stSATConfig.szTVPort);
+	std::vector<std::string> vtNotifyReboot;
+	std::vector<std::string> vtNotifyShutdown;
+	DWORD dwTickCount = GetTickCount();
+/*
+	while(!g_bStopThread)
+	{
+		// 读取配置文件;
+		GLOBAL::GetIniInfo();
+		if ( !GLOBAL::g_stSATConfig.bWatchTVPort )
+		{
+			Sleep(5000);
+			continue;
+		}
+
+		if ( GetTickCount() - dwTickCount > 5000 )
+		{// 5秒更新一次;
+			dwTickCount = GetTickCount();
+			vtNotifyReboot.clear();
+			vtNotifyShutdown.clear();
+			GLOBAL::Split(GLOBAL::g_stSATConfig.szTVReboot, _T(";"), vtNotifyReboot);
+			GLOBAL::Split(GLOBAL::g_stSATConfig.szTVShutdown, _T(";"), vtNotifyShutdown);
+		}
+
+		// 串口是否变更;
+		if ( _tcsicmp(szLastPort, GLOBAL::g_stSATConfig.szTVPort) )
+		{
+			_tcscpy_s(szLastPort, GLOBAL::g_stSATConfig.szTVPort);
+			// 重启打开串口;
+			tv.CloseSerialPort();
+		}
+
+		if ( !tv.IsOpen() )
+		{
+			tv.OpenSerialPort(szLastPort, 115200, 8, 0, 1, 0, 1000);
+		}
+
+		if ( tv.IsOpen() )
+		{
+			BYTE szBuffer[1024] = {0};
+			DWORD dwBuffer = tv.ReadComm(szBuffer, 1024, 1000);
+			if ( dwBuffer != 0 )
+			{
+				int nType = 0; // 0表示无异常类型,-1表示关机异常,1表示重启异常;
+				bool bAbnormal = false;
+				buffer = (char*)szBuffer;
+				__time64_t gmt = time(NULL);// 获取当前日历时间(1900-01-01开始的Unix时间戳);
+				// 遍历是否有符合的子串;		
+				for ( std::vector<std::string>::iterator it = vtNotifyReboot.begin(); it != vtNotifyReboot.end(); it++ )
+				{
+					if ( _tcsstr(buffer.c_str(), it->c_str()) )
+					{
+						nType = 1;
+						bAbnormal = true;
+						break;
+					}
+				}
+
+				if ( !bAbnormal )
+				{
+					for ( std::vector<std::string>::iterator it = vtNotifyShutdown.begin(); it != vtNotifyShutdown.end(); it++ )
+					{
+						if ( _tcsstr(buffer.c_str(), it->c_str()) )
+						{
+							nType = -1;
+							bAbnormal = true;
+							break;
+						}
+					}
+				}
+
+				// 1分钟前,是否有收到脚本通知;
+				if ( Global::g_notify.notify )
+				{
+					__int64 nd = gmt - Global::g_notify.datetime;
+#ifdef _DEBUG
+					TRACE3("判断时间%ld-通知时间%ld=相差时间%ld\n\n", gmt, Global::g_notify.datetime, nd);
+#endif
+					if ( nd < 60)
+					{
+						// 监测的类型与通知类型是否一致;
+						if ( (nType == 1 && Global::g_notify.report_type == _T("reboot")) ||
+							(nType == -1 && Global::g_notify.report_type == _T("shutdown")) ) 
+						{
+							bAbnormal = false;
+							// 重置;
+							Global::g_notify.notify = false;
+							Global::g_notify.datetime = 0;
+							Global::g_notify.report_type.clear();
+						}
+					}
+				}
+
+				if (bAbnormal)
+				{
+					if ( nType == -1 )
+					{
+						// 遥控:重启电视机;
+						if ( Global::g_SendPowerKey )
+							Global::g_SendPowerKey();
+					}
+
+					// 压入容器中;
+					Global::TLog tlog;
+					if ( nType == -1 )
+						tlog.report_type = "Abnormal shutdown";
+					else if ( nType == 1 )
+						tlog.report_type = "Abnormal restart";
+					tlog.datetime = gmt; // 发生时间;
+
+					struct tm gmtm = {0};
+					localtime_s(&gmtm, &gmt); // 时间戳转成本地时间;
+					TCHAR szDataTime[64] = {0};
+					_stprintf_s(szDataTime,_T("Time of exception:%04d-%02d-%02d %02d:%02d:%02d"), gmtm.tm_year + 1900, gmtm.tm_mon+1, gmtm.tm_mday, gmtm.tm_hour, gmtm.tm_min, gmtm.tm_sec);
+					tlog.report_data = szDataTime;
+					Global::g_vtAbnormal.push_back(tlog);
+
+					// 最后,重置;
+					Global::g_notify.notify = false;
+					Global::g_notify.datetime = 0;
+					Global::g_notify.report_type.clear();
+				}
+			}
+		}
+
+		Sleep(200);
+	}
+*/
+	return 0;
+}

+ 2 - 0
SATService/SATService/SATExecutor.h

@@ -127,6 +127,8 @@ public:
 	static DWORD WINAPI HearbeatThread(LPVOID lpVoid);
 	static DWORD WINAPI HearbeatThread(LPVOID lpVoid);
 	// 执行线程;
 	// 执行线程;
 	static DWORD WINAPI ExecuteScriptThread(LPVOID lpVoid);
 	static DWORD WINAPI ExecuteScriptThread(LPVOID lpVoid);
+	// 监听异常关机重启;
+	static DWORD WINAPI WathTVPortThread(LPVOID lpVoid);
 };
 };
 
 
 
 

+ 8 - 0
SATService/SATService/SATService.vcproj

@@ -374,6 +374,14 @@
 				RelativePath=".\SATExecutor.h"
 				RelativePath=".\SATExecutor.h"
 				>
 				>
 			</File>
 			</File>
+			<File
+				RelativePath=".\SynSerial.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\SynSerial.h"
+				>
+			</File>
 		</Filter>
 		</Filter>
 		<Filter
 		<Filter
 			Name="tinyxml"
 			Name="tinyxml"