Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/****************************************************************************
2
3 (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
4 www.systec-electronic.com
5
6 Project: openPOWERLINK
7
8 Description: source file for NMT-Kernelspace-Module
9
10 License:
11
12 Redistribution and use in source and binary forms, with or without
13 modification, are permitted provided that the following conditions
14 are met:
15
16 1. Redistributions of source code must retain the above copyright
17 notice, this list of conditions and the following disclaimer.
18
19 2. Redistributions in binary form must reproduce the above copyright
20 notice, this list of conditions and the following disclaimer in the
21 documentation and/or other materials provided with the distribution.
22
23 3. Neither the name of SYSTEC electronic GmbH nor the names of its
24 contributors may be used to endorse or promote products derived
25 from this software without prior written permission. For written
26 permission, please contact info@systec-electronic.com.
27
28 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
31 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
32 COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
33 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
34 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
35 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
36 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
38 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
39 POSSIBILITY OF SUCH DAMAGE.
40
41 Severability Clause:
42
43 If a provision of this License is or becomes illegal, invalid or
44 unenforceable in any jurisdiction, that shall not affect:
45 1. the validity or enforceability in that jurisdiction of any other
46 provision of this License; or
47 2. the validity or enforceability in other jurisdictions of that or
48 any other provision of this License.
49
50 -------------------------------------------------------------------------
51
52 $RCSfile: EplNmtk.c,v $
53
54 $Author: D.Krueger $
55
56 $Revision: 1.12 $ $Date: 2008/11/13 17:13:09 $
57
58 $State: Exp $
59
60 Build Environment:
61 GCC V3.4
62
63 -------------------------------------------------------------------------
64
65 Revision History:
66
67 2006/06/09 k.t.: start of the implementation
68
69****************************************************************************/
70
71#include "kernel/EplNmtk.h"
72#include "kernel/EplTimerk.h"
73
74#include "kernel/EplDllk.h" // for EplDllkProcess()
75
76#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTK)) != 0)
77/***************************************************************************/
78/* */
79/* */
80/* G L O B A L D E F I N I T I O N S */
81/* */
82/* */
83/***************************************************************************/
84
85//---------------------------------------------------------------------------
86// const defines
87//---------------------------------------------------------------------------
88
89// TracePoint support for realtime-debugging
90#ifdef _DBG_TRACE_POINTS_
91void TgtDbgSignalTracePoint(u8 bTracePointNumber_p);
92void TgtDbgPostTraceValue(u32 dwTraceValue_p);
93#define TGT_DBG_SIGNAL_TRACE_POINT(p) TgtDbgSignalTracePoint(p)
94#define TGT_DBG_POST_TRACE_VALUE(v) TgtDbgPostTraceValue(v)
95#else
96#define TGT_DBG_SIGNAL_TRACE_POINT(p)
97#define TGT_DBG_POST_TRACE_VALUE(v)
98#endif
99#define EPL_NMTK_DBG_POST_TRACE_VALUE(NmtEvent_p, OldNmtState_p, NewNmtState_p) \
100 TGT_DBG_POST_TRACE_VALUE((kEplEventSinkNmtk << 28) | (NmtEvent_p << 16) \
101 | ((OldNmtState_p & 0xFF) << 8) \
102 | (NewNmtState_p & 0xFF))
103
104//---------------------------------------------------------------------------
105// local types
106//---------------------------------------------------------------------------
107// struct for instance table
108INSTANCE_TYPE_BEGIN EPL_MCO_DECL_INSTANCE_MEMBER()
109
110STATIC volatile tEplNmtState m_NmtState;
111STATIC volatile BOOL m_fEnableReadyToOperate;
112STATIC volatile BOOL m_fAppReadyToOperate;
113STATIC volatile BOOL m_fTimerMsPreOp2;
114STATIC volatile BOOL m_fAllMandatoryCNIdent;
115STATIC volatile BOOL m_fFrozen;
116
117INSTANCE_TYPE_END
118//---------------------------------------------------------------------------
119// modul globale vars
120//---------------------------------------------------------------------------
121// This macro replace the unspecific pointer to an instance through
122// the modul specific type for the local instance table. This macro
123// must defined in each modul.
124//#define tEplPtrInstance tEplInstanceInfo*
125EPL_MCO_DECL_INSTANCE_VAR()
126//---------------------------------------------------------------------------
127// local function prototypes
128//---------------------------------------------------------------------------
129EPL_MCO_DEFINE_INSTANCE_FCT()
130
131/***************************************************************************/
132/* */
133/* */
134/* C L A S S <NMT_Kernel-Module> */
135/* */
136/* */
137/***************************************************************************/
138//
139// Description: This module realize the NMT-State-Machine of the EPL-Stack
140//
141//
142/***************************************************************************/
143//=========================================================================//
144// //
145// P U B L I C F U N C T I O N S //
146// //
147//=========================================================================//
148//---------------------------------------------------------------------------
149//
150// Function: EplNmtkInit
151//
152// Description: initializes the first instance
153//
154//
155//
156// Parameters: EPL_MCO_DECL_PTR_INSTANCE_PTR = Instance pointer
157// uiNodeId_p = Node Id of the lokal node
158//
159//
160// Returns: tEplKernel = Errorcode
161//
162//
163// State:
164//
165//---------------------------------------------------------------------------
166tEplKernel EplNmtkInit(EPL_MCO_DECL_PTR_INSTANCE_PTR)
167{
168 tEplKernel Ret;
169
170 Ret = EplNmtkAddInstance(EPL_MCO_PTR_INSTANCE_PTR);
171
172 return Ret;
173}
174
175//---------------------------------------------------------------------------
176//
177// Function: EplNmtkAddInstance
178//
179// Description: adds a new instance
180//
181//
182//
183// Parameters: EPL_MCO_DECL_PTR_INSTANCE_PTR = Instance pointer
184//
185//
186// Returns: tEplKernel = Errorcode
187//
188//
189// State:
190//
191//---------------------------------------------------------------------------
192tEplKernel EplNmtkAddInstance(EPL_MCO_DECL_PTR_INSTANCE_PTR)
193{
194 EPL_MCO_DECL_INSTANCE_PTR_LOCAL tEplKernel Ret;
195//tEplEvent Event;
196//tEplEventNmtStateChange NmtStateChange;
197
198 // check if pointer to instance pointer valid
199 // get free instance and set the globale instance pointer
200 // set also the instance addr to parameterlist
201 EPL_MCO_CHECK_PTR_INSTANCE_PTR();
202 EPL_MCO_GET_FREE_INSTANCE_PTR();
203 EPL_MCO_SET_PTR_INSTANCE_PTR();
204
205 // sign instance as used
206 EPL_MCO_WRITE_INSTANCE_STATE(kStateUsed);
207
208 Ret = kEplSuccessful;
209
210 // initialize intern vaiables
211 // 2006/07/31 d.k.: set NMT-State to kEplNmtGsOff
212 EPL_MCO_GLB_VAR(m_NmtState) = kEplNmtGsOff;
213 // set NMT-State to kEplNmtGsInitialising
214 //EPL_MCO_GLB_VAR(m_NmtState) = kEplNmtGsInitialising;
215
216 // set flags to FALSE
217 EPL_MCO_GLB_VAR(m_fEnableReadyToOperate) = FALSE;
218 EPL_MCO_GLB_VAR(m_fAppReadyToOperate) = FALSE;
219 EPL_MCO_GLB_VAR(m_fTimerMsPreOp2) = FALSE;
220 EPL_MCO_GLB_VAR(m_fAllMandatoryCNIdent) = FALSE;
221 EPL_MCO_GLB_VAR(m_fFrozen) = FALSE;
222
223// EPL_MCO_GLB_VAR(m_TimerHdl) = 0;
224
225 // inform higher layer about state change
226 // 2006/07/31 d.k.: The EPL API layer/application has to start NMT state
227 // machine via NmtEventSwReset after initialisation of
228 // all modules has been completed. DLL has to be initialised
229 // after NMTk because NMT state shall not be uninitialised
230 // at that time.
231/* NmtStateChange.m_NewNmtState = EPL_MCO_GLB_VAR(m_NmtState);
232 NmtStateChange.m_NmtEvent = kEplNmtEventNoEvent;
233 Event.m_EventSink = kEplEventSinkNmtu;
234 Event.m_EventType = kEplEventTypeNmtStateChange;
235 EPL_MEMSET(&Event.m_NetTime, 0x00, sizeof(Event.m_NetTime));
236 Event.m_pArg = &NmtStateChange;
237 Event.m_uiSize = sizeof(NmtStateChange);
238 Ret = EplEventkPost(&Event);
239*/
240 return Ret;
241}
242
243//---------------------------------------------------------------------------
244//
245// Function: EplNmtkDelInstance
246//
247// Description: delete instance
248//
249//
250//
251// Parameters: EPL_MCO_DECL_PTR_INSTANCE_PTR = Instance pointer
252//
253//
254// Returns: tEplKernel = Errorcode
255//
256//
257// State:
258//
259//---------------------------------------------------------------------------
260#if (EPL_USE_DELETEINST_FUNC != FALSE)
261tEplKernel EplNmtkDelInstance(EPL_MCO_DECL_PTR_INSTANCE_PTR)
262{
263 tEplKernel Ret = kEplSuccessful;
264 // check for all API function if instance is valid
265 EPL_MCO_CHECK_INSTANCE_STATE();
266
267 // set NMT-State to kEplNmtGsOff
268 EPL_MCO_GLB_VAR(m_NmtState) = kEplNmtGsOff;
269
270 // sign instance as unused
271 EPL_MCO_WRITE_INSTANCE_STATE(kStateUnused);
272
273 // delete timer
274// Ret = EplTimerkDeleteTimer(&EPL_MCO_GLB_VAR(m_TimerHdl));
275
276 return Ret;
277}
278#endif // (EPL_USE_DELETEINST_FUNC != FALSE)
279
280//---------------------------------------------------------------------------
281//
282// Function: EplNmtkProcess
283//
284// Description: main process function
285// -> process NMT-State-Maschine und read NMT-Events from Queue
286//
287//
288//
289// Parameters: EPL_MCO_DECL_PTR_INSTANCE_PTR_ = Instance pointer
290// pEvent_p = Epl-Event with NMT-event to process
291//
292//
293// Returns: tEplKernel = Errorcode
294//
295//
296// State:
297//
298//---------------------------------------------------------------------------
299tEplKernel EplNmtkProcess(EPL_MCO_DECL_PTR_INSTANCE_PTR_ tEplEvent *pEvent_p)
300{
301 tEplKernel Ret;
302 tEplNmtState OldNmtState;
303 tEplNmtEvent NmtEvent;
304 tEplEvent Event;
305 tEplEventNmtStateChange NmtStateChange;
306
307 // check for all API function if instance is valid
308 EPL_MCO_CHECK_INSTANCE_STATE();
309
310 Ret = kEplSuccessful;
311
312 switch (pEvent_p->m_EventType) {
313 case kEplEventTypeNmtEvent:
314 {
315 NmtEvent = *((tEplNmtEvent *) pEvent_p->m_pArg);
316 break;
317 }
318
319 case kEplEventTypeTimer:
320 {
321 NmtEvent =
322 (tEplNmtEvent) ((tEplTimerEventArg *) pEvent_p->
323 m_pArg)->m_ulArg;
324 break;
325 }
326 default:
327 {
328 Ret = kEplNmtInvalidEvent;
329 goto Exit;
330 }
331 }
332
333 // save NMT-State
334 // needed for later comparison to
335 // inform hgher layer about state change
336 OldNmtState = EPL_MCO_GLB_VAR(m_NmtState);
337
338 // NMT-State-Maschine
339 switch (EPL_MCO_GLB_VAR(m_NmtState)) {
340 //-----------------------------------------------------------
341 // general part of the statemaschine
342
343 // first init of the hardware
344 case kEplNmtGsOff:
345 {
346 // leave this state only if higher layer says so
347 if (NmtEvent == kEplNmtEventSwReset) { // new state kEplNmtGsInitialising
348 EPL_MCO_GLB_VAR(m_NmtState) =
349 kEplNmtGsInitialising;
350 }
351 break;
352 }
353
354 // first init of the hardware
355 case kEplNmtGsInitialising:
356 {
357 // leave this state only if higher layer says so
358
359 // check events
360 switch (NmtEvent) {
361 // 2006/07/31 d.k.: react also on NMT reset commands in ResetApp state
362 // NMT Command SwitchOff
363 case kEplNmtEventCriticalError:
364 case kEplNmtEventSwitchOff:
365 {
366 EPL_MCO_GLB_VAR(m_NmtState) =
367 kEplNmtGsOff;
368 break;
369 }
370
371 // new state kEplNmtGsResetApplication
372 case kEplNmtEventEnterResetApp:
373 {
374 EPL_MCO_GLB_VAR(m_NmtState) =
375 kEplNmtGsResetApplication;
376 break;
377 }
378
379 default:
380 {
381 break;
382 }
383 }
384 break;
385 }
386
387 // init of the manufacturer-specific profile area and the
388 // standardised device profile area
389 case kEplNmtGsResetApplication:
390 {
391 // check events
392 switch (NmtEvent) {
393 // 2006/07/31 d.k.: react also on NMT reset commands in ResetApp state
394 // NMT Command SwitchOff
395 case kEplNmtEventCriticalError:
396 case kEplNmtEventSwitchOff:
397 {
398 EPL_MCO_GLB_VAR(m_NmtState) =
399 kEplNmtGsOff;
400 break;
401 }
402
403 // NMT Command SwReset
404 case kEplNmtEventSwReset:
405 {
406 EPL_MCO_GLB_VAR(m_NmtState) =
407 kEplNmtGsInitialising;
408 break;
409 }
410
411 // leave this state only if higher layer
412 // say so
413 case kEplNmtEventEnterResetCom:
414 {
415 // new state kEplNmtGsResetCommunication
416 EPL_MCO_GLB_VAR(m_NmtState) =
417 kEplNmtGsResetCommunication;
418 break;
419 }
420
421 default:
422 {
423 break;
424 }
425 }
426 break;
427 }
428
429 // init of the communication profile area
430 case kEplNmtGsResetCommunication:
431 {
432 // check events
433 switch (NmtEvent) {
434 // 2006/07/31 d.k.: react also on NMT reset commands in ResetComm state
435 // NMT Command SwitchOff
436 case kEplNmtEventCriticalError:
437 case kEplNmtEventSwitchOff:
438 {
439 EPL_MCO_GLB_VAR(m_NmtState) =
440 kEplNmtGsOff;
441 break;
442 }
443
444 // NMT Command SwReset
445 case kEplNmtEventSwReset:
446 {
447 EPL_MCO_GLB_VAR(m_NmtState) =
448 kEplNmtGsInitialising;
449 break;
450 }
451
452 // NMT Command ResetNode
453 case kEplNmtEventResetNode:
454 {
455 EPL_MCO_GLB_VAR(m_NmtState) =
456 kEplNmtGsResetApplication;
457 break;
458 }
459
460 // leave this state only if higher layer
461 // say so
462 case kEplNmtEventEnterResetConfig:
463 {
464 // new state kEplNmtGsResetCommunication
465 EPL_MCO_GLB_VAR(m_NmtState) =
466 kEplNmtGsResetConfiguration;
467 break;
468 }
469
470 default:
471 {
472 break;
473 }
474 }
475 break;
476 }
477
478 // build the configuration with infos from OD
479 case kEplNmtGsResetConfiguration:
480 {
481 // reset flags
482 EPL_MCO_GLB_VAR(m_fEnableReadyToOperate) = FALSE;
483 EPL_MCO_GLB_VAR(m_fAppReadyToOperate) = FALSE;
484 EPL_MCO_GLB_VAR(m_fFrozen) = FALSE;
485
486 // check events
487 switch (NmtEvent) {
488 // 2006/07/31 d.k.: react also on NMT reset commands in ResetConf state
489 // NMT Command SwitchOff
490 case kEplNmtEventCriticalError:
491 case kEplNmtEventSwitchOff:
492 {
493 EPL_MCO_GLB_VAR(m_NmtState) =
494 kEplNmtGsOff;
495 break;
496 }
497
498 // NMT Command SwReset
499 case kEplNmtEventSwReset:
500 {
501 EPL_MCO_GLB_VAR(m_NmtState) =
502 kEplNmtGsInitialising;
503 break;
504 }
505
506 // NMT Command ResetNode
507 case kEplNmtEventResetNode:
508 {
509 EPL_MCO_GLB_VAR(m_NmtState) =
510 kEplNmtGsResetApplication;
511 break;
512 }
513
514 // NMT Command ResetCommunication
515 case kEplNmtEventResetCom:
516 {
517 EPL_MCO_GLB_VAR(m_NmtState) =
518 kEplNmtGsResetCommunication;
519 break;
520 }
521
522 // leave this state only if higher layer says so
523 case kEplNmtEventEnterCsNotActive:
524 { // Node should be CN
525 EPL_MCO_GLB_VAR(m_NmtState) =
526 kEplNmtCsNotActive;
527 break;
528
529 }
530
531 case kEplNmtEventEnterMsNotActive:
532 { // Node should be CN
533#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) == 0)
534 // no MN functionality
535 // TODO: -create error E_NMT_BA1_NO_MN_SUPPORT
536 EPL_MCO_GLB_VAR(m_fFrozen) = TRUE;
537#else
538
539 EPL_MCO_GLB_VAR(m_NmtState) =
540 kEplNmtMsNotActive;
541#endif
542 break;
543
544 }
545
546 default:
547 {
548 break;
549 }
550 }
551 break;
552 }
553
554 //-----------------------------------------------------------
555 // CN part of the statemaschine
556
557 // node liste for EPL-Frames and check timeout
558 case kEplNmtCsNotActive:
559 {
560
561 // check events
562 switch (NmtEvent) {
563 // 2006/07/31 d.k.: react also on NMT reset commands in NotActive state
564 // NMT Command SwitchOff
565 case kEplNmtEventCriticalError:
566 case kEplNmtEventSwitchOff:
567 {
568 EPL_MCO_GLB_VAR(m_NmtState) =
569 kEplNmtGsOff;
570 break;
571 }
572
573 // NMT Command SwReset
574 case kEplNmtEventSwReset:
575 {
576 EPL_MCO_GLB_VAR(m_NmtState) =
577 kEplNmtGsInitialising;
578// Ret = EplTimerkDeleteTimer(&EPL_MCO_GLB_VAR(m_TimerHdl));
579 break;
580 }
581
582 // NMT Command ResetNode
583 case kEplNmtEventResetNode:
584 {
585 EPL_MCO_GLB_VAR(m_NmtState) =
586 kEplNmtGsResetApplication;
587// Ret = EplTimerkDeleteTimer(&EPL_MCO_GLB_VAR(m_TimerHdl));
588 break;
589 }
590
591 // NMT Command ResetCommunication
592 // or internal Communication error
593 case kEplNmtEventResetCom:
594 case kEplNmtEventInternComError:
595 {
596 EPL_MCO_GLB_VAR(m_NmtState) =
597 kEplNmtGsResetCommunication;
598// Ret = EplTimerkDeleteTimer(&EPL_MCO_GLB_VAR(m_TimerHdl));
599 break;
600 }
601
602 // NMT Command Reset Configuration
603 case kEplNmtEventResetConfig:
604 {
605 EPL_MCO_GLB_VAR(m_NmtState) =
606 kEplNmtGsResetConfiguration;
607// Ret = EplTimerkDeleteTimer(&EPL_MCO_GLB_VAR(m_TimerHdl));
608 break;
609 }
610
611 // see if SoA or SoC received
612 // k.t. 20.07.2006: only SoA forces change of state
613 // see EPL V2 DS 1.0.0 p.267
614 // case kEplNmtEventDllCeSoc:
615 case kEplNmtEventDllCeSoa:
616 { // new state PRE_OPERATIONAL1
617 EPL_MCO_GLB_VAR(m_NmtState) =
618 kEplNmtCsPreOperational1;
619// Ret = EplTimerkDeleteTimer(&EPL_MCO_GLB_VAR(m_TimerHdl));
620 break;
621 }
622 // timeout for SoA and Soc
623 case kEplNmtEventTimerBasicEthernet:
624 {
625 // new state BASIC_ETHERNET
626 EPL_MCO_GLB_VAR(m_NmtState) =
627 kEplNmtCsBasicEthernet;
628 break;
629 }
630
631 default:
632 {
633 break;
634 }
635 } // end of switch(NmtEvent)
636
637 break;
638 }
639
640 // node processes only async frames
641 case kEplNmtCsPreOperational1:
642 {
643
644 // check events
645 switch (NmtEvent) {
646 // NMT Command SwitchOff
647 case kEplNmtEventCriticalError:
648 case kEplNmtEventSwitchOff:
649 {
650 EPL_MCO_GLB_VAR(m_NmtState) =
651 kEplNmtGsOff;
652 break;
653 }
654
655 // NMT Command SwReset
656 case kEplNmtEventSwReset:
657 {
658 EPL_MCO_GLB_VAR(m_NmtState) =
659 kEplNmtGsInitialising;
660 break;
661 }
662
663 // NMT Command ResetNode
664 case kEplNmtEventResetNode:
665 {
666 EPL_MCO_GLB_VAR(m_NmtState) =
667 kEplNmtGsResetApplication;
668 break;
669 }
670
671 // NMT Command ResetCommunication
672 // or internal Communication error
673 case kEplNmtEventResetCom:
674 case kEplNmtEventInternComError:
675 {
676 EPL_MCO_GLB_VAR(m_NmtState) =
677 kEplNmtGsResetCommunication;
678 break;
679 }
680
681 // NMT Command Reset Configuration
682 case kEplNmtEventResetConfig:
683 {
684 EPL_MCO_GLB_VAR(m_NmtState) =
685 kEplNmtGsResetConfiguration;
686 break;
687 }
688
689 // NMT Command StopNode
690 case kEplNmtEventStopNode:
691 {
692 EPL_MCO_GLB_VAR(m_NmtState) =
693 kEplNmtCsStopped;
694 break;
695 }
696
697 // check if SoC received
698 case kEplNmtEventDllCeSoc:
699 {
700 EPL_MCO_GLB_VAR(m_NmtState) =
701 kEplNmtCsPreOperational2;
702 break;
703 }
704
705 default:
706 {
707 break;
708 }
709
710 } // end of switch(NmtEvent)
711
712 break;
713 }
714
715 // node processes isochronous and asynchronous frames
716 case kEplNmtCsPreOperational2:
717 {
718 // check events
719 switch (NmtEvent) {
720 // NMT Command SwitchOff
721 case kEplNmtEventCriticalError:
722 case kEplNmtEventSwitchOff:
723 {
724 EPL_MCO_GLB_VAR(m_NmtState) =
725 kEplNmtGsOff;
726 break;
727 }
728
729 // NMT Command SwReset
730 case kEplNmtEventSwReset:
731 {
732 EPL_MCO_GLB_VAR(m_NmtState) =
733 kEplNmtGsInitialising;
734 break;
735 }
736
737 // NMT Command ResetNode
738 case kEplNmtEventResetNode:
739 {
740 EPL_MCO_GLB_VAR(m_NmtState) =
741 kEplNmtGsResetApplication;
742 break;
743 }
744
745 // NMT Command ResetCommunication
746 // or internal Communication error
747 case kEplNmtEventResetCom:
748 case kEplNmtEventInternComError:
749 {
750 EPL_MCO_GLB_VAR(m_NmtState) =
751 kEplNmtGsResetCommunication;
752 break;
753 }
754
755 // NMT Command Reset Configuration
756 case kEplNmtEventResetConfig:
757 {
758 EPL_MCO_GLB_VAR(m_NmtState) =
759 kEplNmtGsResetConfiguration;
760 break;
761 }
762
763 // NMT Command StopNode
764 case kEplNmtEventStopNode:
765 {
766 // reset flags
767 EPL_MCO_GLB_VAR(m_fEnableReadyToOperate)
768 = FALSE;
769 EPL_MCO_GLB_VAR(m_fAppReadyToOperate) =
770 FALSE;
771 EPL_MCO_GLB_VAR(m_NmtState) =
772 kEplNmtCsStopped;
773 break;
774 }
775
776 // error occured
777 case kEplNmtEventNmtCycleError:
778 {
779 // reset flags
780 EPL_MCO_GLB_VAR(m_fEnableReadyToOperate)
781 = FALSE;
782 EPL_MCO_GLB_VAR(m_fAppReadyToOperate) =
783 FALSE;
784 EPL_MCO_GLB_VAR(m_NmtState) =
785 kEplNmtCsPreOperational1;
786 break;
787 }
788
789 // check if application is ready to operate
790 case kEplNmtEventEnterReadyToOperate:
791 {
792 // check if command NMTEnableReadyToOperate from MN was received
793 if (EPL_MCO_GLB_VAR(m_fEnableReadyToOperate) == TRUE) { // reset flags
794 EPL_MCO_GLB_VAR
795 (m_fEnableReadyToOperate) =
796 FALSE;
797 EPL_MCO_GLB_VAR
798 (m_fAppReadyToOperate) =
799 FALSE;
800 // change state
801 EPL_MCO_GLB_VAR(m_NmtState) =
802 kEplNmtCsReadyToOperate;
803 } else { // set Flag
804 EPL_MCO_GLB_VAR
805 (m_fAppReadyToOperate) =
806 TRUE;
807 }
808 break;
809 }
810
811 // NMT Commando EnableReadyToOperate
812 case kEplNmtEventEnableReadyToOperate:
813 {
814 // check if application is ready
815 if (EPL_MCO_GLB_VAR(m_fAppReadyToOperate) == TRUE) { // reset flags
816 EPL_MCO_GLB_VAR
817 (m_fEnableReadyToOperate) =
818 FALSE;
819 EPL_MCO_GLB_VAR
820 (m_fAppReadyToOperate) =
821 FALSE;
822 // change state
823 EPL_MCO_GLB_VAR(m_NmtState) =
824 kEplNmtCsReadyToOperate;
825 } else { // set Flag
826 EPL_MCO_GLB_VAR
827 (m_fEnableReadyToOperate) =
828 TRUE;
829 }
830 break;
831 }
832
833 default:
834 {
835 break;
836 }
837
838 } // end of switch(NmtEvent)
839 break;
840 }
841
842 // node should be configured und application is ready
843 case kEplNmtCsReadyToOperate:
844 {
845 // check events
846 switch (NmtEvent) {
847 // NMT Command SwitchOff
848 case kEplNmtEventCriticalError:
849 case kEplNmtEventSwitchOff:
850 {
851 EPL_MCO_GLB_VAR(m_NmtState) =
852 kEplNmtGsOff;
853 break;
854 }
855
856 // NMT Command SwReset
857 case kEplNmtEventSwReset:
858 {
859 EPL_MCO_GLB_VAR(m_NmtState) =
860 kEplNmtGsInitialising;
861 break;
862 }
863
864 // NMT Command ResetNode
865 case kEplNmtEventResetNode:
866 {
867 EPL_MCO_GLB_VAR(m_NmtState) =
868 kEplNmtGsResetApplication;
869 break;
870 }
871
872 // NMT Command ResetCommunication
873 // or internal Communication error
874 case kEplNmtEventResetCom:
875 case kEplNmtEventInternComError:
876 {
877 EPL_MCO_GLB_VAR(m_NmtState) =
878 kEplNmtGsResetCommunication;
879 break;
880 }
881
882 // NMT Command ResetConfiguration
883 case kEplNmtEventResetConfig:
884 {
885 EPL_MCO_GLB_VAR(m_NmtState) =
886 kEplNmtGsResetConfiguration;
887 break;
888 }
889
890 // NMT Command StopNode
891 case kEplNmtEventStopNode:
892 {
893 EPL_MCO_GLB_VAR(m_NmtState) =
894 kEplNmtCsStopped;
895 break;
896 }
897
898 // error occured
899 case kEplNmtEventNmtCycleError:
900 {
901 EPL_MCO_GLB_VAR(m_NmtState) =
902 kEplNmtCsPreOperational1;
903 break;
904 }
905
906 // NMT Command StartNode
907 case kEplNmtEventStartNode:
908 {
909 EPL_MCO_GLB_VAR(m_NmtState) =
910 kEplNmtCsOperational;
911 break;
912 }
913
914 default:
915 {
916 break;
917 }
918
919 } // end of switch(NmtEvent)
920 break;
921 }
922
923 // normal work state
924 case kEplNmtCsOperational:
925 {
926
927 // check events
928 switch (NmtEvent) {
929 // NMT Command SwitchOff
930 case kEplNmtEventCriticalError:
931 case kEplNmtEventSwitchOff:
932 {
933 EPL_MCO_GLB_VAR(m_NmtState) =
934 kEplNmtGsOff;
935 break;
936 }
937
938 // NMT Command SwReset
939 case kEplNmtEventSwReset:
940 {
941 EPL_MCO_GLB_VAR(m_NmtState) =
942 kEplNmtGsInitialising;
943 break;
944 }
945
946 // NMT Command ResetNode
947 case kEplNmtEventResetNode:
948 {
949 EPL_MCO_GLB_VAR(m_NmtState) =
950 kEplNmtGsResetApplication;
951 break;
952 }
953
954 // NMT Command ResetCommunication
955 // or internal Communication error
956 case kEplNmtEventResetCom:
957 case kEplNmtEventInternComError:
958 {
959 EPL_MCO_GLB_VAR(m_NmtState) =
960 kEplNmtGsResetCommunication;
961 break;
962 }
963
964 // NMT Command ResetConfiguration
965 case kEplNmtEventResetConfig:
966 {
967 EPL_MCO_GLB_VAR(m_NmtState) =
968 kEplNmtGsResetConfiguration;
969 break;
970 }
971
972 // NMT Command StopNode
973 case kEplNmtEventStopNode:
974 {
975 EPL_MCO_GLB_VAR(m_NmtState) =
976 kEplNmtCsStopped;
977 break;
978 }
979
980 // NMT Command EnterPreOperational2
981 case kEplNmtEventEnterPreOperational2:
982 {
983 EPL_MCO_GLB_VAR(m_NmtState) =
984 kEplNmtCsPreOperational2;
985 break;
986 }
987
988 // error occured
989 case kEplNmtEventNmtCycleError:
990 {
991 EPL_MCO_GLB_VAR(m_NmtState) =
992 kEplNmtCsPreOperational1;
993 break;
994 }
995
996 default:
997 {
998 break;
999 }
1000
1001 } // end of switch(NmtEvent)
1002 break;
1003 }
1004
1005 // node stopped by MN
1006 // -> only process asynchronous frames
1007 case kEplNmtCsStopped:
1008 {
1009 // check events
1010 switch (NmtEvent) {
1011 // NMT Command SwitchOff
1012 case kEplNmtEventCriticalError:
1013 case kEplNmtEventSwitchOff:
1014 {
1015 EPL_MCO_GLB_VAR(m_NmtState) =
1016 kEplNmtGsOff;
1017 break;
1018 }
1019
1020 // NMT Command SwReset
1021 case kEplNmtEventSwReset:
1022 {
1023 EPL_MCO_GLB_VAR(m_NmtState) =
1024 kEplNmtGsInitialising;
1025 break;
1026 }
1027
1028 // NMT Command ResetNode
1029 case kEplNmtEventResetNode:
1030 {
1031 EPL_MCO_GLB_VAR(m_NmtState) =
1032 kEplNmtGsResetApplication;
1033 break;
1034 }
1035
1036 // NMT Command ResetCommunication
1037 // or internal Communication error
1038 case kEplNmtEventResetCom:
1039 case kEplNmtEventInternComError:
1040 {
1041 EPL_MCO_GLB_VAR(m_NmtState) =
1042 kEplNmtGsResetCommunication;
1043 break;
1044 }
1045
1046 // NMT Command ResetConfiguration
1047 case kEplNmtEventResetConfig:
1048 {
1049 EPL_MCO_GLB_VAR(m_NmtState) =
1050 kEplNmtGsResetConfiguration;
1051 break;
1052 }
1053
1054 // NMT Command EnterPreOperational2
1055 case kEplNmtEventEnterPreOperational2:
1056 {
1057 EPL_MCO_GLB_VAR(m_NmtState) =
1058 kEplNmtCsPreOperational2;
1059 break;
1060 }
1061
1062 // error occured
1063 case kEplNmtEventNmtCycleError:
1064 {
1065 EPL_MCO_GLB_VAR(m_NmtState) =
1066 kEplNmtCsPreOperational1;
1067 break;
1068 }
1069
1070 default:
1071 {
1072 break;
1073 }
1074
1075 } // end of switch(NmtEvent)
1076 break;
1077 }
1078
1079 // no epl cycle
1080 // -> normal ethernet communication
1081 case kEplNmtCsBasicEthernet:
1082 {
1083 // check events
1084 switch (NmtEvent) {
1085 // NMT Command SwitchOff
1086 case kEplNmtEventCriticalError:
1087 case kEplNmtEventSwitchOff:
1088 {
1089 EPL_MCO_GLB_VAR(m_NmtState) =
1090 kEplNmtGsOff;
1091 break;
1092 }
1093
1094 // NMT Command SwReset
1095 case kEplNmtEventSwReset:
1096 {
1097 EPL_MCO_GLB_VAR(m_NmtState) =
1098 kEplNmtGsInitialising;
1099 break;
1100 }
1101
1102 // NMT Command ResetNode
1103 case kEplNmtEventResetNode:
1104 {
1105 EPL_MCO_GLB_VAR(m_NmtState) =
1106 kEplNmtGsResetApplication;
1107 break;
1108 }
1109
1110 // NMT Command ResetCommunication
1111 // or internal Communication error
1112 case kEplNmtEventResetCom:
1113 case kEplNmtEventInternComError:
1114 {
1115 EPL_MCO_GLB_VAR(m_NmtState) =
1116 kEplNmtGsResetCommunication;
1117 break;
1118 }
1119
1120 // NMT Command ResetConfiguration
1121 case kEplNmtEventResetConfig:
1122 {
1123 EPL_MCO_GLB_VAR(m_NmtState) =
1124 kEplNmtGsResetConfiguration;
1125 break;
1126 }
1127
1128 // error occured
1129 // d.k.: how does this error occur? on CRC errors
1130/* case kEplNmtEventNmtCycleError:
1131 {
1132 EPL_MCO_GLB_VAR(m_NmtState) = kEplNmtCsPreOperational1;
1133 break;
1134 }
1135*/
1136 case kEplNmtEventDllCeSoc:
1137 case kEplNmtEventDllCePreq:
1138 case kEplNmtEventDllCePres:
1139 case kEplNmtEventDllCeSoa:
1140 { // Epl-Frame on net -> stop any communication
1141 EPL_MCO_GLB_VAR(m_NmtState) =
1142 kEplNmtCsPreOperational1;
1143 break;
1144 }
1145
1146 default:
1147 {
1148 break;
1149 }
1150
1151 } // end of switch(NmtEvent)
1152
1153 break;
1154 }
1155
1156 //-----------------------------------------------------------
1157 // MN part of the statemaschine
1158
1159 // MN listen to network
1160 // -> if no EPL traffic go to next state
1161 case kEplNmtMsNotActive:
1162 {
1163#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) == 0)
1164 // no MN functionality
1165 // TODO: -create error E_NMT_BA1_NO_MN_SUPPORT
1166 EPL_MCO_GLB_VAR(m_fFrozen) = TRUE;
1167#else
1168
1169 // check events
1170 switch (NmtEvent) {
1171 // NMT Command SwitchOff
1172 case kEplNmtEventCriticalError:
1173 case kEplNmtEventSwitchOff:
1174 {
1175 EPL_MCO_GLB_VAR(m_NmtState) =
1176 kEplNmtGsOff;
1177 break;
1178 }
1179
1180 // NMT Command SwReset
1181 case kEplNmtEventSwReset:
1182 {
1183 EPL_MCO_GLB_VAR(m_NmtState) =
1184 kEplNmtGsInitialising;
1185 break;
1186 }
1187
1188 // NMT Command ResetNode
1189 case kEplNmtEventResetNode:
1190 {
1191 EPL_MCO_GLB_VAR(m_NmtState) =
1192 kEplNmtGsResetApplication;
1193 break;
1194 }
1195
1196 // NMT Command ResetCommunication
1197 // or internal Communication error
1198 case kEplNmtEventResetCom:
1199 case kEplNmtEventInternComError:
1200 {
1201 EPL_MCO_GLB_VAR(m_NmtState) =
1202 kEplNmtGsResetCommunication;
1203 break;
1204 }
1205
1206 // NMT Command ResetConfiguration
1207 case kEplNmtEventResetConfig:
1208 {
1209 EPL_MCO_GLB_VAR(m_NmtState) =
1210 kEplNmtGsResetConfiguration;
1211 break;
1212 }
1213
1214 // EPL frames received
1215 case kEplNmtEventDllCeSoc:
1216 case kEplNmtEventDllCeSoa:
1217 { // other MN in network
1218 // $$$ d.k.: generate error history entry
1219 EPL_MCO_GLB_VAR(m_fFrozen) = TRUE;
1220 break;
1221 }
1222
1223 // timeout event
1224 case kEplNmtEventTimerBasicEthernet:
1225 {
1226 if (EPL_MCO_GLB_VAR(m_fFrozen) == FALSE) { // new state BasicEthernet
1227 EPL_MCO_GLB_VAR(m_NmtState) =
1228 kEplNmtMsBasicEthernet;
1229 }
1230 break;
1231 }
1232
1233 // timeout event
1234 case kEplNmtEventTimerMsPreOp1:
1235 {
1236 if (EPL_MCO_GLB_VAR(m_fFrozen) == FALSE) { // new state PreOp1
1237 EPL_MCO_GLB_VAR(m_NmtState) =
1238 kEplNmtMsPreOperational1;
1239 EPL_MCO_GLB_VAR
1240 (m_fTimerMsPreOp2) = FALSE;
1241 EPL_MCO_GLB_VAR
1242 (m_fAllMandatoryCNIdent) =
1243 FALSE;
1244
1245 }
1246 break;
1247 }
1248
1249 default:
1250 {
1251 break;
1252 }
1253
1254 } // end of switch(NmtEvent)
1255
1256#endif // ((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) == 0)
1257
1258 break;
1259 }
1260#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
1261 // MN process reduces epl cycle
1262 case kEplNmtMsPreOperational1:
1263 {
1264 // check events
1265 switch (NmtEvent) {
1266 // NMT Command SwitchOff
1267 case kEplNmtEventCriticalError:
1268 case kEplNmtEventSwitchOff:
1269 {
1270 EPL_MCO_GLB_VAR(m_NmtState) =
1271 kEplNmtGsOff;
1272 break;
1273 }
1274
1275 // NMT Command SwReset
1276 case kEplNmtEventSwReset:
1277 {
1278 EPL_MCO_GLB_VAR(m_NmtState) =
1279 kEplNmtGsInitialising;
1280 break;
1281 }
1282
1283 // NMT Command ResetNode
1284 case kEplNmtEventResetNode:
1285 {
1286 EPL_MCO_GLB_VAR(m_NmtState) =
1287 kEplNmtGsResetApplication;
1288 break;
1289 }
1290
1291 // NMT Command ResetCommunication
1292 // or internal Communication error
1293 case kEplNmtEventResetCom:
1294 case kEplNmtEventInternComError:
1295 {
1296 EPL_MCO_GLB_VAR(m_NmtState) =
1297 kEplNmtGsResetCommunication;
1298 break;
1299 }
1300
1301 // NMT Command ResetConfiguration
1302 case kEplNmtEventResetConfig:
1303 {
1304 EPL_MCO_GLB_VAR(m_NmtState) =
1305 kEplNmtGsResetConfiguration;
1306 break;
1307 }
1308
1309 // EPL frames received
1310 case kEplNmtEventDllCeSoc:
1311 case kEplNmtEventDllCeSoa:
1312 { // other MN in network
1313 // $$$ d.k.: generate error history entry
1314 EPL_MCO_GLB_VAR(m_NmtState) =
1315 kEplNmtGsResetCommunication;
1316 break;
1317 }
1318
1319 // error occured
1320 // d.k. MSPreOp1->CSPreOp1: nonsense -> keep state
1321 /*
1322 case kEplNmtEventNmtCycleError:
1323 {
1324 EPL_MCO_GLB_VAR(m_NmtState) = kEplNmtCsPreOperational1;
1325 break;
1326 }
1327 */
1328
1329 case kEplNmtEventAllMandatoryCNIdent:
1330 { // all mandatory CN identified
1331 if (EPL_MCO_GLB_VAR(m_fTimerMsPreOp2) !=
1332 FALSE) {
1333 EPL_MCO_GLB_VAR(m_NmtState) =
1334 kEplNmtMsPreOperational2;
1335 } else {
1336 EPL_MCO_GLB_VAR
1337 (m_fAllMandatoryCNIdent) =
1338 TRUE;
1339 }
1340 break;
1341 }
1342
1343 case kEplNmtEventTimerMsPreOp2:
1344 { // residence time for PreOp1 is elapsed
1345 if (EPL_MCO_GLB_VAR
1346 (m_fAllMandatoryCNIdent) != FALSE) {
1347 EPL_MCO_GLB_VAR(m_NmtState) =
1348 kEplNmtMsPreOperational2;
1349 } else {
1350 EPL_MCO_GLB_VAR
1351 (m_fTimerMsPreOp2) = TRUE;
1352 }
1353 break;
1354 }
1355
1356 default:
1357 {
1358 break;
1359 }
1360
1361 } // end of switch(NmtEvent)
1362 break;
1363 }
1364
1365 // MN process full epl cycle
1366 case kEplNmtMsPreOperational2:
1367 {
1368 // check events
1369 switch (NmtEvent) {
1370 // NMT Command SwitchOff
1371 case kEplNmtEventCriticalError:
1372 case kEplNmtEventSwitchOff:
1373 {
1374 EPL_MCO_GLB_VAR(m_NmtState) =
1375 kEplNmtGsOff;
1376 break;
1377 }
1378
1379 // NMT Command SwReset
1380 case kEplNmtEventSwReset:
1381 {
1382 EPL_MCO_GLB_VAR(m_NmtState) =
1383 kEplNmtGsInitialising;
1384 break;
1385 }
1386
1387 // NMT Command ResetNode
1388 case kEplNmtEventResetNode:
1389 {
1390 EPL_MCO_GLB_VAR(m_NmtState) =
1391 kEplNmtGsResetApplication;
1392 break;
1393 }
1394
1395 // NMT Command ResetCommunication
1396 // or internal Communication error
1397 case kEplNmtEventResetCom:
1398 case kEplNmtEventInternComError:
1399 {
1400 EPL_MCO_GLB_VAR(m_NmtState) =
1401 kEplNmtGsResetCommunication;
1402 break;
1403 }
1404
1405 // NMT Command ResetConfiguration
1406 case kEplNmtEventResetConfig:
1407 {
1408 EPL_MCO_GLB_VAR(m_NmtState) =
1409 kEplNmtGsResetConfiguration;
1410 break;
1411 }
1412
1413 // EPL frames received
1414 case kEplNmtEventDllCeSoc:
1415 case kEplNmtEventDllCeSoa:
1416 { // other MN in network
1417 // $$$ d.k.: generate error history entry
1418 EPL_MCO_GLB_VAR(m_NmtState) =
1419 kEplNmtGsResetCommunication;
1420 break;
1421 }
1422
1423 // error occured
1424 case kEplNmtEventNmtCycleError:
1425 {
1426 EPL_MCO_GLB_VAR(m_NmtState) =
1427 kEplNmtMsPreOperational1;
1428 break;
1429 }
1430
1431 case kEplNmtEventEnterReadyToOperate:
1432 {
1433 EPL_MCO_GLB_VAR(m_NmtState) =
1434 kEplNmtMsReadyToOperate;
1435 break;
1436 }
1437
1438 default:
1439 {
1440 break;
1441 }
1442
1443 } // end of switch(NmtEvent)
1444
1445 break;
1446 }
1447
1448 // all madatory nodes ready to operate
1449 // -> MN process full epl cycle
1450 case kEplNmtMsReadyToOperate:
1451 {
1452
1453 // check events
1454 switch (NmtEvent) {
1455 // NMT Command SwitchOff
1456 case kEplNmtEventCriticalError:
1457 case kEplNmtEventSwitchOff:
1458 {
1459 EPL_MCO_GLB_VAR(m_NmtState) =
1460 kEplNmtGsOff;
1461 break;
1462 }
1463
1464 // NMT Command SwReset
1465 case kEplNmtEventSwReset:
1466 {
1467 EPL_MCO_GLB_VAR(m_NmtState) =
1468 kEplNmtGsInitialising;
1469 break;
1470 }
1471
1472 // NMT Command ResetNode
1473 case kEplNmtEventResetNode:
1474 {
1475 EPL_MCO_GLB_VAR(m_NmtState) =
1476 kEplNmtGsResetApplication;
1477 break;
1478 }
1479
1480 // NMT Command ResetCommunication
1481 // or internal Communication error
1482 case kEplNmtEventResetCom:
1483 case kEplNmtEventInternComError:
1484 {
1485 EPL_MCO_GLB_VAR(m_NmtState) =
1486 kEplNmtGsResetCommunication;
1487 break;
1488 }
1489
1490 // NMT Command ResetConfiguration
1491 case kEplNmtEventResetConfig:
1492 {
1493 EPL_MCO_GLB_VAR(m_NmtState) =
1494 kEplNmtGsResetConfiguration;
1495 break;
1496 }
1497
1498 // EPL frames received
1499 case kEplNmtEventDllCeSoc:
1500 case kEplNmtEventDllCeSoa:
1501 { // other MN in network
1502 // $$$ d.k.: generate error history entry
1503 EPL_MCO_GLB_VAR(m_NmtState) =
1504 kEplNmtGsResetCommunication;
1505 break;
1506 }
1507
1508 // error occured
1509 case kEplNmtEventNmtCycleError:
1510 {
1511 EPL_MCO_GLB_VAR(m_NmtState) =
1512 kEplNmtMsPreOperational1;
1513 break;
1514 }
1515
1516 case kEplNmtEventEnterMsOperational:
1517 {
1518 EPL_MCO_GLB_VAR(m_NmtState) =
1519 kEplNmtMsOperational;
1520 break;
1521 }
1522
1523 default:
1524 {
1525 break;
1526 }
1527
1528 } // end of switch(NmtEvent)
1529
1530 break;
1531 }
1532
1533 // normal eplcycle processing
1534 case kEplNmtMsOperational:
1535 {
1536 // check events
1537 switch (NmtEvent) {
1538 // NMT Command SwitchOff
1539 case kEplNmtEventCriticalError:
1540 case kEplNmtEventSwitchOff:
1541 {
1542 EPL_MCO_GLB_VAR(m_NmtState) =
1543 kEplNmtGsOff;
1544 break;
1545 }
1546
1547 // NMT Command SwReset
1548 case kEplNmtEventSwReset:
1549 {
1550 EPL_MCO_GLB_VAR(m_NmtState) =
1551 kEplNmtGsInitialising;
1552 break;
1553 }
1554
1555 // NMT Command ResetNode
1556 case kEplNmtEventResetNode:
1557 {
1558 EPL_MCO_GLB_VAR(m_NmtState) =
1559 kEplNmtGsResetApplication;
1560 break;
1561 }
1562
1563 // NMT Command ResetCommunication
1564 // or internal Communication error
1565 case kEplNmtEventResetCom:
1566 case kEplNmtEventInternComError:
1567 {
1568 EPL_MCO_GLB_VAR(m_NmtState) =
1569 kEplNmtGsResetCommunication;
1570 break;
1571 }
1572
1573 // NMT Command ResetConfiguration
1574 case kEplNmtEventResetConfig:
1575 {
1576 EPL_MCO_GLB_VAR(m_NmtState) =
1577 kEplNmtGsResetConfiguration;
1578 break;
1579 }
1580
1581 // EPL frames received
1582 case kEplNmtEventDllCeSoc:
1583 case kEplNmtEventDllCeSoa:
1584 { // other MN in network
1585 // $$$ d.k.: generate error history entry
1586 EPL_MCO_GLB_VAR(m_NmtState) =
1587 kEplNmtGsResetCommunication;
1588 break;
1589 }
1590
1591 // error occured
1592 case kEplNmtEventNmtCycleError:
1593 {
1594 EPL_MCO_GLB_VAR(m_NmtState) =
1595 kEplNmtMsPreOperational1;
1596 break;
1597 }
1598
1599 default:
1600 {
1601 break;
1602 }
1603
1604 } // end of switch(NmtEvent)
1605 break;
1606 }
1607
1608 // normal ethernet traffic
1609 case kEplNmtMsBasicEthernet:
1610 {
1611
1612 // check events
1613 switch (NmtEvent) {
1614 // NMT Command SwitchOff
1615 case kEplNmtEventCriticalError:
1616 case kEplNmtEventSwitchOff:
1617 {
1618 EPL_MCO_GLB_VAR(m_NmtState) =
1619 kEplNmtGsOff;
1620 break;
1621 }
1622
1623 // NMT Command SwReset
1624 case kEplNmtEventSwReset:
1625 {
1626 EPL_MCO_GLB_VAR(m_NmtState) =
1627 kEplNmtGsInitialising;
1628 break;
1629 }
1630
1631 // NMT Command ResetNode
1632 case kEplNmtEventResetNode:
1633 {
1634 EPL_MCO_GLB_VAR(m_NmtState) =
1635 kEplNmtGsResetApplication;
1636 break;
1637 }
1638
1639 // NMT Command ResetCommunication
1640 // or internal Communication error
1641 case kEplNmtEventResetCom:
1642 case kEplNmtEventInternComError:
1643 {
1644 EPL_MCO_GLB_VAR(m_NmtState) =
1645 kEplNmtGsResetCommunication;
1646 break;
1647 }
1648
1649 // NMT Command ResetConfiguration
1650 case kEplNmtEventResetConfig:
1651 {
1652 EPL_MCO_GLB_VAR(m_NmtState) =
1653 kEplNmtGsResetConfiguration;
1654 break;
1655 }
1656
1657 // EPL frames received
1658 case kEplNmtEventDllCeSoc:
1659 case kEplNmtEventDllCeSoa:
1660 { // other MN in network
1661 // $$$ d.k.: generate error history entry
1662 EPL_MCO_GLB_VAR(m_NmtState) =
1663 kEplNmtGsResetCommunication;
1664 break;
1665 }
1666
1667 // error occured
1668 // d.k. BE->PreOp1 on cycle error? No
1669/* case kEplNmtEventNmtCycleError:
1670 {
1671 EPL_MCO_GLB_VAR(m_NmtState) = kEplNmtCsPreOperational1;
1672 break;
1673 }
1674*/
1675 default:
1676 {
1677 break;
1678 }
1679
1680 } // end of switch(NmtEvent)
1681 break;
1682 }
1683#endif //#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
1684
1685 default:
1686 {
1687 //DEBUG_EPL_DBGLVL_NMTK_TRACE0(EPL_DBGLVL_NMT ,"Error in EplNmtProcess: Unknown NMT-State");
1688 //EPL_MCO_GLB_VAR(m_NmtState) = kEplNmtGsResetApplication;
1689 Ret = kEplNmtInvalidState;
1690 goto Exit;
1691 }
1692
1693 } // end of switch(NmtEvent)
1694
1695 // inform higher layer about State-Change if needed
1696 if (OldNmtState != EPL_MCO_GLB_VAR(m_NmtState)) {
1697 EPL_NMTK_DBG_POST_TRACE_VALUE(NmtEvent, OldNmtState,
1698 EPL_MCO_GLB_VAR(m_NmtState));
1699
1700 // d.k.: memorize NMT state before posting any events
1701 NmtStateChange.m_NewNmtState = EPL_MCO_GLB_VAR(m_NmtState);
1702
1703 // inform DLL
1704 if ((OldNmtState > kEplNmtGsResetConfiguration)
1705 && (EPL_MCO_GLB_VAR(m_NmtState) <=
1706 kEplNmtGsResetConfiguration)) {
1707 // send DLL DEINIT
1708 Event.m_EventSink = kEplEventSinkDllk;
1709 Event.m_EventType = kEplEventTypeDllkDestroy;
1710 EPL_MEMSET(&Event.m_NetTime, 0x00,
1711 sizeof(Event.m_NetTime));
1712 Event.m_pArg = &OldNmtState;
1713 Event.m_uiSize = sizeof(OldNmtState);
1714 // d.k.: directly call DLLk process function, because
1715 // 1. execution of process function is still synchonized and serialized,
1716 // 2. it is the same as without event queues (i.e. well tested),
1717 // 3. DLLk will get those necessary events even if event queue is full,
1718 // 4. event queue is very inefficient
1719#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
1720 Ret = EplDllkProcess(&Event);
1721#else
1722 Ret = EplEventkPost(&Event);
1723#endif
1724 } else if ((OldNmtState <= kEplNmtGsResetConfiguration)
1725 && (EPL_MCO_GLB_VAR(m_NmtState) >
1726 kEplNmtGsResetConfiguration)) {
1727 // send DLL INIT
1728 Event.m_EventSink = kEplEventSinkDllk;
1729 Event.m_EventType = kEplEventTypeDllkCreate;
1730 EPL_MEMSET(&Event.m_NetTime, 0x00,
1731 sizeof(Event.m_NetTime));
1732 Event.m_pArg = &NmtStateChange.m_NewNmtState;
1733 Event.m_uiSize = sizeof(NmtStateChange.m_NewNmtState);
1734 // d.k.: directly call DLLk process function, because
1735 // 1. execution of process function is still synchonized and serialized,
1736 // 2. it is the same as without event queues (i.e. well tested),
1737 // 3. DLLk will get those necessary events even if event queue is full
1738 // 4. event queue is very inefficient
1739#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
1740 Ret = EplDllkProcess(&Event);
1741#else
1742 Ret = EplEventkPost(&Event);
1743#endif
1744 } else
1745 if ((EPL_MCO_GLB_VAR(m_NmtState) == kEplNmtCsBasicEthernet)
1746 || (EPL_MCO_GLB_VAR(m_NmtState) ==
1747 kEplNmtMsBasicEthernet)) {
1748 tEplDllAsyncReqPriority AsyncReqPriority;
1749
1750 // send DLL Fill Async Tx Buffer, because state BasicEthernet was entered
1751 Event.m_EventSink = kEplEventSinkDllk;
1752 Event.m_EventType = kEplEventTypeDllkFillTx;
1753 EPL_MEMSET(&Event.m_NetTime, 0x00,
1754 sizeof(Event.m_NetTime));
1755 AsyncReqPriority = kEplDllAsyncReqPrioGeneric;
1756 Event.m_pArg = &AsyncReqPriority;
1757 Event.m_uiSize = sizeof(AsyncReqPriority);
1758 // d.k.: directly call DLLk process function, because
1759 // 1. execution of process function is still synchonized and serialized,
1760 // 2. it is the same as without event queues (i.e. well tested),
1761 // 3. DLLk will get those necessary events even if event queue is full
1762 // 4. event queue is very inefficient
1763#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
1764 Ret = EplDllkProcess(&Event);
1765#else
1766 Ret = EplEventkPost(&Event);
1767#endif
1768 }
1769 // inform higher layer about state change
1770 NmtStateChange.m_NmtEvent = NmtEvent;
1771 Event.m_EventSink = kEplEventSinkNmtu;
1772 Event.m_EventType = kEplEventTypeNmtStateChange;
1773 EPL_MEMSET(&Event.m_NetTime, 0x00, sizeof(Event.m_NetTime));
1774 Event.m_pArg = &NmtStateChange;
1775 Event.m_uiSize = sizeof(NmtStateChange);
1776 Ret = EplEventkPost(&Event);
1777 EPL_DBGLVL_NMTK_TRACE2
1778 ("EplNmtkProcess(NMT-Event = 0x%04X): New NMT-State = 0x%03X\n",
1779 NmtEvent, NmtStateChange.m_NewNmtState);
1780
1781 }
1782
1783 Exit:
1784
1785 return Ret;
1786}
1787
1788//---------------------------------------------------------------------------
1789//
1790// Function: EplNmtkGetNmtState
1791//
1792// Description: return the actuell NMT-State and the bits
1793// to for MN- or CN-mode
1794//
1795//
1796//
1797// Parameters: EPL_MCO_DECL_PTR_INSTANCE_PTR_ = Instancepointer
1798//
1799//
1800// Returns: tEplNmtState = NMT-State
1801//
1802//
1803// State:
1804//
1805//---------------------------------------------------------------------------
1806tEplNmtState EplNmtkGetNmtState(EPL_MCO_DECL_PTR_INSTANCE_PTR)
1807{
1808 tEplNmtState NmtState;
1809
1810 NmtState = EPL_MCO_GLB_VAR(m_NmtState);
1811
1812 return NmtState;
1813
1814}
1815
1816//=========================================================================//
1817// //
1818// P R I V A T E D E F I N I T I O N S //
1819// //
1820//=========================================================================//
1821EPL_MCO_DECL_INSTANCE_FCT()
1822//---------------------------------------------------------------------------
1823//
1824// Function:
1825//
1826// Description:
1827//
1828//
1829//
1830// Parameters:
1831//
1832//
1833// Returns:
1834//
1835//
1836// State:
1837//
1838//---------------------------------------------------------------------------
1839#endif // #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTK)) != 0)
1840// EOF