Luis Silvio Cordova Rivadeneira
/
Can_open_masternode
Can_open_masternode
framework/src/nmtSlave.c@7:537bae5a6fc6, 2012-09-26 (annotated)
- 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?
User | Revision | Line number | New 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 |