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

Function CO_SDOclient_init

301/CO_SDOclient.c:214–284  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

212#endif /* (CO_CONFIG_SDO_CLI) & CO_CONFIG_FLAG_OD_DYNAMIC */
213
214CO_ReturnError_t
215CO_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 */

Callers 1

CO_CANopenInitFunction · 0.85

Calls 6

OD_getIndexFunction · 0.85
CO_fifo_initFunction · 0.85
OD_get_u8Function · 0.85
OD_get_u32Function · 0.85
OD_extension_initFunction · 0.85
CO_SDOclient_setupFunction · 0.85

Tested by

no test coverage detected