/home/epimerde/documents/tc11/CanFestival-3/src/nmtSlave.c

Go to the documentation of this file.
00001 /*
00002 This file is part of CanFestival, a library implementing CanOpen Stack. 
00003 
00004 Copyright (C): Edouard TISSERANT and Francis DUPIN
00005 
00006 See COPYING file for copyrights details.
00007 
00008 This library is free software; you can redistribute it and/or
00009 modify it under the terms of the GNU Lesser General Public
00010 License as published by the Free Software Foundation; either
00011 version 2.1 of the License, or (at your option) any later version.
00012 
00013 This library is distributed in the hope that it will be useful,
00014 but WITHOUT ANY WARRANTY; without even the implied warranty of
00015 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00016 Lesser General Public License for more details.
00017 
00018 You should have received a copy of the GNU Lesser General Public
00019 License along with this library; if not, write to the Free Software
00020 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00021 */
00022 
00023 #include "nmtSlave.h"
00024 #include "states.h"
00025 #include "canfestival.h"
00026 
00027 /*******************************************************************)*********/
00028 /* put the slave in the state wanted by the master */   
00029 void proceedNMTstateChange(CO_Data* d, Message *m)
00030 {
00031   if( d->nodeState == Pre_operational ||
00032       d->nodeState == Operational ||
00033       d->nodeState == Stopped ) {
00034     
00035     MSG_WAR(0x3400, "NMT received. for node :  ", (*m).data[1]);
00036     
00037     /* Check if this NMT-message is for this node */
00038     /* byte 1 = 0 : all the nodes are concerned (broadcast) */
00039         
00040     if( ( (*m).data[1] == 0 ) || ( (*m).data[1] == *d->bDeviceNodeId ) ){
00041       
00042       switch( (*m).data[0]){ /* command specifier (cs) */                       
00043       case NMT_Start_Node:
00044         if ( (d->nodeState == Pre_operational) || (d->nodeState == Stopped) )
00045           setState(d,Operational);
00046         break; 
00047         
00048       case NMT_Stop_Node:
00049         if ( d->nodeState == Pre_operational ||
00050              d->nodeState == Operational )
00051           setState(d,Stopped);
00052         break;
00053         
00054       case NMT_Enter_PreOperational:
00055         if ( d->nodeState == Operational || 
00056              d->nodeState == Stopped )
00057           setState(d,Pre_operational);
00058         break;
00059         
00060       case NMT_Reset_Node:
00061           setState(d,Initialisation);
00062         break;
00063         
00064       case NMT_Reset_Comunication:
00065           setState(d,Initialisation);
00066         break;
00067         
00068       }/* end switch */
00069       
00070     }/* end if( ( (*m).data[1] == 0 ) || ( (*m).data[1] == bDeviceNodeId ) ) */
00071   }
00072 }
00073 
00074 
00075 /*****************************************************************************/
00076 UNS8 slaveSendBootUp(CO_Data* d)
00077 {
00078   Message m;
00079         
00080   MSG_WAR(0x3407, "Send a Boot-Up msg ", 0);
00081         
00082   /* message configuration */
00083   m.cob_id.w = NODE_GUARD << 7 | *d->bDeviceNodeId;
00084   m.rtr = NOT_A_REQUEST;
00085   m.len = 1;
00086   m.data[0] = 0x00;
00087     
00088   return canSend(d->canHandle,&m);
00089 }
00090 

Generated on Mon Jun 4 17:09:26 2007 for CanFestival by  doxygen 1.5.1