/* * Function for accessing _TPDO mapping parameter_ (index 0x1A00+) from SDO server. * * For more information see file CO_SDO.h. */ static CO_SDO_abortCode_t CO_ODF_TPDOmap(CO_ODF_arg_t *ODF_arg){ CO_TPDO_t *TPDO; TPDO = (CO_TPDO_t*) ODF_arg->object; /* Reading Object Dictionary variable */ if(ODF_arg->reading){ uint8_t *value = (uint8_t*) ODF_arg->data; if(ODF_arg->subIndex == 0){ /* If there is error in mapping, dataLength is 0, so numberOfMappedObjects is 0. */ if(!TPDO->dataLength) *value = 0; } return CO_SDO_AB_NONE; } /* Writing Object Dictionary variable */ if(TPDO->restrictionFlags & 0x08) return CO_SDO_AB_READONLY; /* Attempt to write a read only object. */ if(*TPDO->operatingState == CO_NMT_OPERATIONAL && (TPDO->restrictionFlags & 0x02)) return CO_SDO_AB_DATA_DEV_STATE; /* Data cannot be transferred or stored to the application because of the present device state. */ if(TPDO->valid) return CO_SDO_AB_INVALID_VALUE; /* Invalid value for parameter (download only). */ /* numberOfMappedObjects */ if(ODF_arg->subIndex == 0){ uint8_t *value = (uint8_t*) ODF_arg->data; if(*value > 8) return CO_SDO_AB_VALUE_HIGH; /* Value of parameter written too high. */ /* configure mapping */ return CO_TPDOconfigMap(TPDO, *value); } /* mappedObject */ else{ uint32_t *value = (uint32_t*) ODF_arg->data; uint8_t* pData; uint8_t length = 0; uint8_t dummy = 0; uint8_t MBvar; if(TPDO->dataLength) return CO_SDO_AB_INVALID_VALUE; /* Invalid value for parameter (download only). */ /* verify if mapping is correct */ return CO_PDOfindMap( TPDO->SDO, *value, 1, &pData, &length, &dummy, &MBvar); } return CO_SDO_AB_NONE; }
CO_ReturnError_t CO_TPDO_init( CO_TPDO_t *TPDO, CO_EM_t *em, CO_SDO_t *SDO, uint8_t *operatingState, uint8_t nodeId, uint16_t defaultCOB_ID, uint8_t restrictionFlags, const CO_TPDOCommPar_t *TPDOCommPar, const CO_TPDOMapPar_t *TPDOMapPar, uint16_t idx_TPDOCommPar, uint16_t idx_TPDOMapPar, CO_CANmodule_t *CANdevTx, uint16_t CANdevTxIdx) { /* verify arguments */ if(TPDO==NULL || em==NULL || SDO==NULL || operatingState==NULL || TPDOCommPar==NULL || TPDOMapPar==NULL || CANdevTx==NULL){ return CO_ERROR_ILLEGAL_ARGUMENT; } /* Configure object variables */ TPDO->em = em; TPDO->SDO = SDO; TPDO->TPDOCommPar = TPDOCommPar; TPDO->TPDOMapPar = TPDOMapPar; TPDO->operatingState = operatingState; TPDO->nodeId = nodeId; TPDO->defaultCOB_ID = defaultCOB_ID; TPDO->restrictionFlags = restrictionFlags; /* Configure Object dictionary entry at index 0x1800+ and 0x1A00+ */ CO_OD_configure(SDO, idx_TPDOCommPar, CO_ODF_TPDOcom, (void*)TPDO, 0, 0); CO_OD_configure(SDO, idx_TPDOMapPar, CO_ODF_TPDOmap, (void*)TPDO, 0, 0); /* configure communication and mapping */ TPDO->CANdevTx = CANdevTx; TPDO->CANdevTxIdx = CANdevTxIdx; TPDO->syncCounter = 255; TPDO->inhibitTimer = 0; TPDO->eventTimer = ((uint32_t) TPDOCommPar->eventTimer) * 1000; if(TPDOCommPar->transmissionType>=254) TPDO->sendRequest = 1; CO_TPDOconfigMap(TPDO, TPDOMapPar->numberOfMappedObjects); CO_TPDOconfigCom(TPDO, TPDOCommPar->COB_IDUsedByTPDO, ((TPDOCommPar->transmissionType<=240) ? 1 : 0)); if((TPDOCommPar->transmissionType>240 && TPDOCommPar->transmissionType<254) || TPDOCommPar->SYNCStartValue>240){ TPDO->valid = false; } return CO_ERROR_NO; }
int16_t CO_TPDO_init( CO_TPDO_t *TPDO, CO_EM_t *EM, CO_SDO_t *SDO, uint8_t *operatingState, uint8_t nodeId, uint16_t defaultCOB_ID, uint8_t restrictionFlags, const CO_TPDOCommPar_t *TPDOCommPar, const CO_TPDOMapPar_t *TPDOMapPar, uint16_t idx_TPDOCommPar, uint16_t idx_TPDOMapPar, CO_CANmodule_t *CANdevTx, uint16_t CANdevTxIdx) { /* Configure object variables */ TPDO->EM = EM; TPDO->SDO = SDO; TPDO->TPDOCommPar = TPDOCommPar; TPDO->TPDOMapPar = TPDOMapPar; TPDO->operatingState = operatingState; TPDO->nodeId = nodeId; TPDO->defaultCOB_ID = defaultCOB_ID; TPDO->restrictionFlags = restrictionFlags; /* Configure Object dictionary entry at index 0x1800+ and 0x1A00+ */ CO_OD_configure(SDO, idx_TPDOCommPar, CO_ODF_TPDOcom, (void*)TPDO, 0, 0); CO_OD_configure(SDO, idx_TPDOMapPar, CO_ODF_TPDOmap, (void*)TPDO, 0, 0); /* configure communication and mapping */ TPDO->CANdevTx = CANdevTx; TPDO->CANdevTxIdx = CANdevTxIdx; TPDO->syncCounter = 255; TPDO->inhibitTimer = 0; TPDO->eventTimer = TPDOCommPar->eventTimer; TPDO->SYNCtimerPrevious = 0; if(TPDOCommPar->transmissionType>=254) TPDO->sendRequest = 1; CO_TPDOconfigMap(TPDO, TPDOMapPar->numberOfMappedObjects); CO_TPDOconfigCom(TPDO, TPDOCommPar->COB_IDUsedByTPDO, ((TPDOCommPar->transmissionType<=240) ? 1 : 0)); if((TPDOCommPar->transmissionType>240 && TPDOCommPar->transmissionType<254) || TPDOCommPar->SYNCStartValue>240){ TPDO->valid = 0; } return CO_ERROR_NO; }