Эх сурвалжийг харах

#IQRV #comment GPIO 添加 GetDevInfo 接口

80374374 1 жил өмнө
parent
commit
5c7b60c0d0

+ 13 - 1
Module/mod_gpio/Gpio.xml

@@ -27,6 +27,18 @@
 				<param name="reserved1" type="int" />
 				<param name="reserved2" type="string" />
 			</res>			
-		</twoway>			
+		</twoway>
+		<twoway name="GetDevInfo" overlap="true" method_id="65535">
+			<req>
+			</req>
+			<res>
+				<param name="type" type="string" />
+				<param name="model" type="string" />
+				<param name="version" type="string" />
+				<param name="state" type="int" />
+			</res>
+		</twoway>
+		<oneway name="Exit" overlap="true">			
+		</oneway>		
 	</class>
 </entity>

+ 5 - 5
Module/mod_gpio/Gpio_UserErrorCode.h

@@ -3,12 +3,12 @@
 #pragma once
 
 #define GPIO_UserErrorCode_Start				0x20900200
-#define GPIO_UserErrorCode_LogInfoAboutTerm		(GPIO_UserErrorCode_Start + 1)
-#define GPIO_UserErrorCode_RootInfo				(GPIO_UserErrorCode_Start + 2)
-#define GPIO_UserErrorCode_Real_Root_Config		(GPIO_UserErrorCode_Start + 3)
+#define GPIO_UserErrorCode_LogInfoAboutTerm		0x20900201
+#define GPIO_UserErrorCode_RootInfo				0x20900202
+#define GPIO_UserErrorCode_Real_Root_Config		0x20900203
 
 //adapter func failed
-#define GPIO_UserErrorCode_DevOpen_Failed						(GPIO_UserErrorCode_Start + 4)
-#define GPIO_UserErrorCode_GetDevCategory_Failed				(GPIO_UserErrorCode_Start + 5)
+#define GPIO_UserErrorCode_DevOpen_Failed		0x20900204
+#define GPIO_UserErrorCode_GetDevCategory_Failed	0x20900205
 
 #endif //_CONTACTLESSCARD_USER_ERRORCODE_H

+ 63 - 0
Module/mod_gpio/Gpio_client_g.h

@@ -171,6 +171,69 @@ public:
 		return Error;
 	}
 
+	ErrorCodeEnum GetDevInfo(GpioService_GetDevInfo_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(GpioService_Method_GetDevInfo, GpioService_MethodSignature_GetDevInfo, Buf, spAsyncWait, m_context, dwTimeout);
+		m_context.clear();
+		return ret;
+	}
+	ErrorCodeEnum GetDevInfo(GpioService_GetDevInfo_Req &Req, GpioService_GetDevInfo_Ans &Ans, DWORD dwTimeout)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetDevInfo(Req, spAsyncWait, dwTimeout);
+		if (Error == Error_Succeed) {
+			bool bEnd = false;
+			Error = SpWaitAnswerObject(spAsyncWait, Ans, bEnd, dwTimeout);
+			LOG_ASSERT(Error || bEnd);
+		}
+		return Error;
+	}
+	ErrorCodeEnum GetDevInfo(GpioService_GetDevInfo_Req &Req, GpioService_GetDevInfo_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError, CSimpleString &str)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetDevInfo(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 GetDevInfo(GpioService_GetDevInfo_Req &Req, GpioService_GetDevInfo_Ans &Ans, DWORD dwTimeout, DWORD &dwUserError)
+	{
+		CSmartPointer<IAsynWaitSp> spAsyncWait;
+		ErrorCodeEnum Error = GetDevInfo(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 Exit()
+	{
+		CSmartPointer<IClientSessionFunction> pFunc = GetFunction();
+		if (m_context.checkEmpty())
+		{
+			m_context.AutoGenerate();
+			DbgToBeidou(m_context, m_pEntityBase != NULL ? m_pEntityBase->GetEntityName() : "")();
+			m_context = m_context.upgradeLink();
+		}
+		auto ret = pFunc->OnewayCall(GpioService_Method_Exit, GpioService_MethodSignature_Exit, m_context);
+		m_context.clear();
+		return ret;
+	}
+
 
 	bool SafeDelete()
 	{

+ 38 - 0
Module/mod_gpio/Gpio_def_g.h

@@ -15,14 +15,20 @@ namespace Gpio {
 #define GpioService_Method_Set 0
 #define GpioService_Method_GetStatus 1
 #define GpioService_Method_QueryCurrSet 2
+#define GpioService_Method_GetDevInfo 65535
+#define GpioService_Method_Exit 3
 
 #define GpioService_MethodSignature_Set 1228126872
 #define GpioService_MethodSignature_GetStatus 1783612278
 #define GpioService_MethodSignature_QueryCurrSet -1281718647
+#define GpioService_MethodSignature_GetDevInfo -70806533
+#define GpioService_MethodSignature_Exit -736432874
 
 #define GpioService_LogCode_Set "QLR040220900"
 #define GpioService_LogCode_GetStatus "QLR040220901"
 #define GpioService_LogCode_QueryCurrSet "QLR040220902"
+#define GpioService_LogCode_GetDevInfo "QLR040220999"
+#define GpioService_LogCode_Exit "QLR040220903"
 
 struct GpioService_Set_Info
 {
@@ -84,6 +90,38 @@ struct GpioService_QueryCurrSet_Ans
 
 };
 
+struct GpioService_GetDevInfo_Req
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
+struct GpioService_GetDevInfo_Ans
+{
+	CSimpleStringA type;
+	CSimpleStringA model;
+	CSimpleStringA version;
+	int state;
+
+	void Serialize(SpBuffer &Buf)
+	{
+		auto & buf = Buf & type & model & version & state;
+	}
+
+};
+
+struct GpioService_Exit_Info
+{
+
+	void Serialize(SpBuffer &Buf)
+	{
+	}
+
+};
+
 
 ///////////////////////////
 

+ 54 - 0
Module/mod_gpio/Gpio_server_g.h

@@ -51,6 +51,20 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case GpioService_Method_GetDevInfo:
+			if (dwSignature == GpioService_MethodSignature_GetDevInfo) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case GpioService_Method_Exit:
+			if (dwSignature == GpioService_MethodSignature_Exit) {
+				bOverlap = true;
+			} else {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -77,6 +91,16 @@ public:
 				Error = Error_MethodSignatureFailed;
 			}
 			break;
+		case GpioService_Method_GetDevInfo:
+			if (dwSignature != GpioService_MethodSignature_GetDevInfo) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
+		case GpioService_Method_Exit:
+			if (dwSignature != GpioService_MethodSignature_Exit) {
+				Error = Error_MethodSignatureFailed;
+			}
+			break;
 		default:
 			Error = Error_MethodNotFound;
 			break;
@@ -99,6 +123,16 @@ public:
 	/// override by user
 	}
 
+	virtual void Handle_GetDevInfo(SpReqAnsContext<GpioService_GetDevInfo_Req, GpioService_GetDevInfo_Ans>::Pointer ctx)
+	{
+	/// override by user
+	}
+
+	virtual void Handle_Exit(SpOnewayCallContext<GpioService_Exit_Info>::Pointer ctx)
+	{
+	/// override by user
+	}
+
 	virtual void OnRequest(CSmartPointer<ITransactionContext> pTransactionContext)
 	{
 		CAutoBuffer Buf;
@@ -145,6 +179,26 @@ public:
 						Handle_QueryCurrSet(ctx);
 					}
 					break;
+				case GpioService_Method_GetDevInfo:
+					{
+						SpReqAnsContext<GpioService_GetDevInfo_Req,GpioService_GetDevInfo_Ans>::Pointer ctx;
+						ctx.Attach(new SpReqAnsContext<GpioService_GetDevInfo_Req,GpioService_GetDevInfo_Ans>(pTransactionContext));
+						SpBuffer2Object(Buf, ctx->Req);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_GetDevInfo(ctx);
+					}
+					break;
+				case GpioService_Method_Exit:
+					{
+						SpOnewayCallContext<GpioService_Exit_Info>::Pointer ctx;
+						ctx.Attach(new SpOnewayCallContext<GpioService_Exit_Info>());
+						SpBuffer2Object(Buf, ctx->Info);
+						pTransactionContext->GetLinkContext(ctx->link);
+						EntityResource::setLink(ctx->link);
+						Handle_Exit(ctx);
+					}
+					break;
 				default:
 					assert(0);
 					break;

+ 92 - 25
Module/mod_gpio/mod_gpio.cpp

@@ -170,6 +170,19 @@ void CGpioServiceSession::Handle_QueryCurrSet(SpReqAnsContext<GpioService_QueryC
     ctx->Answer(Error_NotSupport);
 }
 
+void CGpioServiceSession::Handle_GetDevInfo(SpReqAnsContext<GpioService_GetDevInfo_Req,
+    GpioService_GetDevInfo_Ans>::Pointer ctx)
+{
+    DbgToBeidou(ctx->link, __FUNCTION__)();
+    m_pEntity->GetDevInfo(ctx);
+}
+
+void CGpioServiceSession::Handle_Exit(SpOnewayCallContext<GpioService_Exit_Info>::Pointer ctx)
+{
+    DbgToBeidou(ctx->link, __FUNCTION__)();
+    m_pEntity->Exit(ctx);
+}
+
 bool isnostr(const char* str)
 {
     int len = strlen(str);
@@ -231,8 +244,7 @@ struct GpioInitTask : public ITaskSp {
 		ErrorCodeEnum err = m_entity->Initial();
 		if (err == Error_Succeed)
 		{
-			LOG_TRACE("Gpio open succeeded.");
-
+            DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Gpio open succeeded.");
 			//oiltest 20130118 for audiodg handle
 			m_entity->GetStatus(PHONEPICKUP, NULL);
 
@@ -256,7 +268,7 @@ struct GpioInitTask : public ITaskSp {
 		else
 		{
 			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("gpio open failed(%d).", err); 
-			m_pTransactionContext->SendAnswer(Error_Unexpect);
+			m_pTransactionContext->SendAnswer(Error_Succeed);
 		}
 	}
 };
@@ -444,6 +456,7 @@ ErrorCodeEnum CGpioEntity::Initial()
                 LogWarn(Severity_Middle, Error_Unexpect, GPIO_UserErrorCode_GetDevCategory_Failed, errMsg.GetData());
             }
             initTries = 0;
+            m_bOpened = true;
             break;
         } else {
 			DevErrorInfo devErrInfo;
@@ -458,30 +471,32 @@ ErrorCodeEnum CGpioEntity::Initial()
         }
     } while (initTries < MAX_GPIO_INIT_TRIES);
 
-    if (initTries != 0) {
-        LOG_TRACE("open gpio failed.");
+    if (!m_bOpened) {
+        DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("open gpio failed.");
         err = Error_DevConnFailed;
     }
-
-    if (!m_bFuncVer2) {
-		err = m_hDevHelper->WritePort(0, 0x00);
-		if (err != Error_Succeed)
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("write ports(0) returned: %s)", SpStrError(err));
-		err = m_hDevHelper->WritePort(1, 0x00);
-		if (err != Error_Succeed)
-			DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("write ports(1) returned: %s)", SpStrError(err));
-		if (m_bNewVersion) {
-			err = m_hDevHelper->WritePort(3, 0x00);
-			if (err != Error_Succeed)
-				DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("write ports(3) returned: %s)", SpStrError(err));
-		}
-    } else {
+    else {
+        if (!m_bFuncVer2) {
+            eErrDev = m_hDevHelper->WritePort(0, 0x00);
+            if (eErrDev != Error_Succeed)
+                DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("write ports(0) returned: %s)", SpStrError(eErrDev));
+            eErrDev = m_hDevHelper->WritePort(1, 0x00);
+            if (eErrDev != Error_Succeed)
+                DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("write ports(1) returned: %s)", SpStrError(eErrDev));
+            if (m_bNewVersion) {
+                eErrDev = m_hDevHelper->WritePort(3, 0x00);
+                if (eErrDev != Error_Succeed)
+                    DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("write ports(3) returned: %s)", SpStrError(eErrDev));
+            }
+        }
+        else {
 #if defined(RVC_OS_LINUX)
-		err = m_hDevHelper->SetStatus(GPIO_DEV_SN_LIGHT_SENSOR_ALL, GPIO_DEV_LIGHT_MODE_RESET);
-		DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("write resetone returned: %s)", SpStrError(err));
+            eErrDev = m_hDevHelper->SetStatus(GPIO_DEV_SN_LIGHT_SENSOR_ALL, GPIO_DEV_LIGHT_MODE_RESET);
+            DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("write resetone returned: %s)", SpStrError(eErrDev));
 #endif //RVC_OS_LINUX
+        }
     }
-
+    
     //oilyang@20170214 
     eErrDev = Error_Unexpect;
     CSmartPointer<IConfigInfo> spConfigRun;
@@ -499,6 +514,7 @@ ErrorCodeEnum CGpioEntity::Initial()
     m_moveDisappearTimes = m_moveHoldTimes;
     m_eMachineType = SP::Module::Comm::GetTerminalMachineInfo(this).type;
     DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("machine type: %s", SP::Module::Comm::Type2Str(m_eMachineType));
+
     return err;
 }
 
@@ -612,8 +628,13 @@ void CGpioEntity::OnLog(const CAutoArray<CUUID>& SubIDs, const CUUID nLogID, con
         DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("unkown event: 0x%X", dwUserCode);
         return;
     }
-    DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("devseq[%d],mode[%d]close[%d]", Req.devseq, Req.mode, Req.close);
-    m_bFuncVer2 ? SetEx(Req) : Set(Req);
+    if (m_bOpened) {
+        DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("devseq[%d],mode[%d]close[%d]", Req.devseq, Req.mode, Req.close);
+        m_bFuncVer2 ? SetEx(Req) : Set(Req);
+    }
+    else {
+        DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("devseq[%d],mode[%d]close[%d] cannot do that bcz devopen failed", Req.devseq, Req.mode, Req.close);
+    }
 }
 
 void CGpioEntity::WritePin(DWORD dwPinSeq, bool bHighLevel)
@@ -829,7 +850,7 @@ void CGpioEntity::Set(GpioService_Set_Info req)
 void CGpioEntity::GetStatus(int deviceSeq, SpReqAnsContext<GpioService_GetStatus_Req, GpioService_GetStatus_Ans>::Pointer ctx)
 {
     /** 注意设备序号是实体内定义的逻辑,不是设备端口号,用作于计时器的ID去了*/
-    DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("GetStatus with devseq %d", deviceSeq);
+    DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("GetStatus with devseq %d", deviceSeq);
     if (deviceSeq == PHONEPICKUP) {
         CSimpleStringA initDriver = "";
         int devicePort;
@@ -877,6 +898,52 @@ void CGpioEntity::OnPositiveFlickerResetTimerout(void* pData)
     GetFunction()->SetTimer(pSCI->timerID, pListener, pSCI->setTime);
 }
 
+void CGpioEntity::OnSelfTest(EntityTestEnum eTestType, CSmartPointer<ITransactionContext> pTransactionContext)
+{
+    if (!m_bOpened && m_hDevHelper) {
+        DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("let selftest to restart it!");
+        pTransactionContext->SendAnswer(Error_InvalidState);
+        return;
+    }
+    else if(!m_bOpened) {
+        DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("process failed before DevOpen, do not try to restart");
+        pTransactionContext->SendAnswer(Error_Succeed);
+        return;
+    }
+    pTransactionContext->SendAnswer(Error_Succeed);
+    return;
+}
+
+void CGpioEntity::GetDevInfo(SpReqAnsContext<GpioService_GetDevInfo_Req, GpioService_GetDevInfo_Ans>::Pointer ctx)
+{
+    if (!m_bOpened) {
+        DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(GpioService_LogCode_GetDevInfo).setResultCode("RTA2901")("GPIO未打开");
+        ctx->Answer(Error_DevNotAvailable, GPIO_UserErrorCode_DevOpen_Failed);
+    }
+    else {
+        DevCategoryInfo info = { 0 };
+        const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
+        ErrorCodeEnum erroCode = m_hDevHelper->GetDevCategory(info);
+        const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
+        if (erroCode == Error_Succeed) {
+            ctx->Ans.model = info.szModel;
+            ctx->Ans.state = (int)info.eState;
+            ctx->Ans.type = info.szType;
+            ctx->Ans.version = CSimpleStringA::Format("%d.%d.%d.%d",
+                info.version.wMajor, info.version.wMinor, info.version.wRevision, info.version.wBuild);
+            DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(GpioService_LogCode_GetDevInfo)
+                .setAPI("DevAdapter::GetDevCategory").setCostTime(ullEnd - ullStart)("model: %s, state:%d, type:%s, version:%s"
+                , ctx->Ans.model.GetData(), ctx->Ans.state, ctx->Ans.type.GetData(), ctx->Ans.version.GetData());
+            ctx->Answer(erroCode);
+        }
+        else {
+            DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(GpioService_LogCode_GetDevInfo).setAPI("DevAdapter::GetDevCategory")
+                .setCostTime(ullEnd - ullStart).setResultCode("RTA2904")("GetDevInfo failed: %s", SpStrError(erroCode));
+            ctx->Answer(erroCode, GPIO_UserErrorCode_GetDevCategory_Failed);
+        }
+    }
+}
+
 //老接口,用于控制灯
 bool CGpioEntity::SetOutDriving(GpioService_Set_Info req, OutDrivingInfo od, ULONG iIndex, ULONG pinSeq)
 {

+ 13 - 1
Module/mod_gpio/mod_gpio.h

@@ -110,6 +110,9 @@ public:
 	virtual void Handle_Set(SpOnewayCallContext<GpioService_Set_Info>::Pointer ctx);
 	virtual void Handle_GetStatus(SpReqAnsContext<GpioService_GetStatus_Req, GpioService_GetStatus_Ans>::Pointer ctx);
 	virtual void Handle_QueryCurrSet(SpReqAnsContext<GpioService_QueryCurrSet_Req, GpioService_QueryCurrSet_Ans>::Pointer ctx);
+	virtual void Handle_GetDevInfo(SpReqAnsContext<GpioService_GetDevInfo_Req,
+		GpioService_GetDevInfo_Ans>::Pointer ctx);
+	virtual void Handle_Exit(SpOnewayCallContext<GpioService_Exit_Info>::Pointer ctx);
 private:
 	CGpioEntity* m_pEntity;
 };
@@ -149,7 +152,7 @@ public:
 		, m_pLogListener(NULL), m_bHeadLightFlag(false), m_headlightDevPort(0), m_moveHoldTimes(0)
 		, m_moveDisappearTimes(0),m_eMachineType(SP::Module::Comm::RVC_UNKNOWN)
 		, m_bNewVersion(FALSE), m_bFuncVer2(FALSE), m_FirstStart(true)
-		, m_csDevNo(true), m_port(true), m_portNum(true), m_Baudrate(true)
+		, m_csDevNo(true), m_port(true), m_portNum(true), m_Baudrate(true), m_bOpened(false)
 	{
 		m_timerID = 1;
 		currDevStatus.dir = 0x3eFC0;
@@ -191,6 +194,13 @@ public:
 		return new CGpioServiceSession(this);
 	}
 
+	void OnSelfTest(EntityTestEnum eTestType, CSmartPointer<ITransactionContext> pTransactionContext);
+
+	void Exit(SpOnewayCallContext<GpioService_Exit_Info>::Pointer ctx) {}
+
+	void GetDevInfo(SpReqAnsContext<GpioService_GetDevInfo_Req,
+		GpioService_GetDevInfo_Ans>::Pointer ctx);
+
 	bool SetOutDriving(GpioService_Set_Info req,OutDrivingInfo od, ULONG iIndex,ULONG devSeq);
 
 	bool GetReceiving(int deviceSeq,ReceivingInfo ri, ULONG iIndex);
@@ -263,6 +273,8 @@ private:
 	CSimpleStringA m_portNum;
 	CSimpleStringA m_Baudrate;
 	bool m_FirstStart;
+
+	bool m_bOpened;
 };
 
 template<class T>