diff -r 2cb34a4ac65a -r 6b5a4c21e061 doc/doxygen/html/lifegrd_8c-source.html --- a/doc/doxygen/html/lifegrd_8c-source.html Tue Jun 05 17:34:33 2007 +0200 +++ b/doc/doxygen/html/lifegrd_8c-source.html Tue Jun 05 18:43:21 2007 +0200 @@ -16,190 +16,165 @@
  • Globals
  • /home/epimerde/documents/tc11/CanFestival-3/src/lifegrd.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 <data.h>
    -00024 #include "lifegrd.h"
    -00025 #include "canfestival.h"
    -00026 
    -00027 /* Prototypes for internals functions */
    -00028 void ConsumerHearbeatAlarm(CO_Data* d, UNS32 id);
    -00029 void ProducerHearbeatAlarm(CO_Data* d, UNS32 id);
    -00030 UNS32 OnHearbeatProducerUpdate(CO_Data* d, const indextable * unsused_indextable, UNS8 unsused_bSubindex);
    -00031 
    -00032 /*****************************************************************************/
    -00033 e_nodeState getNodeState (CO_Data* d, UNS8 nodeId)
    -00034 {
    -00035         e_nodeState networkNodeState = d->NMTable[nodeId];
    -00036         return networkNodeState;
    -00037 }
    +00002   This file is part of CanFestival, a library implementing CanOpen
    +00003   Stack.
    +00004 
    +00005   Copyright (C): Edouard TISSERANT and Francis DUPIN
    +00006 
    +00007   See COPYING file for copyrights details.
    +00008 
    +00009   This library is free software; you can redistribute it and/or
    +00010   modify it under the terms of the GNU Lesser General Public
    +00011   License as published by the Free Software Foundation; either
    +00012   version 2.1 of the License, or (at your option) any later version.
    +00013 
    +00014   This library is distributed in the hope that it will be useful,
    +00015   but WITHOUT ANY WARRANTY; without even the implied warranty of
    +00016   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    +00017   Lesser General Public License for more details.
    +00018 
    +00019   You should have received a copy of the GNU Lesser General Public
    +00020   License along with this library; if not, write to the Free Software
    +00021   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
    +00022   USA
    +00023 */
    +00024 
    +00035 #include <data.h>
    +00036 #include "lifegrd.h"
    +00037 #include "canfestival.h"
     00038 
    -00039 /*****************************************************************************/
    -00040 /* The Consumer Timer Callback */
    -00041 void ConsumerHearbeatAlarm(CO_Data* d, UNS32 id)
    -00042 {
    -00043         /*MSG_WAR(0x00, "ConsumerHearbeatAlarm", 0x00);*/
    -00044         
    -00045         /* call heartbeat error with NodeId */
    -00046         (*d->heartbeatError)((UNS8)( ((d->ConsumerHeartbeatEntries[id]) & (UNS32)0x00FF0000) >> (UNS8)16 ));
    -00047 }
    -00048 
    -00049 /*****************************************************************************/
    -00050 void proceedNODE_GUARD(CO_Data* d, Message* m )
    -00051 {
    -00052   UNS8 nodeId = (UNS8) GET_NODE_ID((*m));
    -00053   
    -00054   if((m->rtr == 1) ) /* Notice that only the master can have sent this node guarding request */
    -00055   { /* Receiving a NMT NodeGuarding (request of the state by the master) */
    -00056     /*  only answer to the NMT NodeGuarding request, the master is not checked (not implemented) */
    -00057     if (nodeId == *d->bDeviceNodeId )
    -00058     {
    -00059       Message msg;
    -00060       msg.cob_id.w = *d->bDeviceNodeId + 0x700;
    -00061       msg.len = (UNS8)0x01;
    -00062       msg.rtr = 0;
    -00063       msg.data[0] = d->nodeState; 
    -00064       if (d->toggle)
    -00065       {
    -00066         msg.data[0] |= 0x80 ;
    -00067         d->toggle = 0 ;
    -00068       }
    -00069       else
    -00070         d->toggle = 1 ; 
    -00071       /* send the nodeguard response. */
    -00072       MSG_WAR(0x3130, "Sending NMT Nodeguard to master, state: ", d->nodeState);
    -00073       canSend(d->canHandle,&msg );
    -00074     }  
    -00075 
    -00076   }else{ /* Not a request CAN */
    -00077 
    -00078     MSG_WAR(0x3110, "Received NMT nodeId : ", nodeId);
    -00079     /* the slave's state receievd is stored in the NMTable */
    -00080       /* The state is stored on 7 bit */
    -00081     d->NMTable[nodeId] = (e_nodeState) ((*m).data[0] & 0x7F) ;
    -00082     
    -00083     /* Boot-Up frame reception */
    -00084     if ( d->NMTable[nodeId] == Initialisation)
    -00085       {
    -00086         /* The device send the boot-up message (Initialisation) */
    -00087         /* to indicate the master that it is entered in pre_operational mode */
    -00088         /* Because the  device enter automaticaly in pre_operational mode, */
    -00089         /* the pre_operational mode is stored */
    -00090 /*        NMTable[bus_id][nodeId] = Pre_operational; */
    -00091         MSG_WAR(0x3100, "The NMT is a bootup from node : ", nodeId);
    -00092       }
    -00093       
    -00094     if( d->NMTable[nodeId] != Unknown_state ) {
    -00095         UNS8 index, ConsummerHeartBeat_nodeId ;
    -00096         for( index = (UNS8)0x00; index < *d->ConsumerHeartbeatCount; index++ )
    -00097         {
    -00098             ConsummerHeartBeat_nodeId = (UNS8)( ((d->ConsumerHeartbeatEntries[index]) & (UNS32)0x00FF0000) >> (UNS8)16 );
    -00099             if ( nodeId == ConsummerHeartBeat_nodeId )
    -00100             {
    -00101                 TIMEVAL time = ( (d->ConsumerHeartbeatEntries[index]) & (UNS32)0x0000FFFF ) ;
    -00102                 /* Renew alarm for next heartbeat. */
    -00103                 DelAlarm(d->ConsumerHeartBeatTimers[index]);
    -00104                 d->ConsumerHeartBeatTimers[index] = SetAlarm(d, index, &ConsumerHearbeatAlarm, MS_TO_TIMEVAL(time), 0);
    -00105             }
    -00106         }
    -00107     }
    -00108   }
    -00109 }
    -00110 
    -00111 /*****************************************************************************/
    -00112 /* The Consumer Timer Callback */
    -00113 void ProducerHearbeatAlarm(CO_Data* d, UNS32 id)
    -00114 {
    -00115         if(*d->ProducerHeartBeatTime)
    -00116         {
    -00117                 Message msg;
    -00118                 /* Time expired, the heartbeat must be sent immediately
    -00119                  * generate the correct node-id: this is done by the offset 1792
    -00120                  * (decimal) and additionaly
    -00121                  * the node-id of this device.
    -00122                  */
    -00123                 
    -00124                 msg.cob_id.w = *d->bDeviceNodeId + 0x700;
    -00125                 msg.len = (UNS8)0x01;
    -00126                 msg.rtr = 0;
    -00127                 msg.data[0] = d->nodeState; /* No toggle for heartbeat !*/
    -00128                 /* send the heartbeat */
    -00129                 MSG_WAR(0x3130, "Producing heartbeat: ", d->nodeState);
    -00130                 canSend(d->canHandle,&msg );
    -00131         
    -00132         }else{
    -00133                 d->ProducerHeartBeatTimer = DelAlarm(d->ProducerHeartBeatTimer);
    -00134         }
    -00135 }
    -00136 
    -00137 /*****************************************************************************/
    -00138 /* This is called when Index 0x1017 is updated.*/
    -00139 UNS32 OnHeartbeatProducerUpdate(CO_Data* d, const indextable * unsused_indextable, UNS8 unsused_bSubindex)
    -00140 {
    -00141         heartbeatStop(d);
    -00142         heartbeatInit(d);
    -00143         return 0;
    -00144 }
    -00145 /*****************************************************************************/
    -00146 
    -00147 void heartbeatInit(CO_Data* d)
    -00148 {
    -00149                 
    -00150     UNS8 index; /* Index to scan the table of heartbeat consumers */
    -00151         RegisterSetODentryCallBack(d, 0x1017, 0x00, &OnHeartbeatProducerUpdate);
    -00152     
    -00153     d->toggle = 0;
    -00154         
    -00155     for( index = (UNS8)0x00; index < *d->ConsumerHeartbeatCount; index++ )
    -00156     {
    -00157         TIMEVAL time = (UNS16) ( (d->ConsumerHeartbeatEntries[index]) & (UNS32)0x0000FFFF ) ;
    -00158         /* MSG_WAR(0x3121, "should_time : ", should_time ) ; */
    -00159         if ( time )
    -00160         {
    -00161                 d->ConsumerHeartBeatTimers[index] = SetAlarm(d, index, &ConsumerHearbeatAlarm, MS_TO_TIMEVAL(time), 0);
    -00162         }
    -00163     }
    -00164 
    -00165     if ( *d->ProducerHeartBeatTime )
    -00166     {
    -00167         TIMEVAL time = *d->ProducerHeartBeatTime;
    -00168         d->ProducerHeartBeatTimer = SetAlarm(d, 0, &ProducerHearbeatAlarm, MS_TO_TIMEVAL(time), MS_TO_TIMEVAL(time));
    -00169     }
    -00170 }
    -00171 
    -00172 /*****************************************************************************/
    -00173 void heartbeatStop(CO_Data* d)
    -00174 {
    -00175     UNS8 index;
    -00176     for( index = (UNS8)0x00; index < *d->ConsumerHeartbeatCount; index++ )
    -00177     {
    -00178         d->ConsumerHeartBeatTimers[index + 1] = DelAlarm(d->ConsumerHeartBeatTimers[index + 1]);;
    -00179     }
    -00180 
    -00181     d->ProducerHeartBeatTimer = DelAlarm(d->ProducerHeartBeatTimer);;
    -00182 }
    -00183 
    -00184 void _heartbeatError(UNS8 heartbeatID){}
    -

    Generated on Mon Jun 4 17:09:26 2007 for CanFestival by  +00039 +00040 void ConsumerHearbeatAlarm(CO_Data* d, UNS32 id); +00041 +00042 +00043 void ProducerHearbeatAlarm(CO_Data* d, UNS32 id); +00044 +00045 UNS32 OnHearbeatProducerUpdate(CO_Data* d, const indextable * unsused_indextable, UNS8 unsused_bSubindex); +00046 +00055 e_nodeState getNodeState (CO_Data* d, UNS8 nodeId) +00056 { +00057 e_nodeState networkNodeState = d->NMTable[nodeId]; +00058 return networkNodeState; +00059 } +00060 +00067 void ConsumerHearbeatAlarm(CO_Data* d, UNS32 id) +00068 { +00069 /*MSG_WAR(0x00, "ConsumerHearbeatAlarm", 0x00);*/ +00070 +00072 (*d->heartbeatError)((UNS8)( ((d->ConsumerHeartbeatEntries[id]) & (UNS32)0x00FF0000) >> (UNS8)16 )); +00073 } +00074 +00081 void proceedNODE_GUARD(CO_Data* d, Message* m ) +00082 { +00083 UNS8 nodeId = (UNS8) GET_NODE_ID((*m)); +00084 +00085 if((m->rtr == 1) ) +00090 { +00097 if (nodeId == *d->bDeviceNodeId ) +00098 { +00099 Message msg; +00100 msg.cob_id.w = *d->bDeviceNodeId + 0x700; +00101 msg.len = (UNS8)0x01; +00102 msg.rtr = 0; +00103 msg.data[0] = d->nodeState; +00104 if (d->toggle) +00105 { +00106 msg.data[0] |= 0x80 ; +00107 d->toggle = 0 ; +00108 } +00109 else +00110 d->toggle = 1 ; +00112 MSG_WAR(0x3130, "Sending NMT Nodeguard to master, state: ", d->nodeState); +00113 canSend(d->canHandle,&msg ); +00114 } +00115 +00116 }else{ +00118 MSG_WAR(0x3110, "Received NMT nodeId : ", nodeId); +00121 d->NMTable[nodeId] = (e_nodeState) ((*m).data[0] & 0x7F) ; +00122 +00124 if ( d->NMTable[nodeId] == Initialisation) +00125 { +00135 MSG_WAR(0x3100, "The NMT is a bootup from node : ", nodeId); +00136 } +00137 +00138 if( d->NMTable[nodeId] != Unknown_state ) { +00139 UNS8 index, ConsummerHeartBeat_nodeId ; +00140 for( index = (UNS8)0x00; index < *d->ConsumerHeartbeatCount; index++ ) +00141 { +00142 ConsummerHeartBeat_nodeId = (UNS8)( ((d->ConsumerHeartbeatEntries[index]) & (UNS32)0x00FF0000) >> (UNS8)16 ); +00143 if ( nodeId == ConsummerHeartBeat_nodeId ) +00144 { +00145 TIMEVAL time = ( (d->ConsumerHeartbeatEntries[index]) & (UNS32)0x0000FFFF ) ; +00146 /* Renew alarm for next heartbeat. */ +00147 DelAlarm(d->ConsumerHeartBeatTimers[index]); +00148 d->ConsumerHeartBeatTimers[index] = SetAlarm(d, index, &ConsumerHearbeatAlarm, MS_TO_TIMEVAL(time), 0); +00149 } +00150 } +00151 } +00152 } +00153 } +00154 +00161 void ProducerHearbeatAlarm(CO_Data* d, UNS32 id) +00162 { +00163 if(*d->ProducerHeartBeatTime) +00164 { +00165 Message msg; +00172 msg.cob_id.w = *d->bDeviceNodeId + 0x700; +00173 msg.len = (UNS8)0x01; +00174 msg.rtr = 0; +00175 msg.data[0] = d->nodeState; +00177 MSG_WAR(0x3130, "Producing heartbeat: ", d->nodeState); +00178 canSend(d->canHandle,&msg ); +00179 +00180 }else{ +00181 d->ProducerHeartBeatTimer = DelAlarm(d->ProducerHeartBeatTimer); +00182 } +00183 } +00184 +00194 UNS32 OnHeartbeatProducerUpdate(CO_Data* d, const indextable * unsused_indextable, UNS8 unsused_bSubindex) +00195 { +00196 heartbeatStop(d); +00197 heartbeatInit(d); +00198 return 0; +00199 } +00200 +00206 void heartbeatInit(CO_Data* d) +00207 { +00208 +00209 UNS8 index; +00210 RegisterSetODentryCallBack(d, 0x1017, 0x00, &OnHeartbeatProducerUpdate); +00211 +00212 d->toggle = 0; +00213 +00214 for( index = (UNS8)0x00; index < *d->ConsumerHeartbeatCount; index++ ) +00215 { +00216 TIMEVAL time = (UNS16) ( (d->ConsumerHeartbeatEntries[index]) & (UNS32)0x0000FFFF ) ; +00218 if ( time ) +00219 { +00220 d->ConsumerHeartBeatTimers[index] = SetAlarm(d, index, &ConsumerHearbeatAlarm, MS_TO_TIMEVAL(time), 0); +00221 } +00222 } +00223 +00224 if ( *d->ProducerHeartBeatTime ) +00225 { +00226 TIMEVAL time = *d->ProducerHeartBeatTime; +00227 d->ProducerHeartBeatTimer = SetAlarm(d, 0, &ProducerHearbeatAlarm, MS_TO_TIMEVAL(time), MS_TO_TIMEVAL(time)); +00228 } +00229 } +00230 +00236 void heartbeatStop(CO_Data* d) +00237 { +00238 UNS8 index; +00239 for( index = (UNS8)0x00; index < *d->ConsumerHeartbeatCount; index++ ) +00240 { +00241 d->ConsumerHeartBeatTimers[index + 1] = DelAlarm(d->ConsumerHeartBeatTimers[index + 1]);; +00242 } +00243 +00244 d->ProducerHeartBeatTimer = DelAlarm(d->ProducerHeartBeatTimer);; +00245 } +00246 +00252 void _heartbeatError(UNS8 heartbeatID){} +
    Generated on Tue Jun 5 18:32:05 2007 for CanFestival by  doxygen 1.5.1