MCPcopy Create free account
hub / github.com/CANopenNode/CANopenNode / CO_SDOserver_init

Function CO_SDOserver_init

301/CO_SDOserver.c:253–362  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

251#endif /* (CO_CONFIG_SDO_SRV) & CO_CONFIG_FLAG_OD_DYNAMIC */
252
253CO_ReturnError_t
254CO_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

Callers 1

CO_CANopenInitFunction · 0.85

Calls 6

OD_getIndexFunction · 0.85
OD_set_u32Function · 0.85
OD_get_u8Function · 0.85
OD_get_u32Function · 0.85
OD_extension_initFunction · 0.85

Tested by

no test coverage detected