Can_open_masternode

Dependencies:   mbed

Committer:
sam_grove
Date:
Wed Sep 26 05:48:14 2012 +0000
Revision:
7:537bae5a6fc6
Parent:
0:9dd7c6129683
Pushing the project into the new repo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sam_grove 0:9dd7c6129683 1 /*
sam_grove 0:9dd7c6129683 2 This file is part of CanFestival, a library implementing CanOpen
sam_grove 0:9dd7c6129683 3 Stack.
sam_grove 0:9dd7c6129683 4
sam_grove 0:9dd7c6129683 5 Copyright (C): Edouard TISSERANT and Francis DUPIN
sam_grove 0:9dd7c6129683 6
sam_grove 0:9dd7c6129683 7 See COPYING file for copyrights details.
sam_grove 0:9dd7c6129683 8
sam_grove 0:9dd7c6129683 9 This library is free software; you can redistribute it and/or
sam_grove 0:9dd7c6129683 10 modify it under the terms of the GNU Lesser General Public
sam_grove 0:9dd7c6129683 11 License as published by the Free Software Foundation; either
sam_grove 0:9dd7c6129683 12 version 2.1 of the License, or (at your option) any later version.
sam_grove 0:9dd7c6129683 13
sam_grove 0:9dd7c6129683 14 This library is distributed in the hope that it will be useful,
sam_grove 0:9dd7c6129683 15 but WITHOUT ANY WARRANTY; without even the implied warranty of
sam_grove 0:9dd7c6129683 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
sam_grove 0:9dd7c6129683 17 Lesser General Public License for more details.
sam_grove 0:9dd7c6129683 18
sam_grove 0:9dd7c6129683 19 You should have received a copy of the GNU Lesser General Public
sam_grove 0:9dd7c6129683 20 License along with this library; if not, write to the Free Software
sam_grove 0:9dd7c6129683 21 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
sam_grove 0:9dd7c6129683 22 USA
sam_grove 0:9dd7c6129683 23 */
sam_grove 0:9dd7c6129683 24 /*!
sam_grove 0:9dd7c6129683 25 ** @file nmtSlave.c
sam_grove 0:9dd7c6129683 26 ** @author Edouard TISSERANT and Francis DUPIN
sam_grove 0:9dd7c6129683 27 ** @date Tue Jun 5 08:50:53 2007
sam_grove 0:9dd7c6129683 28 **
sam_grove 0:9dd7c6129683 29 ** @brief
sam_grove 0:9dd7c6129683 30 **
sam_grove 0:9dd7c6129683 31 **
sam_grove 0:9dd7c6129683 32 */
sam_grove 0:9dd7c6129683 33 #include "nmtSlave.h"
sam_grove 0:9dd7c6129683 34 #include "states.h"
sam_grove 0:9dd7c6129683 35 #include "canfestival.h"
sam_grove 0:9dd7c6129683 36 #include "sysdep.h"
sam_grove 0:9dd7c6129683 37
sam_grove 0:9dd7c6129683 38 /*!
sam_grove 0:9dd7c6129683 39 ** put the slave in the state wanted by the master
sam_grove 0:9dd7c6129683 40 **
sam_grove 0:9dd7c6129683 41 ** @param d
sam_grove 0:9dd7c6129683 42 ** @param m
sam_grove 0:9dd7c6129683 43 **/
sam_grove 0:9dd7c6129683 44 void proceedNMTstateChange(CO_Data* d, Message *m)
sam_grove 0:9dd7c6129683 45 {
sam_grove 0:9dd7c6129683 46 if( d->nodeState == Pre_operational ||
sam_grove 0:9dd7c6129683 47 d->nodeState == Operational ||
sam_grove 0:9dd7c6129683 48 d->nodeState == Stopped ) {
sam_grove 0:9dd7c6129683 49
sam_grove 0:9dd7c6129683 50 MSG_WAR(0x3400, "NMT received. for node : ", (*m).data[1]);
sam_grove 0:9dd7c6129683 51
sam_grove 0:9dd7c6129683 52 /* Check if this NMT-message is for this node */
sam_grove 0:9dd7c6129683 53 /* byte 1 = 0 : all the nodes are concerned (broadcast) */
sam_grove 0:9dd7c6129683 54
sam_grove 0:9dd7c6129683 55 if( ( (*m).data[1] == 0 ) || ( (*m).data[1] == *d->bDeviceNodeId ) ){
sam_grove 0:9dd7c6129683 56
sam_grove 0:9dd7c6129683 57 switch( (*m).data[0]){ /* command specifier (cs) */
sam_grove 0:9dd7c6129683 58 case NMT_Start_Node:
sam_grove 0:9dd7c6129683 59 if ( (d->nodeState == Pre_operational) || (d->nodeState == Stopped) )
sam_grove 0:9dd7c6129683 60 setState(d,Operational);
sam_grove 0:9dd7c6129683 61 break;
sam_grove 0:9dd7c6129683 62
sam_grove 0:9dd7c6129683 63 case NMT_Stop_Node:
sam_grove 0:9dd7c6129683 64 if ( d->nodeState == Pre_operational ||
sam_grove 0:9dd7c6129683 65 d->nodeState == Operational )
sam_grove 0:9dd7c6129683 66 setState(d,Stopped);
sam_grove 0:9dd7c6129683 67 break;
sam_grove 0:9dd7c6129683 68
sam_grove 0:9dd7c6129683 69 case NMT_Enter_PreOperational:
sam_grove 0:9dd7c6129683 70 if ( d->nodeState == Operational ||
sam_grove 0:9dd7c6129683 71 d->nodeState == Stopped )
sam_grove 0:9dd7c6129683 72 setState(d,Pre_operational);
sam_grove 0:9dd7c6129683 73 break;
sam_grove 0:9dd7c6129683 74
sam_grove 0:9dd7c6129683 75 case NMT_Reset_Node:
sam_grove 0:9dd7c6129683 76 if(d->NMT_Slave_Node_Reset_Callback != NULL)
sam_grove 0:9dd7c6129683 77 d->NMT_Slave_Node_Reset_Callback(d);
sam_grove 0:9dd7c6129683 78 setState(d,Initialisation);
sam_grove 0:9dd7c6129683 79 break;
sam_grove 0:9dd7c6129683 80
sam_grove 0:9dd7c6129683 81 case NMT_Reset_Comunication:
sam_grove 0:9dd7c6129683 82 {
sam_grove 0:9dd7c6129683 83 UNS8 currentNodeId = getNodeId(d);
sam_grove 0:9dd7c6129683 84
sam_grove 0:9dd7c6129683 85 if(d->NMT_Slave_Communications_Reset_Callback != NULL)
sam_grove 0:9dd7c6129683 86 d->NMT_Slave_Communications_Reset_Callback(d);
sam_grove 0:9dd7c6129683 87 #ifdef CO_ENABLE_LSS
sam_grove 0:9dd7c6129683 88 // LSS changes NodeId here in case lss_transfer.nodeID doesn't
sam_grove 0:9dd7c6129683 89 // match current getNodeId()
sam_grove 0:9dd7c6129683 90 if(currentNodeId!=d->lss_transfer.nodeID)
sam_grove 0:9dd7c6129683 91 currentNodeId = d->lss_transfer.nodeID;
sam_grove 0:9dd7c6129683 92 #endif
sam_grove 0:9dd7c6129683 93
sam_grove 0:9dd7c6129683 94 // clear old NodeId to make SetNodeId reinitializing
sam_grove 0:9dd7c6129683 95 // SDO, EMCY and other COB Ids
sam_grove 0:9dd7c6129683 96 *d->bDeviceNodeId = 0xFF;
sam_grove 0:9dd7c6129683 97
sam_grove 0:9dd7c6129683 98 setNodeId(d, currentNodeId);
sam_grove 0:9dd7c6129683 99 }
sam_grove 0:9dd7c6129683 100 setState(d,Initialisation);
sam_grove 0:9dd7c6129683 101 break;
sam_grove 0:9dd7c6129683 102
sam_grove 0:9dd7c6129683 103 }/* end switch */
sam_grove 0:9dd7c6129683 104
sam_grove 0:9dd7c6129683 105 }/* end if( ( (*m).data[1] == 0 ) || ( (*m).data[1] ==
sam_grove 0:9dd7c6129683 106 bDeviceNodeId ) ) */
sam_grove 0:9dd7c6129683 107 }
sam_grove 0:9dd7c6129683 108 }
sam_grove 0:9dd7c6129683 109
sam_grove 0:9dd7c6129683 110
sam_grove 0:9dd7c6129683 111 /*!
sam_grove 0:9dd7c6129683 112 **
sam_grove 0:9dd7c6129683 113 **
sam_grove 0:9dd7c6129683 114 ** @param d
sam_grove 0:9dd7c6129683 115 **
sam_grove 0:9dd7c6129683 116 ** @return
sam_grove 0:9dd7c6129683 117 **/
sam_grove 0:9dd7c6129683 118 UNS8 slaveSendBootUp(CO_Data* d)
sam_grove 0:9dd7c6129683 119 {
sam_grove 0:9dd7c6129683 120 Message m;
sam_grove 0:9dd7c6129683 121
sam_grove 0:9dd7c6129683 122 #ifdef CO_ENABLE_LSS
sam_grove 0:9dd7c6129683 123 if(*d->bDeviceNodeId==0xFF)return 0;
sam_grove 0:9dd7c6129683 124 #endif
sam_grove 0:9dd7c6129683 125
sam_grove 0:9dd7c6129683 126 MSG_WAR(0x3407, "Send a Boot-Up msg ", 0);
sam_grove 0:9dd7c6129683 127
sam_grove 0:9dd7c6129683 128 /* message configuration */
sam_grove 0:9dd7c6129683 129 {
sam_grove 0:9dd7c6129683 130 UNS16 tmp = NODE_GUARD << 7 | *d->bDeviceNodeId;
sam_grove 0:9dd7c6129683 131 m.cob_id = UNS16_LE(tmp);
sam_grove 0:9dd7c6129683 132 }
sam_grove 0:9dd7c6129683 133 m.rtr = NOT_A_REQUEST;
sam_grove 0:9dd7c6129683 134 m.len = 1;
sam_grove 0:9dd7c6129683 135 m.data[0] = 0x00;
sam_grove 0:9dd7c6129683 136
sam_grove 0:9dd7c6129683 137 return canSend(d->canHandle,&m);
sam_grove 0:9dd7c6129683 138 }
sam_grove 0:9dd7c6129683 139