Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.31-rc4 1840 lines 45 kB view raw
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