@@ -60,6 +60,24 @@ static uint32_t co_emcy_error_set (co_net_t * net, uint8_t subindex, uint32_t *
6060 return 0 ;
6161}
6262
63+ static void co_trigger_error_behavior (co_net_t * net )
64+ {
65+ /* Transition state according to error behavior setting */
66+ switch (net -> error_behavior )
67+ {
68+ case 0 :
69+ if (net -> state == STATE_OP )
70+ co_nmt_event (net , EVENT_PREOP );
71+ break ;
72+ case 2 :
73+ co_nmt_event (net , EVENT_STOP );
74+ break ;
75+ default :
76+ /* Do nothing */
77+ break ;
78+ }
79+ }
80+
6381uint32_t co_od1001_fn (
6482 co_net_t * net ,
6583 od_event_t event ,
@@ -214,6 +232,7 @@ int co_emcy_tx (co_net_t * net, uint16_t code, uint16_t info, uint8_t msef[5])
214232 uint8_t * p = msg ;
215233 uint8_t reg ;
216234 uint32_t now ;
235+ bool error_behavior = false;
217236
218237 if (net -> number_of_errors < MAX_ERRORS )
219238 net -> number_of_errors ++ ;
@@ -254,26 +273,13 @@ int co_emcy_tx (co_net_t * net, uint16_t code, uint16_t info, uint8_t msef[5])
254273 /* Call user callback */
255274 if (net -> cb_emcy )
256275 {
257- net -> cb_emcy (net -> cb_arg , net -> node , code , reg , msef );
276+ error_behavior = net -> cb_emcy (net -> cb_arg , net -> node , code , reg , msef );
258277 }
259278
260- if (code != 0x8140 && code != 0x8130 ) {
261- return 0 ;
262- }
263-
264- /* Transition state according to error behavior setting */
265- switch (net -> error_behavior )
266- {
267- case 0 :
268- if (net -> state == STATE_OP )
269- co_nmt_event (net , EVENT_PREOP );
270- break ;
271- case 2 :
272- co_nmt_event (net , EVENT_STOP );
273- break ;
274- default :
275- /* Do nothing */
276- break ;
279+ /* Always trigger error behavior on the mandatory events,
280+ * otherwise, follow the callback return value. */
281+ if (code == 0x8130 || code == 0x8140 || error_behavior ) {
282+ co_trigger_error_behavior (net );
277283 }
278284
279285 return 0 ;
0 commit comments