| 251 | #endif /* (CO_CONFIG_SDO_SRV) & CO_CONFIG_FLAG_OD_DYNAMIC */ |
| 252 | |
| 253 | CO_ReturnError_t |
| 254 | CO_SDOserver_init(CO_SDOserver_t* SDO, OD_t* OD, OD_entry_t* OD_1200_SDOsrvPar, uint8_t nodeId, |
| 255 | uint16_t SDOtimeoutTime_ms, CO_CANmodule_t* CANdevRx, uint16_t CANdevRxIdx, CO_CANmodule_t* CANdevTx, |
| 256 | uint16_t CANdevTxIdx, uint32_t* errInfo) { |
| 257 | /* verify arguments */ |
| 258 | if ((SDO == NULL) || (OD == NULL) || (CANdevRx == NULL) || (CANdevTx == NULL)) { |
| 259 | return CO_ERROR_ILLEGAL_ARGUMENT; |
| 260 | } |
| 261 | |
| 262 | /* Configure object variables */ |
| 263 | SDO->OD = OD; |
| 264 | SDO->nodeId = nodeId; |
| 265 | #if (((CO_CONFIG_SDO_SRV)&CO_CONFIG_SDO_SRV_SEGMENTED)) != 0 |
| 266 | SDO->SDOtimeoutTime_us = (uint32_t)SDOtimeoutTime_ms * 1000U; |
| 267 | #endif |
| 268 | #if ((CO_CONFIG_SDO_SRV)&CO_CONFIG_SDO_SRV_BLOCK) != 0 |
| 269 | SDO->block_SDOtimeoutTime_us = (uint32_t)SDOtimeoutTime_ms * 700; |
| 270 | #endif |
| 271 | SDO->state = CO_SDO_ST_IDLE; |
| 272 | |
| 273 | #if ((CO_CONFIG_SDO_SRV)&CO_CONFIG_FLAG_CALLBACK_PRE) != 0 |
| 274 | SDO->pFunctSignalPre = NULL; |
| 275 | SDO->functSignalObjectPre = NULL; |
| 276 | #endif |
| 277 | |
| 278 | /* configure CAN identifiers and SDO server parameters if available */ |
| 279 | uint16_t CanId_ClientToServer, CanId_ServerToClient; |
| 280 | |
| 281 | if (OD_1200_SDOsrvPar == NULL) { |
| 282 | /* configure default SDO channel */ |
| 283 | if ((nodeId < 1U) || (nodeId > 127U)) { |
| 284 | return CO_ERROR_ILLEGAL_ARGUMENT; |
| 285 | } |
| 286 | |
| 287 | CanId_ClientToServer = CO_CAN_ID_SDO_CLI + nodeId; |
| 288 | CanId_ServerToClient = CO_CAN_ID_SDO_SRV + nodeId; |
| 289 | SDO->valid = true; |
| 290 | } else { |
| 291 | uint16_t OD_SDOsrvParIdx = OD_getIndex(OD_1200_SDOsrvPar); |
| 292 | |
| 293 | if (OD_SDOsrvParIdx == (uint16_t)OD_H1200_SDO_SERVER_1_PARAM) { |
| 294 | /* configure default SDO channel and SDO server parameters for it */ |
| 295 | if ((nodeId < 1U) || (nodeId > 127U)) { |
| 296 | return CO_ERROR_ILLEGAL_ARGUMENT; |
| 297 | } |
| 298 | |
| 299 | CanId_ClientToServer = CO_CAN_ID_SDO_CLI + nodeId; |
| 300 | CanId_ServerToClient = CO_CAN_ID_SDO_SRV + nodeId; |
| 301 | SDO->valid = true; |
| 302 | |
| 303 | (void)OD_set_u32(OD_1200_SDOsrvPar, 1, CanId_ClientToServer, true); |
| 304 | (void)OD_set_u32(OD_1200_SDOsrvPar, 2, CanId_ServerToClient, true); |
| 305 | } else if ((OD_SDOsrvParIdx > (uint16_t)OD_H1200_SDO_SERVER_1_PARAM) |
| 306 | && (OD_SDOsrvParIdx <= ((uint16_t)OD_H1200_SDO_SERVER_1_PARAM + 0x7FU))) { |
| 307 | /* configure additional SDO channel and SDO server parameters for it */ |
| 308 | uint8_t maxSubIndex; |
| 309 | uint32_t COB_IDClientToServer32, COB_IDServerToClient32; |
| 310 |
no test coverage detected