src/emcy.c
changeset 314 68e83c3ffbb5
parent 296 03f2b8b8cb0b
child 365 9b76e0881beb
equal deleted inserted replaced
313:fed411af774a 314:68e83c3ffbb5
    37 #include "canfestival.h"
    37 #include "canfestival.h"
    38 
    38 
    39 
    39 
    40 
    40 
    41 UNS32 OnNumberOfErrorsUpdate(CO_Data* d, const indextable * unsused_indextable, UNS8 unsused_bSubindex);
    41 UNS32 OnNumberOfErrorsUpdate(CO_Data* d, const indextable * unsused_indextable, UNS8 unsused_bSubindex);
    42 UNS8 sendEMCY(CO_Data* d, UNS32 cob_id, UNS16 errCode, UNS8 errRegister);
    42 UNS8 sendEMCY(CO_Data* d, UNS16 errCode, UNS8 errRegister);
    43 
    43 
    44 
    44 
    45 /*! This is called when Index 0x1003 is updated.
    45 /*! This is called when Index 0x1003 is updated.
    46 **
    46 **
    47 **
    47 **
    92  ** @param d                                                                                        
    92  ** @param d                                                                                        
    93  ** @param cob_id                                                                                   
    93  ** @param cob_id                                                                                   
    94  **                                                                                                 
    94  **                                                                                                 
    95  ** @return                                                                                         
    95  ** @return                                                                                         
    96  **/  
    96  **/  
    97 UNS8 sendEMCY(CO_Data* d, UNS32 cob_id, UNS16 errCode, UNS8 errRegister)
    97 UNS8 sendEMCY(CO_Data* d, UNS16 errCode, UNS8 errRegister)
    98 {
    98 {
    99 	Message m;
    99 	Message m;
   100   
   100   
   101 	MSG_WAR(0x3051, "sendEMCY", 0);
   101 	MSG_WAR(0x3051, "sendEMCY", 0);
   102   
   102   
   103 	m.cob_id.w = cob_id ;
   103 	m.cob_id.w = *d->error_cobid;
   104 	m.rtr = NOT_A_REQUEST;
   104 	m.rtr = NOT_A_REQUEST;
   105 	m.len = 8;
   105 	m.len = 8;
   106 	m.data[0] = errCode & 0xFF;        /* LSB */
   106 	m.data[0] = errCode & 0xFF;        /* LSB */
   107 	m.data[1] = (errCode >> 8) & 0xFF; /* MSB */
   107 	m.data[1] = (errCode >> 8) & 0xFF; /* MSB */
   108 	m.data[2] = errRegister;
   108 	m.data[2] = errRegister;
   168 	*(d->error_first_element) = errCode | ((UNS32)addInfo << 16);
   168 	*(d->error_first_element) = errCode | ((UNS32)addInfo << 16);
   169 	if(*d->error_number < d->error_history_size) ++(*d->error_number);
   169 	if(*d->error_number < d->error_history_size) ++(*d->error_number);
   170 	
   170 	
   171 	/* send EMCY message */
   171 	/* send EMCY message */
   172 	if (d->CurrentCommunicationState.csEmergency)
   172 	if (d->CurrentCommunicationState.csEmergency)
   173 		return sendEMCY(d, *d->bDeviceNodeId + 0x080, errCode, *d->error_register);
   173 		return sendEMCY(d, errCode, *d->error_register);
   174 	else return 1;
   174 	else return 1;
   175 }
   175 }
   176 
   176 
   177 /*! Deletes error errCode. Also clears corresponding bits in Error register (1001h)
   177 /*! Deletes error errCode. Also clears corresponding bits in Error register (1001h)
   178  **                                                                                                 
   178  **                                                                                                 
   206 		if(anyActiveError == 0)
   206 		if(anyActiveError == 0)
   207 		{
   207 		{
   208 			d->error_state = Error_free;
   208 			d->error_state = Error_free;
   209 			/* send a EMCY message with code "Error Reset or No Error" */
   209 			/* send a EMCY message with code "Error Reset or No Error" */
   210 			if (d->CurrentCommunicationState.csEmergency)
   210 			if (d->CurrentCommunicationState.csEmergency)
   211 				sendEMCY(d, *d->bDeviceNodeId + 0x080, 0x0000, 0x00);
   211 				sendEMCY(d, 0x0000, 0x00);
   212 		}
   212 		}
   213 		*d->error_register = errRegister_tmp;
   213 		*d->error_register = errRegister_tmp;
   214 	}
   214 	}
   215 	else
   215 	else
   216 		MSG_WAR(0x3054, "recovered error was not active", 0);
   216 		MSG_WAR(0x3054, "recovered error was not active", 0);