Пример #1
0
BOOL CElemCycleStep::bFindRqAndExecuteFromIHM(long lExtraHeader,BOOL bCanRead, BOOL bCanWrite,BYTE *pBufferIn,long lSizeIn,BYTE *pBufferOut, long *plSizeOut,long lSizeOutMax,CEnumInterface &EnumInterface)
{
	BOOL bReturn = FALSE;
	CElemExchangeJbus *pElem = NULL;
	CContext Context;
	int iNbrTrame;
	int iNbrRetry = NBR_RETRY_EXCHANGE;
	CThreadInterface *pInterface = NULL;

	// recherche de l'interface de sortie
	pInterface = EnumInterface.pGetSelectedInterface(*pBufferIn);
	*plSizeOut = 0;

	if (pInterface)
	{
		// si c'est un message de l'IHM
		if (EnumInterface.bSelectedInterfaceIsSocketIHM(pInterface)) 
		{
			iNbrTrame = m_ListExchangeRealTime.iGetCount();
			if ((lExtraHeader > -1) && (lExtraHeader < iNbrTrame))
			{
				if (pElem = (CElemExchangeJbus*)m_ListExchangeRealTime.pGetAt(lExtraHeader))
				{
					if (pElem->m_pTrameJbusRQ && pElem->m_pTrameJbusRP)
					{
						if (pElem->m_pTrameJbusRQ->bAccessAllowed(bCanRead,bCanWrite))
						{
							// verif de la taille en retour
							Context.Reset(TRUE,NULL,pBufferOut,lSizeOutMax,pInterface->bGetModeInteger(),FALSE);
							if (pElem->m_pTrameJbusRP->iGetStreamSize(Context) <= lSizeOutMax)
							{
								// verif si c'est la bonne trame et mise à jour
								if (bReturn = pElem->m_pTrameJbusRQ->bUpdateData(pBufferIn,lSizeIn,Context.m_bModeInteger))
								{
									// recup de la reponse RP
									*plSizeOut = pElem->m_pTrameJbusRP->iGetStreamSize(Context);
									if (pElem->m_pTrameJbusRP->bSerialize(Context))
									{
										bReturn = TRUE;
									}
								}
							}
						}
					}
				}
			}
		}
		// trame pas pour cette interface
		else /// carte io ou mesure
		{
			do
			{
				// ecriture et lecture sur l'interface serie (IO ou mesure
				if (bReturn = pInterface->bWriteAndRead(-1,pBufferIn,lSizeIn,pBufferOut,lSizeOutMax,lSizeOutMax,plSizeOut,TRUE))
				{
					// recup de la taille du buffer de sortie a retransmettre vers IHM en l'état
				}
			}
			while (!bReturn && (iNbrRetry-- > 0));
		}
	}

	if (!bReturn) 
	{
		TRACE_DEBUG(eDebug,eComSocket,_T(__FILE__),_T(__FUNCTION__),__LINE__,_T("Error: %s"),szGetLabel());
		TRACE_DEBUG_IHM(eError,eComSocket,eErrorFindRqAndExecuteFromIHM);
	}
	return bReturn;
}
Пример #2
0
BOOL CElemCycleStep::bExecuteNumExchange(int iNum,CElemList *pListExchange, BOOL bCanRead, BOOL bCanWrite,CEnumInterface &EnumInterface)
{
	BOOL bReturn = TRUE;
	CElemExchangeJbus *pElem = NULL;
	BYTE aBuffer[10240];
	CContext Context;
	int iNbrTrame;
	long iSizeToWrite;
	long iSizeToRead;
	int iNbrRetry = NBR_RETRY_EXCHANGE;
	CThreadInterface *pInterface = NULL;

	iNbrTrame = pListExchange->iGetCount();

	if ((iNum < iNbrTrame) && (iNum > -1))
	{
		if (pElem = (CElemExchangeJbus*)pListExchange->pGetAt(iNum))
		{
			if (pElem->m_pTrameJbusRQ && pElem->m_pTrameJbusRP)
			{
				if (pElem->m_pTrameJbusRQ->bAccessAllowed(bCanRead,bCanWrite))
				{

					if (pInterface = EnumInterface.pGetSelectedInterface(pElem->m_pTrameJbusRQ->ucGetNumDest()))
					{
						iNbrRetry = NBR_RETRY_EXCHANGE;
						do
						{
							Context.Reset(TRUE,NULL,aBuffer,sizeof(aBuffer),pInterface->bGetModeInteger(),FALSE);
							iSizeToWrite = pElem->m_pTrameJbusRQ->iGetStreamSize(Context);
							if (iSizeToWrite < sizeof(aBuffer))
							{
								if (bReturn = pElem->m_pTrameJbusRQ->bSerialize(Context))
								{
									iSizeToWrite = Context.iGetCurrentSize();
									iSizeToRead = pElem->m_pTrameJbusRP->iGetStreamSize(Context);
									if (iSizeToRead < Context.m_iSize)
									{
										
										if (bReturn = pInterface->bWriteAndRead(iNum,Context.m_pBuffStart,iSizeToWrite,aBuffer,iSizeToRead,Context.m_iSize, &iSizeToRead,FALSE))
										{
											bReturn = pElem->m_pTrameJbusRP->bUpdateData(aBuffer,iSizeToRead,Context.m_bModeInteger);
											if (!bReturn) 
											{
												TRACE_DEBUG(eDebug,eCycle,_T(__FILE__),_T(__FUNCTION__),__LINE__,_T("Error bUpdateData: %s"),szGetLabel());
											}
											

										}
										Sleep(DW_DELAI_INTER_TRAME);// delai inter-trame
										
									}
									else
									{
										TRACE_DEBUG(eDebug,eConfig,_T(__FILE__),_T(__FUNCTION__),__LINE__,_T("taille buffer d'échange trop petit, taille buffer = %d, taille trame = %d"),Context.m_iSize,iSizeToRead);
									}
								}
							}
						}
						while (!bReturn && (iNbrRetry-- > 0));
					}
				}
			}

		}
	}
	else
		TRACE_LOG_MSG(_T("(iNum < iNbrTrame) && (iNum > -1)"));

	if (!bReturn) 
	{
		TRACE_DEBUG(eError,eCycle,_T(__FILE__),_T(__FUNCTION__),__LINE__,_T("Erreur de com avec la carte n°%u"), (pElem)?pElem->m_pTrameJbusRQ->ucGetNumDest():99);
	}
	return bReturn;
}