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

Function CO_nodeGuardingMaster_process

301/CO_Node_Guarding.c:325–388  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

323}
324
325void
326CO_nodeGuardingMaster_process(CO_nodeGuardingMaster_t* ngm, uint32_t timeDifference_us, uint32_t* timerNext_us) {
327 (void)timerNext_us; /* may be unused */
328 bool_t allMonitoredActiveCurrent = true;
329 bool_t allMonitoredOperationalCurrent = true;
330 CO_nodeGuardingMasterNode_t* node = &ngm->nodes[0];
331
332 for (uint8_t i = 0; i < CO_CONFIG_NODE_GUARDING_MASTER_COUNT; i++) {
333 if (node->guardTime_us > 0 && node->ident > CO_CAN_ID_HEARTBEAT) {
334 if (timeDifference_us < node->guardTimer) {
335 node->guardTimer -= timeDifference_us;
336#if ((CO_CONFIG_NMT)&CO_CONFIG_FLAG_TIMERNEXT) != 0
337 /* Calculate, when timeout expires */
338 if (timerNext_us != NULL && *timerNext_us > node->guardTimer) {
339 *timerNext_us = node->guardTimer;
340 }
341#endif
342 } else {
343 /* it is time to send new rtr, but first verify last response */
344 if (!node->CANtxWasBusy) {
345 if (!node->responseRecived) {
346 node->monitoringActive = false;
347 /* error bit is shared with HB consumer */
348 CO_errorReport(ngm->em, CO_EM_HEARTBEAT_CONSUMER, CO_EMC_HEARTBEAT, node->ident & 0x7F);
349 } else if (node->NMTstate != CO_NMT_UNKNOWN) {
350 node->monitoringActive = true;
351 CO_errorReset(ngm->em, CO_EM_HEARTBEAT_CONSUMER, node->ident & 0x7F);
352 }
353 }
354
355 if (ngm->CANtxBuff->bufferFull) {
356 node->guardTimer = 0;
357 node->CANtxWasBusy = true;
358 } else {
359#if CO_CONFIG_NODE_GUARDING_MASTER_COUNT > 1
360 ngm->CANtxBuff = CO_CANtxBufferInit(ngm->CANdevTx, ngm->CANdevTxIdx, node->ident, true, 1, 0);
361#endif
362 (void)CO_CANsend(ngm->CANdevTx, ngm->CANtxBuff);
363 node->CANtxWasBusy = false;
364 node->responseRecived = false;
365 node->guardTimer = node->guardTime_us;
366 }
367 }
368
369 if (allMonitoredActiveCurrent) {
370 if (node->monitoringActive) {
371 if (node->NMTstate != CO_NMT_OPERATIONAL) {
372 allMonitoredOperationalCurrent = false;
373 }
374 } else {
375 allMonitoredActiveCurrent = false;
376 allMonitoredOperationalCurrent = false;
377 }
378 }
379 } /* if node enabled */
380
381 node++;
382 } /* for */

Callers 1

CO_processFunction · 0.85

Calls 2

CO_CANtxBufferInitFunction · 0.85
CO_CANsendFunction · 0.85

Tested by

no test coverage detected