| 212 | #endif /* (CO_CONFIG_SDO_CLI) & CO_CONFIG_FLAG_OD_DYNAMIC */ |
| 213 | |
| 214 | CO_ReturnError_t |
| 215 | CO_SDOclient_init(CO_SDOclient_t* SDO_C, OD_t* OD, OD_entry_t* OD_1280_SDOcliPar, uint8_t nodeId, |
| 216 | CO_CANmodule_t* CANdevRx, uint16_t CANdevRxIdx, CO_CANmodule_t* CANdevTx, uint16_t CANdevTxIdx, |
| 217 | uint32_t* errInfo) { |
| 218 | bool_t index_SDOcliPar_min = (OD_getIndex(OD_1280_SDOcliPar) < (uint16_t)(OD_H1280_SDO_CLIENT_1_PARAM)); |
| 219 | bool_t index_SDOcliPar_max = (OD_getIndex(OD_1280_SDOcliPar) > ((uint16_t)(OD_H1280_SDO_CLIENT_1_PARAM) + 0x7FU)); |
| 220 | |
| 221 | /* verify arguments */ |
| 222 | if ((SDO_C == NULL) || (OD_1280_SDOcliPar == NULL) || index_SDOcliPar_min || index_SDOcliPar_max |
| 223 | || (CANdevRx == NULL) || (CANdevTx == NULL)) { |
| 224 | return CO_ERROR_ILLEGAL_ARGUMENT; |
| 225 | } |
| 226 | |
| 227 | /* Configure object variables */ |
| 228 | #if ((CO_CONFIG_SDO_CLI)&CO_CONFIG_SDO_CLI_LOCAL) != 0 |
| 229 | SDO_C->OD = OD; |
| 230 | SDO_C->nodeId = nodeId; |
| 231 | #endif |
| 232 | SDO_C->CANdevRx = CANdevRx; |
| 233 | SDO_C->CANdevRxIdx = CANdevRxIdx; |
| 234 | SDO_C->CANdevTx = CANdevTx; |
| 235 | SDO_C->CANdevTxIdx = CANdevTxIdx; |
| 236 | #if ((CO_CONFIG_SDO_CLI)&CO_CONFIG_FLAG_CALLBACK_PRE) != 0 |
| 237 | SDO_C->pFunctSignal = NULL; |
| 238 | SDO_C->functSignalObject = NULL; |
| 239 | #endif |
| 240 | |
| 241 | /* prepare circular fifo buffer */ |
| 242 | CO_fifo_init(&SDO_C->bufFifo, SDO_C->buf, CO_CONFIG_SDO_CLI_BUFFER_SIZE + 1U); |
| 243 | |
| 244 | /* Get parameters from Object Dictionary (initial values) */ |
| 245 | uint8_t maxSubIndex, nodeIDOfTheSDOServer; |
| 246 | uint32_t COB_IDClientToServer, COB_IDServerToClient; |
| 247 | ODR_t odRet0 = OD_get_u8(OD_1280_SDOcliPar, 0, &maxSubIndex, true); |
| 248 | ODR_t odRet1 = OD_get_u32(OD_1280_SDOcliPar, 1, &COB_IDClientToServer, true); |
| 249 | ODR_t odRet2 = OD_get_u32(OD_1280_SDOcliPar, 2, &COB_IDServerToClient, true); |
| 250 | ODR_t odRet3 = OD_get_u8(OD_1280_SDOcliPar, 3, &nodeIDOfTheSDOServer, true); |
| 251 | |
| 252 | if ((odRet0 != ODR_OK) || (maxSubIndex != 3U) || (odRet1 != ODR_OK) || (odRet2 != ODR_OK) || (odRet3 != ODR_OK)) { |
| 253 | if (errInfo != NULL) { |
| 254 | *errInfo = OD_getIndex(OD_1280_SDOcliPar); |
| 255 | } |
| 256 | return CO_ERROR_OD_PARAMETERS; |
| 257 | } |
| 258 | |
| 259 | #if ((CO_CONFIG_SDO_CLI)&CO_CONFIG_FLAG_OD_DYNAMIC) != 0 |
| 260 | SDO_C->OD_1280_extension.object = SDO_C; |
| 261 | SDO_C->OD_1280_extension.read = OD_readOriginal; |
| 262 | SDO_C->OD_1280_extension.write = OD_write_1280; |
| 263 | ODR_t odRetE = OD_extension_init(OD_1280_SDOcliPar, &SDO_C->OD_1280_extension); |
| 264 | if (odRetE != ODR_OK) { |
| 265 | if (errInfo != NULL) { |
| 266 | *errInfo = OD_getIndex(OD_1280_SDOcliPar); |
| 267 | } |
| 268 | return CO_ERROR_OD_PARAMETERS; |
| 269 | } |
| 270 | |
| 271 | /* set to zero to make sure CO_SDOclient_setup() will reconfigure CAN */ |
no test coverage detected