diff options
Diffstat (limited to 'drivers/staging/epl/EplSdoComu.c')
-rw-r--r-- | drivers/staging/epl/EplSdoComu.c | 3345 |
1 files changed, 0 insertions, 3345 deletions
diff --git a/drivers/staging/epl/EplSdoComu.c b/drivers/staging/epl/EplSdoComu.c deleted file mode 100644 index bf35afab152..00000000000 --- a/drivers/staging/epl/EplSdoComu.c +++ /dev/null @@ -1,3345 +0,0 @@ -/**************************************************************************** - - (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29 - www.systec-electronic.com - - Project: openPOWERLINK - - Description: source file for SDO Command Layer module - - License: - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of SYSTEC electronic GmbH nor the names of its - contributors may be used to endorse or promote products derived - from this software without prior written permission. For written - permission, please contact info@systec-electronic.com. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. - - Severability Clause: - - If a provision of this License is or becomes illegal, invalid or - unenforceable in any jurisdiction, that shall not affect: - 1. the validity or enforceability in that jurisdiction of any other - provision of this License; or - 2. the validity or enforceability in other jurisdictions of that or - any other provision of this License. - - ------------------------------------------------------------------------- - - $RCSfile: EplSdoComu.c,v $ - - $Author: D.Krueger $ - - $Revision: 1.14 $ $Date: 2008/10/17 15:32:32 $ - - $State: Exp $ - - Build Environment: - GCC V3.4 - - ------------------------------------------------------------------------- - - Revision History: - - 2006/06/26 k.t.: start of the implementation - -****************************************************************************/ - -#include "user/EplSdoComu.h" - -#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!' - -#endif - -#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0) -#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) == 0) && (EPL_OBD_USE_KERNEL == FALSE) - -#error 'ERROR: SDO Server needs OBDu module!' - -#endif - -#endif - -/***************************************************************************/ -/* */ -/* */ -/* G L O B A L D E F I N I T I O N S */ -/* */ -/* */ -/***************************************************************************/ - -//--------------------------------------------------------------------------- -// const defines -//--------------------------------------------------------------------------- - -#ifndef EPL_MAX_SDO_COM_CON -#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 -#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) - , - - kEplSdoComConEventInitCon = 0x08, // init connection (only client) - kEplSdoComConEventAbort = 0x09 // abort sdo transfer (only client) -#endif -} 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; - -// state of the state maschine -typedef enum { - // General State - kEplSdoComStateIdle = 0x00, // idle state - -#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0) - // 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 -#endif -} tEplSdoComState; - -// control structure for transaction -typedef struct { - tEplSdoSeqConHdl m_SdoSeqConHdl; // if != 0 -> entry used - tEplSdoComState m_SdoComState; - u8 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 - u8 *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 - - u32 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 - - // 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]; - -#if defined(WIN32) || defined(_WIN32) - LPCRITICAL_SECTION m_pCriticalSection; - CRITICAL_SECTION m_CriticalSection; -#endif - -} tEplSdoComInstance; - -//--------------------------------------------------------------------------- -// modul globale vars -//--------------------------------------------------------------------------- -static tEplSdoComInstance SdoComInstance_g; -//--------------------------------------------------------------------------- -// local function prototypes -//--------------------------------------------------------------------------- -tEplKernel EplSdoComReceiveCb(tEplSdoSeqConHdl SdoSeqConHdl_p, - tEplAsySdoCom *pAsySdoCom_p, - unsigned int uiDataSize_p); - -tEplKernel EplSdoComConCb(tEplSdoSeqConHdl SdoSeqConHdl_p, - tEplAsySdoConState AsySdoConState_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 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 EplSdoComServerSendFrameIntern(tEplSdoComCon * pSdoComCon_p, - unsigned int uiIndex_p, - unsigned int uiSubIndex_p, - tEplSdoComSendType SendType_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 EplSdoComClientProcessFrame(tEplSdoComConHdl SdoComCon_p, - tEplAsySdoCom * pAsySdoCom_p); - -static tEplKernel EplSdoComClientSendAbort(tEplSdoComCon * pSdoComCon_p, - u32 dwAbortCode_p); -#endif - -/***************************************************************************/ -/* */ -/* */ -/* C L A S S <SDO Command Layer> */ -/* */ -/* */ -/***************************************************************************/ -// -// Description: SDO Command layer Modul -// -// -/***************************************************************************/ - -//=========================================================================// -// // -// P U B L I C F U N C T I O N S // -// // -//=========================================================================// - -//--------------------------------------------------------------------------- -// -// Function: EplSdoComInit -// -// Description: Init first instance of the module -// -// -// -// Parameters: -// -// -// Returns: tEplKernel = errorcode -// -// -// State: -// -//--------------------------------------------------------------------------- -tEplKernel EplSdoComInit(void) -{ - tEplKernel Ret; - - Ret = EplSdoComAddInstance(); - - return Ret; - -} - -//--------------------------------------------------------------------------- -// -// Function: EplSdoComAddInstance -// -// Description: Init additional instance of the module -// -// -// -// Parameters: -// -// -// Returns: tEplKernel = errorcode -// -// -// State: -// -//--------------------------------------------------------------------------- -tEplKernel EplSdoComAddInstance(void) -{ - tEplKernel Ret; - - Ret = kEplSuccessful; - - // 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); -#endif - - Exit: - return Ret; -} - -//--------------------------------------------------------------------------- -// -// Function: EplSdoComDelInstance -// -// Description: delete instance of the module -// -// -// -// Parameters: -// -// -// Returns: tEplKernel = errorcode -// -// -// State: -// -//--------------------------------------------------------------------------- -tEplKernel EplSdoComDelInstance(void) -{ - tEplKernel Ret; - - Ret = kEplSuccessful; - -#if defined(WIN32) || defined(_WIN32) - // delete critical section for process function - DeleteCriticalSection(SdoComInstance_g.m_pCriticalSection); -#endif - - Ret = EplSdoAsySeqDelInstance(); - if (Ret != kEplSuccessful) { - goto Exit; - } - - Exit: - return Ret; -} - -//--------------------------------------------------------------------------- -// -// Function: EplSdoComDefineCon -// -// Description: function defines a SDO connection to another node -// -> init lower layer and returns a handle for the connection. -// Two client connections to the same node via the same protocol -// are not allowed. If this function detects such a situation -// it will return kEplSdoComHandleExists and the handle of -// the existing connection in pSdoComConHdl_p. -// Using of existing server connections is possible. -// -// Parameters: pSdoComConHdl_p = pointer to the buffer of the handle -// uiTargetNodeId_p = NodeId of the targetnode -// ProtType_p = type of protocol to use for connection -// -// -// Returns: tEplKernel = errorcode -// -// -// State: -// -//--------------------------------------------------------------------------- -#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) -tEplKernel 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; -} -#endif -//--------------------------------------------------------------------------- -// -// Function: EplSdoComInitTransferByIndex -// -// Description: function init SDO Transfer for a defined connection -// -// -// -// Parameters: SdoComTransParam_p = Structure with parameters for connection -// -// -// Returns: tEplKernel = errorcode -// -// -// State: -// -//--------------------------------------------------------------------------- -#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) -tEplKernel 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; - -} -#endif - -//--------------------------------------------------------------------------- -// -// Function: EplSdoComUndefineCon -// -// Description: function undefine a SDO connection -// -// -// -// Parameters: SdoComConHdl_p = handle for the connection -// -// -// Returns: tEplKernel = errorcode -// -// -// State: -// -//--------------------------------------------------------------------------- -#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) -tEplKernel 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; -} -#endif -//--------------------------------------------------------------------------- -// -// Function: EplSdoComGetState -// -// Description: function returns the state fo the connection -// -// -// -// Parameters: SdoComConHdl_p = handle for the connection -// pSdoComFinished_p = pointer to structur for sdo state -// -// -// Returns: tEplKernel = errorcode -// -// -// State: -// -//--------------------------------------------------------------------------- -#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) -tEplKernel 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; - -} -#endif -//--------------------------------------------------------------------------- -// -// Function: EplSdoComSdoAbort -// -// Description: function abort a sdo transfer -// -// -// -// Parameters: SdoComConHdl_p = handle for the connection -// dwAbortCode_p = abort code -// -// -// Returns: tEplKernel = errorcode -// -// -// State: -// -//--------------------------------------------------------------------------- -#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) -tEplKernel EplSdoComSdoAbort(tEplSdoComConHdl SdoComConHdl_p, - u32 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 = (u8 *) & dwAbortCode_p; - - Ret = EplSdoComProcessIntern(SdoComConHdl_p, - kEplSdoComConEventAbort, - (tEplAsySdoCom *) NULL); - - Exit: - return Ret; -} -#endif - -//=========================================================================// -// // -// P R I V A T E F U N C T I O N S // -// // -//=========================================================================// - -//--------------------------------------------------------------------------- -// -// Function: EplSdoComReceiveCb -// -// Description: callback function for SDO Sequence Layer -// -> indicates new data -// -// -// -// Parameters: SdoSeqConHdl_p = Handle for connection -// pAsySdoCom_p = pointer to data -// uiDataSize_p = size of data ($$$ not used yet, but it should) -// -// -// Returns: -// -// -// State: -// -//--------------------------------------------------------------------------- -tEplKernel EplSdoComReceiveCb(tEplSdoSeqConHdl SdoSeqConHdl_p, - tEplAsySdoCom *pAsySdoCom_p, - unsigned int uiDataSize_p) -{ - tEplKernel Ret; - - // 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, (u16) pAsySdoCom_p->m_le_abCommandData[0], - uiDataSize_p); - - return Ret; -} - -//--------------------------------------------------------------------------- -// -// Function: EplSdoComConCb -// -// Description: callback function called by SDO Sequence Layer to inform -// command layer about state change of connection -// -// -// -// Parameters: SdoSeqConHdl_p = Handle of the connection -// AsySdoConState_p = Event of the connection -// -// -// Returns: tEplKernel = Errorcode -// -// -// State: -// -//--------------------------------------------------------------------------- -tEplKernel 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; -} - -//--------------------------------------------------------------------------- -// -// Function: EplSdoComSearchConIntern -// -// Description: search a Sdo Sequence Layer connection handle in the -// control structure of the Command Layer -// -// Parameters: SdoSeqConHdl_p = Handle to search -// SdoComConEvent_p = event to process -// pAsySdoCom_p = pointer to received frame -// -// Returns: tEplKernel -// -// -// State: -// -//--------------------------------------------------------------------------- -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; - -} - -//--------------------------------------------------------------------------- -// -// Function: EplSdoComProcessIntern -// -// Description: search a Sdo Sequence Layer connection handle in the -// control structer of the Command Layer -// -// -// -// Parameters: SdoComCon_p = index of control structure of connection -// SdoComConEvent_p = event to process -// pAsySdoCom_p = pointer to received frame -// -// Returns: tEplKernel = errorcode -// -// -// State: -// -//--------------------------------------------------------------------------- -static tEplKernel EplSdoComProcessIntern(tEplSdoComConHdl SdoComCon_p, - tEplSdoComConEvent SdoComConEvent_p, - tEplAsySdoCom * pAsySdoCom_p) -{ - tEplKernel Ret; - tEplSdoComCon *pSdoComCon; - u8 bFlag; - -#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0) - u32 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"); -#endif - - Ret = kEplSuccessful; - - // 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) { -#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; - } -#endif - - // 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 - = - (u8 - *) - & - 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; - } - -#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) { - ( /*(u8*) */ - 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 - = - (u8 - *) - & - 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, - *((u32 *) - pSdoComCon-> - m_pData)); - - // inc transaction id - pSdoComCon->m_bTransactionId++; - // call callback of application - pSdoComCon->m_dwLastAbortCode = - *((u32 *) 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, - *((u32 *) - pSdoComCon-> - m_pData)); - - // inc transaction id - pSdoComCon->m_bTransactionId++; - // change state - pSdoComCon->m_SdoComState = - kEplSdoComStateClientConnected; - // call callback of application - pSdoComCon->m_dwLastAbortCode = - *((u32 *) 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) - -#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) - 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); - -#endif - - return Ret; - -} - -//--------------------------------------------------------------------------- -// -// Function: EplSdoComServerInitReadByIndex -// -// Description: function start the processing of an read by index command -// -// -// -// Parameters: pSdoComCon_p = pointer to control structure of connection -// pAsySdoCom_p = pointer to received frame -// -// Returns: tEplKernel = errorcode -// -// -// State: -// -//--------------------------------------------------------------------------- -#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0) -static tEplKernel EplSdoComServerInitReadByIndex(tEplSdoComCon * pSdoComCon_p, - tEplAsySdoCom * pAsySdoCom_p) -{ - tEplKernel Ret; - unsigned int uiIndex; - unsigned int uiSubindex; - tEplObdSize EntrySize; - tEplObdAccess AccessType; - u32 dwAbortCode; - - dwAbortCode = 0; - - // 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]); - - // check accesstype of entry - // existens of entry -//#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_OBDU)) != 0) - 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 = (u8 *) & 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 = (u8 *) & 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 = (u8 *) & 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); -/*#else - EntrySize = 0; -#endif*/ - 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); -//#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 = (u8 *) & dwAbortCode; - Ret = EplSdoComServerSendFrameIntern(pSdoComCon_p, - uiIndex, - uiSubindex, - kEplSdoComSendTypeAbort); - goto Exit; - } - - Exit: - return Ret; -} -#endif - -//--------------------------------------------------------------------------- -// -// Function: EplSdoComServerSendFrameIntern(); -// -// Description: function creats and send a frame for server -// -// -// -// Parameters: pSdoComCon_p = pointer to control structure of connection -// uiIndex_p = index to send if expedited transfer else 0 -// uiSubIndex_p = subindex to send if expedited transfer else 0 -// SendType_p = to of frame to send -// -// Returns: tEplKernel = errorcode -// -// -// State: -// -//--------------------------------------------------------------------------- -#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) -{ - tEplKernel Ret; - u8 abFrame[EPL_MAX_SDO_FRAME_SIZE]; - tEplFrame *pFrame; - tEplAsySdoCom *pCommandFrame; - unsigned int uiSizeOfFrame; - u8 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; - } -//#endif - - // set size of frame - AmiSetWordToLe(&pCommandFrame-> - m_le_wSegmentSize, - (u16) 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, - (u16) 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], - *((u32 *) pSdoComCon_p->m_pData)); - - // set size of segment - AmiSetWordToLe(&pCommandFrame->m_le_wSegmentSize, - sizeof(u32)); - - // update counter - pSdoComCon_p->m_uiTransferredByte = sizeof(u32); - pSdoComCon_p->m_uiTransSize = 0; - - // calc framesize - uiSizeOfFrame += sizeof(u32); - Ret = EplSdoAsySeqSendData(pSdoComCon_p->m_SdoSeqConHdl, - uiSizeOfFrame, pFrame); - break; - } - } // end of switch(SendType_p) - - Exit: - return Ret; -} -#endif -//--------------------------------------------------------------------------- -// -// Function: EplSdoComServerInitWriteByIndex -// -// Description: function start the processing of an write by index command -// -// -// -// Parameters: pSdoComCon_p = pointer to control structure of connection -// pAsySdoCom_p = pointer to received frame -// -// Returns: tEplKernel = errorcode -// -// -// State: -// -//--------------------------------------------------------------------------- -#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOS)) != 0) -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; - u32 dwAbortCode; - u8 *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); -/*#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 = (u8*)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 = (u8*)&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 = (u8*)&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; - } - } -//#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 = (u8*)&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); -//#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 -/* pSdoComCon_p->m_pData = (u8*)&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 - ( /*(u8*) */ 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 = - (u8 *) & 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 - -//--------------------------------------------------------------------------- -// -// Function: EplSdoComClientSend -// -// Description: function starts an sdo transfer an send all further frames -// -// -// -// Parameters: pSdoComCon_p = pointer to control structure of connection -// -// Returns: tEplKernel = errorcode -// -// -// State: -// -//--------------------------------------------------------------------------- -#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) -static tEplKernel EplSdoComClientSend(tEplSdoComCon * pSdoComCon_p) -{ - tEplKernel Ret; - u8 abFrame[EPL_MAX_SDO_FRAME_SIZE]; - tEplFrame *pFrame; - tEplAsySdoCom *pCommandFrame; - unsigned int uiSizeOfFrame; - u8 bFlags; - u8 *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, - (u16) pSdoComCon_p-> - m_uiTargetIndex); - pbPayload += 2; - AmiSetByteToLe(pbPayload, - (u8) 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, - (u16) - pSdoComCon_p-> - m_uiTargetIndex); - pbPayload += 2; - AmiSetByteToLe(pbPayload, - (u8) - 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, - (u16) - pSdoComCon_p-> - m_uiTargetIndex); - pbPayload += 2; - AmiSetByteToLe(pbPayload, - (u8) - 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, - (u16) (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, - (u16) - 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 -//--------------------------------------------------------------------------- -// -// Function: EplSdoComClientProcessFrame -// -// Description: function process a received frame -// -// -// -// Parameters: SdoComCon_p = connection handle -// pAsySdoCom_p = pointer to frame to process -// -// Returns: tEplKernel = errorcode -// -// -// State: -// -//--------------------------------------------------------------------------- -#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) -static tEplKernel EplSdoComClientProcessFrame(tEplSdoComConHdl SdoComCon_p, - tEplAsySdoCom * pAsySdoCom_p) -{ - tEplKernel Ret; - u8 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 - -//--------------------------------------------------------------------------- -// -// Function: EplSdoComClientSendAbort -// -// Description: function send a abort message -// -// -// -// Parameters: pSdoComCon_p = pointer to control structure of connection -// dwAbortCode_p = Sdo abort code -// -// Returns: tEplKernel = errorcode -// -// -// State: -// -//--------------------------------------------------------------------------- -#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_SDOC)) != 0) -static tEplKernel EplSdoComClientSendAbort(tEplSdoComCon * pSdoComCon_p, - u32 dwAbortCode_p) -{ - tEplKernel Ret; - u8 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(u32)); - - // update counter - pSdoComCon_p->m_uiTransferredByte = sizeof(u32); - pSdoComCon_p->m_uiTransSize = 0; - - // calc framesize - uiSizeOfFrame += sizeof(u32); - - // 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 - -//--------------------------------------------------------------------------- -// -// Function: EplSdoComTransferFinished -// -// Description: calls callback function of application if available -// and clears entry in control structure -// -// Parameters: pSdoComCon_p = pointer to control structure of connection -// SdoComConState_p = state of SDO transfer -// -// Returns: tEplKernel = errorcode -// -// -// State: -// -//--------------------------------------------------------------------------- -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; -} - -// EOF |