15#include "canfestival.h"
37 if (*d->error_number == 0)
38 for (index = 0; index < d->error_history_size; ++index)
39 *(d->error_first_element + index) = 0;
82 m.
rtr = NOT_A_REQUEST;
84 m.
data[0] = errCode & 0xFF;
85 m.
data[1] = (errCode >> 8) & 0xFF;
86 m.
data[2] = errRegister;
93 return canSend(d->canHandle, &m);
108 UNS8 errRegister_tmp;
110 for (index = 0; index < EMCY_MAX_ERRORS; ++index)
112 if (d->error_data[index].errCode == errCode)
114 if (d->error_data[index].active)
116 MSG_WAR(0x3052,
"EMCY message already sent", 0);
118 }
else d->error_data[index].active = 1;
123 if (index == EMCY_MAX_ERRORS)
124 for (index = 0; index < EMCY_MAX_ERRORS; ++index)
if (d->error_data[index].active == 0)
break;
126 if (index == EMCY_MAX_ERRORS)
128 MSG_ERR(0x3053,
"error_data full", 0);
132 d->error_data[index].errCode = errCode;
133 d->error_data[index].errRegMask = errRegMask;
134 d->error_data[index].active = 1;
137 d->error_state = Error_occurred;
140 for (index = 0, errRegister_tmp = 0; index < EMCY_MAX_ERRORS; ++index)
141 if (d->error_data[index].active == 1) errRegister_tmp |= d->error_data[index].errRegMask;
142 *d->error_register = errRegister_tmp;
145 for (index = d->error_history_size - 1; index > 0; --index)
146 *(d->error_first_element + index) = *(d->error_first_element + index - 1);
147 *(d->error_first_element) = errCode | ((
UNS32)addInfo << 16);
148 if(*d->error_number < d->error_history_size) ++(*d->error_number);
151 if (d->CurrentCommunicationState.csEmergency)
152 return sendEMCY(d, errCode, *d->error_register);
165 UNS8 errRegister_tmp;
166 UNS8 anyActiveError = 0;
168 for (index = 0; index < EMCY_MAX_ERRORS; ++index)
169 if (d->error_data[index].errCode == errCode)
break;
172 if ((index != EMCY_MAX_ERRORS) && (d->error_data[index].active == 1))
174 d->error_data[index].active = 0;
177 for (index = 0, errRegister_tmp = 0; index < EMCY_MAX_ERRORS; ++index)
178 if (d->error_data[index].active == 1)
181 errRegister_tmp |= d->error_data[index].errRegMask;
183 if(anyActiveError == 0)
185 d->error_state = Error_free;
187 if (d->CurrentCommunicationState.csEmergency)
190 *d->error_register = errRegister_tmp;
193 MSG_WAR(0x3054,
"recovered error was not active", 0);
208 MSG_WAR(0x3055,
"EMCY received. Proceed. ", 0);
217 nodeID = UNS16_LE(m->
cob_id) & 0x7F;
220 (*d->post_emcy)(d, nodeID, errCode, errReg);
#define UNS8
Unsigned int8 representation in CANFest.
#define UNS16
Unsigned int16 representation in CANFest.
#define MSG_WAR(num, str, val)
Definition of MSG_WAR.
#define UNS32
Unsigned int32 representation in CANFest.
#define MSG_ERR(num, str, val)
Definition of MSG_ERR.
UNS8 EMCY_setError(CO_Data *d, UNS16 errCode, UNS8 errRegMask, UNS16 addInfo)
Sets a new error with code errCode. Also sets corresponding bits in Error register (1001h)
UNS32 OnNumberOfErrorsUpdate(CO_Data *d, const indextable *unsused_indextable, UNS8 unsused_bSubindex)
This is called when Index 0x1003 is updated.
void proceedEMCY(CO_Data *d, Message *m)
This function is responsible to process an EMCY canopen-message.
void EMCY_errorRecovered(CO_Data *d, UNS16 errCode)
Indicates it has recovered from error errCode. Also clears corresponding bits in Error register (1001...
UNS8 sendEMCY(CO_Data *d, UNS16 errCode, UNS8 errRegister)
<BRIEF> sendEMCY
void _post_emcy(CO_Data *d, UNS8 nodeID, UNS16 errCode, UNS8 errReg)
<BRIEF> _post_emcy
void emergencyStop(CO_Data *d)
Stop EMCY producer and consumer.
void emergencyInit(CO_Data *d)
Start EMCY consumer and producer.
UNS32 RegisterSetODentryCallBack(CO_Data *d, UNS16 wIndex, UNS8 bSubindex, ODCallback_t Callback)
<BRIEF>
This structure contains all necessary informations to define a CANOpen node.