/* * Function for accessing _RPDO communication parameter_ (index 0x1400+) from SDO server. * * For more information see file CO_SDO.h. */ static CO_SDO_abortCode_t CO_ODF_RPDOcom(CO_ODF_arg_t *ODF_arg){ CO_RPDO_t *RPDO; RPDO = (CO_RPDO_t*) ODF_arg->object; /* Reading Object Dictionary variable */ if(ODF_arg->reading){ if(ODF_arg->subIndex == 1){ uint32_t *value = (uint32_t*) ODF_arg->data; /* if default COB ID is used, write default value here */ if(((*value)&0xFFFF) == RPDO->defaultCOB_ID && RPDO->defaultCOB_ID) *value += RPDO->nodeId; /* If PDO is not valid, set bit 31 */ if(!RPDO->valid) *value |= 0x80000000L; } return CO_SDO_AB_NONE; } /* Writing Object Dictionary variable */ if(RPDO->restrictionFlags & 0x04) return CO_SDO_AB_READONLY; /* Attempt to write a read only object. */ if(*RPDO->operatingState == CO_NMT_OPERATIONAL && (RPDO->restrictionFlags & 0x01)) return CO_SDO_AB_DATA_DEV_STATE; /* Data cannot be transferred or stored to the application because of the present device state. */ if(ODF_arg->subIndex == 1){ /* COB_ID */ uint32_t *value = (uint32_t*) ODF_arg->data; /* bits 11...29 must be zero */ if(*value & 0x3FFF8000L) return CO_SDO_AB_INVALID_VALUE; /* Invalid value for parameter (download only). */ /* if default COB-ID is being written, write defaultCOB_ID without nodeId */ if(((*value)&0xFFFF) == (RPDO->defaultCOB_ID + RPDO->nodeId)){ *value &= 0xC0000000L; *value += RPDO->defaultCOB_ID; } /* if PDO is valid, bits 0..29 can not be changed */ if(RPDO->valid && ((*value ^ RPDO->RPDOCommPar->COB_IDUsedByRPDO) & 0x3FFFFFFFL)) return CO_SDO_AB_INVALID_VALUE; /* Invalid value for parameter (download only). */ /* configure RPDO */ CO_RPDOconfigCom(RPDO, *value); } else if(ODF_arg->subIndex == 2){ /* Transmission_type */ uint8_t *value = (uint8_t*) ODF_arg->data; /* values from 241...253 are not valid */ if(*value >= 241 && *value <= 253) return CO_SDO_AB_INVALID_VALUE; /* Invalid value for parameter (download only). */ } return CO_SDO_AB_NONE; }
CO_ReturnError_t CO_RPDO_init( CO_RPDO_t *RPDO, CO_EM_t *em, CO_SDO_t *SDO, uint8_t *operatingState, uint8_t nodeId, uint16_t defaultCOB_ID, uint8_t restrictionFlags, const CO_RPDOCommPar_t *RPDOCommPar, const CO_RPDOMapPar_t *RPDOMapPar, uint16_t idx_RPDOCommPar, uint16_t idx_RPDOMapPar, CO_CANmodule_t *CANdevRx, uint16_t CANdevRxIdx) { /* verify arguments */ if(RPDO==NULL || em==NULL || SDO==NULL || operatingState==NULL || RPDOCommPar==NULL || RPDOMapPar==NULL || CANdevRx==NULL){ return CO_ERROR_ILLEGAL_ARGUMENT; } /* Configure object variables */ RPDO->em = em; RPDO->SDO = SDO; RPDO->RPDOCommPar = RPDOCommPar; RPDO->RPDOMapPar = RPDOMapPar; RPDO->operatingState = operatingState; RPDO->nodeId = nodeId; RPDO->defaultCOB_ID = defaultCOB_ID; RPDO->restrictionFlags = restrictionFlags; /* Configure Object dictionary entry at index 0x1400+ and 0x1600+ */ CO_OD_configure(SDO, idx_RPDOCommPar, CO_ODF_RPDOcom, (void*)RPDO, 0, 0); CO_OD_configure(SDO, idx_RPDOMapPar, CO_ODF_RPDOmap, (void*)RPDO, 0, 0); /* configure communication and mapping */ RPDO->CANrxNew = false; RPDO->CANdevRx = CANdevRx; RPDO->CANdevRxIdx = CANdevRxIdx; CO_RPDOconfigMap(RPDO, RPDOMapPar->numberOfMappedObjects); CO_RPDOconfigCom(RPDO, RPDOCommPar->COB_IDUsedByRPDO); return CO_ERROR_NO; }
int16_t CO_RPDO_init( CO_RPDO_t *RPDO, CO_EM_t *EM, CO_SDO_t *SDO, uint8_t *operatingState, uint8_t nodeId, uint16_t defaultCOB_ID, uint8_t restrictionFlags, const CO_RPDOCommPar_t *RPDOCommPar, const CO_RPDOMapPar_t *RPDOMapPar, uint16_t idx_RPDOCommPar, uint16_t idx_RPDOMapPar, CO_CANmodule_t *CANdevRx, uint16_t CANdevRxIdx) { /* Configure object variables */ RPDO->EM = EM; RPDO->SDO = SDO; RPDO->RPDOCommPar = RPDOCommPar; RPDO->RPDOMapPar = RPDOMapPar; RPDO->operatingState = operatingState; RPDO->nodeId = nodeId; RPDO->defaultCOB_ID = defaultCOB_ID; RPDO->restrictionFlags = restrictionFlags; /* Configure Object dictionary entry at index 0x1400+ and 0x1600+ */ CO_OD_configure(SDO, idx_RPDOCommPar, CO_ODF_RPDOcom, (void*)RPDO, 0, 0); CO_OD_configure(SDO, idx_RPDOMapPar, CO_ODF_RPDOmap, (void*)RPDO, 0, 0); /* configure communication and mapping */ RPDO->CANrxNew = 0; RPDO->CANdevRx = CANdevRx; RPDO->CANdevRxIdx = CANdevRxIdx; CO_RPDOconfigMap(RPDO, RPDOMapPar->numberOfMappedObjects); CO_RPDOconfigCom(RPDO, RPDOCommPar->COB_IDUsedByRPDO); return CO_ERROR_NO; }