Merge branch 'master' of https://github.com/wilkinsw/CANopenNode
This commit is contained in:
commit
fa5f81e0a9
3 changed files with 83 additions and 24 deletions
|
|
@ -110,13 +110,14 @@
|
|||
|
||||
#define CO_RXCAN_NMT 0 /* index for NMT message */
|
||||
#define CO_RXCAN_SYNC 1 /* index for SYNC message */
|
||||
#define CO_RXCAN_RPDO (CO_RXCAN_SYNC+CO_NO_SYNC) /* start index for RPDO messages */
|
||||
#define CO_RXCAN_EMERG (CO_RXCAN_SYNC+CO_NO_SYNC) /* index for Emergency message */
|
||||
#define CO_RXCAN_RPDO (CO_RXCAN_EMERG+CO_NO_EMERGENCY) /* start index for RPDO messages */
|
||||
#define CO_RXCAN_SDO_SRV (CO_RXCAN_RPDO+CO_NO_RPDO) /* start index for SDO server message (request) */
|
||||
#define CO_RXCAN_SDO_CLI (CO_RXCAN_SDO_SRV+CO_NO_SDO_SERVER) /* start index for SDO client message (response) */
|
||||
#define CO_RXCAN_CONS_HB (CO_RXCAN_SDO_CLI+CO_NO_SDO_CLIENT) /* start index for Heartbeat Consumer messages */
|
||||
#define CO_RXCAN_LSS (CO_RXCAN_CONS_HB+CO_NO_HB_CONS) /* index for LSS rx message */
|
||||
/* total number of received CAN messages */
|
||||
#define CO_RXCAN_NO_MSGS (1+CO_NO_SYNC+CO_NO_RPDO+CO_NO_SDO_SERVER+CO_NO_SDO_CLIENT+CO_NO_HB_CONS+CO_NO_LSS_SERVER+CO_NO_LSS_CLIENT)
|
||||
#define CO_RXCAN_NO_MSGS (1+CO_NO_SYNC+CO_NO_EMERGENCY+CO_NO_RPDO+CO_NO_SDO_SERVER+CO_NO_SDO_CLIENT+CO_NO_HB_CONS)
|
||||
|
||||
#define CO_TXCAN_NMT 0 /* index for NMT master message */
|
||||
#define CO_TXCAN_SYNC CO_TXCAN_NMT+CO_NO_NMT_MASTER /* index for SYNC message */
|
||||
|
|
@ -495,6 +496,8 @@ CO_ReturnError_t CO_CANopenInit(
|
|||
&OD_preDefinedErrorField[0],
|
||||
ODL_preDefinedErrorField_arrayLength,
|
||||
CO->CANmodule[0],
|
||||
CO_RXCAN_EMERG,
|
||||
CO->CANmodule[0],
|
||||
CO_TXCAN_EMERG,
|
||||
CO_CAN_ID_EMERGENCY + nodeId);
|
||||
|
||||
|
|
|
|||
|
|
@ -47,8 +47,34 @@
|
|||
#include "CO_driver.h"
|
||||
#include "CO_SDO.h"
|
||||
#include "CO_Emergency.h"
|
||||
#include "CANopen.h"
|
||||
|
||||
|
||||
/*
|
||||
* Read received message from CAN module.
|
||||
*
|
||||
* Function will be called (by CAN receive interrupt) every time, when CAN
|
||||
* message with correct identifier will be received. For more information and
|
||||
* description of parameters see file CO_driver.h.
|
||||
*/
|
||||
static void CO_EM_receive(void *object, const CO_CANrxMsg_t *msg){
|
||||
CO_EM_t *em;
|
||||
uint16_t errorCode;
|
||||
uint32_t infoCode;
|
||||
|
||||
em = (CO_EM_t*)object;
|
||||
|
||||
if(em->pFunctSignal != NULL){
|
||||
CO_memcpySwap2(&errorCode, &msg->data[0]);
|
||||
CO_memcpySwap4(&infoCode, &msg->data[4]);
|
||||
em->pFunctSignal(msg->ident & 0x07FFU,
|
||||
errorCode,
|
||||
msg->data[2],
|
||||
msg->data[3],
|
||||
infoCode);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Function for accessing _Pre-Defined Error Field_ (index 0x1003) from SDO server.
|
||||
*
|
||||
|
|
@ -129,15 +155,17 @@ CO_ReturnError_t CO_EM_init(
|
|||
uint8_t *errorRegister,
|
||||
uint32_t *preDefErr,
|
||||
uint8_t preDefErrSize,
|
||||
CO_CANmodule_t *CANdev,
|
||||
CO_CANmodule_t *CANdevRx,
|
||||
uint16_t CANdevRxIdx,
|
||||
CO_CANmodule_t *CANdevTx,
|
||||
uint16_t CANdevTxIdx,
|
||||
uint16_t CANidTxEM)
|
||||
{
|
||||
uint8_t i;
|
||||
|
||||
/* verify arguments */
|
||||
if(em==NULL || emPr==NULL || SDO==NULL || errorStatusBits==NULL ||
|
||||
errorStatusBitsSize<6U || errorRegister==NULL || preDefErr==NULL || CANdev==NULL){
|
||||
if(em==NULL || emPr==NULL || SDO==NULL || errorStatusBits==NULL || errorStatusBitsSize<6U ||
|
||||
errorRegister==NULL || preDefErr==NULL || CANdevTx==NULL || CANdevRx==NULL){
|
||||
return CO_ERROR_ILLEGAL_ARGUMENT;
|
||||
}
|
||||
|
||||
|
|
@ -166,15 +194,25 @@ 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);
|
||||
|
||||
/* configure SDO server CAN reception */
|
||||
CO_CANrxBufferInit(
|
||||
CANdevRx, /* CAN device */
|
||||
CANdevRxIdx, /* rx buffer index */
|
||||
CO_CAN_ID_EMERGENCY, /* CAN identifier */
|
||||
0x780, /* mask */
|
||||
0, /* rtr */
|
||||
(void*)em, /* object passed to receive function */
|
||||
CO_EM_receive); /* this function will process received message */
|
||||
|
||||
/* configure emergency message CAN transmission */
|
||||
emPr->CANdev = CANdev;
|
||||
emPr->CANdev = CANdevTx;
|
||||
emPr->CANdev->em = (void*)em; /* update pointer inside CAN device. */
|
||||
emPr->CANtxBuff = CO_CANtxBufferInit(
|
||||
CANdev, /* CAN device */
|
||||
CANdevTx, /* CAN device */
|
||||
CANdevTxIdx, /* index of specific buffer inside CAN module */
|
||||
CANidTxEM, /* CAN identifier */
|
||||
0, /* rtr */
|
||||
8U, /* number of data bytes */
|
||||
8U, /* number of data bytes */
|
||||
0); /* synchronous message flag bit */
|
||||
|
||||
return CO_ERROR_NO;
|
||||
|
|
@ -184,7 +222,11 @@ CO_ReturnError_t CO_EM_init(
|
|||
/******************************************************************************/
|
||||
void CO_EM_initCallback(
|
||||
CO_EM_t *em,
|
||||
void (*pFunctSignal)(void))
|
||||
void (*pFunctSignal)(const uint16_t ident,
|
||||
const uint16_t errorCode,
|
||||
const uint8_t errorRegister,
|
||||
const uint8_t errorBit,
|
||||
const uint32_t infoCode))
|
||||
{
|
||||
if(em != NULL){
|
||||
em->pFunctSignal = pFunctSignal;
|
||||
|
|
@ -353,7 +395,7 @@ void CO_errorReport(CO_EM_t *em, const uint8_t errorBit, const uint16_t errorCod
|
|||
|
||||
/* Optional signal to RTOS, which can resume task, which handles CO_EM_process */
|
||||
if(em->pFunctSignal != NULL) {
|
||||
em->pFunctSignal();
|
||||
em->pFunctSignal(0, errorCode, 0, errorBit, infoCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -412,7 +454,7 @@ void CO_errorReset(CO_EM_t *em, const uint8_t errorBit, const uint32_t infoCode)
|
|||
|
||||
/* Optional signal to RTOS, which can resume task, which handles CO_EM_process */
|
||||
if(em->pFunctSignal != NULL) {
|
||||
em->pFunctSignal();
|
||||
em->pFunctSignal(0, 0, 0, errorBit, infoCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -271,16 +271,23 @@ typedef enum{
|
|||
* CO_EMpr_t object.
|
||||
*/
|
||||
typedef struct{
|
||||
uint8_t *errorStatusBits;/**< From CO_EM_init() */
|
||||
uint8_t errorStatusBitsSize;/**< From CO_EM_init() */
|
||||
uint8_t *errorStatusBits; /**< From CO_EM_init() */
|
||||
uint8_t errorStatusBitsSize; /**< From CO_EM_init() */
|
||||
|
||||
/** Internal buffer for storing unsent emergency messages.*/
|
||||
uint8_t buf[CO_EM_INTERNAL_BUFFER_SIZE * 8];
|
||||
uint8_t *bufEnd; /**< End+1 address of the above buffer */
|
||||
uint8_t *bufWritePtr; /**< Write pointer in the above buffer */
|
||||
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() */
|
||||
void (*pFunctSignal)(void);/**< From CO_EM_initCallback() or NULL */
|
||||
uint8_t *bufEnd; /**< End+1 address of the above buffer */
|
||||
uint8_t *bufWritePtr; /**< Write pointer in the above buffer */
|
||||
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() */
|
||||
|
||||
/** From CO_EM_initCallback() or NULL */
|
||||
void (*pFunctSignal)(const uint16_t ident,
|
||||
const uint16_t errorCode,
|
||||
const uint8_t errorRegister,
|
||||
const uint8_t errorBit,
|
||||
const uint32_t infoCode);
|
||||
}CO_EM_t;
|
||||
|
||||
|
||||
|
|
@ -372,7 +379,9 @@ typedef struct{
|
|||
* @param preDefErr Pointer to _Pre defined error field_ array from Object
|
||||
* dictionary, index 0x1003.
|
||||
* @param preDefErrSize Size of the above array.
|
||||
* @param CANdev CAN device for Emergency transmission.
|
||||
* @param CANdevRx CAN device for Emergency reception.
|
||||
* @param CANdevRxIdx Index of receive buffer in the above CAN device.
|
||||
* @param CANdevTx CAN device for Emergency transmission.
|
||||
* @param CANdevTxIdx Index of transmit buffer in the above CAN device.
|
||||
* @param CANidTxEM CAN identifier for Emergency message.
|
||||
*
|
||||
|
|
@ -387,7 +396,9 @@ CO_ReturnError_t CO_EM_init(
|
|||
uint8_t *errorRegister,
|
||||
uint32_t *preDefErr,
|
||||
uint8_t preDefErrSize,
|
||||
CO_CANmodule_t *CANdev,
|
||||
CO_CANmodule_t *CANdevRx,
|
||||
uint16_t CANdevRxIdx,
|
||||
CO_CANmodule_t *CANdevTx,
|
||||
uint16_t CANdevTxIdx,
|
||||
uint16_t CANidTxEM);
|
||||
|
||||
|
|
@ -403,9 +414,12 @@ CO_ReturnError_t CO_EM_init(
|
|||
* @param pFunctSignal Pointer to the callback function. Not called if NULL.
|
||||
*/
|
||||
void CO_EM_initCallback(
|
||||
CO_EM_t *em,
|
||||
void (*pFunctSignal)(void));
|
||||
|
||||
CO_EM_t *em,
|
||||
void (*pFunctSignal)(const uint16_t ident,
|
||||
const uint16_t errorCode,
|
||||
const uint8_t errorRegister,
|
||||
const uint8_t errorBit,
|
||||
const uint32_t infoCode));
|
||||
|
||||
/**
|
||||
* Process Error control and Emergency object.
|
||||
|
|
|
|||
Loading…
Reference in a new issue