From 833dfbe746f85898dcbcf421c1177c3fd5773ff2 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 19 Dec 2008 17:11:52 -0800 Subject: Staging: epl: run Lindent on *.c files It's a start, still a mess... Cc: Daniel Krueger Cc: Ronald Sieber Signed-off-by: Greg Kroah-Hartman --- drivers/staging/epl/EplSdoComu.c | 5007 ++++++++++++++++++++------------------ 1 file changed, 2662 insertions(+), 2345 deletions(-) (limited to 'drivers/staging/epl/EplSdoComu.c') diff --git a/drivers/staging/epl/EplSdoComu.c b/drivers/staging/epl/EplSdoComu.c index ce5af66bfed..ce0eb33f4c4 100644 --- a/drivers/staging/epl/EplSdoComu.c +++ b/drivers/staging/epl/EplSdoComu.c @@ -73,16 +73,16 @@ #if ((((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) == 0) &&\ (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) == 0) ) - #error 'ERROR: At least SDO Server or SDO Client should be activate!' +#error 'ERROR: At least SDO Server or SDO Client should be activate!' #endif #if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0) - #if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) == 0) && (EPL_OBD_USE_KERNEL == FALSE) +#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) == 0) && (EPL_OBD_USE_KERNEL == FALSE) - #error 'ERROR: SDO Server needs OBDu module!' +#error 'ERROR: SDO Server needs OBDu module!' - #endif +#endif #endif @@ -102,116 +102,101 @@ #define EPL_MAX_SDO_COM_CON 5 #endif - //--------------------------------------------------------------------------- // local types //--------------------------------------------------------------------------- // intern events -typedef enum -{ - kEplSdoComConEventSendFirst = 0x00, // first frame to send - kEplSdoComConEventRec = 0x01, // frame received - kEplSdoComConEventConEstablished= 0x02, // connection established - kEplSdoComConEventConClosed = 0x03, // connection closed - kEplSdoComConEventAckReceived = 0x04, // acknowledge received by lower layer - // -> continue sending - kEplSdoComConEventFrameSended = 0x05, // lower has send a frame - kEplSdoComConEventInitError = 0x06, // error duringinitialisiation - // of the connection - kEplSdoComConEventTimeout = 0x07 // timeout in lower layer +typedef enum { + kEplSdoComConEventSendFirst = 0x00, // first frame to send + kEplSdoComConEventRec = 0x01, // frame received + kEplSdoComConEventConEstablished = 0x02, // connection established + kEplSdoComConEventConClosed = 0x03, // connection closed + kEplSdoComConEventAckReceived = 0x04, // acknowledge received by lower layer + // -> continue sending + kEplSdoComConEventFrameSended = 0x05, // lower has send a frame + kEplSdoComConEventInitError = 0x06, // error duringinitialisiation + // of the connection + kEplSdoComConEventTimeout = 0x07 // timeout in lower layer #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) + , - , - - kEplSdoComConEventInitCon = 0x08, // init connection (only client) - kEplSdoComConEventAbort = 0x09 // abort sdo transfer (only client) + kEplSdoComConEventInitCon = 0x08, // init connection (only client) + kEplSdoComConEventAbort = 0x09 // abort sdo transfer (only client) #endif +} tEplSdoComConEvent; - -}tEplSdoComConEvent; - -typedef enum -{ - kEplSdoComSendTypeReq = 0x00, // send a request - kEplSdoComSendTypeAckRes = 0x01, // send a resonse without data - kEplSdoComSendTypeRes = 0x02, // send response with data - kEplSdoComSendTypeAbort = 0x03 // send abort - -}tEplSdoComSendType; +typedef enum { + kEplSdoComSendTypeReq = 0x00, // send a request + kEplSdoComSendTypeAckRes = 0x01, // send a resonse without data + kEplSdoComSendTypeRes = 0x02, // send response with data + kEplSdoComSendTypeAbort = 0x03 // send abort +} tEplSdoComSendType; // state of the state maschine -typedef enum -{ - // General State - kEplSdoComStateIdle = 0x00, // idle state +typedef enum { + // General State + kEplSdoComStateIdle = 0x00, // idle state #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0) - // Server States - kEplSdoComStateServerSegmTrans = 0x01, // send following frames + // Server States + kEplSdoComStateServerSegmTrans = 0x01, // send following frames #endif - #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) - // Client States - kEplSdoComStateClientWaitInit = 0x10, // wait for init connection - // on lower layer - kEplSdoComStateClientConnected = 0x11, // connection established - kEplSdoComStateClientSegmTrans = 0x12 // send following frames + // Client States + kEplSdoComStateClientWaitInit = 0x10, // wait for init connection + // on lower layer + kEplSdoComStateClientConnected = 0x11, // connection established + kEplSdoComStateClientSegmTrans = 0x12 // send following frames #endif - - - } tEplSdoComState; - // control structure for transaction -typedef struct -{ - tEplSdoSeqConHdl m_SdoSeqConHdl; // if != 0 -> entry used - tEplSdoComState m_SdoComState; - BYTE m_bTransactionId; - unsigned int m_uiNodeId; // NodeId of the target - // -> needed to reinit connection - // after timeout - tEplSdoTransType m_SdoTransType; // Auto, Expedited, Segmented - tEplSdoServiceType m_SdoServiceType; // WriteByIndex, ReadByIndex - tEplSdoType m_SdoProtType; // protocol layer: Auto, Udp, Asnd, Pdo - BYTE* m_pData; // pointer to data - unsigned int m_uiTransSize; // number of bytes - // to transfer - unsigned int m_uiTransferredByte;// number of bytes - // already transferred - tEplSdoFinishedCb m_pfnTransferFinished;// callback function of the - // application - // -> called in the end of - // the SDO transfer - void* m_pUserArg; // user definable argument pointer - - DWORD m_dwLastAbortCode; // save the last abort code +typedef struct { + tEplSdoSeqConHdl m_SdoSeqConHdl; // if != 0 -> entry used + tEplSdoComState m_SdoComState; + BYTE m_bTransactionId; + unsigned int m_uiNodeId; // NodeId of the target + // -> needed to reinit connection + // after timeout + tEplSdoTransType m_SdoTransType; // Auto, Expedited, Segmented + tEplSdoServiceType m_SdoServiceType; // WriteByIndex, ReadByIndex + tEplSdoType m_SdoProtType; // protocol layer: Auto, Udp, Asnd, Pdo + BYTE *m_pData; // pointer to data + unsigned int m_uiTransSize; // number of bytes + // to transfer + unsigned int m_uiTransferredByte; // number of bytes + // already transferred + tEplSdoFinishedCb m_pfnTransferFinished; // callback function of the + // application + // -> called in the end of + // the SDO transfer + void *m_pUserArg; // user definable argument pointer + + DWORD m_dwLastAbortCode; // save the last abort code #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) - // only for client - unsigned int m_uiTargetIndex; // index to access - unsigned int m_uiTargetSubIndex; // subiondex to access + // only for client + unsigned int m_uiTargetIndex; // index to access + unsigned int m_uiTargetSubIndex; // subiondex to access - // for future use - unsigned int m_uiTimeout; // timeout for this connection + // for future use + unsigned int m_uiTimeout; // timeout for this connection #endif } tEplSdoComCon; // instance table -typedef struct -{ - tEplSdoComCon m_SdoComCon[EPL_MAX_SDO_COM_CON]; +typedef struct { + tEplSdoComCon m_SdoComCon[EPL_MAX_SDO_COM_CON]; #if defined(WIN32) || defined(_WIN32) - LPCRITICAL_SECTION m_pCriticalSection; - CRITICAL_SECTION m_CriticalSection; + LPCRITICAL_SECTION m_pCriticalSection; + CRITICAL_SECTION m_CriticalSection; #endif -}tEplSdoComInstance; +} tEplSdoComInstance; //--------------------------------------------------------------------------- // modul globale vars @@ -220,53 +205,50 @@ static tEplSdoComInstance SdoComInstance_g; //--------------------------------------------------------------------------- // local function prototypes //--------------------------------------------------------------------------- -tEplKernel PUBLIC EplSdoComReceiveCb (tEplSdoSeqConHdl SdoSeqConHdl_p, - tEplAsySdoCom* pAsySdoCom_p, - unsigned int uiDataSize_p); - +tEplKernel PUBLIC EplSdoComReceiveCb(tEplSdoSeqConHdl SdoSeqConHdl_p, + tEplAsySdoCom * pAsySdoCom_p, + unsigned int uiDataSize_p); -tEplKernel PUBLIC EplSdoComConCb (tEplSdoSeqConHdl SdoSeqConHdl_p, - tEplAsySdoConState AsySdoConState_p); +tEplKernel PUBLIC EplSdoComConCb(tEplSdoSeqConHdl SdoSeqConHdl_p, + tEplAsySdoConState AsySdoConState_p); -static tEplKernel EplSdoComSearchConIntern(tEplSdoSeqConHdl SdoSeqConHdl_p, - tEplSdoComConEvent SdoComConEvent_p, - tEplAsySdoCom* pAsySdoCom_p); +static tEplKernel EplSdoComSearchConIntern(tEplSdoSeqConHdl SdoSeqConHdl_p, + tEplSdoComConEvent SdoComConEvent_p, + tEplAsySdoCom * pAsySdoCom_p); -static tEplKernel EplSdoComProcessIntern(tEplSdoComConHdl SdoComCon_p, - tEplSdoComConEvent SdoComConEvent_p, - tEplAsySdoCom* pAsySdoCom_p); +static tEplKernel EplSdoComProcessIntern(tEplSdoComConHdl SdoComCon_p, + tEplSdoComConEvent SdoComConEvent_p, + tEplAsySdoCom * pAsySdoCom_p); -static tEplKernel EplSdoComTransferFinished(tEplSdoComConHdl SdoComCon_p, - tEplSdoComCon* pSdoComCon_p, - tEplSdoComConState SdoComConState_p); +static tEplKernel EplSdoComTransferFinished(tEplSdoComConHdl SdoComCon_p, + tEplSdoComCon * pSdoComCon_p, + tEplSdoComConState + SdoComConState_p); #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0) -static tEplKernel EplSdoComServerInitReadByIndex(tEplSdoComCon* pSdoComCon_p, - tEplAsySdoCom* pAsySdoCom_p); +static tEplKernel EplSdoComServerInitReadByIndex(tEplSdoComCon * pSdoComCon_p, + tEplAsySdoCom * pAsySdoCom_p); -static tEplKernel EplSdoComServerSendFrameIntern(tEplSdoComCon* pSdoComCon_p, - unsigned int uiIndex_p, - unsigned int uiSubIndex_p, - tEplSdoComSendType SendType_p); +static tEplKernel EplSdoComServerSendFrameIntern(tEplSdoComCon * pSdoComCon_p, + unsigned int uiIndex_p, + unsigned int uiSubIndex_p, + tEplSdoComSendType SendType_p); -static tEplKernel EplSdoComServerInitWriteByIndex(tEplSdoComCon* pSdoComCon_p, - tEplAsySdoCom* pAsySdoCom_p); +static tEplKernel EplSdoComServerInitWriteByIndex(tEplSdoComCon * pSdoComCon_p, + tEplAsySdoCom * pAsySdoCom_p); #endif - #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) -static tEplKernel EplSdoComClientSend(tEplSdoComCon* pSdoComCon_p); +static tEplKernel EplSdoComClientSend(tEplSdoComCon * pSdoComCon_p); -static tEplKernel EplSdoComClientProcessFrame(tEplSdoComConHdl SdoComCon_p, - tEplAsySdoCom* pAsySdoCom_p); +static tEplKernel EplSdoComClientProcessFrame(tEplSdoComConHdl SdoComCon_p, + tEplAsySdoCom * pAsySdoCom_p); -static tEplKernel EplSdoComClientSendAbort(tEplSdoComCon* pSdoComCon_p, - DWORD dwAbortCode_p); +static tEplKernel EplSdoComClientSendAbort(tEplSdoComCon * pSdoComCon_p, + DWORD dwAbortCode_p); #endif - - /***************************************************************************/ /* */ /* */ @@ -305,12 +287,11 @@ static tEplKernel EplSdoComClientSendAbort(tEplSdoComCon* pSdoComCon_p, //--------------------------------------------------------------------------- tEplKernel PUBLIC EplSdoComInit(void) { -tEplKernel Ret; - + tEplKernel Ret; - Ret = EplSdoComAddInstance(); + Ret = EplSdoComAddInstance(); -return Ret; + return Ret; } @@ -333,28 +314,27 @@ return Ret; //--------------------------------------------------------------------------- tEplKernel PUBLIC EplSdoComAddInstance(void) { -tEplKernel Ret; - - Ret = kEplSuccessful; + tEplKernel Ret; - // init controll structure - EPL_MEMSET(&SdoComInstance_g, 0x00, sizeof(SdoComInstance_g)); + Ret = kEplSuccessful; - // init instance of lower layer - Ret = EplSdoAsySeqAddInstance(EplSdoComReceiveCb, EplSdoComConCb); - if(Ret != kEplSuccessful) - { - goto Exit; - } + // init controll structure + EPL_MEMSET(&SdoComInstance_g, 0x00, sizeof(SdoComInstance_g)); + // init instance of lower layer + Ret = EplSdoAsySeqAddInstance(EplSdoComReceiveCb, EplSdoComConCb); + if (Ret != kEplSuccessful) { + goto Exit; + } #if defined(WIN32) || defined(_WIN32) - // create critical section for process function - SdoComInstance_g.m_pCriticalSection = &SdoComInstance_g.m_CriticalSection; - InitializeCriticalSection(SdoComInstance_g.m_pCriticalSection); + // create critical section for process function + SdoComInstance_g.m_pCriticalSection = + &SdoComInstance_g.m_CriticalSection; + InitializeCriticalSection(SdoComInstance_g.m_pCriticalSection); #endif -Exit: - return Ret; + Exit: + return Ret; } //--------------------------------------------------------------------------- @@ -376,25 +356,22 @@ Exit: //--------------------------------------------------------------------------- tEplKernel PUBLIC EplSdoComDelInstance(void) { -tEplKernel Ret; - - Ret = kEplSuccessful; + tEplKernel Ret; + Ret = kEplSuccessful; #if defined(WIN32) || defined(_WIN32) - // delete critical section for process function - DeleteCriticalSection(SdoComInstance_g.m_pCriticalSection); + // delete critical section for process function + DeleteCriticalSection(SdoComInstance_g.m_pCriticalSection); #endif - Ret = EplSdoAsySeqDelInstance(); - if(Ret != kEplSuccessful) - { - goto Exit; - } - + Ret = EplSdoAsySeqDelInstance(); + if (Ret != kEplSuccessful) { + goto Exit; + } -Exit: - return Ret; + Exit: + return Ret; } //--------------------------------------------------------------------------- @@ -421,110 +398,99 @@ Exit: // //--------------------------------------------------------------------------- #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) -tEplKernel PUBLIC EplSdoComDefineCon(tEplSdoComConHdl* pSdoComConHdl_p, - unsigned int uiTargetNodeId_p, - tEplSdoType ProtType_p) +tEplKernel PUBLIC EplSdoComDefineCon(tEplSdoComConHdl * pSdoComConHdl_p, + unsigned int uiTargetNodeId_p, + tEplSdoType ProtType_p) { -tEplKernel Ret; -unsigned int uiCount; -unsigned int uiFreeHdl; -tEplSdoComCon* pSdoComCon; - - // check Parameter - ASSERT(pSdoComConHdl_p != NULL); - - // check NodeId - if((uiTargetNodeId_p == EPL_C_ADR_INVALID) - ||(uiTargetNodeId_p >= EPL_C_ADR_BROADCAST)) - { - Ret = kEplInvalidNodeId; - - } - - // search free control structure - pSdoComCon = &SdoComInstance_g.m_SdoComCon[0]; - uiCount = 0; - uiFreeHdl = EPL_MAX_SDO_COM_CON; - while (uiCount < EPL_MAX_SDO_COM_CON) - { - if (pSdoComCon->m_SdoSeqConHdl == 0) - { // free entry - uiFreeHdl = uiCount; - } - else if ((pSdoComCon->m_uiNodeId == uiTargetNodeId_p) - && (pSdoComCon->m_SdoProtType == ProtType_p)) - { // existing client connection with same node ID and same protocol type - *pSdoComConHdl_p = uiCount; - Ret = kEplSdoComHandleExists; - goto Exit; - } - uiCount++; - pSdoComCon++; - } - - if (uiFreeHdl == EPL_MAX_SDO_COM_CON) - { - Ret = kEplSdoComNoFreeHandle; - goto Exit; - } - - pSdoComCon = &SdoComInstance_g.m_SdoComCon[uiFreeHdl]; - // save handle for application - *pSdoComConHdl_p = uiFreeHdl; - // save parameters - pSdoComCon->m_SdoProtType = ProtType_p; - pSdoComCon->m_uiNodeId = uiTargetNodeId_p; - - // set Transaction Id - pSdoComCon->m_bTransactionId = 0; - - // check protocol - switch(ProtType_p) - { - // udp - case kEplSdoTypeUdp: - { - // call connection int function of lower layer - Ret = EplSdoAsySeqInitCon(&pSdoComCon->m_SdoSeqConHdl, - pSdoComCon->m_uiNodeId, - kEplSdoTypeUdp); - if(Ret != kEplSuccessful) - { - goto Exit; - } - break; - } - - // Asend - case kEplSdoTypeAsnd: - { - // call connection int function of lower layer - Ret = EplSdoAsySeqInitCon(&pSdoComCon->m_SdoSeqConHdl, - pSdoComCon->m_uiNodeId, - kEplSdoTypeAsnd); - if(Ret != kEplSuccessful) - { - goto Exit; - } - break; - } - - // Pdo -> not supported - case kEplSdoTypePdo: - default: - { - Ret = kEplSdoComUnsupportedProt; - goto Exit; - } - }// end of switch(m_ProtType_p) - - // call process function - Ret = EplSdoComProcessIntern(uiFreeHdl, - kEplSdoComConEventInitCon, - NULL); - -Exit: - return Ret; + tEplKernel Ret; + unsigned int uiCount; + unsigned int uiFreeHdl; + tEplSdoComCon *pSdoComCon; + + // check Parameter + ASSERT(pSdoComConHdl_p != NULL); + + // check NodeId + if ((uiTargetNodeId_p == EPL_C_ADR_INVALID) + || (uiTargetNodeId_p >= EPL_C_ADR_BROADCAST)) { + Ret = kEplInvalidNodeId; + + } + // search free control structure + pSdoComCon = &SdoComInstance_g.m_SdoComCon[0]; + uiCount = 0; + uiFreeHdl = EPL_MAX_SDO_COM_CON; + while (uiCount < EPL_MAX_SDO_COM_CON) { + if (pSdoComCon->m_SdoSeqConHdl == 0) { // free entry + uiFreeHdl = uiCount; + } else if ((pSdoComCon->m_uiNodeId == uiTargetNodeId_p) + && (pSdoComCon->m_SdoProtType == ProtType_p)) { // existing client connection with same node ID and same protocol type + *pSdoComConHdl_p = uiCount; + Ret = kEplSdoComHandleExists; + goto Exit; + } + uiCount++; + pSdoComCon++; + } + + if (uiFreeHdl == EPL_MAX_SDO_COM_CON) { + Ret = kEplSdoComNoFreeHandle; + goto Exit; + } + + pSdoComCon = &SdoComInstance_g.m_SdoComCon[uiFreeHdl]; + // save handle for application + *pSdoComConHdl_p = uiFreeHdl; + // save parameters + pSdoComCon->m_SdoProtType = ProtType_p; + pSdoComCon->m_uiNodeId = uiTargetNodeId_p; + + // set Transaction Id + pSdoComCon->m_bTransactionId = 0; + + // check protocol + switch (ProtType_p) { + // udp + case kEplSdoTypeUdp: + { + // call connection int function of lower layer + Ret = EplSdoAsySeqInitCon(&pSdoComCon->m_SdoSeqConHdl, + pSdoComCon->m_uiNodeId, + kEplSdoTypeUdp); + if (Ret != kEplSuccessful) { + goto Exit; + } + break; + } + + // Asend + case kEplSdoTypeAsnd: + { + // call connection int function of lower layer + Ret = EplSdoAsySeqInitCon(&pSdoComCon->m_SdoSeqConHdl, + pSdoComCon->m_uiNodeId, + kEplSdoTypeAsnd); + if (Ret != kEplSuccessful) { + goto Exit; + } + break; + } + + // Pdo -> not supported + case kEplSdoTypePdo: + default: + { + Ret = kEplSdoComUnsupportedProt; + goto Exit; + } + } // end of switch(m_ProtType_p) + + // call process function + Ret = EplSdoComProcessIntern(uiFreeHdl, + kEplSdoComConEventInitCon, NULL); + + Exit: + return Ret; } #endif //--------------------------------------------------------------------------- @@ -545,84 +511,76 @@ Exit: // //--------------------------------------------------------------------------- #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) -tEplKernel PUBLIC EplSdoComInitTransferByIndex(tEplSdoComTransParamByIndex* pSdoComTransParam_p) +tEplKernel PUBLIC EplSdoComInitTransferByIndex(tEplSdoComTransParamByIndex * + pSdoComTransParam_p) { -tEplKernel Ret; -tEplSdoComCon* pSdoComCon; - - // check parameter - if ((pSdoComTransParam_p->m_uiSubindex >= 0xFF) - || (pSdoComTransParam_p->m_uiIndex == 0) - || (pSdoComTransParam_p->m_uiIndex > 0xFFFF) - || (pSdoComTransParam_p->m_pData == NULL) - || (pSdoComTransParam_p->m_uiDataSize == 0)) - { - Ret = kEplSdoComInvalidParam; - goto Exit; - } - - if(pSdoComTransParam_p->m_SdoComConHdl >= EPL_MAX_SDO_COM_CON) - { - Ret = kEplSdoComInvalidHandle; - goto Exit; - } - - // get pointer to control structure of connection - pSdoComCon = &SdoComInstance_g.m_SdoComCon[pSdoComTransParam_p->m_SdoComConHdl]; - - // check if handle ok - if(pSdoComCon->m_SdoSeqConHdl == 0) - { - Ret = kEplSdoComInvalidHandle; - goto Exit; - } - - // check if command layer is idle - if ((pSdoComCon->m_uiTransferredByte + pSdoComCon->m_uiTransSize) > 0) - { // handle is not idle - Ret = kEplSdoComHandleBusy; - goto Exit; - } - - // save parameter - // callback function for end of transfer - pSdoComCon->m_pfnTransferFinished = pSdoComTransParam_p->m_pfnSdoFinishedCb; - pSdoComCon->m_pUserArg = pSdoComTransParam_p->m_pUserArg; - - // set type of SDO command - if (pSdoComTransParam_p->m_SdoAccessType == kEplSdoAccessTypeRead) - { - pSdoComCon->m_SdoServiceType = kEplSdoServiceReadByIndex; - } - else - { - pSdoComCon->m_SdoServiceType = kEplSdoServiceWriteByIndex; - - } - // save pointer to data - pSdoComCon->m_pData = pSdoComTransParam_p->m_pData; - // maximal bytes to transfer - pSdoComCon->m_uiTransSize = pSdoComTransParam_p->m_uiDataSize; - // bytes already transfered - pSdoComCon->m_uiTransferredByte = 0; - - // reset parts of control structure - pSdoComCon->m_dwLastAbortCode = 0; - pSdoComCon->m_SdoTransType = kEplSdoTransAuto; - // save timeout - //pSdoComCon->m_uiTimeout = SdoComTransParam_p.m_uiTimeout; - - // save index and subindex - pSdoComCon->m_uiTargetIndex = pSdoComTransParam_p->m_uiIndex; - pSdoComCon->m_uiTargetSubIndex = pSdoComTransParam_p->m_uiSubindex; - - // call process function - Ret = EplSdoComProcessIntern(pSdoComTransParam_p->m_SdoComConHdl, - kEplSdoComConEventSendFirst, // event to start transfer - NULL); - -Exit: - return Ret; + tEplKernel Ret; + tEplSdoComCon *pSdoComCon; + + // check parameter + if ((pSdoComTransParam_p->m_uiSubindex >= 0xFF) + || (pSdoComTransParam_p->m_uiIndex == 0) + || (pSdoComTransParam_p->m_uiIndex > 0xFFFF) + || (pSdoComTransParam_p->m_pData == NULL) + || (pSdoComTransParam_p->m_uiDataSize == 0)) { + Ret = kEplSdoComInvalidParam; + goto Exit; + } + + if (pSdoComTransParam_p->m_SdoComConHdl >= EPL_MAX_SDO_COM_CON) { + Ret = kEplSdoComInvalidHandle; + goto Exit; + } + // get pointer to control structure of connection + pSdoComCon = + &SdoComInstance_g.m_SdoComCon[pSdoComTransParam_p->m_SdoComConHdl]; + + // check if handle ok + if (pSdoComCon->m_SdoSeqConHdl == 0) { + Ret = kEplSdoComInvalidHandle; + goto Exit; + } + // check if command layer is idle + if ((pSdoComCon->m_uiTransferredByte + pSdoComCon->m_uiTransSize) > 0) { // handle is not idle + Ret = kEplSdoComHandleBusy; + goto Exit; + } + // save parameter + // callback function for end of transfer + pSdoComCon->m_pfnTransferFinished = + pSdoComTransParam_p->m_pfnSdoFinishedCb; + pSdoComCon->m_pUserArg = pSdoComTransParam_p->m_pUserArg; + + // set type of SDO command + if (pSdoComTransParam_p->m_SdoAccessType == kEplSdoAccessTypeRead) { + pSdoComCon->m_SdoServiceType = kEplSdoServiceReadByIndex; + } else { + pSdoComCon->m_SdoServiceType = kEplSdoServiceWriteByIndex; + + } + // save pointer to data + pSdoComCon->m_pData = pSdoComTransParam_p->m_pData; + // maximal bytes to transfer + pSdoComCon->m_uiTransSize = pSdoComTransParam_p->m_uiDataSize; + // bytes already transfered + pSdoComCon->m_uiTransferredByte = 0; + + // reset parts of control structure + pSdoComCon->m_dwLastAbortCode = 0; + pSdoComCon->m_SdoTransType = kEplSdoTransAuto; + // save timeout + //pSdoComCon->m_uiTimeout = SdoComTransParam_p.m_uiTimeout; + + // save index and subindex + pSdoComCon->m_uiTargetIndex = pSdoComTransParam_p->m_uiIndex; + pSdoComCon->m_uiTargetSubIndex = pSdoComTransParam_p->m_uiSubindex; + + // call process function + Ret = EplSdoComProcessIntern(pSdoComTransParam_p->m_SdoComConHdl, kEplSdoComConEventSendFirst, // event to start transfer + NULL); + + Exit: + return Ret; } #endif @@ -645,53 +603,51 @@ Exit: // //--------------------------------------------------------------------------- #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) -tEplKernel PUBLIC EplSdoComUndefineCon(tEplSdoComConHdl SdoComConHdl_p) +tEplKernel PUBLIC EplSdoComUndefineCon(tEplSdoComConHdl SdoComConHdl_p) { -tEplKernel Ret; -tEplSdoComCon* pSdoComCon; - - Ret = kEplSuccessful; - - if(SdoComConHdl_p >= EPL_MAX_SDO_COM_CON) - { - Ret = kEplSdoComInvalidHandle; - goto Exit; - } - - // get pointer to control structure - pSdoComCon = &SdoComInstance_g.m_SdoComCon[SdoComConHdl_p]; - - // $$$ d.k. abort a running transfer before closing the sequence layer - - if(((pSdoComCon->m_SdoSeqConHdl & ~EPL_SDO_SEQ_HANDLE_MASK) != EPL_SDO_SEQ_INVALID_HDL) - && (pSdoComCon->m_SdoSeqConHdl != 0)) - { - // close connection in lower layer - switch(pSdoComCon->m_SdoProtType) - { - case kEplSdoTypeAsnd: - case kEplSdoTypeUdp: - { - Ret = EplSdoAsySeqDelCon(pSdoComCon->m_SdoSeqConHdl); - break; - } - - case kEplSdoTypePdo: - case kEplSdoTypeAuto: - default: - { - Ret = kEplSdoComUnsupportedProt; - goto Exit; - } - - }// end of switch(pSdoComCon->m_SdoProtType) - } - - - // clean controll structure - EPL_MEMSET(pSdoComCon, 0x00, sizeof(tEplSdoComCon)); -Exit: - return Ret; + tEplKernel Ret; + tEplSdoComCon *pSdoComCon; + + Ret = kEplSuccessful; + + if (SdoComConHdl_p >= EPL_MAX_SDO_COM_CON) { + Ret = kEplSdoComInvalidHandle; + goto Exit; + } + // get pointer to control structure + pSdoComCon = &SdoComInstance_g.m_SdoComCon[SdoComConHdl_p]; + + // $$$ d.k. abort a running transfer before closing the sequence layer + + if (((pSdoComCon->m_SdoSeqConHdl & ~EPL_SDO_SEQ_HANDLE_MASK) != + EPL_SDO_SEQ_INVALID_HDL) + && (pSdoComCon->m_SdoSeqConHdl != 0)) { + // close connection in lower layer + switch (pSdoComCon->m_SdoProtType) { + case kEplSdoTypeAsnd: + case kEplSdoTypeUdp: + { + Ret = + EplSdoAsySeqDelCon(pSdoComCon-> + m_SdoSeqConHdl); + break; + } + + case kEplSdoTypePdo: + case kEplSdoTypeAuto: + default: + { + Ret = kEplSdoComUnsupportedProt; + goto Exit; + } + + } // end of switch(pSdoComCon->m_SdoProtType) + } + + // clean controll structure + EPL_MEMSET(pSdoComCon, 0x00, sizeof(tEplSdoComCon)); + Exit: + return Ret; } #endif //--------------------------------------------------------------------------- @@ -713,70 +669,62 @@ Exit: // //--------------------------------------------------------------------------- #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) -tEplKernel PUBLIC EplSdoComGetState(tEplSdoComConHdl SdoComConHdl_p, - tEplSdoComFinished* pSdoComFinished_p) +tEplKernel PUBLIC EplSdoComGetState(tEplSdoComConHdl SdoComConHdl_p, + tEplSdoComFinished * pSdoComFinished_p) { -tEplKernel Ret; -tEplSdoComCon* pSdoComCon; - - Ret = kEplSuccessful; - - if(SdoComConHdl_p >= EPL_MAX_SDO_COM_CON) - { - Ret = kEplSdoComInvalidHandle; - goto Exit; - } - - // get pointer to control structure - pSdoComCon = &SdoComInstance_g.m_SdoComCon[SdoComConHdl_p]; - - // check if handle ok - if(pSdoComCon->m_SdoSeqConHdl == 0) - { - Ret = kEplSdoComInvalidHandle; - goto Exit; - } - - pSdoComFinished_p->m_pUserArg = pSdoComCon->m_pUserArg; - pSdoComFinished_p->m_uiNodeId = pSdoComCon->m_uiNodeId; - pSdoComFinished_p->m_uiTargetIndex = pSdoComCon->m_uiTargetIndex; - pSdoComFinished_p->m_uiTargetSubIndex = pSdoComCon->m_uiTargetSubIndex; - pSdoComFinished_p->m_uiTransferredByte = pSdoComCon->m_uiTransferredByte; - pSdoComFinished_p->m_dwAbortCode = pSdoComCon->m_dwLastAbortCode; - pSdoComFinished_p->m_SdoComConHdl = SdoComConHdl_p; - if (pSdoComCon->m_SdoServiceType == kEplSdoServiceWriteByIndex) - { - pSdoComFinished_p->m_SdoAccessType = kEplSdoAccessTypeWrite; - } - else - { - pSdoComFinished_p->m_SdoAccessType = kEplSdoAccessTypeRead; - } - - if(pSdoComCon->m_dwLastAbortCode != 0) - { // sdo abort - pSdoComFinished_p->m_SdoComConState = kEplSdoComTransferRxAborted; - - // delete abort code - pSdoComCon->m_dwLastAbortCode = 0; - - } - else if((pSdoComCon->m_SdoSeqConHdl & ~EPL_SDO_SEQ_HANDLE_MASK)== EPL_SDO_SEQ_INVALID_HDL) - { // check state - pSdoComFinished_p->m_SdoComConState = kEplSdoComTransferLowerLayerAbort; - } - else if(pSdoComCon->m_SdoComState == kEplSdoComStateClientWaitInit) - { - // finished - pSdoComFinished_p->m_SdoComConState = kEplSdoComTransferNotActive; - } - else if(pSdoComCon->m_uiTransSize == 0) - { // finished - pSdoComFinished_p->m_SdoComConState = kEplSdoComTransferFinished; - } - -Exit: - return Ret; + tEplKernel Ret; + tEplSdoComCon *pSdoComCon; + + Ret = kEplSuccessful; + + if (SdoComConHdl_p >= EPL_MAX_SDO_COM_CON) { + Ret = kEplSdoComInvalidHandle; + goto Exit; + } + // get pointer to control structure + pSdoComCon = &SdoComInstance_g.m_SdoComCon[SdoComConHdl_p]; + + // check if handle ok + if (pSdoComCon->m_SdoSeqConHdl == 0) { + Ret = kEplSdoComInvalidHandle; + goto Exit; + } + + pSdoComFinished_p->m_pUserArg = pSdoComCon->m_pUserArg; + pSdoComFinished_p->m_uiNodeId = pSdoComCon->m_uiNodeId; + pSdoComFinished_p->m_uiTargetIndex = pSdoComCon->m_uiTargetIndex; + pSdoComFinished_p->m_uiTargetSubIndex = pSdoComCon->m_uiTargetSubIndex; + pSdoComFinished_p->m_uiTransferredByte = + pSdoComCon->m_uiTransferredByte; + pSdoComFinished_p->m_dwAbortCode = pSdoComCon->m_dwLastAbortCode; + pSdoComFinished_p->m_SdoComConHdl = SdoComConHdl_p; + if (pSdoComCon->m_SdoServiceType == kEplSdoServiceWriteByIndex) { + pSdoComFinished_p->m_SdoAccessType = kEplSdoAccessTypeWrite; + } else { + pSdoComFinished_p->m_SdoAccessType = kEplSdoAccessTypeRead; + } + + if (pSdoComCon->m_dwLastAbortCode != 0) { // sdo abort + pSdoComFinished_p->m_SdoComConState = + kEplSdoComTransferRxAborted; + + // delete abort code + pSdoComCon->m_dwLastAbortCode = 0; + + } else if ((pSdoComCon->m_SdoSeqConHdl & ~EPL_SDO_SEQ_HANDLE_MASK) == EPL_SDO_SEQ_INVALID_HDL) { // check state + pSdoComFinished_p->m_SdoComConState = + kEplSdoComTransferLowerLayerAbort; + } else if (pSdoComCon->m_SdoComState == kEplSdoComStateClientWaitInit) { + // finished + pSdoComFinished_p->m_SdoComConState = + kEplSdoComTransferNotActive; + } else if (pSdoComCon->m_uiTransSize == 0) { // finished + pSdoComFinished_p->m_SdoComConState = + kEplSdoComTransferFinished; + } + + Exit: + return Ret; } #endif @@ -800,37 +748,32 @@ Exit: //--------------------------------------------------------------------------- #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) tEplKernel PUBLIC EplSdoComSdoAbort(tEplSdoComConHdl SdoComConHdl_p, - DWORD dwAbortCode_p) + DWORD dwAbortCode_p) { -tEplKernel Ret; -tEplSdoComCon* pSdoComCon; - - - if(SdoComConHdl_p >= EPL_MAX_SDO_COM_CON) - { - Ret = kEplSdoComInvalidHandle; - goto Exit; - } - - // get pointer to control structure of connection - pSdoComCon = &SdoComInstance_g.m_SdoComCon[SdoComConHdl_p]; - - // check if handle ok - if(pSdoComCon->m_SdoSeqConHdl == 0) - { - Ret = kEplSdoComInvalidHandle; - goto Exit; - } - - // save pointer to abort code - pSdoComCon->m_pData = (BYTE*)&dwAbortCode_p; - - Ret = EplSdoComProcessIntern(SdoComConHdl_p, - kEplSdoComConEventAbort, - (tEplAsySdoCom*)NULL); - -Exit: - return Ret; + tEplKernel Ret; + tEplSdoComCon *pSdoComCon; + + if (SdoComConHdl_p >= EPL_MAX_SDO_COM_CON) { + Ret = kEplSdoComInvalidHandle; + goto Exit; + } + // get pointer to control structure of connection + pSdoComCon = &SdoComInstance_g.m_SdoComCon[SdoComConHdl_p]; + + // check if handle ok + if (pSdoComCon->m_SdoSeqConHdl == 0) { + Ret = kEplSdoComInvalidHandle; + goto Exit; + } + // save pointer to abort code + pSdoComCon->m_pData = (BYTE *) & dwAbortCode_p; + + Ret = EplSdoComProcessIntern(SdoComConHdl_p, + kEplSdoComConEventAbort, + (tEplAsySdoCom *) NULL); + + Exit: + return Ret; } #endif @@ -860,21 +803,22 @@ Exit: // State: // //--------------------------------------------------------------------------- -tEplKernel PUBLIC EplSdoComReceiveCb (tEplSdoSeqConHdl SdoSeqConHdl_p, - tEplAsySdoCom* pAsySdoCom_p, - unsigned int uiDataSize_p) +tEplKernel PUBLIC EplSdoComReceiveCb(tEplSdoSeqConHdl SdoSeqConHdl_p, + tEplAsySdoCom * pAsySdoCom_p, + unsigned int uiDataSize_p) { -tEplKernel Ret; + tEplKernel Ret; + // search connection internally + Ret = EplSdoComSearchConIntern(SdoSeqConHdl_p, + kEplSdoComConEventRec, pAsySdoCom_p); - // search connection internally - Ret = EplSdoComSearchConIntern(SdoSeqConHdl_p, - kEplSdoComConEventRec, - pAsySdoCom_p); + EPL_DBGLVL_SDO_TRACE3 + ("EplSdoComReceiveCb SdoSeqConHdl: 0x%X, First Byte of pAsySdoCom_p: 0x%02X, uiDataSize_p: 0x%04X\n", + SdoSeqConHdl_p, (WORD) pAsySdoCom_p->m_le_abCommandData[0], + uiDataSize_p); - EPL_DBGLVL_SDO_TRACE3("EplSdoComReceiveCb SdoSeqConHdl: 0x%X, First Byte of pAsySdoCom_p: 0x%02X, uiDataSize_p: 0x%04X\n", SdoSeqConHdl_p, (WORD)pAsySdoCom_p->m_le_abCommandData[0], uiDataSize_p); - - return Ret; + return Ret; } //--------------------------------------------------------------------------- @@ -896,73 +840,71 @@ tEplKernel Ret; // State: // //--------------------------------------------------------------------------- -tEplKernel PUBLIC EplSdoComConCb (tEplSdoSeqConHdl SdoSeqConHdl_p, - tEplAsySdoConState AsySdoConState_p) +tEplKernel PUBLIC EplSdoComConCb(tEplSdoSeqConHdl SdoSeqConHdl_p, + tEplAsySdoConState AsySdoConState_p) { -tEplKernel Ret; -tEplSdoComConEvent SdoComConEvent = kEplSdoComConEventSendFirst; - - Ret = kEplSuccessful; - - // check state - switch(AsySdoConState_p) - { - case kAsySdoConStateConnected: - { - EPL_DBGLVL_SDO_TRACE0("Connection established\n"); - SdoComConEvent = kEplSdoComConEventConEstablished; - // start transmission if needed - break; - } - - case kAsySdoConStateInitError: - { - EPL_DBGLVL_SDO_TRACE0("Error during initialisation\n"); - SdoComConEvent = kEplSdoComConEventInitError; - // inform app about error and close sequence layer handle - break; - } - - case kAsySdoConStateConClosed: - { - EPL_DBGLVL_SDO_TRACE0("Connection closed\n"); - SdoComConEvent = kEplSdoComConEventConClosed; - // close sequence layer handle - break; - } - - case kAsySdoConStateAckReceived: - { - EPL_DBGLVL_SDO_TRACE0("Acknowlage received\n"); - SdoComConEvent = kEplSdoComConEventAckReceived; - // continue transmission - break; - } - - case kAsySdoConStateFrameSended: - { - EPL_DBGLVL_SDO_TRACE0("One Frame sent\n"); - SdoComConEvent = kEplSdoComConEventFrameSended; - // to continue transmission - break; - - } - - case kAsySdoConStateTimeout: - { - EPL_DBGLVL_SDO_TRACE0("Timeout\n"); - SdoComConEvent = kEplSdoComConEventTimeout; - // close sequence layer handle - break; - - } - }// end of switch(AsySdoConState_p) - - Ret = EplSdoComSearchConIntern(SdoSeqConHdl_p, - SdoComConEvent, - (tEplAsySdoCom*)NULL); - - return Ret; + tEplKernel Ret; + tEplSdoComConEvent SdoComConEvent = kEplSdoComConEventSendFirst; + + Ret = kEplSuccessful; + + // check state + switch (AsySdoConState_p) { + case kAsySdoConStateConnected: + { + EPL_DBGLVL_SDO_TRACE0("Connection established\n"); + SdoComConEvent = kEplSdoComConEventConEstablished; + // start transmission if needed + break; + } + + case kAsySdoConStateInitError: + { + EPL_DBGLVL_SDO_TRACE0("Error during initialisation\n"); + SdoComConEvent = kEplSdoComConEventInitError; + // inform app about error and close sequence layer handle + break; + } + + case kAsySdoConStateConClosed: + { + EPL_DBGLVL_SDO_TRACE0("Connection closed\n"); + SdoComConEvent = kEplSdoComConEventConClosed; + // close sequence layer handle + break; + } + + case kAsySdoConStateAckReceived: + { + EPL_DBGLVL_SDO_TRACE0("Acknowlage received\n"); + SdoComConEvent = kEplSdoComConEventAckReceived; + // continue transmission + break; + } + + case kAsySdoConStateFrameSended: + { + EPL_DBGLVL_SDO_TRACE0("One Frame sent\n"); + SdoComConEvent = kEplSdoComConEventFrameSended; + // to continue transmission + break; + + } + + case kAsySdoConStateTimeout: + { + EPL_DBGLVL_SDO_TRACE0("Timeout\n"); + SdoComConEvent = kEplSdoComConEventTimeout; + // close sequence layer handle + break; + + } + } // end of switch(AsySdoConState_p) + + Ret = EplSdoComSearchConIntern(SdoSeqConHdl_p, + SdoComConEvent, (tEplAsySdoCom *) NULL); + + return Ret; } //--------------------------------------------------------------------------- @@ -982,61 +924,53 @@ tEplSdoComConEvent SdoComConEvent = kEplSdoComConEventSendFirst; // State: // //--------------------------------------------------------------------------- -static tEplKernel EplSdoComSearchConIntern(tEplSdoSeqConHdl SdoSeqConHdl_p, - tEplSdoComConEvent SdoComConEvent_p, - tEplAsySdoCom* pAsySdoCom_p) +static tEplKernel EplSdoComSearchConIntern(tEplSdoSeqConHdl SdoSeqConHdl_p, + tEplSdoComConEvent SdoComConEvent_p, + tEplAsySdoCom * pAsySdoCom_p) { -tEplKernel Ret; -tEplSdoComCon* pSdoComCon; -tEplSdoComConHdl HdlCount; -tEplSdoComConHdl HdlFree; - - Ret = kEplSdoComNotResponsible; - - // get pointer to first element of the array - pSdoComCon = &SdoComInstance_g.m_SdoComCon[0]; - HdlCount = 0; - HdlFree = 0xFFFF; - while (HdlCount < EPL_MAX_SDO_COM_CON) - { - if (pSdoComCon->m_SdoSeqConHdl == SdoSeqConHdl_p) - { // matching command layer handle found - Ret = EplSdoComProcessIntern(HdlCount, - SdoComConEvent_p, - pAsySdoCom_p); - } - else if ((pSdoComCon->m_SdoSeqConHdl == 0) - &&(HdlFree == 0xFFFF)) - { - HdlFree = HdlCount; - } - - pSdoComCon++; - HdlCount++; - } - - if (Ret == kEplSdoComNotResponsible) - { // no responsible command layer handle found - if (HdlFree == 0xFFFF) - { // no free handle - // delete connection immediately - // 2008/04/14 m.u./d.k. This connection actually does not exist. - // pSdoComCon is invalid. - // Ret = EplSdoAsySeqDelCon(pSdoComCon->m_SdoSeqConHdl); - Ret = kEplSdoComNoFreeHandle; - } - else - { // create new handle - HdlCount = HdlFree; - pSdoComCon = &SdoComInstance_g.m_SdoComCon[HdlCount]; - pSdoComCon->m_SdoSeqConHdl = SdoSeqConHdl_p; - Ret = EplSdoComProcessIntern(HdlCount, - SdoComConEvent_p, - pAsySdoCom_p); - } - } - - return Ret; + tEplKernel Ret; + tEplSdoComCon *pSdoComCon; + tEplSdoComConHdl HdlCount; + tEplSdoComConHdl HdlFree; + + Ret = kEplSdoComNotResponsible; + + // get pointer to first element of the array + pSdoComCon = &SdoComInstance_g.m_SdoComCon[0]; + HdlCount = 0; + HdlFree = 0xFFFF; + while (HdlCount < EPL_MAX_SDO_COM_CON) { + if (pSdoComCon->m_SdoSeqConHdl == SdoSeqConHdl_p) { // matching command layer handle found + Ret = EplSdoComProcessIntern(HdlCount, + SdoComConEvent_p, + pAsySdoCom_p); + } else if ((pSdoComCon->m_SdoSeqConHdl == 0) + && (HdlFree == 0xFFFF)) { + HdlFree = HdlCount; + } + + pSdoComCon++; + HdlCount++; + } + + if (Ret == kEplSdoComNotResponsible) { // no responsible command layer handle found + if (HdlFree == 0xFFFF) { // no free handle + // delete connection immediately + // 2008/04/14 m.u./d.k. This connection actually does not exist. + // pSdoComCon is invalid. + // Ret = EplSdoAsySeqDelCon(pSdoComCon->m_SdoSeqConHdl); + Ret = kEplSdoComNoFreeHandle; + } else { // create new handle + HdlCount = HdlFree; + pSdoComCon = &SdoComInstance_g.m_SdoComCon[HdlCount]; + pSdoComCon->m_SdoSeqConHdl = SdoSeqConHdl_p; + Ret = EplSdoComProcessIntern(HdlCount, + SdoComConEvent_p, + pAsySdoCom_p); + } + } + + return Ret; } @@ -1059,748 +993,952 @@ tEplSdoComConHdl HdlFree; // State: // //--------------------------------------------------------------------------- -static tEplKernel EplSdoComProcessIntern(tEplSdoComConHdl SdoComCon_p, - tEplSdoComConEvent SdoComConEvent_p, - tEplAsySdoCom* pAsySdoCom_p) +static tEplKernel EplSdoComProcessIntern(tEplSdoComConHdl SdoComCon_p, + tEplSdoComConEvent SdoComConEvent_p, + tEplAsySdoCom * pAsySdoCom_p) { -tEplKernel Ret; -tEplSdoComCon* pSdoComCon; -BYTE bFlag; + tEplKernel Ret; + tEplSdoComCon *pSdoComCon; + BYTE bFlag; #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0) -DWORD dwAbortCode; -unsigned int uiSize; + DWORD dwAbortCode; + unsigned int uiSize; #endif #if defined(WIN32) || defined(_WIN32) - // enter critical section for process function - EnterCriticalSection(SdoComInstance_g.m_pCriticalSection); - EPL_DBGLVL_SDO_TRACE0("\n\tEnterCiticalSection EplSdoComProcessIntern\n\n"); + // enter critical section for process function + EnterCriticalSection(SdoComInstance_g.m_pCriticalSection); + EPL_DBGLVL_SDO_TRACE0 + ("\n\tEnterCiticalSection EplSdoComProcessIntern\n\n"); #endif - Ret = kEplSuccessful; + Ret = kEplSuccessful; - // get pointer to control structure - pSdoComCon = &SdoComInstance_g.m_SdoComCon[SdoComCon_p]; + // get pointer to control structure + pSdoComCon = &SdoComInstance_g.m_SdoComCon[SdoComCon_p]; - // process state maschine - switch(pSdoComCon->m_SdoComState) - { - // idle state - case kEplSdoComStateIdle: - { - // check events - switch(SdoComConEvent_p) - { + // process state maschine + switch (pSdoComCon->m_SdoComState) { + // idle state + case kEplSdoComStateIdle: + { + // check events + switch (SdoComConEvent_p) { #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) - // init con for client - case kEplSdoComConEventInitCon: - { - - // call of the init function already - // processed in EplSdoComDefineCon() - // only change state to kEplSdoComStateClientWaitInit - pSdoComCon->m_SdoComState = kEplSdoComStateClientWaitInit; - break; - } + // init con for client + case kEplSdoComConEventInitCon: + { + + // call of the init function already + // processed in EplSdoComDefineCon() + // only change state to kEplSdoComStateClientWaitInit + pSdoComCon->m_SdoComState = + kEplSdoComStateClientWaitInit; + break; + } #endif - - // int con for server - case kEplSdoComConEventRec: - { + // int con for server + case kEplSdoComConEventRec: + { #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0) - // check if init of an transfer and no SDO abort - if ((pAsySdoCom_p->m_le_bFlags & 0x80) == 0) - { // SDO request - if ((pAsySdoCom_p->m_le_bFlags & 0x40) == 0) - { // no SDO abort - // save tansaction id - pSdoComCon->m_bTransactionId = AmiGetByteFromLe(&pAsySdoCom_p->m_le_bTransactionId); - // check command - switch(pAsySdoCom_p->m_le_bCommandId) - { - case kEplSdoServiceNIL: - { // simply acknowlegde NIL command on sequence layer - - Ret = EplSdoAsySeqSendData(pSdoComCon->m_SdoSeqConHdl, - 0, - (tEplFrame*)NULL); - - break; - } - - case kEplSdoServiceReadByIndex: - { // read by index - - // search entry an start transfer - EplSdoComServerInitReadByIndex(pSdoComCon, - pAsySdoCom_p); - // check next state - if(pSdoComCon->m_uiTransSize == 0) - { // ready -> stay idle - pSdoComCon->m_SdoComState = kEplSdoComStateIdle; - // reset abort code - pSdoComCon->m_dwLastAbortCode = 0; - } - else - { // segmented transfer - pSdoComCon->m_SdoComState = kEplSdoComStateServerSegmTrans; - } - - break; - } - - case kEplSdoServiceWriteByIndex: - { - - // search entry an start write - EplSdoComServerInitWriteByIndex(pSdoComCon, - pAsySdoCom_p); - // check next state - if(pSdoComCon->m_uiTransSize == 0) - { // already -> stay idle - pSdoComCon->m_SdoComState = kEplSdoComStateIdle; - // reset abort code - pSdoComCon->m_dwLastAbortCode = 0; - } - else - { // segmented transfer - pSdoComCon->m_SdoComState = kEplSdoComStateServerSegmTrans; - } - - break; - } - - default: - { - // unsupported command - // -> abort senden - dwAbortCode = EPL_SDOAC_UNKNOWN_COMMAND_SPECIFIER; - // send abort - pSdoComCon->m_pData = (BYTE*)&dwAbortCode; - Ret = EplSdoComServerSendFrameIntern(pSdoComCon, - 0, - 0, - kEplSdoComSendTypeAbort); - - } - - - }// end of switch(pAsySdoCom_p->m_le_bCommandId) - } - } - else - { // this command layer handle is not responsible - // (wrong direction or wrong transaction ID) - Ret = kEplSdoComNotResponsible; - goto Exit; - } + // check if init of an transfer and no SDO abort + if ((pAsySdoCom_p->m_le_bFlags & 0x80) == 0) { // SDO request + if ((pAsySdoCom_p->m_le_bFlags & 0x40) == 0) { // no SDO abort + // save tansaction id + pSdoComCon-> + m_bTransactionId = + AmiGetByteFromLe + (&pAsySdoCom_p-> + m_le_bTransactionId); + // check command + switch (pAsySdoCom_p-> + m_le_bCommandId) + { + case kEplSdoServiceNIL: + { // simply acknowlegde NIL command on sequence layer + + Ret = + EplSdoAsySeqSendData + (pSdoComCon-> + m_SdoSeqConHdl, + 0, + (tEplFrame + *) + NULL); + + break; + } + + case kEplSdoServiceReadByIndex: + { // read by index + + // search entry an start transfer + EplSdoComServerInitReadByIndex + (pSdoComCon, + pAsySdoCom_p); + // check next state + if (pSdoComCon->m_uiTransSize == 0) { // ready -> stay idle + pSdoComCon-> + m_SdoComState + = + kEplSdoComStateIdle; + // reset abort code + pSdoComCon-> + m_dwLastAbortCode + = + 0; + } else { // segmented transfer + pSdoComCon-> + m_SdoComState + = + kEplSdoComStateServerSegmTrans; + } + + break; + } + + case kEplSdoServiceWriteByIndex: + { + + // search entry an start write + EplSdoComServerInitWriteByIndex + (pSdoComCon, + pAsySdoCom_p); + // check next state + if (pSdoComCon->m_uiTransSize == 0) { // already -> stay idle + pSdoComCon-> + m_SdoComState + = + kEplSdoComStateIdle; + // reset abort code + pSdoComCon-> + m_dwLastAbortCode + = + 0; + } else { // segmented transfer + pSdoComCon-> + m_SdoComState + = + kEplSdoComStateServerSegmTrans; + } + + break; + } + + default: + { + // unsupported command + // -> abort senden + dwAbortCode + = + EPL_SDOAC_UNKNOWN_COMMAND_SPECIFIER; + // send abort + pSdoComCon-> + m_pData + = + (BYTE + *) + & + dwAbortCode; + Ret = + EplSdoComServerSendFrameIntern + (pSdoComCon, + 0, + 0, + kEplSdoComSendTypeAbort); + + } + + } // end of switch(pAsySdoCom_p->m_le_bCommandId) + } + } else { // this command layer handle is not responsible + // (wrong direction or wrong transaction ID) + Ret = kEplSdoComNotResponsible; + goto Exit; + } #endif // end of #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0) - break; - } - - // connection closed - case kEplSdoComConEventInitError: - case kEplSdoComConEventTimeout: - case kEplSdoComConEventConClosed: - { - Ret = EplSdoAsySeqDelCon(pSdoComCon->m_SdoSeqConHdl); - // clean control structure - EPL_MEMSET(pSdoComCon, 0x00, sizeof(tEplSdoComCon)); - break; - } - - default: - // d.k. do nothing - break; - }// end of switch(SdoComConEvent_p) - break; - } + break; + } + + // connection closed + case kEplSdoComConEventInitError: + case kEplSdoComConEventTimeout: + case kEplSdoComConEventConClosed: + { + Ret = + EplSdoAsySeqDelCon(pSdoComCon-> + m_SdoSeqConHdl); + // clean control structure + EPL_MEMSET(pSdoComCon, 0x00, + sizeof(tEplSdoComCon)); + break; + } + + default: + // d.k. do nothing + break; + } // end of switch(SdoComConEvent_p) + break; + } #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0) - //------------------------------------------------------------------------- - // SDO Server part - // segmented transfer - case kEplSdoComStateServerSegmTrans: - { - // check events - switch(SdoComConEvent_p) - { - // send next frame - case kEplSdoComConEventAckReceived: - case kEplSdoComConEventFrameSended: - { - // check if it is a read - if(pSdoComCon->m_SdoServiceType == kEplSdoServiceReadByIndex) - { - // send next frame - EplSdoComServerSendFrameIntern(pSdoComCon, - 0, - 0, - kEplSdoComSendTypeRes); - // if all send -> back to idle - if(pSdoComCon->m_uiTransSize == 0) - { // back to idle - pSdoComCon->m_SdoComState = kEplSdoComStateIdle; - // reset abort code - pSdoComCon->m_dwLastAbortCode = 0; - } - - } - break; - } - - // process next frame - case kEplSdoComConEventRec: - { - // check if the frame is a SDO response and has the right transaction ID - bFlag = AmiGetByteFromLe(&pAsySdoCom_p->m_le_bFlags); - if (((bFlag & 0x80) != 0) && (AmiGetByteFromLe(&pAsySdoCom_p->m_le_bTransactionId) == pSdoComCon->m_bTransactionId)) - { - // check if it is a abort - if((bFlag & 0x40) != 0) - { // SDO abort - // clear control structure - pSdoComCon->m_uiTransSize = 0; - pSdoComCon->m_uiTransferredByte = 0; - // change state - pSdoComCon->m_SdoComState = kEplSdoComStateIdle; - // reset abort code - pSdoComCon->m_dwLastAbortCode = 0; - // d.k.: do not execute anything further on this command - break; - } - - // check if it is a write - if(pSdoComCon->m_SdoServiceType == kEplSdoServiceWriteByIndex) - { - // write data to OD - uiSize = AmiGetWordFromLe(&pAsySdoCom_p->m_le_wSegmentSize); - if(pSdoComCon->m_dwLastAbortCode == 0) - { - EPL_MEMCPY(pSdoComCon->m_pData, &pAsySdoCom_p->m_le_abCommandData[0],uiSize); - } - // update counter - pSdoComCon->m_uiTransferredByte += uiSize; - pSdoComCon->m_uiTransSize -= uiSize; - - // update pointer - if(pSdoComCon->m_dwLastAbortCode == 0) - { - (/*(BYTE*)*/pSdoComCon->m_pData) += uiSize; - } - - // check end of transfer - if((pAsySdoCom_p->m_le_bFlags & 0x30) == 0x30) - { // transfer ready - pSdoComCon->m_uiTransSize = 0; - - if(pSdoComCon->m_dwLastAbortCode == 0) - { - // send response - // send next frame - EplSdoComServerSendFrameIntern(pSdoComCon, - 0, - 0, - kEplSdoComSendTypeRes); - // if all send -> back to idle - if(pSdoComCon->m_uiTransSize == 0) - { // back to idle - pSdoComCon->m_SdoComState = kEplSdoComStateIdle; - // reset abort code - pSdoComCon->m_dwLastAbortCode = 0; - } - } - else - { // send dabort code - // send abort - pSdoComCon->m_pData = (BYTE*)&pSdoComCon->m_dwLastAbortCode; - Ret = EplSdoComServerSendFrameIntern(pSdoComCon, - 0, - 0, - kEplSdoComSendTypeAbort); - - // reset abort code - pSdoComCon->m_dwLastAbortCode = 0; - - } - } - else - { - // send acknowledge without any Command layer data - Ret = EplSdoAsySeqSendData(pSdoComCon->m_SdoSeqConHdl, - 0, - (tEplFrame*)NULL); - } - } - } - else - { // this command layer handle is not responsible - // (wrong direction or wrong transaction ID) - Ret = kEplSdoComNotResponsible; - goto Exit; - } - break; - } - - // connection closed - case kEplSdoComConEventInitError: - case kEplSdoComConEventTimeout: - case kEplSdoComConEventConClosed: - { - Ret = EplSdoAsySeqDelCon(pSdoComCon->m_SdoSeqConHdl); - // clean control structure - EPL_MEMSET(pSdoComCon, 0x00, sizeof(tEplSdoComCon)); - break; - } - - default: - // d.k. do nothing - break; - }// end of switch(SdoComConEvent_p) - - break; - } + //------------------------------------------------------------------------- + // SDO Server part + // segmented transfer + case kEplSdoComStateServerSegmTrans: + { + // check events + switch (SdoComConEvent_p) { + // send next frame + case kEplSdoComConEventAckReceived: + case kEplSdoComConEventFrameSended: + { + // check if it is a read + if (pSdoComCon->m_SdoServiceType == + kEplSdoServiceReadByIndex) { + // send next frame + EplSdoComServerSendFrameIntern + (pSdoComCon, 0, 0, + kEplSdoComSendTypeRes); + // if all send -> back to idle + if (pSdoComCon->m_uiTransSize == 0) { // back to idle + pSdoComCon-> + m_SdoComState = + kEplSdoComStateIdle; + // reset abort code + pSdoComCon-> + m_dwLastAbortCode = + 0; + } + + } + break; + } + + // process next frame + case kEplSdoComConEventRec: + { + // check if the frame is a SDO response and has the right transaction ID + bFlag = + AmiGetByteFromLe(&pAsySdoCom_p-> + m_le_bFlags); + if (((bFlag & 0x80) != 0) + && + (AmiGetByteFromLe + (&pAsySdoCom_p-> + m_le_bTransactionId) == + pSdoComCon->m_bTransactionId)) { + // check if it is a abort + if ((bFlag & 0x40) != 0) { // SDO abort + // clear control structure + pSdoComCon-> + m_uiTransSize = 0; + pSdoComCon-> + m_uiTransferredByte + = 0; + // change state + pSdoComCon-> + m_SdoComState = + kEplSdoComStateIdle; + // reset abort code + pSdoComCon-> + m_dwLastAbortCode = + 0; + // d.k.: do not execute anything further on this command + break; + } + // check if it is a write + if (pSdoComCon-> + m_SdoServiceType == + kEplSdoServiceWriteByIndex) + { + // write data to OD + uiSize = + AmiGetWordFromLe + (&pAsySdoCom_p-> + m_le_wSegmentSize); + if (pSdoComCon-> + m_dwLastAbortCode == + 0) { + EPL_MEMCPY + (pSdoComCon-> + m_pData, + &pAsySdoCom_p-> + m_le_abCommandData + [0], + uiSize); + } + // update counter + pSdoComCon-> + m_uiTransferredByte + += uiSize; + pSdoComCon-> + m_uiTransSize -= + uiSize; + + // update pointer + if (pSdoComCon-> + m_dwLastAbortCode == + 0) { + ( /*(BYTE*) */ + pSdoComCon-> + m_pData) += + uiSize; + } + // check end of transfer + if ((pAsySdoCom_p->m_le_bFlags & 0x30) == 0x30) { // transfer ready + pSdoComCon-> + m_uiTransSize + = 0; + + if (pSdoComCon-> + m_dwLastAbortCode + == 0) { + // send response + // send next frame + EplSdoComServerSendFrameIntern + (pSdoComCon, + 0, + 0, + kEplSdoComSendTypeRes); + // if all send -> back to idle + if (pSdoComCon->m_uiTransSize == 0) { // back to idle + pSdoComCon-> + m_SdoComState + = + kEplSdoComStateIdle; + // reset abort code + pSdoComCon-> + m_dwLastAbortCode + = + 0; + } + } else { // send dabort code + // send abort + pSdoComCon-> + m_pData + = + (BYTE + *) + & + pSdoComCon-> + m_dwLastAbortCode; + Ret = + EplSdoComServerSendFrameIntern + (pSdoComCon, + 0, + 0, + kEplSdoComSendTypeAbort); + + // reset abort code + pSdoComCon-> + m_dwLastAbortCode + = 0; + + } + } else { + // send acknowledge without any Command layer data + Ret = + EplSdoAsySeqSendData + (pSdoComCon-> + m_SdoSeqConHdl, + 0, + (tEplFrame + *) NULL); + } + } + } else { // this command layer handle is not responsible + // (wrong direction or wrong transaction ID) + Ret = kEplSdoComNotResponsible; + goto Exit; + } + break; + } + + // connection closed + case kEplSdoComConEventInitError: + case kEplSdoComConEventTimeout: + case kEplSdoComConEventConClosed: + { + Ret = + EplSdoAsySeqDelCon(pSdoComCon-> + m_SdoSeqConHdl); + // clean control structure + EPL_MEMSET(pSdoComCon, 0x00, + sizeof(tEplSdoComCon)); + break; + } + + default: + // d.k. do nothing + break; + } // end of switch(SdoComConEvent_p) + + break; + } #endif // endif of #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0) - #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) - //------------------------------------------------------------------------- - // SDO Client part - // wait for finish of establishing connection - case kEplSdoComStateClientWaitInit: - { - - // if connection handle is invalid reinit connection - // d.k.: this will be done only on new events (i.e. InitTransfer) - if((pSdoComCon->m_SdoSeqConHdl & ~EPL_SDO_SEQ_HANDLE_MASK) == EPL_SDO_SEQ_INVALID_HDL) - { - // check kind of connection to reinit - // check protocol - switch(pSdoComCon->m_SdoProtType) - { - // udp - case kEplSdoTypeUdp: - { - // call connection int function of lower layer - Ret = EplSdoAsySeqInitCon(&pSdoComCon->m_SdoSeqConHdl, - pSdoComCon->m_uiNodeId, - kEplSdoTypeUdp); - if(Ret != kEplSuccessful) - { - goto Exit; - } - break; - } - - // Asend -> not supported - case kEplSdoTypeAsnd: - { - // call connection int function of lower layer - Ret = EplSdoAsySeqInitCon(&pSdoComCon->m_SdoSeqConHdl, - pSdoComCon->m_uiNodeId, - kEplSdoTypeAsnd); - if(Ret != kEplSuccessful) - { - goto Exit; - } - break; - } - - // Pdo -> not supported - case kEplSdoTypePdo: - default: - { - Ret = kEplSdoComUnsupportedProt; - goto Exit; - } - }// end of switch(m_ProtType_p) - // d.k.: reset transaction ID, because new sequence layer connection was initialized - // $$$ d.k. is this really necessary? - //pSdoComCon->m_bTransactionId = 0; - } - - // check events - switch(SdoComConEvent_p) - { - // connection established - case kEplSdoComConEventConEstablished: - { - //send first frame if needed - if((pSdoComCon->m_uiTransSize > 0) - &&(pSdoComCon->m_uiTargetIndex != 0)) - { // start SDO transfer - Ret = EplSdoComClientSend(pSdoComCon); - if(Ret != kEplSuccessful) - { - goto Exit; - } - - // check if segemted transfer - if(pSdoComCon->m_SdoTransType == kEplSdoTransSegmented) - { - pSdoComCon->m_SdoComState = kEplSdoComStateClientSegmTrans; - goto Exit; - } - } - // goto state kEplSdoComStateClientConnected - pSdoComCon->m_SdoComState = kEplSdoComStateClientConnected; - goto Exit; - } - - case kEplSdoComConEventSendFirst: - { - // infos for transfer already saved by function EplSdoComInitTransferByIndex - break; - } - - case kEplSdoComConEventConClosed: - case kEplSdoComConEventInitError: - case kEplSdoComConEventTimeout: - { - // close sequence layer handle - Ret = EplSdoAsySeqDelCon(pSdoComCon->m_SdoSeqConHdl); - pSdoComCon->m_SdoSeqConHdl |= EPL_SDO_SEQ_INVALID_HDL; - // call callback function - if (SdoComConEvent_p == kEplSdoComConEventTimeout) - { - pSdoComCon->m_dwLastAbortCode = EPL_SDOAC_TIME_OUT; - } - else - { - pSdoComCon->m_dwLastAbortCode = 0; - } - Ret = EplSdoComTransferFinished(SdoComCon_p, pSdoComCon, kEplSdoComTransferLowerLayerAbort); - // d.k.: do not clean control structure - break; - } - - default: - // d.k. do nothing - break; - - } // end of switch(SdoComConEvent_p) - break; - } - - // connected - case kEplSdoComStateClientConnected: - { - // check events - switch(SdoComConEvent_p) - { - // send a frame - case kEplSdoComConEventSendFirst: - case kEplSdoComConEventAckReceived: - case kEplSdoComConEventFrameSended: - { - Ret = EplSdoComClientSend(pSdoComCon); - if(Ret != kEplSuccessful) - { - goto Exit; - } - - // check if read transfer finished - if((pSdoComCon->m_uiTransSize == 0) - && (pSdoComCon->m_uiTransferredByte != 0) - && (pSdoComCon->m_SdoServiceType == kEplSdoServiceReadByIndex)) - { - // inc transaction id - pSdoComCon->m_bTransactionId++; - // call callback of application - pSdoComCon->m_dwLastAbortCode = 0; - Ret = EplSdoComTransferFinished(SdoComCon_p, pSdoComCon, kEplSdoComTransferFinished); - - goto Exit; - } - - // check if segemted transfer - if(pSdoComCon->m_SdoTransType == kEplSdoTransSegmented) - { - pSdoComCon->m_SdoComState = kEplSdoComStateClientSegmTrans; - goto Exit; - } - break; - } - - // frame received - case kEplSdoComConEventRec: - { - // check if the frame is a SDO response and has the right transaction ID - bFlag = AmiGetByteFromLe(&pAsySdoCom_p->m_le_bFlags); - if (((bFlag & 0x80) != 0) && (AmiGetByteFromLe(&pAsySdoCom_p->m_le_bTransactionId) == pSdoComCon->m_bTransactionId)) - { - // check if abort or not - if((bFlag & 0x40) != 0) - { - // send acknowledge without any Command layer data - Ret = EplSdoAsySeqSendData(pSdoComCon->m_SdoSeqConHdl, - 0, - (tEplFrame*)NULL); - // inc transaction id - pSdoComCon->m_bTransactionId++; - // save abort code - pSdoComCon->m_dwLastAbortCode = AmiGetDwordFromLe(&pAsySdoCom_p->m_le_abCommandData[0]); - // call callback of application - Ret = EplSdoComTransferFinished(SdoComCon_p, pSdoComCon, kEplSdoComTransferRxAborted); - - goto Exit; - } - else - { // normal frame received - // check frame - Ret = EplSdoComClientProcessFrame(SdoComCon_p, pAsySdoCom_p); - - // check if transfer ready - if(pSdoComCon->m_uiTransSize == 0) - { - // send acknowledge without any Command layer data - Ret = EplSdoAsySeqSendData(pSdoComCon->m_SdoSeqConHdl, - 0, - (tEplFrame*)NULL); - // inc transaction id - pSdoComCon->m_bTransactionId++; - // call callback of application - pSdoComCon->m_dwLastAbortCode = 0; - Ret = EplSdoComTransferFinished(SdoComCon_p, pSdoComCon, kEplSdoComTransferFinished); - - goto Exit; - } - - } - } - else - { // this command layer handle is not responsible - // (wrong direction or wrong transaction ID) - Ret = kEplSdoComNotResponsible; - goto Exit; - } - break; - } - - // connection closed event go back to kEplSdoComStateClientWaitInit - case kEplSdoComConEventConClosed: - { // connection closed by communication partner - // close sequence layer handle - Ret = EplSdoAsySeqDelCon(pSdoComCon->m_SdoSeqConHdl); - // set handle to invalid and enter kEplSdoComStateClientWaitInit - pSdoComCon->m_SdoSeqConHdl |= EPL_SDO_SEQ_INVALID_HDL; - // change state - pSdoComCon->m_SdoComState = kEplSdoComStateClientWaitInit; - - // call callback of application - pSdoComCon->m_dwLastAbortCode = 0; - Ret = EplSdoComTransferFinished(SdoComCon_p, pSdoComCon, kEplSdoComTransferLowerLayerAbort); - - goto Exit; - - break; - } - - // abort to send from higher layer - case kEplSdoComConEventAbort: - { - EplSdoComClientSendAbort(pSdoComCon,*((DWORD*)pSdoComCon->m_pData)); - - // inc transaction id - pSdoComCon->m_bTransactionId++; - // call callback of application - pSdoComCon->m_dwLastAbortCode = *((DWORD*)pSdoComCon->m_pData); - Ret = EplSdoComTransferFinished(SdoComCon_p, pSdoComCon, kEplSdoComTransferTxAborted); - - break; - } - - case kEplSdoComConEventInitError: - case kEplSdoComConEventTimeout: - { - // close sequence layer handle - Ret = EplSdoAsySeqDelCon(pSdoComCon->m_SdoSeqConHdl); - pSdoComCon->m_SdoSeqConHdl |= EPL_SDO_SEQ_INVALID_HDL; - // change state - pSdoComCon->m_SdoComState = kEplSdoComStateClientWaitInit; - // call callback of application - pSdoComCon->m_dwLastAbortCode = EPL_SDOAC_TIME_OUT; - Ret = EplSdoComTransferFinished(SdoComCon_p, pSdoComCon, kEplSdoComTransferLowerLayerAbort); - - } - - default: - // d.k. do nothing - break; - - } // end of switch(SdoComConEvent_p) - - break; - } - - // process segmented transfer - case kEplSdoComStateClientSegmTrans: - { - // check events - switch(SdoComConEvent_p) - { - // sned a frame - case kEplSdoComConEventSendFirst: - case kEplSdoComConEventAckReceived: - case kEplSdoComConEventFrameSended: - { - Ret = EplSdoComClientSend(pSdoComCon); - if(Ret != kEplSuccessful) - { - goto Exit; - } - - // check if read transfer finished - if((pSdoComCon->m_uiTransSize == 0) - && (pSdoComCon->m_SdoServiceType == kEplSdoServiceReadByIndex)) - { - // inc transaction id - pSdoComCon->m_bTransactionId++; - // change state - pSdoComCon->m_SdoComState = kEplSdoComStateClientConnected; - // call callback of application - pSdoComCon->m_dwLastAbortCode = 0; - Ret = EplSdoComTransferFinished(SdoComCon_p, pSdoComCon, kEplSdoComTransferFinished); - - goto Exit; - } - - break; - } - - // frame received - case kEplSdoComConEventRec: - { - // check if the frame is a response - bFlag = AmiGetByteFromLe(&pAsySdoCom_p->m_le_bFlags); - if (((bFlag & 0x80) != 0) && (AmiGetByteFromLe(&pAsySdoCom_p->m_le_bTransactionId) == pSdoComCon->m_bTransactionId)) - { - // check if abort or not - if((bFlag & 0x40) != 0) - { - // send acknowledge without any Command layer data - Ret = EplSdoAsySeqSendData(pSdoComCon->m_SdoSeqConHdl, - 0, - (tEplFrame*)NULL); - // inc transaction id - pSdoComCon->m_bTransactionId++; - // change state - pSdoComCon->m_SdoComState = kEplSdoComStateClientConnected; - // save abort code - pSdoComCon->m_dwLastAbortCode = AmiGetDwordFromLe(&pAsySdoCom_p->m_le_abCommandData[0]); - // call callback of application - Ret = EplSdoComTransferFinished(SdoComCon_p, pSdoComCon, kEplSdoComTransferRxAborted); - - goto Exit; - } - else - { // normal frame received - // check frame - Ret = EplSdoComClientProcessFrame(SdoComCon_p, pAsySdoCom_p); - - // check if transfer ready - if(pSdoComCon->m_uiTransSize == 0) - { - // send acknowledge without any Command layer data - Ret = EplSdoAsySeqSendData(pSdoComCon->m_SdoSeqConHdl, - 0, - (tEplFrame*)NULL); - // inc transaction id - pSdoComCon->m_bTransactionId++; - // change state - pSdoComCon->m_SdoComState = kEplSdoComStateClientConnected; - // call callback of application - pSdoComCon->m_dwLastAbortCode = 0; - Ret = EplSdoComTransferFinished(SdoComCon_p, pSdoComCon, kEplSdoComTransferFinished); - - } - - } - } - break; - } - - // connection closed event go back to kEplSdoComStateClientWaitInit - case kEplSdoComConEventConClosed: - { // connection closed by communication partner - // close sequence layer handle - Ret = EplSdoAsySeqDelCon(pSdoComCon->m_SdoSeqConHdl); - // set handle to invalid and enter kEplSdoComStateClientWaitInit - pSdoComCon->m_SdoSeqConHdl |= EPL_SDO_SEQ_INVALID_HDL; - // change state - pSdoComCon->m_SdoComState = kEplSdoComStateClientWaitInit; - // inc transaction id - pSdoComCon->m_bTransactionId++; - // call callback of application - pSdoComCon->m_dwLastAbortCode = 0; - Ret = EplSdoComTransferFinished(SdoComCon_p, pSdoComCon, kEplSdoComTransferFinished); - - break; - } - - // abort to send from higher layer - case kEplSdoComConEventAbort: - { - EplSdoComClientSendAbort(pSdoComCon,*((DWORD*)pSdoComCon->m_pData)); - - // inc transaction id - pSdoComCon->m_bTransactionId++; - // change state - pSdoComCon->m_SdoComState = kEplSdoComStateClientConnected; - // call callback of application - pSdoComCon->m_dwLastAbortCode = *((DWORD*)pSdoComCon->m_pData); - Ret = EplSdoComTransferFinished(SdoComCon_p, pSdoComCon, kEplSdoComTransferTxAborted); - - break; - } - - case kEplSdoComConEventInitError: - case kEplSdoComConEventTimeout: - { - // close sequence layer handle - Ret = EplSdoAsySeqDelCon(pSdoComCon->m_SdoSeqConHdl); - pSdoComCon->m_SdoSeqConHdl |= EPL_SDO_SEQ_INVALID_HDL; - // change state - pSdoComCon->m_SdoComState = kEplSdoComStateClientWaitInit; - // call callback of application - pSdoComCon->m_dwLastAbortCode = EPL_SDOAC_TIME_OUT; - Ret = EplSdoComTransferFinished(SdoComCon_p, pSdoComCon, kEplSdoComTransferLowerLayerAbort); - - } - - default: - // d.k. do nothing - break; - - } // end of switch(SdoComConEvent_p) - - break; - } + //------------------------------------------------------------------------- + // SDO Client part + // wait for finish of establishing connection + case kEplSdoComStateClientWaitInit: + { + + // if connection handle is invalid reinit connection + // d.k.: this will be done only on new events (i.e. InitTransfer) + if ((pSdoComCon-> + m_SdoSeqConHdl & ~EPL_SDO_SEQ_HANDLE_MASK) == + EPL_SDO_SEQ_INVALID_HDL) { + // check kind of connection to reinit + // check protocol + switch (pSdoComCon->m_SdoProtType) { + // udp + case kEplSdoTypeUdp: + { + // call connection int function of lower layer + Ret = + EplSdoAsySeqInitCon + (&pSdoComCon-> + m_SdoSeqConHdl, + pSdoComCon->m_uiNodeId, + kEplSdoTypeUdp); + if (Ret != kEplSuccessful) { + goto Exit; + } + break; + } + + // Asend -> not supported + case kEplSdoTypeAsnd: + { + // call connection int function of lower layer + Ret = + EplSdoAsySeqInitCon + (&pSdoComCon-> + m_SdoSeqConHdl, + pSdoComCon->m_uiNodeId, + kEplSdoTypeAsnd); + if (Ret != kEplSuccessful) { + goto Exit; + } + break; + } + + // Pdo -> not supported + case kEplSdoTypePdo: + default: + { + Ret = kEplSdoComUnsupportedProt; + goto Exit; + } + } // end of switch(m_ProtType_p) + // d.k.: reset transaction ID, because new sequence layer connection was initialized + // $$$ d.k. is this really necessary? + //pSdoComCon->m_bTransactionId = 0; + } + // check events + switch (SdoComConEvent_p) { + // connection established + case kEplSdoComConEventConEstablished: + { + //send first frame if needed + if ((pSdoComCon->m_uiTransSize > 0) + && (pSdoComCon->m_uiTargetIndex != 0)) { // start SDO transfer + Ret = + EplSdoComClientSend + (pSdoComCon); + if (Ret != kEplSuccessful) { + goto Exit; + } + // check if segemted transfer + if (pSdoComCon-> + m_SdoTransType == + kEplSdoTransSegmented) { + pSdoComCon-> + m_SdoComState = + kEplSdoComStateClientSegmTrans; + goto Exit; + } + } + // goto state kEplSdoComStateClientConnected + pSdoComCon->m_SdoComState = + kEplSdoComStateClientConnected; + goto Exit; + } + + case kEplSdoComConEventSendFirst: + { + // infos for transfer already saved by function EplSdoComInitTransferByIndex + break; + } + + case kEplSdoComConEventConClosed: + case kEplSdoComConEventInitError: + case kEplSdoComConEventTimeout: + { + // close sequence layer handle + Ret = + EplSdoAsySeqDelCon(pSdoComCon-> + m_SdoSeqConHdl); + pSdoComCon->m_SdoSeqConHdl |= + EPL_SDO_SEQ_INVALID_HDL; + // call callback function + if (SdoComConEvent_p == + kEplSdoComConEventTimeout) { + pSdoComCon->m_dwLastAbortCode = + EPL_SDOAC_TIME_OUT; + } else { + pSdoComCon->m_dwLastAbortCode = + 0; + } + Ret = + EplSdoComTransferFinished + (SdoComCon_p, pSdoComCon, + kEplSdoComTransferLowerLayerAbort); + // d.k.: do not clean control structure + break; + } + + default: + // d.k. do nothing + break; + + } // end of switch(SdoComConEvent_p) + break; + } + + // connected + case kEplSdoComStateClientConnected: + { + // check events + switch (SdoComConEvent_p) { + // send a frame + case kEplSdoComConEventSendFirst: + case kEplSdoComConEventAckReceived: + case kEplSdoComConEventFrameSended: + { + Ret = EplSdoComClientSend(pSdoComCon); + if (Ret != kEplSuccessful) { + goto Exit; + } + // check if read transfer finished + if ((pSdoComCon->m_uiTransSize == 0) + && (pSdoComCon-> + m_uiTransferredByte != 0) + && (pSdoComCon->m_SdoServiceType == + kEplSdoServiceReadByIndex)) { + // inc transaction id + pSdoComCon->m_bTransactionId++; + // call callback of application + pSdoComCon->m_dwLastAbortCode = + 0; + Ret = + EplSdoComTransferFinished + (SdoComCon_p, pSdoComCon, + kEplSdoComTransferFinished); + + goto Exit; + } + // check if segemted transfer + if (pSdoComCon->m_SdoTransType == + kEplSdoTransSegmented) { + pSdoComCon->m_SdoComState = + kEplSdoComStateClientSegmTrans; + goto Exit; + } + break; + } + + // frame received + case kEplSdoComConEventRec: + { + // check if the frame is a SDO response and has the right transaction ID + bFlag = + AmiGetByteFromLe(&pAsySdoCom_p-> + m_le_bFlags); + if (((bFlag & 0x80) != 0) + && + (AmiGetByteFromLe + (&pAsySdoCom_p-> + m_le_bTransactionId) == + pSdoComCon->m_bTransactionId)) { + // check if abort or not + if ((bFlag & 0x40) != 0) { + // send acknowledge without any Command layer data + Ret = + EplSdoAsySeqSendData + (pSdoComCon-> + m_SdoSeqConHdl, 0, + (tEplFrame *) + NULL); + // inc transaction id + pSdoComCon-> + m_bTransactionId++; + // save abort code + pSdoComCon-> + m_dwLastAbortCode = + AmiGetDwordFromLe + (&pAsySdoCom_p-> + m_le_abCommandData + [0]); + // call callback of application + Ret = + EplSdoComTransferFinished + (SdoComCon_p, + pSdoComCon, + kEplSdoComTransferRxAborted); + + goto Exit; + } else { // normal frame received + // check frame + Ret = + EplSdoComClientProcessFrame + (SdoComCon_p, + pAsySdoCom_p); + + // check if transfer ready + if (pSdoComCon-> + m_uiTransSize == + 0) { + // send acknowledge without any Command layer data + Ret = + EplSdoAsySeqSendData + (pSdoComCon-> + m_SdoSeqConHdl, + 0, + (tEplFrame + *) NULL); + // inc transaction id + pSdoComCon-> + m_bTransactionId++; + // call callback of application + pSdoComCon-> + m_dwLastAbortCode + = 0; + Ret = + EplSdoComTransferFinished + (SdoComCon_p, + pSdoComCon, + kEplSdoComTransferFinished); + + goto Exit; + } + + } + } else { // this command layer handle is not responsible + // (wrong direction or wrong transaction ID) + Ret = kEplSdoComNotResponsible; + goto Exit; + } + break; + } + + // connection closed event go back to kEplSdoComStateClientWaitInit + case kEplSdoComConEventConClosed: + { // connection closed by communication partner + // close sequence layer handle + Ret = + EplSdoAsySeqDelCon(pSdoComCon-> + m_SdoSeqConHdl); + // set handle to invalid and enter kEplSdoComStateClientWaitInit + pSdoComCon->m_SdoSeqConHdl |= + EPL_SDO_SEQ_INVALID_HDL; + // change state + pSdoComCon->m_SdoComState = + kEplSdoComStateClientWaitInit; + + // call callback of application + pSdoComCon->m_dwLastAbortCode = 0; + Ret = + EplSdoComTransferFinished + (SdoComCon_p, pSdoComCon, + kEplSdoComTransferLowerLayerAbort); + + goto Exit; + + break; + } + + // abort to send from higher layer + case kEplSdoComConEventAbort: + { + EplSdoComClientSendAbort(pSdoComCon, + *((DWORD *) + pSdoComCon-> + m_pData)); + + // inc transaction id + pSdoComCon->m_bTransactionId++; + // call callback of application + pSdoComCon->m_dwLastAbortCode = + *((DWORD *) pSdoComCon->m_pData); + Ret = + EplSdoComTransferFinished + (SdoComCon_p, pSdoComCon, + kEplSdoComTransferTxAborted); + + break; + } + + case kEplSdoComConEventInitError: + case kEplSdoComConEventTimeout: + { + // close sequence layer handle + Ret = + EplSdoAsySeqDelCon(pSdoComCon-> + m_SdoSeqConHdl); + pSdoComCon->m_SdoSeqConHdl |= + EPL_SDO_SEQ_INVALID_HDL; + // change state + pSdoComCon->m_SdoComState = + kEplSdoComStateClientWaitInit; + // call callback of application + pSdoComCon->m_dwLastAbortCode = + EPL_SDOAC_TIME_OUT; + Ret = + EplSdoComTransferFinished + (SdoComCon_p, pSdoComCon, + kEplSdoComTransferLowerLayerAbort); + + } + + default: + // d.k. do nothing + break; + + } // end of switch(SdoComConEvent_p) + + break; + } + + // process segmented transfer + case kEplSdoComStateClientSegmTrans: + { + // check events + switch (SdoComConEvent_p) { + // sned a frame + case kEplSdoComConEventSendFirst: + case kEplSdoComConEventAckReceived: + case kEplSdoComConEventFrameSended: + { + Ret = EplSdoComClientSend(pSdoComCon); + if (Ret != kEplSuccessful) { + goto Exit; + } + // check if read transfer finished + if ((pSdoComCon->m_uiTransSize == 0) + && (pSdoComCon->m_SdoServiceType == + kEplSdoServiceReadByIndex)) { + // inc transaction id + pSdoComCon->m_bTransactionId++; + // change state + pSdoComCon->m_SdoComState = + kEplSdoComStateClientConnected; + // call callback of application + pSdoComCon->m_dwLastAbortCode = + 0; + Ret = + EplSdoComTransferFinished + (SdoComCon_p, pSdoComCon, + kEplSdoComTransferFinished); + + goto Exit; + } + + break; + } + + // frame received + case kEplSdoComConEventRec: + { + // check if the frame is a response + bFlag = + AmiGetByteFromLe(&pAsySdoCom_p-> + m_le_bFlags); + if (((bFlag & 0x80) != 0) + && + (AmiGetByteFromLe + (&pAsySdoCom_p-> + m_le_bTransactionId) == + pSdoComCon->m_bTransactionId)) { + // check if abort or not + if ((bFlag & 0x40) != 0) { + // send acknowledge without any Command layer data + Ret = + EplSdoAsySeqSendData + (pSdoComCon-> + m_SdoSeqConHdl, 0, + (tEplFrame *) + NULL); + // inc transaction id + pSdoComCon-> + m_bTransactionId++; + // change state + pSdoComCon-> + m_SdoComState = + kEplSdoComStateClientConnected; + // save abort code + pSdoComCon-> + m_dwLastAbortCode = + AmiGetDwordFromLe + (&pAsySdoCom_p-> + m_le_abCommandData + [0]); + // call callback of application + Ret = + EplSdoComTransferFinished + (SdoComCon_p, + pSdoComCon, + kEplSdoComTransferRxAborted); + + goto Exit; + } else { // normal frame received + // check frame + Ret = + EplSdoComClientProcessFrame + (SdoComCon_p, + pAsySdoCom_p); + + // check if transfer ready + if (pSdoComCon-> + m_uiTransSize == + 0) { + // send acknowledge without any Command layer data + Ret = + EplSdoAsySeqSendData + (pSdoComCon-> + m_SdoSeqConHdl, + 0, + (tEplFrame + *) NULL); + // inc transaction id + pSdoComCon-> + m_bTransactionId++; + // change state + pSdoComCon-> + m_SdoComState + = + kEplSdoComStateClientConnected; + // call callback of application + pSdoComCon-> + m_dwLastAbortCode + = 0; + Ret = + EplSdoComTransferFinished + (SdoComCon_p, + pSdoComCon, + kEplSdoComTransferFinished); + + } + + } + } + break; + } + + // connection closed event go back to kEplSdoComStateClientWaitInit + case kEplSdoComConEventConClosed: + { // connection closed by communication partner + // close sequence layer handle + Ret = + EplSdoAsySeqDelCon(pSdoComCon-> + m_SdoSeqConHdl); + // set handle to invalid and enter kEplSdoComStateClientWaitInit + pSdoComCon->m_SdoSeqConHdl |= + EPL_SDO_SEQ_INVALID_HDL; + // change state + pSdoComCon->m_SdoComState = + kEplSdoComStateClientWaitInit; + // inc transaction id + pSdoComCon->m_bTransactionId++; + // call callback of application + pSdoComCon->m_dwLastAbortCode = 0; + Ret = + EplSdoComTransferFinished + (SdoComCon_p, pSdoComCon, + kEplSdoComTransferFinished); + + break; + } + + // abort to send from higher layer + case kEplSdoComConEventAbort: + { + EplSdoComClientSendAbort(pSdoComCon, + *((DWORD *) + pSdoComCon-> + m_pData)); + + // inc transaction id + pSdoComCon->m_bTransactionId++; + // change state + pSdoComCon->m_SdoComState = + kEplSdoComStateClientConnected; + // call callback of application + pSdoComCon->m_dwLastAbortCode = + *((DWORD *) pSdoComCon->m_pData); + Ret = + EplSdoComTransferFinished + (SdoComCon_p, pSdoComCon, + kEplSdoComTransferTxAborted); + + break; + } + + case kEplSdoComConEventInitError: + case kEplSdoComConEventTimeout: + { + // close sequence layer handle + Ret = + EplSdoAsySeqDelCon(pSdoComCon-> + m_SdoSeqConHdl); + pSdoComCon->m_SdoSeqConHdl |= + EPL_SDO_SEQ_INVALID_HDL; + // change state + pSdoComCon->m_SdoComState = + kEplSdoComStateClientWaitInit; + // call callback of application + pSdoComCon->m_dwLastAbortCode = + EPL_SDOAC_TIME_OUT; + Ret = + EplSdoComTransferFinished + (SdoComCon_p, pSdoComCon, + kEplSdoComTransferLowerLayerAbort); + + } + + default: + // d.k. do nothing + break; + + } // end of switch(SdoComConEvent_p) + + break; + } #endif // endo of #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) - }// end of switch(pSdoComCon->m_SdoComState) - - + } // end of switch(pSdoComCon->m_SdoComState) #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) -Exit: + Exit: #endif #if defined(WIN32) || defined(_WIN32) - // leave critical section for process function - EPL_DBGLVL_SDO_TRACE0("\n\tLeaveCriticalSection EplSdoComProcessIntern\n\n"); - LeaveCriticalSection(SdoComInstance_g.m_pCriticalSection); + // leave critical section for process function + EPL_DBGLVL_SDO_TRACE0 + ("\n\tLeaveCriticalSection EplSdoComProcessIntern\n\n"); + LeaveCriticalSection(SdoComInstance_g.m_pCriticalSection); #endif - return Ret; + return Ret; } - //--------------------------------------------------------------------------- // // Function: EplSdoComServerInitReadByIndex @@ -1819,123 +1957,110 @@ Exit: // //--------------------------------------------------------------------------- #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0) -static tEplKernel EplSdoComServerInitReadByIndex(tEplSdoComCon* pSdoComCon_p, - tEplAsySdoCom* pAsySdoCom_p) +static tEplKernel EplSdoComServerInitReadByIndex(tEplSdoComCon * pSdoComCon_p, + tEplAsySdoCom * pAsySdoCom_p) { -tEplKernel Ret; -unsigned int uiIndex; -unsigned int uiSubindex; -tEplObdSize EntrySize; -tEplObdAccess AccessType; -DWORD dwAbortCode; + tEplKernel Ret; + unsigned int uiIndex; + unsigned int uiSubindex; + tEplObdSize EntrySize; + tEplObdAccess AccessType; + DWORD dwAbortCode; - dwAbortCode = 0; + dwAbortCode = 0; - // a init of a read could not be a segmented transfer - // -> no variable part of header + // a init of a read could not be a segmented transfer + // -> no variable part of header - // get index and subindex - uiIndex = AmiGetWordFromLe(&pAsySdoCom_p->m_le_abCommandData[0]); - uiSubindex = AmiGetByteFromLe(&pAsySdoCom_p->m_le_abCommandData[2]); + // get index and subindex + uiIndex = AmiGetWordFromLe(&pAsySdoCom_p->m_le_abCommandData[0]); + uiSubindex = AmiGetByteFromLe(&pAsySdoCom_p->m_le_abCommandData[2]); - // check accesstype of entry - // existens of entry + // check accesstype of entry + // existens of entry //#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0) - Ret = EplObduGetAccessType(uiIndex, uiSubindex, &AccessType); + Ret = EplObduGetAccessType(uiIndex, uiSubindex, &AccessType); /*#else Ret = kEplObdSubindexNotExist; AccessType = 0; #endif*/ - if(Ret == kEplObdSubindexNotExist) - { // subentry doesn't exist - dwAbortCode = EPL_SDOAC_SUB_INDEX_NOT_EXIST; - // send abort - pSdoComCon_p->m_pData = (BYTE*)&dwAbortCode; - Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p, - uiIndex, - uiSubindex, - kEplSdoComSendTypeAbort); - goto Exit; - } - else if(Ret != kEplSuccessful) - { // entry doesn't exist - dwAbortCode = EPL_SDOAC_OBJECT_NOT_EXIST; - // send abort - pSdoComCon_p->m_pData = (BYTE*)&dwAbortCode; - Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p, - uiIndex, - uiSubindex, - kEplSdoComSendTypeAbort); - goto Exit; - } - - // compare accesstype must be read or const - if(((AccessType & kEplObdAccRead) == 0) - && ((AccessType & kEplObdAccConst) == 0)) - { - - if((AccessType & kEplObdAccWrite) != 0) - { - // entry read a write only object - dwAbortCode = EPL_SDOAC_READ_TO_WRITE_ONLY_OBJ; - } - else - { - dwAbortCode = EPL_SDOAC_UNSUPPORTED_ACCESS; - } - // send abort - pSdoComCon_p->m_pData = (BYTE*)&dwAbortCode; - Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p, - uiIndex, - uiSubindex, - kEplSdoComSendTypeAbort); - goto Exit; - } - - // save service - pSdoComCon_p->m_SdoServiceType = kEplSdoServiceReadByIndex; - - // get size of object to see iof segmented or expedited transfer + if (Ret == kEplObdSubindexNotExist) { // subentry doesn't exist + dwAbortCode = EPL_SDOAC_SUB_INDEX_NOT_EXIST; + // send abort + pSdoComCon_p->m_pData = (BYTE *) & dwAbortCode; + Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p, + uiIndex, + uiSubindex, + kEplSdoComSendTypeAbort); + goto Exit; + } else if (Ret != kEplSuccessful) { // entry doesn't exist + dwAbortCode = EPL_SDOAC_OBJECT_NOT_EXIST; + // send abort + pSdoComCon_p->m_pData = (BYTE *) & dwAbortCode; + Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p, + uiIndex, + uiSubindex, + kEplSdoComSendTypeAbort); + goto Exit; + } + // compare accesstype must be read or const + if (((AccessType & kEplObdAccRead) == 0) + && ((AccessType & kEplObdAccConst) == 0)) { + + if ((AccessType & kEplObdAccWrite) != 0) { + // entry read a write only object + dwAbortCode = EPL_SDOAC_READ_TO_WRITE_ONLY_OBJ; + } else { + dwAbortCode = EPL_SDOAC_UNSUPPORTED_ACCESS; + } + // send abort + pSdoComCon_p->m_pData = (BYTE *) & dwAbortCode; + Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p, + uiIndex, + uiSubindex, + kEplSdoComSendTypeAbort); + goto Exit; + } + // save service + pSdoComCon_p->m_SdoServiceType = kEplSdoServiceReadByIndex; + + // get size of object to see iof segmented or expedited transfer //#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0) - EntrySize = EplObduGetDataSize(uiIndex, uiSubindex); + EntrySize = EplObduGetDataSize(uiIndex, uiSubindex); /*#else EntrySize = 0; #endif*/ - if(EntrySize > EPL_SDO_MAX_PAYLOAD) - { // segmented transfer - pSdoComCon_p->m_SdoTransType = kEplSdoTransSegmented; - // get pointer to object-entry data + if (EntrySize > EPL_SDO_MAX_PAYLOAD) { // segmented transfer + pSdoComCon_p->m_SdoTransType = kEplSdoTransSegmented; + // get pointer to object-entry data //#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0) - pSdoComCon_p->m_pData = EplObduGetObjectDataPtr(uiIndex, uiSubindex); + pSdoComCon_p->m_pData = + EplObduGetObjectDataPtr(uiIndex, uiSubindex); //#endif - } - else - { // expedited transfer - pSdoComCon_p->m_SdoTransType = kEplSdoTransExpedited; - } - - pSdoComCon_p->m_uiTransSize = EntrySize; - pSdoComCon_p->m_uiTransferredByte = 0; - - Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p, - uiIndex, - uiSubindex, - kEplSdoComSendTypeRes); - if(Ret != kEplSuccessful) - { - // error -> abort - dwAbortCode = EPL_SDOAC_GENERAL_ERROR; - // send abort - pSdoComCon_p->m_pData = (BYTE*)&dwAbortCode; - Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p, - uiIndex, - uiSubindex, - kEplSdoComSendTypeAbort); - goto Exit; - } - -Exit: - return Ret; + } else { // expedited transfer + pSdoComCon_p->m_SdoTransType = kEplSdoTransExpedited; + } + + pSdoComCon_p->m_uiTransSize = EntrySize; + pSdoComCon_p->m_uiTransferredByte = 0; + + Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p, + uiIndex, + uiSubindex, kEplSdoComSendTypeRes); + if (Ret != kEplSuccessful) { + // error -> abort + dwAbortCode = EPL_SDOAC_GENERAL_ERROR; + // send abort + pSdoComCon_p->m_pData = (BYTE *) & dwAbortCode; + Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p, + uiIndex, + uiSubindex, + kEplSdoComSendTypeAbort); + goto Exit; + } + + Exit: + return Ret; } #endif @@ -1959,219 +2084,266 @@ Exit: // //--------------------------------------------------------------------------- #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0) -static tEplKernel EplSdoComServerSendFrameIntern(tEplSdoComCon* pSdoComCon_p, - unsigned int uiIndex_p, - unsigned int uiSubIndex_p, - tEplSdoComSendType SendType_p) +static tEplKernel EplSdoComServerSendFrameIntern(tEplSdoComCon * pSdoComCon_p, + unsigned int uiIndex_p, + unsigned int uiSubIndex_p, + tEplSdoComSendType SendType_p) { -tEplKernel Ret; -BYTE abFrame[EPL_MAX_SDO_FRAME_SIZE]; -tEplFrame* pFrame; -tEplAsySdoCom* pCommandFrame; -unsigned int uiSizeOfFrame; -BYTE bFlag; - - Ret = kEplSuccessful; - - pFrame = (tEplFrame*)&abFrame[0]; - - EPL_MEMSET(&abFrame[0], 0x00, sizeof(abFrame)); - - // build generic part of frame - // get pointer to command layerpart of frame - pCommandFrame = &pFrame->m_Data.m_Asnd.m_Payload.m_SdoSequenceFrame.m_le_abSdoSeqPayload; - AmiSetByteToLe(&pCommandFrame->m_le_bCommandId, pSdoComCon_p->m_SdoServiceType); - AmiSetByteToLe(&pCommandFrame->m_le_bTransactionId, pSdoComCon_p->m_bTransactionId); - - // set size to header size - uiSizeOfFrame = 8; - - // check SendType - switch(SendType_p) - { - // requestframe to send - case kEplSdoComSendTypeReq: - { - // nothing to do for server - //-> error - Ret = kEplSdoComInvalidSendType; - break; - } - - // response without data to send - case kEplSdoComSendTypeAckRes: - { - // set response flag - AmiSetByteToLe(&pCommandFrame->m_le_bFlags, 0x80); - - // send frame - Ret = EplSdoAsySeqSendData(pSdoComCon_p->m_SdoSeqConHdl, - uiSizeOfFrame, - pFrame); - - break; - } - - // responsframe to send - case kEplSdoComSendTypeRes: - { - // set response flag - bFlag = AmiGetByteFromLe( &pCommandFrame->m_le_bFlags); - bFlag |= 0x80; - AmiSetByteToLe(&pCommandFrame->m_le_bFlags, bFlag); - - // check type of resonse - if(pSdoComCon_p->m_SdoTransType == kEplSdoTransExpedited) - { // Expedited transfer - // copy data in frame + tEplKernel Ret; + BYTE abFrame[EPL_MAX_SDO_FRAME_SIZE]; + tEplFrame *pFrame; + tEplAsySdoCom *pCommandFrame; + unsigned int uiSizeOfFrame; + BYTE bFlag; + + Ret = kEplSuccessful; + + pFrame = (tEplFrame *) & abFrame[0]; + + EPL_MEMSET(&abFrame[0], 0x00, sizeof(abFrame)); + + // build generic part of frame + // get pointer to command layerpart of frame + pCommandFrame = + &pFrame->m_Data.m_Asnd.m_Payload.m_SdoSequenceFrame. + m_le_abSdoSeqPayload; + AmiSetByteToLe(&pCommandFrame->m_le_bCommandId, + pSdoComCon_p->m_SdoServiceType); + AmiSetByteToLe(&pCommandFrame->m_le_bTransactionId, + pSdoComCon_p->m_bTransactionId); + + // set size to header size + uiSizeOfFrame = 8; + + // check SendType + switch (SendType_p) { + // requestframe to send + case kEplSdoComSendTypeReq: + { + // nothing to do for server + //-> error + Ret = kEplSdoComInvalidSendType; + break; + } + + // response without data to send + case kEplSdoComSendTypeAckRes: + { + // set response flag + AmiSetByteToLe(&pCommandFrame->m_le_bFlags, 0x80); + + // send frame + Ret = EplSdoAsySeqSendData(pSdoComCon_p->m_SdoSeqConHdl, + uiSizeOfFrame, pFrame); + + break; + } + + // responsframe to send + case kEplSdoComSendTypeRes: + { + // set response flag + bFlag = AmiGetByteFromLe(&pCommandFrame->m_le_bFlags); + bFlag |= 0x80; + AmiSetByteToLe(&pCommandFrame->m_le_bFlags, bFlag); + + // check type of resonse + if (pSdoComCon_p->m_SdoTransType == kEplSdoTransExpedited) { // Expedited transfer + // copy data in frame //#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0) - Ret = EplObduReadEntryToLe(uiIndex_p, - uiSubIndex_p, - &pCommandFrame->m_le_abCommandData[0], - (tEplObdSize*)&pSdoComCon_p->m_uiTransSize); - if(Ret != kEplSuccessful) - { - goto Exit; - } + Ret = EplObduReadEntryToLe(uiIndex_p, + uiSubIndex_p, + &pCommandFrame-> + m_le_abCommandData + [0], + (tEplObdSize *) & + pSdoComCon_p-> + m_uiTransSize); + if (Ret != kEplSuccessful) { + goto Exit; + } //#endif - // set size of frame - AmiSetWordToLe(&pCommandFrame->m_le_wSegmentSize, (WORD) pSdoComCon_p->m_uiTransSize); - - // correct byte-counter - uiSizeOfFrame += pSdoComCon_p->m_uiTransSize; - pSdoComCon_p->m_uiTransferredByte += pSdoComCon_p->m_uiTransSize; - pSdoComCon_p->m_uiTransSize = 0; - - - // send frame - uiSizeOfFrame += pSdoComCon_p->m_uiTransSize; - Ret = EplSdoAsySeqSendData(pSdoComCon_p->m_SdoSeqConHdl, - uiSizeOfFrame, - pFrame); - } - else if(pSdoComCon_p->m_SdoTransType == kEplSdoTransSegmented) - { // segmented transfer - // distinguish between init, segment and complete - if(pSdoComCon_p->m_uiTransferredByte == 0) - { // init - // set init flag - bFlag = AmiGetByteFromLe( &pCommandFrame->m_le_bFlags); - bFlag |= 0x10; - AmiSetByteToLe(&pCommandFrame->m_le_bFlags, bFlag); - // init variable header - AmiSetDwordToLe(&pCommandFrame->m_le_abCommandData[0],pSdoComCon_p->m_uiTransSize); - // copy data in frame - EPL_MEMCPY(&pCommandFrame->m_le_abCommandData[4],pSdoComCon_p->m_pData, (EPL_SDO_MAX_PAYLOAD-4)); - - // correct byte-counter - pSdoComCon_p->m_uiTransSize -= (EPL_SDO_MAX_PAYLOAD-4); - pSdoComCon_p->m_uiTransferredByte += (EPL_SDO_MAX_PAYLOAD-4); - // move data pointer - pSdoComCon_p->m_pData +=(EPL_SDO_MAX_PAYLOAD-4); - - // set segment size - AmiSetWordToLe(&pCommandFrame->m_le_wSegmentSize,(EPL_SDO_MAX_PAYLOAD-4)); - - // send frame - uiSizeOfFrame += EPL_SDO_MAX_PAYLOAD; - Ret = EplSdoAsySeqSendData(pSdoComCon_p->m_SdoSeqConHdl, - uiSizeOfFrame, - pFrame); - - } - else if((pSdoComCon_p->m_uiTransferredByte > 0) - &&(pSdoComCon_p->m_uiTransSize > EPL_SDO_MAX_PAYLOAD)) - { // segment - // set segment flag - bFlag = AmiGetByteFromLe( &pCommandFrame->m_le_bFlags); - bFlag |= 0x20; - AmiSetByteToLe(&pCommandFrame->m_le_bFlags, bFlag); - - // copy data in frame - EPL_MEMCPY(&pCommandFrame->m_le_abCommandData[0],pSdoComCon_p->m_pData, EPL_SDO_MAX_PAYLOAD); - - // correct byte-counter - pSdoComCon_p->m_uiTransSize -= EPL_SDO_MAX_PAYLOAD; - pSdoComCon_p->m_uiTransferredByte += EPL_SDO_MAX_PAYLOAD; - // move data pointer - pSdoComCon_p->m_pData +=EPL_SDO_MAX_PAYLOAD; - - // set segment size - AmiSetWordToLe(&pCommandFrame->m_le_wSegmentSize,EPL_SDO_MAX_PAYLOAD); - - // send frame - uiSizeOfFrame += EPL_SDO_MAX_PAYLOAD; - Ret = EplSdoAsySeqSendData(pSdoComCon_p->m_SdoSeqConHdl, - uiSizeOfFrame, - pFrame); - } - else - { - if((pSdoComCon_p->m_uiTransSize == 0) - && (pSdoComCon_p->m_SdoServiceType != kEplSdoServiceWriteByIndex)) - { - goto Exit; - } - // complete - // set segment complete flag - bFlag = AmiGetByteFromLe( &pCommandFrame->m_le_bFlags); - bFlag |= 0x30; - AmiSetByteToLe(&pCommandFrame->m_le_bFlags, bFlag); - - // copy data in frame - EPL_MEMCPY(&pCommandFrame->m_le_abCommandData[0],pSdoComCon_p->m_pData, pSdoComCon_p->m_uiTransSize); - - // correct byte-counter - pSdoComCon_p->m_uiTransferredByte += pSdoComCon_p->m_uiTransSize; - - - // move data pointer - pSdoComCon_p->m_pData +=pSdoComCon_p->m_uiTransSize; - - // set segment size - AmiSetWordToLe(&pCommandFrame->m_le_wSegmentSize, (WORD) pSdoComCon_p->m_uiTransSize); - - // send frame - uiSizeOfFrame += pSdoComCon_p->m_uiTransSize; - pSdoComCon_p->m_uiTransSize = 0; - Ret = EplSdoAsySeqSendData(pSdoComCon_p->m_SdoSeqConHdl, - uiSizeOfFrame, - pFrame); - } - - } - break; - } - // abort to send - case kEplSdoComSendTypeAbort: - { - // set response and abort flag - bFlag = AmiGetByteFromLe( &pCommandFrame->m_le_bFlags); - bFlag |= 0xC0; - AmiSetByteToLe(&pCommandFrame->m_le_bFlags, bFlag); - - // copy abortcode to frame - AmiSetDwordToLe(&pCommandFrame->m_le_abCommandData[0], *((DWORD*)pSdoComCon_p->m_pData)); - - // set size of segment - AmiSetWordToLe(&pCommandFrame->m_le_wSegmentSize, sizeof(DWORD)); - - // update counter - pSdoComCon_p->m_uiTransferredByte = sizeof(DWORD); - pSdoComCon_p->m_uiTransSize = 0; - - // calc framesize - uiSizeOfFrame += sizeof(DWORD); - Ret = EplSdoAsySeqSendData(pSdoComCon_p->m_SdoSeqConHdl, - uiSizeOfFrame, - pFrame); - break; - } - } // end of switch(SendType_p) - -Exit: - return Ret; + // set size of frame + AmiSetWordToLe(&pCommandFrame-> + m_le_wSegmentSize, + (WORD) pSdoComCon_p-> + m_uiTransSize); + + // correct byte-counter + uiSizeOfFrame += pSdoComCon_p->m_uiTransSize; + pSdoComCon_p->m_uiTransferredByte += + pSdoComCon_p->m_uiTransSize; + pSdoComCon_p->m_uiTransSize = 0; + + // send frame + uiSizeOfFrame += pSdoComCon_p->m_uiTransSize; + Ret = + EplSdoAsySeqSendData(pSdoComCon_p-> + m_SdoSeqConHdl, + uiSizeOfFrame, pFrame); + } else if (pSdoComCon_p->m_SdoTransType == kEplSdoTransSegmented) { // segmented transfer + // distinguish between init, segment and complete + if (pSdoComCon_p->m_uiTransferredByte == 0) { // init + // set init flag + bFlag = + AmiGetByteFromLe(&pCommandFrame-> + m_le_bFlags); + bFlag |= 0x10; + AmiSetByteToLe(&pCommandFrame-> + m_le_bFlags, bFlag); + // init variable header + AmiSetDwordToLe(&pCommandFrame-> + m_le_abCommandData[0], + pSdoComCon_p-> + m_uiTransSize); + // copy data in frame + EPL_MEMCPY(&pCommandFrame-> + m_le_abCommandData[4], + pSdoComCon_p->m_pData, + (EPL_SDO_MAX_PAYLOAD - 4)); + + // correct byte-counter + pSdoComCon_p->m_uiTransSize -= + (EPL_SDO_MAX_PAYLOAD - 4); + pSdoComCon_p->m_uiTransferredByte += + (EPL_SDO_MAX_PAYLOAD - 4); + // move data pointer + pSdoComCon_p->m_pData += + (EPL_SDO_MAX_PAYLOAD - 4); + + // set segment size + AmiSetWordToLe(&pCommandFrame-> + m_le_wSegmentSize, + (EPL_SDO_MAX_PAYLOAD - + 4)); + + // send frame + uiSizeOfFrame += EPL_SDO_MAX_PAYLOAD; + Ret = + EplSdoAsySeqSendData(pSdoComCon_p-> + m_SdoSeqConHdl, + uiSizeOfFrame, + pFrame); + + } else + if ((pSdoComCon_p->m_uiTransferredByte > 0) + && (pSdoComCon_p->m_uiTransSize > EPL_SDO_MAX_PAYLOAD)) { // segment + // set segment flag + bFlag = + AmiGetByteFromLe(&pCommandFrame-> + m_le_bFlags); + bFlag |= 0x20; + AmiSetByteToLe(&pCommandFrame-> + m_le_bFlags, bFlag); + + // copy data in frame + EPL_MEMCPY(&pCommandFrame-> + m_le_abCommandData[0], + pSdoComCon_p->m_pData, + EPL_SDO_MAX_PAYLOAD); + + // correct byte-counter + pSdoComCon_p->m_uiTransSize -= + EPL_SDO_MAX_PAYLOAD; + pSdoComCon_p->m_uiTransferredByte += + EPL_SDO_MAX_PAYLOAD; + // move data pointer + pSdoComCon_p->m_pData += + EPL_SDO_MAX_PAYLOAD; + + // set segment size + AmiSetWordToLe(&pCommandFrame-> + m_le_wSegmentSize, + EPL_SDO_MAX_PAYLOAD); + + // send frame + uiSizeOfFrame += EPL_SDO_MAX_PAYLOAD; + Ret = + EplSdoAsySeqSendData(pSdoComCon_p-> + m_SdoSeqConHdl, + uiSizeOfFrame, + pFrame); + } else { + if ((pSdoComCon_p->m_uiTransSize == 0) + && (pSdoComCon_p-> + m_SdoServiceType != + kEplSdoServiceWriteByIndex)) { + goto Exit; + } + // complete + // set segment complete flag + bFlag = + AmiGetByteFromLe(&pCommandFrame-> + m_le_bFlags); + bFlag |= 0x30; + AmiSetByteToLe(&pCommandFrame-> + m_le_bFlags, bFlag); + + // copy data in frame + EPL_MEMCPY(&pCommandFrame-> + m_le_abCommandData[0], + pSdoComCon_p->m_pData, + pSdoComCon_p->m_uiTransSize); + + // correct byte-counter + pSdoComCon_p->m_uiTransferredByte += + pSdoComCon_p->m_uiTransSize; + + // move data pointer + pSdoComCon_p->m_pData += + pSdoComCon_p->m_uiTransSize; + + // set segment size + AmiSetWordToLe(&pCommandFrame-> + m_le_wSegmentSize, + (WORD) pSdoComCon_p-> + m_uiTransSize); + + // send frame + uiSizeOfFrame += + pSdoComCon_p->m_uiTransSize; + pSdoComCon_p->m_uiTransSize = 0; + Ret = + EplSdoAsySeqSendData(pSdoComCon_p-> + m_SdoSeqConHdl, + uiSizeOfFrame, + pFrame); + } + + } + break; + } + // abort to send + case kEplSdoComSendTypeAbort: + { + // set response and abort flag + bFlag = AmiGetByteFromLe(&pCommandFrame->m_le_bFlags); + bFlag |= 0xC0; + AmiSetByteToLe(&pCommandFrame->m_le_bFlags, bFlag); + + // copy abortcode to frame + AmiSetDwordToLe(&pCommandFrame->m_le_abCommandData[0], + *((DWORD *) pSdoComCon_p->m_pData)); + + // set size of segment + AmiSetWordToLe(&pCommandFrame->m_le_wSegmentSize, + sizeof(DWORD)); + + // update counter + pSdoComCon_p->m_uiTransferredByte = sizeof(DWORD); + pSdoComCon_p->m_uiTransSize = 0; + + // calc framesize + uiSizeOfFrame += sizeof(DWORD); + Ret = EplSdoAsySeqSendData(pSdoComCon_p->m_SdoSeqConHdl, + uiSizeOfFrame, pFrame); + break; + } + } // end of switch(SendType_p) + + Exit: + return Ret; } #endif //--------------------------------------------------------------------------- @@ -2192,260 +2364,254 @@ Exit: // //--------------------------------------------------------------------------- #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0) -static tEplKernel EplSdoComServerInitWriteByIndex(tEplSdoComCon* pSdoComCon_p, - tEplAsySdoCom* pAsySdoCom_p) +static tEplKernel EplSdoComServerInitWriteByIndex(tEplSdoComCon * pSdoComCon_p, + tEplAsySdoCom * pAsySdoCom_p) { -tEplKernel Ret = kEplSuccessful; -unsigned int uiIndex; -unsigned int uiSubindex; -unsigned int uiBytesToTransfer; -tEplObdSize EntrySize; -tEplObdAccess AccessType; -DWORD dwAbortCode; -BYTE* pbSrcData; - - dwAbortCode = 0; - - // a init of a write - // -> variable part of header possible - - // check if expedited or segmented transfer - if ((pAsySdoCom_p->m_le_bFlags & 0x30) == 0x10) - { // initiate segmented transfer - pSdoComCon_p->m_SdoTransType = kEplSdoTransSegmented; - // get index and subindex - uiIndex = AmiGetWordFromLe(&pAsySdoCom_p->m_le_abCommandData[4]); - uiSubindex = AmiGetByteFromLe(&pAsySdoCom_p->m_le_abCommandData[6]); - // get source-pointer for copy - pbSrcData = &pAsySdoCom_p->m_le_abCommandData[8]; - // save size - pSdoComCon_p->m_uiTransSize = AmiGetDwordFromLe(&pAsySdoCom_p->m_le_abCommandData[0]); - - } - else if ((pAsySdoCom_p->m_le_bFlags & 0x30) == 0x00) - { // expedited transfer - pSdoComCon_p->m_SdoTransType = kEplSdoTransExpedited; - // get index and subindex - uiIndex = AmiGetWordFromLe(&pAsySdoCom_p->m_le_abCommandData[0]); - uiSubindex = AmiGetByteFromLe(&pAsySdoCom_p->m_le_abCommandData[2]); - // get source-pointer for copy - pbSrcData = &pAsySdoCom_p->m_le_abCommandData[4]; - // save size - pSdoComCon_p->m_uiTransSize = AmiGetWordFromLe(&pAsySdoCom_p->m_le_wSegmentSize); - // subtract header - pSdoComCon_p->m_uiTransSize -= 4; - - } - else - { - // just ignore any other transfer type - goto Exit; - } - - // check accesstype of entry - // existens of entry + tEplKernel Ret = kEplSuccessful; + unsigned int uiIndex; + unsigned int uiSubindex; + unsigned int uiBytesToTransfer; + tEplObdSize EntrySize; + tEplObdAccess AccessType; + DWORD dwAbortCode; + BYTE *pbSrcData; + + dwAbortCode = 0; + + // a init of a write + // -> variable part of header possible + + // check if expedited or segmented transfer + if ((pAsySdoCom_p->m_le_bFlags & 0x30) == 0x10) { // initiate segmented transfer + pSdoComCon_p->m_SdoTransType = kEplSdoTransSegmented; + // get index and subindex + uiIndex = + AmiGetWordFromLe(&pAsySdoCom_p->m_le_abCommandData[4]); + uiSubindex = + AmiGetByteFromLe(&pAsySdoCom_p->m_le_abCommandData[6]); + // get source-pointer for copy + pbSrcData = &pAsySdoCom_p->m_le_abCommandData[8]; + // save size + pSdoComCon_p->m_uiTransSize = + AmiGetDwordFromLe(&pAsySdoCom_p->m_le_abCommandData[0]); + + } else if ((pAsySdoCom_p->m_le_bFlags & 0x30) == 0x00) { // expedited transfer + pSdoComCon_p->m_SdoTransType = kEplSdoTransExpedited; + // get index and subindex + uiIndex = + AmiGetWordFromLe(&pAsySdoCom_p->m_le_abCommandData[0]); + uiSubindex = + AmiGetByteFromLe(&pAsySdoCom_p->m_le_abCommandData[2]); + // get source-pointer for copy + pbSrcData = &pAsySdoCom_p->m_le_abCommandData[4]; + // save size + pSdoComCon_p->m_uiTransSize = + AmiGetWordFromLe(&pAsySdoCom_p->m_le_wSegmentSize); + // subtract header + pSdoComCon_p->m_uiTransSize -= 4; + + } else { + // just ignore any other transfer type + goto Exit; + } + + // check accesstype of entry + // existens of entry //#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0) - Ret = EplObduGetAccessType(uiIndex, uiSubindex, &AccessType); + Ret = EplObduGetAccessType(uiIndex, uiSubindex, &AccessType); /*#else Ret = kEplObdSubindexNotExist; AccessType = 0; #endif*/ - if (Ret == kEplObdSubindexNotExist) - { // subentry doesn't exist - pSdoComCon_p->m_dwLastAbortCode = EPL_SDOAC_SUB_INDEX_NOT_EXIST; - // send abort - // d.k. This is wrong: k.t. not needed send abort on end of write - /*pSdoComCon_p->m_pData = (BYTE*)pSdoComCon_p->m_dwLastAbortCode; - Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p, - uiIndex, - uiSubindex, - kEplSdoComSendTypeAbort);*/ - goto Abort; - } - else if(Ret != kEplSuccessful) - { // entry doesn't exist - pSdoComCon_p->m_dwLastAbortCode = EPL_SDOAC_OBJECT_NOT_EXIST; - // send abort - // d.k. This is wrong: k.t. not needed send abort on end of write - /* - pSdoComCon_p->m_pData = (BYTE*)&dwAbortCode; - Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p, - uiIndex, - uiSubindex, - kEplSdoComSendTypeAbort);*/ - goto Abort; - } - - // compare accesstype must be read - if((AccessType & kEplObdAccWrite) == 0) - { - - if((AccessType & kEplObdAccRead) != 0) - { - // entry write a read only object - pSdoComCon_p->m_dwLastAbortCode = EPL_SDOAC_WRITE_TO_READ_ONLY_OBJ; - } - else - { - pSdoComCon_p->m_dwLastAbortCode = EPL_SDOAC_UNSUPPORTED_ACCESS; - } - // send abort - // d.k. This is wrong: k.t. not needed send abort on end of write - /*pSdoComCon_p->m_pData = (BYTE*)&dwAbortCode; - Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p, - uiIndex, - uiSubindex, - kEplSdoComSendTypeAbort);*/ - goto Abort; - } - - // save service - pSdoComCon_p->m_SdoServiceType = kEplSdoServiceWriteByIndex; - - pSdoComCon_p->m_uiTransferredByte = 0; - - // write data to OD - if(pSdoComCon_p->m_SdoTransType == kEplSdoTransExpedited) - { // expedited transfer - // size checking is done by EplObduWriteEntryFromLe() + if (Ret == kEplObdSubindexNotExist) { // subentry doesn't exist + pSdoComCon_p->m_dwLastAbortCode = EPL_SDOAC_SUB_INDEX_NOT_EXIST; + // send abort + // d.k. This is wrong: k.t. not needed send abort on end of write + /*pSdoComCon_p->m_pData = (BYTE*)pSdoComCon_p->m_dwLastAbortCode; + Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p, + uiIndex, + uiSubindex, + kEplSdoComSendTypeAbort); */ + goto Abort; + } else if (Ret != kEplSuccessful) { // entry doesn't exist + pSdoComCon_p->m_dwLastAbortCode = EPL_SDOAC_OBJECT_NOT_EXIST; + // send abort + // d.k. This is wrong: k.t. not needed send abort on end of write + /* + pSdoComCon_p->m_pData = (BYTE*)&dwAbortCode; + Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p, + uiIndex, + uiSubindex, + kEplSdoComSendTypeAbort); */ + goto Abort; + } + // compare accesstype must be read + if ((AccessType & kEplObdAccWrite) == 0) { + + if ((AccessType & kEplObdAccRead) != 0) { + // entry write a read only object + pSdoComCon_p->m_dwLastAbortCode = + EPL_SDOAC_WRITE_TO_READ_ONLY_OBJ; + } else { + pSdoComCon_p->m_dwLastAbortCode = + EPL_SDOAC_UNSUPPORTED_ACCESS; + } + // send abort + // d.k. This is wrong: k.t. not needed send abort on end of write + /*pSdoComCon_p->m_pData = (BYTE*)&dwAbortCode; + Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p, + uiIndex, + uiSubindex, + kEplSdoComSendTypeAbort); */ + goto Abort; + } + // save service + pSdoComCon_p->m_SdoServiceType = kEplSdoServiceWriteByIndex; + + pSdoComCon_p->m_uiTransferredByte = 0; + + // write data to OD + if (pSdoComCon_p->m_SdoTransType == kEplSdoTransExpedited) { // expedited transfer + // size checking is done by EplObduWriteEntryFromLe() //#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0) - Ret = EplObduWriteEntryFromLe(uiIndex, - uiSubindex, - pbSrcData, - pSdoComCon_p->m_uiTransSize); - switch (Ret) - { - case kEplSuccessful: - { - break; - } - - case kEplObdAccessViolation: - { - pSdoComCon_p->m_dwLastAbortCode = EPL_SDOAC_UNSUPPORTED_ACCESS; - // send abort - goto Abort; - } - - case kEplObdValueLengthError: - { - pSdoComCon_p->m_dwLastAbortCode = EPL_SDOAC_DATA_TYPE_LENGTH_NOT_MATCH; - // send abort - goto Abort; - } - - case kEplObdValueTooHigh: - { - pSdoComCon_p->m_dwLastAbortCode = EPL_SDOAC_VALUE_RANGE_TOO_HIGH; - // send abort - goto Abort; - } - - case kEplObdValueTooLow: - { - pSdoComCon_p->m_dwLastAbortCode = EPL_SDOAC_VALUE_RANGE_TOO_LOW; - // send abort - goto Abort; - } - - default: - { - pSdoComCon_p->m_dwLastAbortCode = EPL_SDOAC_GENERAL_ERROR; - // send abort - goto Abort; - } - } + Ret = EplObduWriteEntryFromLe(uiIndex, + uiSubindex, + pbSrcData, + pSdoComCon_p->m_uiTransSize); + switch (Ret) { + case kEplSuccessful: + { + break; + } + + case kEplObdAccessViolation: + { + pSdoComCon_p->m_dwLastAbortCode = + EPL_SDOAC_UNSUPPORTED_ACCESS; + // send abort + goto Abort; + } + + case kEplObdValueLengthError: + { + pSdoComCon_p->m_dwLastAbortCode = + EPL_SDOAC_DATA_TYPE_LENGTH_NOT_MATCH; + // send abort + goto Abort; + } + + case kEplObdValueTooHigh: + { + pSdoComCon_p->m_dwLastAbortCode = + EPL_SDOAC_VALUE_RANGE_TOO_HIGH; + // send abort + goto Abort; + } + + case kEplObdValueTooLow: + { + pSdoComCon_p->m_dwLastAbortCode = + EPL_SDOAC_VALUE_RANGE_TOO_LOW; + // send abort + goto Abort; + } + + default: + { + pSdoComCon_p->m_dwLastAbortCode = + EPL_SDOAC_GENERAL_ERROR; + // send abort + goto Abort; + } + } //#endif - // send command acknowledge - Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p, - 0, - 0, - kEplSdoComSendTypeAckRes); - - pSdoComCon_p->m_uiTransSize = 0; - goto Exit; - } - else - { - // get size of the object to check if it fits - // because we directly write to the destination memory - // d.k. no one calls the user OD callback function - - //#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0) - EntrySize = EplObduGetDataSize(uiIndex, uiSubindex); - /*#else - EntrySize = 0; - #endif*/ - if(EntrySize < pSdoComCon_p->m_uiTransSize) - { // parameter too big - pSdoComCon_p->m_dwLastAbortCode = EPL_SDOAC_DATA_TYPE_LENGTH_TOO_HIGH; - // send abort - // d.k. This is wrong: k.t. not needed send abort on end of write - /*pSdoComCon_p->m_pData = (BYTE*)&dwAbortCode; - Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p, - uiIndex, - uiSubindex, - kEplSdoComSendTypeAbort);*/ - goto Abort; - } - - uiBytesToTransfer = AmiGetWordFromLe(&pAsySdoCom_p->m_le_wSegmentSize); - // eleminate header (Command header (8) + variable part (4) + Command header (4)) - uiBytesToTransfer -= 16; - // get pointer to object entry + // send command acknowledge + Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p, + 0, + 0, + kEplSdoComSendTypeAckRes); + + pSdoComCon_p->m_uiTransSize = 0; + goto Exit; + } else { + // get size of the object to check if it fits + // because we directly write to the destination memory + // d.k. no one calls the user OD callback function + + //#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0) + EntrySize = EplObduGetDataSize(uiIndex, uiSubindex); + /*#else + EntrySize = 0; + #endif */ + if (EntrySize < pSdoComCon_p->m_uiTransSize) { // parameter too big + pSdoComCon_p->m_dwLastAbortCode = + EPL_SDOAC_DATA_TYPE_LENGTH_TOO_HIGH; + // send abort + // d.k. This is wrong: k.t. not needed send abort on end of write + /*pSdoComCon_p->m_pData = (BYTE*)&dwAbortCode; + Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p, + uiIndex, + uiSubindex, + kEplSdoComSendTypeAbort); */ + goto Abort; + } + + uiBytesToTransfer = + AmiGetWordFromLe(&pAsySdoCom_p->m_le_wSegmentSize); + // eleminate header (Command header (8) + variable part (4) + Command header (4)) + uiBytesToTransfer -= 16; + // get pointer to object entry //#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0) - pSdoComCon_p->m_pData = EplObduGetObjectDataPtr(uiIndex, - uiSubindex); + pSdoComCon_p->m_pData = EplObduGetObjectDataPtr(uiIndex, + uiSubindex); //#endif - if(pSdoComCon_p->m_pData == NULL) - { - pSdoComCon_p->m_dwLastAbortCode = EPL_SDOAC_GENERAL_ERROR; - // send abort - // d.k. This is wrong: k.t. not needed send abort on end of write + if (pSdoComCon_p->m_pData == NULL) { + pSdoComCon_p->m_dwLastAbortCode = + EPL_SDOAC_GENERAL_ERROR; + // send abort + // d.k. This is wrong: k.t. not needed send abort on end of write /* pSdoComCon_p->m_pData = (BYTE*)&pSdoComCon_p->m_dwLastAbortCode; Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p, uiIndex, uiSubindex, kEplSdoComSendTypeAbort);*/ - goto Abort; - } - - // copy data - EPL_MEMCPY(pSdoComCon_p->m_pData, pbSrcData, uiBytesToTransfer); - - // update internal counter - pSdoComCon_p->m_uiTransferredByte = uiBytesToTransfer; - pSdoComCon_p->m_uiTransSize -= uiBytesToTransfer; - - // update target pointer - (/*(BYTE*)*/pSdoComCon_p->m_pData) += uiBytesToTransfer; - - // send acknowledge without any Command layer data - Ret = EplSdoAsySeqSendData(pSdoComCon_p->m_SdoSeqConHdl, - 0, - (tEplFrame*)NULL); - goto Exit; - } - -Abort: - if(pSdoComCon_p->m_dwLastAbortCode != 0) - { - // send abort - pSdoComCon_p->m_pData = (BYTE*)&pSdoComCon_p->m_dwLastAbortCode; - Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p, - uiIndex, - uiSubindex, - kEplSdoComSendTypeAbort); - - // reset abort code - pSdoComCon_p->m_dwLastAbortCode = 0; - pSdoComCon_p->m_uiTransSize = 0; - goto Exit; - } - -Exit: - return Ret; + goto Abort; + } + // copy data + EPL_MEMCPY(pSdoComCon_p->m_pData, pbSrcData, uiBytesToTransfer); + + // update internal counter + pSdoComCon_p->m_uiTransferredByte = uiBytesToTransfer; + pSdoComCon_p->m_uiTransSize -= uiBytesToTransfer; + + // update target pointer + ( /*(BYTE*) */ pSdoComCon_p->m_pData) += uiBytesToTransfer; + + // send acknowledge without any Command layer data + Ret = EplSdoAsySeqSendData(pSdoComCon_p->m_SdoSeqConHdl, + 0, (tEplFrame *) NULL); + goto Exit; + } + + Abort: + if (pSdoComCon_p->m_dwLastAbortCode != 0) { + // send abort + pSdoComCon_p->m_pData = + (BYTE *) & pSdoComCon_p->m_dwLastAbortCode; + Ret = + EplSdoComServerSendFrameIntern(pSdoComCon_p, uiIndex, + uiSubindex, + kEplSdoComSendTypeAbort); + + // reset abort code + pSdoComCon_p->m_dwLastAbortCode = 0; + pSdoComCon_p->m_uiTransSize = 0; + goto Exit; + } + + Exit: + return Ret; } #endif @@ -2466,210 +2632,293 @@ Exit: // //--------------------------------------------------------------------------- #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) -static tEplKernel EplSdoComClientSend(tEplSdoComCon* pSdoComCon_p) +static tEplKernel EplSdoComClientSend(tEplSdoComCon * pSdoComCon_p) { -tEplKernel Ret; -BYTE abFrame[EPL_MAX_SDO_FRAME_SIZE]; -tEplFrame* pFrame; -tEplAsySdoCom* pCommandFrame; -unsigned int uiSizeOfFrame; -BYTE bFlags; -BYTE* pbPayload; - - Ret = kEplSuccessful; - - pFrame = (tEplFrame*)&abFrame[0]; - - EPL_MEMSET(&abFrame[0], 0x00, sizeof(abFrame)); - - // build generic part of frame - // get pointer to command layerpart of frame - pCommandFrame = &pFrame->m_Data.m_Asnd.m_Payload.m_SdoSequenceFrame.m_le_abSdoSeqPayload; - AmiSetByteToLe( &pCommandFrame->m_le_bCommandId, pSdoComCon_p->m_SdoServiceType); - AmiSetByteToLe( &pCommandFrame->m_le_bTransactionId, pSdoComCon_p->m_bTransactionId); - - // set size constant part of header - uiSizeOfFrame = 8; - - // check if first frame to send -> command header needed - if (pSdoComCon_p->m_uiTransSize > 0) - { - if (pSdoComCon_p->m_uiTransferredByte == 0) - { // start SDO transfer - // check if segmented or expedited transfer - // only for write commands - switch(pSdoComCon_p->m_SdoServiceType) - { - case kEplSdoServiceReadByIndex: - { // first frame of read access always expedited - pSdoComCon_p->m_SdoTransType = kEplSdoTransExpedited; - pbPayload = &pCommandFrame->m_le_abCommandData[0]; - // fill rest of header - AmiSetWordToLe( &pCommandFrame->m_le_wSegmentSize, 4); - - // create command header - AmiSetWordToLe(pbPayload, (WORD)pSdoComCon_p->m_uiTargetIndex); - pbPayload += 2; - AmiSetByteToLe(pbPayload, (BYTE)pSdoComCon_p->m_uiTargetSubIndex); - // calc size - uiSizeOfFrame += 4; - - // set pSdoComCon_p->m_uiTransferredByte to one - pSdoComCon_p->m_uiTransferredByte = 1; - break; - } - - case kEplSdoServiceWriteByIndex: - { - if(pSdoComCon_p->m_uiTransSize > EPL_SDO_MAX_PAYLOAD ) - { // segmented transfer - // -> variable part of header needed - // save that transfer is segmented - pSdoComCon_p->m_SdoTransType = kEplSdoTransSegmented; - // fill variable part of header - AmiSetDwordToLe( &pCommandFrame->m_le_abCommandData[0], pSdoComCon_p->m_uiTransSize); - // set pointer to real payload - pbPayload = &pCommandFrame->m_le_abCommandData[4]; - // fill rest of header - AmiSetWordToLe( &pCommandFrame->m_le_wSegmentSize, EPL_SDO_MAX_PAYLOAD); - bFlags = 0x10; - AmiSetByteToLe( &pCommandFrame->m_le_bFlags, bFlags); - // create command header - AmiSetWordToLe(pbPayload, (WORD) pSdoComCon_p->m_uiTargetIndex); - pbPayload += 2; - AmiSetByteToLe(pbPayload, (BYTE)pSdoComCon_p->m_uiTargetSubIndex); - // on byte for reserved - pbPayload += 2; - // calc size - uiSizeOfFrame += EPL_SDO_MAX_PAYLOAD; - - // copy payload - EPL_MEMCPY( pbPayload,pSdoComCon_p->m_pData, (EPL_SDO_MAX_PAYLOAD - 8)); - pSdoComCon_p->m_pData += (EPL_SDO_MAX_PAYLOAD - 8); - // correct intern counter - pSdoComCon_p->m_uiTransSize -= (EPL_SDO_MAX_PAYLOAD - 8); - pSdoComCon_p->m_uiTransferredByte = (EPL_SDO_MAX_PAYLOAD - 8); - - } - else - { // expedited trandsfer - // save that transfer is expedited - pSdoComCon_p->m_SdoTransType = kEplSdoTransExpedited; - pbPayload = &pCommandFrame->m_le_abCommandData[0]; - - // create command header - AmiSetWordToLe(pbPayload, (WORD) pSdoComCon_p->m_uiTargetIndex); - pbPayload += 2; - AmiSetByteToLe(pbPayload, (BYTE)pSdoComCon_p->m_uiTargetSubIndex); - // + 2 -> one byte for subindex and one byte reserved - pbPayload += 2; - // copy data - EPL_MEMCPY( pbPayload,pSdoComCon_p->m_pData, pSdoComCon_p->m_uiTransSize); - // calc size - uiSizeOfFrame += (4 + pSdoComCon_p->m_uiTransSize); - // fill rest of header - AmiSetWordToLe( &pCommandFrame->m_le_wSegmentSize, (WORD) (4 + pSdoComCon_p->m_uiTransSize)); - - pSdoComCon_p->m_uiTransferredByte = pSdoComCon_p->m_uiTransSize; - pSdoComCon_p->m_uiTransSize = 0; - } - break; - } - - case kEplSdoServiceNIL: - default: - // invalid service requested - Ret = kEplSdoComInvalidServiceType; - goto Exit; - } // end of switch(pSdoComCon_p->m_SdoServiceType) - } - else // (pSdoComCon_p->m_uiTransferredByte > 0) - { // continue SDO transfer - switch(pSdoComCon_p->m_SdoServiceType) - { - // for expedited read is nothing to do - // -> server sends data - - case kEplSdoServiceWriteByIndex: - { // send next frame - if(pSdoComCon_p->m_SdoTransType == kEplSdoTransSegmented) - { - if(pSdoComCon_p->m_uiTransSize > EPL_SDO_MAX_PAYLOAD) - { // next segment - pbPayload = &pCommandFrame->m_le_abCommandData[0]; - // fill rest of header - AmiSetWordToLe( &pCommandFrame->m_le_wSegmentSize, EPL_SDO_MAX_PAYLOAD); - bFlags = 0x20; - AmiSetByteToLe( &pCommandFrame->m_le_bFlags, bFlags); - // copy data - EPL_MEMCPY( pbPayload,pSdoComCon_p->m_pData, EPL_SDO_MAX_PAYLOAD); - pSdoComCon_p->m_pData += EPL_SDO_MAX_PAYLOAD; - // correct intern counter - pSdoComCon_p->m_uiTransSize -= EPL_SDO_MAX_PAYLOAD; - pSdoComCon_p->m_uiTransferredByte = EPL_SDO_MAX_PAYLOAD; - // calc size - uiSizeOfFrame += EPL_SDO_MAX_PAYLOAD; - - - } - else - { // end of transfer - pbPayload = &pCommandFrame->m_le_abCommandData[0]; - // fill rest of header - AmiSetWordToLe( &pCommandFrame->m_le_wSegmentSize, (WORD) pSdoComCon_p->m_uiTransSize); - bFlags = 0x30; - AmiSetByteToLe( &pCommandFrame->m_le_bFlags, bFlags); - // copy data - EPL_MEMCPY( pbPayload,pSdoComCon_p->m_pData, pSdoComCon_p->m_uiTransSize); - pSdoComCon_p->m_pData += pSdoComCon_p->m_uiTransSize; - // calc size - uiSizeOfFrame += pSdoComCon_p->m_uiTransSize; - // correct intern counter - pSdoComCon_p->m_uiTransSize = 0; - pSdoComCon_p->m_uiTransferredByte = pSdoComCon_p->m_uiTransSize; - - } - } - else - { - goto Exit; - } - break; - } - default: - { - goto Exit; - } - } // end of switch(pSdoComCon_p->m_SdoServiceType) - } - } - else - { - goto Exit; - } - - - // call send function of lower layer - switch(pSdoComCon_p->m_SdoProtType) - { - case kEplSdoTypeAsnd: - case kEplSdoTypeUdp: - { - Ret = EplSdoAsySeqSendData(pSdoComCon_p->m_SdoSeqConHdl, - uiSizeOfFrame, - pFrame); - break; - } - - default: - { - Ret = kEplSdoComUnsupportedProt; - } - } // end of switch(pSdoComCon_p->m_SdoProtType) - - -Exit: - return Ret; + tEplKernel Ret; + BYTE abFrame[EPL_MAX_SDO_FRAME_SIZE]; + tEplFrame *pFrame; + tEplAsySdoCom *pCommandFrame; + unsigned int uiSizeOfFrame; + BYTE bFlags; + BYTE *pbPayload; + + Ret = kEplSuccessful; + + pFrame = (tEplFrame *) & abFrame[0]; + + EPL_MEMSET(&abFrame[0], 0x00, sizeof(abFrame)); + + // build generic part of frame + // get pointer to command layerpart of frame + pCommandFrame = + &pFrame->m_Data.m_Asnd.m_Payload.m_SdoSequenceFrame. + m_le_abSdoSeqPayload; + AmiSetByteToLe(&pCommandFrame->m_le_bCommandId, + pSdoComCon_p->m_SdoServiceType); + AmiSetByteToLe(&pCommandFrame->m_le_bTransactionId, + pSdoComCon_p->m_bTransactionId); + + // set size constant part of header + uiSizeOfFrame = 8; + + // check if first frame to send -> command header needed + if (pSdoComCon_p->m_uiTransSize > 0) { + if (pSdoComCon_p->m_uiTransferredByte == 0) { // start SDO transfer + // check if segmented or expedited transfer + // only for write commands + switch (pSdoComCon_p->m_SdoServiceType) { + case kEplSdoServiceReadByIndex: + { // first frame of read access always expedited + pSdoComCon_p->m_SdoTransType = + kEplSdoTransExpedited; + pbPayload = + &pCommandFrame-> + m_le_abCommandData[0]; + // fill rest of header + AmiSetWordToLe(&pCommandFrame-> + m_le_wSegmentSize, 4); + + // create command header + AmiSetWordToLe(pbPayload, + (WORD) pSdoComCon_p-> + m_uiTargetIndex); + pbPayload += 2; + AmiSetByteToLe(pbPayload, + (BYTE) pSdoComCon_p-> + m_uiTargetSubIndex); + // calc size + uiSizeOfFrame += 4; + + // set pSdoComCon_p->m_uiTransferredByte to one + pSdoComCon_p->m_uiTransferredByte = 1; + break; + } + + case kEplSdoServiceWriteByIndex: + { + if (pSdoComCon_p->m_uiTransSize > EPL_SDO_MAX_PAYLOAD) { // segmented transfer + // -> variable part of header needed + // save that transfer is segmented + pSdoComCon_p->m_SdoTransType = + kEplSdoTransSegmented; + // fill variable part of header + AmiSetDwordToLe(&pCommandFrame-> + m_le_abCommandData + [0], + pSdoComCon_p-> + m_uiTransSize); + // set pointer to real payload + pbPayload = + &pCommandFrame-> + m_le_abCommandData[4]; + // fill rest of header + AmiSetWordToLe(&pCommandFrame-> + m_le_wSegmentSize, + EPL_SDO_MAX_PAYLOAD); + bFlags = 0x10; + AmiSetByteToLe(&pCommandFrame-> + m_le_bFlags, + bFlags); + // create command header + AmiSetWordToLe(pbPayload, + (WORD) + pSdoComCon_p-> + m_uiTargetIndex); + pbPayload += 2; + AmiSetByteToLe(pbPayload, + (BYTE) + pSdoComCon_p-> + m_uiTargetSubIndex); + // on byte for reserved + pbPayload += 2; + // calc size + uiSizeOfFrame += + EPL_SDO_MAX_PAYLOAD; + + // copy payload + EPL_MEMCPY(pbPayload, + pSdoComCon_p-> + m_pData, + (EPL_SDO_MAX_PAYLOAD + - 8)); + pSdoComCon_p->m_pData += + (EPL_SDO_MAX_PAYLOAD - 8); + // correct intern counter + pSdoComCon_p->m_uiTransSize -= + (EPL_SDO_MAX_PAYLOAD - 8); + pSdoComCon_p-> + m_uiTransferredByte = + (EPL_SDO_MAX_PAYLOAD - 8); + + } else { // expedited trandsfer + // save that transfer is expedited + pSdoComCon_p->m_SdoTransType = + kEplSdoTransExpedited; + pbPayload = + &pCommandFrame-> + m_le_abCommandData[0]; + + // create command header + AmiSetWordToLe(pbPayload, + (WORD) + pSdoComCon_p-> + m_uiTargetIndex); + pbPayload += 2; + AmiSetByteToLe(pbPayload, + (BYTE) + pSdoComCon_p-> + m_uiTargetSubIndex); + // + 2 -> one byte for subindex and one byte reserved + pbPayload += 2; + // copy data + EPL_MEMCPY(pbPayload, + pSdoComCon_p-> + m_pData, + pSdoComCon_p-> + m_uiTransSize); + // calc size + uiSizeOfFrame += + (4 + + pSdoComCon_p-> + m_uiTransSize); + // fill rest of header + AmiSetWordToLe(&pCommandFrame-> + m_le_wSegmentSize, + (WORD) (4 + + pSdoComCon_p-> + m_uiTransSize)); + + pSdoComCon_p-> + m_uiTransferredByte = + pSdoComCon_p->m_uiTransSize; + pSdoComCon_p->m_uiTransSize = 0; + } + break; + } + + case kEplSdoServiceNIL: + default: + // invalid service requested + Ret = kEplSdoComInvalidServiceType; + goto Exit; + } // end of switch(pSdoComCon_p->m_SdoServiceType) + } else // (pSdoComCon_p->m_uiTransferredByte > 0) + { // continue SDO transfer + switch (pSdoComCon_p->m_SdoServiceType) { + // for expedited read is nothing to do + // -> server sends data + + case kEplSdoServiceWriteByIndex: + { // send next frame + if (pSdoComCon_p->m_SdoTransType == + kEplSdoTransSegmented) { + if (pSdoComCon_p->m_uiTransSize > EPL_SDO_MAX_PAYLOAD) { // next segment + pbPayload = + &pCommandFrame-> + m_le_abCommandData + [0]; + // fill rest of header + AmiSetWordToLe + (&pCommandFrame-> + m_le_wSegmentSize, + EPL_SDO_MAX_PAYLOAD); + bFlags = 0x20; + AmiSetByteToLe + (&pCommandFrame-> + m_le_bFlags, + bFlags); + // copy data + EPL_MEMCPY(pbPayload, + pSdoComCon_p-> + m_pData, + EPL_SDO_MAX_PAYLOAD); + pSdoComCon_p->m_pData += + EPL_SDO_MAX_PAYLOAD; + // correct intern counter + pSdoComCon_p-> + m_uiTransSize -= + EPL_SDO_MAX_PAYLOAD; + pSdoComCon_p-> + m_uiTransferredByte + = + EPL_SDO_MAX_PAYLOAD; + // calc size + uiSizeOfFrame += + EPL_SDO_MAX_PAYLOAD; + + } else { // end of transfer + pbPayload = + &pCommandFrame-> + m_le_abCommandData + [0]; + // fill rest of header + AmiSetWordToLe + (&pCommandFrame-> + m_le_wSegmentSize, + (WORD) + pSdoComCon_p-> + m_uiTransSize); + bFlags = 0x30; + AmiSetByteToLe + (&pCommandFrame-> + m_le_bFlags, + bFlags); + // copy data + EPL_MEMCPY(pbPayload, + pSdoComCon_p-> + m_pData, + pSdoComCon_p-> + m_uiTransSize); + pSdoComCon_p->m_pData += + pSdoComCon_p-> + m_uiTransSize; + // calc size + uiSizeOfFrame += + pSdoComCon_p-> + m_uiTransSize; + // correct intern counter + pSdoComCon_p-> + m_uiTransSize = 0; + pSdoComCon_p-> + m_uiTransferredByte + = + pSdoComCon_p-> + m_uiTransSize; + + } + } else { + goto Exit; + } + break; + } + default: + { + goto Exit; + } + } // end of switch(pSdoComCon_p->m_SdoServiceType) + } + } else { + goto Exit; + } + + // call send function of lower layer + switch (pSdoComCon_p->m_SdoProtType) { + case kEplSdoTypeAsnd: + case kEplSdoTypeUdp: + { + Ret = EplSdoAsySeqSendData(pSdoComCon_p->m_SdoSeqConHdl, + uiSizeOfFrame, pFrame); + break; + } + + default: + { + Ret = kEplSdoComUnsupportedProt; + } + } // end of switch(pSdoComCon_p->m_SdoProtType) + + Exit: + return Ret; } #endif @@ -2691,192 +2940,261 @@ Exit: // //--------------------------------------------------------------------------- #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) -static tEplKernel EplSdoComClientProcessFrame(tEplSdoComConHdl SdoComCon_p, - tEplAsySdoCom* pAsySdoCom_p) +static tEplKernel EplSdoComClientProcessFrame(tEplSdoComConHdl SdoComCon_p, + tEplAsySdoCom * pAsySdoCom_p) { -tEplKernel Ret; -BYTE bBuffer; -unsigned int uiBuffer; -unsigned int uiDataSize; -unsigned long ulBuffer; -tEplSdoComCon* pSdoComCon; - - - Ret = kEplSuccessful; - - // get pointer to control structure - pSdoComCon = &SdoComInstance_g.m_SdoComCon[SdoComCon_p]; - - // check if transaction Id fit - bBuffer = AmiGetByteFromLe(&pAsySdoCom_p->m_le_bTransactionId); - if(pSdoComCon->m_bTransactionId != bBuffer) - { - // incorrect transaction id - - // if running transfer - if((pSdoComCon->m_uiTransferredByte != 0) - && (pSdoComCon->m_uiTransSize !=0)) - { - pSdoComCon->m_dwLastAbortCode = EPL_SDOAC_GENERAL_ERROR; - // -> send abort - EplSdoComClientSendAbort(pSdoComCon, pSdoComCon->m_dwLastAbortCode); - // call callback of application - Ret = EplSdoComTransferFinished(SdoComCon_p, pSdoComCon, kEplSdoComTransferTxAborted); - } - - } - else - { // check if correct command - bBuffer = AmiGetByteFromLe(&pAsySdoCom_p->m_le_bCommandId); - if(pSdoComCon->m_SdoServiceType != bBuffer) - { - // incorrect command - // if running transfer - if((pSdoComCon->m_uiTransferredByte != 0) - && (pSdoComCon->m_uiTransSize !=0)) - { - pSdoComCon->m_dwLastAbortCode = EPL_SDOAC_GENERAL_ERROR; - // -> send abort - EplSdoComClientSendAbort(pSdoComCon, pSdoComCon->m_dwLastAbortCode); - // call callback of application - Ret = EplSdoComTransferFinished(SdoComCon_p, pSdoComCon, kEplSdoComTransferTxAborted); - } - - } - else - { // switch on command - switch(pSdoComCon->m_SdoServiceType) - { - case kEplSdoServiceWriteByIndex: - { // check if confirmation from server - // nothing more to do - break; - } - - case kEplSdoServiceReadByIndex: - { // check if it is an segmented or an expedited transfer - bBuffer = AmiGetByteFromLe(&pAsySdoCom_p->m_le_bFlags); - // mask uninteressting bits - bBuffer &= 0x30; - switch(bBuffer) - { - // expedited transfer - case 0x00: - { - // check size of buffer - uiBuffer = AmiGetWordFromLe(&pAsySdoCom_p->m_le_wSegmentSize); - if(uiBuffer > pSdoComCon->m_uiTransSize) - { // buffer provided by the application is to small - // copy only a part - uiDataSize = pSdoComCon->m_uiTransSize; - } - else - { // buffer fits - uiDataSize = uiBuffer; - } - - // copy data - EPL_MEMCPY(pSdoComCon->m_pData, &pAsySdoCom_p->m_le_abCommandData[0], uiDataSize); - - // correct counter - pSdoComCon->m_uiTransSize = 0; - pSdoComCon->m_uiTransferredByte = uiDataSize; - break; - } - - // start of a segmented transfer - case 0x10: - { // get total size of transfer - ulBuffer = AmiGetDwordFromLe(&pAsySdoCom_p->m_le_abCommandData[0]); - if(ulBuffer <= pSdoComCon->m_uiTransSize) - { // buffer fit - pSdoComCon->m_uiTransSize = (unsigned int)ulBuffer; - } - else - { // buffer to small - // send abort - pSdoComCon->m_dwLastAbortCode = EPL_SDOAC_DATA_TYPE_LENGTH_TOO_HIGH; - // -> send abort - EplSdoComClientSendAbort(pSdoComCon, pSdoComCon->m_dwLastAbortCode); - // call callback of application - Ret = EplSdoComTransferFinished(SdoComCon_p, pSdoComCon, kEplSdoComTransferRxAborted); - goto Exit; - } - - // get segment size - // check size of buffer - uiBuffer = AmiGetWordFromLe(&pAsySdoCom_p->m_le_wSegmentSize); - // subtract size of vaiable header from datasize - uiBuffer -= 4; - // copy data - EPL_MEMCPY(pSdoComCon->m_pData, &pAsySdoCom_p->m_le_abCommandData[4], uiBuffer); - - // correct counter an pointer - pSdoComCon->m_pData += uiBuffer; - pSdoComCon->m_uiTransferredByte += uiBuffer; - pSdoComCon->m_uiTransSize -= uiBuffer; - - break; - } - - // segment - case 0x20: - { - // get segment size - // check size of buffer - uiBuffer = AmiGetWordFromLe(&pAsySdoCom_p->m_le_wSegmentSize); - // check if data to copy fit to buffer - if(uiBuffer >= pSdoComCon->m_uiTransSize) - { // to much data - uiBuffer = (pSdoComCon->m_uiTransSize - 1); - } - // copy data - EPL_MEMCPY(pSdoComCon->m_pData, &pAsySdoCom_p->m_le_abCommandData[0], uiBuffer); - - // correct counter an pointer - pSdoComCon->m_pData += uiBuffer; - pSdoComCon->m_uiTransferredByte += uiBuffer; - pSdoComCon->m_uiTransSize -= uiBuffer; - break; - } - - // last segment - case 0x30: - { - // get segment size - // check size of buffer - uiBuffer = AmiGetWordFromLe(&pAsySdoCom_p->m_le_wSegmentSize); - // check if data to copy fit to buffer - if(uiBuffer > pSdoComCon->m_uiTransSize) - { // to much data - uiBuffer = (pSdoComCon->m_uiTransSize - 1); - } - // copy data - EPL_MEMCPY(pSdoComCon->m_pData, &pAsySdoCom_p->m_le_abCommandData[0], uiBuffer); - - // correct counter an pointer - pSdoComCon->m_pData += uiBuffer; - pSdoComCon->m_uiTransferredByte += uiBuffer; - pSdoComCon->m_uiTransSize = 0; - - break; - } - }// end of switch(bBuffer & 0x30) - - break; - } - - case kEplSdoServiceNIL: - default: - // invalid service requested - // $$$ d.k. What should we do? - break; - }// end of switch(pSdoComCon->m_SdoServiceType) - } - } - -Exit: - return Ret; + tEplKernel Ret; + BYTE bBuffer; + unsigned int uiBuffer; + unsigned int uiDataSize; + unsigned long ulBuffer; + tEplSdoComCon *pSdoComCon; + + Ret = kEplSuccessful; + + // get pointer to control structure + pSdoComCon = &SdoComInstance_g.m_SdoComCon[SdoComCon_p]; + + // check if transaction Id fit + bBuffer = AmiGetByteFromLe(&pAsySdoCom_p->m_le_bTransactionId); + if (pSdoComCon->m_bTransactionId != bBuffer) { + // incorrect transaction id + + // if running transfer + if ((pSdoComCon->m_uiTransferredByte != 0) + && (pSdoComCon->m_uiTransSize != 0)) { + pSdoComCon->m_dwLastAbortCode = EPL_SDOAC_GENERAL_ERROR; + // -> send abort + EplSdoComClientSendAbort(pSdoComCon, + pSdoComCon->m_dwLastAbortCode); + // call callback of application + Ret = + EplSdoComTransferFinished(SdoComCon_p, pSdoComCon, + kEplSdoComTransferTxAborted); + } + + } else { // check if correct command + bBuffer = AmiGetByteFromLe(&pAsySdoCom_p->m_le_bCommandId); + if (pSdoComCon->m_SdoServiceType != bBuffer) { + // incorrect command + // if running transfer + if ((pSdoComCon->m_uiTransferredByte != 0) + && (pSdoComCon->m_uiTransSize != 0)) { + pSdoComCon->m_dwLastAbortCode = + EPL_SDOAC_GENERAL_ERROR; + // -> send abort + EplSdoComClientSendAbort(pSdoComCon, + pSdoComCon-> + m_dwLastAbortCode); + // call callback of application + Ret = + EplSdoComTransferFinished(SdoComCon_p, + pSdoComCon, + kEplSdoComTransferTxAborted); + } + + } else { // switch on command + switch (pSdoComCon->m_SdoServiceType) { + case kEplSdoServiceWriteByIndex: + { // check if confirmation from server + // nothing more to do + break; + } + + case kEplSdoServiceReadByIndex: + { // check if it is an segmented or an expedited transfer + bBuffer = + AmiGetByteFromLe(&pAsySdoCom_p-> + m_le_bFlags); + // mask uninteressting bits + bBuffer &= 0x30; + switch (bBuffer) { + // expedited transfer + case 0x00: + { + // check size of buffer + uiBuffer = + AmiGetWordFromLe + (&pAsySdoCom_p-> + m_le_wSegmentSize); + if (uiBuffer > pSdoComCon->m_uiTransSize) { // buffer provided by the application is to small + // copy only a part + uiDataSize = + pSdoComCon-> + m_uiTransSize; + } else { // buffer fits + uiDataSize = + uiBuffer; + } + + // copy data + EPL_MEMCPY(pSdoComCon-> + m_pData, + &pAsySdoCom_p-> + m_le_abCommandData + [0], + uiDataSize); + + // correct counter + pSdoComCon-> + m_uiTransSize = 0; + pSdoComCon-> + m_uiTransferredByte + = uiDataSize; + break; + } + + // start of a segmented transfer + case 0x10: + { // get total size of transfer + ulBuffer = + AmiGetDwordFromLe + (&pAsySdoCom_p-> + m_le_abCommandData + [0]); + if (ulBuffer <= pSdoComCon->m_uiTransSize) { // buffer fit + pSdoComCon-> + m_uiTransSize + = + (unsigned + int) + ulBuffer; + } else { // buffer to small + // send abort + pSdoComCon-> + m_dwLastAbortCode + = + EPL_SDOAC_DATA_TYPE_LENGTH_TOO_HIGH; + // -> send abort + EplSdoComClientSendAbort + (pSdoComCon, + pSdoComCon-> + m_dwLastAbortCode); + // call callback of application + Ret = + EplSdoComTransferFinished + (SdoComCon_p, + pSdoComCon, + kEplSdoComTransferRxAborted); + goto Exit; + } + + // get segment size + // check size of buffer + uiBuffer = + AmiGetWordFromLe + (&pAsySdoCom_p-> + m_le_wSegmentSize); + // subtract size of vaiable header from datasize + uiBuffer -= 4; + // copy data + EPL_MEMCPY(pSdoComCon-> + m_pData, + &pAsySdoCom_p-> + m_le_abCommandData + [4], + uiBuffer); + + // correct counter an pointer + pSdoComCon->m_pData += + uiBuffer; + pSdoComCon-> + m_uiTransferredByte + += uiBuffer; + pSdoComCon-> + m_uiTransSize -= + uiBuffer; + + break; + } + + // segment + case 0x20: + { + // get segment size + // check size of buffer + uiBuffer = + AmiGetWordFromLe + (&pAsySdoCom_p-> + m_le_wSegmentSize); + // check if data to copy fit to buffer + if (uiBuffer >= pSdoComCon->m_uiTransSize) { // to much data + uiBuffer = + (pSdoComCon-> + m_uiTransSize + - 1); + } + // copy data + EPL_MEMCPY(pSdoComCon-> + m_pData, + &pAsySdoCom_p-> + m_le_abCommandData + [0], + uiBuffer); + + // correct counter an pointer + pSdoComCon->m_pData += + uiBuffer; + pSdoComCon-> + m_uiTransferredByte + += uiBuffer; + pSdoComCon-> + m_uiTransSize -= + uiBuffer; + break; + } + + // last segment + case 0x30: + { + // get segment size + // check size of buffer + uiBuffer = + AmiGetWordFromLe + (&pAsySdoCom_p-> + m_le_wSegmentSize); + // check if data to copy fit to buffer + if (uiBuffer > pSdoComCon->m_uiTransSize) { // to much data + uiBuffer = + (pSdoComCon-> + m_uiTransSize + - 1); + } + // copy data + EPL_MEMCPY(pSdoComCon-> + m_pData, + &pAsySdoCom_p-> + m_le_abCommandData + [0], + uiBuffer); + + // correct counter an pointer + pSdoComCon->m_pData += + uiBuffer; + pSdoComCon-> + m_uiTransferredByte + += uiBuffer; + pSdoComCon-> + m_uiTransSize = 0; + + break; + } + } // end of switch(bBuffer & 0x30) + + break; + } + + case kEplSdoServiceNIL: + default: + // invalid service requested + // $$$ d.k. What should we do? + break; + } // end of switch(pSdoComCon->m_SdoServiceType) + } + } + + Exit: + return Ret; } #endif @@ -2898,68 +3216,69 @@ Exit: // //--------------------------------------------------------------------------- #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) -static tEplKernel EplSdoComClientSendAbort(tEplSdoComCon* pSdoComCon_p, - DWORD dwAbortCode_p) +static tEplKernel EplSdoComClientSendAbort(tEplSdoComCon * pSdoComCon_p, + DWORD dwAbortCode_p) { -tEplKernel Ret; -BYTE abFrame[EPL_MAX_SDO_FRAME_SIZE]; -tEplFrame* pFrame; -tEplAsySdoCom* pCommandFrame; -unsigned int uiSizeOfFrame; - - Ret = kEplSuccessful; - - pFrame = (tEplFrame*)&abFrame[0]; - - EPL_MEMSET(&abFrame[0], 0x00, sizeof(abFrame)); - - // build generic part of frame - // get pointer to command layerpart of frame - pCommandFrame = &pFrame->m_Data.m_Asnd.m_Payload.m_SdoSequenceFrame.m_le_abSdoSeqPayload; - AmiSetByteToLe( &pCommandFrame->m_le_bCommandId, pSdoComCon_p->m_SdoServiceType); - AmiSetByteToLe( &pCommandFrame->m_le_bTransactionId, pSdoComCon_p->m_bTransactionId); - - uiSizeOfFrame = 8; - - // set response and abort flag - pCommandFrame->m_le_bFlags |= 0x40; - - // copy abortcode to frame - AmiSetDwordToLe(&pCommandFrame->m_le_abCommandData[0], dwAbortCode_p); - - // set size of segment - AmiSetWordToLe(&pCommandFrame->m_le_wSegmentSize, sizeof(DWORD)); - - // update counter - pSdoComCon_p->m_uiTransferredByte = sizeof(DWORD); - pSdoComCon_p->m_uiTransSize = 0; - - // calc framesize - uiSizeOfFrame += sizeof(DWORD); - - // save abort code - pSdoComCon_p->m_dwLastAbortCode = dwAbortCode_p; - - // call send function of lower layer - switch(pSdoComCon_p->m_SdoProtType) - { - case kEplSdoTypeAsnd: - case kEplSdoTypeUdp: - { - Ret = EplSdoAsySeqSendData(pSdoComCon_p->m_SdoSeqConHdl, - uiSizeOfFrame, - pFrame); - break; - } - - default: - { - Ret = kEplSdoComUnsupportedProt; - } - } // end of switch(pSdoComCon_p->m_SdoProtType) - - - return Ret; + tEplKernel Ret; + BYTE abFrame[EPL_MAX_SDO_FRAME_SIZE]; + tEplFrame *pFrame; + tEplAsySdoCom *pCommandFrame; + unsigned int uiSizeOfFrame; + + Ret = kEplSuccessful; + + pFrame = (tEplFrame *) & abFrame[0]; + + EPL_MEMSET(&abFrame[0], 0x00, sizeof(abFrame)); + + // build generic part of frame + // get pointer to command layerpart of frame + pCommandFrame = + &pFrame->m_Data.m_Asnd.m_Payload.m_SdoSequenceFrame. + m_le_abSdoSeqPayload; + AmiSetByteToLe(&pCommandFrame->m_le_bCommandId, + pSdoComCon_p->m_SdoServiceType); + AmiSetByteToLe(&pCommandFrame->m_le_bTransactionId, + pSdoComCon_p->m_bTransactionId); + + uiSizeOfFrame = 8; + + // set response and abort flag + pCommandFrame->m_le_bFlags |= 0x40; + + // copy abortcode to frame + AmiSetDwordToLe(&pCommandFrame->m_le_abCommandData[0], dwAbortCode_p); + + // set size of segment + AmiSetWordToLe(&pCommandFrame->m_le_wSegmentSize, sizeof(DWORD)); + + // update counter + pSdoComCon_p->m_uiTransferredByte = sizeof(DWORD); + pSdoComCon_p->m_uiTransSize = 0; + + // calc framesize + uiSizeOfFrame += sizeof(DWORD); + + // save abort code + pSdoComCon_p->m_dwLastAbortCode = dwAbortCode_p; + + // call send function of lower layer + switch (pSdoComCon_p->m_SdoProtType) { + case kEplSdoTypeAsnd: + case kEplSdoTypeUdp: + { + Ret = EplSdoAsySeqSendData(pSdoComCon_p->m_SdoSeqConHdl, + uiSizeOfFrame, pFrame); + break; + } + + default: + { + Ret = kEplSdoComUnsupportedProt; + } + } // end of switch(pSdoComCon_p->m_SdoProtType) + + return Ret; } #endif @@ -2979,51 +3298,49 @@ unsigned int uiSizeOfFrame; // State: // //--------------------------------------------------------------------------- -static tEplKernel EplSdoComTransferFinished(tEplSdoComConHdl SdoComCon_p, - tEplSdoComCon* pSdoComCon_p, - tEplSdoComConState SdoComConState_p) +static tEplKernel EplSdoComTransferFinished(tEplSdoComConHdl SdoComCon_p, + tEplSdoComCon * pSdoComCon_p, + tEplSdoComConState SdoComConState_p) { -tEplKernel Ret; - - Ret = kEplSuccessful; - - if(pSdoComCon_p->m_pfnTransferFinished != NULL) - { - tEplSdoFinishedCb pfnTransferFinished; - tEplSdoComFinished SdoComFinished; - - SdoComFinished.m_pUserArg = pSdoComCon_p->m_pUserArg; - SdoComFinished.m_uiNodeId = pSdoComCon_p->m_uiNodeId; - SdoComFinished.m_uiTargetIndex = pSdoComCon_p->m_uiTargetIndex; - SdoComFinished.m_uiTargetSubIndex = pSdoComCon_p->m_uiTargetSubIndex; - SdoComFinished.m_uiTransferredByte = pSdoComCon_p->m_uiTransferredByte; - SdoComFinished.m_dwAbortCode = pSdoComCon_p->m_dwLastAbortCode; - SdoComFinished.m_SdoComConHdl = SdoComCon_p; - SdoComFinished.m_SdoComConState = SdoComConState_p; - if (pSdoComCon_p->m_SdoServiceType == kEplSdoServiceWriteByIndex) - { - SdoComFinished.m_SdoAccessType = kEplSdoAccessTypeWrite; - } - else - { - SdoComFinished.m_SdoAccessType = kEplSdoAccessTypeRead; - } - - // reset transfer state so this handle is not busy anymore - pSdoComCon_p->m_uiTransferredByte = 0; - pSdoComCon_p->m_uiTransSize = 0; - - pfnTransferFinished = pSdoComCon_p->m_pfnTransferFinished; - // delete function pointer to inform application only once for each transfer - pSdoComCon_p->m_pfnTransferFinished = NULL; - - // call application's callback function - pfnTransferFinished(&SdoComFinished); - - } - - return Ret; + tEplKernel Ret; + + Ret = kEplSuccessful; + + if (pSdoComCon_p->m_pfnTransferFinished != NULL) { + tEplSdoFinishedCb pfnTransferFinished; + tEplSdoComFinished SdoComFinished; + + SdoComFinished.m_pUserArg = pSdoComCon_p->m_pUserArg; + SdoComFinished.m_uiNodeId = pSdoComCon_p->m_uiNodeId; + SdoComFinished.m_uiTargetIndex = pSdoComCon_p->m_uiTargetIndex; + SdoComFinished.m_uiTargetSubIndex = + pSdoComCon_p->m_uiTargetSubIndex; + SdoComFinished.m_uiTransferredByte = + pSdoComCon_p->m_uiTransferredByte; + SdoComFinished.m_dwAbortCode = pSdoComCon_p->m_dwLastAbortCode; + SdoComFinished.m_SdoComConHdl = SdoComCon_p; + SdoComFinished.m_SdoComConState = SdoComConState_p; + if (pSdoComCon_p->m_SdoServiceType == + kEplSdoServiceWriteByIndex) { + SdoComFinished.m_SdoAccessType = kEplSdoAccessTypeWrite; + } else { + SdoComFinished.m_SdoAccessType = kEplSdoAccessTypeRead; + } + + // reset transfer state so this handle is not busy anymore + pSdoComCon_p->m_uiTransferredByte = 0; + pSdoComCon_p->m_uiTransSize = 0; + + pfnTransferFinished = pSdoComCon_p->m_pfnTransferFinished; + // delete function pointer to inform application only once for each transfer + pSdoComCon_p->m_pfnTransferFinished = NULL; + + // call application's callback function + pfnTransferFinished(&SdoComFinished); + + } + + return Ret; } // EOF - -- cgit v1.2.3