1
0
Fork 0

Add Stack configuration macros to most of CANopenNode objects.

Add CO_NMT_initCallbackPre()
This commit is contained in:
Janez 2020-03-19 18:07:23 +01:00
parent d9c44c69d1
commit c88194e813
22 changed files with 436 additions and 121 deletions

View file

@ -29,6 +29,7 @@
#include "301/CO_Emergency.h"
#if (CO_CONFIG_EM) & CO_CONFIG_EM_CONSUMER
/*
* Read received message from CAN module.
*
@ -59,6 +60,7 @@ static void CO_EM_receive(void *object, void *msg) {
}
}
}
#endif
/*
* Function for accessing _Pre-Defined Error Field_ (index 0x1003) from SDO server.
@ -151,7 +153,11 @@ CO_ReturnError_t CO_EM_init(
/* verify arguments */
if(em==NULL || emPr==NULL || SDO==NULL || errorStatusBits==NULL || errorStatusBitsSize<6U ||
errorRegister==NULL || preDefErr==NULL || CANdevTx==NULL || CANdevRx==NULL){
errorRegister==NULL || preDefErr==NULL || CANdevTx==NULL
#if (CO_CONFIG_EM) & CO_CONFIG_EM_CONSUMER
|| CANdevRx==NULL
#endif
){
return CO_ERROR_ILLEGAL_ARGUMENT;
}
@ -163,9 +169,13 @@ CO_ReturnError_t CO_EM_init(
em->bufReadPtr = em->buf;
em->bufFull = 0U;
em->wrongErrorReport = 0U;
em->pFunctSignal = NULL;
em->functSignalObject = NULL;
#if (CO_CONFIG_EM) & CO_CONFIG_FLAG_CALLBACK_PRE
em->pFunctSignalPre = NULL;
em->functSignalObjectPre = NULL;
#endif
#if (CO_CONFIG_EM) & CO_CONFIG_EM_CONSUMER
em->pFunctSignalRx = NULL;
#endif
emPr->em = em;
emPr->errorRegister = errorRegister;
emPr->preDefErr = preDefErr;
@ -182,6 +192,7 @@ CO_ReturnError_t CO_EM_init(
CO_OD_configure(SDO, OD_H1003_PREDEF_ERR_FIELD, CO_ODF_1003, (void*)emPr, 0, 0U);
CO_OD_configure(SDO, OD_H1014_COBID_EMERGENCY, CO_ODF_1014, (void*)&SDO->nodeId, 0, 0U);
#if (CO_CONFIG_EM) & CO_CONFIG_EM_CONSUMER
/* configure SDO server CAN reception */
ret = CO_CANrxBufferInit(
CANdevRx, /* CAN device */
@ -191,6 +202,7 @@ CO_ReturnError_t CO_EM_init(
0, /* rtr */
(void*)em, /* object passed to receive function */
CO_EM_receive); /* this function will process received message */
#endif
/* configure emergency message CAN transmission */
emPr->CANdev = CANdevTx;
@ -211,6 +223,7 @@ CO_ReturnError_t CO_EM_init(
}
#if (CO_CONFIG_EM) & CO_CONFIG_FLAG_CALLBACK_PRE
/******************************************************************************/
void CO_EM_initCallbackPre(
CO_EM_t *em,
@ -218,12 +231,14 @@ void CO_EM_initCallbackPre(
void (*pFunctSignal)(void *object))
{
if(em != NULL){
em->functSignalObject = object;
em->pFunctSignal = pFunctSignal;
em->functSignalObjectPre = object;
em->pFunctSignalPre = pFunctSignal;
}
}
#endif
#if (CO_CONFIG_EM) & CO_CONFIG_EM_CONSUMER
/******************************************************************************/
void CO_EM_initCallbackRx(
CO_EM_t *em,
@ -237,6 +252,7 @@ void CO_EM_initCallbackRx(
em->pFunctSignalRx = pFunctSignalRx;
}
}
#endif
/******************************************************************************/
@ -300,6 +316,7 @@ void CO_EM_process(
/* add error register */
em->bufReadPtr[2] = *emPr->errorRegister;
#if (CO_CONFIG_EM) & CO_CONFIG_EM_CONSUMER
/* report also own emergency messages */
if (em->pFunctSignalRx != NULL) {
uint16_t errorCode;
@ -312,6 +329,7 @@ void CO_EM_process(
em->bufReadPtr[3],
infoCode);
}
#endif
/* copy data to CAN emergency message */
CO_memcpy(emPr->CANtxBuff->data, em->bufReadPtr, 8U);
@ -414,10 +432,12 @@ void CO_errorReport(CO_EM_t *em, const uint8_t errorBit, const uint16_t errorCod
if(em->bufWritePtr == em->bufReadPtr) em->bufFull = 1;
CO_UNLOCK_EMCY();
#if (CO_CONFIG_EM) & CO_CONFIG_FLAG_CALLBACK_PRE
/* Optional signal to RTOS, which can resume task, which handles CO_EM_process */
if(em->pFunctSignal != NULL) {
em->pFunctSignal(em->functSignalObject);
if(em->pFunctSignalPre != NULL) {
em->pFunctSignalPre(em->functSignalObjectPre);
}
#endif
}
}
}
@ -473,10 +493,12 @@ void CO_errorReset(CO_EM_t *em, const uint8_t errorBit, const uint32_t infoCode)
if(em->bufWritePtr == em->bufReadPtr) em->bufFull = 1;
CO_UNLOCK_EMCY();
#if (CO_CONFIG_EM) & CO_CONFIG_FLAG_CALLBACK_PRE
/* Optional signal to RTOS, which can resume task, which handles CO_EM_process */
if(em->pFunctSignal != NULL) {
em->pFunctSignal(em->functSignalObject);
if(em->pFunctSignalPre != NULL) {
em->pFunctSignalPre(em->functSignalObjectPre);
}
#endif
}
}
}

View file

@ -262,16 +262,20 @@ typedef struct{
uint8_t *bufReadPtr; /**< Read pointer in the above buffer */
uint8_t bufFull; /**< True if above buffer is full */
uint8_t wrongErrorReport; /**< Error in arguments to CO_errorReport() */
#if ((CO_CONFIG_EM) & CO_CONFIG_FLAG_CALLBACK_PRE) || defined CO_DOXYGEN
/** From CO_EM_initCallbackPre() or NULL */
void (*pFunctSignal)(void *object);
void (*pFunctSignalPre)(void *object);
/** From CO_EM_initCallbackPre() or NULL */
void *functSignalObject;
void *functSignalObjectPre;
#endif
#if ((CO_CONFIG_EM) & CO_CONFIG_EM_CONSUMER) || defined CO_DOXYGEN
/** From CO_EM_initCallbackRx() or NULL */
void (*pFunctSignalRx)(const uint16_t ident,
const uint16_t errorCode,
const uint8_t errorRegister,
const uint8_t errorBit,
const uint32_t infoCode);
#endif
}CO_EM_t;
@ -387,6 +391,7 @@ CO_ReturnError_t CO_EM_init(
uint16_t CANidTxEM);
#if ((CO_CONFIG_EM) & CO_CONFIG_FLAG_CALLBACK_PRE) || defined CO_DOXYGEN
/**
* Initialize Emergency callback function.
*
@ -404,8 +409,10 @@ void CO_EM_initCallbackPre(
CO_EM_t *em,
void *object,
void (*pFunctSignal)(void *object));
#endif
#if ((CO_CONFIG_EM) & CO_CONFIG_EM_CONSUMER) || defined CO_DOXYGEN
/**
* Initialize Emergency received callback function.
*
@ -428,6 +435,7 @@ void CO_EM_initCallbackRx(
const uint8_t errorRegister,
const uint8_t errorBit,
const uint32_t infoCode));
#endif
/**

View file

@ -50,10 +50,10 @@ static void CO_HBcons_receive(void *object, void *msg){
CO_FLAG_SET(HBconsNode->CANrxNew);
}
#if CO_CONFIG_HB_CONS & CO_CONFIG_FLAG_CANRX_CALLBACK
#if (CO_CONFIG_HB_CONS) & CO_CONFIG_FLAG_CALLBACK_PRE
/* Optional signal to RTOS, which can resume task, which handles HBcons. */
if(HBconsNode->pFunctSignalCanRx != NULL) {
HBconsNode->pFunctSignalCanRx(HBconsNode->functSignalObjectCanRx);
if(HBconsNode->pFunctSignalPre != NULL) {
HBconsNode->pFunctSignalPre(HBconsNode->functSignalObjectPre);
}
#endif
}
@ -123,7 +123,7 @@ CO_ReturnError_t CO_HBconsumer_init(
HBcons->NMTisPreOrOperationalPrev = false;
HBcons->CANdevRx = CANdevRx;
HBcons->CANdevRxIdxStart = CANdevRxIdxStart;
#if CO_CONFIG_HB_CONS & CO_CONFIG_HB_CONS_CHANGE_CALLBACK
#if (CO_CONFIG_HB_CONS) & CO_CONFIG_HB_CONS_CALLBACK_CHANGE
HBcons->pFunctSignalNmtChanged = NULL;
#endif
@ -131,10 +131,10 @@ CO_ReturnError_t CO_HBconsumer_init(
uint8_t nodeId = (HBcons->HBconsTime[i] >> 16U) & 0xFFU;
uint16_t time = HBcons->HBconsTime[i] & 0xFFFFU;
ret = CO_HBconsumer_initEntry(HBcons, i, nodeId, time);
#if CO_CONFIG_HB_CONS & CO_CONFIG_FLAG_CANRX_CALLBACK
HBcons->monitoredNodes[i].pFunctSignalCanRx = NULL;
#if (CO_CONFIG_HB_CONS) & CO_CONFIG_FLAG_CALLBACK_PRE
HBcons->monitoredNodes[i].pFunctSignalPre = NULL;
#endif
#if CO_CONFIG_HB_CONS & CO_CONFIG_HB_CONS_MULTI_CALLBACK
#if (CO_CONFIG_HB_CONS) & CO_CONFIG_HB_CONS_CALLBACK_MULTI
HBcons->monitoredNodes[i].pFunctSignalHbStarted = NULL;
HBcons->monitoredNodes[i].pFunctSignalTimeout = NULL;
HBcons->monitoredNodes[i].pFunctSignalRemoteReset = NULL;
@ -183,7 +183,7 @@ CO_ReturnError_t CO_HBconsumer_initEntry(
monitoredNode->nodeId = nodeId;
monitoredNode->time_us = (int32_t)consumerTime_ms * 1000;
monitoredNode->NMTstate = CO_NMT_UNKNOWN;
#if CO_CONFIG_HB_CONS & CO_CONFIG_HB_CONS_CHANGE_CALLBACK
#if (CO_CONFIG_HB_CONS) & CO_CONFIG_HB_CONS_CALLBACK_CHANGE
monitoredNode->NMTstatePrev = CO_NMT_UNKNOWN;
#endif
CO_FLAG_CLEAR(monitoredNode->CANrxNew);
@ -214,7 +214,7 @@ CO_ReturnError_t CO_HBconsumer_initEntry(
}
#if CO_CONFIG_HB_CONS & CO_CONFIG_FLAG_CANRX_CALLBACK
#if (CO_CONFIG_HB_CONS) & CO_CONFIG_FLAG_CALLBACK_PRE
/******************************************************************************/
void CO_HBconsumer_initCallbackPre(
CO_HBconsumer_t *HBcons,
@ -224,15 +224,15 @@ void CO_HBconsumer_initCallbackPre(
if (HBcons != NULL) {
uint8_t i;
for(i=0; i<HBcons->numberOfMonitoredNodes; i++) {
HBcons->monitoredNodes[i].pFunctSignalCanRx = pFunctSignal;
HBcons->monitoredNodes[i].functSignalObjectCanRx = object;
HBcons->monitoredNodes[i].pFunctSignalPre = pFunctSignal;
HBcons->monitoredNodes[i].functSignalObjectPre = object;
}
}
}
#endif
#if CO_CONFIG_HB_CONS & CO_CONFIG_HB_CONS_CHANGE_CALLBACK
#if (CO_CONFIG_HB_CONS) & CO_CONFIG_HB_CONS_CALLBACK_CHANGE
/******************************************************************************/
void CO_HBconsumer_initCallbackNmtChanged(
CO_HBconsumer_t *HBcons,
@ -251,7 +251,7 @@ void CO_HBconsumer_initCallbackNmtChanged(
#endif
#if CO_CONFIG_HB_CONS & CO_CONFIG_HB_CONS_MULTI_CALLBACK
#if (CO_CONFIG_HB_CONS) & CO_CONFIG_HB_CONS_CALLBACK_MULTI
/******************************************************************************/
void CO_HBconsumer_initCallbackHeartbeatStarted(
CO_HBconsumer_t *HBcons,
@ -307,7 +307,7 @@ void CO_HBconsumer_initCallbackRemoteReset(
monitoredNode->pFunctSignalRemoteReset = pFunctSignal;
monitoredNode->functSignalObjectRemoteReset = object;
}
#endif /* CO_CONFIG_HB_CONS & CO_CONFIG_HB_CONS_MULTI_CALLBACK */
#endif /* (CO_CONFIG_HB_CONS) & CO_CONFIG_HB_CONS_CALLBACK_MULTI */
/******************************************************************************/
@ -334,7 +334,7 @@ void CO_HBconsumer_process(
if (CO_FLAG_READ(monitoredNode->CANrxNew)) {
if (monitoredNode->NMTstate == CO_NMT_INITIALIZING) {
/* bootup message*/
#if CO_CONFIG_HB_CONS & CO_CONFIG_HB_CONS_MULTI_CALLBACK
#if (CO_CONFIG_HB_CONS) & CO_CONFIG_HB_CONS_CALLBACK_MULTI
if (monitoredNode->pFunctSignalRemoteReset != NULL) {
monitoredNode->pFunctSignalRemoteReset(
monitoredNode->nodeId, i,
@ -351,7 +351,7 @@ void CO_HBconsumer_process(
}
else {
/* heartbeat message */
#if CO_CONFIG_HB_CONS & CO_CONFIG_HB_CONS_MULTI_CALLBACK
#if (CO_CONFIG_HB_CONS) & CO_CONFIG_HB_CONS_CALLBACK_MULTI
if (monitoredNode->HBstate != CO_HBconsumer_ACTIVE &&
monitoredNode->pFunctSignalHbStarted != NULL) {
monitoredNode->pFunctSignalHbStarted(
@ -373,7 +373,7 @@ void CO_HBconsumer_process(
if (monitoredNode->timeoutTimer >= monitoredNode->time_us) {
/* timeout expired */
#if CO_CONFIG_HB_CONS & CO_CONFIG_HB_CONS_MULTI_CALLBACK
#if (CO_CONFIG_HB_CONS) & CO_CONFIG_HB_CONS_CALLBACK_MULTI
if (monitoredNode->pFunctSignalTimeout!=NULL) {
monitoredNode->pFunctSignalTimeout(
monitoredNode->nodeId, i,
@ -402,7 +402,7 @@ void CO_HBconsumer_process(
if (monitoredNode->NMTstate != CO_NMT_OPERATIONAL) {
allMonitoredOperationalCurrent = CO_NMT_UNKNOWN;
}
#if CO_CONFIG_HB_CONS & CO_CONFIG_HB_CONS_CHANGE_CALLBACK
#if (CO_CONFIG_HB_CONS) & CO_CONFIG_HB_CONS_CALLBACK_CHANGE
/* Verify, if NMT state of monitored node changed */
if(monitoredNode->NMTstate != monitoredNode->NMTstatePrev) {
if (HBcons->pFunctSignalNmtChanged != NULL) {
@ -420,7 +420,7 @@ void CO_HBconsumer_process(
/* (pre)operational state changed, clear variables */
for(i=0; i<HBcons->numberOfMonitoredNodes; i++) {
monitoredNode->NMTstate = CO_NMT_UNKNOWN;
#if CO_CONFIG_HB_CONS & CO_CONFIG_HB_CONS_CHANGE_CALLBACK
#if (CO_CONFIG_HB_CONS) & CO_CONFIG_HB_CONS_CALLBACK_CHANGE
monitoredNode->NMTstatePrev = CO_NMT_UNKNOWN;
#endif
CO_FLAG_CLEAR(monitoredNode->CANrxNew);
@ -446,7 +446,7 @@ void CO_HBconsumer_process(
}
#if CO_CONFIG_HB_CONS & CO_CONFIG_HB_CONS_QUERY_FUNCT
#if (CO_CONFIG_HB_CONS) & CO_CONFIG_HB_CONS_QUERY_FUNCT
/******************************************************************************/
int8_t CO_HBconsumer_getIdxByNodeId(
CO_HBconsumer_t *HBcons,
@ -508,4 +508,4 @@ int8_t CO_HBconsumer_getNmtState(
}
return -1;
}
#endif /* CO_CONFIG_HB_CONS & CO_CONFIG_HB_CONS_QUERY_FUNCT */
#endif /* (CO_CONFIG_HB_CONS) & CO_CONFIG_HB_CONS_QUERY_FUNCT */

View file

@ -77,17 +77,17 @@ typedef struct {
uint32_t time_us;
/** Indication if new Heartbeat message received from the CAN bus */
volatile void *CANrxNew;
#if (CO_CONFIG_HB_CONS & CO_CONFIG_FLAG_CANRX_CALLBACK) || defined CO_DOXYGEN
#if ((CO_CONFIG_HB_CONS) & CO_CONFIG_FLAG_CALLBACK_PRE) || defined CO_DOXYGEN
/** From CO_HBconsumer_initCallbackPre() or NULL */
void (*pFunctSignalCanRx)(void *object);
void (*pFunctSignalPre)(void *object);
/** From CO_HBconsumer_initCallbackPre() or NULL */
void *functSignalObjectCanRx;
void *functSignalObjectPre;
#endif
#if (CO_CONFIG_HB_CONS & CO_CONFIG_HB_CONS_CHANGE_CALLBACK) || defined CO_DOXYGEN
#if ((CO_CONFIG_HB_CONS) & CO_CONFIG_HB_CONS_CALLBACK_CHANGE) || defined CO_DOXYGEN
/** Previous value of the remote node (Heartbeat payload) */
CO_NMT_internalState_t NMTstatePrev;
#endif
#if (CO_CONFIG_HB_CONS & CO_CONFIG_HB_CONS_MULTI_CALLBACK) || defined CO_DOXYGEN
#if ((CO_CONFIG_HB_CONS) & CO_CONFIG_HB_CONS_CALLBACK_MULTI) || defined CO_DOXYGEN
/** Callback for heartbeat state change to active event.
* From CO_HBconsumer_initCallbackHeartbeatStarted() or NULL. */
void (*pFunctSignalHbStarted)(uint8_t nodeId, uint8_t idx, void *object);
@ -127,7 +127,7 @@ typedef struct{
bool_t NMTisPreOrOperationalPrev; /**< previous state of var */
CO_CANmodule_t *CANdevRx; /**< From CO_HBconsumer_init() */
uint16_t CANdevRxIdxStart; /**< From CO_HBconsumer_init() */
#if (CO_CONFIG_HB_CONS & CO_CONFIG_HB_CONS_CHANGE_CALLBACK) || defined CO_DOXYGEN
#if ((CO_CONFIG_HB_CONS) & CO_CONFIG_HB_CONS_CALLBACK_CHANGE) || defined CO_DOXYGEN
/** Callback for remote NMT changed event.
* From CO_HBconsumer_initCallbackNmtChanged() or NULL. */
void (*pFunctSignalNmtChanged)(uint8_t nodeId,
@ -188,7 +188,7 @@ CO_ReturnError_t CO_HBconsumer_initEntry(
uint8_t nodeId,
uint16_t consumerTime_ms);
#if (CO_CONFIG_HB_CONS & CO_CONFIG_FLAG_CANRX_CALLBACK) || defined CO_DOXYGEN
#if ((CO_CONFIG_HB_CONS) & CO_CONFIG_FLAG_CALLBACK_PRE) || defined CO_DOXYGEN
/**
* Initialize Heartbeat consumer callback function.
*
@ -206,7 +206,7 @@ void CO_HBconsumer_initCallbackPre(
void (*pFunctSignal)(void *object));
#endif
#if (CO_CONFIG_HB_CONS & CO_CONFIG_HB_CONS_CHANGE_CALLBACK) || defined CO_DOXYGEN
#if ((CO_CONFIG_HB_CONS) & CO_CONFIG_HB_CONS_CALLBACK_CHANGE) || defined CO_DOXYGEN
/**
* Initialize Heartbeat consumer NMT changed callback function.
*
@ -226,7 +226,7 @@ void CO_HBconsumer_initCallbackNmtChanged(
void *object));
#endif
#if (CO_CONFIG_HB_CONS & CO_CONFIG_HB_CONS_MULTI_CALLBACK) || defined CO_DOXYGEN
#if ((CO_CONFIG_HB_CONS) & CO_CONFIG_HB_CONS_CALLBACK_MULTI) || defined CO_DOXYGEN
/**
* Initialize Heartbeat consumer started callback function.
*
@ -281,7 +281,7 @@ void CO_HBconsumer_initCallbackRemoteReset(
uint8_t idx,
void *object,
void (*pFunctSignal)(uint8_t nodeId, uint8_t idx, void *object));
#endif /* CO_CONFIG_HB_CONS & CO_CONFIG_HB_CONS_MULTI_CALLBACK */
#endif /* (CO_CONFIG_HB_CONS) & CO_CONFIG_HB_CONS_CALLBACK_MULTI */
/**
* Process Heartbeat consumer object.
@ -300,7 +300,7 @@ void CO_HBconsumer_process(
uint32_t *timerNext_us);
#if (CO_CONFIG_HB_CONS & CO_CONFIG_HB_CONS_QUERY_FUNCT) || defined CO_DOXYGEN
#if ((CO_CONFIG_HB_CONS) & CO_CONFIG_HB_CONS_QUERY_FUNCT) || defined CO_DOXYGEN
/**
* Get the heartbeat producer object index by node ID
*
@ -338,7 +338,7 @@ int8_t CO_HBconsumer_getNmtState(
CO_HBconsumer_t *HBcons,
uint8_t idx,
CO_NMT_internalState_t *nmtState);
#endif /* CO_CONFIG_HB_CONS & CO_CONFIG_HB_CONS_QUERY_FUNCT */
#endif /* (CO_CONFIG_HB_CONS) & CO_CONFIG_HB_CONS_QUERY_FUNCT */
#ifdef __cplusplus
}

View file

@ -48,7 +48,9 @@ static void CO_NMT_receive(void *object, void *msg){
if((DLC == 2) && ((nodeId == 0) || (nodeId == NMT->nodeId))){
uint8_t command = data[0];
#if (CO_CONFIG_NMT) & (CO_CONFIG_NMT_CALLBACK_CHANGE | CO_CONFIG_FLAG_CALLBACK_PRE)
CO_NMT_internalState_t currentOperatingState = NMT->operatingState;
#endif
switch(command){
case CO_NMT_ENTER_OPERATIONAL:
@ -72,9 +74,17 @@ static void CO_NMT_receive(void *object, void *msg){
break;
}
#if (CO_CONFIG_NMT) & CO_CONFIG_NMT_CALLBACK_CHANGE
if(NMT->pFunctNMT!=NULL && currentOperatingState!=NMT->operatingState){
NMT->pFunctNMT(NMT->operatingState);
}
#endif
#if (CO_CONFIG_NMT) & CO_CONFIG_FLAG_CALLBACK_PRE
/* Optional signal to RTOS, which can resume task, which handles NMT. */
if(NMT->pFunctSignalPre != NULL && currentOperatingState!=NMT->operatingState) {
NMT->pFunctSignalPre(NMT->functSignalObjectPre);
}
#endif
}
}
@ -96,15 +106,18 @@ CO_ReturnError_t CO_NMT_init(
uint16_t CANidTxHB)
{
/* verify arguments */
if (NMT == NULL || emPr == NULL || NMT_CANdevRx == NULL ||
NMT_CANdevTx == NULL || HB_CANdevTx == NULL) {
if (NMT == NULL || emPr == NULL || NMT_CANdevRx == NULL || HB_CANdevTx == NULL
#if (CO_CONFIG_NMT) & CO_CONFIG_NMT_MASTER
|| NMT_CANdevTx == NULL
#endif
) {
return CO_ERROR_ILLEGAL_ARGUMENT;
}
CO_ReturnError_t ret = CO_ERROR_NO;
/* blinking bytes and LEDS */
#if CO_CONFIG_NMT & CO_CONFIG_NMT_LEDS
#if (CO_CONFIG_NMT) & CO_CONFIG_NMT_LEDS
NMT->LEDtimer = 0;
NMT->LEDflickering = 0;
NMT->LEDblinking = 0;
@ -123,7 +136,13 @@ CO_ReturnError_t CO_NMT_init(
NMT->resetCommand = 0;
NMT->HBproducerTimer = 0;
NMT->emPr = emPr;
#if (CO_CONFIG_NMT) & CO_CONFIG_FLAG_CALLBACK_PRE
NMT->pFunctSignalPre = NULL;
NMT->functSignalObjectPre = NULL;
#endif
#if (CO_CONFIG_NMT) & CO_CONFIG_NMT_CALLBACK_CHANGE
NMT->pFunctNMT = NULL;
#endif
/* configure NMT CAN reception */
ret = CO_CANrxBufferInit(
@ -135,6 +154,7 @@ CO_ReturnError_t CO_NMT_init(
(void*)NMT, /* object passed to receive function */
CO_NMT_receive); /* this function will process received message */
#if (CO_CONFIG_NMT) & CO_CONFIG_NMT_MASTER
/* configure NMT CAN transmission */
NMT->NMT_CANdevTx = NMT_CANdevTx;
NMT->NMT_TXbuff = CO_CANtxBufferInit(
@ -144,6 +164,10 @@ CO_ReturnError_t CO_NMT_init(
0, /* rtr */
2, /* number of data bytes */
0); /* synchronous message flag bit */
if (NMT->NMT_TXbuff == NULL) {
ret = CO_ERROR_ILLEGAL_ARGUMENT;
}
#endif
/* configure HB CAN transmission */
NMT->HB_CANdevTx = HB_CANdevTx;
@ -155,7 +179,7 @@ CO_ReturnError_t CO_NMT_init(
1, /* number of data bytes */
0); /* synchronous message flag bit */
if (NMT->NMT_TXbuff == NULL || NMT->HB_TXbuff == NULL) {
if (NMT->HB_TXbuff == NULL) {
ret = CO_ERROR_ILLEGAL_ARGUMENT;
}
@ -163,8 +187,23 @@ CO_ReturnError_t CO_NMT_init(
}
#if (CO_CONFIG_NMT) & CO_CONFIG_FLAG_CALLBACK_PRE
void CO_NMT_initCallbackPre(
CO_NMT_t *NMT,
void *object,
void (*pFunctSignal)(void *object))
{
if (NMT != NULL) {
NMT->pFunctSignalPre = pFunctSignal;
NMT->functSignalObjectPre = object;
}
}
#endif
#if (CO_CONFIG_NMT) & CO_CONFIG_NMT_CALLBACK_CHANGE
/******************************************************************************/
void CO_NMT_initCallbackChange(
void CO_NMT_initCallbackChanged(
CO_NMT_t *NMT,
void (*pFunctNMT)(CO_NMT_internalState_t state))
{
@ -175,6 +214,7 @@ void CO_NMT_initCallbackChange(
}
}
}
#endif
/******************************************************************************/
@ -223,7 +263,7 @@ CO_NMT_reset_cmd_t CO_NMT_process(
CANpassive = 1;
#if CO_CONFIG_NMT & CO_CONFIG_NMT_LEDS
#if (CO_CONFIG_NMT) & CO_CONFIG_NMT_LEDS
NMT->LEDtimer += timeDifference_us;
if (NMT->LEDtimer >= 50000) {
NMT->LEDtimer -= 50000;
@ -350,9 +390,11 @@ CO_NMT_reset_cmd_t CO_NMT_process(
}
if (currentOperatingState != NMT->operatingState) {
#if (CO_CONFIG_NMT) & CO_CONFIG_NMT_CALLBACK_CHANGE
if (NMT->pFunctNMT != NULL) {
NMT->pFunctNMT(NMT->operatingState);
}
#endif
/* execute next CANopen processing immediately */
if (timerNext_us != NULL) {
*timerNext_us = 0;
@ -386,6 +428,7 @@ CO_NMT_internalState_t CO_NMT_getInternalState(
}
#if (CO_CONFIG_NMT) & CO_CONFIG_NMT_MASTER
/******************************************************************************/
CO_ReturnError_t CO_NMT_sendCommand(CO_NMT_t *NMT,
CO_NMT_command_t command,
@ -433,3 +476,4 @@ CO_ReturnError_t CO_NMT_sendCommand(CO_NMT_t *NMT,
return error;
}
#endif

View file

@ -130,7 +130,7 @@ typedef enum{
* @ref CO_NMT_statusLEDdiodes. Object is initialized by CO_NMT_init().
*/
typedef struct{
#if (CO_CONFIG_NMT & CO_CONFIG_NMT_LEDS) || defined CO_DOXYGEN
#if ((CO_CONFIG_NMT) & CO_CONFIG_NMT_LEDS) || defined CO_DOXYGEN
uint32_t LEDtimer; /**< 50ms led timer */
int8_t LEDflickering; /**< See @ref CO_NMT_statusLEDdiodes */
int8_t LEDblinking; /**< See @ref CO_NMT_statusLEDdiodes */
@ -148,11 +148,21 @@ typedef struct{
uint32_t HBproducerTimer;/**< Internal timer for HB producer */
uint32_t firstHBTime; /**< From CO_NMT_init() */
CO_EMpr_t *emPr; /**< From CO_NMT_init() */
#if ((CO_CONFIG_NMT) & CO_CONFIG_NMT_MASTER) || defined CO_DOXYGEN
CO_CANmodule_t *NMT_CANdevTx; /**< From CO_NMT_init() */
CO_CANtx_t *NMT_TXbuff; /**< CAN transmit buffer for NMT master message */
#endif
CO_CANmodule_t *HB_CANdevTx; /**< From CO_NMT_init() */
CO_CANtx_t *HB_TXbuff; /**< CAN transmit buffer for heartbeat message */
void (*pFunctNMT)(CO_NMT_internalState_t state); /**< From CO_NMT_initCallbackChange() or NULL */
#if ((CO_CONFIG_NMT) & CO_CONFIG_FLAG_CALLBACK_PRE) || defined CO_DOXYGEN
/** From CO_NMT_initCallbackPre() or NULL */
void (*pFunctSignalPre)(void *object);
/** From CO_NMT_initCallbackPre() or NULL */
void *functSignalObjectPre;
#endif
#if ((CO_CONFIG_NMT) & CO_CONFIG_NMT_CALLBACK_CHANGE) || defined CO_DOXYGEN
void (*pFunctNMT)(CO_NMT_internalState_t state); /**< From CO_NMT_initCallbackChanged() or NULL */
#endif
}CO_NMT_t;
@ -194,6 +204,27 @@ CO_ReturnError_t CO_NMT_init(
uint16_t HB_txIdx,
uint16_t CANidTxHB);
#if ((CO_CONFIG_NMT) & CO_CONFIG_FLAG_CALLBACK_PRE) || defined CO_DOXYGEN
/**
* Initialize NMT callback function after message preprocessed.
*
* Function initializes optional callback function, which should immediately
* start processing of CO_NMT_process() function.
* Callback is called after NMT message is received from the CAN bus.
*
* @param NMT This object.
* @param object Pointer to object, which will be passed to pFunctSignal(). Can be NULL
* @param pFunctSignal Pointer to the callback function. Not called if NULL.
*/
void CO_NMT_initCallbackPre(
CO_NMT_t *NMT,
void *object,
void (*pFunctSignal)(void *object));
#endif
#if ((CO_CONFIG_NMT) & CO_CONFIG_NMT_CALLBACK_CHANGE) || defined CO_DOXYGEN
/**
* Initialize NMT callback function.
*
@ -208,9 +239,10 @@ CO_ReturnError_t CO_NMT_init(
* @param NMT This object.
* @param pFunctNMT Pointer to the callback function. Not called if NULL.
*/
void CO_NMT_initCallbackChange(
void CO_NMT_initCallbackChanged(
CO_NMT_t *NMT,
void (*pFunctNMT)(CO_NMT_internalState_t state));
#endif
/**
@ -251,6 +283,7 @@ CO_NMT_internalState_t CO_NMT_getInternalState(
CO_NMT_t *NMT);
#if ((CO_CONFIG_NMT) & CO_CONFIG_NMT_MASTER) || defined CO_DOXYGEN
/**
* Send NMT master command.
*
@ -269,6 +302,7 @@ CO_NMT_internalState_t CO_NMT_getInternalState(
CO_ReturnError_t CO_NMT_sendCommand(CO_NMT_t *NMT,
CO_NMT_command_t command,
uint8_t nodeID);
#endif
/** @} */

View file

@ -160,10 +160,12 @@ static void CO_SDOclient_receive(void *object, void *msg){
}
}
#if (CO_CONFIG_SDO_CLI) & CO_CONFIG_FLAG_CALLBACK_PRE
/* Optional signal to RTOS, which can resume task, which handles SDO client. */
if(CO_FLAG_READ(SDO_C->CANrxNew) && SDO_C->pFunctSignal != NULL) {
SDO_C->pFunctSignal(SDO_C->functSignalObject);
}
#endif
}
}
@ -194,8 +196,10 @@ CO_ReturnError_t CO_SDOclient_init(
SDO_C->SDO = SDO;
SDO_C->SDOClientPar = SDOClientPar;
#if (CO_CONFIG_SDO_CLI) & CO_CONFIG_FLAG_CALLBACK_PRE
SDO_C->pFunctSignal = NULL;
SDO_C->functSignalObject = NULL;
#endif
SDO_C->CANdevRx = CANdevRx;
SDO_C->CANdevRxIdx = CANdevRxIdx;
@ -212,6 +216,7 @@ CO_ReturnError_t CO_SDOclient_init(
}
#if (CO_CONFIG_SDO_CLI) & CO_CONFIG_FLAG_CALLBACK_PRE
/******************************************************************************/
void CO_SDOclient_initCallbackPre(
CO_SDOclient_t *SDOclient,
@ -223,6 +228,7 @@ void CO_SDOclient_initCallbackPre(
SDOclient->pFunctSignal = pFunctSignal;
}
}
#endif
/******************************************************************************/

View file

@ -136,10 +136,12 @@ typedef struct{
volatile void *CANrxNew;
/** 8 data bytes of the received message */
uint8_t CANrxData[8];
#if ((CO_CONFIG_SDO_CLI) & CO_CONFIG_FLAG_CALLBACK_PRE) || defined CO_DOXYGEN
/** From CO_SDOclient_initCallbackPre() or NULL */
void (*pFunctSignal)(void *object);
/** From CO_SDOclient_initCallbackPre() or NULL */
void *functSignalObject;
#endif
/** From CO_SDOclient_init() */
CO_CANmodule_t *CANdevTx;
/** CAN transmit buffer inside CANdevTx for CAN tx message */
@ -198,6 +200,7 @@ CO_ReturnError_t CO_SDOclient_init(
uint16_t CANdevTxIdx);
#if ((CO_CONFIG_SDO_CLI) & CO_CONFIG_FLAG_CALLBACK_PRE) || defined CO_DOXYGEN
/**
* Initialize SDOclient callback function.
*
@ -216,6 +219,7 @@ void CO_SDOclient_initCallbackPre(
CO_SDOclient_t *SDOclient,
void *object,
void (*pFunctSignal)(void *object));
#endif
/**

View file

@ -42,6 +42,9 @@
#if CO_CONFIG_SDO_BUFFER_SIZE < 7
#error CO_CONFIG_SDO_BUFFER_SIZE must be greater than 7
#endif
#if ((CO_CONFIG_SDO) & CO_CONFIG_SDO_BLOCK) && !((CO_CONFIG_SDO) & CO_CONFIG_SDO_SEGMENTED)
#error CO_CONFIG_SDO_BLOCK is enabled, CO_CONFIG_SDO_SEGMENTED must be enabled also.
#endif
/* Helper functions. **********************************************************/
@ -238,10 +241,12 @@ static void CO_SDO_receive(void *object, void *msg){
}
}
#if (CO_CONFIG_SDO) & CO_CONFIG_FLAG_CALLBACK_PRE
/* Optional signal to RTOS, which can resume task, which handles SDO server. */
if(CO_FLAG_READ(SDO->CANrxNew) && SDO->pFunctSignal != NULL) {
SDO->pFunctSignal(SDO->functSignalObject);
if(CO_FLAG_READ(SDO->CANrxNew) && SDO->pFunctSignalPre != NULL) {
SDO->pFunctSignalPre(SDO->functSignalObjectPre);
}
#endif
}
}
@ -323,9 +328,10 @@ CO_ReturnError_t CO_SDO_init(
SDO->SDOtimeoutTime_us = (uint32_t)SDOtimeoutTime_ms * 1000;
SDO->state = CO_SDO_ST_IDLE;
CO_FLAG_CLEAR(SDO->CANrxNew);
SDO->pFunctSignal = NULL;
SDO->functSignalObject = NULL;
#if (CO_CONFIG_SDO) & CO_CONFIG_FLAG_CALLBACK_PRE
SDO->pFunctSignalPre = NULL;
SDO->functSignalObjectPre = NULL;
#endif
/* Configure Object dictionary entry at index 0x1200 */
if(ObjDictIndex_SDOServerParameter == OD_H1200_SDO_SERVER_PARAM){
@ -365,17 +371,19 @@ CO_ReturnError_t CO_SDO_init(
}
#if (CO_CONFIG_SDO) & CO_CONFIG_FLAG_CALLBACK_PRE
/******************************************************************************/
void CO_SDO_initCallbackPre(
CO_SDO_t *SDO,
void *object,
void (*pFunctSignal)(void *object))
void (*pFunctSignalPre)(void *object))
{
if(SDO != NULL){
SDO->functSignalObject = object;
SDO->pFunctSignal = pFunctSignal;
SDO->functSignalObjectPre = object;
SDO->pFunctSignalPre = pFunctSignalPre;
}
}
#endif
/******************************************************************************/

View file

@ -613,10 +613,12 @@ typedef struct{
bool_t endOfTransfer;
/** Variable indicates, if new SDO message received from CAN bus */
volatile void *CANrxNew;
#if ((CO_CONFIG_SDO) & CO_CONFIG_FLAG_CALLBACK_PRE) || defined CO_DOXYGEN
/** From CO_SDO_initCallbackPre() or NULL */
void (*pFunctSignal)(void *object);
void (*pFunctSignalPre)(void *object);
/** From CO_SDO_initCallbackPre() or NULL */
void *functSignalObject;
void *functSignalObjectPre;
#endif
/** From CO_SDO_init() */
CO_CANmodule_t *CANdevTx;
/** CAN transmit buffer inside CANdev for CAN tx message */
@ -766,6 +768,7 @@ CO_ReturnError_t CO_SDO_init(
uint16_t CANdevTxIdx);
#if ((CO_CONFIG_SDO) & CO_CONFIG_FLAG_CALLBACK_PRE) || defined CO_DOXYGEN
/**
* Initialize SDOrx callback function.
*
@ -775,13 +778,14 @@ CO_ReturnError_t CO_SDO_init(
* when new call without delay is necessary (SDO block transfer is in progress).
*
* @param SDO This object.
* @param object Pointer to object, which will be passed to pFunctSignal(). Can be NULL
* @param pFunctSignal Pointer to the callback function. Not called if NULL.
* @param object Pointer to object, which will be passed to pFunctSignalPre(). Can be NULL
* @param pFunctSignalPre Pointer to the callback function. Not called if NULL.
*/
void CO_SDO_initCallbackPre(
CO_SDO_t *SDO,
void *object,
void (*pFunctSignal)(void *object));
void (*pFunctSignalPre)(void *object));
#endif
/**

View file

@ -70,44 +70,48 @@ extern "C" {
*
* This flag is common to multiple configuration macros.
*/
#define CO_CONFIG_FLAG_CANRX_CALLBACK 0x0100
#define CO_CONFIG_FLAG_CALLBACK_PRE 0x0100
/**
* Configuration of NMT
* Configuration of NMT_Heartbeat object
*
* Possible flags, can be ORed:
* - #CO_CONFIG_FLAG_CALLBACK_PRE - Enable custom callback after preprocessing
* received NMT CAN message.
* Callback is configured by CO_NMT_initCallbackPre().
* - CO_CONFIG_NMT_CALLBACK_CHANGE - Enable custom callback after NMT
* state changes. Callback is configured by
* CO_NMT_initCallbackChanged().
* - CO_CONFIG_NMT_MASTER - Enable simple NMT master
* - CO_CONFIG_NMT_LEDS - Calculate CANopen blinking variables, which can
* be used for LEDs.
* be used for LEDs.
*/
#ifdef CO_DOXYGEN
#define CO_CONFIG_NMT CO_CONFIG_NMT_LEDS
#define CO_CONFIG_NMT CO_CONFIG_FLAG_CALLBACK_PRE | CO_CONFIG_NMT_CALLBACK_CHANGE | CO_CONFIG_NMT_MASTER | CO_CONFIG_NMT_LEDS
#endif
#define CO_CONFIG_NMT_LEDS 0x01
#define CO_CONFIG_NMT_CALLBACK_CHANGE 0x01
#define CO_CONFIG_NMT_MASTER 0x02
#define CO_CONFIG_NMT_LEDS 0x04
/**
* Configuration of Heartbeat Consumer
* Configuration of SDO server object
*
* Possible flags, can be ORed:
* - #CO_CONFIG_FLAG_CANRX_CALLBACK - Enable custom callback after CAN receive.
* Callback is configured by CO_HBconsumer_initCallbackPre().
* - CO_CONFIG_HB_CONS_CHANGE_CALLBACK - Enable custom callback after NMT
* state of the monitored node changes. Callback is configured by
* CO_HBconsumer_initCallbackNmtChanged().
* - CO_CONFIG_HB_CONS_MULTI_CALLBACK - Enable multiple custom callbacks, which
* can be configured for each monitored node. Callback are configured by
* CO_HBconsumer_initCallbackHeartbeatStarted(),
* CO_HBconsumer_initCallbackTimeout() and
* CO_HBconsumer_initCallbackRemoteReset() functions.
* - CO_CONFIG_HB_CONS_QUERY_FUNCT - Enable functions for query HB state or
* NMT state of the specific monitored node.
* - #CO_CONFIG_FLAG_CALLBACK_PRE - Enable custom callback after preprocessing
* received SDO CAN message.
* Callback is configured by CO_SDO_initCallbackPre().
* - CO_CONFIG_SDO_SEGMENTED - Enable SDO server segmented transfer.
* - CO_CONFIG_SDO_BLOCK - Enable SDO server block transfer. If set, then
* CO_CONFIG_SDO_SEGMENTED must also be set.
*/
#ifdef CO_DOXYGEN
#define CO_CONFIG_HB_CONS CO_CONFIG_FLAG_CANRX_CALLBACK | CO_CONFIG_HB_CONS_CHANGE_CALLBACK | CO_CONFIG_HB_CONS_MULTI_CALLBACK | CO_CONFIG_HB_CONS_QUERY_FUNCT
#define CO_CONFIG_SDO CO_CONFIG_FLAG_CALLBACK_PRE | CO_CONFIG_SDO_SEGMENTED | CO_CONFIG_SDO_BLOCK
#endif
#define CO_CONFIG_HB_CONS_CHANGE_CALLBACK 0x01
#define CO_CONFIG_HB_CONS_MULTI_CALLBACK 0x02
#define CO_CONFIG_HB_CONS_QUERY_FUNCT 0x04
/* TODO with new OD */
#define CO_CONFIG_SDO_SEGMENTED 0x01
#define CO_CONFIG_SDO_BLOCK 0x02
/**
@ -124,6 +128,74 @@ extern "C" {
#define CO_CONFIG_SDO_BUFFER_SIZE 32
#endif
/**
* Configuration of Emergency object
*
* Possible flags, can be ORed:
* - #CO_CONFIG_FLAG_CALLBACK_PRE - Enable custom callback after preprocessing
* emergency condition by CO_errorReport() or CO_errorReset() call.
* Callback is configured by CO_EM_initCallbackPre().
* - CO_CONFIG_EM_CONSUMER - Enable emergency consumer.
*/
#ifdef CO_DOXYGEN
#define CO_CONFIG_EM CO_CONFIG_FLAG_CALLBACK_PRE | CO_CONFIG_EM_CONSUMER
#endif
#define CO_CONFIG_EM_CONSUMER 0x01
/**
* Configuration of Heartbeat Consumer
*
* Possible flags, can be ORed:
* - #CO_CONFIG_FLAG_CALLBACK_PRE - Enable custom callback after preprocessing
* received heartbeat CAN message.
* Callback is configured by CO_HBconsumer_initCallbackPre().
* - CO_CONFIG_HB_CONS_CALLBACK_CHANGE - Enable custom callback after NMT
* state of the monitored node changes. Callback is configured by
* CO_HBconsumer_initCallbackNmtChanged().
* - CO_CONFIG_HB_CONS_CALLBACK_MULTI - Enable multiple custom callbacks, which
* can be configured for each monitored node. Callback are configured by
* CO_HBconsumer_initCallbackHeartbeatStarted(),
* CO_HBconsumer_initCallbackTimeout() and
* CO_HBconsumer_initCallbackRemoteReset() functions.
* - CO_CONFIG_HB_CONS_QUERY_FUNCT - Enable functions for query HB state or
* NMT state of the specific monitored node.
*/
#ifdef CO_DOXYGEN
#define CO_CONFIG_HB_CONS CO_CONFIG_FLAG_CALLBACK_PRE | CO_CONFIG_HB_CONS_CALLBACK_CHANGE | CO_CONFIG_HB_CONS_CALLBACK_MULTI | CO_CONFIG_HB_CONS_QUERY_FUNCT
#endif
#define CO_CONFIG_HB_CONS_CALLBACK_CHANGE 0x01
#define CO_CONFIG_HB_CONS_CALLBACK_MULTI 0x02
#define CO_CONFIG_HB_CONS_QUERY_FUNCT 0x04
/**
* Configuration of SDO client object
*
* Possible flags, can be ORed:
* - #CO_CONFIG_FLAG_CALLBACK_PRE - Enable custom callback after preprocessing
* received SDO CAN message.
* Callback is configured by CO_SDOclient_initCallbackPre().
*/
#ifdef CO_DOXYGEN
#define CO_CONFIG_SDO_CLI CO_CONFIG_FLAG_CALLBACK_PRE
#endif
/**
* Configuration of LSS master object
*
* Possible flags, can be ORed:
* - #CO_CONFIG_FLAG_CALLBACK_PRE - Enable custom callback after preprocessing
* received SDO CAN message.
* Callback is configured by CO_LSSmaster_initCallbackPre().
*/
#ifdef CO_DOXYGEN
#define CO_CONFIG_LSS_MST CO_CONFIG_FLAG_CALLBACK_PRE
#endif
/**
* Configuration of Standard CiA 309 usage.
*

View file

@ -35,20 +35,36 @@ extern "C" {
#endif
/* Default stack configuration for most common configuration.
* For more information see file CO_config.h. */
/* Default stack configuration for most common configuration, may be overridden
* by CO_driver_target.h. For more information see file CO_config.h. */
#ifndef CO_CONFIG_NMT
#define CO_CONFIG_NMT 0
#endif
#ifndef CO_CONFIG_SDO
#define CO_CONFIG_SDO CO_CONFIG_SDO_SEGMENTED
#endif
#ifndef CO_CONFIG_SDO_BUFFER_SIZE
#define CO_CONFIG_SDO_BUFFER_SIZE 32
#endif
#ifndef CO_CONFIG_EM
#define CO_CONFIG_EM 0
#endif
#ifndef CO_CONFIG_HB_CONS
#define CO_CONFIG_HB_CONS 0
#endif
#ifndef CO_CONFIG_SDO_CLI
#define CO_CONFIG_SDO_CLI 0
#endif
#ifndef CO_CONFIG_LSS_MST
#define CO_CONFIG_LSS_MST 0
#endif
#ifndef CO_CONFIG_309
#define CO_CONFIG_309 0
#endif

View file

@ -96,10 +96,12 @@ static void CO_LSSmaster_receive(void *object, void *msg)
CO_FLAG_SET(LSSmaster->CANrxNew);
#if (CO_CONFIG_LSS_MST) & CO_CONFIG_FLAG_CALLBACK_PRE
/* Optional signal to RTOS, which can resume task, which handles further processing. */
if(LSSmaster->pFunctSignal != NULL) {
LSSmaster->pFunctSignal(LSSmaster->functSignalObject);
}
#endif
}
}
@ -150,8 +152,10 @@ CO_ReturnError_t CO_LSSmaster_init(
LSSmaster->timeoutTimer = 0;
CO_FLAG_CLEAR(LSSmaster->CANrxNew);
CO_memset(LSSmaster->CANrxData, 0, sizeof(LSSmaster->CANrxData));
#if (CO_CONFIG_LSS_MST) & CO_CONFIG_FLAG_CALLBACK_PRE
LSSmaster->pFunctSignal = NULL;
LSSmaster->functSignalObject = NULL;
#endif
/* configure LSS CAN Slave response message reception */
ret = CO_CANrxBufferInit(
@ -192,6 +196,7 @@ void CO_LSSmaster_changeTimeout(
}
#if (CO_CONFIG_LSS_MST) & CO_CONFIG_FLAG_CALLBACK_PRE
/******************************************************************************/
void CO_LSSmaster_initCallbackPre(
CO_LSSmaster_t *LSSmaster,
@ -203,6 +208,8 @@ void CO_LSSmaster_initCallbackPre(
LSSmaster->pFunctSignal = pFunctSignal;
}
}
#endif
/*
* Helper function - initiate switch state

View file

@ -118,11 +118,11 @@ typedef struct{
volatile void *CANrxNew; /**< Indication if new LSS message is received from CAN bus. It needs to be cleared when received message is completely processed. */
uint8_t CANrxData[8]; /**< 8 data bytes of the received message */
#if ((CO_CONFIG_LSS_MST) & CO_CONFIG_FLAG_CALLBACK_PRE) || defined CO_DOXYGEN
void (*pFunctSignal)(void *object); /**< From CO_LSSmaster_initCallbackPre() or NULL */
void *functSignalObject;/**< Pointer to object */
CO_CANmodule_t *CANdevTx; /**< From #CO_LSSslave_init() */
#endif
CO_CANmodule_t *CANdevTx; /**< From CO_LSSmaster_init() */
CO_CANtx_t *TXbuff; /**< CAN transmit buffer */
}CO_LSSmaster_t;
@ -184,6 +184,7 @@ void CO_LSSmaster_changeTimeout(
uint16_t timeout_ms);
#if ((CO_CONFIG_LSS_MST) & CO_CONFIG_FLAG_CALLBACK_PRE) || defined CO_DOXYGEN
/**
* Initialize LSSmasterRx callback function.
*
@ -200,6 +201,7 @@ void CO_LSSmaster_initCallbackPre(
CO_LSSmaster_t *LSSmaster,
void *object,
void (*pFunctSignal)(void *object));
#endif
/**

View file

@ -68,7 +68,7 @@ static uint32_t CO_traceBufferSize[CO_NO_TRACE];
#define CO_RXCAN_NMT 0
#define CO_RXCAN_SYNC (CO_RXCAN_NMT + CO_NO_NMT)
#define CO_RXCAN_EMERG (CO_RXCAN_SYNC + CO_NO_SYNC)
#define CO_RXCAN_TIME (CO_RXCAN_EMERG + CO_NO_EMERGENCY)
#define CO_RXCAN_TIME (CO_RXCAN_EMERG + CO_NO_EM_CONS)
#define CO_RXCAN_RPDO (CO_RXCAN_TIME + CO_NO_TIME)
#define CO_RXCAN_SDO_SRV (CO_RXCAN_RPDO + CO_NO_RPDO)
#define CO_RXCAN_SDO_CLI (CO_RXCAN_SDO_SRV + CO_NO_SDO_SERVER)
@ -76,7 +76,7 @@ static uint32_t CO_traceBufferSize[CO_NO_TRACE];
#define CO_RXCAN_LSS (CO_RXCAN_CONS_HB + CO_NO_HB_CONS)
#define CO_RXCAN_NO_MSGS (CO_NO_NMT + \
CO_NO_SYNC + \
CO_NO_EMERGENCY + \
CO_NO_EM_CONS + \
CO_NO_TIME + \
CO_NO_RPDO + \
CO_NO_SDO_SERVER + \
@ -87,7 +87,7 @@ static uint32_t CO_traceBufferSize[CO_NO_TRACE];
/* Indexes of CO_CANtx_t objects in CO_CANmodule_t and total number of them. **/
#define CO_TXCAN_NMT 0
#define CO_TXCAN_SYNC (CO_TXCAN_NMT + CO_NO_NMT)
#define CO_TXCAN_SYNC (CO_TXCAN_NMT + CO_NO_NMT_MST)
#define CO_TXCAN_EMERG (CO_TXCAN_SYNC + CO_NO_SYNC)
#define CO_TXCAN_TIME (CO_TXCAN_EMERG + CO_NO_EMERGENCY)
#define CO_TXCAN_TPDO (CO_TXCAN_TIME + CO_NO_TIME)
@ -95,7 +95,7 @@ static uint32_t CO_traceBufferSize[CO_NO_TRACE];
#define CO_TXCAN_SDO_CLI (CO_TXCAN_SDO_SRV + CO_NO_SDO_SERVER)
#define CO_TXCAN_HB (CO_TXCAN_SDO_CLI + CO_NO_SDO_CLIENT)
#define CO_TXCAN_LSS (CO_TXCAN_HB + CO_NO_HB_PROD)
#define CO_TXCAN_NO_MSGS (CO_NO_NMT + \
#define CO_TXCAN_NO_MSGS (CO_NO_NMT_MST + \
CO_NO_SYNC + \
CO_NO_EMERGENCY + \
CO_NO_TIME + \
@ -656,7 +656,6 @@ CO_NMT_reset_cmd_t CO_process(CO_t *co,
OD_inhibitTimeEMCY,
timerNext_us);
/* NMT_Heartbeat */
reset = CO_NMT_process(co->NMT,
timeDifference_us,
@ -666,7 +665,6 @@ CO_NMT_reset_cmd_t CO_process(CO_t *co,
OD_errorBehavior,
timerNext_us);
#if CO_NO_TIME == 1
/* TIME */
CO_TIME_process(co->TIME,

View file

@ -137,13 +137,18 @@ extern "C" {
* @{
*/
/* Definitions valid only for documentation. */
/** Number of NMT objects, fixed to 1 (slave(CANrx) + master(CANtx)) */
/** Number of NMT objects, fixed to 1 slave(CANrx) */
#define CO_NO_NMT (1)
/** Number of NMT master objects, 0 or 1 master(CANtx). It depends on
* @ref CO_CONFIG_EM setting. */
#define CO_NO_NMT_MST (0...1)
/** Number of SYNC objects, 0 or 1 (consumer(CANrx) + producer(CANtx)) */
#define CO_NO_SYNC (0...1)
/** Number of Emergency objects, fixed to 1 (consumer(CANrx) +
* producer(CANtx)) */
/** Number of Emergency producer objects, fixed to 1 producer(CANtx) */
#define CO_NO_EMERGENCY (1)
/** Number of Emergency consumer objects, 0 or 1 consumer(CANrx). It depends on
* @ref CO_CONFIG_EM setting. */
#define CO_NO_EM_CONS (0...1)
/** Number of Time-stamp objects, 0 or 1 (consumer(CANrx) + producer(CANtx)) */
#define CO_NO_TIME (0...1)
/** Number of RPDO objects, 1 to 512 consumers (CANrx) */
@ -165,11 +170,31 @@ extern "C" {
/** Number of Trace objects, 0 to many */
#define CO_NO_TRACE (0...)
/** @} */
#else /* CO_DOXYGEN */
/* Valid Definitions for program. */
#define CO_NO_NMT 1 /* NMT master/slave count (fixed) */
#define CO_NO_HB_PROD 1 /* Heartbeat producer count (fixed) */
/* NMT slave count (fixed) */
#define CO_NO_NMT 1
/* NMT master count depends on stack configuration */
#if (CO_CONFIG_NMT) & CO_CONFIG_NMT_MASTER
#define CO_NO_NMT_MST 1
#else
#define CO_NO_NMT_MST 0
#endif
/* Emergency consumer depends on stack configuration */
#if (CO_CONFIG_EM) & CO_CONFIG_EM_CONSUMER
#define CO_NO_EM_CONS 1
#else
#define CO_NO_EM_CONS 0
#endif
/* Heartbeat producer count (fixed) */
#define CO_NO_HB_PROD 1
/* Heartbeat consumer count depends on Object Dictionary configuration */
#ifdef ODL_consumerHeartbeatTime_arrayLength
#define CO_NO_HB_CONS ODL_consumerHeartbeatTime_arrayLength
#else
@ -297,7 +322,7 @@ CO_ReturnError_t CO_CANopenInit(uint8_t nodeId);
* used in combination with callbacks configured with
* CO_***_initCallbackPre() functions. Those callbacks should also
* trigger calling of CO_process() function.
* See also @ref CO_CONFIG_FLAG_CANRX_CALLBACK configuration macro.
* See also @ref CO_CONFIG_FLAG_CALLBACK_PRE configuration macro.
*
* This is experimental feature and can be used for energy saving in case
* of low traffic on CAN bus. Parameter is ignored if NULL.

View file

@ -2052,11 +2052,11 @@ INCLUDE_FILE_PATTERNS =
# recursively expanded use the := operator instead of the = operator.
# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
PREDEFINED = CO_DOXYGEN \
PREDEFINED = CO_DOXYGEN=1 \
CO_NO_SYNC=1 \
CO_NO_SDO_CLIENT=1 \
CO_NO_NMT_MASTER=1 \
CO_NO_LSS_SERVER \
CO_NO_LSS_SERVER=1 \
CO_NO_LSS_CLIENT=1 \
CO_NO_TRACE=1

View file

@ -34,7 +34,7 @@
#include <stdbool.h>
#include <stdint.h>
#if __has_include("CO_driver_custom.h")
#ifdef CO_DRIVER_CUSTOM
#include "CO_driver_custom.h"
#endif
@ -42,9 +42,34 @@
extern "C" {
#endif
/* Stack configuration override */
/* Stack configuration override from CO_driver.h. Compile full stack.
* For more information see file CO_config.h. */
#ifndef CO_CONFIG_NMT
#define CO_CONFIG_NMT CO_CONFIG_NMT_LEDS
#define CO_CONFIG_NMT CO_CONFIG_FLAG_CALLBACK_PRE | CO_CONFIG_NMT_CALLBACK_CHANGE | CO_CONFIG_NMT_MASTER | CO_CONFIG_NMT_LEDS
#endif
#ifndef CO_CONFIG_SDO
#define CO_CONFIG_SDO CO_CONFIG_FLAG_CALLBACK_PRE | CO_CONFIG_SDO_SEGMENTED | CO_CONFIG_SDO_BLOCK
#endif
#ifndef CO_CONFIG_SDO_BUFFER_SIZE
#define CO_CONFIG_SDO_BUFFER_SIZE 889
#endif
#ifndef CO_CONFIG_EM
#define CO_CONFIG_EM CO_CONFIG_FLAG_CALLBACK_PRE | CO_CONFIG_EM_CONSUMER
#endif
#ifndef CO_CONFIG_HB_CONS
#define CO_CONFIG_HB_CONS CO_CONFIG_FLAG_CALLBACK_PRE | CO_CONFIG_HB_CONS_CALLBACK_CHANGE | CO_CONFIG_HB_CONS_CALLBACK_MULTI | CO_CONFIG_HB_CONS_QUERY_FUNCT
#endif
#ifndef CO_CONFIG_SDO_CLI
#define CO_CONFIG_SDO_CLI CO_CONFIG_FLAG_CALLBACK_PRE
#endif
#ifndef CO_CONFIG_LSS_MST
#define CO_CONFIG_LSS_MST CO_CONFIG_FLAG_CALLBACK_PRE
#endif

View file

@ -56,6 +56,7 @@ void threadMain_init(void (*callback)(void*), void *object)
{
threadMain.start = CO_LinuxThreads_clock_gettime_us();
CO_NMT_initCallbackPre(CO->NMT, object, callback);
CO_SDO_initCallbackPre(CO->SDO[0], object, callback);
CO_EM_initCallbackPre(CO->em, object, callback);
CO_HBconsumer_initCallbackPre(CO->HBcons, object, callback);
@ -63,6 +64,7 @@ void threadMain_init(void (*callback)(void*), void *object)
void threadMain_close(void)
{
CO_NMT_initCallbackPre(CO->NMT, NULL, NULL);
CO_SDO_initCallbackPre(CO->SDO[0], NULL, NULL);
CO_EM_initCallbackPre(CO->em, NULL, NULL);
CO_HBconsumer_initCallbackPre(CO->HBcons, NULL, NULL);
@ -110,18 +112,22 @@ static void threadMainWait_callback(void *object)
}
}
void threadMainWait_init(uint32_t interval_us)
void threadMainWait_init(void)
{
int32_t ret;
struct epoll_event ev;
/* Configure callback functions */
CO_NMT_initCallbackPre(CO->NMT, NULL, threadMainWait_callback);
CO_SDO_initCallbackPre(CO->SDO[0], NULL, threadMainWait_callback);
CO_EM_initCallbackPre(CO->em, NULL, threadMainWait_callback);
CO_HBconsumer_initCallbackPre(CO->HBcons, NULL, threadMainWait_callback);
/* Initial value for time calculation */
threadMainWait.start = CO_LinuxThreads_clock_gettime_us();
}
void threadMainWait_initOnce(uint32_t interval_us)
{
int32_t ret;
struct epoll_event ev;
/* Configure epoll for mainline */
threadMainWait.epoll_fd = epoll_create(1);
@ -171,6 +177,7 @@ void threadMainWait_init(uint32_t interval_us)
void threadMainWait_close(void)
{
CO_NMT_initCallbackPre(CO->NMT, NULL, NULL);
CO_SDO_initCallbackPre(CO->SDO[0], NULL, NULL);
CO_EM_initCallbackPre(CO->em, NULL, NULL);
CO_HBconsumer_initCallbackPre(CO->HBcons, NULL, NULL);

View file

@ -93,9 +93,20 @@ void threadMain_process(CO_NMT_reset_cmd_t *reset);
/**
* Initialize mainline thread - blocking.
*
* Function must be called always in communication reset section, after
* CO_CANopenInit().
*/
void threadMainWait_init(void);
/**
* Initialize once mainline thread - blocking.
*
* Function must be called only once, before node starts operating.
*
* @param interval_us interval of the threadMainWait_process()
*/
void threadMainWait_init(uint32_t interval_us);
void threadMainWait_initOnce(uint32_t interval_us);
/**

View file

@ -52,13 +52,34 @@ extern "C" {
/* Stack configuration override from CO_driver.h.
* For more information see file CO_config.h. */
#ifndef CO_CONFIG_HB_CONS
#define CO_CONFIG_HB_CONS CO_CONFIG_FLAG_CANRX_CALLBACK | CO_CONFIG_HB_CONS_CHANGE_CALLBACK
#ifndef CO_CONFIG_NMT
#define CO_CONFIG_NMT CO_CONFIG_FLAG_CALLBACK_PRE | CO_CONFIG_NMT_CALLBACK_CHANGE | CO_CONFIG_NMT_MASTER | CO_CONFIG_NMT_LEDS
#endif
#ifndef CO_CONFIG_SDO
#define CO_CONFIG_SDO CO_CONFIG_FLAG_CALLBACK_PRE | CO_CONFIG_SDO_SEGMENTED | CO_CONFIG_SDO_BLOCK
#endif
#ifndef CO_CONFIG_SDO_BUFFER_SIZE
#define CO_CONFIG_SDO_BUFFER_SIZE 889
#endif
#ifndef CO_CONFIG_EM
#define CO_CONFIG_EM CO_CONFIG_FLAG_CALLBACK_PRE | CO_CONFIG_EM_CONSUMER
#endif
#ifndef CO_CONFIG_HB_CONS
#define CO_CONFIG_HB_CONS CO_CONFIG_FLAG_CALLBACK_PRE | CO_CONFIG_HB_CONS_CALLBACK_CHANGE
#endif
#ifndef CO_CONFIG_SDO_CLI
#define CO_CONFIG_SDO_CLI CO_CONFIG_FLAG_CALLBACK_PRE
#endif
#ifndef CO_CONFIG_LSS_MST
#define CO_CONFIG_LSS_MST CO_CONFIG_FLAG_CALLBACK_PRE
#endif
/**
* @defgroup CO_socketCAN_driver_target CO_driver_target.h

View file

@ -123,7 +123,7 @@ static char *NmtState2Str(CO_NMT_internalState_t state)
}
/* callback for NMT change messages */
static void NmtChangeCallback(CO_NMT_internalState_t state)
static void NmtChangedCallback(CO_NMT_internalState_t state)
{
log_printf(LOG_NOTICE, DBG_NMT_CHANGE, NmtState2Str(state), state);
}
@ -346,9 +346,10 @@ int main (int argc, char *argv[]) {
exit(EXIT_FAILURE);
}
/* initialize callbacks */
/* initialize part of threadMain and callbacks */
threadMainWait_init();
CO_EM_initCallbackRx(CO->em, EmergencyRxCallback);
CO_NMT_initCallbackChange(CO->NMT, NmtChangeCallback);
CO_NMT_initCallbackChanged(CO->NMT, NmtChangedCallback);
CO_HBconsumer_initCallbackNmtChanged(CO->HBcons, NULL,
HeartbeatNmtChangedCallback);
@ -375,7 +376,7 @@ int main (int argc, char *argv[]) {
/* Init threadMainWait structure and file descriptors */
threadMainWait_init(MAIN_THREAD_INTERVAL_US);
threadMainWait_initOnce(MAIN_THREAD_INTERVAL_US);
/* Init threadRT structure and file descriptors */