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

Function CO_new

CANopen.c:339–670  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

337#endif
338
339CO_t*
340CO_new(CO_config_t* config, uint32_t* heapMemoryUsed) {
341 CO_t* co = NULL;
342 /* return values */
343 CO_t* coFinal = NULL;
344 uint32_t mem = 0;
345
346 /* For each object:
347 * - allocate memory, verify allocation and calculate size of heap used
348 * - if CO_MULTIPLE_OD is defined:
349 * - use config structure
350 * - calculate number of CANrx and CYNtx messages: RX_CNT_xx and TX_CNT_xx
351 * - calculate indexes: RX_IDX_xx and TX_IDX_xx
352 * - calculate total count of CAN message buffers: CNT_ALL_RX_MSGS and CNT_ALL_TX_MSGS. */
353 do {
354#ifdef CO_MULTIPLE_OD
355 /* verify arguments */
356 if (config == NULL || config->CNT_NMT > 1 || config->CNT_HB_CONS > 1 || config->CNT_EM > 1
357 || config->CNT_SDO_SRV > 128 || config->CNT_SDO_CLI > 128 || config->CNT_SYNC > 1 || config->CNT_RPDO > 512
358 || config->CNT_TPDO > 512 || config->CNT_TIME > 1 || config->CNT_LEDS > 1 || config->CNT_GFC > 1
359 || config->CNT_SRDO > 64 || config->CNT_LSS_SLV > 1 || config->CNT_LSS_MST > 1 || config->CNT_GTWA > 1) {
360 break;
361 }
362#else
363 (void)config;
364#endif
365
366 /* CANopen object */
367 CO_alloc_break_on_fail(co, 1U, sizeof(*co));
368
369#ifdef CO_MULTIPLE_OD
370 co->config = config;
371#endif
372
373 /* NMT_Heartbeat */
374 ON_MULTI_OD(uint8_t RX_CNT_NMT_SLV = 0);
375 ON_MULTI_OD(uint8_t TX_CNT_NMT_MST = 0);
376 ON_MULTI_OD(uint8_t TX_CNT_HB_PROD = 0);
377 if (CO_GET_CNT(NMT) == 1U) {
378 CO_alloc_break_on_fail(co->NMT, CO_GET_CNT(NMT), sizeof(*co->NMT));
379 ON_MULTI_OD(RX_CNT_NMT_SLV = 1);
380#if ((CO_CONFIG_NMT)&CO_CONFIG_NMT_MASTER) != 0
381 ON_MULTI_OD(TX_CNT_NMT_MST = 1);
382#endif
383 ON_MULTI_OD(TX_CNT_HB_PROD = 1);
384 }
385
386#if ((CO_CONFIG_HB_CONS)&CO_CONFIG_HB_CONS_ENABLE) != 0
387 ON_MULTI_OD(uint8_t RX_CNT_HB_CONS = 0);
388 if (CO_GET_CNT(HB_CONS) == 1U) {
389 uint8_t countOfMonitoredNodes = CO_GET_CNT(ARR_1016);
390 CO_alloc_break_on_fail(co->HBcons, CO_GET_CNT(HB_CONS), sizeof(*co->HBcons));
391 CO_alloc_break_on_fail(co->HBconsMonitoredNodes, countOfMonitoredNodes, sizeof(*co->HBconsMonitoredNodes));
392 ON_MULTI_OD(RX_CNT_HB_CONS = countOfMonitoredNodes);
393 }
394#endif
395
396 /* Node guarding */

Callers 1

mainFunction · 0.85

Calls 1

CO_deleteFunction · 0.85

Tested by

no test coverage detected